Windows 驱动程序:ZwReadFile 返回STATUS_INVALID_HANDLE

Windows Driver: ZwReadFile returns STATUS_INVALID_HANDLE

本文关键字:INVALID HANDLE STATUS 返回 驱动程序 ZwReadFile Windows      更新时间:2023-10-16

在学习如何编写Windows驱动程序时,我正在修改AvsCamera的Windows驱动程序示例。

我想用位图文件中的图像替换模拟图像。在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 标头。

ZwOpenFile()的调用成功,但ZwReadFile()返回STATUS_INVALID_HANDLE

我尝试使用LARGE_INTEGER byteOffsetFILE_SYNCHRONOUS_IO_NONALERT而不是FILE_RANDOM_ACCESS。我还尝试使用带有GENERIC_READFILE_ATTRIBUTE_READONLY参数的ZwCreateFile()

我已经成功地使用类似的代码写入了一个文件。

我尝试获取正确的文件句柄进行读取有什么问题?

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

更改此设置:

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

对此:

status = ZwReadFile(fh, ...);