SRBEX_DATA 구조체(srb.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에 사용할 수 있는 값은 다음 중 하나입니다.
값 | 의미 |
---|---|
|
SRB 확장 데이터 형식을 알 수 없습니다. |
|
SRB 확장 데이터의 형식은 SRBEX_DATA_BIDIRECTIONAL 구조체로 지정됩니다. |
|
SRB 확장 데이터의 형식은 SRBEX_DATA_SCSI_CDB16 구조체로 지정됩니다. |
|
SRB 확장 데이터의 형식은 SRBEX_DATA_SCSI_CDB32 구조체로 지정됩니다. |
|
SRB 확장 데이터의 형식은 SRBEX_DATA_SCSI_CDB_VAR 구조체로 지정됩니다. |
|
SRB 확장 데이터의 형식은 SRBEX_DATA_WMI 구조로 지정됩니다. |
|
SRB 확장 데이터의 형식은 SRBEX_DATA_POWER 구조체로 지정됩니다. |
|
SRB 확장 데이터의 형식은 SRBEX_DATA_PNP 구조체로 지정됩니다. |
|
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 사용하여 사용할 수 있습니다. |
머리글 | srb.h(Storport.h, Srb.h, Minitape.h 포함) |