FILE_NETWORK_PHYSICAL_NAME_INFORMATION 结构包含远程文件共享上文件或目录的完整 UNC 物理路径名。
语法
typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
成员
FileNameLength
FileName中物理名称的长度(以字节为单位)。
FileName[1]
目标网络文件共享的完整 UNC 路径。
言论
FILE_NETWORK_PHYSICAL_NAME_INFORMATION 结构用于检索文件的网络物理名称信息。 此作可以通过以下任一方式执行:
调用 ZwQueryInformationFile,将 FileNetworkPhysicalNameInformation 作为 fileInformation Class 的值传递,并将格式化为 FILE_NETWORK_PHYSICAL_NAME_INFORMATION 结构的调用方分配的缓冲区作为 FileInformation的值传递。 FileHandle 参数指定名称信息的文件目标。
文件系统微型筛选器必须使用 FltQueryInformationFile 来查询物理名称信息。
IRP_MJ_QUERY_INFORMATION创建具有主要函数代码的 IRP。
FILE_NETWORK_PHYSICAL_NAME_INFORMATION 的 FileName 将包含传递给 ZwQueryInformationFile的文件目标句柄的网络名称。 返回的物理网络名称采用 格式;X:\Server\ShareName\Dir1\Dir2...\FileName.
如果物理名称超过 FileNameLength中设置的长度,则从 ZwQueryInformationFile 返回STATUS_BUFFER_OVERFLOW,FileNameLength 更新,其中包含整个名称字符串所需的字节数。 名称中的字符计数 FileNameLength / sizeof(WCHAR)。
在客户端上缓存文件并查询其网络物理名称的情况下,FileName 中返回的路径在客户端缓存中可能未知。 缓存系统可能不会使用 FileName中返回的路径将缓存的文件与打开的文件相关联。
下面是使用 ZwQueryInformationFile查询文件目标的网络物理名称信息的示例。
NTSTATUS GetPhysicalNetworkName(HANDLE Target, WCHAR *NetworkName, ULONG MaxNetworkNameLength)
{
NTSTATUS Status;
IO_STATUS_BLOCK IoStatus;
ULONG NameInfoLength;
PFILE_NETWORK_PHYSICAL_NAME_INFORMATION NetFileNameInfo = NULL;
if ( MaxNetworkNameLength < sizeof(WCHAR) )
{
return STATUS_NAME_TOO_LONG;
}
if (NetworkName != NULL)
{
return STATUS_INVALID_PARAMETER;
}
NetworkName[0] = (WCHAR)0; // initially terminate the output string;
// set the initial name length, the one WCHAR in NetFileNameInfo.FileName is reserved for the terminating NULL
NameInfoLength = sizeof(PFILE_NETWORK_PHYSICAL_NAME_INFORMATION) +
min(1024, MaxNetworkNameLength - sizeof(WCHAR));
NetFileNameInfo = (PFILE_NETWORK_PHYSICAL_NAME_INFORMATION)ExAllocatePool(PagedPool, NameInfoLength);
if (NetFileNameInfo == NULL)
{
Status = STATUS_NO_MEMORY;
}
else
{
Status = ZwQueryInformationFile(Target,
&IoStatus,
NetFileNameInfo,
NameInfoLength,
FileNetworkPhysicalNameInformation);
}
if (Status == STATUS_BUFFER_OVERFLOW)
{
if (NetFileNameInfo->FileNameLength <= (MaxNetworkNameLength - sizeof(WCHAR)))
{
NameInfoLength += sizeof(PFILE_NETWORK_PHYSICAL_NAME_INFORMATION) + NetFileNameInfo->FileNameLength;
ExFreePool(NetFileNameInfo);
NetFileNameInfo = (PFILE_NETWORK_PHYSICAL_NAME_INFORMATION)ExAllocatePool(PagedPool, NameInfoLength);
if (NetFileNameInfo == NULL)
{
Status = STATUS_NO_MEMORY;
}
else
{
Status = ZwQueryInformationFile(Target,
&IoStatus,
NetFileNameInfo,
NameInfoLength,
FileNetworkPhysicalNameInformation);
}
}
}
if (NetFileNameInfo != NULL)
{
if (NT_SUCCESS(Status))
{
NameInfoLength = min(NameInfoLength, NetFileNameInfo->FileNameLength);
RtlCopyMemory(NetworkName, NetFileNameInfo->FileName, NameInfoLength);
NetworkName[NameInfoLength / sizeof(WCHAR)] = (WCHAR)0;
}
ExFreePool(NetFileNameInfo);
}
return Status;
}
要求
| 要求 | 价值 |
|---|---|
| 标头 | ntifs.h(包括 Ntifs.h、Fltkernel.h) |