RxRegisterMinirdr 함수(mrx.h)

RxRegisterMinirdr 는 네트워크 미니 리디렉터 드라이버에 의해 호출되어 RDBSS에 드라이버를 등록합니다. 그러면 등록 정보가 내부 등록 테이블에 추가됩니다. RDBSS는 네트워크 미니 리다이렉터에 대한 디바이스 개체도 빌드합니다.

구문

NTSTATUS RxRegisterMinirdr(
  [out]     OUT PRDBSS_DEVICE_OBJECT *DeviceObject,
  [in, out] IN OUT PDRIVER_OBJECT    DriverObject,
  [in]      IN PMINIRDR_DISPATCH     MrdrDispatch,
  [in]      IN ULONG                 Controls,
  [in]      IN PUNICODE_STRING       DeviceName,
  [in]      IN ULONG                 DeviceExtensionSize,
  [in]      IN DEVICE_TYPE           DeviceType,
  [in]      IN ULONG                 DeviceCharacteristics
);

매개 변수

[out] DeviceObject

생성된 디바이스 개체가 저장될 위치에 대한 포인터입니다.

[in, out] DriverObject

네트워크 미니 리다이렉터 드라이버의 드라이버 개체에 대한 포인터입니다. 각 드라이버는 DriverEntry 루틴에 대한 매개 변수에서 드라이버 개체에 대한 포인터를 받습니다. 이 드라이버 개체는 네트워크 미니 리다이렉터 드라이버에 대한 디바이스 개체를 만드는 데 사용됩니다.

[in] MrdrDispatch

네트워크 미니 리다이렉터에 대한 디스패치 테이블에 대한 포인터입니다. 이 디스패치 테이블에는 네트워크 미니 리다이렉터에 대한 구성 정보와 네트워크 미니 리렉터 커널 드라이버에서 구현한 콜백 루틴에 대한 포인터 테이블이 포함됩니다. RDBSS는 이 콜백 루틴 목록을 통해 네트워크 미니 리다이렉터 드라이버를 호출합니다.

[in] Controls

네트워크 미니 리다이렉터 드라이버의 기능과 RDBSS가 네트워크 미니 리다이렉터 드라이버에 대한 초기화 및 이름 테이블 캐싱을 처리하는 방법을 결정하는 옵션 집합입니다. 이러한 옵션에는 다음 비트의 조합이 포함될 수 있습니다.

RX_REGISTERMINI_FLAG_DONT_PROVIDE_UNCS

이 플래그가 설정되면 네트워크 미니 리다이렉터에서 UNC 이름을 지원하지 않음을 나타냅니다.

RX_REGISTERMINI_FLAG_DONT_PROVIDE_MAILSLOTS

이 플래그가 설정되면 네트워크 미니 리다이렉터에서 mailslot을 지원하지 않음을 나타냅니다.

RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH

이 플래그가 설정되면 네트워크 미니 리트리렉터에서 RDBSS 내부 루틴을 가리키도록 미니 리트리렉터 드라이버의 드라이버 디스패치 진입점을 초기화하지 않도록 합니다. 이 옵션은 비정상적인 경우에만 사용됩니다. 일반적으로 RDBSS는 네트워크 미니 리트리렉터 드라이버 개체의 드라이버 디스패치 진입점 및 빠른 I/O 디스패치를 RDBSS 내부 루틴을 가리키도록 설정합니다.

RX_REGISTERMINI_FLAG_DONT_INIT_PREFIX_N_SCAVENGER

이 플래그가 설정되면 네트워크 미니 리다이렉터에서 RDBSS가 이 이름 테이블을 청소하기 위해 내부 네트워크 이름 테이블 및 청소기 데이터 구조를 초기화하지 않기를 원한다는 것을 나타냅니다. 이 옵션은 네트워크 공유 이름 자체에 대한 캐싱을 처리하고 이름 캐싱 및 청소에 RDBSS 기능을 사용하지 않으려는 네트워크 미니 리다이렉터에 대해 설정됩니다.

[in] DeviceName

디바이스 개체의 이름을 지정하는 0으로 끝나는 유니코드 문자열이 포함된 버퍼에 대한 포인터입니다. 문자열은 전체 경로 이름이어야 합니다. 이 매개 변수는 RDBSS에서 DeviceName 으로 IoCreateDevice 루틴에 전달됩니다.

[in] DeviceExtensionSize

