tugy
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2013-09-18
  • 粉丝0
  • 关注0
  • 积分62分
  • 威望28点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1790回复:1

IRP_MJ_CREATE完成后发送IRP_MJ_READ碰到的问题

楼主#
更多 发布于:2009-11-14 11:44
在收到 IRP_MJ_CREATE 后,让其完成,完成后,使用IoBuildAsynchronousFsdRequest构造IRP_MJ_READ读取文件头,在XP、2K、2003下运行都正常,在Vista、Windows 7下运行一会就会蓝屏(DRIVER_OVERRAN_STACK_BUFFER (f7) ),请教各位大佬,不甚感激!

********** Source *************

NTSTATUS  DriverEntry ( IN PDRIVER_OBJECT DriverObject,  IN PUNICODE_STRING RegistryPath )
{
  ...

  for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
  {
    DriverObject->MajorFunction = SfPassThrough;
  }

  DriverObject->MajorFunction[IRP_MJ_CREATE] = SfCreate;

 ...

}


SfCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
  PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );

  ...


  Status = SfWaitIrpDone( ... )

  if (
          ( NT_SUCCESS( Status ) )
    &&
         ( NULL != IrpSp->FileObject )
    &&
        ( NULL != IrpSp->FileObject->FsContext )
    )
  {
    PUCHAR strBuf = ExAllocatePool( NonPagedPool, 4096 );
    LARGE_INTEGER liFileHead;
    IO_STATUS_BLOCK IoStatusBlock;

    if ( NULL != strBuf )
    {
      liFileHead.QuadPart = 0;

     KfcRead( DeviceObject, IrpSp->FileObject, &liFileHead, 4096, strBuf, &IoStatusBlock);

      ExFreePool( strBuf );

    }

    ...

  }

...

}



NTSTATUS SfWaitIrpDoneCompletion ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context )
{

  PKEVENT pEvent = Context;

  if ( Irp->PendingReturned )
  {
    KeSetEvent( pEvent, IO_NO_INCREMENT, FALSE );
  }

  return STATUS_MORE_PROCESSING_REQUIRED;

}


NTSTATUS SfWaitIrpDone( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
  KEVENT Event;
  NTSTATUS Status;

  KeInitializeEvent( &Event, NotificationEvent, FALSE );

  IoCopyCurrentIrpStackLocationToNext( Irp );

  IoSetCompletionRoutine( Irp, SfWaitIrpDoneCompletion, &Event, TRUE, TRUE, TRUE );

  Status = IoCallDriver( DeviceObject, Irp );

  if (STATUS_PENDING == Status)
  {
    KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, NULL );
  }

  Status = Irp->IoStatus.Status;

  return Status;
}

static VOID KfcRead(PDEVICE_OBJECT v_pDeviceObject, PFILE_OBJECT v_pFileObject, PLARGE_INTEGER v_liOffset, ULONG v_Length, PUCHAR v_strBuf, PIO_STATUS_BLOCK v_IoStatusBlock)
{
  PIRP irp;
  KEVENT event;
  PIO_STACK_LOCATION ioStackLocation;
  NTSTATUS Status;

  KeInitializeEvent(&event, NotificationEvent, FALSE);

  irp = IoBuildAsynchronousFsdRequest( IRP_MJ_READ, v_pDeviceObject, v_strBuf, v_Length, v_liOffset, v_IoStatusBlock );

  if( NULL==irp )
  {
    v_IoStatusBlock->Status = STATUS_INSUFFICIENT_RESOURCES;
    v_IoStatusBlock->Information = 0;
    return;
  }

  irp->Flags = 0x43;


  ioStackLocation = IoGetNextIrpStackLocation(irp);
  ioStackLocation->MajorFunction = IRP_MJ_READ;
  ioStackLocation->MinorFunction = 0;
  ioStackLocation->DeviceObject = v_pDeviceObject;
  ioStackLocation->FileObject = v_pFileObject;

  IoSetCompletionRoutine(irp, KfcIoCompletion, &event, TRUE, TRUE, TRUE);

  Status = IoCallDriver(v_pDeviceObject, irp);

  if(Status == STATUS_PENDING)
  {
    KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, 0);
  }
}

static NTSTATUS KfcIoCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context)
{
   *Irp->UserIosb = Irp->IoStatus;

   if (
            ( NULL != Irp->AssociatedIrp.SystemBuffer )
     &&
           ( Irp->Flags & IRP_DEALLOCATE_BUFFER )
      )
   {
      ExFreePool(Irp->AssociatedIrp.SystemBuffer);
   }
  else if ( Irp->MdlAddress != NULL )
  {
      PMDL mdl, nextMdl;
 
      for (mdl = Irp->MdlAddress; mdl != NULL; mdl = nextMdl)
     {
         nextMdl = mdl->Next;
         MmUnlockPages( mdl );
        IoFreeMdl( mdl ); // This function will also unmap pages.
     }
 
     Irp->MdlAddress = NULL;
  }

 if ( Irp->PendingReturned )
 {
    KeSetEvent( (PKEVENT)Context, IO_NO_INCREMENT, FALSE);
  }

  IoFreeIrp( Irp );

  return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS SfPassThrough ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
  IoSkipCurrentIrpStackLocation( Irp );

  return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION)  DeviceObject->DeviceExtension)->NLExtHeader.AttachedToDeviceObject, Irp );

}


tugy
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2013-09-18
  • 粉丝0
  • 关注0
  • 积分62分
  • 威望28点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-11-16 09:05
自己顶一个。

发到OSROnline上,回复说KfcRead里面用到了局部变量,没有等Irp返回就释放了导致。可是我仔细检查了程序,没有发现有这种可能。而且在XP、2K下运行1、2年了,都运行的好好的。唯独在 Vista 上或者 Win7 上运行大概1分钟,就蓝屏。

透明加解密中:文件打开后,读取文件头,判断是否为加密文件,这个应该很多人都这么做吧?大家都没有碰到过这个问题?
游客

返回顶部