描述:
我试验写一个处理中断8的vxd
win98+vtoolds3+vc6
头文件:
#define HWINT_DeviceID 0xAAAA//随便写了个比较大的应该没冲突
#define HWINT_Init_Order UNDEFINED_INIT_ORDER
#define HWINT_Major 1
#define HWINT_Minor 0
#define RTCIRQ 8//就是中断8(时钟中断)
class HwInt:public VHardwareInt
{
public:
HwInt():VHardwareInt(RTCIRQ,0,0,0){}
virtual VOID OnHardwareInt(VMHANDLE);
};
class HwintDevice : public VDevice
{
public:
virtual BOOL OnSysDynamicDeviceInit();
virtual BOOL OnSysDynamicDeviceExit();
virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams);
HwInt *phwint;
};
以下是源文件:
... ...
DWORD val;//这个用于存储计数
BOOL HwintDevice::OnSysDynamicDeviceInit()
{
val=0;//再普通不过的代码了
phwint=new HwInt();//这里成功了
if (phwint)
{
if (phwint->hook())//这里也成功了
{
phwint->physicalUnmask();
return TRUE;
}
else
{
return false;
}
}
else
{
return false;
}
}//总之,这里没返回过任何错误
VOID HwInt::OnHardwareInt(VMHANDLE hVM)
{
val++;//什么也不干,就是计数器+1,可是却一向都是0
sendPhysicalEOI();
}
DWORD HwintDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
char * pbufout;
... ...
switch (pDIOCParams->dioc_IOCtlCode)
{
... ...
case 0xff:
DWORD* pval;
pval=&val;
pbufout=(char *)pDIOCParams->dioc_OutBuf;
memcpy(pbufout,pval,4);//就是这里无论如何都是0
break;
}
return 0;
}
表面上看好像没什么问题,可计数器的数值就是为0,好像从来也发生多中断8,或者发生过却从没调用过OnHardwareInt(那不就是没hook上去),郁闷中...
由于用Debug Monitor调试,我在代码中加了许多dout<<,调试信息说明OnSysDynamicDeviceInit中没有任何失败,
请各位大虾给指条明路,或者给点代码
在下这里先谢了