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;
    }

  • 相关阅读:
    vue-cli3 打包路径参数说明
    vuex使用map在module的模式下的写法
    普通的JS文件中使用vuex
    vue cli 3+ 版本的source map添加方法
    vue-cli的安装及版本查看/更新
    搭建一个vue项目
    无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
    Centos7开放及查看端口
    记录一次idae和maven设置的巨坑
    解决npm安装node-sass太慢及编译错误问题
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/3400008.html
Copyright © 2011-2022 走看看