首页
社区
课程
招聘
[求助]蓝猫淘气三千问,这次是关于IRP的,求大佬解答!
发表于: 2018-5-5 15:40 2620

[求助]蓝猫淘气三千问,这次是关于IRP的,求大佬解答!

2018-5-5 15:40
2620
学习驱动开发中,总会有一些莫名其妙的想法

今天字节写了个一个驱动
然后用DeviceIoControl进行通信时,突然有了个新的疑问

第一个疑问
如果R3发起一个IO请求 比如读写某个磁盘,IO管理器生成IRP 发往驱动,在这个IRP还没有完成时,发起请求的R3程序意外挂掉了,这时这个IRP会被怎样处理。


第二个疑问

我用
DeviceIoControl  发送了一个请求给我自己的控制函数
如果这个函数还没跑完,发送请求的R3意外挂掉了 这个IRP会被怎样处理。

关于第二个疑问,我实测了一下

在分发函数里写下了如下代码
switch (IOCODE)
{
case test:

NTSTATUS status;
OBJECT_ATTRIBUTES  ObjectAttributes;
HANDLE pid = PsGetCurrentProcessId();;
HANDLE ProcessHandle;
CLIENT_ID myCid;
InitializeObjectAttributes(&ObjectAttributes, 0, 0, 0, 0);
myCid.UniqueProcess = (HANDLE)pid;
myCid.UniqueThread = 0;
status = ZwOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS, &ObjectAttributes, &myCid);
if (NT_SUCCESS(status))
{
ZwTerminateProcess(ProcessHandle, 0);
ZwClose(ProcessHandle);
}
}

// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = info; // bytes xfered
IoCompleteRequest(pIrp, IO_NO_INCREMENT);

KdPrint(("Leave DeviceIOControl\n"));///这句并没有得到执行
return status;

测试结果
当IRP还未被完成时,如果发起请求的进程已经被结束,那么在结束R3之后的代码都不会的得到执行····
我也不知道我这么测试准确不准确

当然我更想知道,这样操作,会不会引起系统的不稳定(一个函数执行一半就不执行了,怎么看怎么觉得要炸,不过貌似我把这份代码放到了各种操作系统上跑,也没出现太大的问题)






[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
就算你进程挂掉了,执行DeviceIoctl的这个线程也得按照基本法跑完这个同步的IRP才能退,你的进程也会等待最后这个线程跑完才能退
ps:具体的情况你跑一个永远不会完成的ioctl然后把进程kill掉就能看到效果了,你会得到一个只有一根卡住的线程的空壳进程
最后于 2018-5-6 09:05 被hzqst编辑 ,原因:
2018-5-6 09:03
0
游客
登录 | 注册 方可回帖
返回
//