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 IRP_MJ_QUERY_INFORMATION。

FILE_NETWORK_PHYSICAL_NAME_INFORMATIONFileName 將包含傳遞至 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)

另請參閱

FILE_INFORMATION_CLASS

IRP_MJ_QUERY_INFORMATION

ZwQueryInformationFile