rjxie
驱动牛犊
驱动牛犊
  • 注册日期2002-03-17
  • 最后登录2002-04-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1352回复:1

与vxdwin32通信问题求救

楼主#
更多 发布于:2002-04-05 21:34
如下intvxd.cpp是采用中断的数据采集的vxd程序,我想采用vxd与win32通信的win事件进行通信,
程序如下,运行后出现跳出softice 的page faults,如何解决?多谢了(用win事件编写的)

//////intvxd.cpp//vxd 部分
unsigned short  * sample;
VOID MyHwInt::OnHardwareInt(VMHANDLE hVM)
{
.......//定时操作
if(Flag==FALSE) {sendPhysicalEOI();return;}
.....//数据处理:
 sendPhysicalEOI();
 if(hEventToNotifyApp)
  _VWIN32_SetWin32Event(hEventToNotifyApp);
}

BOOL ClockDevice::OnSysDynamicDeviceInit()
{
    pMyIRQ=new MyHwInt();
// *pVal=0;
 if(pMyIRQ && pMyIRQ->hook())
..........
pMyIRQ->physicalUnmask();
  return TRUE;
 }
 else return FALSE;
}

BOOL ClockDevice::OnSysDynamicDeviceExit()
{
................//操作
if(hEventToNotifyApp)
  _VWIN32_CloseVxDHandle(hEventToNotifyApp);
 return TRUE;
}

DWORD ClockDevice::OnW32DeviceIoControl(PIOCTLPARAMS ps)
{
  switch (ps->dioc_IOCtlCode)
 {
 case DIOC_OPEN:
 // return 0;
 case DIOC_CLOSEHANDLE:
  return 0;

 case W32IF_PASS_FINE:
    hEventToNotifyApp=*(HANDLE *)ps->dioc_InBuf;
     handle_vm=ps->dioc_hvm;
     if(!PageAllocate(1,PG_VM,handle_vm,NULL,NULL,NULL,NULL,PAGELOCKED,&hMem,&LinAddr))
        return FALSE;
    sample_sd=(unsigned short*) LinAddr;
        ((int*)(ps->dioc_OutBuf))[0]=(int)sample_sd;//sample_sd is collected data;
   *ps->dioc_bytesret=sizeof(int);
   Flag=TRUE;
   return 0;

 default:
   return -1;
 }
}

//////应用程序部分///////app.cpp

HANDLE hDevice;
unsigned short* BufferAddr;DWORD n;
//PVOID RetInf=0;
int i;
  
DWORD WINAPI SecondThread(PVOID hEventRing3)
{
while(TRUE) {
WaitForSingleObject(hEventRing3,INFINITE);
DeviceIoControl(hDevice,W32IF_PASS_FINE,0,0,&BufferAddr,sizeof(BufferAddr),0,0);
                    printf(\"%d\\n\",BufferAddr[1]);
}
return 0;
}

void main()
{
// //PDWORD pVal=(PDWORD)0x9fffc;
HANDLE hEventRing3,hEventToNotifyApp;
HMODULE hKernel32Dll;
DWORD tid;

HANDLE (WINAPI *pfOpenVxDHandle)(HANDLE);
hEventRing3=CreateEvent(0,FALSE,FALSE,NULL);
if (!hEventRing3) {
     fprintf(stderr,\"Failed to create event3...\\n\");
exit(1);
}
hKernel32Dll=LoadLibrary(\"kernel32.dll\");
if (!hKernel32Dll) {
     fprintf(stderr, \"Failed to load...\\n\");
exit(1);
}
pfOpenVxDHandle=(HANDLE(WINAPI *)(HANDLE))GetProcAddress(hKernel32Dll,\"OpenVxDHandle\");
if (!pfOpenVxDHandle) {
     fprintf(stderr, \"Failed to get...\\n\");
exit(1);
}
hEventToNotifyApp=(HANDLE)(*pfOpenVxDHandle)(hEventRing3);
if (!hEventToNotifyApp) {
     fprintf(stderr, \"Failed to get hEventToNotifyApp...\\n\");
exit(1);
}

hDevice=CreateFile(\"\\\\\\\\.\\\\CLOCK.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,W32IF_PASS_FINE,&hEventToNotifyApp,sizeof(HANDLE),0,0,&n,0))
{
     fprintf(stderr, \"Failed to pass hEvent...\\n\");
exit(1);
}

CreateThread(0,0x2800,SecondThread,hEventRing3,0,&tid);
printf(\"press any key to exit . . .\\n\");
getch();
CloseHandle(hDevice);
}

rjxie
驱动牛犊
驱动牛犊
  • 注册日期2002-03-17
  • 最后登录2002-04-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-06 21:57

在softice调试,显示
page faults
快来回复,急!!
游客

返回顶部