다음을 통해 공유


RxStartMinirdr 함수(mrx.h)

RxStartMinirdr 는 RDBSS에 등록하기 위해 이전에 호출한 네트워크 미니 리디렉터를 시작하기 위해 호출됩니다. RxStartMinirdr의 일부로 RDBSS는 드라이버가 UNC 이름에 대한 지원을 나타내는 경우 네트워크 미니 리디렉터 드라이버를 UNC(범용 명명 규칙) 공급자로 MUP(다중 UNC 공급자)로 등록합니다.

구문

NTSTATUS RxStartMinirdr(
  [in]  IN PRX_CONTEXT RxContext,
  [out] OUT PBOOLEAN   PostToFsp
);

매개 변수

[in] RxContext

디바이스 개체를 가져와 파일 시스템 프로세스인지 확인하는 데 사용할 RX_CONTEXT 구조체에 대한 포인터입니다.

[out] PostToFsp

파일 시스템 프로세스에서 나중에 처리하기 위해 요청을 게시해야 하는 경우 반환 시 TRUE로 설정된 논리 값에 대한 포인터입니다.

반환 값

RxStartMinirdr 는 시작 시퀀스가 성공했거나 다음 오류 값 중 하나인 경우 STATUS_SUCCESS 반환합니다.

반환 코드 설명
STATUS_ACCESS_DENIED 액세스가 거부되어 UNC 공급자로 등록하는 요청이 실패했습니다.
STATUS_ACCESS_VIOLATION UNC 공급자로 등록하는 요청이 액세스 위반으로 실패했습니다.
STATUS_INSUFFICIENT_RESOURCES 이 루틴을 완료할 수 있는 리소스가 부족했습니다.
STATUS_PENDING RDBSS 및 네트워크 미니 리디렉터에 대한 시작 시퀀스는 사용자 모드 애플리케이션 프로세스가 아닌 시스템 프로세스의 컨텍스트에서 완료되어야 합니다. RxStartMinirdr에 대한 호출이 사용자 모드 프로세스(예: 사용자 모드 서비스 요청)에서 가져온 경우 RDBSS 내에서 나중에 처리하기 위해 요청이 게시되고 STATUS_PENDING 반환됩니다. 대기하지 않고 특정 내부 RDBSS 잠금을 가져올 수 없는 경우에도 이 오류가 반환될 수 있습니다. 호출은 나중에 시스템 스레드에서 완료됩니다.
STATUS_REDIRECTOR_STARTED 네트워크 미니 리 디렉터가 이미 시작되었습니다.

설명

네트워크 미니 리디렉션기는 드라이버가 커널에 의해 로드될 때마다 RDBSS에 등록한 다음 드라이버가 언로드될 때 RDBSS로 등록을 취소합니다. 네트워크 미니 리디렉터는 RDBSS에서 내보낸 등록 루틴인 RxRegisterMinirdr를 호출하여 로드되었음을 RDBSS에 알릴 수 있습니다. 이 등록 프로세스의 일부로 네트워크 미니 리디렉터는 네트워크 미니 리디렉터에 대한 구성 정보와 네트워크 미니 리디렉터 드라이버가 구현한 콜백 루틴에 대한 포인터 테이블을 포함하는 MINIRDR_DISPATCH 큰 구조에 대한 포인터인 RxRegisterMinirdr 에 매개 변수를 전달합니다. RDBSS는 이 구조에 전달된 콜백 루틴을 사용하여 네트워크 미니 리렉터와 통신합니다.

네트워크 미니 리디렉터에서는 MINIRDR_DISPATCH 구조에 전달된 콜백 루틴 중 하나인 MRxStart 루틴에 대한 호출을 받을 때까지 실제로 작업을 시작하지 않습니다. 네트워크 미니 리디렉터에서 자체 드라이버 디스패치 진입점을 유지하지 않는 한 작업에 대한 콜백 루틴을 수신하려는 경우 네트워크 미니 리디렉터 드라이버에서 MrxStart 콜백 루틴을 구현해야 합니다. 그렇지 않으면 RDBSS는 MrxStart 가 성공적으로 반환될 때까지 드라이버에 대한 다음 I/O 요청 패킷만 허용합니다.

  • IRPSP의 FileObject-FileName.Length 매개 변수가 0이고 FileObject-RelatedFileObject>> 매개 변수가 NULL인 디바이스 만들기 작업 및 디바이스 작업에 대한 IRP 요청입니다.

다른 IRP 요청의 경우 RDBSS 디스패치 루틴 RxFsdDispatch는 STATUS_REDIRECTOR_NOT_STARTED 상태 반환합니다.

RDBSS 디스패치 루틴은 다음 I/O 요청 패킷에 대한 요청도 실패합니다.

  • IRP_MJ_CREATE_MAILSLOT
  • IRP_MJ_CREATE_NAMED_PIPE

