Share via


HW_STREAM_REQUEST_BLOCK 구조체(strmini.h)

스트림 클래스 드라이버는 HW_STREAM_REQUEST_BLOCK 구조를 사용하여 미니드라이버 제공 콜백을 사용하여 미니드라이버와 정보를 전달합니다.

구문

typedef struct _HW_STREAM_REQUEST_BLOCK {
  ULONG                           SizeOfThisPacket;
  SRB_COMMAND                     Command;
  NTSTATUS                        Status;
  PHW_STREAM_OBJECT               StreamObject;
  PVOID                           HwDeviceExtension;
  PVOID                           SRBExtension;
  union {
    PKSSTREAM_HEADER                       DataBufferArray;
    PHW_STREAM_DESCRIPTOR                  StreamBuffer;
    KSSTATE                                StreamState;
    PSTREAM_TIME_REFERENCE                 TimeReference;
    PSTREAM_PROPERTY_DESCRIPTOR            PropertyInfo;
    PKSDATAFORMAT                          OpenFormat;
    struct _PORT_CONFIGURATION_INFORMATION *ConfigInfo;
    HANDLE                                 MasterClockHandle;
    DEVICE_POWER_STATE                     DeviceState;
    PSTREAM_DATA_INTERSECT_INFO            IntersectInfo;
    PVOID                                  MethodInfo;
    LONG                                   FilterTypeIndex;
    BOOLEAN                                Idle;
  } CommandData;
  _CommandData                    _CommandData;
  ULONG                           NumberOfBuffers;
  ULONG                           TimeoutCounter;
  ULONG                           TimeoutOriginal;
  struct _HW_STREAM_REQUEST_BLOCK *NextSRB;
  PIRP                            Irp;
  ULONG                           Flags;
  PVOID                           HwInstanceExtension;
  union {
    ULONG NumberOfBytesToTransfer;
    ULONG ActualBytesTransferred;
  };
  PKSSCATTER_GATHER               ScatterGatherBuffer;
  ULONG                           NumberOfPhysicalPages;
  ULONG                           NumberOfScatterGatherElements;
  ULONG                           Reserved[1];
} HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK;

멤버

SizeOfThisPacket

이 구조체의 크기(바이트)를 지정합니다.

Command

미니 드라이버의 콜백에서 수행할 작업을 지정합니다. 클래스 드라이버는 SRB_XXX 명령 코드를 미니드라이버 콜백에 전달합니다.

Status

미니드라이버가 스트림 요청을 완료하면 이 멤버를 요청의 상태 코드로 채웁니다. 미니드라이버에서 사용할 것으로 예상되는 상태 코드에 대한 적절한 StrMiniXxx요청 루틴에 대한 설명서를 참조하세요.

StreamObject

스트림 지향 요청의 경우 클래스 드라이버는 클래스 드라이버가 요청하는 스트림을 지정하는 HW_STREAM_OBJECT 구조를 가리키도록 설정합니다.

HwDeviceExtension

미니 드라이버의 디바이스 확장에 대한 포인터입니다. 미니 드라이버는 이 버퍼를 사용하여 개인 정보를 기록할 수 있습니다. 미니 드라이버는 StreamClassRegisterMinidriver를 통해 자신을 등록할 때 통과하는 HW_INITIALIZATION_DATA 구조에서 이 버퍼의 크기를 설정합니다. 또한 클래스 드라이버는 미니드라이버에 전달하는 HW_STREAM_OBJECT, HW_TIME_CONTEXTPORT_CONFIGURATION_INFORMATION 구조체의 HwDeviceExtension 멤버에서 이 버퍼에 대한 포인터를 전달합니다.

SRBExtension

이 스트림 요청 블록을 처리하는 동안 사용할 미니드라이버에 대해 클래스 드라이버가 할당하는 초기화되지 않은 버퍼를 가리킵니다. 미니드라이버가 블록 처리를 완료하면 이 버퍼의 할당이 취소됩니다(자세한 내용은 StreamClassDeviceNotification 또는 StreamClassStreamNotification 참조).

CommandData

CommandData 는 명령 코드별 데이터에 대해 제공되는 멤버의 공용 구조체입니다.

CommandData.DataBufferArray

KSSTREAM_HEADER 구조체의 배열에 대한 포인터입니다. 이 배열의 항목 수는 NumberOfBuffers에 지정됩니다. 각 KSSTREAM_HEADER 하나의 데이터 블록을 설명합니다.

이 멤버는 명령 코드가 SRB_READ_DATA 또는 SRB_WRITE_DATA 경우에 사용됩니다.

