学习驱动开发中,总会有一些莫名其妙的想法
今天字节写了个一个驱动
然后用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之后的代码都不会的得到执行····
我也不知道我这么测试准确不准确
当然我更想知道,这样操作,会不会引起系统的不稳定(一个函数执行一半就不执行了,怎么看怎么觉得要炸,不过貌似我把这份代码放到了各种操作系统上跑,也没出现太大的问题)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)