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 in 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;
Angehörige
FileNameLength
Die Länge des physischen Namens in Byte in FileName.
FileName[1]
Der vollständige UNC-Pfad der Netzwerkdateifreigabe des Ziels.
Bemerkungen
Die FILE_NETWORK_PHYSICAL_NAME_INFORMATION Struktur wird verwendet, um die Physischen Netzwerknameninformationen für eine Datei abzurufen. Dieser Vorgang kann auf eine der folgenden Arten ausgeführt werden:
Rufen Sie ZwQueryInformationFileauf, und ü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 FileInformationformatiert ist. Der parameter FileHandle gibt das Dateiziel für die Namensinformationen an.
Dateisystem-Minifilter müssen FltQueryInformationFile- verwenden, um die physischen Namensinformationen abzufragen.
Erstellen Sie ein IRP mit Hauptfunktionscode IRP_MJ_QUERY_INFORMATION.
Die FileName- von FILE_NETWORK_PHYSICAL_NAME_INFORMATION enthält den Netzwerknamen des Dateizielhandles, das an ZwQueryInformationFileübergeben wird. Der zurückgegebene physische Netzwerkname ist im Format ; X:\Server\ShareName\Dir1\Dir2...\FileName.
Wenn der physische Name länger als die in FileNameLengthfestgelegte Länge ist, wird STATUS_BUFFER_OVERFLOW von ZwQueryInformationFile zurückgegeben, und FileNameLength wird mit der Anzahl der 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 wird und der physische Netzwerkname abgefragt wird, ist der in FileName zurückgegebene Pfad möglicherweise nicht dem Clientcache bekannt. Das Zwischenspeicherungssystem ordnet die zwischengespeicherte Datei möglicherweise nicht der Datei zu, die mit dem in FileNamezurückgegebenen Pfad geöffnet wurde.
Im Folgenden finden Sie ein Beispiel zum Abfragen der Netzwerkinformationen für physische Namen eines Dateiziels mithilfe 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 (einschließlich Ntifs.h, Fltkernel.h) |