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 byteOffset
和 FILE_SYNCHRONOUS_IO_NONALERT
而不是 FILE_RANDOM_ACCESS
。我也尝试过将 ZwCreateFile()
与 GENERIC_READ
和 FILE_ATTRIBUTE_READONLY
参数一起使用。
我已成功使用类似代码写入文件。
我尝试获取正确的文件句柄以进行读取时遇到了什么问题?
当您应该传递 HANDLE
的值时,您传递的是指向 HANDLE
变量本身的指针。
改变这个:
status = ZwReadFile(&fh, ...);
为此:
status = ZwReadFile(fh, ...);
在学习如何编写 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 byteOffset
和 FILE_SYNCHRONOUS_IO_NONALERT
而不是 FILE_RANDOM_ACCESS
。我也尝试过将 ZwCreateFile()
与 GENERIC_READ
和 FILE_ATTRIBUTE_READONLY
参数一起使用。
我已成功使用类似代码写入文件。
我尝试获取正确的文件句柄以进行读取时遇到了什么问题?
当您应该传递 HANDLE
的值时,您传递的是指向 HANDLE
变量本身的指针。
改变这个:
status = ZwReadFile(&fh, ...);
为此:
status = ZwReadFile(fh, ...);