PMRX_CREATE_V_NET_ROOT 콜백 함수(mrx.h)

MRxCreateVNetRoot 루틴은 네트워크 미니 리디렉터에서 V_NET_ROOT 구조를 만들고 경우에 따라 NET_ROOT 구조를 만들도록 RDBSS에서 호출합니다.

구문

PMRX_CREATE_V_NET_ROOT PmrxCreateVNetRoot;

NTSTATUS PmrxCreateVNetRoot(
            IN OUT PMRX_CREATENETROOT_CONTEXT Context
)
{...}

매개 변수

Context

반환 값

RDBSS는 MRxCreateVNetRoot 가 성공 또는 실패에 대한 STATUS_PENDING 반환할 것으로 예상합니다. RDBSS는 이 호출이 비동기적으로 완료될 것으로 예상하므로 이 동작이 발생합니다. 네트워크 미니 리디렉터 MRxCreateVNetRoot에 대 한 반환 값으로 STATUS_PENDING STATUS_SUCCESS 매핑 해야 합니다.

호출이 완료되면 pCreateNetRootContext->VirtualNetRootStatuspCreateNetRootContext->NetRootStatus 멤버에 최종 완료 상태가 반환되고 pCreateNetRootContext 구조의 콜백 멤버에서 루틴이 네트워크 미니 리디렉터에 의해 호출됩니다. 이러한 멤버는 네트워크 미니 리디렉션기가 완료 시 이 값을 변경할 때까지 처음에 STATUS_SUCCESS 포함합니다. 호출이 성공적으로 완료되면 두 멤버 모두 STATUS_SUCCESS 포함합니다.

NET_ROOT 구조를 만들지 못하면 NetRootStatus 멤버에 대한 다음과 같은 일반적인 오류 코드 중 하나가 반환됩니다(다른 오류 코드는 가능하지만).

반환 코드 설명
STATUS_CONNECTION_RESET
원격 리소스에 대한 연결이 다시 설정되었습니다.
STATUS_IO_TIMEOUT
I/O 요청에 시간 초과가 발생했습니다.
STATUS_RETRY
원격 부팅 서버가 요청을 충족할 준비가 되지 않았습니다.
STATUS_UNEXPECTED_NETWORK_ERROR
일반적으로 잘못된 핸들로 인해 예기치 않은 네트워크 오류가 발생했습니다.

V_NET_ROOT 구조를 만들지 못하면 VirtualNetRootStatus 에 대한 다음과 같은 일반적인 오류 코드 중 하나가 반환됩니다(다른 오류 코드는 가능하지만).

설명

RDBSS와 네트워크 미니 리다이렉터 간의 인터페이스에 사용되는 두 가지 중요한 추상화는 SRV_CALL 구조와 NET_ROOT/V_NET_ROOT 구조입니다. SRV_CALL 구조는 연결이 설정된 서버와 연결된 컨텍스트에 해당합니다. NET_ROOT 구조체는 서버의 공유에 해당합니다. V_NET_ROOT 구조체는 네트워크 미니 리다이렉터에서 주장하는 NET_ROOT 구조 아래 네임스페이스의 일부로 볼 수 있습니다.

NET_ROOT/V_NET_ROOT 구조체를 만드는 데는 일반적으로 네트워크 왕복이 하나 이상 포함됩니다. 원격 리소스와의 네트워크 연결을 설정해야 할 수 있으므로 이 작업을 완료하는 데 상당한 시간이 걸릴 수 있습니다. 비동기 작업이 계속되도록 하기 위해 NET_ROOT/V_NET_ROOT 구조체 생성은 2단계 작업으로 모델링됩니다. NET_ROOT/V_NET_ROOT 구조를 만들기 위한 네트워크 미니 리다이렉터에 대한 각 호출 다음에 네트워크 미니 리디렉션기에서 RDBSS로 다시 호출됩니다. 이 호출은 RDBSS에 네트워크 미니 리디렉션자에 대한 요청의 완료 상태를 나타냅니다. RDBSS는 MRxCreateVNetRoot 가 비동기적으로 완료된 것으로 예상하므로 RDBSS는 MRxCreateVNetRoot 가 STATUS_PENDING 반환할 것으로 예상합니다. RDBSS는 호출이 마침내 완료되면 콜백 루틴을 사용하여 알림을 받습니다.

MRxCreateVNetRoot 는 두 가지 관심 사례를 처리해야 합니다.

  1. 새 V_NET_ROOT 구조체와 연결된 새 NET_ROOT 구조체가 만들어지고 있습니다.
  2. 기존 NET_ROOT 구조체와 연결된 새 V_NET_ROOT 구조체가 만들어지고 있습니다.
이러한 두 경우는 NET_ROOT 구조체와 연결된 컨텍스트가 NULL인지 확인하여 구분할 수 있습니다.