디바이스 개체의 디바이스 확장에 할당할 바이트 수에 대해 미니 리디렉터 드라이버에서 지정한 크기입니다. 디바이스 확장의 내부 구조는 드라이버 정의입니다. 이 매개 변수는 RDBSS에서 사용하는 디바이스 확장의 크기에 추가되고 RDBSS에서 DeviceExtensionSize 매개 변수로 IoCreateDevice 루틴에 전달됩니다.

[in] DeviceType

디바이스 개체를 만들 때 사용되는 디바이스 유형입니다. 새 유형의 디바이스에 대한 디바이스 유형 또는 공급업체 정의 값을 나타내는 시스템 정의 FILE_DEVICE_XXX 상수 중 하나를 지정합니다. 이 값은 일반적으로 네트워크 미니 리다이렉터 드라이버에 대해 FILE_DEVICE_NETWORK_FILE_SYSTEM. 이 매개 변수는 RDBSS에서 DeviceType 으로 IoCreateDevice 루틴에 전달됩니다.

[in] DeviceCharacteristics

디바이스 개체를 만들 때 사용되는 디바이스 특성입니다. 드라이버 디바이스에 대한 추가 정보를 제공하는 하나 이상의 시스템 정의 상수를 함께 지정합니다. 이 값은 네트워크 미니 리다이렉터 드라이버에 대한 FILE_REMOTE_DEVICE 포함해야 하지만 FILE_DEVICE_SECURE_OPEN 같은 다른 특성과 결합될 수 있습니다. 이 매개 변수는 RDBSS에서 IoCreateDevice 루틴에 DeviceCharacteristics로 전달됩니다.

반환 값

RxRegisterMinirdr 는 성공 시 STATUS_SUCCESS 반환하거나 실패 시 다음 오류 값 중 하나를 반환합니다.

반환 코드 설명
STATUS_INSUFFICIENT_RESOURCES
디바이스 개체를 만들 리소스가 부족했습니다.
STATUS_INVALID_PARAMETER
잘못된 매개 변수가 루틴에 전달되었습니다. DeviceObject 매개 변수가 NULL 포인터인 경우 이 오류가 반환됩니다.
STATUS_OBJECT_NAME_COLLISION
이 디바이스 개체를 만들려고 할 때 이름 충돌이 발생했습니다.
STATUS_OBJECT_NAME_EXISTS
이 이름의 디바이스 개체가 이미 있습니다.
STATUS_UNSUCCESSFUL
디바이스 개체를 만들기 위한 호출은 NULL 디바이스 개체를 반환했습니다.

설명

네트워크 미니 리다이렉터는 드라이버가 커널에 의해 로드되고 드라이버가 언로드될 때 RDBSS로 등록을 취소할 때마다 RDBSS에 등록됩니다. 비모놀리식 드라이버(SMB 네트워크 미니 리다이렉터)는 다른 커널 드라이버인 Rdbss.sys통신합니다. Rdbsslib.lib와 정적으로 연결되는 모놀리식 네트워크 미니 리디렉터 드라이버의 경우 이 통신은 Rdbsslib.lib 라이브러리 루틴에 대한 호출일 뿐입니다.

네트워크 미니 리디렉터는 RDBSS에서 내보낸 등록 루틴인 RxRegisterMinirdr를 호출하여 로드되었음을 RDBSS에 알릴 수 있습니다. 네트워크 미니 리디렉터 드라이버가 처음 시작되면( DriverEntry 루틴에서) 드라이버는 RDBSS RxRegisterMinirdr 루틴을 호출하여 네트워크 미니 리디렉터 드라이버를 RDBSS에 등록합니다. RxRegisterMinirdr에 전달된 매개 변수에 따라 RDBSS는 IoCreateDevice를 호출하여 네트워크 미니 리디렉터 드라이버에 대한 디바이스 개체를 만듭니다.

이 등록 프로세스의 일부로 네트워크 미니 리디렉터는 네트워크 미니 리디렉터에 대한 구성 정보와 네트워크 미니 리디렉터 드라이버에서 구현한 콜백 루틴에 대한 포인터의 디스패치 테이블을 포함하는 MINIRDR_DISPATCH 큰 구조에 대한 포인터인 RxRegisterMinirdr 에 매개 변수를 전달합니다. 이 구성 데이터는 이 네트워크 미니 리다이렉터와 함께 사용할 내부 RDBSS 테이블을 구성하는 데 사용됩니다. RDBSS는 이 구조에 전달된 콜백 루틴을 사용하여 네트워크 미니 리다이렉터와 통신합니다. 네트워크 미니 리다이렉터에서 이러한 콜백 루틴 중 일부만 구현하도록 선택할 수 있습니다. 구현되지 않은 콜백 루틴은 RDBSS에 전달된 디스패치 테이블의 NULL 포인터로 설정해야 합니다. 네트워크 미니 리다이렉터에 의해 구현된 콜백 루틴만 RDBSS에서 호출됩니다.

