在学习如何编写Windows驱动程序时,我正在修改AvsCamera的Windows Driver Sample。Windows驱动程序: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 byteOffset
和FILE_SYNCHRONOUS_IO_NONALERT
而不是FILE_RANDOM_ACCESS
。我也尝试使用ZwCreateFile()
与GENERIC_READ
和FILE_ATTRIBUTE_READONLY
参数。
我已经成功写入使用类似代码的文件。
我试图获取正确的文件句柄以解决阅读的问题是什么?
'ZwReadFile(fh'为什么你通过手柄的*地址*有 – dxiv