Чтение из файла KMDF
Учусь разрабатывать драйвера для Windows. Проблема с синхронизацией физической памяти с кэшом. При EvtIoWrite я модифицирую InputBuffer из объекта WDFREQUEST который записываю в файл, но при EvtIoRead я получаю не то что записал а исходные данные. Если читать без записи, получаю то что записал. Вот как я открываю файл:
WDF_OBJECT_ATTRIBUTES deviceAttributes;
PDEVICE_CONTEXT deviceContext;
WDFDEVICE device;
NTSTATUS status;
WDF_IO_TYPE_CONFIG ioConfig;
PAGED_CODE();
WDF_IO_TYPE_CONFIG_INIT(&ioConfig);
ioConfig.ReadWriteIoType = WdfDeviceIoDirect;
ioConfig.DeviceControlIoType = WdfDeviceIoDirect;
WdfDeviceInitSetIoTypeEx(DeviceInit, &ioConfig);
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, DEVICE_CONTEXT);
deviceAttributes.SynchronizationScope = WdfSynchronizationScopeDevice;
deviceAttributes.EvtCleanupCallback = VirtualVolumeCleanup;
status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device);
if (NT_SUCCESS(status)) {
deviceContext = DeviceGetContext(device);
deviceContext->fileHandle = INVALID_HANDLE_VALUE;
deviceContext->fileSize.QuadPart = 0;
WDF_DEVICE_PROPERTY_DATA propData;
WDF_DEVICE_PROPERTY_DATA_INIT(&propData, &VOLUME_FILE_PATH);
WDFMEMORY propMem;
DEVPROPTYPE propType;
status = WdfDeviceAllocAndQueryPropertyEx(
device,
&propData,
PagedPool,
WDF_NO_OBJECT_ATTRIBUTES,
&propMem,
&propType
);
if (!NT_SUCCESS(status))
{
return status;
}
size_t filePathBufferSize = 0;
PVOID filePathBuffer = WdfMemoryGetBuffer(propMem, &filePathBufferSize);
UNICODE_STRING filePath;
RtlInitUnicodeString(&filePath, filePathBuffer);
OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &filePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
IO_STATUS_BLOCK iosb;
status = ZwOpenFile(
&deviceContext->fileHandle,
GENERIC_READ | GENERIC_WRITE,
&oa,
&iosb,
0,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_NO_INTERMEDIATE_BUFFERING | FILE_WRITE_THROUGH | FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS
);
if (!NT_SUCCESS(status))
{
return status;
}
status = WdfDeviceCreateDeviceInterface(
device,
&GUID_DEVINTERFACE_VirtualVolumeDriver,
NULL // ReferenceString
);
if (NT_SUCCESS(status)) {
status = VirtualVolumeDriverQueueInitialize(device);
}
}
return status;
И чтение:
PDEVICE_CONTEXT deviceContext;
PVOID outputBuffer;
NTSTATUS status;
IO_STATUS_BLOCK iosb;
WDF_REQUEST_PARAMETERS reqParams;
PMDL mdl;
status = WdfRequestRetrieveOutputWdmMdl(Request, &mdl);
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(Request, status, 0);
return;
}
KeFlushIoBuffers(mdl, TRUE, FALSE);
deviceContext = DeviceGetContext(WdfIoQueueGetDevice(Queue));
status = WdfRequestRetrieveOutputBuffer(Request, Lenght, &outputBuffer, NULL);
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(Request, status, 0);
return;
}
WDF_REQUEST_PARAMETERS_INIT(&reqParams);
WdfRequestGetParameters(Request, &reqParams);
status = ZwReadFile(
deviceContext->fileHandle,
NULL,
NULL,
NULL,
&iosb,
outputBuffer,
(ULONG)Lenght,
(PLARGE_INTEGER)reqParams.Parameters.Read.DeviceOffset,
NULL
);
for (int i = 0; i < Lenght; ++i) {
((PUCHAR)outputBuffer)[i] ^= 0xaa;
}
WdfRequestCompleteWithInformation(Request, status, iosb.Information);