Windows Driver: ZwReadFile returns STATUS_INVALID_HANDLE

Windows Driver: ZwReadFile returns STATUS_INVALID_HANDLE

在学习如何编写 Windows 驱动程序时,我正在为 AvsCamera 修改 Windows Driver Sample

我想用位图文件中的图像替换模拟图像。在 Synthesizer.cpp 文件中,我在 Synthesize() 方法中注释掉了对 SynthesizeBars()ApplyGradient()EncodeNumber() 的调用,并将它们替换为以下代码:

KIRQL level = KeGetCurrentIrql();
if( level == PASSIVE_LEVEL ) {
    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "Ok to perform file io.");
    UNICODE_STRING filename;
    OBJECT_ATTRIBUTES fileAttr;
    IO_STATUS_BLOCK fhStatus;
    HANDLE fh;
    NTSTATUS status;
    RtlInitUnicodeString(&filename, L"\SystemRoot\AvsCameraTest.bmp");
    InitializeObjectAttributes(&fileAttr, &filename, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
    status = ZwOpenFile(&fh, FILE_READ_DATA, &fileAttr, &fhStatus, 0, FILE_RANDOM_ACCESS);
    if( NT_SUCCESS(status) ) {
        status = ZwReadFile(&fh, NULL, NULL, NULL, &fhStatus, m_Buffer, m_Length, /*&byteOffset*/NULL, NULL);
        if( NT_SUCCESS(status) ) {
            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "Read bitmap file success.\n");
        } else DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "Unable to read bitmap file [0x%x].\n", status);
        ZwClose(fh);
    } else DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "Unable to open bitmap file [0x%x].\n", status);
} else DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "Do not perform file io at IRQ level 0x%x.\n", level);

这是我的第一步:我知道我忽略了 bmp header。

调用ZwOpenFile()成功,但是ZwReadFile()returnsSTATUS_INVALID_HANDLE.

我试过使用 LARGE_INTEGER byteOffsetFILE_SYNCHRONOUS_IO_NONALERT 而不是 FILE_RANDOM_ACCESS。我也尝试过将 ZwCreateFile()GENERIC_READFILE_ATTRIBUTE_READONLY 参数一起使用。

我已成功使用类似代码写入文件。

我尝试获取正确的文件句柄以进行读取时遇到了什么问题?

当您应该传递 HANDLE 的值时,您传递的是指向 HANDLE 变量本身的指针。

改变这个:

status = ZwReadFile(&fh, ...);

为此:

status = ZwReadFile(fh, ...);