武安河另外講WDM的書是《windows 2000/xp wdm設備驅動開發》
KDMF 構建在WDM之上,內核級,sys文件
UDMF 用戶級,dll文件
第1章 Windows 2000和WDM驅動程序
1.中斷優先級(IRQL): 32個中斷級別,可打斷
0 : PASSIVE_LEVEL, 常規線程
1:APC_LEVEL, 異步調用過程
2:DISPATCH_LEVEL, 延遲過程調用
3~26: DIRQL, 硬件中斷
2. 在DISPATCH_LEVEL 運行代碼時,訪問非分頁內存是一個根本原則
第2章 KMDF驅動程序框架
1. 環境變量結構
_DEVICE_CONTEXT{}
pDeviceContext = GetDeviceContext(Device);
2. 創建對象的方法
KMDF控制的對象生命周期:WDFDRIVER, WDFDEVICE, WDFFILEOBJECT, WDFREQUEST (IRP)
3. KMDF結構
1)DriverEntry:設置 EvtDeviceAdd (安裝時調),WdfDriverCreate 創建驅動對象
2) EvtDriverDeviceAdd: 新設備被枚舉時會調用,
職責:創建設備對象,I/O隊列,GUID接口,事件回調例程,
WdfDeviceCreate, WdfDeviceCreateDeviceInterface,
WdfDeviceInitSetExclusive(DeviceInit,TRUE); // 獨占,只允許一個應用打開
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig, WdfIoQueueDispatchSequential); // IO為串行
WdfIoQueueCreate // io隊列
WdfDeviceCreateDeviceInterface // guid接口
3)I/O處理例程
WDF_FILEOBJECT_CONFIG_INIT(&FileConfig,EvtDeviceFileCreate, EvtFileClose, EvtFileCleanup);
ioQueueConfig.EvtIoDeviceControl = PCI9056WDF_EvtIoDeviceControl; // DeviceIoControl 調用
ioQueueConfig.EvtIoRead = PCI9056WDF_EvtIoRead; // ReadFile
ioQueueConfig.EvtIoWrite = PCI9056WDF_EvtIoWrite; // WriteFile
第3章 基本對象
1. WDFREQUEST: I/O請求,即IRP
WdfRequestComplete : 完成請求
WdfRequestCompleteWithInformation : 完成請求, 完成的傳輸字節數
WdfRequestRetrieveInputBuffer: 獲取輸入緩沖器地址
WdfRequestRetrieveInputMemory: 獲取輸入緩沖器地址,形式為WDFMEMORY
WdfRequestRetrieveInputWdmMdl: 獲取輸入緩沖器地址,形式為MDL
WdfRequestGetIoQueue: 返回隊列對象
WdfRequestGetFileObject: 返回文件對象
WdfRequestGetInformation: 完成的傳輸字節數
WdfRequestCreate: 創建IO請求
2. IO請求(IRP)基本操作
取消IO請求:編寫取消例程
向下傳遞IO請求
3. WDFQUEUE 隊列, WdfIoQueueDispatchSequential 串行
初始化默認隊列 WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE
WdfIoQueueCreate
WdfIoQueueStart : 啟動接收和分發IRP
WdfIoQueueStop: 暫停分發,但還接收
WdfIoQueueDrain: 停止接收,但分發
WdfIoQueuePurge: 停止接收,取消隊列中的IRP
4. WDFTIMER, WDFDPC, WDFWORKITEM, WDFMEMORY
5. 數據同步
1)自旋鎖運行在DISPATCH_LEVEL(自動提升),因此不能訪問分頁內存
WdfSpinLockCreate, WdfSpinLockAcquire, WdfSpinLockRelease
2)WDFWAITLOCK 運行在PASSIVE_LEVEL, 同步鎖
WdfWaitLockCreate, WdfWaitLockAcquire, WdfWaitLockRelease
6. 字符串
CHAR, WCHAR, STRING, UNICODE_STRING
WDFSTRING: WdfStringCreate
串處理函數:strlen之類
7. 隊列編程 QueueSample
// 因為取消例程等要用環境變量, 所以用一個設備對象范圍同步(重要)
deviceAttr.SynchronizationScope = WdfSynchronizationScopeDevice;
調用例程,取消例程,定時器回調例程,都用了設備對象范圍同步,所以運行在DISPATCH_LEVEL, 不能用分頁內存。不然要藍屏