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

  • 相关阅读:
    bootstrap2文档的学习
    在mininet上基于ovs,ovx,pox搭建三点虚拟网络
    借鉴一些关于js框架的东西
    setTimeout js
    Ubuntu 上配置静态的ip
    html5 canvas
    获取当前页面的长宽
    ovs的卸载
    tensorflow实现Word2vec
    梯度下降做做优化(batch gd、sgd、adagrad )
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/3400008.html
Copyright © 2011-2022 走看看