다음을 통해 공유


UNC 명명 및 MUP 지원

이 문서에서는 네트워크 리디렉션자가 UNC 명명 및 MUP(다중 UNC 공급자)를 지원하는 방법을 설명합니다.

MUP는 UNC(균일한 명명 규칙)를 사용하여 식별된 네트워크 리소스를 찾는 데 도움이 되는 Windows 서비스입니다. 원격 파일 시스템 요청을 처리할 수 있는 네트워크 리렉터(UNC 공급자)에 UNC 이름을 사용하여 모든 원격 파일 시스템 액세스를 채널링하는 커널 모드 구성 요소입니다. MUP은 애플리케이션이 UNC 경로를 사용하는 경우 관련됩니다. 예를 들어 명령줄 명령은 다음과 같습니다.

notepad \\server\public\readme.txt

MUP은 애플리케이션에서 UNC 이름을 포함하는 명령을 받습니다. 등록된 각 UNC 공급자, LAN 관리자 워크스테이션 및 설치된 다른 모든 워크스테이션에 이름을 보냅니다. UNC 공급자가 UNC 이름을 자체 이름으로 식별하면 MUP는 해당 이름의 이후 인스턴스를 해당 공급자로 자동으로 리디렉션합니다.

MUP는 매핑된 드라이브 문자(예: "NET USE" 명령)를 만드는 작업 중에는 관련되지 않습니다. 이 작업은 MPR(다중 공급자 라우터) 및 네트워크 리트리버에 대한 WNet(사용자 모드 Windows 네트워킹 ) 공급자 DLL에 의해 처리됩니다. 그러나 사용자 모드 WNet 공급자 DLL은 이 작업 중에 커널 모드 네트워크 리렉터 드라이버와 직접 통신할 수 있습니다.

Windows Vista 이전에는 DFS(분산 파일 시스템) 드라이브를 나타내지 않는 매핑된 드라이브에서 수행된 원격 파일 작업이 MUP를 거치지 않습니다. 이러한 작업은 드라이브 문자 매핑을 처리한 네트워크 공급자로 직접 이동합니다.

Windows Vista에 도입된 업데이트된 리렉터 모델을 준수하는 네트워크 리다이렉터의 경우 매핑된 네트워크 드라이브를 사용하는 경우에도 MUP가 관련됩니다. 매핑된 드라이브에서 수행된 파일 작업은 MUP를 통해 네트워크 리렉터로 이동합니다. 이 경우 MUP는 관련 네트워크 리다이렉터에 작업을 전달하기만 하면 됩니다.

MUP는 DFS(분산 파일 시스템) 클라이언트도 포함하는 mup.sys 이진 파일의 일부입니다.

커널 네트워크 리렉터에는 일반적으로 원격 리소스에 대한 연결 설정(예: 원격 리소스에 드라이브 문자 매핑)을 지원하는 사용자 모드 WNet 공급자 DLL도 있습니다. MPR은 WNet 공급자에 대한 쿼리를 기반으로 네트워크 연결을 설정하는 사용자 모드 DLL입니다. MPR에 대한 호출은 다음 작업의 결과입니다.

  • net use x: \\server\share 명령 프롬프트에서 실행된 명령입니다.

  • Windows 탐색기에서 설정된 네트워크 드라이브 문자 연결입니다.

  • WNet 함수에 대한 직접 호출입니다.

UNC 이름을 처리하려면 네트워크 리다이렉터에서 MUP에 등록해야 합니다. MUP에 등록된 UNC 공급자가 여러 개 있을 수 있습니다. 이러한 UNC 공급자는 다음 리디렉션자 중 하나 이상이 될 수 있습니다.

  • RDBSS를 기반으로 하는 네트워크 미니 리디렉터(예: SMB(서버 메시지 블록) 리디렉터 및 WebDAV 리디렉터)
  • RDBSS를 기반으로 하지 않는 레거시 리디렉터입니다.

접두사 확인

MUP는 이름 기반 작업(일반적으로 IRP_MJ_CREATE 요청)에서 UNC 경로를 처리할 수 있는 공급자를 결정합니다. 이 결정을 "접두사 해결"이라고 합니다. 접두사 확인 작업은 다음 두 가지 용도로 사용됩니다.

  • 접두사 확인을 초래한 이름 기반 작업은 접두사를 주장하는 공급자로 라우팅됩니다. 성공하면 MUP는 후속 핸들 기반 작업(예: IRP_MJ_READ 및 IRP_MJ_WRITE)이 MUP를 완전히 우회하는 동일한 공급자로 이동하도록 합니다.

  • 공급자와 클레임된 접두사는 MUP에서 유지 관리하는 접두사 캐시에 입력됩니다. 후속 이름 기반 작업의 경우 MUP은 이 접두사 캐시를 사용하여 공급자가 접두사 확인을 수행하기 전에 이미 접두사를 요청했는지 여부를 확인합니다. 이 접두사 캐시의 각 항목은 캐시에 추가되면 시간 제한(TTL이라고 함)이 적용됩니다. 이 시간 제한이 만료된 후 항목이 throw됩니다. 이때 MUP는 후속 이름 기반 작업에서 이 접두사에 대해 접두사 확인을 다시 수행합니다.

