Windows 驱动程序:ZwReadFile 返回STATUS_INVALID_HANDLE
Windows Driver: ZwReadFile returns STATUS_INVALID_HANDLE
在学习如何编写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 byteOffset
,FILE_SYNCHRONOUS_IO_NONALERT
而不是FILE_RANDOM_ACCESS
。我还尝试使用带有GENERIC_READ
和FILE_ATTRIBUTE_READONLY
参数的ZwCreateFile()
。
我已经成功地使用类似的代码写入了一个文件。
我尝试获取正确的文件句柄进行读取有什么问题?
当您应该传递HANDLE
的值时,您正在传递指向HANDLE
变量本身的指针。
更改此设置:
status = ZwReadFile(&fh, ...);
对此:
status = ZwReadFile(fh, ...);
相关文章:
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- C++ "error: invalid use of void expression"
- 收到错误"invalid use of non-static data member 'stu::n' "
- Poloniex API "Invalid command" c++ libcurl
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- SDL_CreateTextureFromSurface() "Invalid texture"错误?
- C++ "Invalid use of 'this' in non-member function" ,
- protobuf C++ SQLite handle blob data
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- "fast"或"normal"在"free(): invalid next size (fast)"中是什么意思?
- 如何在Arduino程序中解决"invalid operands of types"?
- C++ libtins "An invalid handle was specified"
- 尝试执行任何需要它的操作时,无法修复 WinAPI 中的"invalid handle"错误
- 在没有 UWP 的情况下从 C++/WinRT 使用 FileOpenPicker 时出现视觉"Invalid window handle"错误
- WSARecv 有时会返回与 IOCP 端口关联的套接字的"invalid handle (error no 6)"。(C++)
- 为什么我在调用 GetThreadTimes 时收到错误"The handle is invalid"?