beaveror
驱动中牛
驱动中牛
  • 注册日期2002-06-13
  • 最后登录2003-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1349回复:3

DeviceIoCtrol()怎么老是出错?

楼主#
更多 发布于:2002-06-26 09:38
用途:等待驱动层发事件。
1。应用程。
IOCTL_FIRST_SEND_EVENT 已定义。
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
int Length;
DeviceIoControl(hDevice,
                IOCTL_FIRST_SEND_EVENT,
                &hEvent, sizeof(HANDLE),// input
    NULL, 0, // output
    &length,NULL))
2。驱动层。
KEVENT  keWrite;
KeInitializeEvent(&keWrite,NotificationEvent,FALSE);
switch( ControlCode)
{
case IOCTL_FIRST_SEND_EVENT:
    ObReferenceObjectByHandle((HANDLE)(*Buffer), 0x0002,
                               NULL, UserMode,
        (PVOID *)(&keWrite),
         NULL);
    KeClearEvent(&keWrite);
    break;
    //.................
}

有什么地方不对吗?
只要能解决问题,就一定给分。 希望高手赐教!
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-26 10:43
有几个地方值得怀疑,但不一定对。
地方1:
   驱动*.VXD是否动态加载。

1。应用程。
IOCTL_FIRST_SEND_EVENT 已定义。
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
int Length;

hDevice=CreateFile(\"\\\\\\\\.\\\\*.VXD\",0,0,NULL,0,FILE_FLA
G_DELETE_ON_CLOSE,NULL);   //地方2

DeviceIoControl(hDevice,
IOCTL_FIRST_SEND_EVENT,
&hEvent, sizeof(HANDLE),// input
NULL, 0, // output
&length,NULL))
2。驱动层。
KEVENT keWrite;
KeInitializeEvent(&keWrite,NotificationEvent,FALSE);
switch( ControlCode)
{
case IOCTL_FIRST_SEND_EVENT:
ObReferenceObjectByHandle((HANDLE)(*Buffer), 0x0002,
NULL, UserMode,
(PVOID *)(&keWrite),
NULL);
KeClearEvent(&keWrite);
break;
//.................
}

地方3:
不知道你传递的ControlCode是如何从DIOCParams结构中提取的,以下说明也许对你有用:


VxD程序必须处理w32_deviceIoControl消息。当VxD收到w32_deviceIoControl消息,它的寄存器是如下值:

l         ebx 是VM的句柄。

l         esi 是指向DIOCParams结构的指针。DIOCParams包含了从win32程序传送的信息。

DIOCParams是按照如下定义的:

DIOCParams STRUC

    Internal1          DD ?

    VMHandle           DD ?

    Internal2          DD ?

    dwIoControlCode    DD ?

    lpvInBuffer        DD ?

    cbInBuffer         DD ?

    lpvOutBuffer       DD ?

    cbOutBuffer        DD ?

    lpcbBytesReturned  DD ?

    lpoOverlapped      DD ?

    hDevice            DD ?

    tagProcess         DD ?

DIOCParams ENDS

l         Internal1       是指向Win32应用应用程序用户寄存器结构的指针。

l         VMHandle        虚拟机句柄

l         Internal2       是指向设备描述块(DDB)的句柄。

l         dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped是传送到DeviceIoControl API的参数。

l         hDevice是       ring-3级设备句柄。

l         tagProces       是过程的标签。

在DIOCParams结构中有所有从Win32应用程序传送到你的VxD的信息。

beaveror
驱动中牛
驱动中牛
  • 注册日期2002-06-13
  • 最后登录2003-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-26 10:54
多谢老大提示。问题找到了。
只要能解决问题,就一定给分。 希望高手赐教!
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-06 13:56
多谢老大提示。问题找到了。
这位老兄,你问题是找到了,可我又碰到你同样的问题了,可以将你的解决方法以及你实现的源代码贴在这里吗?多谢了!
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
游客

返回顶部