RxRegisterMinirdr 루틴은 네트워크 미니 리디렉터 드라이버의 모든 드라이버 디스패치 루틴을 최상위 RDBSS 디스패치 루틴인 RxFsdDispatch를 가리키도록 설정합니다. 네트워크 미니 리디렉터는 드라이버 디스패치 진입점의 복사본을 저장하고, RxRegisterMinirdr를 호출하고, RxRegisterMinirdr 호출이 반환된 후 자체 진입점으로 드라이버 디스패 치를 다시 작성하여 이 동작을 재정의할 수 있습니다. 또한 네트워크 미니 리디렉터는 controls 매개 변수에 RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH 비트가 설정된 경우 드라이버 디스패치 루틴이 RxRegisterMinirdr 루틴에 의해 복사되지 않도록 방지할 수 있습니다.

RxRegisterMinirdr 호출에 성공하면 DeviceObject 매개 변수가 가리키는 RDBSS_DEVICE_OBJECT 멤버 수가 다음을 포함하여 초기화됩니다.

  • Dispatch 멤버가 MrdrDispatch 매개 변수로 설정됩니다.
  • RegistrationControls 멤버는 Controls 매개 변수로 설정됩니다.
  • DeviceName 멤버가 DeviceName 매개 변수로 설정됩니다.
  • Controls 매개 변수의 RX_REGISTERMINI_FLAG_DONT_PROVIDE_UNCS 비트가 설정되지 않은 경우 RegisterUncProvider 멤버가 TRUE로 설정됩니다.
  • Controls 매개 변수의 RX_REGISTERMINI_FLAG_DONT_PROVIDE_MAILSLOTS 비트가 설정되지 않은 경우 RegisterMailSlotProvider 멤버가 TRUE로 설정됩니다.
  • NetworkProviderPriority 멤버는 MUP에서 사용할 네트워크 공급자 우선 순위로 설정됩니다.
RxRegisterMinirdr 호출이 성공하고 Controls 매개 변수의 RX_REGISTERMINI_FLAG_DONT_INIT_PREFIX_N_SCAVENGER 비트가 설정되지 않은 경우 다음을 포함하여 DeviceObject 매개 변수가 가리키는 RDBSS_DEVICE_OBJECT 다른 여러 멤버가 초기화됩니다.
  • pRxNetNameTable 멤버 구조가 초기화됩니다.
  • RxNetNameTableInDeviceObject.IsNetNameTable 멤버가 TRUE로 설정됩니다.
  • pRdbssScavenger 멤버 구조가 초기화됩니다.
RxRegisterMinirdr 호출에 성공하면 RDBSS는 RDBSS에서 네트워크 미니 리디렉터의 내부 상태를 RDBSS_STARTABLE 설정합니다.

네트워크 미니 리디렉터에서는 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
RxStartMiniRdr 루틴이 호출되면 RDBSS에서 네트워크 미니 리디렉터 MrxStart 루틴을 호출합니다. RDBSS RxStartMinirdr 는 일반적으로 네트워크 미니 리디렉터를 시작하기 위한 사용자 모드 애플리케이션 또는 서비스의 FSCTL 또는 IOCTL 요청의 결과로 호출됩니다. RxStartMinirdr에 대한 호출은 RxRegisterMinirdr를 성공적으로 호출한 후 네트워크 미니 리디렉터의 DriverEntry 루틴에서 수행할 수 없습니다. 시작 처리 중 일부는 드라이버 초기화를 완료해야 하기 때문입니다. RxStartMinirdr 호출이 수신되면 RDBSS는 네트워크 미니 리디렉터의 MrxStart 루틴을 호출하여 시작 프로세스를 완료합니다. MrxStart 호출이 성공을 반환하면 RDBSS는 RDBSS의 미니 리디렉터의 내부 상태를 RDBSS_STARTED 설정합니다.

요구 사항

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

추가 정보

DriverEntry

IoCreateDevice

MRxStart

RxFsdDispatch

RxSetDomainForMailslotBroadcast

RxStartMinirdr

RxStopMinirdr

RxUnregisterMinirdr

RxpUnregisterMinirdr

__RxFillAndInstallFastIoDispatch