標籤:函數 描述 成員函數 let res read ogr soc 自旋鎖
0. 參考文獻
《windows WDM 裝置驅動程式開發指南》《programming the microsoft windows driver model》
《windows 2000驅動程式開發大全》
使用driverworks工具(driverStudio),而沒有用DDK,因為更快捷
1. WDM驅動
常式
頁故障:軟體層級中斷,運行在DISPATCH_LEVEL上; 所以訪問DISPATCH_LEVEL的代碼需運行在非分頁式記憶體
1.3 裝置介面
舊的命名方法:驅動建立一個符號連結,應用來訪問。
新的命名方法:128位GUID唯一標識, GUIDGEN產生
2. WDM基本結構
driverworks: kdriver, kpnpDevice, kpnpLowerDevice
2.1 kdriver
1)裝載驅動時,pnp管理器為每個驅動程式調用一次driverentry常式
2)初始化之後,pnp調用addDevice初始化裝置;運行時有新裝置被枚舉將調用addDevice裝置
adddevice本職是把新裝置附加到裝置堆疊中
3)driverworks中FDO和PDO串連
2.2 kpnpdevice
DO_EXCLUSIVE 指出裝置是否排斥(io管理器僅允許開啟一次)
列舉了一些函數
HID, human interface device;
WMI,windows 管理診斷
3. IRP操作
driverworks對IRP進行了封裝KIrp
IRP重要域:
1)MdlAddress(PMDL): 指向記憶體描述符表,當使用DO_DIRECT_IO,
對於IRP_MJ_READ/WRITE, IO管理器就建立MDL,鎖定使用者記憶體。
對於IRP_MJ_DEVICE_CONTROL, METHOD_IN_DIRECT/ METHOD_OUT_DIRECT, 輸出緩衝區建立MDL
2)associatedIrp.systemBuffer, 系統的資料緩衝區,DO_BUFFERED_IO會用
3)IoStatus, status收到NTSTATUS, information用於儲存資料轉送操作
建立IRP時,同時建立關聯的IO_STACK_LOCATION堆棧數組,每個堆棧單元對應一個要處理該IRP的驅動,儲存IRP類型和參數等
MajorFunction: 如IRP_MJ_READ
minorFunction: 如IRP_MJ_PNP 的IRP_MN_START_DEVICE, IRP_MN_REMOVE_DEVICE
parameters: create, read, startdevice
deviceObject
completionRoutine
3.2 kirp
函數: complete(), 完成IRP,絕不允許擁有自旋鎖的情況下調用此函數,運行在IRQL<=DISPATCH_LEVEL
status(), 即iostatus.status域, 如STATUS_PENDING
information(), 若status不是STATUS_SUCCESS, 則這裡設定為0
IoctlBuffer(), bufferedReadDest, bufferedWriteSource() 對應associatedIrp.systembuffer
MarkPending()
IoctlCode(), readSize(),
WDM使用的成員函數
allocatedResources, 系統分配的資源
translatedResources, 系統分配的翻譯資源
3.3 IRP基本操作
完成IRP I.pnpComplete()
取消IRP
等
windows 2000/xp WDM裝置驅動程式開發 (1)