FILE_NETWORK_PHYSICAL_NAME_INFORMATION構造体 (ntifs.h)
FILE_NETWORK_PHYSICAL_NAME_INFORMATION構造体には、リモート ファイル共有上のファイルまたはディレクトリの完全な UNC 物理パス名が含まれています。
構文
typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
メンバー
FileNameLength
FileName の物理名の長さ (バイト単位)。
FileName[1]
ターゲットのネットワーク ファイル共有の完全な UNC パス。
注釈
FILE_NETWORK_PHYSICAL_NAME_INFORMATION構造体は、ファイルのネットワーク物理名情報を取得するために使用されます。 この操作は、次のいずれかの方法で実行できます。
ZwQueryInformationFile を呼び出し、FileNetworkPhysicalNameInformationを FileInformationClass の値として渡し、呼び出し元によって割り当てられたバッファーを FileInformation の値のFILE_NETWORK_PHYSICAL_NAME_INFORMATION構造体として書式設定して渡します。 FileHandle パラメーターは、名前情報のファイル ターゲットを指定します。
ファイル システムミニフィルターでは、 FltQueryInformationFile を使用して物理名情報を照会する必要があります。
主要な関数コード IRP_MJ_QUERY_INFORMATIONを使用して IRP を作成します。
FILE_NETWORK_PHYSICAL_NAME_INFORMATIONの FileName には、ZwQueryInformationFile に渡されるファイル ターゲット ハンドルのネットワーク名が含まれます。 返される物理ネットワーク名は、 の形式 です。X:\Server\ShareName\Dir1\Dir2...\FileName。
物理名が FileNameLength で設定された長さより長い場合、STATUS_BUFFER_OVERFLOWは ZwQueryInformationFile から返され、 FileNameLength は名前文字列全体を保持するために必要なバイト数で更新されます。 名前の文字数は FileNameLength / sizeof(WCHAR) です。
ファイルがクライアントにキャッシュされ、そのネットワーク物理名に対してクエリが実行される場合、 FileName で返されるパスがクライアント キャッシュに認識されない可能性があります。 キャッシュ システムは、キャッシュされたファイルを FileName で返されるパスを使用して開かれたファイルに関連付けられません。
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;
}
要件
要件 | 値 |
---|---|
Header | ntifs.h (Ntifs.h、Fltkernel.h を含む) |