estructura FILE_NETWORK_PHYSICAL_NAME_INFORMATION (ntifs.h)

La estructura FILE_NETWORK_PHYSICAL_NAME_INFORMATION contiene la ruta de acceso física UNC completa para un archivo o directorio en un recurso compartido de archivos remoto.

Sintaxis

typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
  ULONG FileNameLength;
  WCHAR FileName[1];
} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;

Miembros

FileNameLength

Longitud, en bytes, del nombre físico en FileName.

FileName[1]

Ruta de acceso UNC completa del recurso compartido de archivos de red del destino.

Comentarios

La estructura FILE_NETWORK_PHYSICAL_NAME_INFORMATION se usa para recuperar la información de nombre físico de red de un archivo. Esta operación se puede realizar de cualquiera de las maneras siguientes:

  • Llame a ZwQueryInformationFile, pasando FileNetworkPhysicalNameInformation como valor de FileInformationClass y pasando un búfer asignado por el autor de la llamada con formato de estructura FILE_NETWORK_PHYSICAL_NAME_INFORMATION para el valor de FileInformation. El parámetro FileHandle especifica el destino del archivo para la información de nombre.

    Los minifiltros del sistema de archivos deben usar FltQueryInformationFile para consultar la información del nombre físico.

  • Cree un IRP con el código de función principal IRP_MJ_QUERY_INFORMATION.

FileName de FILE_NETWORK_PHYSICAL_NAME_INFORMATION contendrá el nombre de red del identificador de destino de archivo pasado a ZwQueryInformationFile. El nombre de red físico devuelto tiene el formato de ; X:\Server\ShareName\Dir1\Dir2...\FileName.

Si el nombre físico es mayor que la longitud establecida en FileNameLength, se devuelve STATUS_BUFFER_OVERFLOW de ZwQueryInformationFile y FileNameLength se actualiza con el número de bytes necesarios para contener toda la cadena de nombre. El recuento de caracteres del nombre es FileNameLength / sizeof(WCHAR).

En caso de que se almacene en caché un archivo en un cliente y se consulte su nombre físico de red, es posible que la ruta de acceso devuelta en FileName no se conozca en la memoria caché del cliente. Es posible que el sistema de almacenamiento en caché no asocie el archivo almacenado en caché al archivo abierto mediante la ruta de acceso devuelta en FileName.

A continuación se muestra un ejemplo de consulta de la información de nombre físico de red de un destino de archivo mediante 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
Header ntifs.h (incluya Ntifs.h, Fltkernel.h)

Consulte también

FILE_INFORMATION_CLASS

IRP_MJ_QUERY_INFORMATION

ZwQueryInformationFile