2016-07-06 207 views
0

在学习如何编写Windows驱动程序时,我正在修改AvsCamera的Windows Driver SampleWindows驱动程序:ZwReadFile返回STATUS_INVALID_HANDLE

我想用一个位图文件替换模拟图像。在Synthesizer.cpp文件,我已经注释掉至SynthesizeBars()ApplyGradient()EncodeNumber()Synthesize()方法中的通话,以及与此代码替换他们:

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。我也尝试使用ZwCreateFile()GENERIC_READFILE_ATTRIBUTE_READONLY参数。

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

我试图获取正确的文件句柄以解决阅读的问题是什么?

+0

'ZwReadFile(fh'为什么你通过手柄的*地址*有 – dxiv

回答

3

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

更改此:

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

要这样:

status = ZwReadFile(fh, ...); 
+0

由于这是奇怪的是,我没有”?但是我仍然得到一个无效的句柄状态,但是, – wulfsdad

+0

更正:现在它是一个STATUS_INVALID_PARAMETER错误,至少现在我知道接下来要看的地方,谢谢 – wulfsdad

+0

不幸的是,'HANDLE'是typedef'd为'void *'和[C和C都是C++会隐式地将任何类型的指针转​​换为void指针](http://stackoverflow.com/a/1736841/886887)。 –