FILE_NETWORK_PHYSICAL_NAME_INFORMATION-Struktur (ntifs.h)
Die FILE_NETWORK_PHYSICAL_NAME_INFORMATION-Struktur enthält den vollständigen physischen UNC-Pfadnamen für eine Datei oder ein Verzeichnis auf einer Remotedateifreigabe.
Syntax
typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
Member
FileNameLength
Die Länge des physischen Namens in Bytes in FileName.
FileName[1]
Der vollständige UNC-Pfad der Netzwerkdateifreigabe des Ziels.
Hinweise
Die FILE_NETWORK_PHYSICAL_NAME_INFORMATION-Struktur wird verwendet, um die Informationen zum physischen Netzwerknamen für eine Datei abzurufen. Dieser Vorgang kann auf eine der folgenden Arten ausgeführt werden:
Rufen Sie ZwQueryInformationFile auf, übergeben Sie FileNetworkPhysicalNameInformation als Wert von FileInformationClass , und übergeben Sie einen vom Aufrufer zugewiesenen Puffer, der als FILE_NETWORK_PHYSICAL_NAME_INFORMATION Struktur für den Wert von FileInformation formatiert ist. Der Parameter FileHandle gibt das Dateiziel für die Namensinformationen an.
Dateisystemminifilter müssen FltQueryInformationFile verwenden, um die physischen Namensinformationen abzufragen.
Erstellen Sie eine IRP mit hauptfunktionscode IRP_MJ_QUERY_INFORMATION.
Der Dateinamevon FILE_NETWORK_PHYSICAL_NAME_INFORMATION enthält den Netzwerknamen des Dateizielhandles, das an ZwQueryInformationFile übergeben wird. Der zurückgegebene physische Netzwerkname hat das Format ; X:\Server\ShareName\Dir1\Dir2...\FileName.
Wenn der physische Name länger als die in FileNameLength festgelegte Länge ist, wird STATUS_BUFFER_OVERFLOW von ZwQueryInformationFile zurückgegeben, und FileNameLength wird mit der Anzahl von Bytes aktualisiert, die zum Speichern der gesamten Namenszeichenfolge erforderlich sind. Die Anzahl der Zeichen im Namen ist FileNameLength / sizeof(WCHAR).
Wenn eine Datei auf einem Client zwischengespeichert und ihr physischer Netzwerkname abgefragt wird, ist der in FileName zurückgegebene Pfad dem Clientcache möglicherweise nicht bekannt. Das Zwischenspeichersystem ordnet die zwischengespeicherte Datei möglicherweise nicht der Datei zu, die mit dem in FileName zurückgegebenen Pfad geöffnet wurde.
Es folgt ein Beispiel für das Abfragen der physischen Netzwerknameninformationen eines Dateiziels mithilfe von 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;
}
Anforderungen
Anforderung | Wert |
---|---|
Header | ntifs.h (include Ntifs.h, Fltkernel.h) |