阅读:1076回复:3
为什么我编译的VXD程序虽编译出来却不能用
为什么我编译的VXD程序虽编译出来却不能用。
我用VTOOLSD默认生成了一个VXD程序框架。在VC6下对其进行了修改。 在98DDK下我将*.mak文件改为makefile文件然后执行了nmake并生成了 *.vxd程序。但该程序在VTOOLSD下的DEBUG MONITOR 中进行调试 却显示ERROR(11):An unexpected error occurred. 我不知道这是什么意思。这是怎么回事呢? (我是编译的程序是“Win9x虚拟设备驱动程序编程指南 杨强 李堂秋”一书中“I/O设备驱动程序的编写”一章中的程序) 程序如下: // PRPOINT.h - include file for VxD PRPOINT #include <vtoolscp.h> #include <vport.h> #define DEVICE_CLASS PrintportDevice #define PRPOINT_DeviceID UNDEFINED_DEVICE_ID #define PRPOINT_Init_Order UNDEFINED_INIT_ORDER #define PRPOINT_Major 1 #define PRPOINT_Minor 0 #define COUNT 65536 struct PortStruct{ WORD wPort; WORD wVal; BOOL bInPut; }; class MyPort:public VIOPort { public: MyPort(WORD port); ~MyPort(); virtual DWORD handler(VMHANDLE, DWORD port, CLIENT_STRUCT* pRegs, DWORD iotype, DWORD outdata); static int Count; static PortStruct *pBuffer; static int Num; }; class PrintportDevice ::public VDevice { public: PrintportDevice(); virtual DWORD OnW32DeviceIOControl(PIOCTLPARAMS pDIOCParams); MyPort *p378,*p379,*p37a; }; 以下为.cpp文件 // PRPOINT.cpp - main module for VxD PRPOINT #define DEVICE_MAIN #include \"prpoint.h\" Declare_Virtual_Device(PRPOINT) #undef DEVICE_MAIN int MyPort::Count; int MyPort::Num; PortStruct *MyPort::pBuffer; MyPort::MyPort(WORD port):VIOPort(port) { if(Num==0)pBuffer=new PortStruct[COUNT]; Num++; hook(); } MyPort::~MyPort() { Num--; if(Num==0) delete pBuffer; } DWORD MyPort::handler(VMHANDLE hVM,DWORD port, CLIENT_STRUCT* pRegs,DWORD iotype,DWORD outdata) { char Data; switch(iotype) { case BYTE_INPUT: pBuffer[Count].wPort=port; Data=_inp(port); pBuffer[Count].bInPut=TRUE; if(++Count==COUNT)Count=COUNT; return Data; case BYTE_OUTPUT: pBuffer[Count].wPort=port; Data=_outp(port,outdata); pBuffer[Count].wVal=outdata; pBuffer[Count].bInPut=FALSE; if(++Count==COUNT)Count=COUNT; return Data; } } PrintportDevice::printportDevice() { p378=p379=p37a=NULL; } DWORD PrintportDevice::OnW32DeviceIOControl(PIOCTLPARAMS pDIOCParams) { int i; switch(pDIOCParams->dioc_IOCtlCode) { case DIOC_OPEN: p378= new MyPort(0x378); p378= new MyPort(0x379); p37a= new MyPort(0x37a); break; case DIOC_CLOSEHANDLE: if(p378){delete p378;p378=0;} if(p379){delete p379;p379=0;} if(p37a){delete p37a;p37a=0;} break; case 111: int size=pDIOCParams->dioc_cbOutBuf; size=MyPort::Count<size?MyPort::Count:size; memcpy(pDIOCParams->dioc_OutBuf,MyPort::pBuffer,size* sizeof(PortStruct)); *pDIOCParams->dioc_bytesret=size; break; } return 0; } |
|
沙发#
发布于:2002-07-21 13:26
用socfice跟,看是哪句的错。
|
|
板凳#
发布于:2002-07-30 20:20
arthurtu
谢谢!!!!!!!!! “Win9x虚拟设备驱动程序编程指南 杨强 李堂秋”一书中“ 的例子 错了很多,看了你的代码,省了很多事. |
|
地板#
发布于:2002-07-31 08:52
??我记不得了。 :D
|
|