네트워크 미니 리디렉터 MrxStart 루틴은 RxStartMinirdr 루틴이 호출되면 RDBSS에서 호출됩니다. RDBSS RxStartMinirdr 루틴은 일반적으로 네트워크 미니 리디렉터를 시작하기 위한 사용자 모드 애플리케이션 또는 서비스의 FSCTL 또는 IOCTL 요청의 결과로 호출됩니다. RxRegisterMinirdr를 성공적으로 호출한 후에는 네트워크 미니 리디렉터의 DriverEntry 루틴에서 RxStartMinirdr에 대한 호출을 수행할 수 없습니다. 시작 처리 중 일부는 드라이버 초기화를 완료해야 하므로.

RDBSS가 사용자 모드에서 네트워크 미니 리디렉션기 드라이버로 전송된 FSCTL 또는 IOCTL 요청을 수신하면 RDBSS는 RX_CONTEXT 구조를 만들고 이 호출을 네트워크 미니 리다이렉터의 MRxLowIOSubmit[LOWIO_OP_FSCTL] 또는 MRxLowIOSubmit[LOWIO_OP_IOCTL] MINIRDR_DISPATCH 구조에 정의된 콜백 루틴에 전달합니다. 네트워크 미니 리디렉터의 이 콜백 루틴 구현은 RxStartMinirdr를 시작하고 호출하는 요청을 인식합니다. 이 일반적인 이벤트 프로세스는 아래에 자세히 나와 있습니다.

  1. 사용자 모드 애플리케이션은 프라이빗 FSCTL 또는 IOCTL 요청을 실행하여 네트워크 미니 리디렉션기를 시작합니다.

  2. RDBSS는 RDBSS 내부 루틴을 가리키도록 미니 리디렉터 드라이버의 드라이버 디스패치 진입점을 대체했기 때문에 RDBSS 커널 드라이버는 네트워크 미니 리디렉터를 대신하여 FSCTL 또는 IOCTL 요청을 받습니다. 이렇게 하면 네트워크 미니 리디렉터가 RxRegisterMinirdr를 호출할 때 Controls 매개 변수의 RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH 설정하지 않은 것으로 가정합니다. RxRegisterMinirdr에 전달된 이 옵션은 비정상적이며 네트워크 미니 리디렉터가 드라이버 디스패치 진입점을 대체하기를 원하지 않음을 나타냅니다.

  3. RDBSS는 네트워크 리디렉션자를 대신하여 내부적으로 FSCTL 또는 IOCTL 요청을 받습니다. RDBSS 디스패처는 RX_CONTEXT 구조를 할당하고 초기화합니다. 그런 다음 RDBSS는 이 네트워크 미니 리디렉션자에 대한 MINIRDR_DISPATCH 구조에 정의된 네트워크 미니 리디렉션기 MRxLowIOSubmit[LOW_OP_FSCTL] 또는 MRxLowIOSubmit[LOW_OP_IOCTL] 루틴을 호출하여 초기화된 RX_CONTEXT 구조를 매개 변수로 전달합니다.

  4. 이 콜백 루틴의 네트워크 미니 리디렉터 구현은 RxStartMinirdr를 시작하고 호출하기 위한 프라이빗 FSCTL 또는 IOCTL 요청을 인식하여 RDBSS에서 받은 RX_CONTEXT 구조를 RxContext 매개 변수로 전달하고 RxContextPostToFSP 멤버 주소를 PostToFsp 매개 변수로 전달합니다.

  5. 이 호출은 사용자 모드에서 시작되었으므로 RxStartMinirdr 는 STATUS_PENDING 반환하고 PostToFsp 를 TRUE로 설정합니다.

  6. 네트워크 미니 리디렉션자 MRxLowIOSubmit[LOW_OP_FSCTL] 또는 MRxLowIOSubmit[LOW_OP_IOCTL] 루틴은 이 반환 값을 수신하고 RDBSS 디스패처에 다시 전달합니다.

  7. RDBSS 디스패처는 STATUS_PENDING 반환 값을 수신하고 PostToFsp 를 TRUE로 설정한 다음, 작업자 스레드에 요청을 게시하여 네트워크 미니 리 디렉터에 대한 호출을 다시 실행합니다.

이 시점 이후에는 FSCTL 또는 IOCTL이 비동기 또는 동기 작업으로 요청되었는지 여부에 따라 두 가지 가능한 결과가 있습니다.

비동기 요청인 경우 다음이 발생합니다.

  • 사용자 모드 호출자는 호출에서 STATUS_PENDING 응답을 받습니다. 게시된 작업자 스레드는 결국 파일 시스템 스레드에서 RxStartMinirdr 를 호출하고 호출이 처리됩니다. RxStartMinirdr 루틴은 요청된 경우 네트워크 미니 리디렉터를 UNC 공급자로 등록하려고 시도합니다. Windows Vista 이전의 Windows 버전에서 RDBSS는 네트워크 미니 리디렉션자를 I/O 관리자에 파일 시스템으로 등록하려고 시도합니다. 이러한 호출이 성공하면 RxStartMinirdr 는 네트워크 미니 리디렉터에 의해 구현된 MrxStart 콜백 루틴을 호출합니다. MrxStart의 반환 값은 결국 호출 시퀀스 프로세스를 비동기 작업으로 시작한 사용자 모드 애플리케이션으로 반환됩니다.

