Чтение из файла 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);

Ответы (0 шт):