




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精品文檔-下載后可編輯Windows98下硬件中斷虛擬設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)
美國(guó)微軟公司出品的Windows98以其友好的圖形用戶(hù)界面,在我國(guó)贏得了廣泛的市場(chǎng)。在給廣大辦公環(huán)境工作人員帶來(lái)方便的同時(shí),也給不少工程技術(shù)人員帶來(lái)了一些麻煩。一些原本在DOS下很容易編出的控制硬件的程序,現(xiàn)在在Windows98下就不那么容易實(shí)現(xiàn)了。作為一個(gè)完善的操作系統(tǒng)也必須能控制硬件,象DOS那樣直接與硬件打交道是Windows98不提倡的。它需要開(kāi)發(fā)專(zhuān)門(mén)的硬件設(shè)備驅(qū)動(dòng)程序,即通過(guò)一系列的虛擬設(shè)備驅(qū)動(dòng)程序來(lái)管理硬件,如:進(jìn)行中斷響應(yīng)、I/O端口讀寫(xiě)或直接存儲(chǔ)器存取(DMA)。Windows98內(nèi)核管理機(jī)制非常復(fù)雜,因而編寫(xiě)虛擬驅(qū)動(dòng)程序也變得十分困難,要想編寫(xiě)虛擬驅(qū)動(dòng)程序,就必須對(duì)Windows98的內(nèi)核有所了解。
1Windows98的內(nèi)核管理機(jī)制
在Windows95三年后推出的Windows98雖然擴(kuò)充了許多新的設(shè)備驅(qū)動(dòng)特性,如對(duì)AGP、USB、DVD的支持,但在內(nèi)核上卻和Windows95基本一樣,它們都是基于DOS內(nèi)核的操作系統(tǒng)。Windows98系統(tǒng)(Kernel)由虛擬機(jī)管理器(VMM)和VxD(VirtualDeviceDriver)的集合組成。Kernel提供了900多個(gè)服務(wù)函數(shù)來(lái)管理內(nèi)存、控制物理設(shè)備、處理中斷、創(chuàng)建網(wǎng)絡(luò)協(xié)議棧、管理文件系統(tǒng)等,這些服務(wù)函數(shù)都可以被自己寫(xiě)的VxD調(diào)用。虛擬機(jī)(VM)是一個(gè)可運(yùn)行的任務(wù),包含應(yīng)用程序、支撐軟件、內(nèi)存和CPU寄存器。在Windows98下有系統(tǒng)虛擬機(jī)和DOS虛擬機(jī)兩種。虛擬機(jī)管理器(VMM)是在系統(tǒng)級(jí)運(yùn)行的32位保護(hù)模式操作系統(tǒng),它運(yùn)行于Ring0,而且不可重入。VMM主要功能是創(chuàng)建、運(yùn)行、監(jiān)控和終止虛擬機(jī)。VxD即虛擬設(shè)備驅(qū)動(dòng)程序,是用來(lái)擴(kuò)展Windows操作系統(tǒng)功能的一類(lèi)程序。由于VxD運(yùn)行在系統(tǒng)的Ring0級(jí),擁有與操作系統(tǒng)同等的級(jí)別,所以我們可利用它來(lái)支持硬件設(shè)備的管理。虛擬可編程中斷控制器(VPICD)是負(fù)責(zé)管理所有硬件中斷事件的程序,它本身也是一種VxD,能提供缺省的中斷處理函數(shù)或者允許其它VxD重載中斷處理函數(shù)。
2Windows98下應(yīng)用程序權(quán)限級(jí)別
Intel的80x86CPU系列芯片可在三種模式下工作:實(shí)模式、保護(hù)模式和V86模式。實(shí)模式是MS-DOS的運(yùn)行環(huán)境。Windows98只利用了兩種模式:保護(hù)模式和V86模式。保護(hù)模式給我們帶來(lái)很多優(yōu)越性,如應(yīng)用程序不再受1M內(nèi)存的限制,理論上,在保護(hù)模式下,CPU可以進(jìn)行4096M內(nèi)存的尋址。但在保護(hù)模式下,所有的應(yīng)用程序都有權(quán)限級(jí)別(PrivilegeLevel)。權(quán)限級(jí)別按優(yōu)先次序分為四等:0、1、2、3。0級(jí)是別,操作系統(tǒng)就運(yùn)行在0級(jí),運(yùn)行在Ring0級(jí)的應(yīng)用程序可以執(zhí)行所有的指令并可直接對(duì)硬件、中斷和文件系統(tǒng)進(jìn)行物理訪(fǎng)問(wèn)。如果應(yīng)用程序擁有的權(quán)限級(jí)別是第3級(jí),那么它能執(zhí)行的指令是有限的,對(duì)硬件的很多直接操作是不能實(shí)現(xiàn)的。在Windows中,一般的應(yīng)用程序是運(yùn)行在Ring3級(jí)的(如用VisualC++、BorlandC++、VisualBasic、Delphi、C++Builder等SDK工具開(kāi)發(fā)出的應(yīng)用程序)。它們享有的權(quán)限是的,受到了保護(hù)模式的摫;它們沒(méi)有權(quán)限去繞過(guò)操作系統(tǒng)直接對(duì)硬件操作。
有了權(quán)限級(jí)別,操作系統(tǒng)就有機(jī)會(huì)在中斷和I/O操作上產(chǎn)生撔檳鈹效果。由于操作系統(tǒng)的權(quán)限為0級(jí),它就可以捕獲權(quán)限不為0級(jí)的應(yīng)用程序的中斷和I/O請(qǐng)求,然后建立緩沖隊(duì)列,再一一進(jìn)行串行處理。為了使自己的應(yīng)用程序也能直接處理硬件,就需要編寫(xiě)專(zhuān)門(mén)的VxD。由于VxD是作為操作系統(tǒng)的組件運(yùn)行于第0級(jí),因而可以利用它來(lái)捕獲特定的硬件操作,完成我們需要的任務(wù)。
3Windows98下虛擬設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)工具和基本編程方法
微軟為驅(qū)動(dòng)程序的開(kāi)發(fā)提供了設(shè)備驅(qū)動(dòng)程序工具箱(DDK),基于匯編語(yǔ)言的編程方式和許多VMM服務(wù)都使用寄存器的調(diào)用方式,確實(shí)非常難學(xué),沒(méi)有深厚的匯編語(yǔ)言和硬件基礎(chǔ)很難在短時(shí)間里開(kāi)發(fā)出自己的VxD。
程序員可利用C或C++語(yǔ)言編寫(xiě)自己的VxD,而不必操心許多繁瑣的細(xì)節(jié)。它的基本編程方法是:用VToolsD自帶的QuickVxD程序快速生成程序框架,在VC++或BorlandC++中打開(kāi)此框架的工程文件,并寫(xiě)進(jìn)特定的處理代碼,編譯后就可得到所需的VxD文件。
4一個(gè)中斷程序?qū)嵗?/p>
用VToolsD2.03、VC++5.0為自制的PC/XT總線(xiàn)擴(kuò)展卡開(kāi)發(fā)了虛擬設(shè)備驅(qū)動(dòng)程序Audcard.d。該卡每20ms申請(qǐng)中斷,中斷由應(yīng)用程序動(dòng)態(tài)載入系統(tǒng)的Audcard.d響應(yīng)并加以處理。中斷服務(wù)程序ISR(InterruptServiceRoutine)結(jié)束后,調(diào)用函數(shù)Shell_PostMessage()向應(yīng)用程序窗口發(fā)送自定義消息。應(yīng)用程序接受消息后,再通過(guò)函數(shù)DeviceIoControl()與VxD的接口函數(shù)OnW32DeviceIoControl()互傳緩沖區(qū)數(shù)據(jù)。程序結(jié)束即可動(dòng)態(tài)卸載VxD。
當(dāng)中斷發(fā)生時(shí),處理器轉(zhuǎn)換為ring0級(jí)保護(hù)模式。Windows系統(tǒng)并不像DOS那樣通過(guò)中斷描述符表IDT(InterruptDescriptorTable)直接指向中斷處理過(guò)程,而是由IDT入口指向VMM中的程序。該程序?qū)⑴袛嗍欠駷橹袛嗾{(diào)用,如果是,則把中斷控制權(quán)交給虛擬可編程中斷控制器VPICD(VirtualProgrammableInterruptControllerDevice),VPICD實(shí)際上是一個(gè)重要的VxD。VPICD再將其交給另一個(gè)注冊(cè)了該中斷的VxD(如Audcard.d)來(lái)處理。VxD程序是通過(guò)調(diào)用VPICD服務(wù)VPICD_Virtualize_IRQ來(lái)注冊(cè)中斷的。
虛擬設(shè)備驅(qū)動(dòng)程序Audcard.d的部分源代碼Audcard.h和Audcard.cpp在網(wǎng)上,此應(yīng)用程序使用了下列函數(shù):CreateFile()動(dòng)態(tài)加載VxD、CloseHandle()并動(dòng)態(tài)卸載VxD、PreTranslateMessage()截獲消息、DeviceIoControl()與VxD互傳緩沖區(qū)數(shù)據(jù)。虛擬設(shè)備驅(qū)動(dòng)程序Audcard.d經(jīng)調(diào)試后工作正常,未發(fā)生過(guò)任何丟失數(shù)據(jù)或死機(jī)的現(xiàn)象。
下面是虛擬設(shè)備驅(qū)動(dòng)程序Audcard.d的部分源代碼Audcard.h和Audcard.cpp,限于篇幅,由QuickVxD自動(dòng)生成的Audcard.mak未列出。
①Audcard.h
//AUDCARD.h-includefileforVxDAUDCARD
#include
#defineDEVICE_CLASSAudcardDevice
#define
AUDCARD_DeviceIDUNDEFINED_DEVICE_ID
#defineAUDCARD_Init_Order
UNDEFINED_INIT_ORDER#defineAUDCARD_Major
#defineAUDCARD_Minor0
#defineMY_IRQ5//定義5號(hào)中斷
classMyHwInt:publicVHardwareInt
{
public:
MyHwInt():VHardwareInt(MY_IRQ,0,0,0){}
virtualVOIDOnHardwareInt(VMHANDLE);
};
classAudcardDevice:
publicVDevice
{
public:
virtualBOOL
OnSysDynamicDeviceInit();
virtualBOOLOnSysDynamicDeviceExit();
virtualDWORDOnW32DeviceIoControl(PIOCTLPARAMSpDIOCParams);
MyHwInt*pMyIRQ;
};
classAudcardVM:public
VVirtualMachine
{
public:
AudcardVM(VMHANDLEhVM);
};
classAudcardThread:publicVThread
{
public:
AudcardThread(THREADHANDLEhThread);
};
②Audcard.cpp
//AUDCARD.cpp-mainmoduleforVxDAUDCARD
#defineDEVICE_MAIN
#include"audcard.h"
Declare_Virtual_Device(AUDCARD)
#defineWM_USER_POSTD
0x1000
//自定義消息
#undefDEVICE_MAIN
AudcardVM::AudcardVM(VMHANDLEhVM):VVirtualMachine(hVM){}
AudcardThread::AudcardThread(THREADHANDLEhThread):
VThread(hThread){}
BOOLAudcardDevice::OnSysDynamicDeviceInit()
//動(dòng)態(tài)加載時(shí)初始化
{
……//硬件初始化
pMyIRQ=newMyHwInt();
if(pMyIRQpMyIRQ-hook())//掛接中斷
{
pMyIRQ-physicalUnmask();//允許中斷
returnTRUE;
}
elsereturnFALSE;
}
BOOL
AudcardDevice::OnSysDynamicDeviceExit()
//動(dòng)態(tài)卸載過(guò)程
{
deletepMyIRQ;
returnTRUE;
}
DWORD
AudcardDevice::OnW32DeviceIoControl(PIOCTLPARAMSpDIOCParams)
//與Win32應(yīng)用程序的接口函數(shù)
{
……
}
VOID
MyHwInt::OnHardwareInt(VMHANDLEhVM)
{
……//中斷處理
SHELL_PostMessage(AppWnd,WM_USER_POSTD,0,0,0,NULL);
//向應(yīng)用程序窗口發(fā)送消息
sendPhysicalEOI();//通知VPICD中斷結(jié)束
}
用VToolsD2.03、VC++5.0為自制的PC/XT總線(xiàn)擴(kuò)展卡開(kāi)發(fā)了虛擬設(shè)備驅(qū)動(dòng)程序Audcard.d。該卡每20ms申請(qǐng)中斷,中斷由應(yīng)用程序動(dòng)態(tài)載入系統(tǒng)的Audcard.d響應(yīng)并加以處理。中斷服務(wù)程序ISR(InterruptServiceRoutine)結(jié)束后,調(diào)用函數(shù)Shell_PostMessage()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 家用紡織品的市場(chǎng)定位與品牌塑造考核試卷
- 危險(xiǎn)品包裝材料生物降解性能研究考核試卷
- 飼料中天然抗氧化劑的應(yīng)用研究考核試卷
- 釣魚(yú)達(dá)人測(cè)試題及答案
- 體育賽事直播數(shù)據(jù)分析與內(nèi)容優(yōu)化策略考核試卷
- 景區(qū)夜游面試題及答案
- 雅安國(guó)企考試試題及答案
- 湖南省長(zhǎng)沙市岳麓實(shí)驗(yàn)中學(xué)2024-2025學(xué)年高二下學(xué)期6月月考?xì)v史試卷
- 2025年北京市中考物理試題(原卷版)
- 校園歷史文化主題征文實(shí)施方案
- 廣東藥科大學(xué) 作業(yè)紙 GDPU廣藥
- 成套設(shè)備電氣技術(shù)要求
- 《HSK標(biāo)準(zhǔn)教程3》第5課課件
- 2020年12月9日湖北武漢黃陂區(qū)社區(qū)干事招聘筆試試題
- 戰(zhàn)術(shù)基礎(chǔ)動(dòng)作教案
- 公益協(xié)會(huì)財(cái)務(wù)管理制度3篇-2023修改整理
- 高中英語(yǔ)3500單詞(表格)只有中文
- 公司理財(cái)-羅斯(完整版)
- 改變觀念提高效率課件
- 立責(zé)于心履責(zé)于行全面落實(shí)企業(yè)安全生產(chǎn)主體責(zé)任課件
- 醫(yī)療垃圾廢物處理課件
評(píng)論
0/150
提交評(píng)論