Member 14130865 Ответов: 1

Общая память выполняется так быстро ?


режим ядра :

<pre>VOID DriverLoop() {

	while (TRUE)
	{
		//DbgPrintEx(0, 0, "First loop is running \n");
		ReadSharedMemory();
		
		
			if (!(PCHAR)SharedSection == NULL && strcmp((PCHAR)SharedSection, "Read") == 0)
			{
				DbgPrintEx(0, 0, "Read looping \n");

				RtlZeroMemory(SharedSection, sizeof(SharedSection));
				break;
			}
			else if (!(PCHAR)SharedSection == NULL && strcmp((PCHAR)SharedSection, "Write") == 0)
			{
				DbgPrintEx(0, 0, "Write looping \n");
				RtlZeroMemory(SharedSection, sizeof(SharedSection));
				break;
			}
		LARGE_INTEGER Timeout;
		Timeout.QuadPart = RELATIVE(SECONDS(1));
		KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
	}
}



пользовательский режим :

auto pBufW = (char*)MapViewOfFile(hMapFileW, FILE_MAP_WRITE, 0, 0, 4096);


	RtlCopyMemory(pBufW, "Read", 4);

	printf("message has been sent to kernel! \n");


	UnmapViewOfFile(pBufW);

	Sleep(10);

	auto pBfW = (char*)MapViewOfFile(hMapFileW, FILE_MAP_WRITE, 0, 0, 4096);


	RtlCopyMemory(pBfW, "Write", 5);

	printf("message has been sent to kernel! \n");


	UnmapViewOfFile(pBfW);


я не могу понять, почему, когда я звоню читать и писать . только написать execute я пробовал это несколько раз, и он всегда делает это + я пытался добавить sleep(1); в моем пользовательском режиме (думал, что он выполняется очень быстро).

в принципе, мне просто нужно, чтобы они выполнялись нормально, как будто сначала должно выполняться чтение, а затем запись .

Что я уже пробовал:

я попытался добавить сон в 1 и 10 секунд, и это не сработало idk, что я делаю здесь неправильно.

1 Ответов

Рейтинг:
1

Rick York

То, что вы делаете неправильно, - это надеетесь, что два процесса в разных исполнительных кольцах могут координировать себя по чистой случайности.

Как я уже писал вам раньше, вам нужно использовать сигнальный механизм. Это может быть простой счетчик, который процессы отслеживают для изменения, или это может быть событие (или два), которое сигнализируется, когда работа должна быть выполнена и когда она завершена. Конечно, есть еще много возможностей, но эти две довольно просты в реализации.


Member 14130865

@Rick York не могли бы вы связать некоторые из них , потому что я не знаю, как разделить мьютекс или событие между ядром и пользовательским режимом . кстати, я не хочу использовать какие-либо системные потоки или DevicIocontrol . :Д