Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Структура 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.
FileNameFILE_NETWORK_PHYSICAL_NAME_INFORMATION будет содержать сетевое имя целевого дескриптора файла, переданного ZwQueryInformationFile. Имя физической сети, возвращаемое в формате ; X:\Server\ShareName\Dir1\Dir2...\FileName.
Если физическое имя больше длины, заданной в FileNameLength, то STATUS_BUFFER_OVERFLOW возвращается из ZwQueryInformationFile и FileNameLength обновляется с количеством байтов, необходимых для хранения всей строки имени. Количество символов в имени — FileNameLength / размер(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 (include Ntifs.h, Fltkernel.h) |