windows設備驅動程序WDF開發(1)


武安河另外講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, 不能用分頁內存。不然要藍屏

 


免責聲明!

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



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