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호출합니다. FileNetworkPhysicalNameInformationFileInformationClass 값으로 전달하고 FileInformation값에 대한 FILE_NETWORK_PHYSICAL_NAME_INFORMATION 구조체로 형식이 지정된 호출자 할당 버퍼를 전달합니다. FileHandle 매개 변수는 이름 정보에 대한 파일 대상을 지정합니다.
파일 시스템 미니 필터는 FltQueryInformationFile 사용하여 실제 이름 정보를 쿼리해야 합니다.
주 함수 코드가 IRP_MJ_QUERY_INFORMATIONIRP를 만듭니다.
FILE_NETWORK_PHYSICAL_NAME_INFORMATIONFileNameZwQueryInformationFile전달된 파일 대상 핸들의 네트워크 이름을 포함합니다. 반환된 실제 네트워크 이름은 ; 형식입니다. 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;
}
요구 사항
요구 | 값 |
---|---|
헤더 | ntifs.h(Ntifs.h, Fltkernel.h 포함) |