MRxCreateVNetRoot의 네트워크 미니 리디렉터 구현은 초기 호출에 STATUS_PENDING 반환해야 합니다. 처리가 완료되면 네트워크 미니 리디렉터에서 pCreateNetRootContext 매개 변수의 일부로 전달된 콜백 루틴을 호출하여 RDBSS에 호출이 완료되었음을 알리고 완료 상태를 반환합니다. 네트워크 미니 리디렉터에서 호출해야 하는 콜백 루틴은 pCreateNetRootContext 매개 변수로 전달된 MRX_CREATENETROOT_CONTEXT 구조체의 콜백 멤버로 지정됩니다. MRxCreateVNetRoot 호출의 최종 완료 상태는 pCreateNetRootContext 매개 변수의 VirtualNetRootStatusNetRootStatus 멤버에 저장되어야 합니다. NET_ROOT 및 V_NET_ROOT 구조체에 대해 별도의 상태가 반환됩니다.

네트워크 미니 리디렉터에서 MRxCreateVNetRoot 의 구현도 전송 핸들의 필요성으로 인해 복잡합니다. 특정 전송 관련 인터페이스에는 핸들을 만들고 모든 통신에 사용해야 합니다. NET_ROOT 또는 V_NET_ROOT 구조를 만들려면 네트워크 통신에 대한 전송 관련 핸들을 설정해야 할 수 있습니다. 네트워크 연결을 설정하는 프로세스는 시간이 오래 걸릴 수 있으므로 연결이 설정되면 가능한 한 통신을 위해 연결을 사용하는 것이 좋습니다. 원격 네트워크 리소스에 대한 전송 핸들이 설정되면 다른 여러 애플리케이션 요청에서 다시 사용할 수 있습니다. 사용자 애플리케이션이 종료되면 프로세스와 연결된 핸들이 삭제됩니다. 이러한 이유로 수명이 짧을 수 있는 일시적인 사용자 모드 프로세스의 컨텍스트에서 전송 핸들을 설정하는 것은 의미가 없습니다. 따라서 NET_ROOT 또는 V_NET_ROOT 구조는 일반적으로 이러한 전송 핸들이 통신에 사용되는 동안 사라지지 않는 잘 알려진 프로세스의 컨텍스트에서 초기화되어야 합니다.

네트워크 미니 리디렉션기에서 이를 관리하는 데 사용되는 한 가지 방법은 RDBSS 시스템 프로세스가 이러한 전송 핸들을 할당하도록 하는 것입니다. 이는 MRxCreateVNetRoot 루틴이 실행되는 방식에 영향을 줍니다. RDBSS 시스템 프로세스의 컨텍스트에서 MRxCreateVNetRoot 에 대한 요청이 실행된 경우 이 호출을 즉시 실행할 수 있으며 작업 큐에 게시할 필요가 없습니다. 그러나 문제를 방지하기 위해 MRxCreateVNetRoot 에 대한 요청이 다른 프로세스에서 온 경우 요청은 나중에 실행하기 위해 RxDispatchToWorkerThread 를 사용하여 시스템 작업 큐에 게시됩니다. RDBSS는 나중에 시스템 스레드 중 하나를 사용하여 작업 큐 요청을 처리하고 MRxCreateVNetRoot를 실행합니다. 이렇게 하면 모든 전송 핸들이 시스템 프로세스에서 소유됩니다.

네트워크 미니 리디렉터에서는 RxGetRDBSSProcess를 호출하여 RDBSS에서 MRxCreateVNetRoot에 대한 호출을 직접 수신했는지 확인할 수 있습니다. RxGetRDBSSProcess 는 RDBBS 프로세스를 반환하며 이 값은 IoGetCurrentProcess를 호출하여 반환된 현재 프로세스와 비교할 수 있습니다. RDBSS 시스템 프로세스의 컨텍스트에서 MRxCreateVNetRoot 에 대한 호출이 시작되지 않은 경우 MRxCreateVNetRoot 는 STATUS_PENDING 반환하고 RDBSS에서 나중에 실행하기 위해 RxDispatchToWorkerThread 를 사용하여 작업 큐에 호출을 게시할 수 있습니다. 일반적으로 이러한 호출은 DelayedWorkQueue에 게시됩니다.

MRxCreateVNetRoot 구현 방법을 결정하는 것은 네트워크 미니 리디렉터에 달려 있습니다. 이 프로세스에 상당한 시간이 걸릴 수 있는 경우 이 호출은 비동기적으로 완료되어야 합니다. 전송 핸들이 필요한 경우 네트워크 미니 리다이렉터에서 이러한 핸들을 설정하는 데 수명이 긴 시스템 프로세스를 원할 수 있습니다.

연결을 설정할 수 없는 경우 네트워크 미니 리다이렉터에서 NET_ROOT 및 V_NET_ROOT 구조를 연결이 끊긴 모드(지원되는 경우)로 전환하고 오프라인으로 연결을 설정할 수 있습니다.

MRxCreateVNetRoot가 완료되면 네트워크 미니 리디렉터에서 업데이트되는 적절한 NET_ROOT 및 V_NET_ROOT 구조 정보로 pCreateNetRootContext 매개 변수를 수정해야 합니다.

요구 사항

   
대상 플랫폼 데스크톱
헤더 mrx.h(Mrx.h 포함)

참고 항목

IoGetCurrentProcess

MRxCreateSrvCall

MRxExtractNetRootName

MRxFinalizeNetRoot

MRxFinalizeSrvCall

MRxFinalizeVNetRoot

MRxPreparseName

MRxSrvCallWinnerNotify

RxDispatchToWorkerThread

RxGetRDBSSProcess