lcs1973
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2009-12-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1137回复:2

在DISPATCH_LEVEL级该怎么办?

楼主#
更多 发布于:2005-04-01 17:03
static NTSTATUS fnCompletionRoutineWithEvent (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP pIrp,
    IN PVOID Context
    )
{
 PKEVENT pKEvent = (PKEVENT)Context;
 KeSetEvent( pKEvent, IO_NO_INCREMENT, FALSE);
 return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS MaHidInit( HANDLE *pHandle)
{
 NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
 PDEVICE_OBJECT pDeviceObject;
 PFILE_OBJECT pFileObject;
 UNICODE_STRING  usName;
 WCHAR wsBuffer[ 128];

 if( KeGetCurrentIrql() == PASSIVE_LEVEL) {
  .
  .
  .
  ntStatus = IoGetDeviceObjectPointer(
&usName,
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
&pFileObject,
&pDeviceObject );
  if (ntStatus == STATUS_SUCCESS) {
   .
   .
   .
   PIRP pIrp = IoAllocateIrp( pDeviceObject->StackSize + 1, FALSE);
   if ( pIrp ) {
    .
    .
    .
    KEVENT eventComplete;
    if( KeGetCurrentIrql() == PASSIVE_LEVEL) {
     KeInitializeEvent( &eventComplete, NotificationEvent, FALSE);
     IoSetCompletionRoutine( pIrp, fnCompletionRoutineWithEvent,
eventComplete, TRUE, TRUE, TRUE);
     ntStatus = IoCallDriver( pDeviceObject, pIrp);
     if( ntStatus == STATUS_PENDING ) {
      if( KeGetCurrentIrql() == PASSIVE_LEVEL) {
       LARGE_INTEGER liWait;
       liWait.QuadPart = -30000000;
       ntStatus = KeWaitForSingleObject( &eventComplete, UserRequest,
KernelMode, TRUE, &liWait);
       if( ntStatus == STATUS_SUCCESS)
        ntStatus = pIrp->IoStatus.Status;
      }
     }
    }
   }
   if( ntStatus == STATUS_SUCCESS)
    DbgPrint(\"[%x][%x]\\n\",
hidCollectionInfo.VendorID,hidCollectionInfo.ProductID);
  }
 return ntStatus;
}

以上的代码都有判断式判别是否处于PASSIVE_LEVLE级,
如果是在DISPATCH_LEVEL级
(比如说在程序最前端加上:
KIRQL oldirql;
ASSERT( KeGetCurrentIrql( ) <= DISPATCH_LEVEL);
KeRaiseIrql( DISPATCH_LEVEL, &oldirql);
强迫提高至DISPATCH_LEVEL)
要怎么改才能使这段代码正常运作呢?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2005-04-03 09:31
不司已经清楚了,在PASSIVE_LEVEL上就不要执行他们.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
lcs1973
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2009-12-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-03 23:57
不司已经清楚了,在PASSIVE_LEVEL上就不要执行他们.


这么说好了:
在DISPATCH_LEVEL级怎么得到HID装置的VID和PID?
小弟我对驱动还是一知半解的,
实在不知道在DISPATCH_LEVEL级程序是怎么运行的!
游客

返回顶部