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_INFORMATION 사용하여 IRP를 만듭니다.

FILE_NETWORK_PHYSICAL_NAME_INFORMATIONFileName에는 ZwQueryInformationFile에 전달된 파일 대상 핸들의 네트워크 이름이 포함됩니다. 반환된 실제 네트워크 이름은 형식입니다. X:\Server\ShareName\Dir1\Dir2...\FileName.

실제 이름이 FileNameLength에 설정된 길이보다 긴 경우 ZwQueryInformationFile 에서 STATUS_BUFFER_OVERFLOW 반환되고 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 포함)

추가 정보

FILE_INFORMATION_CLASS

IRP_MJ_QUERY_INFORMATION

ZwQueryInformationFile