阅读:1216回复:3
为什么我的vxd hook不上中断8
我试验写一个处理中断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中没有任何失败, 请各位大虾给指条明路,或者给点代码 在下这里先谢了 |
|
沙发#
发布于:2004-02-09 17:57
在HwintDevice::OnSysDynamicDeviceInit()中要对cmos时钟硬件设置,允许周期中断;在HwintDevice::OnSysDynamicDeviceExit()中禁止周期中断。
|
|
板凳#
发布于:2004-02-09 19:35
用VSharedHardwareInt
|
|
地板#
发布于:2004-08-27 15:37
用VSharedHardwareInt 英雄呀~~~~~~~ |
|