다음을 통해 공유


EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START 콜백 함수(sercx.h)

EvtSerCx2CustomReceiveTransactionStart 이벤트 콜백 함수는 SerCx2(직렬 프레임워크 확장) 버전 2에서 호출되어 사용자 지정 수신 트랜잭션을 시작합니다.

구문

EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START EvtSercx2CustomReceiveTransactionStart;

void EvtSercx2CustomReceiveTransactionStart(
  [in] SERCX2CUSTOMRECEIVETRANSACTION CustomReceiveTransaction,
  [in] WDFREQUEST Request,
  [in] PMDL Mdl,
  [in] ULONG Offset,
  [in] ULONG Length
)
{...}

매개 변수

[in] CustomReceiveTransaction

사용자 지정 수신 트랜잭션 개체에 대한 SERCX2CUSTOMRECEIVETRANSACTION 핸들입니다. 이전에 SerCx2CustomReceiveTransactionCreate 메서드를 호출하여 이 개체를 만든 직렬 컨트롤러 드라이버입니다.

[in] Request

사용자 지정 수신 트랜잭션과 연결된 프레임워크 요청 개체에 대한 핸들입니다. 드라이버는 이 요청을 완료할 책임이 있습니다. 이 요청은 클라이언트에서 보낸 IRP_MJ_READ 요청이 아니므로 직렬 컨트롤러 드라이버는 이 요청을 사용하여 읽기 버퍼에 액세스하지 않아야 합니다. 이 요청은 주로 취소, 완료 및 큐 전달(필요한 경우)에 사용됩니다. 클라이언트의 읽기 요청에 대한 읽기 버퍼에 액세스하려면 Mdl, OffsetLength 매개 변수를 사용합니다.

[in] Mdl

사용자 지정 수신 트랜잭션에 대한 읽기 버퍼에 걸쳐 있는 메모리 페이지를 설명하는 MDL 에 대한 포인터입니다. 데이터 전송에 대한 분산/수집 목록은 OffsetLength 매개 변수로 지정된 이 메모리의 영역을 사용합니다.

[in] Offset

데이터 전송의 시작 오프셋입니다. 이 매개 변수는 MDL에서 설명하는 버퍼 영역의 시작부터의 바이트 오프셋입니다. MDL이 버퍼 공간의 총 N바이트 수를 지정하는 경우 Offset 의 가능한 값은 0에서 N-1까지의 범위에 있습니다.

[in] Length

데이터 전송의 크기(바이트)입니다. MDL이 버퍼 공간의 총 N바이트 수를 지정하는 경우 Length 의 가능한 값은 1에서 N-오프셋까지의 범위에 있습니다.

반환 값

없음

설명

직렬 컨트롤러 드라이버는 사용자 지정 수신 트랜잭션 개체를 만드는 경우 이 함수를 구현해야 합니다. 드라이버는 이 개체를 만드는 SerCx2CustomReceiveTransactionCreate 호출에 함수를 등록합니다.

SerCx2가 EvtSerCx2CustomReceiveTransactionStart 함수를 호출한 후 직렬 컨트롤러 드라이버는 직렬 컨트롤러 하드웨어의 수신 FIFO에서 읽기 요청의 버퍼로 데이터를 이동하는 사용자 지정 데이터 전송 메커니즘을 프로그래밍하여 트랜잭션을 시작합니다. 요청을 즉시 완료할 수 없는 한 EvtSerCx2CustomReceiveTransactionStart 함수가 반환되기 전에 드라이버는 WdfRequestMarkCancelableEx 와 같은 메서드를 호출하여 요청을 취소 가능으로 표시해야 합니다.

EvtSerCx2CustomReceiveTransactionStart 함수가 트랜잭션을 시작한 후 SerCx2는 EvtSerCx2CustomReceiveTransactionQueryProgress 이벤트 콜백 함수를 주기적으로 호출하여 이 트랜잭션을 수행하는 직렬 컨트롤러 드라이버의 진행 상황을 모니터링합니다. 트랜잭션이 완료되고 드라이버가 보류 중인 읽기 요청을 완료한 후 드라이버가 이 함수를 구현하는 경우 SerCx2는 EvtSerCx2CustomReceiveTransactionCleanup 이벤트 콜백 함수를 호출합니다.

