luoxiaolin
驱动牛犊
驱动牛犊
  • 注册日期2002-05-25
  • 最后登录2003-05-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1182回复:1

CMOS实时中断,请教高手

楼主#
更多 发布于:2002-10-22 15:39
我在开发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);
}

arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-10-22 19:05

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);
}
 

用OPEN_EXISTING,不用CREATE_NEW
游客

返回顶部