標籤:執行個體 int 組件 瓶頸 system 管理 序列化 work 電源管理
4. WDM環境
a 安裝VC6.0;
b 安裝相應作業系統的DDK(組件一定要全選);
c 安裝DriverStudio;
d 用VC6.0開啟Compuware\Driver Studio\DriverWorks\Source\VdwLibs.dsw工程;
1)用DriverStudio的driverWizard來建立工程
建立RegSample完後編譯出現錯誤,刪掉沒有的函數,然後去掉了ntstrsafe.lib 連結庫
2)EzDriverInstaller (driverstudio)安裝 inf
3)表徵圖,-20是
-5是
註冊表的HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Class 可以更改對應的表徵圖
4) 打log, KTrace, KDebugOnlyTrace, DbgPrint
USB2.0 最高60MB/s黑色或白色介面,3.0是600MB/s藍色,
5. 驅動和應用的通訊
5.1 開啟裝置 createFile(), 用GUID或符號連結
同步:FILE_ATTRIBUTE_NORMAL
非同步:FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
關閉裝置 closeHandle(), 產生 IRP_MJ_CLEANUP 和 IRP_MJ_CLOSE, 應用程式Ctrl_C強行退出和出錯退出都產生這兩個IRP
DeviceIoControl(), 非同步呼叫waitForSingleObject來等待IO完成
readFile, writeFile,
5.2 驅動和應用通訊
WDM兩種方法:
1)非同步完成IRP,intrdemo DS的例子,沒看
2)win32事件(就是createEvent),charFilter例子,沒看
6. 常見編程技術
6.1 字串
CHAR, WCHAR, ANSI_STRING, UNICODE_STRING
KUstring類
6.2 記憶體
非分頁式記憶體 m_image = new(NonPagedPool) UCHAR[m_size];
KMemory類,為記憶體描述符表MDL提供服務,
KHeap類記憶體堆,比較大塊
6.9 CancelSpinLock類, 全域取消自旋鎖是瓶頸,CPU在等待自旋鎖的時候什麼也不能幹。 可用IoSetCancelRoutine來代替
6.10 KSpinLock類,可以阻塞其他線程
6.12 timerSample, FileThread
執行個體模仿driverMonitor來列印log
7. PNP 隨插即用常式
啟動、停止、刪除裝置, DW自動產生這三常式
8. 電源管理
9. WMI 系統管理
10. IRP序列化
1) driverworks提供了KDeviceQueue,
KDevice::QueueIrp(),irp入隊; 若隊列閑則調用StartIo
KDriverManagedQueueEx用於自己管理多個隊列
startIoChar_Driver執行個體
11. WDM過濾器驅動
和普通驅動一樣,都有DriverEntry,addDevice等,用裝置堆疊來分層
上層驅動用於添加附加功能
下層驅動用於協助寫一個匯流排無關的驅動,如PCI匯流排、USB匯流排可以統一成一個匯流排結構的功能驅動
12 USB裝置開發
裝置介面暴露一個或多個端點,有四種:批量,控制,中斷,同步
0號端點:預設的控制方法,
事務由一個或多個階段組成,階段有三種:令牌、資料、握手
(待續)
13. PCI裝置驅動
xp86的IO地址有64KB,而記憶體位址空間4GB
KMemoryRange, KIoRange
KPciConfiguration
connect() , 把中斷對象和插斷服務常式串連起來
DMA傳輸
1)執行個體
a) PCI9054介面卡,採用PLX公司的PCI9054晶片,局部匯流排介面模式為C模式,9054局部匯流排訊號線和FPGA晶片相連。
裝置要訪問的資源:前兩個固定用於9054的操作寄存器;第三個為IO映射空間,用於裝置訪問
b) FPGA有FIFO,DMA採用塊模式
c) 9054執行個體過程:先IO指令寫32位元組到FIFO,然後DMA塊傳輸讀
d) DMAsample
windows 2000/xp WDM裝置驅動程式開發 (2)