注冊(cè) | 登錄讀書好,好讀書,讀好書!
讀書網(wǎng)-DuShu.com
當(dāng)前位置: 首頁(yè)出版圖書科學(xué)技術(shù)計(jì)算機(jī)/網(wǎng)絡(luò)操作系統(tǒng)WindowsWindows驅(qū)動(dòng)開(kāi)發(fā)技術(shù)詳解

Windows驅(qū)動(dòng)開(kāi)發(fā)技術(shù)詳解

Windows驅(qū)動(dòng)開(kāi)發(fā)技術(shù)詳解

定 價(jià):¥65.00

作 者: 張帆 等編著
出版社: 電子工業(yè)出版社
叢編項(xiàng):
標(biāo) 簽: WINDOWS

ISBN: 9787121068461 出版時(shí)間: 2008-07-01 包裝: 平裝
開(kāi)本: 16開(kāi) 頁(yè)數(shù): 530 字?jǐn)?shù):  

內(nèi)容簡(jiǎn)介

  《Windows驅(qū)動(dòng)開(kāi)發(fā)技術(shù)詳解(珍藏版)》由淺入深、循序漸進(jìn)地介紹了Windows驅(qū)動(dòng)程序的開(kāi)發(fā)方法與調(diào)試技巧?!禬indows驅(qū)動(dòng)開(kāi)發(fā)技術(shù)詳解(珍藏版)》共分23章,內(nèi)容涵蓋了Windows操作系統(tǒng)的基本原理、NT驅(qū)動(dòng)程序與WDM驅(qū)動(dòng)程序的構(gòu)造、驅(qū)動(dòng)程序中的同步異步處理方法、驅(qū)動(dòng)程序中即插即用功能、驅(qū)動(dòng)程序的各種調(diào)試技巧等。同時(shí),還針對(duì)流行的PCI驅(qū)動(dòng)程序、 USB驅(qū)動(dòng)程序、虛擬串口驅(qū)動(dòng)程序、攝像頭驅(qū)動(dòng)程序、SDIO驅(qū)動(dòng)程序進(jìn)行了詳細(xì)的介紹,《Windows驅(qū)動(dòng)開(kāi)發(fā)技術(shù)詳解(珍藏版)》最大的特色在于每一節(jié)的例子都是經(jīng)過(guò)精挑細(xì)選的,具有很強(qiáng)的針對(duì)性。力求讓讀者通過(guò)親自動(dòng)手實(shí)驗(yàn),掌握各類Windows驅(qū)動(dòng)程序的開(kāi)發(fā)技巧,學(xué)習(xí)盡可能多的Windows底層知識(shí)?!禬indows驅(qū)動(dòng)開(kāi)發(fā)技術(shù)詳解(珍藏版)》適用于中、高級(jí)系統(tǒng)程序員,同時(shí)也可用做高校計(jì)算機(jī)專業(yè)操作系統(tǒng)實(shí)驗(yàn)課的補(bǔ)充教材。

作者簡(jiǎn)介

  張帆:畢業(yè)于北京理工大學(xué)電子工程系,曾就職于威盛電子有限公司,現(xiàn)就職于北京創(chuàng)毅視訊科技有限公司。長(zhǎng)期從事PCI、USB、SDIO、串口、攝像頭等設(shè)備的Windows驅(qū)動(dòng)程序開(kāi)發(fā)。對(duì)Windows操作系統(tǒng)內(nèi)核有深入的研究,并且有豐富的Windows驅(qū)動(dòng)程序開(kāi)發(fā)經(jīng)驗(yàn)。 史彩成: 博士后,北京理工大學(xué)信息科學(xué)技術(shù)學(xué)院副教授,資深電子系統(tǒng)專家,主要從事圖像處理、激光信號(hào)處理、數(shù)據(jù)融合及ASIC設(shè)計(jì)等領(lǐng)域的研究工作。

圖書目錄

