RxDriverEntry 함수(rxprocs.h)
RxDriverEntry 는 RDBSS 정적 라이브러리를 초기화하기 위해 DriverEntry 루틴에서 모놀리식 네트워크 미니 리디렉터 드라이버에 의해 호출됩니다.
모놀리식이 아닌 드라이버의 경우 이 초기화 루틴은 RDBSS.SYS 디바이스 드라이버의 DriverEntry 루틴과 동일합니다.
구문
NTSTATUS RxDriverEntry(
[in] IN PDRIVER_OBJECT DriverObject,
[in] IN PUNICODE_STRING RegistryPath
);
매개 변수
[in] DriverObject
네트워크 미니 리다이렉터 드라이버의 드라이버 개체에 대한 포인터입니다. 각 드라이버는 DriverEntry 루틴에 대한 매개 변수에서 드라이버 개체에 대한 포인터를 받습니다. 이 드라이버 개체는 네트워크 미니 리렉터 드라이버에 대한 디바이스 개체를 만드는 데 사용됩니다.
[in] RegistryPath
드라이버 매개 변수 및 기타 구성 데이터가 저장되는 레지스트리 경로를 포함하는 유니코드 문자열에 대한 포인터입니다. 이 레지스트리 경로는 일반적으로 HKLM\System\CurrentControlSet\Services 키 아래에 있는 특정 네트워크 미니 리디렉터에 대한 서비스 항목 아래에 있습니다.
반환 값
RxDriverEntry는 성공 시 STATUS_SUCCESS 반환하거나 실패 시 다음 오류 값 중 하나를 반환합니다.
반환 코드 | 설명 |
---|---|
RXINIT_START | RDBSS 초기화가 시작되었지만 오류가 발생했습니다. 이 오류 코드는 값이 5인 내부 RDBSS 열거형입니다. |
설명
RDBSSLIB와 정적으로 연결된 모놀리식 네트워크 미니 리렉터 드라이버입니다. LIB는 드라이버와 연결된 RDBSSLIB 라이브러리의 복사본을 초기화하려면 DriverEntry 루틴에서 RxDriverEntry를 호출해야 합니다. 다른 RDBSS 루틴이 호출되기 전에 모놀리식 네트워크 미니 리트리버 드라이버에서 RxDriverEntry를 호출해야 합니다.
RxDriverEntry를 호출하여 DriverEntry 루틴이 시작될 무렵 RDBSS 라이브러리의 복사본을 초기화한 후 네트워크 미니 리디렉터 드라이버는 일반적으로 DriverEntry 루틴의 뒷부분에서 RxRegisterMinirdr를 호출하여 RDBSS에 등록합니다.
RxDriverEntry 호출이 성공하면 내부 전역 RDBBS 데이터 구조가 초기화됩니다. 이러한 데이터 구조를 보호하기 위해 다양한 스핀 잠금 및 뮤텍스가 만들어집니다. 이러한 데이터 구조 중 하나는 RDBSS 메모리 데이터 구조의 최상위 구조인 RDBSS_DATA 구조입니다. DriverObject 매개 변수는 RDBSS_DATA 구조체의 DriverObject 멤버에 저장됩니다. 또한 RxDriverEntry 는 추적, 로깅 및 디버깅을 사용하도록 설정한 경우(예: 확인된 빌드) 초기화합니다.
또한 RxDriverEntry 는 RegistryPath 매개 변수로 전달된 레지스트리 경로를 열어 이 개체를 대/소문자를 구분하지 않는 문자열로 처리합니다. 이 레지스트리 키를 성공적으로 열 수 있는 경우 이 항목 아래에 매개 변수 레지스트리 키를 열려고 시도합니다.
또한 RxDriverEntry 는 HKLM\System\CurrentControlSet\Services\LanmanWorkStation\Parameters 레지스트리 키를 열려고 시도합니다.
이 키를 열 수 있는 경우 운영 체제의 버전에 따라 이 키 아래의 일부 값을 읽으려고 시도합니다.
Windows XP 이상에서 RxDriverEntry는 LanmanWorkStation\Parameters 키에서 DisableByteRangeLockingOnReadOnlyFiles 값을 열려고 시도합니다.
이 값은 부울로 처리되고 읽기 전용 파일에서 바이트 범위 잠금을 처리하기 위한 RDBSS 변수인 DisableByteRangeLockingOnReadOnlyFiles의 부울 값으로 저장되는 DWORD입니다. 이 변수는 RDBSS가 FCB의 네트워크 미니 리트리버에 의해 새 SRV_OPEN 요청을 처리하는 방법에 영향을 줍니다. 특성이 호환되는 경우 기존 SRV_OPEN 축소할 수 있는지 여부를 결정합니다. 네트워크 미니 리디렉션기 드라이버가 이 동작을 변경하려는 경우 드라이버는 RxDriverEntry 루틴이 반환된 후 DisableByteRangeLockingOnReadOnlyFiles 값을 적절한 값으로 설정해야 합니다. RDBSSLIB입니다. LIB 정적 라이브러리는 DisableByteRangeLockingOnReadOnlyFiles를 외부 변수로 노출합니다.
Windows 2000 및 Windows XP에서 RxDriverEntry는 LanmanWorkStation\Parameters 키에서 ReadAheadGranularity 값을 열려고 시도합니다.
이 값은 숫자로 처리되고 캐시 관리자에서 미리 읽을 수 있는 PAGE_SIZE 페이지 수에 대한 내부 RDBSS 옵션의 값으로 저장되는 DWORD입니다. 16보다 큰 레지스트리 값은 이 값이 16(현재 허용되는 최대값)으로 제한된 것처럼 처리됩니다. 이 내부 옵션은 프로세서의 PAGE_SIZE 횟수(예: 4K PAGE_SIZE 최대 0x10000 또는 64K)로 저장됩니다. Windows 2000 및 Windows XP에서 RDBSS는 다양한 만들기, 읽기 및 쓰기 작업에 대해 이 옵션을 사용하여 CcSetReadAheadGranularity 를 호출합니다. 네트워크 미니 리디렉션기 드라이버가 이 동작을 변경하려는 경우 드라이버는 RxDriverEntry 루틴이 반환된 후 ReadAheadGranularity 값을 적절한 값으로 설정해야 합니다. RDBSSLIB입니다. LIB 정적 라이브러리는 ReadAheadGranularity를 외부 변수로 노출합니다.
X86 시스템에서 64K는 페이징 쓰기를 실행할 때 메모리 관리자에서 발급하는 가장 큰 쓰기입니다(캐시 플러시는 메모리 관리자를 통해 쓰기 페이징). 원격 파일 시스템의 경우 64K가 최선의 선택이 아닙니다. 단일 TDI 네트워크 요청에서 전송할 수 있는 대부분의 데이터는 프로토콜 정보에 대한 오버헤드로 인해 64K 미만입니다.
Windows Server 2003에서는 ReadAheadGranularity를 설정하는 레지스트리 값이 노출되지 않으며 RDBSS 기본값은 32K(84K PAGE_SIZE 페이지)입니다. 이는 로컬 파일 시스템에 채택된 것과 동일한 기본값입니다.
RxDriverEntry 는 PsGetCurrentProcess 를 호출하여 실행 중인 커널 프로세스에 대한 포인터를 검색하고 이 값을 내부 RDBSS 데이터 구조에 저장합니다. 이 커널 프로세스를 파일 시스템 프로세스라고도 합니다.
그런 다음 RxDriverEntry는 드라이버 디스패치 테이블의 모든 항목에 대해 RxFsdDispatch 루틴에 대한 포인터를 복사합니다. 따라서 모놀리식 네트워크 미니 리디렉터 드라이버가 RDBSS 라이브러리 전에 특수 처리를 위해 특정 IRP를 받아야 하는 경우 RxDriverEntry 를 호출하기 전에 원래 드라이버 디스패치 테이블의 복사본을 저장하고 RxDriverEntry 호출 후 복원된 루틴 포인터를 저장해야 합니다. 또한 RDBSS는 이 동작을 방지하기 위한 옵션을 설정하지 않는 한 RxRegisterMinirdr이 호출될 때 모든 드라이버 디스패치 테이블 항목에 RxFsdDispatch를 복사합니다.
모놀리식이 아닌 네트워크 미니 리디렉션기 드라이버(Microsoft SMB 리디렉션기)의 경우 내부적으로 RxDriverEntry를 호출하는 로드 시 RDBSS.SYS 디바이스 드라이버가 자체 DriverEntry 루틴에서 초기화됩니다. 모놀리식 드라이버에서 RxDriverEntry 루틴은 RDBSSLIB에서 내보내집니다. LIB 정적 라이브러리 및 는 네트워크 미니 리디렉터에 의해 명시적으로 호출되어야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 데스크톱 |
머리글 | rxprocs.h(Rxprocs.h 포함) |
IRQL | <= APC_LEVEL |