springl
驱动牛犊
驱动牛犊
  • 注册日期2001-05-08
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3674回复:7

对I/O端口操作时,哪一条消息激活HANDLER函数?

楼主#
更多 发布于:2001-05-22 17:03
我在调试《WIN9X虚拟设备驱动程序编程指南》中第三章的例子程序。对打印机端口进行监视。现在HOOK()已经成功了,但是却没有执行handler()函数进行I/o操作。
可能是什么问题?
请各位大侠帮帮忙吧?这个问题我已经困惑了几天了!!
很难过!!

最新喜欢:

xiangshifuxiangs...
springl
驱动牛犊
驱动牛犊
  • 注册日期2001-05-08
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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调试耶没发现什么蛛丝马迹。
请帮忙看一看!!多谢。
black
驱动牛犊
驱动牛犊
  • 注册日期2001-05-23
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-05-23 15:00
你是怎么知道没拦截成功?
是不是打印的时候你的程序没反应?
我也在研究如何拦截打印的问题,开始也是用的这个例子,
我发现如果在ring3程序中用_outp(0x378, 20),handler还是会起作用的,后来看到一篇文章说VIOPort虚拟一个端口只能拦截ring3的应用程序而不能拦截ring0的程序,现在不知道用什么办法来拦截所有的打印了,
springl
驱动牛犊
驱动牛犊
  • 注册日期2001-05-08
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-05-24 12:02
to black, junwei
   我按照black说的,在RING 3的应用程序 里使用_outp(0x378, 20),的确可以用HANDLER函数。但是,用DIR > PRN 就不行。是不是因为DIR > PRN 是在RING O 下的。 JUNWEI说的方法我还没有试。
   多谢各位了。
   希望这个问题可以继续讨论下去。
llshi
驱动老牛
驱动老牛
  • 注册日期2001-05-05
  • 最后登录2016-01-16
  • 粉丝0
  • 关注0
  • 积分5300分
  • 威望26500点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-05-28 10:58
我也在研究这个问题,调用 Hook()返回false,但是却能够执行handler函数。真不知道怎么回事?请各位指点?email:llshi@263.net
sjy
sjy
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-05-29 22:38
如果我能早点看到这个贴子就好了,我今天早上
TYPEIN这个例子花了一个早上。
我是想HOOK  COMMPORT,0X3F8-0X3FF,
不行,HOOK()返回的是TRUE,这点我是通过以下手段证实的:
我在我的程序里加了一大堆
#IFDEBUG
  DOUT<<..............
然后看DOUT的输出,
发现HOOK成功,但RING0的HANDLER根本没有被进去过。

明天我再调一调。。。
llshi
驱动老牛
驱动老牛
  • 注册日期2001-05-05
  • 最后登录2016-01-16
  • 粉丝0
  • 关注0
  • 积分5300分
  • 威望26500点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-05-30 10:06
你怎么Hook()上去的,能不能交流以下,把的代码发给我。谢谢
llshi@263.net
sjy
sjy
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-05-31 20:39
我的程序跟上面的一样,是书上的例子。如上面的贴子所说,
DEBUG里OUT 3F8,1就能HOOK,但HOOK不了
WINDOWS里的串口操作,我很伤心。对了,我第一次HOOK时
8个端口7个失败。再跑一次就可以了。
应该可以不用GLOBALENABLE的(帮助说的)
游客

返回顶部