一,irp的概念(i/o request package
)
當乙個應用程式呼叫函式去操作某個裝置時,比如呼叫createfile,deviceiocontrol,等等時,i/o管理器為此函式建立乙個irp資料結構物件和乙個irp_stack_location資料結構物件陣列,(陣列個數等於驅動程式堆疊上驅動的個數),irp中的currentstacklocation指向irp_stack_location中的某乙個元素。os 並不會為我們填充好irp_stack_location陣列,每乙個元素是由上一層驅動負責填充的。
os只負責把irp包給最上層的驅動程式,至於如何向下層,就是驅動程式自己的事情了。所以下層對就的那些irp_stack_location,完全由上層驅動函式負責填充,os不管。
驅動程式如何填充一層驅動需要用的irp_stack_location呢?
可以通過呼叫iogetnextirpstacklocation呼叫得到。其實該函式內部就是返回currentstacklocation加1而已。對陣列值加1,當然就是得到陣列的下乙個值了。這樣就可以對它進行賦值了。然後呼叫iocalldriver(),iocalldriver()會將irp包中的currentstacklocation值加1,然後呼叫那個driver.
二irp的結構
typedef struct _irp associatedirp;
list_entry threadlistentry; //用來將 irp掛入某個執行緒的 irplist佇列
io_status_block iostatus; //用來返回操作的完成狀況
kprocessor_mode requestormode;
boolean pendingreturned;
char stackcount;
char currentlocation;
… boolean cancel;
kirql cancelirql;
… pdriver_cancel cancelroutine;
pvoid userbuffer;
union ;};…
pethread thread;
…list_entry listentry;
… } overlay;
…} tail;
} irp, *pirp;
io_stack_location結構為:
typedef struct _io_stack_location parameters;
pdevice_object deviceobject;
pfile_object fileobject;
pio_completion_routine completionroutine;
pvoid context;
} io_stack_location, *pio_stack_location;
majorfunction指示驅動程式應該使用哪個函式來處理io請求。
minorfunction 進一步指出該irp屬於哪個主功能類
flags 表明io請求型別。
deviceobject(pdevice_object)是與該堆疊單元對應的裝置物件的位址。該域由iocalldriver函式負責填寫。
completionroutine(pio_completion_routine)是乙個i/o完成例程的位址,該位址是由與這個堆疊單元對應的驅動程式的更上一層驅動程式設定的。通過呼叫iosetcompletionroutine函式來設定。裝置堆疊的最低一級驅動程式並不需要完成例程,因為它們必須直接完成請求。然而,請求的發起者有時確實需要乙個完成例程,但通常沒有自己的堆疊單元。這就是為什麼每一級驅動程式都使用下一級驅動程式的堆疊單元儲存自己完成例程指標的原因。
現在對irp和io_stack_location都有了乙個初步的認識。當驅動程式對irp完成了操作(對各個域的讀寫)之後,需要呼叫iocompleterequest表明irp處理已經結束,並將irp交還給io管理器。
void iocompleterequest(
__in pirp irp,
__in cchar priorityboost
);
windows驅動程式設計學習順序
windows驅動程式設計學習順序?2010年11月19日 核心驅動程式設計並不是什麼高深的知識,無非也是按照系統的api,框架去做 罷了,只是這些東西,提供了更接近於底層的功能,在某些情況下對程式的構架更加有利效率更高而已。沒有創新性的東西是無所謂難度不難度的,照葫蘆畫瓢而已。從 學起,基本路線 ...
windows驅動開發學習筆記
編寫程式,是一件什麼一樣的事情?是一件很奇妙的事情嗎?它可以帶來什麼?它能帶給人什麼感受?它能帶給人創造和控制的慾望嗎?每當乙個人在閱讀或者寫一段 時,腦子裡會怎麼想的?腦子會想象那段 怎樣完成預定邏輯。對於寫 或者維護 的人來說,體現能力的地方不在 本身,而是對下層開發平台的理解和駕馭能力。怎麼樣...
windows 程式設計 學習筆記(一)
最近看這本書,順便寫下筆記,做了有兩年的windows 開發 一直自學 打算看下基本經典的書,查缺補漏,我這人有強迫症 必須得系統學,話說這中文版的翻譯也太爛了 將就著看吧,誰讓咱英語不好呢,錯了不要噴 純粹是筆記。include int winapi winmain hinstance hinst...