OnebyOnePlease
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2010-03-19
  • 粉丝0
  • 关注0
  • 积分99分
  • 威望31点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1261回复:3

关于KeWaitForSingleObject

楼主#
更多 发布于:2005-01-29 15:20
郁闷了好几天了
问题是这样的:
全局变量device_extension,用NonPagedPool分配空间。
我在DriverEntry中初试化事件。
    KeInitializeEvent(
        &device_extension->request_event,
        SynchronizationEvent,
        FALSE
        );
在DeviceControl 中当收到应用程序发来的IOCTL_DATA_REV时等待事件。
NTSTATUS
DeviceControl (
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    )
{
    PIO_STACK_LOCATION  io_stack;
    NTSTATUS            status = STATUS_SUCCESS;
    ULONG               info = 0;
    KIRQL  Irql;
    io_stack = IoGetCurrentIrpStackLocation(Irp);
    switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
    {

     case IOCTL_DATA_REV:
     KeWaitForSingleObject(&device_extension->request_event,
               Executive,KernelMode,FALSE,0);
   }
在函数TDIRev函数中set事件。
VOID TDIRev(PVOID pBuf,ULONG nLen,PVOID pConn,PVOID pSth)
{
KeSetEvent(
        &device_extension->request_event,
        (KPRIORITY)0,
        FALSE
        );

TDIRev用来接受网络数据的。它的IRQL为2。
DriverEntry的IRQL 为0。DeviceControl 的IRQL为0。

我用softice跟踪了程序,发现当set完事件后,DeviceControl 函数并没有往下执行。就等在KeWaitForSingleObject。这时报错是page 0000。就是点不亮事件,我快疯了。
兄弟们帮忙分析一下吧。
OnebyOnePlease
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2010-03-19
  • 粉丝0
  • 关注0
  • 积分99分
  • 威望31点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-30 17:07
我上面的错误原因写错了,不是page 0000,而是:
Break due to Page Fault(0Eh),Fault = 0000;

等待您的援助。哪怕是一点小小的建议也好。
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-31 10:17
实施在adddevice中初始化event.
还可以尝试kesetevent的第二个参数改成1。
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-31 10:24
你是要实现事件通知巴。看一下应用程序和驱动搭配吗?
游客

返回顶部