MUP은 MUP에 등록된 네트워크 리디렉션자에게 IOCTL_REDIR_QUERY_PATH 요청을 실행하여 접두사 확인을 수행합니다. IOCTL_REDIR_QUERY_PATH 대한 입력 및 출력 버퍼는 비페이지 풀에서 할당됩니다.

네트워크 리디렉션자는 IRP 구조의 RequesterMode 멤버가 KernelMode인지 확인하여 이 IOCTL의 커널 모드 보낸 사람만 허용해야 합니다.

MUP은 요청 정보에 QUERY_PATH_REQUEST 구조를 사용합니다.

UNC 공급자는 응답 정보에 QUERY_PATH_RESPONSE 구조를 사용해야 합니다.

FsRtlRegisterUncProvider를 호출하여 MUP를 사용하여 UNC 공급자로 등록하는 모든 레거시 네트워크 리디렉터(RDBSS를 사용하지 않음)는 IOCTL_REDIR_QUERY_PATH 요청을 받습니다.

UNC 공급자로서의 지원을 나타내는 네트워크 미니 리다이렉터에서는 이 접두사 클레임이 IRP_MJ_CREATE 호출인 것처럼 수신합니다. 이 만들기 요청은 FILE_CREATE_TREE_CONNECTION 플래그가 설정된 사용자 모드 CreateFile 호출과 유사합니다. 네트워크 미니 리디렉션자는 MRxLowIOSubmit[LOWIO_OP_IOCTL]에 대한 호출로 접두사 클레임을 수신하지 않습니다. 접두사 클레임의 경우 RDBSS는 MRxCreateSrvCall 요청을 네트워크 미니 리트리버로 보낸 다음 MRxSrvCallWinnerNotify MRxCreateVNetRoot 대한 호출을 보냅니다. 네트워크 미니 리디렉션기가 RDBSS에 등록되면 RDBSS는 네트워크 미니 리다이렉터에 대한 드라이버 디스패치 테이블을 복사하여 내부 RDBSS 진입점을 가리킵니다. 그런 다음 RDBSS는 네트워크 미니 리디렉션자에 대해 내부적으로 이 IOCTL_REDIR_QUERY_PATH 수신하고 MRxCreateSrvCall, MRxSrvCallWinnerNotifyMRxCreateVNetRoot를 호출합니다. 원래 IOCTL_REDIR_QUERY_PATH IRP는 MRxCreateSrvCall 루틴에 전달된 RX_CONTEXT 구조에 포함됩니다. 또한 MRxCreateSrvCall전달된 RX_CONTEXT 다음 멤버가 수정됩니다.

  • 원래 IRP가 IRP_MJ_DEVICE_CONTROL 경우에도 MajorFunction 멤버는 IRP_MJ_CREATE 설정됩니다.
  • PrefixClaim.SuppliedPathName.Buffer 멤버는 QUERY_PATH_REQUEST 구조체의 FilePathName 멤버로 설정됩니다.
  • PrefixClaim.SuppliedPathName.Length 멤버는 QUERY_PATH_REQUEST 구조체의 PathNameLength 멤버로 설정됩니다.
  • Create.NtCreateParameters.SecurityContext 멤버는 QUERY_PATH_REQUEST 구조체의 SecurityContext 멤버로 설정됩니다.
  • Create.ThisIsATreeConnectOpen 멤버가 TRUE로 설정됩니다.
  • Create.Flags 멤버에는 RX_CONTEXT_CREATE_FLAG_UNC_NAME 비트 집합이 있습니다.

네트워크 미니 리트리버가 접두사 클레임의 세부 정보를 보려면 MRxCreateSrvCall에 전달된 RX_CONTEXT 이러한 멤버를 읽을 수 있습니다. 그렇지 않으면 MRxCreateSrvCall 호출이 성공한 경우 서버 공유에 연결하고 STATUS_SUCCESS 반환하려고 시도할 수 있습니다. RDBSS는 네트워크 미니 리렉터 대신 접두사 클레임을 만듭니다.

