阅读:1182回复:1
CMOS实时中断,请教高手
我在开发windows 9x 实时时钟中断处理的过程中碰到了一个问题,恳请各位老手帮帮忙.
各源程序如下: 应用程序执行的时候,第一次总是Cannot load VxD,error=0000002(屏幕显示,程序里加的) 再执行时就蓝屏. 如果打开SOFTICE,它就回抱告错误: RTCLOCK:Failed to virtualize hardware int Break due to page Fault (0Eh). Fault=002 MSR LastExceptionFromIp=C17D9750 MSR LastExceptionToIp=C0071450 我看过了,是physicalUnmask()函数那地方. 请问这个问题如何解决. // RTCLOCK.h - include file for VxD RTCLOCK #include <vtoolscp.h> #define DEVICE_CLASS RtclockDevice #define RTCLOCK_DeviceID UNDEFINED_DEVICE_ID #define RTCLOCK_Init_Order UNDEFINED_INIT_ORDER #define RTCLOCK_Major 1 #define RTCLOCK_Minor 0 #define IRQ_NUM 8 class RtInt : public VHardwareInt { public: RtInt() : VHardwareInt(IRQ_NUM,0,0,0){}; virtual void OnHardwareInt(VMHANDLE); }; class RtclockDevice : public VDevice { public: virtual BOOL OnSysDynamicDeviceInit(); virtual BOOL OnSysDynamicDeviceExit(); virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams); }; // RTCLOCK.cpp - main module for VxD RTCLOCK #define DEVICE_MAIN #include \"rtclock.h\" #include \"vsd.h\" Declare_Virtual_Device(RTCLOCK) #undef DEVICE_MAIN #define DIOC_ADD CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS) RtInt *pRtInt; PVOID CallBackApc=0; THREADHANDLE TheThread=0; int x=0,y=0; unsigned char b; void RtInt::OnHardwareInt(VMHANDLE hVM) { // _outp(0x70,0x0a); // _outp(0x71,0x26); _outp(0x70,0x0c); _inp(0x71); x++; if(x>=1024) { x=0; y++; VWIN32_QueueUserApc(CallBackApc,(DWORD)&y,TheThread); VSD_Bell(); } sendPhysicalEOI(); } BOOL RtclockDevice::OnSysDynamicDeviceInit() { pRtInt = new RtInt(); if(!pRtInt || pRtInt->hook()) return FALSE; _outp(0x70,0x0b); b = _inp(0x71); _outp(0x70,0x0b); _outp(0x71,0x40 | b); pRtInt->physicalUnmask(); return TRUE; } BOOL RtclockDevice::OnSysDynamicDeviceExit() { _outp(0x70,0x0b); _outp(0x71,b); if(pRtInt) delete pRtInt; return TRUE; } DWORD RtclockDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams) { switch(pDIOCParams->dioc_IOCtlCode) { case DIOC_OPEN: return 0; case DIOC_CLOSEHANDLE: return 0; case DIOC_ADD: CallBackApc=pDIOCParams->dioc_InBuf; TheThread=Get_Cur_Thread_Handle(); return 0; default: return -1; } return 0; } #include <stdio.h> #include <windows.h> #include <winioctl.h> #define DIOC_ADD CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS) DWORD WINAPI CallBackApc(PVOID param) { printf(\"%d\\n\",*(int *)param); return 0; } void main() { HANDLE hDevice; hDevice = CreateFile(\"\\\\\\\\.\\\\Rtclock.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); if(hDevice==INVALID_HANDLE_VALUE) { fprintf(stderr,\"Cannot load VxD,error=%08ld\\n\",GetLastError()); exit(1); } if(!DeviceIoControl(hDevice,DIOC_ADD,CallBackApc,0,0,0,0,0)) { fprintf(stderr,\"failed to ADDRESSPASS\\n\"); exit(1); } printf(\"press ctrl-c to exit... ...\\n\"); while(TRUE) SleepEx(INFINITE,TRUE); CloseHandle(hDevice); } |
|
沙发#
发布于:2002-10-22 19:05
用OPEN_EXISTING,不用CREATE_NEW |
|