阅读:1261回复:3
关于KeWaitForSingleObject
郁闷了好几天了
问题是这样的: 全局变量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。就是点不亮事件,我快疯了。 兄弟们帮忙分析一下吧。 |
|
沙发#
发布于:2005-01-30 17:07
我上面的错误原因写错了,不是page 0000,而是:
Break due to Page Fault(0Eh),Fault = 0000; 等待您的援助。哪怕是一点小小的建议也好。 |
|
板凳#
发布于:2005-01-31 10:17
实施在adddevice中初始化event.
还可以尝试kesetevent的第二个参数改成1。 |
|
地板#
发布于:2005-01-31 10:24
你是要实现事件通知巴。看一下应用程序和驱动搭配吗?
|
|