SRBEX_DATA 구조체(storport.h)

SRBEX_DATA 구조는 확장된 SRB 데이터를 포함하기 위한 일반화된 형식입니다.

참고 SCSI 포트 드라이버 및 SCSI 미니포트 드라이버 모델은 나중에 변경되거나 사용할 수 없습니다. 대신 Storport 드라이버Storport 미니포트 드라이버 모델을 사용하는 것이 좋습니다.
 

구문

typedef struct _SRBEX_DATA {
  SRBEXDATATYPE Type;
  ULONG         Length;
  UCHAR         Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;

멤버

Type

확장된 SRB 데이터 구조에 대한 데이터 형식 표시기입니다. Type에 사용할 수 있는 값은 다음 중 하나입니다.

의미
SrbExDataTypeUnknown
SRB 확장 데이터 형식을 알 수 없습니다.
SrbExDataTypeBidirectional
SRB 확장 데이터의 형식은 SRBEX_DATA_BIDIRECTIONAL 구조체로 지정됩니다.
SrbExDataTypeScsiCdb16
SRB 확장 데이터의 형식은 SRBEX_DATA_SCSI_CDB16 구조체로 지정됩니다.
SrbExDataTypeScsiCdb32
SRB 확장 데이터의 형식은 SRBEX_DATA_SCSI_CDB32 구조체로 지정됩니다.
SrbExDataTypeScsiCdbVar
SRB 확장 데이터의 형식은 SRBEX_DATA_SCSI_CDB_VAR 구조체로 지정됩니다.
SrbExDataTypeWmi
SRB 확장 데이터의 형식은 SRBEX_DATA_WMI 구조로 지정됩니다.
SrbExDataTypePower
SRB 확장 데이터의 형식은 SRBEX_DATA_POWER 구조체로 지정됩니다.
SrbExDataTypePnp
SRB 확장 데이터의 형식은 SRBEX_DATA_PNP 구조체로 지정됩니다.
SrbExDataTypeIoInfo
SRB 확장 데이터의 형식은 SRBEX_DATA_IO_INFO 구조체로 지정됩니다.

Length

데이터 멤버에 있는 SRB 데이터의 길이(바이트)입니다.

Data[ANYSIZE_ARRAY]

확장된 SRB 데이터 블록 콘텐츠입니다.

설명

SRB 확장 데이터는 STORAGE_REQUEST_BLOCK 구조체의 SrbExDataOffset 배열에 유효한 오프셋 위치가 포함된 경우 표시됩니다. 스토리지 드라이버는 처음에 SrbExDataOffset 에 포함된 메모리 오프셋 위치를 SRBEX_DATA 구조체로 참조합니다. 그런 다음 데이터 블록에 대한 포인터가 Type 멤버의 데이터 형식 값에 따라 적절한 구조체 형식으로 캐스팅됩니다.

다음 예제 코드 조각은 SRB_FUNCTION_PNP SRB 함수에 대한 확장된 데이터에 액세스하는 방법을 보여줍니다.

BOOLEAN CheckIo( _In_ PSCSI_REQUEST_BLOCK Srb)
{
    BOOLEAN result = TRUE;
    ULONG function;
    PSTORAGE_REQUEST_BLOCK SrbEx = (PSTORAGE_REQUEST_BLOCK)Srb;
    PSRBEX_DATA SrbExData = NULL;

    function = (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK) ? SrbEx->SrbFunction : Srb->Function;

    switch (function)
    {
        case SRB_FUNCTION_PNP:
        {
            STOR_PNP_ACTION PnpAction;
            BOOLEAN ForAdapter;

            if (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
            {
                PSRBEX_DATA_PNP SrbExDataPnp = NULL;

                SrbExData = (PSRBEX_DATA) ((PUCHAR)SrbEx + SrbEx->SrbExDataOffset[0]);
                if (SrbExData->Type == SrbExDataTypePnp)
                {
                    SrbExDataPnp = (PSRBEX_DATA_PNP) SrbExData;
                    ForAdapter = (SrbExDataPnp->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
                    PnpAction = SrbExDataPnp->PnPAction;
                }
                else
                {
                    ForAdapter = FALSE;
                    result = FALSE;
                }
            }
            else
            {
                PSCSI_PNP_REQUEST_BLOCK PnpSrb = (PSCSI_PNP_REQUEST_BLOCK)Srb;

                ForAdapter = (PnpSrb->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
                PnpAction = PnpSrb->PnPAction;
           }

           if (ForAdapter)
           {
               switch (PnpAction)
               {
                   case StorRemoveDevice:
                       //
                       // ...
                       //
                       Srb->SrbStatus = SRB_STATUS_SUCCESS;
                       break;

                   default:
                       Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
                       result = FALSE;
                       break:
            }
        }

        default:
            break; 
    }

    return result;
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8
머리글 storport.h(Storport.h, Srb.h, Minitape.h 포함)

추가 정보

SRBEX_DATA_BIDIRECTIONAL

SRBEX_DATA_IO_INFO

SRBEX_DATA_PNP

SRBEX_DATA_POWER

SRBEX_DATA_SCSI_CDB16

SRBEX_DATA_SCSI_CDB32

SRBEX_DATA_SCSI_CDB_VAR

SRBEX_DATA_WMI