2016-07-06 210 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)。 –