欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
用DriverStudio開(kāi)發(fā)WDM型USB設備驅動(dòng)
1 引言
隨著(zhù)微機技術(shù)水平的日益提高,傳統的計算接口已經(jīng)不能滿(mǎn)足當前計算機高速發(fā)展的需求,計算機業(yè)界迫切需要新的通用型、高速總線(xiàn)接口。通用外設接口標準USB應運而生。USB,全稱(chēng)為通用串行總線(xiàn)(Universal Serial Bus),它是Compaq、IBM等PC大廠(chǎng)商聯(lián)合開(kāi)發(fā)的一種新型的、基于令牌的、高速的串行總線(xiàn)標準。開(kāi)發(fā)者要設計USB設備接口,就必須首先了解USB協(xié)議,在此基礎上有針對性的開(kāi)發(fā)USB設備驅動(dòng)程序。
2 USB簡(jiǎn)介
在眾多的PC機總線(xiàn)中,USB以其突出的優(yōu)點(diǎn)獨樹(shù)一幟:① 使用方便。支持熱拔插,不涉及中斷請求(IRQ)沖突等問(wèn)題,能真正做到“即插即用”。②傳輸速率高。目前的USB 2.0協(xié)議速度高達480Mbps 。③易于擴展。通過(guò)使用Hub擴展可連接多達127個(gè)外設。④使用靈活。USB共有4種傳輸模式:控制(control)、同步(Synchronization)、中斷(interrupt)、批量(bulk),以適應不同設備的需要。⑤獨立供電。正由于上述優(yōu)點(diǎn),開(kāi)發(fā)USB接口的設備已成為一種發(fā)展趨勢。
一個(gè)完整的USB系統包括主機系統和USB設備。所有的傳輸事務(wù)都是由主機發(fā)起的。一個(gè)主機系統又可以分為以下幾個(gè)層次結構,如圖1所示:
圖1 USB 互連通信模型
USB總線(xiàn)接口包括USB主控制器和根集線(xiàn)器,其中USB主控制器負責處理主機與設備之間電氣和協(xié)議層的互連,根集線(xiàn)器提供USB設備連接點(diǎn)。USB系統使用USB主控制器來(lái)管理主機和USB設備之間的數據傳輸,另外它也負責管理USB資源,如帶寬等。應用
軟件不能直接訪(fǎng)問(wèn)USB設備硬件,而通過(guò)USB系統和USB總線(xiàn)接口與USB設備進(jìn)行交互。
USB設備包含一些向主機軟件提供一系列USB設備的特征和能力的信息的設備描述符,用來(lái)配置設備和定位USB設備驅動(dòng)程序。這些信息確保了主機以正確的方式訪(fǎng)問(wèn)設備。通常,一個(gè)設備有一個(gè)或多個(gè)配置(Configuration)來(lái)控制其行為。配置是接口(Interface)的集合,接口指出軟件應該如何訪(fǎng)問(wèn)硬件。接口又是端點(diǎn)(endpoint)的集合,每一個(gè)與USB交換數據的硬件就為端點(diǎn),它是作為通信管道的一個(gè)終點(diǎn)。圖1顯示了一個(gè)多層次結構的通信模型,它表明了端點(diǎn)和管道所扮演的角色。
3 WDM驅動(dòng)程序和USB驅動(dòng)程序的分層結構
設備驅動(dòng)程序實(shí)際上是指一系列控制硬件設備的函數,是操作系統中控制和連接硬件的關(guān)鍵模塊。它提供連接到計算機的硬件設備的軟件接口。
3.1 WDM 驅動(dòng)程序介紹
WDM(Win32 Driver Model)是Microsoft公司力推的一種符合Windows2k/XP下的內核模式驅動(dòng)程序的分層體系結構的驅動(dòng)程序模式。它源于 Windows NT的分層32位設備驅動(dòng)程序模型,它支持更多的特性,如即插即用( PnP ,Plug and Play )、電源管理( PM ,Power  Management )、Windows管理診斷( WMI ,Windows  Management  Instrumentation )和 NT 事件。它為Windows操作系統的設備驅動(dòng)程序提供了統一的框架,在Windows平臺上,WDM將成為主流的驅動(dòng)模式。
WDM引入了功能設備對象FDO(Function Device Object)與物理設備對象PDO(Physical Device Object)兩個(gè)新類(lèi)來(lái)描述硬件,一個(gè)PDO對應一個(gè)真實(shí)的硬件。一個(gè)硬件只允許有一個(gè)PDO,卻可以擁有多個(gè)FDO,在驅動(dòng)程序中直接操作的不是硬件而是相應的PDO和FDO。
WDM是通過(guò)一個(gè)128位的全局唯一標識符(GUID)實(shí)現驅動(dòng)程序的識別。應用程序與WDM驅動(dòng)程序通信時(shí),應用程序將每用戶(hù)請求形成I/O請求包(IRP)發(fā)送到驅動(dòng)程序。驅動(dòng)程序識別出IRP請求后指揮硬件執行相應操作。
3.2開(kāi)發(fā)WDM驅動(dòng)程序的方法
目前開(kāi)發(fā)WDM驅動(dòng)程序的方法有三種:
①使用 Microsoft 的 Windows2000 DDK工具開(kāi)發(fā)。②使用 KRFTech 公司的 WinDriver 。③使用 NuMega 公司的 DriverStudio 。
3.3 WDM型的USB驅動(dòng)程序結構
對于USB設備來(lái)說(shuō),其WDM驅動(dòng)程序分為USB底層(總線(xiàn))驅動(dòng)程序和USB功能(設備)驅動(dòng)程序。USB驅動(dòng)程序符合Windows 2000下的內核模式驅動(dòng)程序的分層體系結構,如圖2所示:
圖2  WDM型的USB驅動(dòng)程序體系結構
USB底層驅動(dòng)程序由操作系統提供,負責與實(shí)際的硬件打交道,實(shí)現煩瑣的底層通信。USB功能驅動(dòng)程序由設備開(kāi)發(fā)者編寫(xiě),不對實(shí)際的硬件進(jìn)行操作,而是通過(guò)向USB底層驅動(dòng)程序發(fā)送包含URB(USB Request Block,請求塊)的IRP,來(lái)實(shí)現對USB設備信息的發(fā)送和接收。采用這種分層驅動(dòng)程序的設計方法有兩個(gè)優(yōu)點(diǎn):(1)多個(gè)USB設備可以通過(guò)USB底層驅動(dòng)程序來(lái)協(xié)調它們的工作。(2)編寫(xiě)分層驅動(dòng)程序較之編寫(xiě)單一驅動(dòng)程序相對簡(jiǎn)單,且可以節省內存和資源,不易出錯。
USB驅動(dòng)程序工作簡(jiǎn)述如下:當應用程序想對USB設備進(jìn)行I/O操作,它需調用Windows API函數,I/O管理器將此請求構造成一個(gè)合適的I/O請求包(IRP)并把它傳遞給USB功能驅動(dòng)程序。USB功能驅動(dòng)程序接收到這個(gè)IRP后,根據IPR中包含的具體操作代碼構造相應USB請求塊(URB),并把此URB放到一個(gè)新的IRP中,然后把它傳遞給USB底層驅動(dòng)程序。USB底層驅動(dòng)程序根據IRP中所含的URB執行相應的操作,并把操作的結果返回給USB功能驅動(dòng)程序。USB功能驅動(dòng)程序接收到此返回的IRP后,將操作結果通過(guò)IRP返還給I/O管理器,最后I/O管理器將此IRP操作結果傳回給應用程序,至此應用程序對設備的一次I/O操作完成。
4 用Driver Studio工具包開(kāi)發(fā)WDM型的USB設備驅動(dòng)程序
前文所提及的WDM驅動(dòng)程序開(kāi)發(fā)方法,筆者都曾嘗試過(guò)。個(gè)人認為用DriverStudio開(kāi)發(fā)工具包來(lái)開(kāi)發(fā)USB驅動(dòng)程序行之有效。其中的Driver Wizard是創(chuàng )建WDM驅動(dòng)程序框架的一個(gè)很好的工具,后文將介紹用它來(lái)創(chuàng )建USB設備驅動(dòng)程序的基本框架。
4.1搭建開(kāi)發(fā)平臺
由于利用 DriverStudio 開(kāi)發(fā)WDM驅動(dòng)程序在搭建開(kāi)發(fā)平臺的過(guò)程中對軟件的安裝順序要求頗高,在開(kāi)發(fā)過(guò)程中我也曾因為安裝順序的顛倒而失敗。在實(shí)踐中總結了以下的安裝步驟,有必要在此作以介紹。
①在已裝了Windows 2000 操作系統的機子上安裝 Microsoft Visual C++6.0。 ②安裝  Win2000 DDK 。③安裝 NuMega DriverStudio 2.0 ( or 2.6 ) 驅動(dòng)程序開(kāi)發(fā)工具包。它包含DriverWorks( 用于開(kāi)發(fā)內核模式WDM驅動(dòng)程序 )、SoftICE( 用于調試WDM驅動(dòng)程序 )等開(kāi)發(fā)工具。④由于DriverWorks 所用的類(lèi)庫是對 DDK 函數的封裝,必須在 VC中編譯,創(chuàng )建自己的庫文件。⑤設置 DDK 路徑。
4.2 利用DriverStudio 的DriverWorks生成USB設備驅動(dòng)程序框架
驅動(dòng)程序開(kāi)發(fā)平臺搭建成功后,我們可利用驅動(dòng)程序生成向導Driver Wizard,根據硬件設置較為容易的生成USB設備驅動(dòng)程序的大體框架。本人的設置如下:①選擇WDM的驅動(dòng)程序類(lèi)型和Windows 2000運行平臺。②選擇USB總線(xiàn)類(lèi)型,系統選擇的USB芯片是Philip公司的ISP1581,填寫(xiě)它的VID(供應商ID)和PID(設備ID),這些信息由芯片的供應商提供。③增加端點(diǎn)1和端點(diǎn)2,它們分別具有IN和OUT屬性。④根據需要選擇對設備的操作有:Read、Write、Device Control和CleanUp。⑤選擇給端點(diǎn)2產(chǎn)生BULK Read和Write的代碼, 向導會(huì )自動(dòng)產(chǎn)生一套對端點(diǎn)2進(jìn)行讀、寫(xiě)的代碼。⑥設置驅動(dòng)程序的屬性,采用WDM接口;在選取讀寫(xiě)方式時(shí)應遵循一條原則:需要快速傳送大量數據時(shí),用 Direct I/O ,反之用 Buffer I/O ,這里選擇BufferI/O;由于無(wú)特殊的電源需求,故選用系統默認的Manage Power For This Device。⑧增加IOCTL接口,在其生成的代碼框架中加入自己的操作,以實(shí)現一個(gè)完整的USB設備驅動(dòng)程序。最后就生成了一個(gè)WDM型的USB設備驅動(dòng)程序框架和一個(gè)測試該驅動(dòng)程序的測試程序大體框架。然后在其中添加需要的功能代碼。
4.3 USB設備驅動(dòng)程序中的關(guān)鍵例程代碼實(shí)現
下面以我們的驅動(dòng)程序為例,介紹USB驅動(dòng)程序開(kāi)發(fā)中的幾個(gè)關(guān)鍵例程的實(shí)現。本驅動(dòng)程序的主要功能是控制USB設備上LED燈通斷并且對設備進(jìn)行讀寫(xiě)。
4.3.1初始化例程 DriverEntry()
設備驅動(dòng)程序與應用程序不同,它沒(méi)有main()或WinMain()函數,而是有一個(gè)名為DriverEntry()的入口函數,它通常完成一些初始化工作。當設備驅動(dòng)程序被加載時(shí),操作系統調用這個(gè)入口。在使用DriverWizard 創(chuàng )建的驅動(dòng)程序基本框架中,DriverEntry()函數已經(jīng)寫(xiě)好了,無(wú)需添寫(xiě)代碼。在該例程中,驅動(dòng)程序要向操作系統登記并注冊一些消息處理器,通過(guò)RegistryPath來(lái)找到位于注冊表中的驅動(dòng)程序參數,當驅動(dòng)程序正確安裝后,在注冊表KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Service 下可以找到MyUSB 項。而用DDK編寫(xiě)該入口函數還需初始化Dispatch(分派)例程入口。
4.3.2創(chuàng )建設備例程 AddDevice()
大多數的PDO 都是在 PnP 管理器調用該程序入口點(diǎn)時(shí)被創(chuàng )建的。插入新設備后,系統啟動(dòng)時(shí),總線(xiàn)枚舉器會(huì )發(fā)現總線(xiàn)上的所有設備,會(huì )自動(dòng)尋找并安裝設備的驅動(dòng)程序,并由驅動(dòng)程序中的處理 PnP 功能模塊自動(dòng)處理  AddDevice() 例程及其他PnP消息。此例程使用IoCreateDevice() 函數創(chuàng )建設備對象,再使用 IoRegisterDeviceInterface() 函數將設備組成為一個(gè)特定的設備接口,然后使用IoAttachDeviceToDeviceStack() 函數關(guān)聯(lián)設備棧。
NTSTATUS MyUSBDevice::AddDevice( PDEVICE_OBJECT Pdo )
{ // 產(chǎn)生一個(gè)DDK中KDevice類(lèi)新的設備對象
MyUSBDevice *pDevice = new (
static cast( KUnitizedName(L“MyUSBDevice”,m_Unit) ),// 設備名
FILE_DEVICE_UNKNOWN,                               // 設備類(lèi)型
NULL,                                                 // 指針鏈接名
0,                                                  // 設備特征標志位
DO_BUFFERED_IO| DO_POWER_PAGABLE);             // I/O傳輸方式
MyUSBDevice(Pdo, m_Unit);
if ( pDevice == NULL )
{
return STATUS_INSUFFICIENT_RESOURCES;
}
NTSTATUS status = devices -> ConstructorStatus();
if ( !NT_SUCCESS(status) )                // 不成功,返回錯誤狀態(tài)并刪除指針
{
delete pDevice;
}
else     // 如果成功,向系統報考設備的電源狀態(tài)變化為PowerDeviceD0
{
m_Unit++;
pDevice -> ReportNewDevicePowerState( PowerDeviceD0 );
}
return status;
}
4.3.3 LED控制處理例程 MyUSB_IOCTL_LED_Handler()
該例程是實(shí)現本驅動(dòng)程序功能的關(guān)鍵例程,它是用來(lái)控制設備上的LED燈通斷,主要利用USB Vendor Request來(lái)向設備傳送。其中,request=1的時(shí)候表示讓LED亮,request=0的時(shí)候讓LED滅。它是通過(guò)DeviceControl由上層應用程序傳下來(lái)。實(shí)現代碼如下:
NTSTATUS MyUSBDevice::MyUSB_IOCTL_LED_Handler(KIrp I)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
//檢查輸入參數是否正確,如果不正確,返回STATUS_INVALID_PARAMETER
if(I.IoctlOutputBufferSize() || !I.IoctlBuffer() ||(I.IoctlInputBufferSize() != sizeof(UCHAR)))
return status;
//處理MyUSB_IOCTL_LED_ON請求
PURB pUrb = m_Lower.BuildVendorRequest(
NULL,                                      // 傳輸緩沖區
0,                                           // 傳輸緩沖區大小
0,                                          // 請求保留位
(UCHAR)(*(PUCHAR)I.IoctlBuffer()),        // 請求1=LED_ON ,0=LED_OFF
0 );                                        // 值
//向下傳送URB
status = m_Lower.SubmitUrb(pUrb, NULL, NULL, 5000L);
//若請求在此處理,設置I.Information指示多少數據拷貝回用戶(hù)
I.Information()=0;
I.Status()=status;
return status;
}
4.3.4訪(fǎng)問(wèn)硬件例程 DeviceControl()
上層應用軟件程序就是通過(guò)此例程來(lái)將IRP傳到下層。
NTSTATUS MyUSBDevice::DeviceControl(KIrp I)
{
NTSTATUS status;
switch (I.IoctlCode())
{
case MyUSB_IOCTL_LED:
status = MyUSB_IOCTL_LED_Handler(I);
break;
default:                        // 未被聲明的I/O 控制請求
status = STATUS_INVALID_PARAMETER;
break;
}
}
限于篇幅,這里僅介紹本驅動(dòng)程序中的部分例程實(shí)現代碼。編寫(xiě)完驅動(dòng)程序后,首先在Visual C++ 中編譯通過(guò),然后連接硬件,用DriverStudio 工具包中的SoftICE調試器調試該驅動(dòng)程序,并且修改編譯DriverStudio產(chǎn)生的該驅動(dòng)程序的測試程序,就通過(guò)命令行來(lái)測試我們的驅動(dòng)程序。最后對于LED的控制,我們可以直觀(guān)的在設備上看到。
5 結束語(yǔ)
USB技術(shù)的不斷發(fā)展和完善,已經(jīng)使其逐漸成為先進(jìn)總線(xiàn)接口技術(shù)的標志和方向,如今USB OTG標準已經(jīng)發(fā)布,那么USB的應用領(lǐng)域也將越發(fā)的廣泛。開(kāi)發(fā)一些特定功能的USB接口并設計其設備驅動(dòng)程序也將成為應用USB技術(shù)的關(guān)鍵。通過(guò)對USB的學(xué)習和Windows 2000下的WDM驅動(dòng)程序的研究,本文已經(jīng)給出了編寫(xiě)WDM型USB設備驅動(dòng)程序的一般方法,讀者可以在實(shí)際應用中逐步提高對USB和驅動(dòng)程序的認識,取得事半功倍的效果。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
用WDM開(kāi)發(fā)USB驅動(dòng)程序
WDM驅動(dòng)程序的組成
從一篇文章入門(mén)Windows驅動(dòng)程序(一)
配置WINDOWS驅動(dòng)程序的開(kāi)發(fā)環(huán)境-走出第一步_.Net技術(shù)文章_Asp.net_網(wǎng)站開(kāi)...
windows驅動(dòng)程序開(kāi)發(fā)初探
WDM驅動(dòng)開(kāi)發(fā)之路(1)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久