다음을 통해 공유


PMRX_CREATE_SRVCALL 콜백 함수(mrx.h)

네트워크 미니 리디렉터에서 SRV_CALL 구조를 만들고 서버와의 연결을 설정하도록 요청하기 위해 RDBSS에서 MRxCreateSrvCall 루틴을 호출합니다.

구문

PMRX_CREATE_SRVCALL PmrxCreateSrvcall;

NTSTATUS PmrxCreateSrvcall(
  IN OUT PMRX_SRV_CALL SrvCall,
  IN OUT PMRX_SRVCALL_CALLBACK_CONTEXT SrvCallCallBackContext
)
{...}

매개 변수

SrvCall

[in, out] 만들 SRV_CALL 구조체에 대한 포인터입니다.

SrvCallCallBackContext

[in, out] MRxCreateSrvCall 요청이 마침내 완료된 경우 네트워크 미니 리디렉터에서 RDBSS에 알리기 위해 사용하는 콜백 컨텍스트에 대한 포인터입니다. SrvCallCallBackContext 매개 변수는 MRxCreateSrvCall 요청이 마지막으로 완료된 경우 미니 리디렉터에서 호출하는 콜백 루틴뿐만 아니라 이 요청에 대한 RX_CONTEXT 구조가 포함된 MRX_SRVCALLDOWN_STRUCTURE 구조를 가리킵니다.

반환 값

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

호출이 완료되고 MRX_SRVCALLDOWN_STRUCTURE 구조에서 콜백 멤버의 루틴이 네트워크 미니 리트리렉터에 의해 호출되면 최종 완료 상태 SrvCallCallBackContext-Status> 멤버에 반환됩니다. 이 멤버는 처음에 네트워크 미니 리다이렉터에서 완료 시 이 값을 변경할 때까지 STATUS_BAD_NETWORK_PATH 포함합니다.

SrvCallCallBackContext-Status> 멤버는 호출이 완료되면 성공 시 STATUS_SUCCESS 포함되거나 실패 시 다음과 같은 일반적인 오류 코드 중 하나를 포함합니다(다른 오류 코드는 가능하지만).

반환 코드 설명
STATUS_BAD_NETWORK_PATH 지정된 네트워크 경로가 잘못되었습니다.
STATUS_NETWORK_UNREACHABLE 네트워크에 연결할 수 없습니다.

설명

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

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

MRxCreateSrvCall의 네트워크 미니 리디렉터 구현은 초기 호출에 STATUS_PENDING 반환해야 합니다. 처리가 완료되면 네트워크 미니 리디렉터에서 SrvCallCallBackContext 매개 변수의 일부로 전달되는 콜백 루틴을 호출하여 RDBSS에 호출이 완료되었음을 알리고 완료 상태 반환합니다. 네트워크 미니 리다이렉터에서 호출하는 콜백 루틴은 SrvCallCallBackContext 매개 변수의 MRX_SRVCALLDOWN_STRUCTURE 콜백 멤버로 지정됩니다. 호출의 최종 완료 상태 SrvCallCallBackContext 매개 변수의 Status 멤버에 저장되어야 합니다.

성공하면 네트워크 미니 리트리렉터도 SrvCallCallBackContextRecommunicateContext 멤버에 일부 값을 저장해야 합니다. RecommunicateContext 멤버에 저장된 값은 MRxCreateSrvCall이 성공한 경우 REcommunicateContext 매개 변수에서 RDBSS가 MRxSrvCallWinnerNotify에 전달하는 값입니다. 네트워크 미니 리트리버도 생성된 SRV_CALL 구조에 대한 SrvCall 매개 변수의 적절한 데이터를 채워야 합니다. MRxCreateSrvCall에 전달된 SrvCall 매개 변수는 SrvCallCallBackContext 매개 변수의 MRX_SRVCALLDOWN_STRUCTURE SrvCall 멤버와 동일합니다. 이 동일한 SrvCall 매개 변수는 SrvCall 매개 변수의 MRxSrvCallWinnerNotify에도 전달됩니다.

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

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

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

MRxCreateSrvCall이 구현되는 방법을 결정하는 것은 네트워크 미니 리디렉터의 개발자에게 달려 있습니다. SRV_CALL 만드는 프로세스에 상당한 시간이 걸릴 수 있는 경우 MRxCreateSrvCall 을 비동기적으로 완료해야 합니다. 전송 핸들이 필요한 경우 네트워크 미니 리다이렉터에서 이러한 핸들을 설정하기 위해 수명이 긴 시스템 프로세스를 찾아야 합니다.

이 호출이 완료되면 네트워크 미니 리트리버에서 업데이트된 SRV_CALL 구조 정보로 SrvCall 매개 변수를 수정해야 합니다.

UNC 공급자로서의 지원을 나타내는 네트워크 미니 리디렉터에서는 MUP(다중 UNC 공급자)에서 MRxCreateSrvCall에 대한 호출로 접두사 클레임을 받게 됩니다. UNC 명명 및 MUP에 대한 자세한 내용은 UNC 명명 및 MUP 지원을 참조하세요.

요구 사항

요구 사항
대상 플랫폼 데스크톱
머리글 mrx.h(Mrx.h 포함)

추가 정보

IoGetCurrentProcess

MRxCreateVNetRoot

MRxExtractNetRootName

MRxFinalizeNetRoot

MRxFinalizeSrvCall

MRxFinalizeVNetRoot

MRxPreparseName

MRxSrvCallWinnerNotify

RxDispatchToWorkerThread

RxGetRDBSSProcess