직렬 컨트롤러 드라이버가 EvtSerCx2CustomReceiveTransactionInitialize 이벤트 콜백 함수를 구현하는 경우 SerCx2는 EvtSerCx2CustomReceiveTransactionStart 함수를 호출하기 전에 이 함수를 호출합니다. EvtSerCx2CustomReceiveTransactionStart 호출 직전과 EvtSerCx2CustomReceiveTransactionInitialize 호출이 반환된 후 SerCx2는 읽기 요청 시간이 초과되었는지 여부를 감지하는 타이머를 시작합니다. 자세한 내용은 SERIAL_TIMEOUTS 총 시간 제한에 대한 설명을 참조하세요.

사용자 지정 데이터 전송 메커니즘이 버스 master DMA 디바이스인 경우 EvtSerCx2CustomReceiveTransactionStart 함수는 WdfDmaTransactionInitializeUsingOffset과 같은 메서드를 호출하여 Mdl, OffsetLength 매개 변수에 설명된 읽기 버퍼를 사용하는 DMA 트랜잭션을 시작할 수 있습니다.

Request 매개 변수로 식별된 요청 개체에 프라이빗 컨텍스트에 대한 스토리지가 포함된 경우 직렬 컨트롤러 드라이버가 컨텍스트에 처음 액세스할 때 이 스토리지가 초기화되지 않을 수 있습니다. 첫 번째 액세스에서 드라이버는 일반적으로 컨텍스트를 0으로 채운 다음 필요한 경우 0이 아닌 초기 값이 필요한 컨텍스트의 필드를 명시적으로 설정해야 합니다.

자세한 내용은 SerCx2 Custom-Receive 트랜잭션을 참조하세요.

예제

EvtSerCx2CustomReceiveTransactionStart 콜백 함수를 정의하려면 먼저 정의 중인 콜백 함수의 형식을 식별하는 함수 선언을 제공해야 합니다. Windows는 드라이버에 대한 콜백 함수 형식 집합을 제공합니다. 콜백 함수 형식을 사용하여 함수를 선언하면 드라이버에 대한 코드 분석, SDV( 정적 드라이버 검증 도구 ) 및 기타 확인 도구에서 오류를 찾는 데 도움이 되며 Windows 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.

예를 들어 라는 MyCustomReceiveTransactionStartEvtSerCx2CustomReceiveTransactionStart 콜백 함수를 정의하려면 이 코드 예제와 같이 EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START 함수 형식을 사용합니다.

EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START  MyCustomReceiveTransactionStart;

그런 다음 다음과 같이 콜백 함수를 구현합니다.

_Use_decl_annotations_
VOID
  MyCustomReceiveTransactionStart(
    SERCX2CUSTOMRECEIVETRANSACTION  CustomReceiveTransaction,
    WDFREQUEST  Request,
    PMDL  Mdl,
    ULONG  Offset,
    ULONG  Length
    )
  {...}

EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START 함수 형식은 Sercx.h 헤더 파일에 정의되어 있습니다. 코드 분석 도구를 실행할 때 오류를 보다 정확하게 식별하려면 함수 정의에 Use_decl_annotations 주석을 추가해야 합니다. Use_decl_annotations 주석은 헤더 파일의 EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START 함수 형식에 적용되는 주석이 사용되도록 합니다. 함수 선언에 대한 요구 사항에 대한 자세한 내용은 KMDF 드라이버에 함수 역할 형식을 사용하여 함수 선언을 참조하세요. Use_decl_annotations 대한 자세한 내용은 함수 동작에 주석을 추가를 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8.1 사용하여 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 sercx.h
IRQL IRQL <= DISPATCH_LEVEL 호출합니다.

추가 정보

IRP_MJ_READ

Mdl

SERCX2CUSTOMRECEIVETRANSACTION

SERIAL_TIMEOUTS

SerCx2CustomReceiveTransactionCreate

WdfDmaTransactionInitializeUsingOffset

WdfRequestMarkCancelableEx