Windows98下硬件中斷虛擬設備驅(qū)動程序的開發(fā)_第1頁
Windows98下硬件中斷虛擬設備驅(qū)動程序的開發(fā)_第2頁
Windows98下硬件中斷虛擬設備驅(qū)動程序的開發(fā)_第3頁
Windows98下硬件中斷虛擬設備驅(qū)動程序的開發(fā)_第4頁
Windows98下硬件中斷虛擬設備驅(qū)動程序的開發(fā)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

精品文檔-下載后可編輯Windows98下硬件中斷虛擬設備驅(qū)動程序的開發(fā)

美國微軟公司出品的Windows98以其友好的圖形用戶界面,在我國贏得了廣泛的市場。在給廣大辦公環(huán)境工作人員帶來方便的同時,也給不少工程技術(shù)人員帶來了一些麻煩。一些原本在DOS下很容易編出的控制硬件的程序,現(xiàn)在在Windows98下就不那么容易實現(xiàn)了。作為一個完善的操作系統(tǒng)也必須能控制硬件,象DOS那樣直接與硬件打交道是Windows98不提倡的。它需要開發(fā)專門的硬件設備驅(qū)動程序,即通過一系列的虛擬設備驅(qū)動程序來管理硬件,如:進行中斷響應、I/O端口讀寫或直接存儲器存?。―MA)。Windows98內(nèi)核管理機制非常復雜,因而編寫虛擬驅(qū)動程序也變得十分困難,要想編寫虛擬驅(qū)動程序,就必須對Windows98的內(nèi)核有所了解。

1Windows98的內(nèi)核管理機制

在Windows95三年后推出的Windows98雖然擴充了許多新的設備驅(qū)動特性,如對AGP、USB、DVD的支持,但在內(nèi)核上卻和Windows95基本一樣,它們都是基于DOS內(nèi)核的操作系統(tǒng)。Windows98系統(tǒng)(Kernel)由虛擬機管理器(VMM)和VxD(VirtualDeviceDriver)的集合組成。Kernel提供了900多個服務函數(shù)來管理內(nèi)存、控制物理設備、處理中斷、創(chuàng)建網(wǎng)絡協(xié)議棧、管理文件系統(tǒng)等,這些服務函數(shù)都可以被自己寫的VxD調(diào)用。虛擬機(VM)是一個可運行的任務,包含應用程序、支撐軟件、內(nèi)存和CPU寄存器。在Windows98下有系統(tǒng)虛擬機和DOS虛擬機兩種。虛擬機管理器(VMM)是在系統(tǒng)級運行的32位保護模式操作系統(tǒng),它運行于Ring0,而且不可重入。VMM主要功能是創(chuàng)建、運行、監(jiān)控和終止虛擬機。VxD即虛擬設備驅(qū)動程序,是用來擴展Windows操作系統(tǒng)功能的一類程序。由于VxD運行在系統(tǒng)的Ring0級,擁有與操作系統(tǒng)同等的級別,所以我們可利用它來支持硬件設備的管理。虛擬可編程中斷控制器(VPICD)是負責管理所有硬件中斷事件的程序,它本身也是一種VxD,能提供缺省的中斷處理函數(shù)或者允許其它VxD重載中斷處理函數(shù)。

2Windows98下應用程序權(quán)限級別

Intel的80x86CPU系列芯片可在三種模式下工作:實模式、保護模式和V86模式。實模式是MS-DOS的運行環(huán)境。Windows98只利用了兩種模式:保護模式和V86模式。保護模式給我們帶來很多優(yōu)越性,如應用程序不再受1M內(nèi)存的限制,理論上,在保護模式下,CPU可以進行4096M內(nèi)存的尋址。但在保護模式下,所有的應用程序都有權(quán)限級別(PrivilegeLevel)。權(quán)限級別按優(yōu)先次序分為四等:0、1、2、3。0級是別,操作系統(tǒng)就運行在0級,運行在Ring0級的應用程序可以執(zhí)行所有的指令并可直接對硬件、中斷和文件系統(tǒng)進行物理訪問。如果應用程序擁有的權(quán)限級別是第3級,那么它能執(zhí)行的指令是有限的,對硬件的很多直接操作是不能實現(xiàn)的。在Windows中,一般的應用程序是運行在Ring3級的(如用VisualC++、BorlandC++、VisualBasic、Delphi、C++Builder等SDK工具開發(fā)出的應用程序)。它們享有的權(quán)限是的,受到了保護模式的摫;它們沒有權(quán)限去繞過操作系統(tǒng)直接對硬件操作。

