다음을 통해 공유


RX_CONTEXT 및 IRP 관리

RX_CONTEXT 구조는 RDBSS 및 네트워크 미니 리디렉션기가 IRP(I/O 요청 패킷)를 관리하는 데 사용하는 기본 데이터 구조 중 하나입니다. RX_CONTEXT 구조체는 IRP가 처리되는 동안 IRP를 설명하고 IRP가 완료되면 전역 리소스를 해제할 수 있는 상태 정보를 포함합니다. RX_CONTEXT 데이터 구조는 RDBSS, 네트워크 미니 리디렉션기 및 파일 시스템에서 사용할 IRP를 캡슐화합니다. RX_CONTEXT 구조에는 단일 IRP에 대한 포인터와 IRP를 처리하는 데 필요한 모든 컨텍스트가 포함됩니다.

RX_CONTEXT 구조는 WDK(Windows 드라이버 키트) 헤더 파일 및 네트워크 미니 리디렉터 드라이버 개발에 사용되는 기타 리소스에서 IRP 컨텍스트 또는 RxContext라고도 합니다.

RX_CONTEXT 다양한 네트워크 미니 리디렉션기에서 제공하는 추가 정보가 연결된 데이터 구조입니다. 디자인 관점에서 이 추가 정보는 다음과 같은 여러 가지 방법 중 하나로 처리할 수 있습니다.

  • 컨텍스트 포인터를 RX_CONTEXT 일부로 정의할 수 있도록 허용합니다. 네트워크 미니 리디렉션자는 해당 정보를 저장하는 데 사용합니다. 즉, RX_CONTEXT 구조가 할당되고 제거될 때마다 네트워크 미니 리디렉터 드라이버는 추가 네트워크 미니 리디렉터 정보가 포함된 메모리 블록의 별도의 관련 할당 또는 소멸을 수행해야 합니다. RX_CONTEXT 구조체가 대량으로 생성되고 제거되므로 성능 관점에서는 허용 가능한 솔루션이 아닙니다.

  • 또 다른 방법은 각 RX_CONTEXT 구조체의 크기를 각 네트워크 미니 리다이렉터에 대해 미리 지정된 양으로 할당하는 것으로 구성되며, 이 크기는 미니 리다이렉터에서 사용하도록 예약됩니다. 이러한 접근 방식은 추가 할당 및 소멸을 방지하지만 RDBSS의 RX_CONTEXT 관리 코드를 복잡하게 만듭니다.

  • 세 번째 방법은 미리 지정된 영역을 할당하는 것으로 구성되며, 이는 각 RX_CONTEXT 일부로 모든 네트워크 미니 리다이렉터에 대해 동일합니다. 다양한 네트워크 미니 리디렉터에서 원하는 구조를 적용할 수 있는 형식이 지정되지 않은 영역입니다. 이러한 접근 방식은 이전 접근 방식과 관련된 단점을 극복합니다. 이는 현재 RDBSS에서 구현된 접근 방식입니다.

세 번째 방법은 RDBSS에서 사용하는 체계입니다. 따라서 네트워크 미니 리 디렉터 드라이버 개발자는 RX_CONTEXT 데이터 구조에 정의된 이 미리 지정된 영역에 맞게 연결된 프라이빗 컨텍스트를 시도하고 정의해야 합니다. 이 규칙을 위반하는 네트워크 미니 리디렉터 드라이버에는 상당한 성능 저하가 발생합니다.

네트워크 미니 리렉터에서 내보낸 많은 RDBSS 루틴 및 루틴은 시작 스레드 또는 루틴에서 사용하는 다른 스레드에서 RX_CONTEXT 구조를 참조합니다. 따라서 RX_CONTEXT 구조체는 비동기 작업에 대한 사용을 관리하기 위해 계산됩니다. 참조 수가 0으로 표시되면 마지막 역참조 작업에서 RX_CONTEXT 구조체를 마무리하고 해제할 수 있습니다.

RDBSS는 RX_CONTEXT 구조와 연결된 IRP를 조작하는 데 사용되는 여러 루틴을 제공합니다. 이러한 루틴은 RX_CONTEXT 구조를 할당, 초기화 및 삭제하는 데 사용됩니다. 이러한 루틴은 RX_CONTEXT 연결된 IRP를 완료하고 RX_CONTEXT 대한 취소 루틴을 설정하는 데도 사용됩니다.

