FltGetVolumeGuidName 函数 (fltkernel.h)

FltGetVolumeGuidName 以卷全局唯一标识符(GUID)格式获取给定卷的卷名称。

语法

NTSTATUS FLTAPI FltGetVolumeGuidName(
  [in]               PFLT_VOLUME     Volume,
  [in/out, optional] PUNICODE_STRING VolumeGuidName,
  [out, optional]    PULONG          BufferSizeNeeded
);

参数

[in] Volume

卷的不透明指针。 必须是本地文件系统卷。 此参数是必需的,不能 NULL

[in/out, optional] VolumeGuidName

指向调用方分配的 UNICODE_STRING 结构的指针,该结构在返回STATUS_SUCCESS时接收卷的 GUID 名称。 请注意,VolumeGuidName->Buffer 的池也是调用方分配的。

如果 VolumeGuidNameNULLBufferSizeNeededNULLFltGetVolumeGuidName 将请求的卷 GUID 所需的缓冲区大小存储在 BufferSizeNeeded 参数中,并返回STATUS_BUFFER_TOO_SMALL。 请参阅“备注”。

[out, optional] BufferSizeNeeded

指向调用方分配的变量的指针,该变量接收请求的卷 GUID 名称的大小(以字节为单位)。 此参数是可选的,可以 NULL;但是,如果 VolumeGuidNameNULL,则它必须是非NULL,以便 FltGetVolumeGuidName 可以存储请求的卷 GUID 所需的缓冲区大小。

返回值

FltGetVolumeGuidName 返回STATUS_SUCCESS或适当的 NTSTATUS 值,例如以下值之一:

返回代码 描述
STATUS_BUFFER_TOO_SMALL VolumeGuidName 指向的缓冲区 NULL 或太小,无法容纳卷 GUID。 如果调用方为 BufferSizeNeeded提供非NULL 值,FltGetVolumeGuidName 将所需的缓冲区大小存储在 BufferSizeNeeded中。 这被视为错误代码,因为未检索卷 GUID 名称。
STATUS_INSUFFICIENT_RESOURCES FltGetVolumeGuidName 遇到池分配失败。 这是一个错误代码。
STATUS_INVALID_DEVICE_REQUEST Volume 参数是网络卷的句柄。 这是一个错误代码。
STATUS_FLT_VOLUME_NOT_FOUND 找不到匹配的卷。 这是一个错误代码。

言论

返回的卷 GUID 名称采用以下格式表示:

\??\Volume{GUID}

其中,GUID 是标识卷的全局唯一标识符。 此格式与装载管理器使用的格式相同,存储类驱动程序中支持装载管理器请求。

如果 BufferSizeNeeded 未知,请调用 FltGetVolumeGuidName 两次:

  • 在第一次调用中,将 volumeGuidName 设置为 NULL,并将 bufferSizeNeeded 设置为非NULLFltGetVolumeGuidName 将存储 BufferSizeNeeded 中卷名称 GUID 所需的字节数,并返回STATUS_BUFFER_TOO_SMALL。
  • 在第二次调用中,VolumeGuidName 设置为指向 BufferSizeNeeded 值在首次调用中返回的结构。

FltGetVolumeGuidName 无法安全地从预装载或装载后回调调用。 无法安全地调用它,因为即使调用了装载后回调,I/O 管理器也尚未完成装载处理,这在某些情况下会导致装载管理器出现死锁。

在 Windows Vista 及更高版本中,微型筛选器驱动程序可以从其 InstanceSetupCallback 例程(PFLT_INSTANCE_SETUP_CALLBACK)安全地调用 FltGetVolumeGuidName,因为在完成所有装载处理后,将在新卷的第一个 I/O 操作上调用回调。

在早于 Windows Vista 的 Windows 操作系统上,无法安全地从 InstanceSetupCallback 例程调用 FltGetVolumeGuidName,因为装载管理器在持有锁时可能会发出文件 I/O 操作,这可能会导致死锁。

请务必注意,卷 GUID 与卷对象 ID 不同。 卷 GUID(或 唯一卷名称)是独立于文件系统的值;它由装载管理器分配给基础存储卷。 卷对象 ID 由文件系统分配给文件系统卷。

若要获取卷的卷对象 ID,请调用 ZwQueryVolumeInformationFile,为 FsInformationClass 参数指定 FileFsObjectIdInformation

FltGetVolumeGuidName 大致等效于 Win32 GetVolumeNameForVolumeMountPoint 函数。 (Microsoft Windows SDK 中记录了 GetVolumeNameForVolumeMountPoint

要求

要求 价值
目标平台 普遍
标头 fltkernel.h (包括 Fltkernel.h)
FltMgr.lib
DLL Fltmgr.sys
IRQL PASSIVE_LEVEL

另请参阅

FILE_FS_OBJECTID_INFORMATION

PFLT_INSTANCE_SETUP_CALLBACK

UNICODE_STRING

ZwQueryVolumeInformationFile