структура 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 и передав буфер, выделенный вызывающим объектом, в формате FILE_NETWORK_PHYSICAL_NAME_INFORMATION структуры для значения FileInformation. Параметр FileHandle указывает целевой файл для сведений об имени.

    Минифильтры файловой системы должны использовать FltQueryInformationFile для запроса сведений о физическом имени.

  • Создайте IRP с основным кодом функции IRP_MJ_QUERY_INFORMATION.

Имя файлаFILE_NETWORK_PHYSICAL_NAME_INFORMATION будет содержать сетевое имя целевого дескриптора файла, переданного в ZwQueryInformationFile. Возвращенное имя физической сети имеет формат ; X:\Server\ShareName\Dir1\Dir2...\FileName.

Если физическое имя превышает длину, заданную в FileNameLength, STATUS_BUFFER_OVERFLOW возвращается из ZwQueryInformationFile , а 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