Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > 虚拟设备驱动程序的设计与实现
全文

虚拟设备驱动程序的设计与实现

2004-11-05 00:08 作者: 陈国友 出处: 中国操作系统支持 责任编辑:方舟
  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-$#@62;hook()) //挂接中断
  {
  pMyIRQ-$#@62;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中断结束
  }
共2页。 9 7 1 2
网友关注
最新上市
编辑推荐
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml