阅读:1353回复:1
与vxdwin32通信问题求救
如下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); } |
|
沙发#
发布于:2002-04-06 21:57
在softice调试,显示 page faults 快来回复,急!! |
|