다음 루틴은 RX_CONTEXT 구조를 조작합니다.

루틴에서 반환된 값 Description

RxCompleteRequest

이 루틴은 RX_CONTEXT 구조와 연결된 IRP를 완료하는 데 사용됩니다. 이 루틴은 RDBSS에서 내부적으로 사용되며 네트워크 미니 리디렉션기에서 사용하면 안 됩니다.

RxCompleteRequest_Real

이 루틴은 RX_CONTEXT 구조와 연결된 IRP를 완료하는 데 사용됩니다. 이 루틴은 RDBSS에서 내부적으로 사용되며 네트워크 미니 리디렉션기에서 사용하면 안 됩니다.

RxCreateRxContext

이 루틴은 새 RX_CONTEXT 구조를 할당하고 데이터 구조를 초기화합니다.

RxDereferenceAndDeleteRxContext_Real

이 루틴은 RX_CONTEXT 구조를 역참조하고 참조 수가 0으로 설정되면 RDBSS 메모리 내 데이터 구조에서 지정된 RX_CONTEXT 구조체의 할당을 취소하고 제거합니다.

RxInitializeContext

이 루틴은 새로 할당된 RX_CONTEXT 구조를 초기화합니다.

RxPrepareContextForReuse

이 루틴은 이전에 수행한 모든 작업별 할당 및 획득을 다시 설정하여 재사용할 RX_CONTEXT 구조를 준비합니다. IRP에서 가져온 매개 변수는 수정되지 않습니다. 이 루틴은 RDBSS에서 내부적으로 사용되며 네트워크 미니 리디렉션기에서 사용하면 안 됩니다.

RxResumeBlockedOperations_Serially

이 루틴은 직렬화된 차단 I/O 큐에서 다음 대기 스레드(있는 경우)를 해제합니다.

RxSetMinirdrCancelRoutine

루틴은 RX_CONTEXT 구조에 대한 네트워크 미니 리렉터 취소 루틴을 설정합니다.

__RxSynchronizeBlockingOperations

이 루틴은 차단 I/O를 동일한 작업 큐에 동기화하는 데 사용됩니다. 이 루틴은 RDBSS에서 내부적으로 명명된 파이프 작업을 동기화하는 데 사용됩니다. 이 루틴은 네트워크 미니 리디렉션기에서 유지 관리되는 별도의 큐에서 작업을 동기화하는 데 네트워크 미니 리 디렉터에서 사용할 수 있습니다.

루틴은 Windows Server 2003에서만 사용할 수 있습니다.

__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock

이 루틴은 차단 I/O를 동일한 작업 큐에 동기화하는 데 사용됩니다. 이 루틴은 RDBSS에서 내부적으로 명명된 파이프 작업을 동기화하는 데 사용됩니다. 이 루틴은 네트워크 미니 리디렉션기에서 유지 관리되는 별도의 큐에서 작업을 동기화하는 데 네트워크 미니 리 디렉터에서 사용할 수 있습니다.

루틴은 Windows XP 및 Windows 2000에서만 사용할 수 있습니다.

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

매크로 Description

RxSynchronizeBlockingOperations(RXCONTEXT, FCB, IOQUEUE)

이 매크로는 차단 I/O 요청을 동일한 작업 큐에 동기화합니다. Windows Server 2003에서 이 매크로는 DropFcbLock 매개 변수가 FALSE로 설정된 __RxSynchronizeBlockingOperations 루틴을 호출합니다.

Windows XP 및 Windows 2000에서 이 매크로는 DropFcbLock 매개 변수가 FALSE로 설정된 __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock 루틴을 호출합니다.

RxSynchronizeBlockingOperations(RXCONTEXT, FCB, IOQUEUE)

이 매크로는 차단 I/O 요청을 동일한 작업 큐에 동기화합니다. Windows Server 2003에서 이 매크로는 DropFcbLock 매개 변수가 TRUE로 설정된 __RxSynchronizeBlockingOperations 루틴을 호출합니다.

Windows XP 및 Windows 2000에서 이 매크로는 DropFcbLock 매개 변수가 TRUE로 설정된 __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock 루틴을 호출합니다.