Windows Minifilter驅動 - 獲取進程ID, 進程名字和線程ID


https://blog.csdn.net/zj510/article/details/39476171

Windows Minifilter驅動 - 獲取進程ID, 進程名字和線程ID 

 

在minifilter里面可能有好幾種獲取調用進程id,名字和線程的辦法。我這里有一種:

使用

PsSetCreateProcessNotifyRoutine 和

PsSetLoadImageNotifyRoutine

這是兩個API,我們可以借助它們獲取進程信息。具體看:http://msdn.microsoft.com/en-us/library/windows/hardware/ff559951(v=vs.85).aspx

 

PsSetLoadImageNotifyRoutine

可以使用這個函數設置一個通知回調,每當操作系統新加載一個影像文件的時候,回調函數會被調用。

比如在DriverEntry里面調用:

 

[cpp]  view plain  copy
 
  1. PsSetLoadImageNotifyRoutine(MyMiniFilterLoadImage);  

回調函數:

 

 

[cpp]  view plain  copy
 
  1. VOID   
  2. MyMiniFilterLoadImage( __in_opt PUNICODE_STRING FullImageName, __in HANDLE ProcessId, __in PIMAGE_INFO ImageInfo )  
  3. {  
  4.     UNREFERENCED_PARAMETER(ImageInfo);  
  5.   
  6.     if (FullImageName)  
  7.     {  
  8.         DbgPrint("MyMiniFilterLoadImage, image name: %wZ, pid: %d\n", FullImageName, ProcessId);  
  9.     }  
  10.     else  
  11.         DbgPrint("MyMiniFilterLoadImage, image name: null, pid: %d\n", ProcessId);  
  12. }  

這樣,當用戶新啟動一個進程的時候,這個函數就會被調用,里面可以獲取進程名和進程id,還有個ImageInfo。

 

 

PsSetCreateProcessNotifyRoutine

我們可以使用這個函數來設置一個回調函數。每當操作系統創建一個進程或者關閉一個進程的時候,回調都會被調用。

DriverEntry調用:

 

[cpp]  view plain  copy
 
  1. PsSetCreateProcessNotifyRoutine(MyMiniFilterProcessNotify, FALSE);  


具體回調:

 

 

[cpp]  view plain  copy
 
  1. VOID  
  2. MyMiniFilterProcessNotify(  
  3. IN HANDLE  ParentId,  
  4. IN HANDLE  ProcessId,  
  5. IN BOOLEAN  Create  
  6. )  
  7. {  
  8.     DbgPrint("MyMiniFilterProcessNotify, pid: %d, tid: %d, create: %d\n", ParentId, ProcessId, Create);  
  9. }  

 

 

IRP Event中獲取進程ID和線程ID

比如在IRP_MJ_WRITE中獲取:

 

[cpp]  view plain  copy
 
  1. ULONG ProcessId = FltGetRequestorProcessId(Data);  
  2. ULONG ThreadId = (ULONG)PsGetThreadId(Data->Thread);  
  3.   
  4. DbgPrint("IRP_MJ_WRITE, pid: %d, tid: %d\n", ProcessId, ThreadId);  

注意:PsGetThreadId是個未公開API。調用需要小心一些。

 

 

如果我們想在IRP回調中獲取進程名字。有個辦法就是在PsSetLoadImageNotifyRoutine的回調函數里面把進程名和進程ID保存下來,比如保存到一個list。這樣,在IRP回調里面可以用進程ID來獲取進程名。

 

取消回調

在驅動被卸載之前,需要取消回調。不然會藍屏。比如可以在FilterUnload那里取消。

 

[cpp]  view plain  copy
 
    1. PsSetCreateProcessNotifyRoutine(MyMiniFilterProcessNotify, TRUE);  
    2.     PsRemoveLoadImageNotifyRoutine(MyMiniFilterLoadImage);  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM