毛片网站在线看_天堂俺去俺来也www久久婷婷_日韩av免费网站_18性欧美xxxⅹ性满足_一区二区三区韩国免费中文网站 _性xx色xx综合久久久xx_999亚洲国产精


曙海教育集團論壇Windows驅動開發專題Windows驅動開發 → 討論Windows虛擬設備驅動


  共有10360人關注過本帖樹形打印

主題:討論Windows虛擬設備驅動

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
討論Windows虛擬設備驅動  發帖心情 Post By:2010-12-17 13:38:20

摘要:討論Windows虛擬設備驅動(VXD)技術,并采用此項技術示范性地做出應用于PC串口實時通信的虛擬驅動程序,找到一種可以在PC中實現實時通信的途徑。

    關鍵詞:VXD 實時 串口通信

引言

在微軟的視窗操作系統中,系統內核掌管所有的應用程序,通過獨特的任務調度算法實現CPU的分時多任務處理方式。多任務處理對大多數用戶可能是件好事,但是對那些想把實時通信建立在Windows操作系統上的特殊用戶來說,操作界面的圖形化并不比MS-DOS的單任務更具吸引力。在視窗操作系統里可以進行實時通信和控制碼?答案是:VXD技術可以幫我們在獲取友好的人機界面的同時還擁有很強的實時性。

1 VXD技術解析

VXD技術可追溯到Windows3.1,它的引入就是要讓操作系統實現多工以及硬件資源的共享。為了支持多個MS-DOS任務同時執行,Windows98讓每個MS-DOS應用程序在各自的虛擬機(VM)上運行,各自互不相干;而所有的Widnows應用程序卻都在一個虛擬機上運行。圖1所示的結構框圖很好地說明了Windows98的整體架構。

圖1中,由眾多的VXD組成系統級代碼處于最底層。其中,處于中心地位的是一名為VMM32的VXD,它負責協調和管理所有的VXDs。其它VXDs則通過消息機制(這個消息機制由VMM32.VXD來維護)彼此聯系。由所有VXDs開放出的服務接口(API)組成了一個服務網,它們彼此通過合作的方式,提供Windows98的系統底層驅動服務。

從以上Windows98系統架構可以看出,要想在視窗平臺下獲取很強的實時性,僅靠提升應用程序線程優先級的方法是不夠的。因為Win32應用程序代碼屬于Ring3級,而VXD代碼則屬于Ring0級;采用VXD撰寫的實時通信程序可以完全不受代碼限制,可以直接對硬件進行操作。VXD的這個特點正是實時通信建立所必須的。

設計實時通信的VXD前,先解釋以下幾個問題:

①VMM32使用VPICD.VXD虛擬化每個硬件和軟件中斷。VMM32為每個虛擬機(VM)維護一個IDT結構,當中斷發生時,CPU先保護中斷現場,然后經由當前VM的IDT把這個中斷引導至相應的中斷處理程式。

中斷的虛擬化,使我們有機會給每個中斷提供新的中斷處理函數,并可以讓多個硬件共享同一個中斷號。VPICD.VXD為我們提供這些服務。

②VMM有兩個調度器,用以在多個線程和VMs之間實現搶占式多工。主調度器負責選定下一個將被執行的線程。這個選擇可以是一個,也可以是多個。然后,主調度器把選擇結果送給所謂的時間片調度器,并由后者完成各個應用程序間的時間片分配。調度器也時應用程序經由呼叫Win32線程優先調整API(如SetThreadPriority和SetPriorityClass等)做出回應。當中斷發生時,VMM32自動提升中斷處理函數所在VM之優先級,保證中斷處理函數能及時被執行。

③VXD和Win32應用程序可直接通信。Win32應用程序可通過一個系統API(DevicelOControl(…))來呼叫位于底層的VXD為其服務。在呼叫VXD前,首先必須調用CreatFile(…)這個API加載該VXD(如果該VXD是一個靜態VXD,則不用加載)。所有的呼叫動作其實都通過VMM32完成。VXD也可以通過消息方式和位于上層的Win32應用程序通信。She11.VXD為所有希望以消息機制和Win32應用程序通信的VXD提供了這一服務。

以上是編寫一個串口通信驅動需要的系統層面知識。對于Windows底層的了解。

2 用VXD實現一個實時串口通信驅動

接下來用VXD技術實現一個實時串行通信的驅動。這個VXD是一個動態(Dynamic)VXD,當它的服務被呼叫時,VMM32會動態加載這個VXD。作者采用的工具是C+98DDK。當然也可以使用其它的工具,如MASM6.11(或更高版本)、VtoolsD。用C搭配DDK完成VXD構建的好處是,可以使用C語言完成絕大部分的程序,程序比較容易閱讀和維護。

