构造读写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;
}
构造读写IRP(转)的更多相关文章
- IRP小结 0x01 IRP & IO_STACK_LOCATION(结合WRK理解)
写博客整理记录一下IRP相关的知识点,加深一下印象. 所有的I/O请求都是以IRP的形式提交的.当I/O管理器为了响应某个线程调用的的I/O API的时候,就会构造一个IRP,用于在I/O系统处理这个 ...
- USB设备驱动概述
USB设备驱动 · )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...
- [14]Windows内核情景分析 --- 文件系统
文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...
- [6]Windows内核情景分析 --APC
APC:异步过程调用.这是一种常见的技术.前面进程启动的初始过程就是:主线程在内核构造好运行环境后,从KiThreadStartup开始运行,然后调用PspUserThreadStartup,在该线程 ...
- Java 线程并发策略
1 什么是并发问题. 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题. 2 java中synchronized的用法 用法1 public class Test{ public ...
- java io读书笔记(8)FileInputStream/FileOutputStream的应用
转自:http://www.cnblogs.com/jjtech/archive/2011/04/17/2019210.html 这是一对继承于InputStream和OutputStream的类,用 ...
- Android系统在超级终端下必会的命令大全(adb shell命令大全)
. 显示系统中全部Android平台: android list targets . 显示系统中全部AVD(模拟器): android list avd . 创建AVD(模拟器): android c ...
- APC -- Asynchronous Procedure Call 异步过程调用
异步过程调用(APC -- Asynchronous Procedure Call )是一种与常用的和简单的同步对象不同的一种同步机制. 我们在我们线程里使用基本的同步对象如MUTEX去通知其它线程, ...
- 理解和使用NT驱动程序的执行上下文
理解Windows NT驱动程序最重要的概念之一就是驱动程序运行时所处的“执行上下文”.理解并小心地应用这个概念可以帮助你构建更快.更高效的驱动程序. NT标准内核模式驱动程序编程的一个重要观念是某个 ...
随机推荐
- Oracle的一些初步小东西
经常要用数据库,让他自己启动的话,开机太慢,所以用命令启动方便点. 1.开启: 在运行中输入cmd,进入控制台,lsnrctl start回车,提示启动监听成功后net start Oracl ...
- 获取当前页面url中的参数 coffeescript+node.js+angular
获取当前url:@$window.alert @$location.url()获取参数(json格式)@$window.alert @$location.search().channel
- 网络与多线程---OC中多线程方法GCD(二)
小编在前一篇中介绍了多线程实现的五种常用方法.在接下来所介绍的这种方法是最具有魅力的,最具有诱惑的实现多线程的方案---GCD 一.什么是GCD GCD是Grand Central Dispatch的 ...
- 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基
4184: shallot Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 356 Solved: 180[Submit][Status][Discu ...
- Hystrix简单介绍
Netflix的Hystrix是一个帮助解决分布式系统交互超时处理和容错的类库,同样拥有保护系统的能力. 服务隔离 服务降级 1.服务隔离 在一个系统中,一个业务通常会依赖多个服务,且这若干个服务的调 ...
- [Java]进程与线程的区别(转)
线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有: ...
- RabbitMQ简单使用
环境搭建: RabitMQ是用Elang编写的,虽然Elang本身是跨平台的,但也同时意味着搭建Rabit环境需要首先配置Elang环境.配置RabitMQ的网上教程还比较多的: windows 下 ...
- 北大 ACM 分类 汇总
1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...
- MTK65XX平台充电调试总结
MTK平台充电调试总结 摘要:调试电池的充放电管理,首先须要深入了解锂电池的电池原理和特点.充放电特性以及主要的电池安全问题.然后须要对MTK的电池管理驱动程序有深入的了解.理解电池充放电算法的基本原 ...
- 在AngularJS中使用ES6
本篇记录一些AngularJS结合使用ES6的各种写法. ES6中module的导出导入 class MainController { constructor(searchService){ this ...