다음을 통해 공유


드라이버 등록 및 시작/중지 제어

운영 체제가 시작되면 Windows는 레지스트리의 설정에 따라 RDBSS 및 모든 네트워크 미니 리디렉터 드라이버를 로드합니다. rdbsslib.lib와 정적으로 연결된 모놀리식 네트워크 미니 리디렉터 드라이버의 경우 드라이버는 DriverEntry 루틴에서 RxDriverEntry 루틴을 호출하여 네트워크 드라이버와 연결된 RDBSSLIB 라이브러리의 복사본을 초기화해야 합니다. 이 경우 다른 RDBSS 루틴을 호출하고 사용하려면 먼저 RxDriverEntry 루틴을 호출해야 합니다. 모놀리식이 아닌 네트워크 미니 리다이렉터 드라이버(Microsoft SMB 리다이렉터)의 경우 rdbss.sys 디바이스 드라이버가 로드될 때 자체 DriverEntry 루틴에서 초기화됩니다.

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

RxRegisterMinirdr 루틴은 네트워크 미니 리디렉터 드라이버의 모든 드라이버 디스패치 루틴을 최상위 RDBSS 디스패치 루틴인 RxFsdDispatch를 가리키도록 설정합니다. 네트워크 미니 리디렉터는 RxRegisterMinirdr 호출이 반환된 후 자체 진입점으로 드라이버 디스패치를 저장하고 드라이버 디스패치를 다시 작성하거나 RxRegisterMinirdr를 호출할 때 특수 매개 변수를 설정하여 이 동작을 재정의할 수 있습니다.

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

  • 디바이스에 대한 IRP 요청은 IRPSP의 FileObject-FileName.Length>가 0이고 FileObject-RelatedFileObject>가 NULL인 디바이스 작업을 만들고 디바이스 작업을 만듭니다.

다른 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(I/O 제어 코드) 요청의 결과로 호출됩니다. RxStartMinirdr에 대한 호출은 RxRegisterMinirdr를 성공적으로 호출한 후 네트워크 미니 리디렉터의 DriverEntry 루틴에서 수행할 수 없습니다. 일부 시작 처리에서는 드라이버 초기화를 완료해야 하기 때문에 가능합니다. RxStartMinirdr 호출이 수신되면 RDBSS는 네트워크 미니 리디렉터의 MrxStart 루틴을 호출하여 시작 프로세스를 완료합니다. MrxStart 호출이 성공을 반환하면 RDBSS는 RDBSS의 미니 리디렉터의 내부 상태를 RDBSS_STARTED 설정합니다.

RDBSS는 루틴 RxSetDomainForMailslotBroadcast를 내보내 mailslot 브로드캐스트의 도메인을 설정합니다. 이 루틴은 네트워크 미니 리다이렉터에서 mailslots를 지원하는 경우 등록 중에 사용됩니다.

RDBSS에서 보낸 편리한 루틴 __RxFillAndInstallFastIoDispatch 사용하여 I/O 요청 처리를 비슷한 빠른 I/O 디스패치 벡터로 처리하기 위한 모든 IRP_MJ_XXX 드라이버 루틴 포인터를 복사할 수 있지만 이 루틴은 모놀리식이 아닌 드라이버에 대해서만 작동합니다.

또한 RDBSS는 네트워크 미니 리다이렉터의 시작 또는 중지를 RDBSS에 알리기 위해 루틴을 내보냅니다. 이러한 호출은 네트워크 미니 리 디렉터에 리디렉션기를 시작하고 중지하는 사용자 모드 관리 서비스 또는 유틸리티 애플리케이션이 포함된 경우에 사용됩니다. 이 사용자 모드 서비스 또는 애플리케이션은 네트워크 미니 리다이렉터 드라이버에 사용자 지정 FSCTL 또는 IOCTL 요청을 보내 시작 또는 중지해야 함을 나타낼 수 있습니다. 리디렉터에서 RDBSS RxStartMinirdr 또는 RxStopMinirdr 루틴을 호출하여 RDBSS에 이 네트워크 미니 리디렉터의 시작 또는 중지를 알릴 수 있습니다.

다음 표에서는 RDBSS 드라이버 등록 및 시작/중지 컨트롤 루틴을 나열합니다.

루틴에서 반환된 값 Description

RxDriverEntry

이 루틴은 RDBSS를 초기화하기 위해 DriverEntry 루틴에서 모놀리식 네트워크 미니 리트리저 드라이버에 의해 호출됩니다.

모놀리식이 아닌 드라이버의 경우 이 초기화 루틴은 rbss.sys 디바이스 드라이버의 DriverEntry 루틴과 동일합니다.

RxRegisterMinirdr

이 루틴은 내부 등록 테이블에 등록 정보를 추가하는 RDBSS에 드라이버를 등록하기 위해 네트워크 미니 리렉터 드라이버에 의해 호출됩니다. RDBSS는 네트워크 미니 리다이렉터에 대한 디바이스 개체도 빌드합니다.

RxSetDomainForMailslotBroadcast

이 루틴은 네트워크 미니 리다이렉터 드라이버가 mailslot을 드라이버에서 지원하는 경우 mailslot 브로드캐스트에 사용되는 도메인을 설정하기 위해 호출됩니다.

RxStartMinirdr

이 루틴은 자신을 등록하기 위해 를 호출하는 네트워크 미니 리 디렉터에서 시작합니다. 또한 RDBSS는 드라이버가 UNC 이름에 대한 지원을 나타내는 경우 네트워크 미니 리다이렉터 드라이버를 MUP에 UNC 공급자로 등록합니다.

RxStopMinirdr

이 루틴은 네트워크 미니 리다이렉터 드라이버를 중지합니다. 중지된 드라이버는 IOCTL 또는 FSCTL 요청을 제외한 새 명령을 더 이상 받지 않습니다.

RxpUnregisterMinirdr

이 루틴은 네트워크 미니 리 디렉터 드라이버가 RDBSS에 드라이버를 등록 취소하고 내부 RDBSS 등록 테이블에서 등록 정보를 제거하기 위해 호출됩니다.

RxUnregisterMinirdr

이 루틴은 rxstruc.h에 정의된 인라인 함수로, 네트워크 미니 리다이렉터 드라이버가 RDBSS에 드라이버를 등록 해제하고 내부 RDBSS 등록 테이블에서 등록 정보를 제거하기 위해 호출합니다. RxUnregisterMinirdr 인라인 함수는 내부적으로 RxpUnregisterMinirdr를 호출합니다.

__RxFillAndInstallFastIoDispatch

이 루틴은 일반 디스패치 I/O 벡터와 동일한 빠른 I/O 디스패치 벡터를 채우고 전달된 디바이스 개체와 연결된 드라이버 개체에 설치합니다.

다음 매크로는 이러한 루틴 중 하나를 호출하는 mrx.h 헤더 파일에 정의되어 있습니다. 이 매크로는 일반적으로 __RxFillAndInstallFastIoDispatch 루틴을 직접 호출하는 대신 사용됩니다.

매크로 Description

RxFillAndInstallFastIoDispatch(__devobj, __fastiodisp)

이 매크로는 __RxFillAndInstallFastIoDispatch호출하여 일반 디스패치 I/O 벡터와 동일한 빠른 I/O 디스패치 벡터를 채우고 전달된 디바이스 개체와 연결된 드라이버 개체에 설치합니다.