專利名稱:用于usb驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的制作方法
用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展
背景技術(shù):
計(jì)算機(jī)設(shè)備通常被實(shí)現(xiàn)來(lái)利用USB (通用串行總線),其中USB是用于在計(jì)算機(jī)設(shè)備和/或諸如計(jì)算機(jī)鼠標(biāo)、鍵盤、打印機(jī)、顯示設(shè)備、數(shù)字?jǐn)z像機(jī)等之類的外部外圍設(shè)備內(nèi)的數(shù)據(jù)通信或在計(jì)算機(jī)設(shè)備和/或外部外圍設(shè)備之間的數(shù)據(jù)通信的通信鏈路。計(jì)算機(jī)設(shè)備可以具有若干USB端口,其中外圍設(shè)備經(jīng)由這些USB端口利用USB電纜來(lái)連接。一般,與計(jì)算機(jī)設(shè)備相集成或連接到計(jì)算機(jī)設(shè)備的外圍設(shè)備具有相應(yīng)組合的發(fā)現(xiàn)、枚舉和與外圍設(shè)備通信的設(shè)備驅(qū)動(dòng)程序(driver),諸如以接收和/或傳送數(shù)據(jù)與指令。計(jì)算機(jī)設(shè)備實(shí)現(xiàn)暴露API (應(yīng)用程序接口)的USB核心驅(qū)動(dòng)程序棧,并且用于外圍設(shè)備的設(shè)備驅(qū)動(dòng)程序與API接口來(lái)請(qǐng)求處理器操作和/或數(shù)據(jù)交換
發(fā)明內(nèi)容
提供這個(gè)發(fā)明內(nèi)容部分來(lái)介紹下面在具體描述部分中進(jìn)一步描述的用于USB驅(qū)動(dòng)程序接口函數(shù)(function)(或接口功能)的擴(kuò)展的簡(jiǎn)化概念。這個(gè)發(fā)明內(nèi)容部分并不旨在標(biāo)識(shí)所請(qǐng)求保護(hù)的主題的基本特性,也不旨在用于確定所請(qǐng)求保護(hù)的主題的范圍。描述用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展。在實(shí)施例中,計(jì)算機(jī)指令和數(shù)據(jù)交換的輸入/輸出在USB核心驅(qū)動(dòng)程序棧(stack)中進(jìn)行管理。一組USB驅(qū)動(dòng)程序接口被USB核心驅(qū)動(dòng)程序棧暴露,并且USB驅(qū)動(dòng)程序接口包括與對(duì)應(yīng)于客戶端USB設(shè)備的USB客戶端函數(shù)(或功能)驅(qū)動(dòng)程序接口的USB驅(qū)動(dòng)程序接口函數(shù)。用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展也被USB核心驅(qū)動(dòng)程序棧暴露來(lái)與USB客戶端函數(shù)驅(qū)動(dòng)程序接口。在各種實(shí)施例中,用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展能夠被實(shí)現(xiàn)來(lái)將USB核心驅(qū)動(dòng)程序棧與遺留的、新的和未來(lái)版本的USB客戶端函數(shù)驅(qū)動(dòng)程序接口。在其它的實(shí)施例中,復(fù)合設(shè)備驅(qū)動(dòng)程序?qū)τ诳蛻舳薝SB設(shè)備的個(gè)別函數(shù)(或功能)注冊(cè)它自己。USB核心驅(qū)動(dòng)程序棧枚舉USB客戶端函數(shù)驅(qū)動(dòng)程序并生成函數(shù)句柄,其中每 一個(gè)函數(shù)句柄對(duì)應(yīng)于客戶端USB設(shè)備的個(gè)別函數(shù)。USB核心驅(qū)動(dòng)程序棧能夠隨后利用對(duì)應(yīng)于與USB客戶端函數(shù)驅(qū)動(dòng)程序相關(guān)聯(lián)的客戶端USB設(shè)備的個(gè)別函數(shù)的函數(shù)句柄來(lái)識(shí)別導(dǎo)致運(yùn)行失敗(runtime failure)的USB客戶端函數(shù)驅(qū)動(dòng)程序。復(fù)合設(shè)備驅(qū)動(dòng)程序還能夠通知USB核心驅(qū)動(dòng)程序棧復(fù)合設(shè)備驅(qū)動(dòng)程序?qū)⒖刂茣和?蛻舳薝SB設(shè)備的個(gè)別函數(shù)。在其它實(shí)施例中,USB核心驅(qū)動(dòng)程序棧能夠接收來(lái)自USB客戶端函數(shù)驅(qū)動(dòng)程序的能力版本請(qǐng)求,并返回USB核心驅(qū)動(dòng)程序棧支持用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的指示。USB核心驅(qū)動(dòng)程序棧還能夠經(jīng)由USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展從USB客戶端函數(shù)驅(qū)動(dòng)程序接收合同版本標(biāo)識(shí)符。合同版本標(biāo)識(shí)符指示USB客戶端函數(shù)驅(qū)動(dòng)程序利用來(lái)與USB核心驅(qū)動(dòng)程序棧接口的一組操作規(guī)則。此外,能夠?qū)嵤┫葯z查協(xié)議,其指導(dǎo)USB客戶端函數(shù)驅(qū)動(dòng)程序在經(jīng)由USB驅(qū)動(dòng)程序接口與USB核心驅(qū)動(dòng)程序棧接口之前檢查USB驅(qū)動(dòng)程序接口函數(shù)的可用性。在其它實(shí)施例中,USB核心驅(qū)動(dòng)程序棧包括USB主控制器,其支持存儲(chǔ)在幾乎不連續(xù)緩沖區(qū)中的緩沖數(shù)據(jù)。此外,USB核心驅(qū)動(dòng)程序棧能夠向端點(diǎn)分配多個(gè)數(shù)據(jù)流隊(duì)列用于輸入/輸出,并管理多個(gè)數(shù)據(jù)流隊(duì)列的輸入/輸出。
用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的實(shí)施例參考以下附圖來(lái)描述。貫穿這些附圖使用相同的數(shù)字來(lái)引用相似的特性和組件
圖I示出其中能夠?qū)崿F(xiàn)用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的實(shí)施例的示例系統(tǒng);
圖2示出根據(jù)一個(gè)或多個(gè)實(shí)施例的用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的(一種或多種)示例方法;
圖3示出根據(jù)一個(gè)或多個(gè)實(shí)施例的用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的(一種或多種)附加的示例方法;
圖4示出根據(jù)一個(gè)或多個(gè)實(shí)施例的用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的(一種或多種)附加的示例方法;
圖5示出根據(jù)一個(gè)或多個(gè)實(shí)施例的用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的(一種或多種)附加的示例方法;
圖6示出能夠?qū)崿F(xiàn)用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的實(shí)施例的示例設(shè)備的各種組件。
具體實(shí)施例方式實(shí)施例規(guī)定對(duì)于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展能夠被USB核心驅(qū)動(dòng)程序棧暴露,以提供新的能力并將USB核心驅(qū)動(dòng)程序棧與遺留的、新的和未來(lái)版本的USB客戶端函數(shù)驅(qū)動(dòng)程序接口。用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展提供但并不限于以下特性之中的任何一個(gè)或多個(gè)注冊(cè)和注銷用于客戶端USB設(shè)備的復(fù)合函數(shù)驅(qū)動(dòng)程序;設(shè)置用于包括多個(gè)函數(shù)的復(fù)合函數(shù)驅(qū)動(dòng)程序的USB函數(shù)句柄數(shù)據(jù);在USB客戶端函數(shù)驅(qū)動(dòng)程序和USB核心驅(qū)動(dòng)程序棧之間為了新的、當(dāng)前的和/或遺留的兼容性而協(xié)商USB接口版本;檢查USB棧能力實(shí)現(xiàn),以便在利用USB驅(qū)動(dòng)程序接口函數(shù)之前確定USB核心驅(qū)動(dòng)程序棧的能力;支持存儲(chǔ)在幾乎不連續(xù)緩沖區(qū)中的緩沖數(shù)據(jù);以及給端點(diǎn)分配多個(gè)數(shù)據(jù)流隊(duì)列,其中端點(diǎn)提供批量端點(diǎn)和將與端點(diǎn)相關(guān)聯(lián)的多個(gè)輸入/輸出隊(duì)列。雖然所描述的用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的系統(tǒng)和方法的特性和概念能夠在任何數(shù)量的不同的環(huán)境、系統(tǒng)和/或各種配置中進(jìn)行實(shí)現(xiàn),但是用于USB驅(qū)動(dòng)程序接口函數(shù)的實(shí)施例的擴(kuò)展在以下示例系統(tǒng)和環(huán)境的上下文中進(jìn)行描述。圖I示出其中能夠?qū)崿F(xiàn)用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的各種實(shí)施例的示例系統(tǒng)100。系統(tǒng)100包括代表在各種設(shè)備實(shí)現(xiàn)中的一個(gè)或多個(gè)USB核心驅(qū)動(dòng)程序棧的USB核心驅(qū)動(dòng)程序棧102 (例如,也被稱作USB棧)。USB核心驅(qū)動(dòng)程序棧102在計(jì)算機(jī)系統(tǒng)中、諸如在實(shí)現(xiàn)示例系統(tǒng)100的計(jì)算機(jī)設(shè)備中管理計(jì)算機(jī)指令和數(shù)據(jù)交換的輸入/輸出。在這個(gè)示例中,USB核心驅(qū)動(dòng)程序棧102包括各種組件,諸如主控制器驅(qū)動(dòng)程序(HCD) 104、USB主控制器驅(qū)動(dòng)程序庫(kù)106和USB集線器驅(qū)動(dòng)程序108。USB主控制器驅(qū)動(dòng)程序庫(kù)106被實(shí)現(xiàn)為對(duì)于所有的USB主控制器驅(qū)動(dòng)程序而言可以是常見的代碼來(lái)與其余的USB核心驅(qū)動(dòng)程序棧接口。此外,USB主控制器驅(qū)動(dòng)程序庫(kù)106也可以被稱作USB主控制器類擴(kuò)展(UCX)。示例系統(tǒng)100還包括USB客戶端函數(shù)驅(qū)動(dòng)程序110和在各種實(shí)施例中包括復(fù)合設(shè)備驅(qū)動(dòng)程序112。USB客戶端函數(shù)驅(qū)動(dòng)程序110對(duì)應(yīng)于一個(gè)或多個(gè)客戶端USB設(shè)備,并代表利用API來(lái)與USB核心驅(qū)動(dòng)程序棧102接口以便與相應(yīng)的客戶端USB設(shè)備交互的各種USB函數(shù)、類和/或客戶端驅(qū)動(dòng)程序之中的任何一個(gè)。USB核心驅(qū)動(dòng)程序棧102實(shí)現(xiàn)被USB核心驅(qū)動(dòng)程序棧暴露給USB客戶端函數(shù)驅(qū)動(dòng)程序110的一組USB驅(qū)動(dòng)程序接口(API)114。USB驅(qū)動(dòng)程序接口 114也被稱為DDI (Device Driver Interface)(設(shè)備驅(qū)動(dòng)程序接口)。USB核心驅(qū)動(dòng)程序棧102還暴露用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展116,并且這些擴(kuò)展被暴露來(lái)與USB客戶端函數(shù)驅(qū)動(dòng)程序110接口。在各種實(shí)施例中,復(fù)合設(shè)備驅(qū)動(dòng)程序112可以被實(shí)現(xiàn)為USB CCGP (Common ClassGeneric Parent)(常見類通用父),其暴露客戶端USB設(shè)備的獨(dú)立函數(shù),以致每一個(gè)獨(dú)立函數(shù)本身能被視為獨(dú)立設(shè)備。USB客戶端函數(shù)驅(qū)動(dòng)程序110與每個(gè)函數(shù)相關(guān)聯(lián)來(lái)在客戶端USB設(shè)備上驅(qū)動(dòng)對(duì)應(yīng)的函數(shù)(功能)。在一些實(shí)現(xiàn)中,復(fù)合設(shè)備驅(qū)動(dòng)程序112對(duì)于USB客戶端函數(shù)驅(qū)動(dòng)程序110可以是透明的,和/或輸入/輸出通過(guò)復(fù)合設(shè)備驅(qū)動(dòng)程序來(lái)路由傳送(route)。作為選擇,USB客戶端函數(shù)驅(qū)動(dòng)程序110能夠經(jīng)由USB驅(qū)動(dòng)程序接口 114和/或 經(jīng)由用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展116直接地與USB核心驅(qū)動(dòng)程序棧102接口。在各種實(shí)施例中,用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展116包括但不限于擴(kuò)展,以便注冊(cè)復(fù)合函數(shù)驅(qū)動(dòng)程序118,諸如復(fù)合USB客戶端函數(shù)驅(qū)動(dòng)程序;注銷復(fù)合函數(shù)驅(qū)動(dòng)程序120,諸如USB客戶端函數(shù)驅(qū)動(dòng)程序;諸如為包括多個(gè)函數(shù)的復(fù)合USB客戶端函數(shù)驅(qū)動(dòng)程序110設(shè)置USB函數(shù)句柄數(shù)據(jù)122 ;諸如為了在USB客戶端函數(shù)驅(qū)動(dòng)程序110和USB核心驅(qū)動(dòng)程序棧102之間新的、當(dāng)前的和/或遺留的兼容性而協(xié)商USB接口版本124 ;檢查USB棧能力實(shí)現(xiàn)126,諸如以便在利用USB驅(qū)動(dòng)程序接口函數(shù)之前確定USB核驅(qū)動(dòng)程序棧102的能力;支持用于存儲(chǔ)在幾乎不連續(xù)緩沖區(qū)中的緩沖數(shù)據(jù)的實(shí)現(xiàn)128 ;以及分配多個(gè)數(shù)據(jù)流隊(duì)列給端點(diǎn)130,該端點(diǎn)提供批量端點(diǎn)和將與端點(diǎn)相關(guān)聯(lián)的多個(gè)輸入/輸出隊(duì)列。諸如USB核心驅(qū)動(dòng)程序棧102、USB客戶端函數(shù)驅(qū)動(dòng)程序110、復(fù)合設(shè)備驅(qū)動(dòng)程序112、USB驅(qū)動(dòng)程序接口 114和用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展116之類的示例系統(tǒng)100的各種組件能夠被實(shí)現(xiàn)為計(jì)算機(jī)可執(zhí)行指令,并由一個(gè)或多個(gè)處理器來(lái)執(zhí)行,以實(shí)現(xiàn)此處描述的各種實(shí)施例和/或特性。此外,示例系統(tǒng)100能夠利用如參考圖6所示的示例設(shè)備進(jìn)一步描述的任何數(shù)量和組合的不同組件來(lái)實(shí)現(xiàn)。在實(shí)施例中,生成函數(shù)句柄,以致USB核心驅(qū)動(dòng)程序棧102能夠識(shí)別從哪個(gè)USB客戶端函數(shù)驅(qū)動(dòng)程序Iio接收到特定請(qǐng)求,并實(shí)施和追蹤對(duì)于USB客戶端函數(shù)驅(qū)動(dòng)程序而言特定的行為。復(fù)合設(shè)備驅(qū)動(dòng)程序112被實(shí)現(xiàn)來(lái)區(qū)分客戶端USB設(shè)備的單獨(dú)函數(shù),以致單獨(dú)的USB客戶端函數(shù)驅(qū)動(dòng)程序110能夠與每個(gè)單獨(dú)函數(shù)相關(guān)聯(lián)。函數(shù)句柄給USB核心驅(qū)動(dòng)程序棧102提供每一個(gè)單獨(dú)的USB客戶端函數(shù)驅(qū)動(dòng)程序110的標(biāo)識(shí),其在實(shí)現(xiàn)中利用存儲(chǔ)器中的物理設(shè)備對(duì)象(PDO)來(lái)表示。函數(shù)句柄則代表設(shè)備對(duì)象,并且信息能夠與函數(shù)句柄相關(guān)聯(lián),諸如驅(qū)動(dòng)程序名稱。在實(shí)現(xiàn)中,USB核心驅(qū)動(dòng)程序棧102能夠識(shí)別導(dǎo)致運(yùn)行失敗或其他系統(tǒng)崩潰的USB客戶端函數(shù)驅(qū)動(dòng)程序110。在當(dāng)前實(shí)現(xiàn)中,用于USB device handle (USB設(shè)備句柄)的參數(shù)在特定請(qǐng)求沿著USB棧進(jìn)行發(fā)送之前由USB集線器來(lái)分配。這在從利用USB device handle識(shí)別的同一 USB驅(qū)動(dòng)程序接收輸入/輸出請(qǐng)求時(shí)提供單個(gè)功能設(shè)備的標(biāo)識(shí)。然而,對(duì)于復(fù)合起作用設(shè)備,USB device handle隨后與復(fù)合設(shè)備驅(qū)動(dòng)程序112 (例如,在一些實(shí)現(xiàn)中的USB CCGP)相關(guān)聯(lián),并且負(fù)責(zé)特定輸入/輸出請(qǐng)求的USB客戶端函數(shù)驅(qū)動(dòng)程序110對(duì)于USB核心驅(qū)動(dòng)程序棧而言不是可識(shí)別的。因此,實(shí)現(xiàn)用于USB function handle (函數(shù)句柄)的參數(shù),并且為每個(gè)函數(shù)或函數(shù)的表示諸如在一種實(shí)現(xiàn)中利用復(fù)合設(shè)備驅(qū)動(dòng)程序112創(chuàng)建的物理設(shè)備對(duì)象(PDO)生成句柄。對(duì)于接口和/或USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展之中的任何一個(gè)而言,這種注冊(cè)機(jī)制也能夠?qū)崿F(xiàn)合同、版本控制、驗(yàn)證和其它特性。當(dāng)復(fù)合設(shè)備驅(qū)動(dòng)程序112確定許多驅(qū)動(dòng)程序函數(shù)時(shí),它對(duì)于每個(gè)函數(shù)請(qǐng)求函數(shù)句柄。這些句柄隨后能夠利用USB核心驅(qū)動(dòng)程序棧102來(lái)生成,并且復(fù)合設(shè)備驅(qū)動(dòng)程序112能夠在沿著USB棧進(jìn)行傳送時(shí)利用相應(yīng)的函數(shù)句柄來(lái)填充(populate)對(duì)于USB客戶端函數(shù)驅(qū)動(dòng)程序110的每一個(gè)輸入/輸出請(qǐng)求。
用于注冊(cè)復(fù)合驅(qū)動(dòng)程序的USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展是IOCTL_INTERNAL_USB_REGISTER_C0MP0SITE_DRIVER 這個(gè)IOCTL (例如,一般被稱為用于各種不同的操作系統(tǒng)實(shí)現(xiàn)的設(shè)備輸入/輸出控制)在作出有關(guān)復(fù)合驅(qū)動(dòng)程序的驅(qū)動(dòng)程序函數(shù)的數(shù)量的確定之后利用復(fù)合設(shè)備驅(qū)動(dòng)程序112 (例如,USB CCGP或等效的驅(qū)動(dòng)程序)來(lái)發(fā)送。這個(gè)IOCTL定義的示例是
(W C fl nc IOC TL......IN Ti= R ΝΛ L—U SB— R KCi ISTE R —— CiiMftJSI THDRiV ER '.
ΓΠ.—C'CHM: iFlLK—DfiVΚ. —USB. \
USU—RKtrfSTf iCuMiivsrrLDimTR,·.
MEfHOD—Neitiifr,\
F ilf·.....Any.....Aii'T-ssiUSB客戶端函數(shù)驅(qū)動(dòng)程序110為這個(gè)IOCTL傳遞兩個(gè)參數(shù),一個(gè)參數(shù)用于輸入,以及一個(gè)參數(shù)用于輸出。輸入?yún)?shù)是調(diào)用者分配和初始化的USB_C0MP0SITE_REGISTRATION結(jié)構(gòu)。輸出參數(shù)是調(diào)用者分配的USBD_FUNCTIONJiANDLE的數(shù)組,其大小利用 USB_C0MP0SITE_REGISTRATI0N 結(jié)構(gòu)的 FuncionCount 字段來(lái)確定。USB_C0MP0SITE_REGISTRATION結(jié)構(gòu)的示例是
(ypedcf striKi USB^C'i>mi*osite^Rk#isira'UON IIfSiiiiRT Version;
ItjRT Size;
IfU)HijC pibilify ΨIugs:
I: LO N CiF mi c t ionC'oi 11;
} USB—OMPOsiTE—RFiiiSTRAIIi j^.*PUSB—Com n jsitf ____ Re *istr atiok :Version (版本)字段是結(jié)構(gòu)的版本并能夠用于未來(lái)可擴(kuò)展性。Size (大小)字段是以字節(jié)為單位的結(jié)構(gòu)USB_C0MP0SITE_REGISTRATI0N的大小并能夠用于結(jié)構(gòu)版本控制。CapabilityFlags (能力標(biāo)志)字段用于復(fù)合驅(qū)動(dòng)程序識(shí)別其支持的能力,諸如用于CompositeCapabiIityFunctionSuspend的定義能力。FunctionCount (函數(shù)計(jì)數(shù))字段識(shí)別驅(qū)動(dòng)程序函數(shù)的數(shù)量,并且在一種實(shí)現(xiàn)中它與復(fù)合驅(qū)動(dòng)程序?qū)?chuàng)建的roo的數(shù)量相關(guān)。如果客戶端驅(qū)動(dòng)程序結(jié)束這個(gè)IOCTL而沒有首先確定支持USB接口版本支持它,IOCTL 將以錯(cuò)誤狀態(tài)諸如 STATUS_INVALID_PARAMETER、STATUS_INVALID_DEVICE_REQUEST或其它這樣的表示錯(cuò)誤的狀態(tài)來(lái)結(jié)束。如果IOCTL成功完成,則在輸出參數(shù)中返回的函數(shù)句柄全部是有效的。如果客戶端驅(qū)動(dòng)程序不止一次發(fā)送這個(gè)IOCTL,完成代碼將是STATUS_INVALID_DEVICE_REQUEST或其它這樣的表示錯(cuò)誤的狀態(tài)。如果Size字段大于USB棧所支持的任何大小,則該請(qǐng)求將以STATUS_LENGTH_INFO_MISMATCH結(jié)束并且Size字段將被更新到USB核心驅(qū)動(dòng)程序棧所支持的最大大小。下面是能夠被利用來(lái)初始化USB_C0MP0SITE_REGISTRATI0N結(jié)構(gòu)的示例函數(shù)。
Usb Build Compos I Ic Registration (
i 11 11 Li )NC Capabi [ity I' I ags,
.........in ULONCiFiinctionComil.
οι PLiSB Composite ^ Rechstratiom Composite R eg is I rat ion,
)
I
I
RiI Zero MemoryRcginiraiion,
>UC of( USURHHSTRATIO^):tromposile RegisinUkmWei^ion - 0x0100:
Composite RcgLstralioii--Sizc -. mzc of (USB Composjti* ReciIstration); i'omposilc Rcg is t ra I ion ->C 'np<i bili Iy F fags : CapabilifyHags;
Composite Rcgktraiicm- ^FimctioiiCouni = functionCount;
I復(fù)合設(shè)備驅(qū)動(dòng)程序112能夠?qū)⑦@個(gè)IOCTL發(fā)送到USB核心驅(qū)動(dòng)程序棧102,以便為這些函數(shù)或這些函數(shù)的表示諸如PDO之中的每一個(gè)檢索函數(shù)句柄,。在執(zhí)行版本交換和確定函數(shù)的數(shù)量之后,復(fù)合設(shè)備驅(qū)動(dòng)程序沿著USB棧發(fā)送這個(gè)I0CTL。當(dāng)復(fù)合設(shè)備驅(qū)動(dòng)程序檢索到函數(shù)句柄時(shí),它能夠隨后將這些函數(shù)句柄添加到從相應(yīng)的USB客戶端函數(shù)驅(qū)動(dòng)程序沿著USB棧行進(jìn)的所有請(qǐng)求。當(dāng)USB集線器驅(qū)動(dòng)程序108接收到這個(gè)IOCTL時(shí),它能夠首先執(zhí)行參數(shù)確認(rèn),其包括確定客戶端驅(qū)動(dòng)程序是否已注冊(cè)了它自己。假設(shè)IOCTL的輸入緩沖區(qū)是良好的,USB集線器驅(qū)動(dòng)程序能夠登記或保存復(fù)合驅(qū)動(dòng)程序與特定函數(shù)相關(guān)以及能力是什么。它能夠隨后沿著USB棧轉(zhuǎn)發(fā)該請(qǐng)求。當(dāng)請(qǐng)求正在完成備份USB棧時(shí),集線器驅(qū)動(dòng)程序能夠緩存函數(shù)句柄來(lái)保持與特定驅(qū)動(dòng)程序的兼容性。在實(shí)現(xiàn)中,函數(shù)句柄可以是真正的指針,并且集線器驅(qū)動(dòng)程序執(zhí)行所有函數(shù)句柄的查找來(lái)確定哪個(gè)函數(shù)與哪個(gè)句柄相關(guān)聯(lián)。然而,如果函數(shù)句柄是索引(或被轉(zhuǎn)換成一個(gè)),則它能夠使用那個(gè)來(lái)索引到數(shù)組,或可以被實(shí)現(xiàn)來(lái)與索引一起使用的其它結(jié)構(gòu),諸如虛擬地址,其中值是索引到該值的各種偏移形式的多個(gè)索引。用于注銷復(fù)合驅(qū)動(dòng)程序的USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展是IOCTL_INTERNAL_USB_UNREGISTER_C0MP0SITE_DRIVER 這個(gè) IOCTL 是如上所述的 IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DRIVER (注冊(cè) IOCTL)的相反(opposite),并且被用來(lái)清除(clear-up)函數(shù)句柄。這個(gè)IOCTL定義的示例是Mcfinc IOCTL.....Internal.....USB.....IJNiKiisTER^C'nMPOsiTE.... Driver
ox—CodeiFile—I>e\'ick JJSB, \
USU_IIRECiISTCRmW.WITFmuDRIVKR,.....
MFrmm^NfATiiFM.'-
FiLrt^AiNYjUvFSs)沒有利用USB客戶端函數(shù)驅(qū)動(dòng)程序110為這個(gè)IOCTL提供的參數(shù)。如果客戶端驅(qū)動(dòng)程序傳送這個(gè)IOCTL而沒有首先完成IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_ DRIVER 請(qǐng)求,IOCTL 將利用錯(cuò)誤狀態(tài)諸如 STATUS_INVALID_PARAMETER、STATUS_INVALID_DEVICE_REQUEST或其它這樣的表示錯(cuò)誤的狀態(tài)來(lái)結(jié)束。復(fù)合設(shè)備驅(qū)動(dòng)程序112能夠發(fā)送這個(gè)IOCTL來(lái)關(guān)閉以前打開的任何函數(shù)句柄,并且在實(shí)現(xiàn)中,這個(gè)操作能夠在ReleaseHardware Γ釋欲絕今」中被執(zhí)行。當(dāng)USB集線器驅(qū)動(dòng)程序108接收到這個(gè)IOCTL時(shí),它能夠首先執(zhí)行參數(shù)確認(rèn),包括確定客戶端驅(qū)動(dòng)程序是否已注冊(cè)了它自己。假設(shè)該IOCTL是良好的,USB集線器驅(qū)動(dòng)程序能夠登記或保存復(fù)合驅(qū)動(dòng)程序已注銷了它自己并將清除任何相關(guān)狀態(tài)。它能夠隨后沿著USB棧轉(zhuǎn)發(fā)該請(qǐng)求。USB集線器驅(qū)動(dòng)程序也能夠釋放(free)表示這些函數(shù)的結(jié)構(gòu)數(shù)組,如果實(shí)現(xiàn)了的話。用于設(shè)置USB函數(shù)句柄數(shù)據(jù)的USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展是IOCTL_INTERNAL_USB_SET_FUNCT10N_HANDLE_DATA 這個(gè)IOCTL在完成復(fù)合驅(qū)動(dòng)程序注冊(cè)之后利用復(fù)合設(shè)備驅(qū)動(dòng)程序112來(lái)發(fā)送。這個(gè)IOCTL定義的示例是
define IOCTL^ Iktfrmal ...USB.....Sft.....Fi i NtrTK >n ... Handle^ Dat^ ··.
Cll-C(M)K (Fiij^De\ic-e^USB.
U SB— Rf,Cil STF R—Co M Pt WITH......D RIV H R, ·.
!\# TlIHi ·
Fill·:—ΛΝΥ—AtrHSSi為了這個(gè)IOCTL而暴露給USB客戶端函數(shù)驅(qū)動(dòng)程序的輸入?yún)?shù)是調(diào)用者分配和初始化的 USB_FUNCTION_DATA 結(jié)構(gòu)。示例 USB_FUNCTION_DATA 結(jié)構(gòu)是
iypedef siruci USB Funttion Data
iJSHHRTVersion;
USiioiiTSim:
USBD Functrjm JUw)Li: ΙΛΙχΙ Fimcikw Haiidie:
Pwi-xii R...—OBJa.TPhysicaIDtn iccObjccl;
I U S13—FuMttkw—Data. * P USB^Fwo+n')n— Data ;Version字段是結(jié)構(gòu)的版本并能夠用于未來(lái)可擴(kuò)展性。Size字段是以字節(jié)為單位的結(jié)構(gòu)USB_FUNCTI0N_DATA的大小并能夠用于結(jié)構(gòu)版本控制。UsbdFunctionHandle是在 I0CTL_INTERNAL_USB_REGISTER_C0MP0SITE_DRIVER 請(qǐng)求中以前檢索到的函數(shù)句柄。PhysicalDeviceObject是由復(fù)合設(shè)備驅(qū)動(dòng)程序?yàn)榕c特定的函數(shù)句柄相關(guān)聯(lián)的函數(shù)創(chuàng)建的物理設(shè)備對(duì)象。如果客戶端驅(qū)動(dòng)程序發(fā)送這個(gè)IOCTL而沒有首先成功檢索函數(shù)句柄,IOCTL將以錯(cuò)誤狀態(tài)諸如 STATUS_INVALID_PARAMETER、STATUS_INVALID_DEVICE_REQUEST 或其它這樣的表示錯(cuò)誤的狀態(tài)結(jié)束。如果Size字段大于USB棧所支持的任何大小,則該請(qǐng)求將利用STATUS_LENGTH_INFO_MISMATCH結(jié)束,并且Size字段將被更新到USB核心驅(qū)動(dòng)程序棧所支持的最大值。
下面是能夠被利用來(lái)初始化USB_FUNCTION_DATA結(jié)構(gòu)的示例函數(shù)。
I: sb Bh i Id F u nci k’n Da ta !
in l;SBD FuNtTRJN HANfJiii U slid F uiict ton H ami I c,
_in P()E\'ni:_0rui-cTPhysicalDcviceObJiXt.
..........out Plf-SB.. FlrNtTION Jl- ,ΤΑ FutictionData,
)
I
I
Rll Zero Memory | Fun cl ion Dnlaf hric of (USB___f υΝ *τ )Ν____θΛ Λ):
FiiiiciiciiiDaiii ;>Verskm ^ 0x0100;
funciioiiDaia ^>Smc - sr/—eofiUSB___fiik:c;thin___Data}
f yiictioiiDaia - -"U Φ F u nc I i on 11 b n d I c = L-sWFufictianHancIIe:
FuncfioiiDafa >PhysicaIDcviccObjccI = PliysicatDcviccObjcct;
復(fù)合設(shè)備驅(qū)動(dòng)程序112能夠發(fā)送這個(gè)I0CTL,以便將與設(shè)備對(duì)象相關(guān)聯(lián)的函數(shù)通知其余的USB核心驅(qū)動(dòng)程序棧102。這能夠被USB棧用于診斷目的。當(dāng)USB集線器驅(qū)動(dòng)程序108接收這個(gè)IOCTL時(shí),它能夠首先執(zhí)行參數(shù)確認(rèn),包括確定客戶端驅(qū)動(dòng)程序是否已注冊(cè)了它自己。假設(shè)針對(duì)這個(gè)IOCTL的輸入?yún)?shù)是良好的,USB集線器驅(qū)動(dòng)程序能夠在結(jié)構(gòu)中保存PDO并將它與函數(shù)句柄相關(guān)聯(lián)。在各種實(shí)施例中,USB核心驅(qū)動(dòng)程序棧102被實(shí)現(xiàn)來(lái)經(jīng)由USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展從USB客戶端函數(shù)驅(qū)動(dòng)程序110接收合同版本標(biāo)識(shí)符。合同版本標(biāo)識(shí)符指示USB客戶端函數(shù)驅(qū)動(dòng)程序利用來(lái)與USB核心驅(qū)動(dòng)程序棧接口的一組操作規(guī)則,其中USB核心驅(qū)動(dòng)程序棧使用合同版本標(biāo)識(shí)符來(lái)保持與遺留的或以前版本的客戶端驅(qū)動(dòng)程序的兼容性。在實(shí)現(xiàn)中,客戶端驅(qū)動(dòng)程序能夠確定在被裝載到不支持用于USB驅(qū)動(dòng)程序接口的擴(kuò)展的USB棧上時(shí)如何運(yùn)行。USB客戶端函數(shù)驅(qū)動(dòng)程序110能夠向USB核心驅(qū)動(dòng)程序棧查詢,以確定USB棧是否支持用于USB驅(qū)動(dòng)程序接口(API)114的擴(kuò)展116。IOCTL能夠被實(shí)現(xiàn)來(lái)與USB核心驅(qū)動(dòng)程序棧102協(xié)商特定的接口版本。這允許客戶端驅(qū)動(dòng)程序確定該棧支持什么特性,以及允許該棧實(shí)施特定的接口合同。此外,這些接口能夠是向后兼容的,并且利用來(lái)建立和測(cè)試客戶端驅(qū)動(dòng)程序的API版本能夠被確定。這允許接口升級(jí),同時(shí)能夠減輕遺留的兼容性問(wèn)題?,F(xiàn)有的USB版本信息能夠經(jīng)由GetUSBDIVersion函數(shù)調(diào)用來(lái)檢索。能夠添加標(biāo)志符來(lái)針對(duì)給定操作系統(tǒng)區(qū)分遺留的USB棧和新的USB棧。用于USB驅(qū)動(dòng)程序接口函數(shù)的獲得和/或協(xié)商USB接口版本的擴(kuò)展的示例實(shí)現(xiàn)是 I0CTL_INTERNAL_USB_NEG0TIATE_INTERFACE_VERSI0N。作為選擇,不同的機(jī)制能夠被實(shí)現(xiàn)用于USB客戶端函數(shù)驅(qū)動(dòng)程序來(lái)確定USB核心驅(qū)動(dòng)程序棧是否支持新的接口。這在指定能夠包括合同版本的客戶端驅(qū)動(dòng)程序的合適的接口結(jié)構(gòu)時(shí)能夠通過(guò)IRP_MN_QUERY_INTERFACE 來(lái)實(shí)現(xiàn)。USB客戶端函數(shù)驅(qū)動(dòng)程序110能夠被要求來(lái)在沿著USB核心驅(qū)動(dòng)程序棧發(fā)出任何URB或其它IOCTL之前但在將IRP_MN_START_DEVICE向下傳遞到其物理設(shè)備對(duì)象并且使得開始請(qǐng)求成功完成返回到客戶端驅(qū)動(dòng)程序之后發(fā)出I0CTL。在實(shí)現(xiàn)中,這個(gè)IOCTL是在客戶端驅(qū)動(dòng)程序的EvtDevicePrepareHardware例程(如果基于KMDF的話)或IRP_MN_START_DEVICE完成例程(如果基于WDM的話)內(nèi)執(zhí)行的第一操作。如果客戶端沒有在發(fā)出任何URB之前發(fā)出這個(gè)I0CTL,則能夠假設(shè)它是與遺留的USB接口兼容的。如果客戶端驅(qū)動(dòng)程序的兼容接口版本是在引入新特性之前的較低版本,則客戶端驅(qū)動(dòng)程序訪問(wèn)新的USB接口特性的試圖將失敗。這能夠被利用來(lái)要求(enforce):客戶端驅(qū)動(dòng)程序發(fā)送準(zhǔn)確的版本信息。這個(gè)IOCTL定義的示例是
#definc 10CTL....INTERMAL ...I—丁L4TE JivrRRirAfE ..VrERSIiJN ·:
CTL———i—Code IFiLE———_Device ___ USB,'
USB^ Ext 11A NC iE 一 V ERSK SN,'
Mtn .I U—N FJTIiKR,+++
FlLfi.....Any.....Aixfss.)被暴露給客戶端驅(qū)動(dòng)程序的針對(duì)這個(gè)IOCTL的輸入?yún)?shù)是利用客戶端驅(qū)動(dòng)程序分配和初始化的 USB_EXTENDED_VERSI0N_INF0RMATI0N 結(jié)構(gòu)。示例的 USB_EXTENDED_VERSI0N_INF0RMATI0N 結(jié)構(gòu)是
typedef si met USB... Extended.....V ER s mn ____ IN R >r \ λτιον ; vsmmj Vcmmi:
USIIORTSize;
ULONCrUSBlnicrfaccVcrs.jt)ri:
Pvoh)Usbd Dcvicc Hnndlc;
iiPljSBt EXTFNDKr\Vfrsr<Jnformatk^;Version字段是結(jié)構(gòu)的版本并能夠用于未來(lái)可擴(kuò)展性??蛻舳蓑?qū)動(dòng)程序在沿著USB棧傳送IOCTL之前提供該版本。注意這與通過(guò)GetUSBDIVersion API返回的USBDIVersion是不同的。Size字段是以字節(jié)為單位的結(jié)構(gòu)的大小并能夠在將來(lái)用于擴(kuò)展該結(jié)構(gòu)??蛻舳蓑?qū)動(dòng)程序在沿著USB棧傳送IOCTL之前提供該大小。USBInterfaceVersion是客戶端驅(qū)動(dòng)程序想要使用的接口合同的版本號(hào)??蛻舳蓑?qū)動(dòng)程序在沿著USB棧傳送IOCTL之前提供這個(gè)版本。UsbdDeviceHandle被保留以便被核心棧(core stack)使用(并且不被客戶端驅(qū)動(dòng)程序使用)。如果客戶端驅(qū)動(dòng)程序向遺留棧發(fā)送這個(gè)I0CTL,它將利用在IRP被發(fā)送時(shí)設(shè)置的相同狀態(tài)來(lái)結(jié)束。客戶端驅(qū)動(dòng)程序能夠在發(fā)送IRP之前初始化除了 STATUS_SUCCESS以外的狀態(tài)。如果IOCTL成功完成的話,則USB核心驅(qū)動(dòng)程序棧曾支持請(qǐng)求的接口版本并且現(xiàn)在能夠?qū)嵤┽槍?duì)那個(gè)版本的合同。如果客戶端驅(qū)動(dòng)程序不止一次發(fā)送這個(gè)I0CTL,或在另一個(gè)IOCTL或URB之后發(fā)送它,則完成代碼將是STATUS_INVALID_DEVICE_REQUEST或指示錯(cuò)誤的其它這樣的狀態(tài)。在實(shí)現(xiàn)中,如果遺留的復(fù)合設(shè)備驅(qū)動(dòng)程序(例如,在實(shí)現(xiàn)中的USB CCGP)被裝載到較新版本USB棧上,其中較新版本USB驅(qū)動(dòng)程序被裝載為其孩子,這種情景能夠發(fā)生并且遺留兼容性被保持,在這種情況下,與那個(gè)行為一致的錯(cuò)誤代碼被返回。作為選擇,如果對(duì)于USB客戶端函數(shù)驅(qū)動(dòng)程序使用不同的機(jī)制來(lái)諸如通過(guò)IRP_MN_QUERY_INTERFACE確定是否USB核心驅(qū)動(dòng)程序棧支持新的接口,這可能不被實(shí)現(xiàn)。如果Size字段大于USB棧的任何支持大小,則該請(qǐng)求將以STATUS_LENGTH_INFO_MIMATCH結(jié)束,并且Size字段將被更新到USB核心驅(qū)動(dòng)程序棧所支持的最大值。如果USBInterfaceVersion不被USB核心驅(qū)動(dòng)程序棧支持,則IRP能夠利用在發(fā)送它時(shí)在IRP中的相同狀態(tài)來(lái)結(jié)束。下面是能夠被利用來(lái)初始化USB_EXTENDED_VERSI0N_INF0RMATI0N結(jié)構(gòu)的示例函數(shù)。
U^l^iikIVersioiiljiforiBaiion(
—in ιηΛ)Κ( hiiertace Vension,
—...oul PU SB _Εχ νοει\. VERSiON.....lNFORMAirciK Version In forma I ion,
RfIZcroMcSiiorji (Vcmkm Informalkm
ie of (USB.....Eximm-n......Vfrsiom_Jhfurmation);
Verdcni]_itbrmalbii -> Vemon (W)咖
Vt'rs ion I iiforrmilioi!->Sizc =
of<USB__ tXTENDFD.....Inrw μλτ ομ
Vcrsioiilitfonnai ion ->InrcrfhccVersion 二 InIcrtaccVcr^ion;
I復(fù)合設(shè)備驅(qū)動(dòng)程序112是用于復(fù)合設(shè)備的函數(shù)驅(qū)動(dòng)程序,并因此具有兩個(gè)針對(duì)這個(gè)IOCTL的職責(zé)。作為函數(shù)驅(qū)動(dòng)程序,復(fù)合設(shè)備驅(qū)動(dòng)程序傳送I0CTL,而作為數(shù)據(jù)總線驅(qū)動(dòng)程序,復(fù)合設(shè)備驅(qū)動(dòng)程序處理I0CTL。在復(fù)合設(shè)備驅(qū)動(dòng)程序沿著USB棧傳遞第一 IRP_MN_START_DEVICE并且它已完成返回到驅(qū)動(dòng)程序(如果它是WDM的話)之后或在EvtDevicePrepareHardware回調(diào)(callback)內(nèi)(如果它是KMDF的話),第一操作將是發(fā)送這個(gè)版本IOCTL。復(fù)合設(shè)備驅(qū)動(dòng)程序112也能夠被實(shí)現(xiàn)來(lái)確認(rèn)USB核心驅(qū)動(dòng)程序棧版本號(hào)與已利用來(lái)測(cè)試復(fù)合設(shè)備驅(qū)動(dòng)程序的版本號(hào)相同,而否則的話,失敗啟動(dòng),因?yàn)檫@將指示棧內(nèi)(intra-stack) 二進(jìn)制版本不匹配。作為數(shù)據(jù)總線驅(qū)動(dòng)程序,復(fù)合設(shè)備驅(qū)動(dòng)程序接收這個(gè)IOCTL并填充UsbdFunctionHandle,以致較低棧知道這個(gè)請(qǐng)求與哪個(gè)特定函數(shù)相關(guān)聯(lián)。如 果復(fù)合設(shè)備驅(qū)動(dòng)程序在接收這個(gè)IOCTL之前接收任何其它URB,它能夠假定客戶端的接口版本是遺留版本。如果復(fù)合設(shè)備驅(qū)動(dòng)程序在任何其它URB或IOCTL (除了不成功的接口協(xié)商IOCTL之外)之后接收這個(gè)I0CTL,它將使該IOCTL失敗。如果客戶端驅(qū)動(dòng)程序支持的版本號(hào)大于USB棧所支持的版本號(hào),復(fù)合設(shè)備驅(qū)動(dòng)程序能夠使該請(qǐng)求失敗。如果該版本被復(fù)合設(shè)備驅(qū)動(dòng)程序所支持,它能夠沿著USB棧轉(zhuǎn)發(fā)該請(qǐng)求,并且如果該請(qǐng)求成功完成的話,復(fù)合設(shè)備驅(qū)動(dòng)程序能夠保存該版本號(hào)并使用那個(gè)(版本號(hào))來(lái)實(shí)施行為。USB集線器驅(qū)動(dòng)程序108也具有版本控制的職責(zé)。當(dāng)集線器驅(qū)動(dòng)程序接收這個(gè)IOCTL時(shí),它能夠填充USBDeviceHandle字段,以致較低USB棧知道這個(gè)版本信息是用于哪個(gè)設(shè)備的。如果USB集線器驅(qū)動(dòng)程序在接收這個(gè)IOCTL之前接收任何其它URB,它能夠假定客戶端驅(qū)動(dòng)程序的接口版本是遺留版本。如果集線器驅(qū)動(dòng)程序在任何其它URB或IOCTL(除了不成功的接口協(xié)商IOCTL之外)之后接收這個(gè)I0CTL,它將使該IOCTL失敗。如果該接口不被集線器驅(qū)動(dòng)程序所支持,它將使該IOCTL失敗。如果該接口被集線器驅(qū)動(dòng)程序所支持,它能夠轉(zhuǎn)發(fā)該請(qǐng)求到根集線器roo,以便USB主控制器驅(qū)動(dòng)程序來(lái)處理。一旦完成,并且如果該請(qǐng)求是成功的話,集線器驅(qū)動(dòng)程序能夠保存客戶端驅(qū)動(dòng)程序的版本信息并使用它來(lái)實(shí)施行為。類擴(kuò)展能夠在根集線器PDO上接收IOCTL。如果版本號(hào)為類擴(kuò)展(和控制器驅(qū)動(dòng)程序)所支持,它將在USB Device對(duì)象中保存客戶端驅(qū)動(dòng)程序的版本信息。它也將把該客戶 端驅(qū)動(dòng)程序的版本信息通知主控制器驅(qū)動(dòng)程序。類擴(kuò)展隨后能夠填充該數(shù)據(jù)結(jié)構(gòu)中的其余字段(和清除設(shè)備句柄、保留等字段)并完成該IOCTL。如果客戶端驅(qū)動(dòng)程序支持的版本號(hào)不為USB棧所支持,類擴(kuò)展能夠被實(shí)現(xiàn)來(lái)使IOCTL失敗。能夠利用類擴(kuò)展將與設(shè)備句柄相關(guān)聯(lián)的客戶端驅(qū)動(dòng)程序的接口版本通知USB主控制器驅(qū)動(dòng)程序,并且客戶端驅(qū)動(dòng)程序能夠保存這個(gè)數(shù)據(jù)并使用它來(lái)實(shí)施行為。在各種實(shí)施例中,USB核心驅(qū)動(dòng)程序棧102被實(shí)現(xiàn)來(lái)接收來(lái)自USB客戶端函數(shù)驅(qū)動(dòng)程序Iio的能力版本請(qǐng)求,并返回USB核心驅(qū)動(dòng)程序棧支持用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展116的指示。在其它實(shí)施例中,USB核心驅(qū)動(dòng)程序棧102被實(shí)現(xiàn)來(lái)接收來(lái)自USB客戶端函數(shù)驅(qū)動(dòng)程序110的請(qǐng)求以分配URB (USB請(qǐng)求塊),并且USB核心驅(qū)動(dòng)程序棧102能夠?yàn)閁SB客戶端函數(shù)驅(qū)動(dòng)程序分配URB。USB核心驅(qū)動(dòng)程序棧102還能夠?qū)嵤┫葯z查協(xié)議,該先檢查協(xié)議指導(dǎo)USB客戶端函數(shù)驅(qū)動(dòng)程序110在經(jīng)由USB驅(qū)動(dòng)程序接口與USB核心驅(qū)動(dòng)程序棧接口之前檢查USB驅(qū)動(dòng)程序接口函數(shù)的可用性。在針對(duì)版本協(xié)商IOCTL的替代的實(shí)現(xiàn)中,版本數(shù)據(jù)隨后能夠在URB本身中進(jìn)行傳播,以提供驅(qū)動(dòng)程序特定的兼容性。可能具有一些只有某些類型的主控制器支持或僅利用特定的設(shè)備版本和/或速度支持的能力。這個(gè)的示例是批量流(Bulk Stream)端點(diǎn)。為了實(shí)現(xiàn)用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的流特性,啟用若干要求,諸如USB棧被實(shí)現(xiàn)來(lái)支持流概念,并且USB主控制器以及總線技術(shù)被實(shí)現(xiàn)來(lái)支持流特性??蛻舳蓑?qū)動(dòng)程序還確定所有的要求是否被滿足來(lái)啟用流。能夠定義通用機(jī)制來(lái)從USB核心驅(qū)動(dòng)程序棧確定USB能力,以致不同的能力組合能夠在不同的USB棧上被支持而不更新USBDInterfaceVersion。僅在客戶端驅(qū)動(dòng)程序請(qǐng)求合適的能力時(shí),USB核心驅(qū)動(dòng)程序棧才提供對(duì)某些特性的訪問(wèn),而這規(guī)定客戶端驅(qū)動(dòng)程序也將對(duì)其它USB棧起作用而不限于特定的USB棧版本和控制器。在實(shí)現(xiàn)中,驗(yàn)證器設(shè)置能夠被實(shí)現(xiàn)來(lái)禁用能力,以致在能力不被支持時(shí)客戶端驅(qū)動(dòng)程序起作用。用于USB驅(qū)動(dòng)程序接口函數(shù)的確定USB能力或確定用于接口函數(shù)的擴(kuò)展的特性是否被啟用的擴(kuò)展的示例實(shí)現(xiàn)是IOCTL_INTERNAL_USB_GET_USB_CAPABILITY。這個(gè)IOCTL由USB客戶端函數(shù)驅(qū)動(dòng)程序110發(fā)送,以確定USB核心驅(qū)動(dòng)程序棧102的能力。如果客戶端驅(qū)動(dòng)程序沒有驗(yàn)證USB棧支持它的話,則客戶端驅(qū)動(dòng)程序不被許可或允許來(lái)使用USB能力。這個(gè)IOCTL定義的示例是
權(quán)利要求
1.一種計(jì)算機(jī)系統(tǒng),包括 USB核心驅(qū)動(dòng)程序棧,其被配置用于計(jì)算機(jī)指令和數(shù)據(jù)交換的輸入/輸出; 被USB核心驅(qū)動(dòng)程序棧暴露的一組USB驅(qū)動(dòng)程序接口,所述USB驅(qū)動(dòng)程序接口包括被配置來(lái)與對(duì)應(yīng)于一個(gè)或多個(gè)客戶端USB設(shè)備的USB客戶端函數(shù)驅(qū)動(dòng)程序接口的USB驅(qū)動(dòng)程序接口函數(shù);和 用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展,所述擴(kuò)展被USB核心驅(qū)動(dòng)程序棧暴露來(lái)與USB客戶端函數(shù)驅(qū)動(dòng)程序接口。
2.如權(quán)利要求I所述的系統(tǒng),其中用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展被進(jìn)一步配置來(lái)將USB核心驅(qū)動(dòng)程序棧與遺留的、新的和未來(lái)的USB版本的USB客戶端函數(shù)驅(qū)動(dòng)程序接口。
3.如權(quán)利要求I所述的系統(tǒng),進(jìn)一步包括被配置來(lái)注冊(cè)一個(gè)或多個(gè)客戶端USB設(shè)備的個(gè)別函數(shù)的復(fù)合設(shè)備驅(qū)動(dòng)程序,并且其中USB核心驅(qū)動(dòng)程序棧被進(jìn)一步配置來(lái)枚舉USB客戶端函數(shù)驅(qū)動(dòng)程序和生成函數(shù)句柄,其中每一個(gè)函數(shù)句柄對(duì)應(yīng)于客戶端USB設(shè)備的個(gè)別函數(shù)。
4.如權(quán)利要求3所述的系統(tǒng),其中USB核心驅(qū)動(dòng)程序棧被進(jìn)一步配置來(lái)識(shí)別導(dǎo)致運(yùn)行失敗的USB客戶端函數(shù)驅(qū)動(dòng)程序,所述USB客戶端函數(shù)驅(qū)動(dòng)程序利用對(duì)應(yīng)于與USB客戶端函數(shù)驅(qū)動(dòng)程序相關(guān)聯(lián)的客戶端USB設(shè)備的個(gè)別函數(shù)的函數(shù)句柄是可識(shí)別的。
5.如權(quán)利要求3所述的系統(tǒng),其中復(fù)合設(shè)備驅(qū)動(dòng)程序被進(jìn)一步配置來(lái)將復(fù)合設(shè)備驅(qū)動(dòng)程序?qū)⒖刂茣和5囊粋€(gè)或多個(gè)客戶端USB設(shè)備的個(gè)別函數(shù)通知USB核心驅(qū)動(dòng)程序棧,所述復(fù)合設(shè)備驅(qū)動(dòng)程序被配置來(lái)經(jīng)由USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展來(lái)通知USB核心驅(qū)動(dòng)程序棧。
6.如權(quán)利要求I所述的系統(tǒng),其中USB核心驅(qū)動(dòng)程序棧被進(jìn)一步配置來(lái)實(shí)施先檢查協(xié)議,所述先檢查協(xié)議指導(dǎo)USB客戶端函數(shù)驅(qū)動(dòng)程序在經(jīng)由USB驅(qū)動(dòng)程序接口與USB核心驅(qū)動(dòng)程序棧接口之前檢查USB驅(qū)動(dòng)程序接口函數(shù)的可用性。
7.如權(quán)利要求I所述的系統(tǒng),其中USB核心驅(qū)動(dòng)程序棧被進(jìn)一步配置來(lái)經(jīng)由USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展從USB客戶端函數(shù)驅(qū)動(dòng)程序接收合同版本標(biāo)識(shí)符,所述合同版本標(biāo)識(shí)符被配置來(lái)指示USB客戶端函數(shù)驅(qū)動(dòng)程序利用來(lái)與USB核心驅(qū)動(dòng)程序棧接口的一組操作規(guī)則。
8.如權(quán)利要求I所述的系統(tǒng),其中USB核心驅(qū)動(dòng)程序棧被進(jìn)一步配置來(lái)從USB客戶端函數(shù)驅(qū)動(dòng)程序接收能力版本請(qǐng)求,并返回USB核心驅(qū)動(dòng)程序棧支持用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的指示。
9.如權(quán)利要求I所述的系統(tǒng),其中USB核心驅(qū)動(dòng)程序棧被進(jìn)一步配置來(lái)動(dòng)態(tài)分配多個(gè)數(shù)據(jù)流隊(duì)列給端點(diǎn)用于輸入/輸出,并將句柄數(shù)組與多個(gè)數(shù)據(jù)流隊(duì)列相關(guān)聯(lián)來(lái)管理輸入/輸出。
10.如權(quán)利要求I所述的系統(tǒng),其中USB核心驅(qū)動(dòng)程序棧包括USB主控制器,其被配置來(lái)支持用于存儲(chǔ)在幾乎不連續(xù)緩沖區(qū)中的緩沖數(shù)據(jù)的鏈接的MDL (內(nèi)存描述符列表)。
11.一種計(jì)算機(jī)實(shí)現(xiàn)的方法,包括 在USB核心驅(qū)動(dòng)程序棧中管理計(jì)算機(jī)指令和數(shù)據(jù)交換的輸入/輸出; 實(shí)現(xiàn)被USB核心驅(qū)動(dòng)程序棧暴露的一組USB驅(qū)動(dòng)程序接口,所述USB驅(qū)動(dòng)程序接口包括被配置來(lái)與對(duì)應(yīng)于一個(gè)或多個(gè)客戶端USB設(shè)備的USB客戶端函數(shù)驅(qū)動(dòng)程序接口的USB驅(qū)動(dòng)程序接口函數(shù);和 暴露用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展,所述擴(kuò)展被USB核心驅(qū)動(dòng)程序棧暴露來(lái)與USB客戶端函數(shù)驅(qū)動(dòng)程序接口; 從USB客戶端函數(shù)驅(qū)動(dòng)程序接收能力版本請(qǐng)求; 返回USB核心驅(qū)動(dòng)程序棧支持用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展的指示;和 經(jīng)由USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展從USB客戶端函數(shù)驅(qū)動(dòng)程序接收合同版本標(biāo)識(shí)符,所述合同版本標(biāo)識(shí)符指示USB客戶端函數(shù)驅(qū)動(dòng)程序利用來(lái)與USB核心驅(qū)動(dòng)程序棧接口的一組操作規(guī)則。
12.如權(quán)利要求11所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,進(jìn)一步包括將復(fù)合設(shè)備驅(qū)動(dòng)程序?qū)⒖刂茣和5囊粋€(gè)或多個(gè)客戶端USB設(shè)備的個(gè)別函數(shù)通知USB核心驅(qū)動(dòng)程序棧,所述復(fù)合設(shè)備驅(qū)動(dòng)程序經(jīng)由USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展通知USB核心驅(qū)動(dòng)程序棧。
13.如權(quán)利要求11所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,進(jìn)一步包括 枚舉USB客戶端函數(shù)驅(qū)動(dòng)程序; 注冊(cè)一個(gè)或多個(gè)客戶端USB設(shè)備的個(gè)別函數(shù);和 生成函數(shù)句柄,其中每一個(gè)函數(shù)句柄對(duì)應(yīng)于客戶端USB設(shè)備的個(gè)別函數(shù)。
14.如權(quán)利要求11所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,進(jìn)一步包括 動(dòng)態(tài)分配多個(gè)數(shù)據(jù)流隊(duì)列給端點(diǎn)用于輸入/輸出;和 將句柄數(shù)組與多個(gè)數(shù)據(jù)流隊(duì)列相關(guān)聯(lián)來(lái)管理輸入/輸出。
15.如權(quán)利要求11所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,進(jìn)一步包括實(shí)施先檢查協(xié)議,所述先檢查協(xié)議指導(dǎo)USB客戶端函數(shù)驅(qū)動(dòng)程序在經(jīng)由USB驅(qū)動(dòng)程序接口與USB核心驅(qū)動(dòng)程序棧接口之前檢查USB驅(qū)動(dòng)程序接口函數(shù)的可用性。
全文摘要
描述用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展。在實(shí)施例中,計(jì)算機(jī)指令和數(shù)據(jù)交換的輸入/輸出在USB核心驅(qū)動(dòng)程序棧中進(jìn)行管理。一組USB驅(qū)動(dòng)程序接口被USB核心驅(qū)動(dòng)程序棧暴露,并且USB驅(qū)動(dòng)程序接口包括與對(duì)應(yīng)于客戶端USB設(shè)備的USB客戶端函數(shù)驅(qū)動(dòng)程序接口的USB驅(qū)動(dòng)程序接口函數(shù)。用于USB驅(qū)動(dòng)程序接口函數(shù)的擴(kuò)展也被USB核心驅(qū)動(dòng)程序棧暴露來(lái)與USB客戶端函數(shù)驅(qū)動(dòng)程序接口。
文檔編號(hào)G06F13/14GK102725744SQ201180006002
公開日2012年10月10日 申請(qǐng)日期2011年1月4日 優(yōu)先權(quán)日2010年1月14日
發(fā)明者D.J.霍蘭, M.??ɡ{拉延, R.E.奧爾 申請(qǐng)人:微軟公司