estrutura FILE_NETWORK_PHYSICAL_NAME_INFORMATION (ntifs.h)
A estrutura FILE_NETWORK_PHYSICAL_NAME_INFORMATION contém o nome de caminho físico UNC completo para um arquivo ou diretório em um compartilhamento de arquivos remoto.
Sintaxe
typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
Membros
FileNameLength
O comprimento, em bytes, do nome físico em FileName.
FileName[1]
O caminho UNC completo do compartilhamento de arquivos de rede do destino.
Comentários
A estrutura FILE_NETWORK_PHYSICAL_NAME_INFORMATION é usada para recuperar as informações de nome físico de rede de um arquivo. Essa operação pode ser executada de qualquer uma das seguintes maneiras:
Chame ZwQueryInformationFile, passando FileNetworkPhysicalNameInformation como o valor de FileInformationClass e passando um buffer alocado pelo chamador formatado como uma estrutura FILE_NETWORK_PHYSICAL_NAME_INFORMATION para o valor de FileInformation. O parâmetro FileHandle especifica o destino do arquivo para as informações de nome.
Os minifiltros do sistema de arquivos devem usar FltQueryInformationFile para consultar as informações de nome físico.
Crie um IRP com o código de função principal IRP_MJ_QUERY_INFORMATION.
O FileName de FILE_NETWORK_PHYSICAL_NAME_INFORMATION conterá o nome de rede do identificador de destino do arquivo passado para ZwQueryInformationFile. O nome da rede física retornado está no formato de ; X:\Server\ShareName\Dir1\Dir2...\FileName.
Se o nome físico for maior que o comprimento definido em FileNameLength, STATUS_BUFFER_OVERFLOW será retornado de ZwQueryInformationFile e FileNameLength será atualizado com o número de bytes necessários para manter toda a cadeia de caracteres de nome. A contagem de caracteres no nome é FileNameLength / sizeof(WCHAR).
No caso em que um arquivo é armazenado em cache em um cliente e seu nome físico de rede é consultado, o caminho retornado em FileName pode não ser conhecido pelo cache do cliente. O sistema de cache pode não associar o arquivo armazenado em cache ao arquivo aberto usando o caminho retornado em FileName.
Veja a seguir um exemplo de consulta das informações de nome físico de rede de um destino de arquivo usando 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;
}
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | ntifs.h (include Ntifs.h, Fltkernel.h) |