SpbCx 개체 핸들

이 항목에서는 SPB 프레임워크 확장(SpbCx) 라이브러리에 대해 정의된 개체 핸들에 대해 설명합니다.

또한 SerCx2 DDI는 KMDF(Kernel-Mode Driver Framework)에서 정의한 두 가지 제네릭 개체 핸들 형식인 WDFDEVICE 및 WDFREQUEST를 사용합니다. 프레임워크 핸들 형식에 대한 자세한 내용은 프레임워크 개체 요약을 참조하세요.

이 항목에서는 다음 개체 핸들에 대해 설명합니다.

헤더: Spbcx.h

SPBREQUEST 개체 핸들

SPBREQUEST 개체 핸들은 버스의 대상 디바이스에 발급된 I/O 요청을 나타냅니다.

DECLARE_HANDLE(SPBREQUEST)

SPBREQUEST 개체 클래스는 I/O 관리자가 디스패치하는 I/O 요청을 나타내는 WDFREQUEST 개체 클래스에서 파생됩니다. 따라서 WDFREQUEST 핸들 값을 매개 변수로 사용하는 WdfRequestXxx 메서드는 SPBREQUEST 핸들 값을 유효한 매개 변수 값으로 허용합니다. 이러한 메서드에 대한 자세한 내용은 프레임워크 요청 개체를 참조하세요.

그러나 일부 SpbCx 메서드 및 콜백 함수에는 특히 SPBREQUEST 핸들이 매개 변수로 필요합니다. 이러한 매개 변수의 경우 SPBREQUEST 핸들이 아닌 WDFREQUEST 핸들을 대체하는 것은 오류입니다.

예를 들어 SpbRequestGetTransferParameters 메서드는 SPBREQUEST 핸들을 매개 변수로 사용합니다. 이 매개 변수에 대해 SPBREQUEST 핸들도 아닌 WDFREQUEST 핸들을 제공하려면 오류가 발생합니다. 이 요구 사항의 이유는 SPBREQUEST 개체가 추가 SPB 관련 상태 정보를 저장하여 I/O 전송 시퀀스를 지원해야 하기 때문입니다. WDFREQUEST 기본 개체 클래스는 이 지원을 제공하지 않습니다.

디바이스를 초기화하는 동안 SPB 컨트롤러 드라이버는 SpbControllerSetRequestAttributes 메서드를 호출하여 요청당 컨텍스트를 SPBREQUEST 핸들에 할당할 수 있습니다.

SPBTARGET 개체 핸들

SPBTARGET 개체 핸들은 클라이언트(주변 드라이버)에서 버스의 주소 지정 가능한 포트 또는 주변 디바이스로의 논리적 연결을 식별합니다.

DECLARE_HANDLE(SPBTARGET)

I2C 버스의 경우 SPBTARGET 핸들은 특정 디바이스 주소에 해당합니다.
SPI 버스의 경우 SPBTARGET 핸들은 디바이스 선택 줄에 해당합니다.

일반적으로 SPBTARGET 개체는 EvtSpbTargetConnect 이벤트 콜백의 시작부터 해당 EvtSpbTargetDisconnect 이벤트 콜백의 끝까지 존재합니다. 그러나 SPB 컨트롤러 드라이버가 대상에 대한 I/O 요청을 처리하는 동안 개체가 예기치 않게 사라지는 것을 방지하기 위해 SPBTARGET 개체에 대한 추가 참조를 사용하는 경우 SPBTARGET 개체의 수명이 두 번째 콜백 이상으로 확장될 수 있습니다.

SPB 컨트롤러 드라이버는 SPB 컨트롤러 디바이스에 대한 모든 하드웨어 관련 작업을 수행합니다. 클라이언트가 버스의 대상에 대한 연결을 열기 위해 IRP_MJ_CREATE 요청을 보내면 컨트롤러 드라이버의 I/O 큐를 관리하는 SPB 프레임워크 확장(SpbCx)이 이 드라이버의 EvtSpbTargetConnect 콜백 함수를 호출하여 SPB 컨트롤러 드라이버에 이 요청을 전달합니다. 이 함수의 Target 매개 변수는 SPBTARGET 핸들입니다. 함수는 이 핸들을 사용하여 PnP 관리자에서 연결 관련 리소스 정보(예: 디바이스 주소)를 검색할 수 있습니다. 클라이언트가 연결을 닫기 위해 IRP_MJ_CLOSE 요청을 보내면 SpbCx는 이 요청을 SPB 컨트롤러 드라이버의 EvtSpbTargetDisconnect 콜백 함수에 전달하여 이러한 리소스를 해제합니다.

Exclusive-Mode 액세스

클라이언트에는 대상 디바이스에 액세스할 수 있는 전용 모드가 있습니다. 한 번에 하나의 클라이언트만 특정 대상 디바이스에 연결할 수 있습니다. SpbCx는 버스의 대상 디바이스 주소에 대해 SPBTARGET 핸들이 하나만 있는지 확인합니다. SpbCx는 둘 이상의 클라이언트가 대상 디바이스로 보내는 I/O 요청의 인터리빙을 지원하지 않으므로 이 제한이 필요합니다. 대상 디바이스가 여러 클라이언트에서 요청을 받을 수 있어야 하는 경우 이 디바이스에는 요청된 작업을 제대로 인터리브할 수 있는 컨트롤러 드라이버와는 별도로 MUX 드라이버가 필요합니다.

KMDF와의 상호 운용성

SerCx2 드라이버 지원 메서드SpbCx에서 정의한 SpbCx 이벤트 콜백 함수SPBTARGET 핸들을 사용하여 버스의 대상 디바이스에 대한 열린 연결을 나타냅니다. 그러나 컨트롤러 드라이버는 일반적으로 대상 디바이스를 지정하기 위해 SPBTARGET 핸들 대신 WDFFILEOBJECT 핸들이 필요한 KMDF 메서드를 호출해야 합니다.

SPBTARGET 개체는 WDFFILEOBJECT 개체와 비슷합니다. 그러나 SPBTARGET 개체에는 SPB 관련 추가 정보가 포함됩니다. 예를 들어 IOCTL_SPB_EXECUTE_SEQUENCE I/O 제어 요청을 처리하는 동안 대상 디바이스의 SPBTARGET 개체는 I/O 전송 시퀀스의 전송 상태를 추적합니다.

대상에 대한 WDFFILEOBJECT 핸들을 가져오기 위해 SPB 컨트롤러 드라이버는 SpbTargetGetFileObject 메서드를 호출합니다. 이 메서드는 열린 대상 디바이스에 대한 SPBTARGET 핸들을 입력 매개 변수로 수락하고 해당 WDFFILEOBJECT 핸들을 이 대상에 반환합니다.

KMDF 규칙에 따라 SPB 컨트롤러 드라이버는 대상 디바이스의 SPBTARGET 개체에 자체 컨텍스트를 연결할 수 있으며, 이 컨텍스트에는 연결된 EvtCleanupCallbackEvtDestroyCallback 콜백 함수가 포함될 수 있습니다. SPB 컨트롤러 드라이버는 이 컨텍스트를 사용하여 컨트롤러 드라이버 및 대상 디바이스와 관련된 정보를 추적합니다. 또한 이 드라이버는 타이머, DPC 또는 필요한 경우 I/O 요청 및 I/O 큐와 같은 SPBTARGET 개체의 자식 개체를 만들 수 있습니다.