AERROR
驱动牛犊
驱动牛犊
  • 注册日期2004-06-03
  • 最后登录2010-07-05
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2321回复:3

关于KeSetTimerEx 和KeWaitForsingleObject的问题,极度困惑中,

楼主#
更多 发布于:2004-08-13 14:42
问题如下:

我定义了一个扩展结构,如下:

typedef struct _FDO_DEVICE_DATA
{

KDPC            DPCPolling;
// DPC routine used for polling
PIO_WORKITEM PollingWorker;
// The worker routine structure
LONG            PollingAllowed;
LONG            PollingNotQueued;
LONG Polling;
ULONG PollingPeriod;
KTIMER          PollingTimer;
KEVENT          PollingEvent;
KEVENT PollStateEvent;
LONG bTakeAction;
// The name returned from IoRegisterDeviceClass Association,
// which is used as a handle for IoSetDev... and friends.

} FDO_DEVICE_DATA, *PFDO_DEVICE_DATA;

在驱动的入口处我对上面的结构的数据进行初始化,
DeviceData = (PFDO_DEVICE_DATA) deviceObject->DeviceExtension;
RtlFillMemory (DeviceData, sizeof (FDO_DEVICE_DATA), 0);

DeviceData->Polling = 0;
DeviceData->PollingPeriod = 10;
DeviceData->PollingWorker = IoAllocateWorkItem(deviceObject);

if (DeviceData->PollingWorker == NULL) {
KdPrint(("Insufficient memory for Polling Routine.\n"));

return STATUS_INSUFFICIENT_RESOURCES;
}

//
// Initialize the timer used for dynamic detection of attachment
// and removal of PNP devices.
//

KeInitializeEvent(&DeviceData->PollingEvent, SynchronizationEvent,
FALSE);
KeInitializeEvent(&DeviceData->PollStateEvent, SynchronizationEvent,
TRUE);

KeInitializeDpc(
&DeviceData->DPCPolling,
(PKDEFERRED_ROUTINE) PollingTimerRoutine,
DeviceData);


如果在这个driverentry函数里我像下面一样地调用 KeWaitForSingleObject(&FdoData->PollStateEvent, Executive, KernelMode,
FALSE, NULL);

是不会有任何问题的.
但是如果我在dispathioctl函数中也是这样调用的话就会马上抛出异常,说是Page Fault; exception e; fault ==2;忽略异常之后系统自动重启.

代码如下:

NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
PFDO_DEVICE_DATA    pDeviceData;
pDeviceData = (PFDO_DEVICE_DATA)DeviceObject->DeviceObjectExtension;
.........
swith..(IoControlCode)
{
   case IOCTL_TESTDPC_START_POLLING:
   if(!pDeviceData->Polling)
   {
      StartPolling(pDeviceData);
      KeWaitForSingleObject(&(pDeviceData->PollStateEvent),
Executive,UserMode,FALSE,NULL);
      KeSetEvent(&(pDeviceData->PollStateEvent),1,FALSE);
   }
}

}
我检查过里的irql <= DISPATCH_LEVEL.
为什么呢?????
还望大侠指点迷津.
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-14 11:23
<=DISPATCH_LEVEL ?

should be ==
 so the thread cannot be block via kewaitforsingleobject()
xuzzzhen123
驱动牛犊
驱动牛犊
  • 注册日期2002-10-23
  • 最后登录2013-01-26
  • 粉丝0
  • 关注0
  • 积分187分
  • 威望20点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-14 14:33
不明白
[img]http://www.driverdevelop.com/forum/upload/xuzzzhen123/2004-08-14_ASdj_2003112410375453408.jpg[/img]
AERROR
驱动牛犊
驱动牛犊
  • 注册日期2004-06-03
  • 最后登录2010-07-05
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-01 18:35
pDeviceData = (PFDO_DEVICE_DATA)DeviceObject->DeviceObjectExtension;
呵呵,其实是这一句写错了.笔误.哈哈.好久没有来,不好意思.
应该是这样才对
pDeviceData= (PFDO_DEVICE_DATA) deviceObject->DeviceExtension;
游客

返回顶部