CommandData.StreamBuffer

미니드라이버가 지원하는 커널 스트리밍 의미 체계에 대한 설명으로 채우는 HW_STREAM_DESCRIPTOR 구조를 가리킵니다.

미니 드라이버는 해당 PORT_CONFIGURATION_INFORMATION 구조체의 StreamDescriptorSize 멤버에서 이 버퍼의 크기를 지정합니다.

이 멤버는 명령 코드가 SRB_GET_STREAM_INFO 때 사용됩니다.

CommandData.StreamState

스트림 상태입니다. 자세한 내용은 KSPROPERTY_CONNECTION_STATE 참조하세요.

이 멤버는 명령 코드가 SRB_GET_STREAM_STATE 또는 SRB_SET_STREAM_STATE 경우에 사용됩니다.

CommandData.TimeReference

STREAM_TIME_REFERENCE 구조체에 대한 포인터입니다.

CommandData.PropertyInfo

속성 가져오기 또는 설정 작업에 대한 매개 변수를 지정하는 STREAM_PROPERTY_DESCRIPTOR 구조를 가리킵니다.

이 멤버는 명령 코드가 SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTY 또는 SRB_SET_STREAM_PROPERTY 경우에 사용됩니다.

CommandData.OpenFormat

형식을 지정하는 KSDATAFORMAT 구조체에 대한 포인터입니다.

이 멤버는 명령 코드가 SRB_OPEN_STREAM 또는 SRB_PROPOSE_DATA_FORMAT 경우에 사용됩니다.

CommandData.ConfigInfo

디바이스를 초기화하는 데 사용되는 PORT_CONFIGURATION_INFORMATION 구조체에 대한 포인터

이 멤버는 명령 코드가 SRB_INITIALIZE_DEVICE 때 사용됩니다.

CommandData.MasterClockHandle

이제 master 클록으로 사용되는 클록 개체에 대한 핸들입니다.

이 멤버는 명령 코드가 SRB_OPEN_MASTER_CLOCK 또는 SRB_INDICATE_MASTER_CLOCK 경우에 사용됩니다.

CommandData.DeviceState

새 전원 상태를 지정합니다.

이 멤버는 명령 코드가 SRB_CHANGE_POWER_STATE 때 사용됩니다.

CommandData.IntersectInfo

이 작업의 매개 변수를 설명하는 STREAM_DATA_INTERSECT_INFO 구조체에 대한 포인터입니다.

이 멤버는 명령 코드가 SRB_GET_DATA_INTERSECTION 때 사용됩니다.

CommandData.MethodInfo

메서드 데이터를 읽거나 쓸 버퍼에 대한 포인터입니다.

CommandData.FilterTypeIndex

SRB_OPEN_DEVICE_INSTANCE 대한 필터 형식 인덱스입니다.

CommandData.Idle

디바이스에 대한 열린 핸들이 남아 있지 않으면 이 멤버가 TRUE 로 설정됩니다. 디바이스가 더 이상 유휴 상태가 아니면 이 멤버가 FALSE 로 설정됩니다(디바이스에 대한 핸들이 열렸습니다).

이 멤버는 명령 코드가 SRB_NOTIFY_IDLE_STATE 때 사용됩니다.

_CommandData

CommandData 는 명령 코드별 데이터에 대해 제공되는 멤버의 공용 구조체입니다.

NumberOfBuffers

Command가 SRB_READ_DATA 또는 SRB_WRITE_DATA 경우 CommandData.DataBufferArray가 가리키는 주소에서 시작하는 KSSTREAM_HEADER 구조체 배열의 항목 수를 지정합니다. 그렇지 않으면 이 매개 변수가 사용되지 않습니다.

TimeoutCounter

이 요청 시간이 초과되기 전의 시간(초)입니다. 클래스 드라이버는 이 값을 초당 한 번 감소합니다. 클래스 드라이버가 이 요청을 완료하기 전에 TimeoutCounter 를 0으로 줄이면 미니드라이버의 StrMiniRequestTimeout 루틴을 호출합니다. 미니드라이버에서 이 값을 0으로 설정하면 요청 시간이 초과되지 않습니다.

TimeoutOriginal

클래스 드라이버는 SRB를 만들 때 TimeoutCounter 의 원래 값으로 설정합니다.

NextSRB

다른 스트림 요청 블록을 가리킵니다. 미니 드라이버는 이 멤버를 사용하여 요청 블록을 큐에 대기할 수 있습니다.

Irp

