构造读写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;
}

你可能感兴趣的:(读写)