阅读:3674回复:7
对I/O端口操作时,哪一条消息激活HANDLER函数?
我在调试《WIN9X虚拟设备驱动程序编程指南》中第三章的例子程序。对打印机端口进行监视。现在HOOK()已经成功了,但是却没有执行handler()函数进行I/o操作。
可能是什么问题? 请各位大侠帮帮忙吧?这个问题我已经困惑了几天了!! 很难过!! |
|
最新喜欢:xiangs... |
沙发#
发布于:2001-05-23 10:42
To JunWei:
我的程序大概结构是这样的: vxd端的cpp: MyPort::MyPort(WORD port):VIOPort(port) { globalEnable(); hook(); //其他一些操作 } MyPort::~MyPort() { //Num--; //if(Num==0) delete pBuffer; } DWORD MyPort::handler(VMHANDLE hVM,DWORD port,CLIENT_STRUCT *pRegs,DWORD iotype,DWORD outdata) { char data; switch (iotype) { case BYTE_INPUT: pBuffer[Count].wPort=port; data=_inp(port); pBuffer[Count].wVal=data; pBuffer[Count].bInput=TRUE; if(++Count==COUNT)Count=COUNT; return data; case BYTE_OUTPUT: pBuffer[Count].wPort=port; data=_outp(port, outdata); pBuffer[Count].wVal=data; pBuffer[Count].bInput=FALSE; if(++Count>=Count) Count=COUNT; return data; } return 0; } Port123VM::Port123VM(VMHANDLE hVM) : VVirtualMachine(hVM) {} Port123Thread::Port123Thread(THREADHANDLE hThread) : VThread(hThread) {} Port123Device::Port123Device() { p378=p379=p37A=0; } BOOL Port123Device::OnDeviceInit(VMHANDLE hSysVM, PCHAR pszCmdTail) { return TRUE; } BOOL Port123Device::OnSysDynamicDeviceInit() { return TRUE; } BOOL Port123Device::OnSysDynamicDeviceExit() { return TRUE; } DWORD Port123Device::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams) { switch(pDIOCParams->dioc_IOCtlCode) { case DIOC_OPEN: p378=new MyPort(0x378); p379=new MyPort(0x379); p37A=new MyPort(0x37A); break; case DIOC_CLOSEHANDLE: if(p378) {delete p378; p378=0;} if(p379) {delete p379; p379=0;} if(p37A) {delete p37A; p37A=0;} break; case 111: int size=pDIOCParams->dioc_cbOutBuf; size=MyPort::Count<size?MyPort::Count:size; memcpy(pDIOCParams->dioc_OutBuf,MyPort::pBuffer, size *sizeof(PortStruct)); *pDIOCParams->dioc_bytesret=size; break; } return 0; } ring3端应用程序: void main() { //一些数据类型的定义 HVxD=CreateFile("\\\\.\\port123.vxd",0,0,0,CREATE_NEW,FILE_FLAG_DELETE_ON_CLOSE,0); if(HVxD==INVALID_HANDLE_VALUE) return; system("c:\\command.com"); if(DeviceIoControl(HVxD,111,NULL,0,(LPVOID)pBuffer,COUNT,&nBytes,0)) { FILE *fp; fp=fopen("port.log","wt"); fprintf(fp,"Count=%d\n",nBytes); for(DWORD i=0;i<nBytes;i++) fprintf(fp,"%6d %3X:%02X,%s\n",i,(WORD)pBuffer.wPort, (BYTE)pBuffer.wVal,pBuffer.bInput?"Input":"OutPut"); fclose(fp); } CloseHandle(HVxD); delete pBuffer; } 请注意在MyPort的构造函数中,例子程序中原来没有gobalEnable,hook不能成功;加上了之后,hook成功,但无论如何都不能进入Handler函数。用softice调试耶没发现什么蛛丝马迹。 请帮忙看一看!!多谢。 |
|
板凳#
发布于:2001-05-23 15:00
你是怎么知道没拦截成功?
是不是打印的时候你的程序没反应? 我也在研究如何拦截打印的问题,开始也是用的这个例子, 我发现如果在ring3程序中用_outp(0x378, 20),handler还是会起作用的,后来看到一篇文章说VIOPort虚拟一个端口只能拦截ring3的应用程序而不能拦截ring0的程序,现在不知道用什么办法来拦截所有的打印了, |
|
地板#
发布于:2001-05-24 12:02
to black, junwei
我按照black说的,在RING 3的应用程序 里使用_outp(0x378, 20),的确可以用HANDLER函数。但是,用DIR > PRN 就不行。是不是因为DIR > PRN 是在RING O 下的。 JUNWEI说的方法我还没有试。 多谢各位了。 希望这个问题可以继续讨论下去。 |
|
地下室#
发布于:2001-05-28 10:58
我也在研究这个问题,调用 Hook()返回false,但是却能够执行handler函数。真不知道怎么回事?请各位指点?email:llshi@263.net
|
|
5楼#
发布于:2001-05-29 22:38
如果我能早点看到这个贴子就好了,我今天早上
TYPEIN这个例子花了一个早上。 我是想HOOK COMMPORT,0X3F8-0X3FF, 不行,HOOK()返回的是TRUE,这点我是通过以下手段证实的: 我在我的程序里加了一大堆 #IFDEBUG DOUT<<.............. 然后看DOUT的输出, 发现HOOK成功,但RING0的HANDLER根本没有被进去过。 明天我再调一调。。。 |
|
6楼#
发布于:2001-05-30 10:06
你怎么Hook()上去的,能不能交流以下,把的代码发给我。谢谢
llshi@263.net |
|
7楼#
发布于:2001-05-31 20:39
我的程序跟上面的一样,是书上的例子。如上面的贴子所说,
DEBUG里OUT 3F8,1就能HOOK,但HOOK不了 WINDOWS里的串口操作,我很伤心。对了,我第一次HOOK时 8个端口7个失败。再跑一次就可以了。 应该可以不用GLOBALENABLE的(帮助说的) |
|