標籤:
大部分IRP都是由應用程式的Win32 API函數發起的。這些Win32 API本身就支援同步和非同步作業。例如,ReadFile、WriteFile和DeviceIoControl等,它們都有非同步和同步兩種操作方式。DeviceIoControl的同步操作:
同步操作時,DeviceIoControl的內部會調用WaitForSingleObject函數去等待一個事件。這個事件直到IRP結束才會觸發。如果通過反組譯碼IoCompleteRequest核心功能,就會發現在IoCompleteRequest內部設定了該事件。DeviceIoControl會暫時進入睡眠狀態,直到IRP結束。
而對於非同步作業,其處理過程:
在非同步作業的情況下,當DeviceIoControl被調用時,其內部會產生IRP,並將該IRP傳遞給驅動內部的派遣函數。但此時 DeviceIoControl不會等待該IRP結束,而是直接返回。當IRP經過一段時間被結束時,作業系統會出發一個IRP相關事件。這個事件可以通知應用程式IRP請求被執行完畢。
同步操作裝置:
CreateFile的函式宣告如下:
1 HANDLE WINAPI CreateFile(2 _In_ LPCTSTR lpFileName,3 _In_ DWORD dwDesiredAccess,4 _In_ DWORD dwShareMode,5 _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,6 _In_ DWORD dwCreationDisposition,7 _In_ DWORD dwFlagsAndAttributes,8 _In_opt_ HANDLE hTemplateFile9 );
CreateFile中的第六個參數dwFlagsAndAttributes是同步非同步作業的關鍵。如果這個參數中沒有設定FILE_FLAG_OVERLAPPED,則以後對該裝置的操作都是同步操作,否則所有操作為非同步作業。
非同步作業裝置方式一:
先來看一下OVERLAPPED的結構:
其中最後一個參數hEvent,這個事件用於該操作完成之後通知應用程式。
《Windows驅動開發技術詳解》之IRP的同步