Partager via


structure FILE_NETWORK_PHYSICAL_NAME_INFORMATION (ntifs.h)

La structure FILE_NETWORK_PHYSICAL_NAME_INFORMATION contient le nom de chemin d’accès physique UNC complet d’un fichier ou d’un répertoire sur un partage de fichiers distant.

Syntaxe

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

Membres

FileNameLength

Longueur, en octets, du nom physique dans FileName.

FileName[1]

Chemin UNC complet du partage de fichiers réseau de la cible.

Remarques

La structure FILE_NETWORK_PHYSICAL_NAME_INFORMATION est utilisée pour récupérer les informations de nom physique réseau d’un fichier. Cette opération peut être effectuée de l’une des manières suivantes :

  • Appelez ZwQueryInformationFile, en passant FileNetworkPhysicalNameInformation comme valeur de FileInformationClass et en transmettant une mémoire tampon allouée à l’appelant mise en forme en tant que structure FILE_NETWORK_PHYSICAL_NAME_INFORMATION pour la valeur de FileInformation. Le paramètre FileHandle spécifie la cible de fichier pour les informations de nom.

    Les minifiltres du système de fichiers doivent utiliser FltQueryInformationFile pour interroger les informations de nom physique.

  • Créez un IRP avec le code de fonction principal IRP_MJ_QUERY_INFORMATION.

FileName de FILE_NETWORK_PHYSICAL_NAME_INFORMATION contiendra le nom réseau du handle cible de fichier passé à ZwQueryInformationFile. Le nom de réseau physique retourné est au format de ; X :\Server\ShareName\Dir1\Dir2...\FileName.

Si le nom physique est plus long que la longueur définie dans FileNameLength, STATUS_BUFFER_OVERFLOW est retourné par ZwQueryInformationFile et FileNameLength est mis à jour avec le nombre d’octets requis pour contenir la chaîne de nom entière. Le nombre de caractères dans le nom est FileNameLength / sizeof(WCHAR).

Dans le cas où un fichier est mis en cache sur un client et que son nom physique réseau est interrogé, le chemin retourné dans FileName peut ne pas être connu du cache du client. Le système de mise en cache peut ne pas associer le fichier mis en cache au fichier ouvert à l’aide du chemin retourné dans FileName.

Voici un exemple d’interrogation des informations de nom physique réseau d’une cible de fichier à l’aide de 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;
}

Configuration requise

Condition requise Valeur
En-tête ntifs.h (include Ntifs.h, Fltkernel.h)

Voir aussi

FILE_INFORMATION_CLASS

IRP_MJ_QUERY_INFORMATION

ZwQueryInformationFile