FILE_NETWORK_PHYSICAL_NAME_INFORMATION 结构 (ntifs.h)

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 作为 FileInformationClass 的值传递,并为 FileInformation 的值传递一个调用方分配的缓冲区,该缓冲区的格式为 FILE_NETWORK_PHYSICAL_NAME_INFORMATION 结构。 FileHandle 参数指定名称信息的文件目标。

    文件系统微筛选器必须使用 FltQueryInformationFile 来查询物理名称信息。

  • 使用主函数代码 IRP_MJ_QUERY_INFORMATION创建 IRP。

FILE_NETWORK_PHYSICAL_NAME_INFORMATIONFileName 将包含传递给 ZwQueryInformationFile 的文件目标句柄的网络名称。 返回的物理网络名称的格式为 ;X:\Server\ShareName\Dir1\Dir2...\FileName

如果物理名称长于 FileNameLength 中设置的长度,则从 ZwQueryInformationFile 返回STATUS_BUFFER_OVERFLOW,并且使用保存整个名称字符串所需的字节数更新 FileNameLength 。 名称中的字符计数为 FileNameLength / size of (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;
}

要求

要求
Header ntifs.h (包括 Ntifs.h、Fltkernel.h)

另请参阅

FILE_INFORMATION_CLASS

IRP_MJ_QUERY_INFORMATION

ZwQueryInformationFile