用C來實現一個VXD驅動,需要準備如下條件:一個.ASM的匯編語言接口文件(在其中定義VXD要處理的系統消息和輸出API),一個.C的函數實現文件(在其中完成自己函數實體),一個.DEF的定義文件(在其中定義VXD中各個段的別名并匯成一個DDB)和一個.MAK檔(用來編譯并連接生成VXD,可有可無)。在這里,僅給出用C實現的函數檔。至于其它的文件,可以從本文所列的參考書目或其它文獻中找到相關文檔的說明。

這個串口通信驅動程序的功能是:實時送出一個Byte的數據,實時接收一個Byte的數據。作為演示之用,并沒有加入其它代碼。該VXD驅動主要由如下3個系統消息(由VMM32來維護和管理)處理函數組成,其代碼如下:

(1)OnSysDynamicDeviceInit()函數

BOOL OnSysDynamicDeviceInit()

{ //OnSysDynamicDeviceInit

irqhandle=VPICD_Virtualize_IRQ((DWORD)(&irq4));

if(irqhandle= =0){

return FALSE;

}

return TRUE; //OnSysDynamicDeviceInit

}

該函數用來完成VXD初始化所做的工作。在本例中,由于實時監視串口中斷的需要,要給COM1的中斷安裝一個自定義的斷服務函數。98DDK已經提供了這個函數的C語言版,其原型是HIRQ static VPICD_Virtualize_IRQ(PVID pvid),在vpicd.h中。該函數需要一個指針作為參數(指向名為VPICD_IRQ_Descriptor的結構體),函數傳回一個指向該虛擬IRQ的句柄(該句柄在后來的VPICD服務中需要提供)。VPICD_IRQ_Descriptor結構體的組成為:

typedef struct VPICD_IRQ_Descriptor{

USHORT VID_IRQ_Number; //IRQ號(0~15)

USHORT VID_Options; //標志位選項

ULONG VID_Hw_Int_Proc; //硬件中斷服務程序的地址

ULONG VID_Virt_Int_Proc; //虛擬中斷服務程序

ULONG VID_Mask_Change_Proc //Mask Change調用例程

ULONG VID_IRET_Proc; //IRET調用例程

ULONG VID_IRET_Time_Out; //在Vm的進程優先級提升之前的最大等待時間

ULONG VID_Hw_Int_Ref; //硬件中斷服務程序的數據存放地址

}VID;

其中只用到三位。在本例中需要聲明一個名為irq4的全局變量為VID結構,并付給如下初值:VID irq4={4,0,hwproc,0,0,0,0,500,0},表示將要虛擬化IRQ4,改變其中斷處理函數為void hwproc(void),該函數的原型如下:

void hwproc(void){

_asm{

mov dx,0x3f8

in al,dx

mov byte ptr [readin],al

clc

}

return;

}

在這個中斷處理中,僅僅從COM1的數據寄存器(地址為3F8h)中讀取接收到的數值,并把該數值存放在一個類型為BYTE、名為readin的內存中。

(2)OnSysDynamicDeviceExit()函數

BOOL OnSysDynamicDeviceExit()

{

VPICD_Force_Default_Behavior(irqhandle);

//解除IRQ4虛擬化

return TRUE;

} //OnSysDynamicDeviceExit

該數提供了用于善后處理VXD在卸載時需要完成的事件。在本例中,和VXD初始化對應,需要解除對COM1的中斷IRQ4的虛擬化。作者也是用98DDK在vpicd.h中提供的外包函數void static_inline VPICD_Force_Default_Behavior(HIRQ hirp)。該函數唯一需要的參數便是使用VPICD_Virtualize_IRQ函數傳回的IRQ句柄。

(3)OnDeviceIoControl()函數

DWORD OnDeviceIoControl(PDIOCPARAMETERS p){

Switch (p->dwIoControlCode)

{

case 1: //端口寫功能

if(!p->lpvOutBuffer||p->cbOutBuffer<1)

{ //輸出緩存的有效性檢查

return ERROR_INVALID_PARAMETER;

}

if(serial_out((DWORD)(p->lpvInBuffer)))

{ //數據發送

*(BYTE*)(p->lpvOutBuffer)=*(BYTE*)(p->lpvInBuffer);

}

else{

*(BYTE*)(p->lpvOutBuffer)=0;

}

open_int(); //打開com1中斷

return 0;

case 2: //端口讀功能

if(*(BYTE*)reading= =0x00)

{ //數據讀入

*(BYTE*)(p->lpvOutBuffer)=0x00;

return 0;

}

*(BTYE*)(p->lpvOutBuffer)=*(BYTE*)(readin);

return 0;

}

return 0;

}