有了權(quán)限級別,操作系統(tǒng)就有機會在中斷和I/O操作上產(chǎn)生撔檳鈹效果。由于操作系統(tǒng)的權(quán)限為0級,它就可以捕獲權(quán)限不為0級的應用程序的中斷和I/O請求,然后建立緩沖隊列,再一一進行串行處理。為了使自己的應用程序也能直接處理硬件,就需要編寫專門的VxD。由于VxD是作為操作系統(tǒng)的組件運行于第0級,因而可以利用它來捕獲特定的硬件操作,完成我們需要的任務。

3Windows98下虛擬設備驅(qū)動程序的開發(fā)工具和基本編程方法

微軟為驅(qū)動程序的開發(fā)提供了設備驅(qū)動程序工具箱(DDK),基于匯編語言的編程方式和許多VMM服務都使用寄存器的調(diào)用方式,確實非常難學,沒有深厚的匯編語言和硬件基礎很難在短時間里開發(fā)出自己的VxD。

程序員可利用C或C++語言編寫自己的VxD,而不必操心許多繁瑣的細節(jié)。它的基本編程方法是:用VToolsD自帶的QuickVxD程序快速生成程序框架,在VC++或BorlandC++中打開此框架的工程文件,并寫進特定的處理代碼,編譯后就可得到所需的VxD文件。

4一個中斷程序?qū)嵗?/p>

用VToolsD2.03、VC++5.0為自制的PC/XT總線擴展卡開發(fā)了虛擬設備驅(qū)動程序Audcard.d。該卡每20ms申請中斷,中斷由應用程序動態(tài)載入系統(tǒng)的Audcard.d響應并加以處理。中斷服務程序ISR(InterruptServiceRoutine)結(jié)束后,調(diào)用函數(shù)Shell_PostMessage()向應用程序窗口發(fā)送自定義消息。應用程序接受消息后,再通過函數(shù)DeviceIoControl()與VxD的接口函數(shù)OnW32DeviceIoControl()互傳緩沖區(qū)數(shù)據(jù)。程序結(jié)束即可動態(tài)卸載VxD。

當中斷發(fā)生時,處理器轉(zhuǎn)換為ring0級保護模式。Windows系統(tǒng)并不像DOS那樣通過中斷描述符表IDT(InterruptDescriptorTable)直接指向中斷處理過程,而是由IDT入口指向VMM中的程序。該程序?qū)⑴袛嗍欠駷橹袛嗾{(diào)用,如果是,則把中斷控制權(quán)交給虛擬可編程中斷控制器VPICD(VirtualProgrammableInterruptControllerDevice),VPICD實際上是一個重要的VxD。VPICD再將其交給另一個注冊了該中斷的VxD(如Audcard.d)來處理。VxD程序是通過調(diào)用VPICD服務VPICD_Virtualize_IRQ來注冊中斷的。

虛擬設備驅(qū)動程序Audcard.d的部分源代碼Audcard.h和Audcard.cpp在網(wǎng)上,此應用程序使用了下列函數(shù):CreateFile()動態(tài)加載VxD、CloseHandle()并動態(tài)卸載VxD、PreTranslateMessage()截獲消息、DeviceIoControl()與VxD互傳緩沖區(qū)數(shù)據(jù)。虛擬設備驅(qū)動程序Audcard.d經(jīng)調(diào)試后工作正常,未發(fā)生過任何丟失數(shù)據(jù)或死機的現(xiàn)象。

下面是虛擬設備驅(qū)動程序Audcard.d的部分源代碼Audcard.h和Audcard.cpp,限于篇幅,由QuickVxD自動生成的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號中斷

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()

//動態(tài)加載時初始化

{

……//硬件初始化

pMyIRQ=newMyHwInt();

if(pMyIRQpMyIRQ-hook())//掛接中斷

{

pMyIRQ-physicalUnmask();//允許中斷

returnTRUE;

}

elsereturnFALSE;

}

BOOL

AudcardDevice::OnSysDynamicDeviceExit()

//動態(tài)卸載過程

{

deletepMyIRQ;

returnTRUE;

}

DWORD

AudcardDevice::OnW32DeviceIoControl(PIOCTLPARAMSpDIOCParams)

//與Win32應用程序的接口函數(shù)

{

……

}

VOID

MyHwInt::OnHardwareInt(VMHANDLEhVM)

{

……//中斷處理

SHELL_PostMessage(AppWnd,WM_USER_POSTD,0,0,0,NULL);

//向應用程序窗口發(fā)送消息

sendPhysicalEOI();//通知VPICD中斷結(jié)束

}

用VToolsD2.03、VC++5.0為自制的PC/XT總線擴展卡開發(fā)了虛擬設備驅(qū)動程序Audcard.d。該卡每20ms申請中斷,中斷由應用程序動態(tài)載入系統(tǒng)的Audcard.d響應并加以處理。中斷服務程序ISR(InterruptServiceRoutine)結(jié)束后,調(diào)用函數(shù)Shell_PostMessage()

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論