在學習如何編寫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