요청에 대한 IRP에 대한 포인터입니다. 대부분의 미니드라이버에서는 이 멤버를 사용할 필요가 없습니다.

Flags

요청 유형을 지정합니다. 클래스 드라이버와 미니 드라이버는 이 멤버를 사용하여 클래스 드라이버가 이 스트림 요청 블록을 전달한 콜백을 결정할 수 있습니다.

사용된 콜백
없음 StrMiniReceiveDevicePacket
SRB_HW_FLAGS_STREAM_REQUEST StrMiniReceiveStreamControlPacket
SRB_HW_FLAGS_DATA_TRANSFER StrMiniReceiveStreamDataPacket
SRB_HW_FLAGS_STREAM_REQUEST StrMiniReceiveStreamDataPacket

SRB_HW_FLAGS_STREAM_REQUEST 비트는 스트림별 요청(미니드라이버의 StrMiniReceiveStreamXxx패킷 루틴에 전달됨)에 대해 설정됩니다. SRB_HW_FLAGS_DATA_TRANSFER 비트는 데이터 전송 요청(미니드라이버에 전달됨)에 대해 설정됩니다.

HwInstanceExtension

미니 드라이버의 instance 확장에 대한 포인터입니다. 미니 드라이버는 이 버퍼를 사용하여 미니드라이버의 이 instance 전역 개인 정보를 기록할 수 있습니다. 미니 드라이버는 StreamClassRegisterMinidriver를 통해 자신을 등록할 때 통과하는 HW_INITIALIZATION_DATA 구조에서 이 버퍼의 크기를 설정합니다.

NumberOfBytesToTransfer

SRB_READ_DATA 또는 SRB_WRITE_DATA 요청의 경우 전송할 바이트 수입니다.

ActualBytesTransferred

제어 요청의 경우 실제로 전송된 바이트 수입니다.

ScatterGatherBuffer

양식의 KSSCATTER_GATHER 구조체 배열을 가리킵니다.

typedef struct {
    PHYSICAL_ADDRESS PhysicalAddress;
    ULONG Length;
} KSSCATTER_GATHER, *PKSSCATTER_GATHER;

배열은 미니 드라이버에서 DMA를 수행하는 데 사용할 수 있는 분산/수집 목록을 설명합니다. 메모리를 프로브, 잠금, 매핑 또는 플러시할 필요가 없습니다. 스트림 클래스 드라이버는 미니 드라이버에 대해 이러한 작업을 수행합니다.

NumberOfPhysicalPages

ScatterGatherBuffer 멤버에 전달된 배열의 크기를 지정합니다.

NumberOfScatterGatherElements

ScatterGatherBuffer가 가리키는 물리적 요소의 수를 지정합니다.

Reserved[1]

예약된[1] 필드는 시스템 사용을 위해 예약되어 있습니다. 사용하지 마십시오.

설명

스트림 클래스 드라이버는 HW_STREAM_REQUEST_BLOCK 구조체에 대한 포인터를 미니드라이버의 StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPacketStrMiniReceiveDevicePacket 루틴에 전달합니다.

미니 드라이버는 요청 시간이 초과되거나 요청을 완료할 때까지 이 스트림 요청 블록을 소유합니다. 미니 드라이버는 디바이스별 요청에 대해 StreamClassDeviceNotification(DeviceRequestComplete, pSrb-HwDeviceExtension>, pSRB)을 호출하거나 스트림별 요청에 대해 StreamClassStreamNotification(StreamRequestComplete, pSrb-StreamObject>, pSrb)을 호출하여 요청을 완료했음을 클래스 드라이버에 알릴 수 있습니다. (미니 드라이버는 StreamClassCompleteRequestAndMarkQueueReady(pSrb)를 호출하여 요청을 완료할 수도 있습니다. 자세한 내용은 해당 루틴을 참조하세요.)

클래스 드라이버가 요청을 시간 초과하면 요청 처리를 종료할 책임이 있는 미니드라이버의 StrMiniRequestTimeout 루틴을 호출합니다. 미니드라이버가 나중에 처리하기 위해 요청을 큐에 대기하는 경우 TimeoutCounter 멤버를 0으로 설정해야 합니다. 그러면 클래스 드라이버가 요청 시간을 초과하지 못하게 됩니다. 미니드라이버가 요청 처리를 다시 시작할 준비가 되면 TimeoutCounter 멤버를TimeoutOriginal 값으로 다시 설정해야 합니다.

요구 사항

요구 사항
헤더 strmini.h(Strmini.h 포함)