ktcserver
驱动牛犊
驱动牛犊
  • 注册日期2002-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1078回复:3

为什么我编译的VXD程序虽编译出来却不能用

楼主#
更多 发布于:2002-07-21 08:39
为什么我编译的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;
}
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-07-31 08:52
??我记不得了。 :D
jlmi159
驱动牛犊
驱动牛犊
  • 注册日期2002-04-25
  • 最后登录2002-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-30 20:20
 arthurtu
      谢谢!!!!!!!!!

  “Win9x虚拟设备驱动程序编程指南 杨强 李堂秋”一书中“ 的例子 错了很多,看了你的代码,省了很多事.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-07-21 13:26
用socfice跟,看是哪句的错。
游客

返回顶部