zoukankan      html  css  js  c++  java
  • 构造读写IRP(转)

    DDK示例中的代码。

    NTSTATUS
    FltReadSectors(
      IN PDEVICE_OBJECT
    DeviceObject,
      OUT PVOID Buffer,
      IN ULONG Length,
     
    IN LONGLONG ByteOffset,
      IN BOOLEAN Wait
      )

    {
     
    PIRP irp;
      IO_STATUS_BLOCK iosb;
      KEVENT event;
     
    NTSTATUS status;

      irp =
    IoBuildAsynchronousFsdRequest(IRP_MJ_READ, DeviceObject,
      Buffer,
    Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
      if (!irp)
    {
      return STATUS_INSUFFICIENT_RESOURCES;
      }

      if
    (Wait) {
      KeInitializeEvent(&event, NotificationEvent,
    FALSE);
      IoSetCompletionRoutine(irp,
    FltReadWriteSectorsCompletion,
      &event, TRUE, TRUE,
    TRUE);

      status = IoCallDriver(DeviceObject, irp);
      if
    (STATUS_PENDING == status) {
      KeWaitForSingleObject(&event,
    Executive, KernelMode, FALSE, NULL);
      status = iosb.Status;
     
    }
      } else {
      IoSetCompletionRoutine(irp,
    FltReadWriteSectorsCompletion,
      NULL, TRUE, TRUE, TRUE);
     
    irp->UserIosb = NULL;
      status = IoCallDriver(DeviceObject,
    irp);
      }

      return
    status;
    }

    NTSTATUS
    FltWriteSectors(
      IN PDEVICE_OBJECT
    DeviceObject,
      IN PVOID Buffer,
      IN ULONG Length,
      IN
    LONGLONG ByteOffset,
      IN BOOLEAN Wait
      )

    {
     
    PIRP irp;
      IO_STATUS_BLOCK iosb;
      KEVENT event;
     
    NTSTATUS status;

      irp =
    IoBuildAsynchronousFsdRequest(IRP_MJ_WRITE, DeviceObject,
      Buffer,
    Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
      if (!irp)
    {
      return STATUS_INSUFFICIENT_RESOURCES;
      }

      if
    (Wait) {
      KeInitializeEvent(&event, NotificationEvent,
    FALSE);
      IoSetCompletionRoutine(irp,
    FltReadWriteSectorsCompletion,
      &event, TRUE, TRUE,
    TRUE);

      status = IoCallDriver(DeviceObject, irp);
      if
    (STATUS_PENDING == status) {
      KeWaitForSingleObject(&event,
    Executive, KernelMode, FALSE, NULL);
      status = iosb.Status;
     
    }
      } else {
      IoSetCompletionRoutine(irp,
    FltReadWriteSectorsCompletion,
      NULL, TRUE, TRUE, TRUE);
     
    irp->UserIosb = NULL;
      status = IoCallDriver(DeviceObject,
    irp);
      }

      return
    status;
    }

    NTSTATUS
    FltReadWriteSectorsCompletion(
      IN
    PDEVICE_OBJECT DeviceObject,
      IN PIRP Irp,
      IN PVOID
    Context
      )

    {
      PMDL mdl;
       
     
    UNREFERENCED_PARAMETER(DeviceObject);

      //
      // Free
    resources
      //

      if (Irp->AssociatedIrp.SystemBuffer
    && (Irp->Flags & IRP_DEALLOCATE_BUFFER)) {
     
    ExFreePool(Irp->AssociatedIrp.SystemBuffer);
      }

      while
    (Irp->MdlAddress) {
      mdl = Irp->MdlAddress;
     
    Irp->MdlAddress = mdl->Next;
      MmUnlockPages(mdl);
     
    IoFreeMdl(mdl);
      }

      if (Irp->PendingReturned &&
    (Context != NULL)) {
      *Irp->UserIosb = Irp->IoStatus;
     
    KeSetEvent((PKEVENT) Context, IO_DISK_INCREMENT, FALSE);
     
    }

      IoFreeIrp(Irp);

      //
      // Don't touch irp
    any more
      //
      return STATUS_MORE_PROCESSING_REQUIRED;
    }

  • 相关阅读:
    0802作业1替换文本文件内容

    看病
    爬山
    作业1
    超市(未完成)
    图片复制
    替换
    文件
    英文字母和中文汉字在不同字符集编码下的字节数
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/3400008.html
Copyright © 2011-2022 走看看