每当装载管理器的持久符号链接名称数据库发生更改时,客户端都会将此 IOCTL 发送给装载管理器,以通知该管理器。
装载管理器维护名为 EpicNumber 的计数器,记录自上次启动以来其持久名称数据库中发生了多少更改。 客户端通过每次更改通知请求 IRP 向装载管理器发送一个数字,装载管理器以以下方式响应:
如果客户端提供的号码不等于 EpicNumber,装载管理器将返回STATUS_SUCCESS,表明自客户端上次将其编号与装载管理器的 EpicNumber进行比较以来发生了更改。
如果客户端提供的数字等于 EpicNumber,则装载管理器将此解释为请求,以通知对持久名称数据库的下一次更改,并将更改通知 IRP 排入队列,并返回STATUS_PENDING。 每当数据库中发生更改时,装载管理器都会完成所有挂起的更改通知 IRP,从而通知客户端更改。
建议只通知要通知特定卷的更改的客户端注册即插即用目标设备通知并监视GUID_IO_VOLUME_NAME_CHANGE。
主要代码
输入缓冲区
装载管理器客户端在 Irp->AssociatedIrp.SystemBuffer的缓冲区开头初始化 MOUNTMGR_CHANGE_NOTIFY_INFO 结构。
输入缓冲区长度
IRP 的 I/O 堆栈位置中的 Parameters.DeviceIoControl.InputBufferLength 指示输入缓冲区的大小(以字节为单位),该缓冲区必须大于或等于 sizeof(MOUNTMGR_CHANGE_NOTIFY_INFO)
。
输出缓冲区
装载管理器在 Irp->AssociatedIrp.SystemBuffer的缓冲区开头的 MOUNTMGR_CHANGE_NOTIFY_INFO 结构中返回当前 EpicNumber。
输出缓冲区长度
没有。
输入/输出缓冲区
N/A
输入/输出缓冲区长度
N/A
状态块
如果作成功,则 状态 字段设置为STATUS_SUCCESS,信息 字段设置为 sizeof(MOUNTMGR_CHANGE_NOTIFY_INFO)
。
如果 inputBufferLength 小于 sizeof(MOUNTMGR_CHANGE_NOTIFY_INFO)
或 OutputBufferLength 小于 sizeof(MOUNTMGR_CHANGE_NOTIFY_INFO)
,则 状态 字段设置为STATUS_INVALID_PARAMETER。
言论
有关详细信息,请参阅 在存储类驱动程序中支持装载管理器请求。
要求
要求 | 价值 |
---|---|
标头 | mountmgr.h (包括 Mountmgr.h) |