版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、微處理機及應用作業(yè)三Windows環(huán)境底下驅(qū)動程式之設計方式陳正哲B82503131目錄?前言&Intel CPU的模式真實模式定址保護模式定址保護模式下的中斷線性空間虛擬8086模式&Windows加強模式&虛擬驅(qū)動程式虛擬周邊(Virtual Device - VxD)虛擬機器(Virtual Machine - VM)系統(tǒng)虛擬機器(System Virtual Machine)VM時間分配虛擬機器管理員(Virtual Machine Manager - VMM)虛擬周邊驅(qū)動程式的基本結構VxD的宣告VMM系統(tǒng)控制訊息VxD的初始化虛擬中斷(Virtual Int
2、errupt)Windows下的DMA處理萬用型VxD&可裝置式驅(qū)動程式可裝置式驅(qū)動程式簡介Windows與可裝置式驅(qū)動程式AP和可裝置式驅(qū)動程式的關係使用者自行定義的訊息(User-Defined Message)多媒體專用的可裝置式驅(qū)動程式?心得?前言驅(qū)動程式(Device Driver)可說是硬體裝置和作業(yè)系統(tǒng)之間溝通的橋樑,基本上,電腦的每一種周邊裝置(如聲霸卡網(wǎng)路卡硬碟介面卡顯示卡掃描器)都是需要驅(qū)動程式才能正常運作的,而各種作業(yè)系統(tǒng)之下,驅(qū)動程式的型態(tài)又各不相同。在DOS下,我們只需要寫簡短的程式就可以和DMA Controller(8237)或Interrupt Cont
3、roller(8259)或一些I/O埠溝通訊息,這些溝通的動作即為驅(qū)動程式所需要負責的動作,所以說在DOS下撰寫驅(qū)動程式是很容易的事。但是在Windows環(huán)境下,因為Windows是個多工的環(huán)境,寫驅(qū)動程式時必須要考慮保護模式下記憶體管理的問題必須考慮是否同時有兩個task想要使用同一個周邊裝置,所以問題變得複雜許多?;旧?,要學會如何在Windows下寫驅(qū)動程式,必須先瞭解Intel CPU的真實模式保護模式虛擬8086模式Windows的加強模式Windows的虛擬周邊。(而且組合語言Windows Programming要強,對於硬體,如82598237等,也要有一定的認識,同時也要多觀
4、摩別人寫過的程式,從中汲取經(jīng)驗。)因此,這份報告就先分別針對這些主題加以研究,然後再研究關於虛擬驅(qū)動程式及可裝置式驅(qū)動程式的架構及基本概念。至於詳細的程式設計方式,因為範圍過於廣大,就不包含在本報告中了。這份報告主要是參考Windows驅(qū)動程式與周邊控制實務(簡文烯著,全欣出版)這本書,把書中的內(nèi)容加以精鍊並適時加入一些自己的經(jīng)驗而成的。進一步的資料可參考Windows Device Driver Kit手冊Windows SDK手冊。&Intel CPU的模式真實模式定址電腦一開機進入DOS之後,就是處在這種模式之下,此時真實位址等於Segment Address左移4個bit,再加
5、上Offset Address。8086的CPU只能工作於真實模式。保護模式定址80286以上的CPU提供了保護模式可供選擇。在保護模式之下,原本的Segment Address被Selector取代了,Selector內(nèi)含一個指標,指向Segment Descriptor Table,透過這個table,CPU可得到Base Address,把Base Address和Offset Address相加,即可得到實際位址。其中,Descriptor Table是由作業(yè)系統(tǒng)來維護的。Selector是一個16 bit的暫存器,它的最低的2個bit稱為RPL,用來決定系統(tǒng)的四個level,分別為R
6、ing 0到Ring 3,在Ring 0執(zhí)行的程式權力最大,Windows就是在Ring 0之內(nèi)運作的,一般的Windows應用程式則位於Ring 3,而我們所要撰寫的驅(qū)動程式,則是位於Ring 0之內(nèi),因為驅(qū)動程式畢竟應該算是系統(tǒng)的一部份。Selector中第三低的位元T稱為Table Indicator,決定Selector要指向Global Descriptor Table(GDT)還是Local Descriptor Table(LDT)。在OS/2之下,只保有一個唯一的GDT提供服務給所有的執(zhí)行程式,但是對於每一個執(zhí)行程式,都給予個別的LDT。而在之下,則是所有的應用程式共用同一個L
7、DT,造成Windows應用程式可能會間接破壞其他應用程式的記憶體,使整個系統(tǒng)崩潰。保護模式下的中斷在真實模式之下,當中斷發(fā)生時,CPU會從記憶體最低的一段空間(稱為中斷向量表,Interrupt Vector Table - IVT)取出中斷服務常式(ISR)的位址,然後便把程式流程轉(zhuǎn)移到該處。在保護模式之下,由中斷描述表(Interrupt Descriptor Table - IDT)取代了原本的中斷向量表,所以不能夠使用原本真實模式下的方式來寫中斷服務常式。中斷描述表的詳細資料可參考Intel手冊,而關於如何在Windows這個保護模式的作業(yè)系統(tǒng)下處理中斷,請參考後面的虛擬中斷(Vir
8、tual Interrupt)。線性空間80386除了與80286有相同的保護模式之外,又增加了記憶體分頁的功能(Memory Paging),基本上SegmentSelector以及Desciptor等仍然存在於80386,不同的是除了實體記憶體位址以外,尚有新增的線性位址。由Selector和Offset可決定一個線性位址,由此位址再經(jīng)過CPU的轉(zhuǎn)換,便可以得到最後的實際位址。虛擬8086模式80386提供了V86模式(Virtual 8086),此模式可在保護模式之下模擬和8086相容的模式,藉由分頁功能的幫助,可以把V86內(nèi)的位址轉(zhuǎn)換為線性位址,如此便可相對應至4G內(nèi)的實際記憶體。&a
9、mp;Windows加強模式有標準模式及加強模式兩種模式,前者主要是為了支援286機器所使用的,目前的機器多為386以上,此模式已被淘汰,因此我們就不詳加研究了。Windows在加強模式之下利用記憶體分頁的功能加入Virtual Dos Machines(VDMs),由於記憶體分頁可負責把線性位址轉(zhuǎn)換為實際位址,所以可以同時允許多個VDM同時執(zhí)行。然而這些VDM的共存情形也帶來了不少問題。例如當Windows應用程式和Dos Box內(nèi)的程式要同時存取某個硬體設備時,就必須要有一個仲裁的方式來加以裁決,比如說對於視訊記憶體的存取,如果Windows允許Dos Box去對視訊記憶體寫入資料,如此一
10、來一定會使Windows的畫面受到破壞,所以Windows利用線性位址的特性,把Dos Box內(nèi)的視訊空間對應到其它的地方,如此便解決了上述的問題。另外,在加強模式之下,記憶體管理變的非常靈活,尤其在記憶體需求總數(shù)大於實際記憶體時,Windows會透過記憶體分頁的觀念,把暫時不會使用到的實體記憶體以4K為單位寫到硬碟,空出記憶體空間給其它的應用程式使用。而當程式再度需要存取那些被寫入硬碟的記憶體時,Windows會將它們讀回記憶體,這種動作稱為動態(tài)記憶體交換(SWAP)。&虛擬驅(qū)動程式虛擬驅(qū)動程式(Virtual Device Driver)是為了配合中特有的虛擬機器(VM)而產(chǎn)生的,
11、在中的那些延伸檔名為.386的檔案就是虛擬驅(qū)動程式。下圖說明了虛擬驅(qū)動程式的載入時間及方式:虛擬周邊(Virtual Device - VxD)虛擬周邊其實是一個32位元的動態(tài)鍊結程式庫(DLL,一般的DLL是16位元),主要用來管理系統(tǒng)資源,比如說是硬體或裝置式軟體,以方便在同一時間內(nèi)多個應用程式共同使用這個資源。在Windows的加強模式中,Windows程式和Dos Box內(nèi)的程式是多工進行的,所以當它們要同時使用一個硬體設備時,就必須要有一個仲裁者,而這個重責大任就落在虛擬周邊驅(qū)動程式上了。在中,一共提供了十幾個虛擬周邊驅(qū)動程式,詳細資料可參考Windows Device Driver
12、 Kit手冊,而我們比較會使用到的是下面兩個:nVPICD.386 用來虛擬化PC系統(tǒng)中的8259晶片,模擬這個晶片的功能。例如,當某個中斷服務常式在最後發(fā)出中斷結束(End Of Interrupt, EOI)的訊息時,該訊息不會直接傳到8259上,而是由這個虛擬周邊接收,然後再決定是否要把EOI傳給8259。nVDMAD.386 用來虛擬化PC系統(tǒng)中的8237晶片。這個虛擬周邊提供許多服務供其它的虛擬周邊呼叫,例如軟碟就需要呼叫這個虛擬DMA。虛擬機器(Virtual Machine - VM)Windows利用Intel 386所提供的V86模式,製作出386加強模式,此模式可以設定一段
13、記憶體空間,而記憶體的內(nèi)容完全是真實模式下DOS的翻版,同時再利用386記憶體分頁的功能,使得這塊記憶體可以被虛擬化,也就是說,這段空間在這個DOS的眼光裡是記憶體空間中的最低1MB,然而實際上他卻可以是在記憶體中的任何地方。Windows加強模式不僅可設定一個DOS空間,還可以同時擁有多個DOS空間。我們把每個DOS所在的空間環(huán)境稱為一個虛擬機器(VM)。系統(tǒng)虛擬機器(System Virtual Machine)在Windows所產(chǎn)生的所有VM之中,並不是每一個都只作DOS的模擬之用的,其中有一個VM專門用來支援Windows應用程式,稱之為系統(tǒng)虛擬機器(System VM)。當Windo
14、ws啟動的時候,它保留了一份初始的DOS環(huán)境,之後,每當有新的VM要產(chǎn)生時,這份原始被保留的DOS就被拷貝到新的VM的記憶體空間之中。當使用者在新的VM之下載入DOS程式,這個程式只會被放到新的DOS空間,而不會影響到原始的DOS。VM時間分配在Windows中,每個VM相互之間是以多工的方式互相協(xié)調(diào),所以每一個VM會被分配一段執(zhí)行時間。執(zhí)行時間的分配由兩個參數(shù)來調(diào)整:主要行程(Primary Schedule)和時間分割(Time Slicer)。時間分割參數(shù)可透過PIFEDIT公用程式來調(diào)整,每個VM會被分配兩個1到10000的時間分割優(yōu)先權,一個給VM在背景時間使用,一個給VM在前景時間
15、使用。而系統(tǒng)VM必須透過控制臺中的386增強模式才可以改變其優(yōu)先權的設定。主要行程的調(diào)整一般使用者是看不到的,它是用來決定某個VM是否接受時間分配。如果主要行程設定某個VM不接受時間分配,那麼即使該VM有很高的行程分割優(yōu)先權,CPU還是不會被分派給該VM使用。主要行程所制訂的優(yōu)先權,稱為執(zhí)行優(yōu)先權(Execution Priority)。主要行程在任何時刻都維持一個最高優(yōu)先權位準,因此任何一個VM如果具有和最高優(yōu)先權相當?shù)奈粶剩瑒t其時間分配是有效的,反之如果低於最高優(yōu)先權,則其時間分配並沒有任何效力。在程式中想要調(diào)整優(yōu)先權及時間分割,必須呼叫Virtual Machine Manager裡的服
16、務。細節(jié)可參考Windows Device Driver Kit手冊。虛擬機器管理員(Virtual Machine Manager - VMM)虛擬機器管理員(VMM)是32位元的保護模式作業(yè)系統(tǒng),它的任務是負責產(chǎn)生執(zhí)行監(jiān)督及結束VM。此外,VMM所提供的服務涵蓋了記憶體工作元中斷及保護模式錯誤等的管理。VMM和VxD(虛擬周邊)都是32位元,也就是說它們都是採用平滑式位址系統(tǒng)(Flat Model Address)。在Intel CPU架構裡,它們是存在Ring 0這個層次。下圖說明系統(tǒng)與應用程式在Inte CPU架構中的對應關係:系統(tǒng)在啟動時,會建立兩個GDT,一個給Code使用,一個給
17、Data使用。不管是Code或Data,它們的Selector裡的Base都是零,Limit都是4 Giga,因此所有的段落暫存器都指向相同的位址空間。虛擬周邊驅(qū)動程式的基本結構虛擬周邊驅(qū)動程式(VxD)的基本架構如下圖所示:VxD的宣告在每個VxD裡面,都必須有宣告的動作,其目的就是在這個VxD的永久性資料段裡產(chǎn)生一塊實際的資料結構,稱為Device Descriptor Block(DDB)。宣告的方式是以Declare_Virtual_Device這個巨集指令(和撰寫VxD有關的巨集結構符號參數(shù)等,都定義在DDK所提供的一些前置檔中,常用的前置檔包括VMM.INC, DEBUG.INC,
18、 VPICD.INC, SHELL.INC)來產(chǎn)生。它的參數(shù)一共有8個。第一個參數(shù):虛擬驅(qū)動程式的名字。第二個參數(shù):版本編號的整數(shù)部份。第三個參數(shù):版本編號的小數(shù)部份。第四個參數(shù):此VxD之控制程序之位址進入點(Entry Point)。第五個參數(shù):VxD的識別編號。Microsoft保留了0到01FFh的編號,所以自行定義的編號必須在這些編號的後面。第六個參數(shù):VxD載入的順序。如果此VxD呼叫其它的VxD,則被呼叫的VxD必須先行載入。如果載入的順序並不重要,可以使用Undefined-Init-Order來代替。第七個參數(shù):定義V86模式下程式呼叫VxD的服務常式的進入點。第八個參數(shù):定
19、義保護模式下程式呼叫VxD的服務常式的進入點。VMM系統(tǒng)控制訊息當系統(tǒng)或是某個VxD有任何改變時,VMM就會送出一些控制訊息。大部份的VxD都會隨時注意是否有VM產(chǎn)生終止或轉(zhuǎn)移執(zhí)行焦點。而要能夠追蹤這些訊息,就必須由VMM送出訊息給VxD。VMM所送出的訊息有好幾種,在手冊的第三章有詳細的表列可供參考。VxD必須要能夠根據(jù)這些訊息而做出適當?shù)膭幼?。VxD的初始化(Initialization)當VxD在被初始化時,VMM會執(zhí)行某些動作,發(fā)出某些控制訊息,大致的情形如下:1. 載入真實模式啟始段落,呼較真實模式啟始程序。在程序中可做一些判斷,以免VxD被重複載入。2. 載入VxD的其餘部份,將真
20、實模式啟始段落丟棄釋出。3. VMM送出Sys_Critical_Init。VxD會執(zhí)行對應的程序。在此刻硬體中斷會被抑制,所以VxD中的對應程序必須愈短愈好。4. VMM送出Device_Init。此刻硬體中斷已被致能,所以VxD必須已經(jīng)具備可處理自己的周邊所發(fā)出的中斷的能力。5. VMM送出Init_Complete。6. VMM把啟始化的程式段和資料段所佔用的記憶體釋出。往後,以上三個訊息的對應程序不能再被呼叫。虛擬中斷(Virtual Interrupt)在DOS環(huán)境下,使用者是處於單工系統(tǒng),所以只要一個中斷管理系統(tǒng)就夠了??墒窃赪indows環(huán)境中,所有的VM之間是多工進行的,如何把
21、一套中斷系統(tǒng)分配給多個VM使用,就是我們要解決的問題。DDK提供了一個虛擬PIC驅(qū)動程式(VPICD.386),給使用者呼叫其中的服務來處理硬體中斷。在Windows中,硬體中斷可被分為兩類,一是整體的IRQ(Global IRQ - GIRQ),一是區(qū)域的IRQ(Local IRQ - LIRQ)。所謂GIRQ,就是在Windows啟動之前就已被初始化的IRQ。反之則稱為LIRQ。例如8253計時器,在DOS環(huán)境下就已經(jīng)動作了,所以在Windows之中便是隸屬於GIRQ。LIRQ在Windows環(huán)境中是不會動作的,必須仰賴使用者去呼叫VPICD的服務;而GIRQ在Windows中是一定會存在
22、的。應用程式要使用某個區(qū)域的IRQ,必須先呼叫VPICD,要求對某個IRQ作虛擬化,指定該IRQ為應用程式所在的VM所擁有。此後一旦有IRQ發(fā)生,VPICD會判斷該IRQ是否被虛擬化,如果是虛擬化,則VPICD會把這個IRQ反應給擁有這個IRQ的VM,然後由應用程式在VM中所登錄的中斷服務常式來處理。基本的流程如下圖所示:在VPICD中,有一個相當重要的結構,我們必須在自己撰寫的虛擬驅(qū)動程式VxD的一開頭,便拿它來向VPICD註冊,它的結構如下:VPICD_IRQ_Descriptor STRUCVID_IRQ_Numberdw?VID_Optionsdw0VID_Hw_Int_Procdd?
23、VID_Virt_Int_Procdd0VID_EOI_Procdd0VID_Mask_Change_Procdd0VID_IRET_Procdd0VID_IRET_Time_Outdd500VPICD_IRQ_Descriptor ENDSlVID_IRQ_Number用來指明哪一個IRQ要被虛擬化。lVID_Hw_Int指向一個Callback函數(shù),處理由VPICD送來的硬體中斷訊息。lVID_EOI_Proc指向一個Callback函數(shù),處理End Of Interrupt的動作。lVID_IRET_Proc指向一個Callback函數(shù),處理iret指令。其他沒有提到的項目並不是十分重要
24、,通常直接使用其內(nèi)定值即可。一旦完成以上的註冊工作,接下來的問題就是軟體如何完成一個中斷。軟體所需要進行的動作大致可被歸納為下列幾點:1. 硬體線路透過8259發(fā)出中斷訊號給CPU,CPU把控制權轉(zhuǎn)交給VPICD。2. VPICD呼叫先前在VxD中所註冊的VID_Hw_Int_Proc Callback函式。3. VID_Hw_Int_Proc呼叫VPICD的VPICD_Set_Int_Request服務,同時用ebx來指明這個Int將送往那個中斷。4. VM處理完中斷服務,送出EOI。5. VxD攔截EOI,呼叫VPICD的VPICD_Clear_Int_Request服務。6. VM中的中
25、斷常式發(fā)出硬體信號,清除IRQ。7. 中斷常式執(zhí)行IRET,結束中斷服務常式。8. VxD攔截IRET,呼叫VPICD的VPICD_Phys_EOI服務。9. 回到步驟1。Windows下的DMA處理撰寫Windows下的DMA(Direct Memory Access, 直接記憶體存?。┏淌酱笾律嫌袃煞N方式:第一由程式設計者自行控制8237 DMA晶片,這種方式一般來說使用起來會比較麻煩,因為程式設計者必須自行精確計算配置管理Windows的記憶體,而這是一件非常複雜的工作。第二利用來幫忙控制DMA晶片,這種方式比較簡單快速安全,許多記憶體管理的工作透過的幫忙皆可迎刃而解。以下我們就介紹上述
26、的第二種DMA程式的設計方式:首先,讓我們回憶一下Windows下的記憶體定址方式?;旧?,當一個Windows應用程式在擷取記憶體時,需要進行下面兩個步驟:第一把segment descriptor和offset轉(zhuǎn)換為線性位址。第二把線性位址轉(zhuǎn)換為實際位址。曾經(jīng)在保護模式下撰寫過程式的人都知道,要找到實際位址是很不容易的一件事。然而,更糟的是,由於Windows具有記憶體搬動的功能,對於相同的線性位址,在不同的時間可能會被對應到不同的實際位址。既然實際位址無法確實掌握,又如何精確地告訴8237,要從哪一個位址開始做DMA的傳送呢?關於這個問題,有兩種解決方式。其中以第二種方式較為簡單也比較安
27、全。第一種方式如下圖所示,大致可分為五個步驟:由Windows Application向系統(tǒng)要求一塊記憶體。把該記憶體的線性位址告訴。由去呼叫中的VDMAD_Lock_DMA_Region來檢視這塊記憶體是否合乎以下兩個原則:第一這塊記憶體必須為連續(xù)之空間。第二記憶體不得跨越64K或128K的頁邊界。如果記憶體合乎以上兩個標準,則VDMAD_Lock_DMA_Region會將這塊記憶體鎖?。↙ock),並傳回記憶體的實際位址。取得該記憶體的實際位址之後,就可以用這塊記憶位址去呼叫VDMAD_Set_RegionVDMAD_Set_Phys_StateVDMAD_UnMask_Channel,來
28、對8237程式化。一旦硬體訊號進來,便可以執(zhí)行DMA了。如果在步驟中向系統(tǒng)索取的記憶空間不符合上述兩個原則,則可以將記憶體打散成幾個較小塊的記憶體,再分別做DMA,不過這種方式比較複雜。第二種方式則無上述的困擾,請見下圖:由Windows Application向系統(tǒng)要求一塊記憶體。把該記憶體的線性位址告訴。由去呼叫中的VDMAD_Request_Buffer向系統(tǒng)求得一塊Buffer,而這塊Buffer的大小和Windows Application向系統(tǒng)要求的記憶體大小相同。保證這塊Buffer連續(xù)且不跨越頁邊界。取得一塊Buffer之後,就可以用這塊Buffer去呼叫VDMAD_Set_R
29、egion,VDMAD_Set_Phys_State,VDMAD_UnMask_Channel,來對8237程式化。一旦硬體訊號進來,便可開始執(zhí)行DMA的傳輸,將資料傳進Buffer內(nèi)。當資料傳送完畢,我們便可用VDMAD_Copy_From_Buffer把資料拷貝到應用程式本身的記憶空間。它的基本動作和第一種方式相似,但是記憶體的部份並不由直接向系統(tǒng)索取,而是透過的VDMAD_Request_Buffer向系統(tǒng)求得一塊Buffer。因此我們不用擔心Windows Application向系統(tǒng)索取的記憶體是否符合連續(xù)且不跨越頁邊界的條件。如果我們做DMA的目的是要把資料傳送到外界,則程式流程應
30、該改為在做DMA之前,先用VDMAD_Copy_To_Buffer把資料由應用程式的記憶空間拷貝至Buffer。萬用型VxDVxD要用組合語言加以撰寫,但其實大部份的VxD只是呼叫幾個VMM或是的服務,然而我們卻必須花很多時間來寫這個VxD,實在是很不劃算。因此之故,Andrew Schulman在1993年二月份的Microsoft Systems Journal中發(fā)表了一篇Call VxD Functions and VMM Services Easily Using Our Generic VxD,解決了這個問題,使得程式設計師可以用C語言來撰寫虛擬驅(qū)動程式。詳細的細節(jié),請參考該篇文章。
31、&可裝置式驅(qū)動程式虛擬驅(qū)動程式被歸類於Windows DDK之中,而可裝置式驅(qū)動程式則是屬於Windows SDK的範圍,可在Windows Software Development Kit手冊中找到一些相關的資料。可裝置式驅(qū)動程式簡介一個可裝置式驅(qū)動程式(Installable Driver)其實就是一個Windows DLL,不同的是它可以被InstalledOpenedQueriedEnabledDisabled及Closed。它提供了一種方便統(tǒng)一的介面格式,不管是一般AP或是其他驅(qū)動程式,都可以很容易地呼叫此可裝置式驅(qū)動程式,要求它提供服務。它的特色如下:1. 當Windows
32、啟動時,可裝置式驅(qū)動程式也隨之載入,而當Windows關閉時,它也隨之消失。基本上,它可被視為Windows的常駐程式(TSR)。2. 可裝置式驅(qū)動程式的主體是在AP呼叫時才被載入。3. 可裝置式驅(qū)動程式的InstalledConfigured及Removed,均可透過控制臺來操作。4. 可裝置式驅(qū)動程式可以接受許多重要的系統(tǒng)訊息,如Windows關閉一般應用程式結束新的驅(qū)動程式instance產(chǎn)生等。5. 除了接受SDK中所列出的標準訊息之外,可裝置式驅(qū)動程式尚可接受由程式設計者自行定義的訊息。Windows與可裝置式驅(qū)動程式虛擬驅(qū)動程式存在於Windows的Kernel之中,而可裝置式驅(qū)動
33、程式的架構卻是建構在裡頭,這是因為可裝置式驅(qū)動程式必須能夠接受到所有的訊息,包括工作元(Task)的啟動與結束等等,而只有能夠提供這方面的訊息。在的內(nèi)部,有一個串列專門用來收集可裝置式驅(qū)動程式,每當有一個新的可裝置式驅(qū)動程式被載入,便會去對這個新的可裝置式驅(qū)動程式做確認,如果一切正常,就把它加入串列之中,此後這個可裝置式驅(qū)動程式便可以接受由Windows所傳來的訊息。AP和可裝置式驅(qū)動程式的關係應用程式(AP)和可裝置式驅(qū)動程式間的溝通的方式如下圖所示:當應用程式(AP)呼叫OpenDriver去打開Driver時,如果是Driver的第一個instance,則Windows會依序送出DRV_LOADDRV_ENABLEDRV_OPEN三個訊息給Driver,否則只會送出DRV_OPEN。當應用程式呼叫CloseDriver去關閉Driver時,如果是Driver的最後一個instance,則Windows會依序送出DRV_CLOSEDRV_DISABLEDRV_FREE三個訊息給Driver,否則只送會送出DRV_CLOSE。至於其他訊息,則是藉由Se
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度生態(tài)修復工程合同要點解析3篇
- 二零二五年度綠色農(nóng)業(yè)種植合同補充協(xié)議
- 2024考研沖刺班報名合同書一
- 2024食用油供貨合同
- 2024股權轉(zhuǎn)讓與行使權益協(xié)議
- 二零二五年度數(shù)據(jù)存儲與備份外包服務協(xié)議2篇
- 打造品牌影響力動植物百科知識競賽的商業(yè)應用
- 2024版高端裝備制造技術許可合同
- 二零二五年度文化旅游項目股權轉(zhuǎn)讓與市場開發(fā)協(xié)議3篇
- 二零二五年度森林防火工程工地圍擋及滅火物資合同3篇
- 蘇教版一年級上冊《科學》期末知識點匯總 重點知識梳理 總復習【版 】課件
- 青島版小學科學三年級下冊課程綱要
- 目標、計劃與行動課件
- 動態(tài)變形模量Evd試驗記錄
- 2020-2021學年浙江省溫州市八年級(上)期末數(shù)學試卷(附答案詳解)
- 蔬菜籽種采購清單
- 工期定額-民用建筑
- 低壓電能表安裝作業(yè)指導書
- 能見度不良時船舶航行須知
- 軟膠囊的制備
- 回風立井臨時改絞施工措施
評論
0/150
提交評論