return 0;

}

OnDeviceIoControl函數用來處理Win32應用程序對VXD的呼叫。Win32應用程序的呼叫會讓VMM32送給該VXD一個系統信息,并傳遞進一個DIOCPARAMETERS結構的指針。該結構里包含Win32應用程序呼叫時傳遞進來的各個參數。這個結構的組成如下:

Typedef stunct DIOCParams{

DWORD Internall; //指向客戶寄存器的指針

DWORD VMHande; //該VM的句柄

DWORD Internal2; //指向DDB結構的指針

DWORD dwIoConrolCode; //DeviceIoControl例程中呼叫的控制碼

DWOD lpvInBuffer; //DeviceIoControl例程呼叫所傳遞進來的輸入緩沖區地址

DWORD cbInBuffer; //輸入緩沖區的大小

DWORD lpvOutBuffer; //DeviceIoControl例程呼叫所傳遞進來的輸出緩沖區地址

DWORD cbOutBuffer; //輸出緩沖區的大小

DWORD lpcbBytesReturned; //拷貝到輸出緩沖區中的字節數(可以為NULL)

DWORD lpOverlapped; //DeviceIoControl例程呼叫所傳遞進來的重疊I/O塊結構

DWORD hDevice; //Ring3層呼叫應用程序句柄

DWORD tagProcess; //例程標簽

}

DIOPARAMETERS;

其中,dwIoControlCode指明了Win32應用程序需要VXD提供的哪一項服務。在本例中采用一個switch-case語句作為服務入口,如下所示。其中服務1為讓串口送出一個字節,服務2為讀取一個已經由串口接收的字節。函數open_int()是用來初始化串口以便接收字節數據;函數BOOL serial_out(DWORD pBuffer)是讓串口發出一個字節。它們的函數體分別如下:

BOOL serial_out(DWORD pBuffer){

if(pBuffer= =NULL){

return FALSE;

}


支持(0中立(0反對(0單帖管理 | 引用 | 回復 回到頂部

返回版面帖子列表

討論Windows虛擬設備驅動








簽名
毛片网站在线看_天堂俺去俺来也www久久婷婷_日韩av免费网站_18性欧美xxxⅹ性满足_一区二区三区韩国免费中文网站 _性xx色xx综合久久久xx_999亚洲国产精
久久欧美一区二区| 亚洲美女视频一区| 国产精品美女久久久久久久久| 一区在线播放视频| 欧美日韩精品是欧美日韩精品| 国产日韩欧美在线一区| 婷婷六月综合亚洲| 色婷婷av一区二区三区软件| 久久久久久久久久久久久久久99 | 国产精品久久久久影院亚瑟| 麻豆一区二区在线| 69精品人人人人| 亚洲黄色小视频| 99在线精品观看| 欧美高清在线精品一区| 精品亚洲欧美一区| 日韩欧美一卡二卡| 日韩二区三区在线观看| 欧洲精品在线观看| 亚洲视频一区在线| 99久久精品99国产精品| 中文字幕制服丝袜一区二区三区 | 7777精品伊人久久久大香线蕉的| 91丨porny丨蝌蚪视频| 国产在线精品一区二区三区不卡| 欧美高清精品3d| 亚洲国产成人高清精品| 欧美日韩国产三级| 亚洲成人激情综合网| 亚洲高清不卡在线观看| 亚洲色图.com| 国产精品乱人伦中文| 精品区一区二区| 精品国产乱码久久久久久图片| 日韩色在线观看| 日韩欧美在线影院| 欧美成人精品3d动漫h| 日韩视频在线一区二区| 3d动漫精品啪啪一区二区竹菊| 91同城在线观看| 在线免费观看成人短视频| 成人小视频免费观看| 欧美日本在线视频| 欧美曰成人黄网| 欧美乱妇23p| 国产v综合v亚洲欧| 国产中文字幕一区| 久久久国际精品| 久久综合狠狠综合久久激情| 国产日韩精品视频一区| 福利91精品一区二区三区| 亚洲国产经典视频| 国产精品77777| 亚洲色图视频网| 在线播放中文字幕一区| 国产福利电影一区二区三区| 日本特黄久久久高潮| 蜜桃精品在线观看| 91小视频免费看| 国产丝袜美腿一区二区三区| 一区二区三区视频在线观看| 国产精品美女www爽爽爽| 亚洲精品成人在线| 国产一区 二区| 欧美日韩亚洲综合在线 | 国产成a人亚洲精| 99re成人在线| 免费观看在线综合| 国产精品欧美久久久久一区二区| 一本大道av伊人久久综合| 日欧美一区二区| 国产精品三级av| 欧美另类高清zo欧美| 波多野结衣中文字幕一区 | 欧美日韩免费在线视频| 成人高清伦理免费影院在线观看| 亚洲制服欧美中文字幕中文字幕| 精品国产自在久精品国产| 99热这里都是精品| 激情五月婷婷综合网| 亚洲综合丝袜美腿| 国产精品精品国产色婷婷| 欧美一区二区视频免费观看| 色噜噜偷拍精品综合在线| 亚洲线精品一区二区三区八戒| 国产日韩欧美精品电影三级在线| 欧美日韩视频在线观看一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美国产欧美亚州国产日韩mv天天看完整 | 亚洲婷婷在线视频| 精品国产第一区二区三区观看体验| 成人网男人的天堂| 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩久久精品一区| 日韩专区中文字幕一区二区| 日韩精品一区二区三区在线观看 | 中文字幕日韩精品一区| 天天av天天翘天天综合网色鬼国产 | 久久久久高清精品| 一区二区成人在线| 久久无码av三级| 日本成人中文字幕在线视频| 亚洲人一二三区| 91久久精品一区二区二区| 蜜臀91精品一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美日韩一区在线| 亚洲欧美综合另类在线卡通| 国产日韩v精品一区二区| 日韩精品在线一区二区| 91精品国产综合久久福利| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲精品国产无套在线观| 欧美成人三级电影在线| 91网站最新网址| 日韩精品一区第一页| 亚洲日本丝袜连裤袜办公室| 国产欧美一区在线| 日韩视频在线你懂得| 91丨porny丨首页| 日韩欧美一区二区视频| 亚洲国产视频a| 91在线国产观看| 91蝌蚪porny九色| 色综合久久久久久久| 亚洲高清视频中文字幕| 在线亚洲一区二区| 在线亚洲一区二区| 欧美片网站yy| 日韩一级欧美一级| 亚洲精品一线二线三线| 久久久久久亚洲综合影院红桃| 久久久亚洲午夜电影| 国产精品护士白丝一区av| 亚洲欧美日韩系列| 日韩成人免费电影| 国产精品亚洲а∨天堂免在线| 99天天综合性| 欧美丰满少妇xxxxx高潮对白| 日韩色在线观看| 国产精品久久毛片| 亚洲成人高清在线| 狠狠色狠狠色综合系列| 99精品国产视频| 9191久久久久久久久久久| 久久综合色天天久久综合图片| 国产亚洲福利社区一区| 亚洲色图欧洲色图| 免费不卡在线视频| 99精品欧美一区二区三区小说 | 国产在线麻豆精品观看| 91看片淫黄大片一级| 欧美一三区三区四区免费在线看| 国产亚洲欧美日韩在线一区| 一区二区三区四区av| 激情文学综合网| 欧洲精品一区二区| 久久久亚洲午夜电影| 一区二区三区产品免费精品久久75| 男男视频亚洲欧美| 91视频.com| 久久影院午夜片一区| 精品久久久久久久久久久久久久久| 久久综合给合久久狠狠狠97色69| 玉足女爽爽91| 亚洲大片在线观看| 91麻豆免费在线观看| 久久久久久久久久久久久女国产乱| 亚洲国产精品人人做人人爽| 国产成人免费视频精品含羞草妖精 | 欧美日韩aaa| 国产精品国产三级国产a| 一区二区久久久| 成人av综合在线| 精品电影一区二区| 亚洲成人动漫av| 精品黑人一区二区三区久久| 亚洲一卡二卡三卡四卡无卡久久| 欧美三区在线观看| 夜夜嗨av一区二区三区| 亚洲无线码一区二区三区| 欧美少妇xxx| 91丨porny丨国产| 成人性色生活片| 日韩精品一级二级| av福利精品导航| 久久一区二区三区四区| 偷拍一区二区三区四区| 91小视频免费看| 综合久久一区二区三区| 久久99精品久久久久久| 欧美情侣在线播放| 亚洲一区视频在线| av男人天堂一区| 精品奇米国产一区二区三区| 国产福利91精品一区二区三区| 亚洲欧洲www| 欧美影院精品一区| 久草这里只有精品视频| 亚洲天堂av一区|