2015-11-15 148 views
0

我很新的驅動程序編程。我有使用PsLookupProcessByProcessId例程的驅動程序代碼。我正嘗試使用Direct I/O。我使用DWORD變量從用戶模式發送PID並將其讀入buf。這裏是產生錯誤代碼在IRP_MJ_WRITE的MajorFunction的片段:驅動程序PsLookupProcessByProcessId錯誤代碼0xc000000b

PVOID buf=MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority); 
PEPROCESS Process = NULL; 
DbgPrint("Process ID: %d",*(PHANDLE)buffer); 

if(!NT_SUCCESS(status=PsLookupProcessByProcessId(*(PHANDLE)buf,&Process))) 
     { 
      DbgPrint("Error: (%#x)",status); 
     } 

錯誤代碼是0xc000000b。打印PID時,打印正確。我不知道爲什麼這個錯誤代碼被返回。根據http://doxygen.reactos.org/d3/d93/ntstatus_8h_a27310062c4edd9cc932e5607884904ae.html#a27310062c4edd9cc932e5607884904ae這個錯誤代碼應該從PsLookupProcessThreadByCid()返回。在函數PsLookupProcessByProcessId中,我看不到任何可能返回該錯誤的指令http://doxygen.reactos.org/d2/d9f/ntoskrnl_2ps_2process_8c_a85b05806391e5e2647dfdaea64b5b7a4.html#a85b05806391e5e2647dfdaea64b5b7a4。我不知道真正的問題是什麼,我卡住了。請幫幫我。我正在開發Windows 7 x64免費編譯環境。

+0

非常感謝你,但鏈接已斷開。我無法下載該工具。 –

+0

您鏈接到的文檔適用於ReactOS,不適用於Windows。 –

+1

該代碼片段有兩個明顯的問題:打印「* buffer」的值,但將'* buf'的值傳遞給PsLookupProcessByProcessId,並且將八字節值傳遞給DbgPrint,但使用4字節說明符。據猜測,問題在於用戶模式程序正在傳遞一個4字節的進程ID,因此您傳遞的8字節ID的高四字節是隨機垃圾。 –

回答

0

這裏的問題:

*(PHANDLE)BUF

你宣佈buf是一個指向HANDLE(8個字節)。但是您說用戶代碼將進程ID作爲DWORD(4個字節)傳遞。

嘗試

(HANDLE)(*(PDWORD)BUF)

+0

謝謝大家的幫助。 Harry Johnston的解決方案完成了這項工作!現在它工作正常。 –