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

构造读写IRP(转)的更多相关文章

  1. IRP小结 0x01 IRP & IO_STACK_LOCATION(结合WRK理解)

    写博客整理记录一下IRP相关的知识点,加深一下印象. 所有的I/O请求都是以IRP的形式提交的.当I/O管理器为了响应某个线程调用的的I/O API的时候,就会构造一个IRP,用于在I/O系统处理这个 ...

  2. USB设备驱动概述

    USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...

  3. [14]Windows内核情景分析 --- 文件系统

    文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...

  4. [6]Windows内核情景分析 --APC

    APC:异步过程调用.这是一种常见的技术.前面进程启动的初始过程就是:主线程在内核构造好运行环境后,从KiThreadStartup开始运行,然后调用PspUserThreadStartup,在该线程 ...

  5. Java 线程并发策略

    1 什么是并发问题. 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题. 2 java中synchronized的用法 用法1 public class Test{ public ...

  6. java io读书笔记(8)FileInputStream/FileOutputStream的应用

    转自:http://www.cnblogs.com/jjtech/archive/2011/04/17/2019210.html 这是一对继承于InputStream和OutputStream的类,用 ...

  7. Android系统在超级终端下必会的命令大全(adb shell命令大全)

    . 显示系统中全部Android平台: android list targets . 显示系统中全部AVD(模拟器): android list avd . 创建AVD(模拟器): android c ...

  8. APC -- Asynchronous Procedure Call 异步过程调用

    异步过程调用(APC -- Asynchronous Procedure Call )是一种与常用的和简单的同步对象不同的一种同步机制. 我们在我们线程里使用基本的同步对象如MUTEX去通知其它线程, ...

  9. 理解和使用NT驱动程序的执行上下文

    理解Windows NT驱动程序最重要的概念之一就是驱动程序运行时所处的“执行上下文”.理解并小心地应用这个概念可以帮助你构建更快.更高效的驱动程序. NT标准内核模式驱动程序编程的一个重要观念是某个 ...

随机推荐

  1. .net 中的async,await理解

    理解: 1.async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异)2.当async方法执行遇到await,则立即将控制权转移到async方法的调用者3.由调用者决定是否需要等 ...

  2. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. [Deepin 15] sudo source /etc/profile 提示找不到 source 命令(切换到 root 用户:sudo su)

    在 Deepin/Ubuntu 系统 中,因为修改了下 配置文件,然后执行 source 命令重新加载配置文件,结果: sudo source /etc/profile 提示找不到 source 命令 ...

  5. 微信图片生成插件,页面截图插件 html2canvas,截图失真 问题的解决方案

    html2canvas 是一个相当不错的 JavaScript 类库,它使用了 html5 和 css3 的一些新功能特性,实现了在客户端对网页进行截图的功能.html2canvas 通过获取页面的 ...

  6. 多个RS-485设备怎么连接到一台电脑上?可以设置地址,有协议

    计算机都是RS232的,所以要给计算机串口配一个232/485转换器,然后给所有485设备设置一个地址. 计算机用查询方式,根据设备地址查询指定设备. 比如,计算机发送5个自节 01 03 04 FF ...

  7. GitHub 第一坑:换行符自动转换

    源起 一直想在 GitHub 上发布项目.参与项目,但 Git 这货比较难学啊.买了一本<Git 权威指南>,翻了几页,妈呀,那叫一个复杂,又是 Cygwin 又是命令行的,吓得我不敢学了 ...

  8. ASP.NET Web API中通过ETag实现缓存

    通常情况下Server是无状态的,在ASP.NET Web API中,我们可以让服务端响应体中产生ETag属性,起到缓存的作用.大致实现原理是: 1.服务端的响应体中返回一个ETag属性2.客户端通过 ...

  9. 认识TWICImage类

    Graphics 单元新增了 TWICImage 类, 该类的功能源于新增的 Wincodec.pas 单元. WIC 支持的图像有 BMP.PNG.ICO.JPEG.GIF.TIFF.HDP(HDP ...

  10. C#编程(三十一)----------泛型总结

    C#泛型总结 C#中的所谓的泛型程序设计和C++中相应的模版类似. 泛型方法 C#中的泛型方法是指使用了类型参数的方法成员,案例: static void Main(string[] args) { ...