네트워크 미니 리다이렉터에서 이 IOCTL을 직접 받을 수 있는 한 가지 경우가 있습니다. 네트워크 미니 리디렉션자는 RDBSS를 초기화하고 등록하기 전에 드라이버 디스패치 테이블의 복사본을 저장할 수 있습니다. RxRegisterMinirdr를 호출하여 RDBSS에 등록한 후 네트워크 미니 리디렉터는 RDBSS에 의해 설치된 새 드라이버 디스패치 테이블 진입점의 복사본을 저장하고 원래 드라이버 디스패치 테이블을 복원할 수 있습니다. 복원된 드라이버 디스패치 테이블은 네트워크 미니 리렉터에 대한 관심 있는 IRP에 대해 수신된 IRP를 확인한 후 RDBSS 드라이버 디스패치 진입점으로 호출이 전달되도록 수정해야 합니다. RDBSS는 드라이버가 RDBSS를 초기화하고 RxRegisterMinrdr를 호출할 때 네트워크 미니 리디렉터의 드라이버 디스패치 테이블을 통해 복사합니다. rdbsslib.lib에 연결하는 네트워크 미니 리디렉터는 RxRegisterMinrdr를 호출한 후 RDBSS 정적 라이브러리를 초기화하고 드라이버 디스패치 테이블을 복원하기 위해 DriverEntry 루틴에서 RxDriverEntry를 호출하기 전에 원래 드라이버 디스패치 테이블을 저장해야 합니다. 이 요구 사항은 RDBSS가 RxDriverEntryRxRegisterMinrdr 루틴 모두에서 네트워크 미니 리디렉터 디스패치 테이블을 통해 복사하기 때문입니다.

REG_SZ ProviderOrder 레지스트리 값은 접두사 확인 중에 공급자가 쿼리되는 순서를 제어합니다. 이 값은 다음 키 아래에 저장됩니다.

HKLM\System\CurrentControlSet\Control\NetworkProvider\Order

ProviderOrder 레지스트리 값의 개별 공급자 이름은 선행 또는 후행 공백이 없는 쉼표로 구분됩니다.

예를 들어 이 값에는 문자열이 포함될 수 있습니다.

RDPNP,LanmanWorkstation,WebClient

UNC 경로 \\server>\<share>\<<path>가 지정된 경우 MUP는 접두사(예: \\server\share 또는 \\server)가 MUP 접두사 캐시에 없는 경우 접두사 확인 요청을 실행합니다. MUP은 공급자가 접두사를 클레임하거나 모든 공급자가 쿼리될 때까지 다음 순서로 각 공급자에게 접두사 확인 요청을 보냅니다.

  1. TS 클라이언트(RDPNP)

  2. SMB 리다이렉터(LanmanWorkstation)

  3. WebDAV 리디렉터(WebClient)

ProviderOrder 레지스트리 값을 변경하려면 MUP에서 다시 부팅해야 합니다.

MUP은 나열된 각 공급자 이름을 사용하여 다음 레지스트리 키에서 공급자의 레지스트리 키를 찾습니다.

HKLM\System\CurrentControlSet\Services\<ProviderName>

그런 다음 MUP는 NetworkProvider 하위 키에서 DeviceName 값을 읽어 공급자가 등록할 디바이스 이름을 찾습니다. 공급자가 실제로 등록되면 MUP는 전달된 디바이스 이름과 알려진 공급자의 디바이스 이름 목록과 일치합니다. 그런 다음 접두사 확인을 위해 순서가 지정된 목록에 공급자를 배치합니다. 이 목록의 공급자 순서는 앞에서 설명한 ProviderOrder 레지스트리 값에 지정된 순서를 기반으로 합니다.

WNet 공급자에 대한 쿼리를 기반으로 네트워크 연결을 설정하는 사용자 모드 DLL인 MPR(다중 공급자 라우터)도 이 공급자 순서를 적용합니다.

MUP은 접두사 확인 요청을 직렬로 실행하고 첫 번째 공급자가 접두사를 클레임하는 즉시 중지됩니다. 따라서 이전 예제에서 RDPNP가 접두사를 클레임하는 경우 MUP는 SMB 또는 WebDAV 리디렉션자를 호출하지 않습니다.

"직렬 접두사 확인"(병렬과 비교)은 ProviderOrder 우선 순위가 낮은 네트워크 리디렉터로 인해 ProviderOrder 우선 순위가 높은 네트워크 리디렉터에 대한 성능 문제가 발생하지 않도록 방지합니다. 예를 들어 특정 유형의 TCP/IP 패킷(예: HTTP에 대한 액세스)을 차단하도록 구성된 방화벽이 있는 원격 서버를 고려해 보십시오(예: SMB 액세스). 이 경우 SMB 네트워크 리디렉터가 ProviderOrder 값의 첫 번째 공급자로 구성되고 접두사를 신속하게 클레임하더라도 WebDAV 리디렉터에서 TCP 연결 시간이 초과될 때까지 대기하여 접두사 확인 완료가 크게 지연될 수 있습니다.