동기 요청인 경우 다음이 발생합니다.

  • 사용자 모드 호출자는 STATUS_PENDING 응답을 받지 않지만 게시된 작업자 스레드에서 호출이 반환될 때까지 기다려야 합니다. 게시된 작업자 스레드는 결국 파일 시스템 스레드에서 RxStartMinirdr 를 호출하고 호출이 처리됩니다. RxStartMinirdr 루틴은 요청된 경우 네트워크 미니 리디렉터를 UNC 공급자로 등록하려고 시도합니다. Windows Vista 이전의 Windows 버전에서 RDBSS는 네트워크 미니 리디렉션자를 I/O 관리자에 파일 시스템으로 등록하려고 시도합니다. 이러한 호출이 성공하면 RxStartMinirdr 는 네트워크 미니 리디렉터에 의해 구현된 MrxStart 콜백 루틴을 호출합니다. MrxStart의 반환 값은 호출 시퀀스 프로세스를 시작한 사용자 모드 애플리케이션으로 반환됩니다.

네트워크 미니 리디렉터가 RDBSS(RxRegisterMinirdr에 대한 Controls 매개 변수)에 등록할 때 UNC에 대한 지원을 나타내는 경우 RxStartMinirdr는 네트워크 미니 리디렉터의 DeviceName 매개 변수를 MUP을 사용하여 UNC 공급자로 등록하려고 시도합니다(RDBSS는 네트워크 미니 리디렉션자를 대신하여 FsRtlRegisterUncProvider를 호출함).

Windows Vista 이전 버전의 Windows에서 RxStartMinirdr 는 파일 시스템을 I/O 관리자에 등록합니다(RDBSS는 네트워크 미니 리디렉터를 대신하여 IoRegisterFileSystem 을 호출함).

호출에 성공하면 RxStartMinirdr 에서 네트워크 미니 리디렉터 MrxStart 루틴을 호출합니다. MrxStart가 성공을 반환하면 RDBSS에서 미니 리디렉터의 내부 상태가 RDBSS_STARTED 설정됩니다. 미니 리디렉터 디바이스 개체의 StartStopContext.Version 멤버도 증가합니다.

비동기 작업이 요청된 경우 RDBSS 및 네트워크 미니 리디렉터에 대한 시작 시퀀스를 시스템 프로세스의 컨텍스트에서 완료해야 합니다. RxStartMinirdr에 대한 호출이 사용자 모드 프로세스(예: 사용자 모드 서비스 요청)에서 가져온 경우 요청은 RDBSS에서 내부적으로 나중에 처리하기 위해 작업 큐에 게시되고 STATUS_PENDING 반환되고 PostToFsp 매개 변수가 TRUE로 설정됩니다. 또한 대기하지 않고 특정 내부 RDBSS 잠금을 가져올 수 없는 경우 STATUS_PENDING 반환되고 PostToFsp 가 TRUE로 설정됩니다. STATUS_PENDING 반환되면 시스템 프로세스 내에서 RxStartMinirdr 가 다시 호출됩니다. RxStartMinirdr에 대한 호출을 시작한 FSCTL 또는 IOCTL 요청이 비동기 작업으로 설정된 경우 RDBSS는 사용자 모드에서 원래 FSCTL 또는 IOCTL 요청에 대한 호출 체인을 백업하는 STATUS_PENDING 반환합니다. 반면, FSCTL 또는 IOCTL 요청이 동기 작업을 위한 경우 호출도 나중에 실행하기 위해 작업 스레드에 게시되지만 파일 시스템 프로세스의 컨텍스트에서 RxStartMinirdr 가 실행될 때까지 FSCTL 또는 IOCTL 호출은 사용자 모드로 돌아가지 않습니다. 이 경우 FSCTL 또는 IOCTL의 호출자는 STATUS_PENDING 오류 반환을 볼 수 없습니다. 보다 일반적인 동작은 이러한 시작/중지 작업에 대한 동기 요청을 시작하여 사용자 모드 애플리케이션 코드를 간소화하는 것입니다.

비정상적인 종료 또는 기타 오류 발생 시 RxStartMinirdr 는 UNC 공급자를 MUP에 등록 해제하고, 파일 시스템을 등록 취소하고, mailslot 브로드캐스트에서 사용할 도메인 이름을 저장하기 위해 할당된 메모리를 해제하고, 내부 RDBSS 테이블을 업데이트하는 등 이러한 작업을 실행 취소하려고 시도합니다.

요구 사항

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

추가 정보

, RxpUnregisterMinirdr

DriverEntry

FsRtlRegisterUncProvider

IoRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

RxRegisterMinirdr

RxSetDomainForMailslotBroadcast

RxStopMinirdr

RxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch