?? lc_bcb_89.txt
字號:
虛擬設備驅動程序的設計與實現
虛擬設備驅動程序的設計與實現
由于Windows對系統底層操作采取了屏蔽的策略,因而對用戶而言,系統變得更為安全,但這卻給眾多的硬件或者系統軟件開發人員帶來了不小的困難,因為只要應用中涉及到底層的操作,開發人員就不得不深入到Windows的內核去編寫屬于系統級的虛擬設備驅動程序。Win
98與Win 95設備驅動程序的機理不盡相同,Win 98不僅支持與Windows
NT 5.0兼容的WDM(Win32 Driver Mode)模式驅動程序,而且還支持與Win
95兼容的虛擬設備驅動程序VxD(Virtual Device Driver)。下面介紹了基于Windows
9x平臺的虛擬環境、虛擬設備驅動程序VxD的基本原理和設計方法,并結合開發工具VToolsD給出了一個為可視電話音頻卡配套的虛擬設備驅動程序VxD的設計實例。
1.Windows 9x的虛擬環境
Windows 9x作為一個完整的32位多任務操作系統,它不像Window
3.x那樣依賴于MS-DOS,但為了保證軟件的兼容性,Windows 9x除了支持Win16應用程序和Win32應用程序之外,還得支持MS-DOS應用程序的運行。Windows
9x是通過虛擬機VM(Virtual Machine)環境來確保其兼容和多任務特性的。
所謂Windows虛擬機(通常簡稱為Windows VM)就是指執行應用程序的虛擬環境,它包括MS-DOS
VM和System VM兩種虛擬機環境。在每一個MS-DOS VM中都只運行一個MS-DOS進程,而System
VM能為所有的Windows應用程序和動態鏈接庫DLL(Dynamic Link
Libraries)提供運行環境。每個虛擬機都有獨立的地址空間、寄存器狀態、堆棧、局部描述符表、中斷表狀態和執行優先權。雖然Win16、Win32應用程序都運行在System
VM環境下,但Win16應用程序共享同一地址空間,而Win32應用程序卻有自己獨立的地址空間。
在編寫應用程序時,編程人員經常忽略虛擬環境和實環境之間的差異,一般認為虛擬環境也就是實環境。但是,在編寫虛擬設備驅動程序VxD時卻不能這樣做,因為VxD的工作是向應用程序代碼提供一個與硬件接口的環境,為每一個客戶虛擬機管理虛設備的狀態,透明地仲裁多個應用程序,同時對底層硬件進行訪問。這就是所謂虛擬化的概念。
VxD在虛擬機管理器VMM(Virtual Machine Manager)的監控下運行,而VMM實際上是一個特殊的VxD。VMM執行與系統資源有關的工作,提供虛擬機環境(能產生、調度、卸載VM)、負責調度多線程占先時間片及管理虛擬內存等工作。VxD與VMM運行在其他任何虛擬機之外,VxD事實上就是實現虛擬機的軟件的一部分。
與大多數操作系統一樣,Windows也是采用層次式體系結構。VMM和VxDs構成了Win
95的ring0級的系統核心(應用程序運行在ring3級,ring1、ring2級未被使用),具有系統的最高優先權。Windows還提供一些以"drv"為后綴名的驅動程序,主要是指串行口的通信程序和并行口的打印機程序。這些程序與VxD不同,它們是運行在ring3級上的。圖1可以使你更好地理解Windows的虛擬環境。
圖
2.深入理解VMM和VxD
如前所述,VxD是Virtual Device Driver的縮寫,但有人將它理解為虛擬任何驅動程序。實際上,VxD并非僅指那些虛擬化的某一具體硬件的設備驅動程序。比如某些VxD能夠虛擬化設備,而某些VxD作為設備驅動程序卻并不虛擬化設備,還有些VxD與設備并沒有什么關系,它僅向其他的VxD或是應用程序提供服務。
VxD可以隨VMM一起靜態加載,也可以根據需要動態加載或卸載。正是由于VxD與VMM之間的緊密協作,才使得VxD具有了應用程序所不具備的能力,諸如可以不受限制地訪問硬件設備、任意查看操作系統數據結構(如描述符表、頁表等)、訪問任何內存區域、捕獲軟件中斷、捕獲I/O端口操作和內存訪問等,甚至還可以截取硬件中斷。
盡管VxD使用32位平面存儲模式(flat memory model),但它的代碼和數據仍使用分段管理,段有六種類型,即實模式初始化、保護模式初始化、可分頁、不可分頁、靜態和只調試(debug
only),每種類型又有代碼段和數據段之分,所以VxD共有12個段。實模式代碼段和數據段為16位(分段模式),其他段則是32位(平面模式)。“實模式初始化”段包含了在Windows初始化過程的最初階段VMM變為保護模式之前要執行的代碼。靜態加載的VxD此時可以查看Windows啟動前的實模式環境,決定是否繼續加載,并通知VMM。加載完畢后,VMM進入保護模式并執行保護模式初始化代碼,同樣將執行結果再通知VMM。初始化完成后,“實模式初始化”段和“保護模式初始化”段即被遺棄。VxD的大部分代碼都在其他的某一段中,“可分頁”段允許虛擬存儲管理器(Virtual
Memory Manager)進行分頁管理,大多數的VxD代碼都應當在“可分頁”段。“不可分頁”段的內容主要包括:VxD的主入口點、硬件中斷處理函數、所訪問的數據以及能被另一個VxD中斷處理函數調用的異步服務。“靜態”段僅用于可以動態加載的VxD,當VxD卸載后,靜態代碼段和數據段都保留在內存中。“只調試”段只是VMM在Soft-ICE
for Win 95等調試環境下才將其載入。
VMM是通過VxD的設備描述符塊DDB(Device Descriptor Block)來識別的。DDB向VMM提供了VxD的主入口點,還向應用程序和其他的VxD提供了入口點。VMM利用這個主入口點將VM及Windows自身的狀態通知給VxD,然后VxD通過相應的工作來響應這些事件。由于VxD不僅僅服務于一個物理設備(比如多個串口)或僅與一個VM發生聯系,所以VxD需要產生自己支持的數據結構(Supporting
Data Structures)來保存每一個設備、每一個VM的配置和狀態信息。VxD用一個或多個設備上下文結構來保存設備信息,如I/O端口基地址、中斷向量等,VxD將自己的每個VM的狀態信息保存在VMM的VM控制塊中。
VMM提供的服務包括:事件服務、內存管理服務、兼容執行和保護模式執行的服務、登錄表服務、調度程序服務、同步服務、調試服務、I/O捕獲服務、處理錯誤和中斷服務、VM中斷和回調服務、配置管理程序服務以及其他雜項服務。
以上內容僅涉及到VxD設計的一小部分,作為VxD的開發人員必須掌握更多的知識。首先是操作系統的知識,如地址空間、執行上下文、資源加鎖、進程間通信和異步事件處理等方面的知識;其次,對Intel處理器應有較深入的理解,包括寄存器、機器指令集、保護機制、分頁機制,以及虛擬8086模式;最后,還必須熟悉VMM提供的各類服務和接口,熟悉Windows其他的系統VxD。
3.開發工具VToolsD簡介
VToolsD是專門用于開發VxD程序的一種工具軟件,它包括VxD框架代碼生成器QuickVxD、C運行庫、VMM/VxD服務庫、VxD的C++類庫、VxDLoad和VxDView等實用工具以及大量的C、C++例程。由VC++、BC++的32位編譯器編譯生成的VxD程序可以脫離VToolsD環境運行。
利用QuickVxD可以方便、快捷地生成VxD的框架,即生成后綴名為h、cpp和mak的三個文件。源文件包含了運行VxD的基本組件,其中包含控制消息處理、API入口點、以及VxD服務等函數框架,并且還定義了標志,設置了編譯參數,聲明了類,然后在C++環境下,向生成的各個處理函數體內添加自己的代碼,最后使用編譯器NMAKE生成標準的VxD程序。
由于VxD運行在ring0級,所以調試程序相當困難。我使用的調試工具是Soft-ICE
for Win 95。
目前VToolsD的最新版本為3.0,它支持設備訪問體系結構DAA(Device
Access Architecture),所編寫的程序代碼將可以在所有Windows平臺(包括Win
95、Win 98以及Windows NT)上共享。當然也可以使用Microsoft公司的DDK(Device
Developer Kit)來開發VxD,但DDK不能像VToolsD那樣通過屏蔽系統及VxD的底層技術細節提供豐富的C運行庫和C++類庫,而是讓開發人員充分享用面向對象編程方法的方便與快捷,因此僅就該點而言,使用DDK是不方便的。
4.VxD程序設計實例
我在開發可視電話音頻卡的設計過程中,用VToolsD 2.03、VC++
5.0為自制的PC/XT總線擴展卡開發了虛擬設備驅動程序Audcard.vxd。該卡每20ms申請一次中斷,中斷由應用程序動態載入系統的Audcard.vxd響應并加以處理。中斷服務程序ISR(Interrupt
Service Routine)結束后,調用函數Shell_PostMessage( )向應用程序窗口發送自定義消息。應用程序接受消息后,再通過函數DeviceIoControl(
)與VxD的接口函數OnW32DeviceIoControl( )互傳緩沖區數據。程序結束即可動態卸載VxD。下圖表示在Win
95下VxD對硬件中斷的處理過程。
圖Win95下硬件中斷的處理過程
當中斷發生時,處理器轉換為ring0級保護模式。Windows系統并不像DOS那樣通過中斷描述符表IDT(Interrupt
Descriptor Table)直接指向中斷處理過程,而是由IDT入口指向VMM中的程序。該程序將判斷是否為中斷調用,如果是,則把中斷控制權交給虛擬可編程中斷控制器VPICD(Virtual
Programmable Interrupt Controller Device),VPICD實際上是一個重要的VxD。VPICD再將其交給另一個注冊了該中斷的VxD(如Audcard.vxd)來處理。VxD程序是通過調用VPICD服務VPICD_Virtualize_IRQ來注冊中斷的。
虛擬設備驅動程序Audcard.vxd的部分源代碼Audcard.h和Audcard.cpp在網上,網址為:www.pccomputing.com.cn。此應用程序使用了下列函數:CreateFile()動態加載VxD、CloseHandle()并動態卸載VxD、PreTranslateMessage()截獲消息、DeviceIoControl()與VxD互傳緩沖區數據。虛擬設備驅動程序Audcard.vxd經調試后工作正常,未發生過任何丟失數據或死機的現象。
下面是虛擬設備驅動程序Audcard.vxd的部分源代碼Audcard.h和Audcard.cpp,限于篇幅,由QuickVxD自動生成的Audcard.mak未列出。
①Audcard.h
//AUDCARD.h - include file for VxD AUDCARD
#include
#define DEVICE_CLASS AudcardDevice
#define AUDCARD_DeviceID UNDEFINED_DEVICE_ID
#define AUDCARD_Init_Order UNDEFINED_INIT_ORDER#define AUDCARD_Major
#define AUDCARD_Minor 0
#define MY_IRQ 5 //定義5號中斷
class MyHwInt:public VHardwareInt
{
public:
MyHwInt():VHardwareInt(MY_IRQ,0,0,0){}
virtual VOID OnHardwareInt(VMHANDLE);
};
class AudcardDevice : public VDevice
{
public:
virtual BOOL OnSysDynamicDeviceInit();
virtual BOOL OnSysDynamicDeviceExit();
virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams);
MyHwInt* pMyIRQ;
};
class AudcardVM : public VVirtualMachine
{
public:
AudcardVM(VMHANDLE hVM);
};
class AudcardThread : public VThread
{
public:
AudcardThread(THREADHANDLE hThread);
};
②Audcard.cpp
//AUDCARD.cpp - main module for VxD AUDCARD
#define DEVICE_MAIN
#include "audcard.h"
Declare_Virtual_Device(AUDCARD)
#define WM_USER_POSTVXD 0x1000
//自定義消息
#undef DEVICE_MAIN
AudcardVM::AudcardVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}
AudcardThread::AudcardThread(THREADHANDLE hThread) : VThread(hThread) {}
BOOL AudcardDevice::OnSysDynamicDeviceInit() //動態加載時初始化
{
......//硬件初始化
pMyIRQ=new MyHwInt();
if(pMyIRQ&&pMyIRQ->hook()) //掛接中斷
{
pMyIRQ->physicalUnmask(); //允許中斷
return TRUE;
}
else return FALSE;
}
BOOL AudcardDevice::OnSysDynamicDeviceExit()
//動態卸載過程
{
delete pMyIRQ;
return TRUE;
}
DWORD AudcardDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
//與Win32應用程序的接口函數
{
......
}
VOID MyHwInt::OnHardwareInt(VMHANDLE hVM)
{
...... // 中斷處理
SHELL_PostMessage(AppWnd,WM_USER_POSTVXD ,0,0,0,NULL);
//向應用程序窗口發送消息
sendPhysicalEOI(); //通知VPICD中斷結束
}
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天综合日日夜夜精品|
综合中文字幕亚洲|
欧美系列日韩一区|
91社区在线播放|
99精品视频一区二区|
国产超碰在线一区|
国产精品一区二区在线看|
蜜桃av一区二区三区电影|
狠狠色狠狠色合久久伊人|
欧美96一区二区免费视频|
日本成人中文字幕|
美女网站色91|
国产成人在线视频免费播放|
国产精品2024|
成人avav在线|
欧美日韩在线免费视频|
欧美一区二区三区免费视频|
日韩午夜激情视频|
久久久久久久国产精品影院|
国产欧美视频一区二区三区|
欧美国产1区2区|
专区另类欧美日韩|
五月婷婷激情综合|
国精产品一区一区三区mba视频
|
26uuu亚洲综合色欧美|
欧美成人猛片aaaaaaa|
久久精品一级爱片|
亚洲精品视频在线观看网站|
亚洲777理论|
狠狠色狠狠色合久久伊人|
成人免费视频播放|
欧美视频三区在线播放|
日韩女同互慰一区二区|
国产精品成人午夜|
天堂影院一区二区|
成人一区在线看|
欧美色国产精品|
欧美国产国产综合|
轻轻草成人在线|
99精品偷自拍|
日韩丝袜情趣美女图片|
国产精品国产三级国产普通话99
|
一区二区三区四区五区视频在线观看
|
色欧美片视频在线观看在线视频|
在线一区二区三区四区|
337p粉嫩大胆色噜噜噜噜亚洲|
国产精品久久综合|
免费xxxx性欧美18vr|
99综合影院在线|
欧美tickle裸体挠脚心vk|
一二三区精品视频|
丰满少妇久久久久久久|
日韩一区二区在线观看视频播放|
国产日韩欧美精品电影三级在线|
亚洲.国产.中文慕字在线|
99久久99久久精品国产片果冻|
日韩一区二区三区免费看|
最近中文字幕一区二区三区|
国内久久婷婷综合|
欧美丰满少妇xxxbbb|
亚洲乱码国产乱码精品精可以看|
国产在线精品一区二区|
日韩欧美亚洲国产精品字幕久久久
|
日韩亚洲欧美在线|
午夜欧美2019年伦理|
91捆绑美女网站|
久久日韩粉嫩一区二区三区
|
蜜桃av一区二区|
欧美老年两性高潮|
亚洲高清一区二区三区|
色婷婷综合久久久久中文一区二区
|
亚洲精品v日韩精品|
av色综合久久天堂av综合|
中文字幕乱码久久午夜不卡|
国模一区二区三区白浆|
精品国产网站在线观看|
看国产成人h片视频|
欧美一区二区三区在线观看|
日韩专区欧美专区|
日韩一区二区三区高清免费看看|
天天av天天翘天天综合网色鬼国产|
色综合天天做天天爱|
亚洲欧美色一区|
一本高清dvd不卡在线观看|
亚洲欧美日韩国产手机在线|
972aa.com艺术欧美|
日韩一区欧美小说|
在线观看免费视频综合|
亚洲v日本v欧美v久久精品|
欧美乱妇一区二区三区不卡视频|
亚洲第一福利一区|
日韩欧美专区在线|
国产成人亚洲综合a∨婷婷|
欧美国产亚洲另类动漫|
97超碰欧美中文字幕|
另类欧美日韩国产在线|
精品国产精品一区二区夜夜嗨|
国产在线精品免费|
国产精品久久久久影视|
91福利在线导航|
麻豆成人久久精品二区三区红
|
欧美极品aⅴ影院|
一本色道久久加勒比精品|
午夜精品久久久久久久99水蜜桃
|
久久er99精品|
欧美国产日产图区|
91激情在线视频|
另类小说图片综合网|
日韩一区欧美一区|
91精品国产一区二区三区香蕉|
精品影院一区二区久久久|
中文字幕制服丝袜成人av
|
精品久久久久久久久久久院品网|
国产伦理精品不卡|
一区二区在线观看免费|
日韩一区二区三区在线|
成人美女在线观看|
午夜av电影一区|
欧美激情一区二区|
日韩一区二区不卡|
972aa.com艺术欧美|
精品亚洲免费视频|
亚洲在线视频网站|
日本一区二区成人|
日韩欧美色综合网站|
一本色道**综合亚洲精品蜜桃冫|
久久国产精品99精品国产|
亚洲美女在线国产|
国产亚洲精品资源在线26u|
欧美三级蜜桃2在线观看|
成人久久视频在线观看|
国内精品伊人久久久久av影院
|
欧美日韩综合不卡|
www.日韩av|
国产精品一区二区无线|
天天免费综合色|
亚洲一二三级电影|
亚洲精品欧美专区|
国产精品美女视频|
久久久综合九色合综国产精品|
欧美亚洲日本国产|
91蝌蚪porny|
av电影在线观看一区|
国产精品资源在线看|
久久国产麻豆精品|
美腿丝袜亚洲综合|
琪琪一区二区三区|
秋霞影院一区二区|
日韩极品在线观看|
午夜精品免费在线|
婷婷亚洲久悠悠色悠在线播放|
亚洲人妖av一区二区|
中文字幕一区二区三区精华液|
久久免费国产精品|
久久久久久久久久电影|
久久先锋影音av鲁色资源|
日韩欧美国产系列|
欧美成人精品二区三区99精品|
欧美一三区三区四区免费在线看|
精品视频在线免费|
在线播放日韩导航|
日韩午夜在线观看视频|
欧美成人video|
久久亚洲精华国产精华液
|
欧美视频完全免费看|
欧美日韩另类一区|
欧美一区二区三区视频在线
|
不卡一区中文字幕|
99久久久精品免费观看国产蜜|
暴力调教一区二区三区|
色视频成人在线观看免|
欧美日韩国产色站一区二区三区|
国产成人无遮挡在线视频|
亚洲图片欧美色图|
亚洲午夜久久久久久久久久久|
亚洲国产中文字幕在线视频综合|
亚洲香肠在线观看|
日本大胆欧美人术艺术动态|
国内精品伊人久久久久av一坑
|
精品福利在线导航|
中文字幕欧美国产|
亚洲欧美二区三区|
日韩极品在线观看|
福利91精品一区二区三区|
91碰在线视频|
欧美一区二区在线不卡|
国产喂奶挤奶一区二区三区|
亚洲特黄一级片|
麻豆一区二区三|
色综合久久久久综合体|
在线播放国产精品二区一二区四区|
精品福利一区二区三区免费视频|
亚洲视频免费看|
成人v精品蜜桃久久一区|
国产欧美一区二区精品仙草咪|
**网站欧美大片在线观看|
丝袜美腿亚洲色图|
国产乱一区二区|
欧美丝袜丝交足nylons|
久久精品人人做|