第1篇 入門篇
第1章 從兩個(gè)最簡(jiǎn)單的驅(qū)動(dòng)談起
本章向讀者呈現(xiàn)兩個(gè)最簡(jiǎn)單的Windows驅(qū)動(dòng)程序,一個(gè)是NT式的驅(qū)動(dòng)程序,另一個(gè)是WDM式的驅(qū)動(dòng)程序。這兩個(gè)驅(qū)動(dòng)程序沒(méi)有操作具體的硬件設(shè)備,只是在系統(tǒng)里創(chuàng)建了虛擬設(shè)備。在隨后的章節(jié)中,它們會(huì)作為基本驅(qū)動(dòng)程序框架,被本書其他章節(jié)的驅(qū)動(dòng)程序開(kāi)發(fā)所復(fù)用。筆者將帶領(lǐng)讀者編寫代碼、編譯、安裝和調(diào)試程序。
1.1 DDK的安裝
1.2 第一個(gè)驅(qū)動(dòng)程序HelloDDK的代碼分析
1.2.1 HelloDDK的頭文件
1.2.2 HelloDDK的入口函數(shù)
1.2.3 創(chuàng)建設(shè)備例程
1.2.4 卸載驅(qū)動(dòng)例程
1.2.5 默認(rèn)派遣例程
1.3 HelloDDK的編譯和安裝
1.3.1 用DDK環(huán)境編譯HelloDDK
1.3.2 用VC集成開(kāi)發(fā)環(huán)境編譯HelloDDK
1.3.3 HelloDDK的安裝
1.4 第二個(gè)驅(qū)動(dòng)程序HelloWDM的代碼分析
1.4.1 HelloWDM的頭文件
1.4.2 HelloWDM的入口函數(shù)
1.4.3 HelloWDM的AddDevice例程
1.4.4 HelloWDM處理PNP的回調(diào)函數(shù)
1.4.5 HelloWDM對(duì)PNP的默認(rèn)處理
1.4.6 HelloWDM對(duì)IRP_MN_REMOVE_DEVICE的處理
1.4.7 HelloWDM對(duì)其他IRP的回調(diào)函數(shù)
1.4.8 HelloWDM的卸載例程
1.5 HelloWDM的編譯和安裝
1.5.1 用DDK編譯環(huán)境編譯HelloWDM
1.5.2 HelloWDM的編譯過(guò)程
1.5.3 安裝HelloWDM
1.6 小結(jié)
第2章 Windows操作驅(qū)動(dòng)的基本概念
驅(qū)動(dòng)程序被操作系統(tǒng)加載在內(nèi)核模式下,它與Windows操作系統(tǒng)內(nèi)核的其他組件進(jìn)行密切交互。本章主要介紹Windows操作系統(tǒng)內(nèi)核的基本概念,同時(shí)還介紹應(yīng)用程序和驅(qū)動(dòng)程序之間的通信方法。
2.1 Windows操作系統(tǒng)概述
2.1.1 Windows家族
2.1.2 Windows特性
2.1.3 用戶模式和內(nèi)核模式
2.1.4 操作系統(tǒng)與應(yīng)用程序
2.2 操作系統(tǒng)分層
2.2.1 Windows操作系統(tǒng)總體架構(gòu)
2.2.2 應(yīng)用程序與Win32子系統(tǒng)
2.2.3 其他環(huán)境子系統(tǒng)
2.2.4 Native API
2.2.5 系統(tǒng)服務(wù)
2.2.6 執(zhí)行程序組件
2.2.7 驅(qū)動(dòng)程序
2.2.8 內(nèi)核
2.2.9 硬件抽象層
2.2.10 Windows與微內(nèi)核
2.3 從應(yīng)用程序到驅(qū)動(dòng)程序
2.4 小結(jié)
第3章 Windows驅(qū)動(dòng)編譯環(huán)境配置、安裝及調(diào)試
本章將帶領(lǐng)讀者一步步對(duì)驅(qū)動(dòng)程序進(jìn)行編譯、安裝和簡(jiǎn)單的調(diào)試工作。這些步驟雖然簡(jiǎn)單,但往往困惑著初次接觸驅(qū)動(dòng)程序的開(kāi)發(fā)者。
3.1 用C語(yǔ)言還是用C++語(yǔ)言
3.1.1 調(diào)用約定
3.1.2 函數(shù)的導(dǎo)出名
3.1.3 運(yùn)行時(shí)函數(shù)的調(diào)用
3.2 用DDK編譯環(huán)境編譯驅(qū)動(dòng)程序
3.2.1 編譯版本
3.2.2 nmake工具
3.2.3 build工具
3.2.4 makefile文件
3.2.5 dirs文件
3.2.6 sources文件
3.2.7 makefile.inc文件
3.2.8 build工具的環(huán)境變量
3.2.9 build工具的命令行參數(shù)
3.3 用VC編譯驅(qū)動(dòng)程序
3.3.1 建立驅(qū)動(dòng)程序工程
3.3.2 修改編譯選項(xiàng)
3.3.3 修改鏈接選項(xiàng)
3.3.4 其他修改
3.3.5 VC編譯小結(jié)
3.4 查看調(diào)試信息
3.4.1 打印調(diào)試語(yǔ)句
3.4.2 查看調(diào)試語(yǔ)句
3.5 手動(dòng)加載NT式驅(qū)動(dòng)
3.6 編寫程序加載NT式驅(qū)動(dòng)
3.6.1 SCM組件和Windows服務(wù)
3.6.2 加載NT驅(qū)動(dòng)的代碼
3.6.3 卸載NT驅(qū)動(dòng)的代碼
3.6.4 實(shí)驗(yàn)
3.7 WDM式驅(qū)動(dòng)的加載
3.7.1 WDM的手動(dòng)安裝
3.7.2 簡(jiǎn)單的INF文件剖析
3.8 WDM設(shè)備安裝在注冊(cè)表中的變化
3.8.1 硬件子鍵
3.8.2 類子鍵
3.8.3 服務(wù)子鍵
3.9 小結(jié)
第4章 驅(qū)動(dòng)程序的基本結(jié)構(gòu)
本章首先對(duì)Windows驅(qū)動(dòng)程序的兩個(gè)重要數(shù)據(jù)結(jié)構(gòu)進(jìn)行介紹,分別是驅(qū)動(dòng)對(duì)象和設(shè)備對(duì)象數(shù)據(jù)結(jié)構(gòu)。另外還要介紹NT驅(qū)動(dòng)程序和WDM驅(qū)動(dòng)程序的入口函數(shù)、卸載例程、各種IRP派遣上函數(shù)等。
4.1 Windows驅(qū)動(dòng)程序中重要的數(shù)據(jù)結(jié)構(gòu)
4.1.1 驅(qū)動(dòng)對(duì)象(DRIVER_OBJECT)
4.1.2 設(shè)備對(duì)象(DEVICE_OBJECT)
4.1.3 設(shè)備擴(kuò)展
4.2 NT式驅(qū)動(dòng)的基本結(jié)構(gòu)
4.2.1 驅(qū)動(dòng)加載過(guò)程與驅(qū)動(dòng)入口函數(shù)(DriverEntry)
4.2.2 創(chuàng)建設(shè)備對(duì)象
4.2.3 DriverUnload例程
4.2.4 用WinObj觀察驅(qū)動(dòng)對(duì)象和設(shè)備對(duì)象
4.2.5 用DeviceTree觀察驅(qū)動(dòng)對(duì)象和設(shè)備對(duì)象
4.3 WDM式驅(qū)動(dòng)的基本結(jié)構(gòu)
4.3.1 物理設(shè)備對(duì)象與功能設(shè)備對(duì)象
4.3.2 WDM驅(qū)動(dòng)的入口程序
4.3.3 WDM驅(qū)動(dòng)的AddDevice例程
4.3.4 DriverUnload例程
4.3.5 對(duì)IRP_MN_REMOVE_DEVICE IRP的處理
4.3.6 用Device Tree查看WDM設(shè)備對(duì)象棧
4.4 設(shè)備的層次結(jié)構(gòu)
4.4.1 驅(qū)動(dòng)程序的垂直層次結(jié)構(gòu)
4.4.2 驅(qū)動(dòng)程序的水平層次結(jié)構(gòu)
4.4.3 驅(qū)動(dòng)程序的復(fù)雜層次結(jié)構(gòu)
4.5 實(shí)驗(yàn)
4.5.1 改寫HelloDDK查看驅(qū)動(dòng)結(jié)構(gòu)
4.5.2 改寫HelloWDM查看驅(qū)動(dòng)結(jié)構(gòu)
4.6 小結(jié)
第5章 Windows內(nèi)存管理
本章圍繞著驅(qū)動(dòng)程序中的內(nèi)存操作進(jìn)行了介紹。在驅(qū)動(dòng)程序開(kāi)發(fā)中,首先要注意分頁(yè)內(nèi)存和非分頁(yè)內(nèi)存的使用。同時(shí),還需要區(qū)分物理內(nèi)存地址和虛擬內(nèi)存地址這兩個(gè)概念。
5.1 內(nèi)存管理概念
5.1.1 物理內(nèi)存概念(Physical Memory Address)
5.1.2 虛擬內(nèi)存地址概念(Virtual Memory Address)
5.1.3 用戶模式地址和內(nèi)核模式地址
5.1.4 Windows驅(qū)動(dòng)程序和進(jìn)程的關(guān)系
5.1.5 分頁(yè)與非分頁(yè)內(nèi)存
5.1.6 分配內(nèi)核內(nèi)存
5.2 在驅(qū)動(dòng)中使用鏈表
5.2.1 鏈表結(jié)構(gòu)
5.2.2 鏈表初始化
5.2.3 從首部插入鏈表
5.2.4 從尾部插入鏈表
5.2.5 從鏈表刪除
5.2.6 實(shí)驗(yàn)
5.3 Lookaside結(jié)構(gòu)
5.3.1 頻繁申請(qǐng)內(nèi)存的弊端
5.3.2 使用Lookaside
5.3.3 實(shí)驗(yàn)
5.4 運(yùn)行時(shí)函數(shù)
5.4.1 內(nèi)存間復(fù)制(非重疊)
5.4.2 內(nèi)存間復(fù)制(可重疊)
5.4.3 填充內(nèi)存
5.4.4 內(nèi)存比較
5.4.5 關(guān)于運(yùn)行時(shí)函數(shù)使用的注意事項(xiàng)
5.4.6 實(shí)驗(yàn)
5.5 使用C++特性分配內(nèi)存
5.6 其他
5.6.1 數(shù)據(jù)類型
5.6.2 返回狀態(tài)值
5.6.3 檢查內(nèi)存可用性
5.6.4 結(jié)構(gòu)化異常處理(try-except塊)
5.6.5 結(jié)構(gòu)化異常處理(try-finally塊)
5.6.6 使用宏需要注意的地方
5.6.7 斷言
5.7 小結(jié)
第6章 Windows內(nèi)核函數(shù)
本章介紹了Windows內(nèi)核模式下的一些常用內(nèi)核函數(shù),這些函數(shù)在驅(qū)動(dòng)程序的開(kāi)發(fā)中將會(huì)經(jīng)常用到。
6.1 內(nèi)核模式下的字符串操作
6.1.1 ASCII字符串和寬字符串
6.1.2 ANSI_STRING字符串與UNICODE_STRING字符串
6.1.3 字符初始化與銷毀
6.1.4 字符串復(fù)制
6.1.5 字符串比較
6.1.6 字符串轉(zhuǎn)化成大寫
6.1.7 字符串與整型數(shù)字相互轉(zhuǎn)換
6.1.8 ANSI_STRING字符串與UNICODE_STRING字符串相互轉(zhuǎn)換
6.2 內(nèi)核模式下的文件操作
6.2.1 文件的創(chuàng)建
6.2.2 文件的打開(kāi)
6.2.3 獲取或修改文件屬性
6.2.4 文件的寫操作
6.2.5 文件的讀操作
6.3 內(nèi)核模式下的注冊(cè)表操作
6.3.1 創(chuàng)建關(guān)閉注冊(cè)表
6.3.2 打開(kāi)注冊(cè)表
6.3.3 添加、修改注冊(cè)表鍵值
6.3.4 查詢注冊(cè)表
6.3.5 枚舉子項(xiàng)
6.3.6 枚舉子鍵
6.3.7 刪除子項(xiàng)
6.3.8 其他
6.4 小結(jié)
第7章 派遣函數(shù)
本章重點(diǎn)介紹了驅(qū)動(dòng)程序中的處理IRP請(qǐng)求的派遣函數(shù)。所有對(duì)設(shè)備的操作最終將轉(zhuǎn)化為IRP請(qǐng)求,這些IRP請(qǐng)求會(huì)被傳送到派遣函數(shù)處理。
7.1 IRP與派遣函數(shù)
7.1.1 IRP
7.1.2 IRP類型
7.1.3 對(duì)派遣函數(shù)的簡(jiǎn)單處理
7.1.4 通過(guò)設(shè)備鏈接打開(kāi)設(shè)備
7.1.5 編寫一個(gè)更通用的派遣函數(shù)
7.1.6 跟蹤IRP的利器IRPTrace
7.2 緩沖區(qū)方式讀寫操作
7.2.1 緩沖區(qū)設(shè)備
7.2.2 緩沖區(qū)設(shè)備讀寫
7.2.3 緩沖區(qū)設(shè)備模擬文件讀寫
7.3 直接方式讀寫操作
7.3.1 直接讀取設(shè)備
7.3.2 直接讀取設(shè)備的讀寫
7.4 其他方式讀寫操作
7.4.1 其他方式設(shè)備
7.4.2 其他方式讀寫
7.5 IO設(shè)備控制操作
7.5.1 DeviceIoControl與驅(qū)動(dòng)交互
7.5.2 緩沖內(nèi)存模式IOCTL
7.5.3 直接內(nèi)存模式IOCTL
7.5.4 其他內(nèi)存模式IOCTL
7.6 小結(jié)
第2篇 進(jìn)階篇
第8章 驅(qū)動(dòng)程序的同步處理
本章介紹了驅(qū)動(dòng)程序中常用的同步處理辦法,并且將內(nèi)核模式下的同步處理方法和用戶模式下的同步處理方法做了比較。另外,本章還介紹了中斷請(qǐng)求級(jí)、自旋鎖等同步處理機(jī)制。
8.1 基本概念
8.1.1 問(wèn)題的引出
8.1.2 同步與異步
8.2 中斷請(qǐng)求級(jí)
8.2.1 中斷請(qǐng)求(IRQ)與可編程中斷控制器(PIC)
8.2.2 高級(jí)可編程控制器(APIC)
8.2.3 中斷請(qǐng)求級(jí)(IRQL)
8.2.4 線程調(diào)度與線程優(yōu)先級(jí)
8.2.5 IRQL的變化
8.2.6 IRQL與內(nèi)存分頁(yè)
8.2.7 控制IRQL提升與降低
8.3 自旋鎖
8.3.1 原理
8.3.2 使用方法
8.4 用戶模式下的同步對(duì)象
8.4.1 用戶模式的等待
8.4.2 用戶模式開(kāi)啟多線程
8.4.3 用戶模式的事件
8.4.4 用戶模式的信號(hào)燈
8.4.5 用戶模式的互斥體
8.4.6 等待線程完成
8.5 內(nèi)核模式下的同步對(duì)象
8.5.1 內(nèi)核模式下的等待
8.5.2 內(nèi)核模式下開(kāi)啟多線程
8.5.3 內(nèi)核模式下的事件對(duì)象
8.5.4 驅(qū)動(dòng)程序與應(yīng)用程序交互事件對(duì)象
8.5.5 驅(qū)動(dòng)程序與驅(qū)動(dòng)程序交互事件對(duì)象
8.5.6 內(nèi)核模式下的信號(hào)燈
8.5.7 內(nèi)核模式下的互斥體
8.5.8 快速互斥體
8.6 其他同步方法
8.6.1 使用自旋鎖進(jìn)行同步
8.6.2 使用互鎖操作進(jìn)行同步
8.7 小結(jié)
第9章 IRP的同步
本章詳細(xì)地介紹了IRP的同步處理方法和異步處理方法。另外,本章還介紹了StartIO例程、中斷服務(wù)例程、DPC服務(wù)例程。
9.1 應(yīng)用程序?qū)υO(shè)備的同步異步操作
9.1.1 同步操作與異步操作原理
9.1.2 同步操作設(shè)備
9.1.3 異步操作設(shè)備(方式一)
9.1.4 異步操作設(shè)備(方式二)
9.2 IRP的同步完成與異步完成
9.2.1 IRP的同步完成
9.2.2 IRP的異步完成
9.2.3 取消IRP
9.3 StartIO例程
9.3.1 并行執(zhí)行與串行執(zhí)行
9.3.2 StartIO例程
9.3.3 示例
9.4 自定義的StartIO
9.4.1 多個(gè)串行化隊(duì)列
9.4.2 示例
9.5 中斷服務(wù)例程
9.5.1 中斷操作的必要性
9.5.2 中斷優(yōu)先級(jí)
9.5.3 中斷服務(wù)例程(ISR)
9.6 DPC例程
9.6.1 延遲過(guò)程調(diào)用例程(DPC)
9.6.2 DpcForISR
9.7 小結(jié)
第10章 定時(shí)器
本章總結(jié)了在內(nèi)核模式下的四種等待方法,讀者可以利用這些方法靈活地用在自己的驅(qū)動(dòng)程序中。最后本章還介紹了如何對(duì)IRP的超時(shí)情況進(jìn)行處理。
10.1 定時(shí)器實(shí)現(xiàn)方式一
10.1.1 I/O定時(shí)器
10.1.2 示例代碼
10.2 定時(shí)器實(shí)現(xiàn)方式二
10.2.1 DPC定時(shí)器
10.2.2 示例代碼
10.3 等待
10.3.1 第一種方法:使用KeWaitForSingleObject
10.3.2 第二種方法:使用KeDelayExecutionThread
10.3.3 第三種方法:使用KeStallExecutionProcessor
10.3.4 第四種方法:使用定時(shí)器
10.4 時(shí)間相關(guān)的其他內(nèi)核函數(shù)
10.4.1 時(shí)間相關(guān)函數(shù)
10.4.2 示例代碼
10.5 IRP的超時(shí)處理
10.5.1 原理
10.5.2 示例代碼
10.6 小結(jié)
第11章 驅(qū)動(dòng)程序調(diào)用驅(qū)動(dòng)程序
本章主要介紹了如何在驅(qū)動(dòng)程序中調(diào)用其他驅(qū)動(dòng)程序。比較簡(jiǎn)單的方法是將被調(diào)用的驅(qū)動(dòng)程序以文件的方式操作。比較高級(jí)的方法是構(gòu)造各種IRP,并將這些IRP傳送到被調(diào)用的驅(qū)動(dòng)程序中。
11.1 以文件句柄形式調(diào)用其他驅(qū)動(dòng)程序
11.1.1 準(zhǔn)備一個(gè)標(biāo)準(zhǔn)驅(qū)動(dòng)
11.1.2 獲得設(shè)備句柄
11.1.3 同步調(diào)用
11.1.4 異步調(diào)用方法一
11.1.5 異步調(diào)用方法二
11.1.6 通過(guò)符號(hào)鏈接打開(kāi)設(shè)備
11.2 通過(guò)設(shè)備指針調(diào)用其他驅(qū)動(dòng)程序
11.2.1 用IoGetDeviceObjectPointer獲得設(shè)備指針
11.2.2 創(chuàng)建IRP傳遞給驅(qū)動(dòng)的派遣函數(shù)
11.2.3 用IoBuildSynchronousFsdRequest創(chuàng)建IRP
11.2.4 用IoBuildAsynchronousFsdRequest創(chuàng)建IRP
11.2.5 用IoAllocateIrp創(chuàng)建IRP
11.3 其他方法獲得設(shè)備指針
11.3.1 用ObReferenceObjectByName獲得設(shè)備指針
11.3.2 剖析IoGetDeviceObjectPointer
11.4 小結(jié)
第12章 分層驅(qū)動(dòng)程序
本章主要介紹了分層驅(qū)動(dòng)的概念。分層驅(qū)動(dòng)可以將功能復(fù)雜的驅(qū)動(dòng)程序分解為多個(gè)功能簡(jiǎn)單的驅(qū)動(dòng)程序。多個(gè)分層的驅(qū)動(dòng)程序形成一個(gè)設(shè)備堆棧,IRP請(qǐng)求首先發(fā)送到設(shè)備堆棧的頂層,然后依次穿越每層的設(shè)備堆棧,最終完成IRP請(qǐng)求。
12.1 分層驅(qū)動(dòng)程序概念
12.1.1 分層驅(qū)動(dòng)程序的概念
12.1.2 設(shè)備堆棧與掛載
12.1.3 I/O堆棧
12.1.4 向下轉(zhuǎn)發(fā)IRP
12.1.5 掛載設(shè)備對(duì)象示例
12.1.6 轉(zhuǎn)發(fā)IRP示例
12.1.7 分析
12.1.8 遍歷設(shè)備棧
12.2 完成例程
12.2.1 完成例程概念
12.2.2 傳播Pending位
12.2.3 完成例程返回STATUS_SUCCESS
12.2.4 完成例程返回STATUS_MORE_PROCESSING_REQUIRED
12.3 將IRP分解成多個(gè)IRP
12.3.1 原理
12.3.2 準(zhǔn)備底層驅(qū)動(dòng)
12.3.3 讀派遣函數(shù)
12.3.4 完成例程
12.3.5 分析
12.4 WDM驅(qū)動(dòng)程序架構(gòu)
12.4.1 WDM與分層驅(qū)動(dòng)程序
12.4.2 WDM的加載方式
12.4.3 功能設(shè)備對(duì)象
12.4.4 物理設(shè)備對(duì)象
12.4.5 物理設(shè)備對(duì)象與即插即用
12.5 小結(jié)
第13章 讓設(shè)備實(shí)現(xiàn)即插即用
本章首先介紹即插即用的概念和驅(qū)動(dòng)程序支持即插即用功能的必要性。另外,本章還介紹如何利用WDM驅(qū)動(dòng)程序開(kāi)發(fā)框架設(shè)計(jì)支持即插即用功能的驅(qū)動(dòng)程序。
13.1 即插即用概念
13.1.1 歷史原因
13.1.2 即插即用的目標(biāo)
13.1.3 Windows中即插即用相關(guān)組件
13.1.4 遺留驅(qū)動(dòng)程序
13.2 即插即用IRP
13.2.1 即插即用IRP的功能代碼
13.2.2 處理即插即用IRP的派遣函數(shù)
13.3 通過(guò)設(shè)備接口尋找設(shè)備
13.3.1 設(shè)備接口
13.3.2 WDM驅(qū)動(dòng)中設(shè)置接口
13.3.3 應(yīng)用程序?qū)ふ医涌?
13.3.4 查看接口設(shè)備
13.4 啟動(dòng)和停止設(shè)備
13.4.1 為一個(gè)實(shí)際硬件安裝HelloWDM
13.4.2 啟動(dòng)設(shè)備
13.4.3 轉(zhuǎn)發(fā)并等待
13.4.4 獲得設(shè)備相關(guān)資源
13.4.5 枚舉設(shè)備資源
13.4.6 停止設(shè)備
13.5 即插即用的狀態(tài)轉(zhuǎn)換
13.5.1 狀態(tài)轉(zhuǎn)換圖
13.5.2 IRP_MN_QUERY_STOP_DEVICE
13.5.3 IRP_MN_QUERY_REMOVE_DEVICE
13.6 其他即插即用IRP
13.6.1 IRP_MN_FILTER_RESOURCE_REQUIREMENTS
13.6.2 IRP_MN_QUERY_CAPABILITIES
13.7 小結(jié)
第14章 電源管理
本章主要介紹了如何在WDM驅(qū)動(dòng)程序中進(jìn)行電源處理。電源處理主要是處理好電源狀態(tài)和設(shè)備狀態(tài)。
14.1 WDM電源管理模型
14.1.1 概述
14.1.2 熱插拔
14.1.3 電源狀態(tài)
14.1.4 設(shè)備狀態(tài)
14.1.5 狀態(tài)轉(zhuǎn)換
14.2 處理IRP_MJ_POWER
14.3 處理IRP_MN_QUERY_CAPABILITIES
14.3.1 DEVICE_CAPABILITIES
14.3.2 一個(gè)試驗(yàn)
14.4 小結(jié)
第3篇 實(shí)用篇
第15章 I/O端口操作
本章總結(jié)了多種I/O端口操作的方法。這些方法本質(zhì)上是一樣的,都是將端口輸入輸出的匯編指令運(yùn)行在內(nèi)核模式中。
15.1 概述
15.1.1 從DOS說(shuō)起
15.1.2 匯編實(shí)現(xiàn)
15.1.3 DDK實(shí)現(xiàn)
15.2 工具軟件WinIO
15.2.1 WinIO簡(jiǎn)介
15.2.2 使用方法
15.3 端口操作實(shí)現(xiàn)方法一
15.3.1 驅(qū)動(dòng)端程序
15.3.2 應(yīng)用程序端程序
15.4 端口操作實(shí)現(xiàn)方法二
15.4.1 驅(qū)動(dòng)端程序
15.4.2 應(yīng)用程序端程序
15.5 端口操作實(shí)現(xiàn)方法三
15.5.1 驅(qū)動(dòng)端程序
15.5.2 應(yīng)用程序端程序
15.6 端口操作實(shí)現(xiàn)方法四
15.6.1 原理
15.6.2 驅(qū)動(dòng)端程序
15.6.3 應(yīng)用程序端程序
15.7 驅(qū)動(dòng)PC喇叭
15.7.1 可編程定時(shí)器
15.7.2 PC喇叭
15.7.3 操作代碼
15.8 操作并口設(shè)備
15.8.1 并口設(shè)備簡(jiǎn)介
15.8.2 并口寄存器
15.8.3 并口設(shè)備操作
15.9 小結(jié)
第16章 PCI設(shè)備驅(qū)動(dòng)
本章主要介紹PCI設(shè)備的驅(qū)動(dòng)開(kāi)發(fā)。首先介紹了PCI總線協(xié)議。作為驅(qū)動(dòng)程序員,開(kāi)發(fā)PCI驅(qū)動(dòng)程序首先要了解PCI配置空間。根據(jù)讀取PCI配置空間,可以得到PCI設(shè)備的所有資源。另外,本章還總結(jié)了四種獲取PCI配置空間的方法。
16.1 PCI總線協(xié)議
16.1.1 PCI總線簡(jiǎn)介
16.1.2 PCI配置空間簡(jiǎn)介
16.2 訪問(wèn)PCI配置空間方法一
16.2.1 兩個(gè)重要寄存器
16.2.2 示例
16.3 訪問(wèn)PCI配置空間方法二
16.3.1 DDK函數(shù)讀取配置空間
16.3.2 示例
16.4 訪問(wèn)PCI配置空間方法三
16.4.1 通過(guò)即插即用IRP獲得PCI配置空間
16.4.2 示例
16.5 訪問(wèn)PCI配置空間方法四
16.5.1 創(chuàng)建IRP_MN_READ_CONFIG
16.5.2 示例
16.6 PCI設(shè)備驅(qū)動(dòng)開(kāi)發(fā)示例
16.6.1 開(kāi)發(fā)步驟
16.6.2 中斷操作
16.6.3 操作設(shè)備物理內(nèi)存
16.6.4 示例
16.7 小結(jié)
第17章 USB設(shè)備驅(qū)動(dòng)
本章首先介紹了USB總線協(xié)議的基本框架,其中包括USB總線的拓?fù)浣Y(jié)構(gòu),USB通信的流程,還有USB的四種傳輸模式。另外,本章介紹了如何編寫USB總線設(shè)備的驅(qū)動(dòng)程序。
17.1 USB總線協(xié)議
17.1.1 USB設(shè)備簡(jiǎn)介
17.1.2 USB連接拓?fù)浣Y(jié)構(gòu)
17.1.3 USB通信的流程
17.1.4 USB四種傳輸模式
17.2 Windows下的USB驅(qū)動(dòng)
17.2.1 觀察USB設(shè)備的工具
17.2.2 USB設(shè)備請(qǐng)求
17.2.3 設(shè)備描述符
17.2.4 配置描述符
17.2.5 接口描述符
17.2.6 端點(diǎn)描述符
17.3 USB驅(qū)動(dòng)開(kāi)發(fā)實(shí)例
17.3.1 功能驅(qū)動(dòng)與物理總線驅(qū)動(dòng)
17.3.2 構(gòu)造USB請(qǐng)求包
17.3.3 發(fā)送USB請(qǐng)求包
17.3.4 USB設(shè)備初始化
17.3.5 USB設(shè)備的插拔
17.3.6 USB設(shè)備的讀寫
17.4 小結(jié)
第18章 SDIO設(shè)備驅(qū)動(dòng)
本章首先介紹了SDIO協(xié)議,講述了SD內(nèi)存卡和SDIO卡的兼容問(wèn)題。然后介紹了SDIO協(xié)議中的發(fā)送命令、回應(yīng)命令、傳送數(shù)據(jù)等相關(guān)協(xié)議。隨后,本章又介紹了Windows中,DDK提供的對(duì)SDIO卡設(shè)備的支持。然后介紹了如何利用總線驅(qū)動(dòng),使SDIO設(shè)備初始化,接收中斷,發(fā)送和接收數(shù)據(jù)等操作。
18.1 SDIO協(xié)議
18.1.1 SD內(nèi)存卡概念
18.1.2 SDIO卡概念
18.1.3 SDIO總線
18.1.4 SDIO令牌
18.1.5 SDIO令牌格式
18.1.6 SDIO的寄存器
18.1.7 CMD52命令
18.1.8 CMD53命令
18.2 SDIO卡驅(qū)動(dòng)開(kāi)發(fā)框架
18.2.1 SDIO Host Controller驅(qū)動(dòng)
18.2.2 SDIO卡的初始化
18.2.3 中斷回調(diào)函數(shù)
18.2.4 獲得和設(shè)置屬性
18.2.5 CMD52
18.2.6 CMD53
18.3 SDIO開(kāi)發(fā)實(shí)例
18.4 小結(jié)
第19章 虛擬串口設(shè)備驅(qū)動(dòng)
本章介紹了串口開(kāi)發(fā)的框架模型,在串口的AddDevice例程中需要暴露出一個(gè)串口的符號(hào)連接,另外在相應(yīng)的注冊(cè)表中需要進(jìn)行設(shè)置。在串口與應(yīng)用程序的通信中,主要是一組DDK定義的IO控制碼,這些IO控制碼負(fù)責(zé)由應(yīng)用程序向驅(qū)動(dòng)發(fā)出請(qǐng)求。
19.1 串口簡(jiǎn)介
19.2 DDK串口開(kāi)發(fā)框架
19.2.1 串口驅(qū)動(dòng)的入口函數(shù)
19.2.2 應(yīng)用程序與串口驅(qū)動(dòng)的通信
19.2.3 寫的實(shí)現(xiàn)
19.2.4 讀的實(shí)現(xiàn)
19.3 小結(jié)
第20章 攝像頭設(shè)備驅(qū)動(dòng)程序
本章主要介紹了微軟提供的攝像頭驅(qū)動(dòng)框架。在該框架中,微軟提供了類驅(qū)動(dòng)和小驅(qū)動(dòng)的概念。對(duì)于驅(qū)動(dòng)程序員的任務(wù)就是編寫小驅(qū)動(dòng)程序。
20.1 WDM攝像頭驅(qū)動(dòng)框架
20.1.1 類驅(qū)動(dòng)與小驅(qū)動(dòng)
20.1.2 攝像頭的類驅(qū)動(dòng)與小驅(qū)動(dòng)
20.1.3 編寫小驅(qū)動(dòng)程序
20.1.4 小驅(qū)動(dòng)的流控制
20.2 虛擬攝像頭開(kāi)發(fā)實(shí)例
20.2.1 編譯和安裝
20.2.2 虛擬攝像頭入口函數(shù)
20.2.3 對(duì)STREAM_REQUEST_BLOCK的處理函數(shù)
20.2.4 打開(kāi)視頻流
20.2.5 對(duì)視頻流的讀取
20.3 小結(jié)
第4篇 提高篇
第21章 再論IRP
本章將相關(guān)IRP的操作做了進(jìn)一步的總結(jié)。首先是轉(zhuǎn)發(fā)IRP,歸納了幾種不同的方式。其次總結(jié)了創(chuàng)建IRP的幾種不同方法。創(chuàng)建IRP總的來(lái)說(shuō)分為創(chuàng)建同步IRP和創(chuàng)建異步IRP。對(duì)于創(chuàng)建同步IRP,操作比較簡(jiǎn)單,I/O管理器會(huì)負(fù)責(zé)回收IRP的相關(guān)內(nèi)存,但是使用不夠靈活。對(duì)于創(chuàng)建異步IRP,操作比較復(fù)雜,程序員需要自己負(fù)責(zé)對(duì)IRP及相關(guān)內(nèi)存回收,但使用十分靈活。
21.1 轉(zhuǎn)發(fā)IRP
21.1.1 直接轉(zhuǎn)發(fā)
21.1.2 轉(zhuǎn)發(fā)并且等待
21.1.3 轉(zhuǎn)發(fā)并且設(shè)置完成例程
21.1.4 暫時(shí)掛起當(dāng)前IRP
21.1.5 不轉(zhuǎn)發(fā)IRP
21.2 創(chuàng)建IRP
21.2.1 IoBuildDeviceIoControlRequest
21.2.2 創(chuàng)建有超時(shí)的IOCTL IRP
21.2.3 用IoBuildSynchronousFsdRequest創(chuàng)建IRP
21.2.4 關(guān)于IoBuildAsynchronousFsdRequest
21.2.5 關(guān)于IoAllocateIrp
21.3 小結(jié)
第22章 過(guò)濾驅(qū)動(dòng)程序
本章主要介紹WDM和NT式過(guò)濾驅(qū)動(dòng)程序開(kāi)發(fā)。過(guò)濾驅(qū)動(dòng)程序開(kāi)發(fā)十分靈活,可以修改已有驅(qū)動(dòng)程序的功能,也可以對(duì)數(shù)據(jù)進(jìn)行過(guò)濾加密。另外,利用過(guò)濾驅(qū)動(dòng)程序還能編寫出很多具有相當(dāng)功能強(qiáng)大的程序來(lái)。
 22.1 文件過(guò)濾驅(qū)動(dòng)程序
  22.1.1 過(guò)濾驅(qū)動(dòng)程序概念
  22.1.2 過(guò)濾驅(qū)動(dòng)程序的入口函數(shù)
  22.1.3 U盤過(guò)濾驅(qū)動(dòng)程序
  22.1.4 過(guò)濾驅(qū)動(dòng)程序加載方法一
  22.1.5 過(guò)濾驅(qū)動(dòng)程序加載方法二
  22.1.6 過(guò)濾驅(qū)動(dòng)程序的AddDevice例程
  22.1.7 磁盤命令過(guò)濾
 22.2 NT式過(guò)濾驅(qū)動(dòng)程序
  22.2.1 NT式過(guò)濾驅(qū)動(dòng)程序
  22.2.2 NT過(guò)濾驅(qū)動(dòng)的入口函數(shù)
  22.2.3 掛載過(guò)濾驅(qū)動(dòng)
  22.2.4 過(guò)濾鍵盤讀操作
 22.3 小結(jié)
第23章 高級(jí)調(diào)試技巧
本章將介紹一些Windows開(kāi)發(fā)驅(qū)動(dòng)的高級(jí)調(diào)試技巧。有一些高級(jí)驅(qū)動(dòng)程序調(diào)試技巧,可以幫助程序員找出驅(qū)動(dòng)程序中的Bug。另外,利用一些第三方工具軟件,也可以幫助程序員找到驅(qū)動(dòng)程序中的漏洞,從而提高開(kāi)發(fā)效率。
 23.1 一般性調(diào)試技巧
  23.1.1 打印調(diào)試信息
  23.1.2 存儲(chǔ)dump信息
  23.1.3 使用WinDbg調(diào)試工具
 23.2 高級(jí)內(nèi)核調(diào)試技巧
  23.2.1 安裝VMWare
  23.2.2 在虛擬機(jī)上加載驅(qū)動(dòng)程序
  23.2.3 VMWare和WinDbg聯(lián)合調(diào)試驅(qū)動(dòng)程序
 23.3 用IRPTrace調(diào)試驅(qū)動(dòng)程序
 23.4 小結(jié)

本目錄推薦

掃描二維碼
Copyright ? 讀書網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)