首页 > 其他分享 >注册IRP_MJ_SHUTDOWN事件 基于ReactOS0303

注册IRP_MJ_SHUTDOWN事件 基于ReactOS0303

时间:2022-11-07 19:35:26浏览次数:50  
标签:DeviceObject IRP MJ ReactOS0303 SHUTDOWN ENTRY NULL


    系统关闭时,会向注册SHUTDOWN事件的设备驱动发送IRP_MJ_SHUTDOWN事件。

NTSTATUS STDCALL
NtShutdownSystem(IN SHUTDOWN_ACTION Action)
{
if (Action > ShutdownPowerOff)
return STATUS_INVALID_PARAMETER;
Status = PsCreateSystemThread(&ThreadHandle,
THREAD_ALL_ACCESS,
NULL,
NULL,
NULL,
ShutdownThreadMain,
(PVOID)Action);
}

VOID STDCALL
ShutdownThreadMain(PVOID Context)
{
IoShutdownRegisteredDevices();
}


VOID
NTAPI
IoShutdownRegisteredDevices(VOID)
{
ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead,
&ShutdownListLock);
while (ListEntry)
{
/* Get the shutdown entry */
ShutdownEntry = CONTAINING_RECORD(ListEntry,
SHUTDOWN_ENTRY,
ShutdownList);

/* Get the attached device */
DeviceObject = IoGetAttachedDevice(ShutdownEntry->DeviceObject);

/* Build the shutdown IRP and call the driver */
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
DeviceObject,
NULL,
0,
NULL,
&Event,
&StatusBlock);
Status = IoCallDriver(DeviceObject, Irp);
if (Status == STATUS_PENDING)
{
/* Wait on the driver */
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
}

/* Free the shutdown entry and reset the event */
ExFreePool(ShutdownEntry);
KeClearEvent(&Event);

/* Go to the next entry */
ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead,
&ShutdownListLock);
}
}

    调用Native API NtShutdownSystem时会遍历ShutdownListHead队列,取出每个元素,这个元素的结构中包含设备对象:

typedef struct _SHUTDOWN_ENTRY
{
LIST_ENTRY ShutdownList;
PDEVICE_OBJECT DeviceObject;
} SHUTDOWN_ENTRY, *PSHUTDOWN_ENTRY;

    之后获得这个设备的设备栈深度并以此建立一个类型为IRP_MJ_SHUTDOWN的IRP请求包,以同步的方式发向设备栈的最上层设备。 设备栈中的设备驱动如果注册了IRP_MJ_SHUTDOWN事件那就调用相应的回调,如果没有注册就按默认的方式完成请求或者下发请求。

    联系驱动程序注册IRP_MJ_SHUTDOWN事件和IoShutdownRegisteredDevices函数的是IoRegisterShutdownNotification---注册关机通知函数。这个函数新建SHUTDOWN_ENTRY结构,并填入设备对象,然后把SHUTDOWN_ENTRY结构挂入ShutdownListHead队列。

/*
* @implemented
*/
NTSTATUS
NTAPI
IoRegisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
{
PSHUTDOWN_ENTRY Entry;

/* Allocate the shutdown entry */
Entry = ExAllocatePoolWithTag(NonPagedPool,
sizeof(SHUTDOWN_ENTRY),
TAG_SHUTDOWN_ENTRY);
if (!Entry) return STATUS_INSUFFICIENT_RESOURCES;

Entry->DeviceObject = DeviceObject;

/* Insert it into the list */
ExInterlockedInsertHeadList(&ShutdownListHead,
&Entry->ShutdownList,
&ShutdownListLock);


DeviceObject->Flags |= DO_SHUTDOWN_REGISTERED;
return STATUS_SUCCESS;
}


    驱动入口以如下的方式注册关闭通知:

DriverEntry(pDriverObject,pRegistryPath)
{
pDriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = Shutdown;
IoRegisterShutdownNotification(pDriverObject);
}




标签:DeviceObject,IRP,MJ,ReactOS0303,SHUTDOWN,ENTRY,NULL
From: https://blog.51cto.com/u_13927568/5831064

相关文章

  • PhantomJS入门使用
    概述​​官网​​​,​​GitHub​​​,​​下载地址​​​简介:一个基于webkit的JSAPI。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JS代码。任何你可以......
  • CesiumJS 技术博客:glTF 模型(Model)加载新架构
    目录1.加载一个glTF模型2.着色器优先的模型渲染设计3.模型渲染管线3.1.管线举例4.与3DTiles集成5.译者的话原文:https://cesium.com/blog/2022/10/05/tour-of-......
  • 搭建CNPM私有仓库(cnpmjs.org)
    欢迎关注前端早茶,与广东靓仔携手共同进阶前端早茶专注前端,一起结伴同行,紧跟业界发展步伐~ 环境准备到写下本文时,环境版本如下Node:12.16.3mysql:8.0.19npm:6......
  • IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
    在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结构和与之相关的API函数做一下笔记。 1.相关阅读资料《深入解析windows操作系统(第4......
  • heiamJava16IO流
    JavaI/O流按流的方向分输入输出流I表示intput(输入),是数据从硬盘文件读入到内存的过程,称之输入,负责读。O表示output(输出),是内存程序的数据从内存到写出硬盘文件的过......
  • Gym 100959B Airports(Prim算法,曼哈顿距离变换,曼哈顿距离最大生成树)
    今天训练遇到了这样一个题:给出平面上的n(1e5)个点,求d的最大值,使得所有距离不小于d的点连边后,图是联通的。显然可以转化为求最大生成树的最小边权。一种办法是优化边数,跑k......
  • 修复 Mac 上“未找到 AirPrint 打印机”的错误
    AirPrint是Apple的专有技术,可以通过无线方式从您的iPhone、iPad和Mac打印内容,而无需安装额外的软件或驱动程序。如果您遇到“未找到AirPrint打印机”错误,可以参考......
  • MJExtension 源码解析
    1.NSObject+MJClass为基类添加了一个Class相关的分类,用于获取设置所有关于Class的配置。1.1核心方法-遍历类的继承树/***遍历所有的类*/+(void)mj_enu......
  • PAN3028 是一款采用 ChirpIoTTM调制解调技术的低功耗远距离无线收发芯片
    PAN3028是一款采用ChirpIoTTM调制解调技术的低功耗远距离无线收发芯片,支持半双工无线通信,工作频段为370~600MHz和740~1200MHz,该芯片具有高抗干扰性、高灵敏度、低......
  • swagger.mjs文件用于api自动生成声明文件
    import*asfsfrom'fs'import*ashttpfrom'http'import*asiconvfrom'iconv-lite'importpathfrom'path'importopenapiTSfrom'openapi-typescript'co......