IDE_REQUEST_BLOCK 구조체(irb.h)
IDE_REQUEST_BLOCK 구조체는 IDE 요청 블록을 정의합니다.
구문
typedef struct _IDE_REQUEST_BLOCK {
USHORT Function;
UCHAR IrbStatus;
UCHAR AtaStatus;
UCHAR AtaError;
UCHAR Channel;
UCHAR TargetId;
UCHAR Lun;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
UCHAR SenseInfoBufferType;
UCHAR QueueTag;
ULONG ReservedAsUlong;
ULONG IrbFlags;
ULONG TimeOutValue;
ULONG DataTransferLength;
PVOID IrbExtension;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
PVOID NextIrb;
PVOID Reserved;
union {
IDE_TASK_FILE IdeTaskFile;
UCHAR Cdb[16];
IDE_POWER_INFO PowerChange;
UCHAR AsUChar[16];
};
} IDE_REQUEST_BLOCK, *PIDE_REQUEST_BLOCK;
멤버
Function
요청이 속한 범주를 지정합니다. 아래 표에서는 I/O 요청의 분류에 대해 설명합니다.
Function | 하위 명령 | 설명 |
IRB_FUNCTION_ATA_COMMAND |
IRB_FUNCTION_ATA_IDENTIFY IRB_FUNCTION_ATA_READ IRB_FUNCTION_ATA_WRITE IRB_FUNCTION_ATA_FLUSH IRB_FUNCTION_ATA_SMART |
IRB에 ATA 명령을 설명하는 IdeTaskFile이 포함되어 있음을 나타냅니다. 하위 명령은 더 빠른 조회를 위해 요청을 더 세밀하게 그룹화함을 나타냅니다. |
IRB_FUNCTION_ATAPI_COMMAND | IRB_FUNCTION_REQUEST_SENSE | IRB에 ATAPI 명령을 설명하는 CDB가 포함되어 있음을 나타냅니다. |
IRB_FUNCTION_MINIPORT_COMMAND |
IRB_FUNCTION_ADAPTER_FLUSH IRB_FUNCTION_SHUTDOWN IRB_FUNCTION_POWER_CHANGE IRB_FUNCTION_POWER_REBOOT IRB_FUNCTION_LUN_RESET IRB_FUNCTION_MINIPORT_IOCTL |
IRB가 미니포트용임을 나타냅니다. 명령을 적절하게 해석하는 것은 미니포트의 책임입니다. |
IrbStatus
미니포트는 지정된 작업의 상태 나타내도록 이 멤버를 설정해야 합니다. 아래 표에서는 다양한 IrbStatus 값과 그 의미를 설명합니다.
값 | 의미 |
IRB_STATUS_PENDING | 요청이 진행 중임을 나타냅니다. 포트 드라이버는 IrbStatus 를 이 값으로 초기화합니다. 미니포트 드라이버는 IrbStatus 멤버를 이 값으로 설정해서는 안 됩니다. |
IRB_STATUS_SUCCESS | 요청이 성공적으로 완료되었음을 나타냅니다. |
IRB_STATUS_DATALENGTH_MISMATCH | 데이터 언더런 또는 오버런 오류가 발생했음을 나타냅니다. 미니포트는 언더런의 경우 전송된 실제 데이터 양을 나타내기 위해 IRB의 DataTransferLength 필드를 업데이트해야 합니다. |
IRB_STATUS_DEVICE_ERROR | 디바이스에서 오류를 반환했음을 나타냅니다. 미니포트 드라이버는 Irb의 AtaStatus 및 AtaError 필드를 명령이 완료될 때 디바이스 ATA 상태 및 오류 레지스터의 내용으로 업데이트해야 합니다. |
IRB_STATUS_INVALID_REQUEST | 미니포트가 지정된 요청을 지원하지 않음을 나타냅니다. |
IRB_STATUS_BUS_RESET | 지정된 요청을 처리하는 동안 버스 재설정이 발생했음을 나타냅니다. |
IRB_STATUS_SELECTION_TIMEOUT | 대상 디바이스를 선택할 수 없음을 나타냅니다. |
IRB_STATUS_BUSY | 디바이스가 사용 중임을 나타냅니다. 포트 드라이버는 이 상태 완료된 모든 요청을 다시 시도합니다. 사용 중인 상태 완료된 요청은 한 번만 다시 시도됩니다. 디바이스가 특정 기간 동안 요청을 처리할 수 없는 경우 AtaPortDeviceBusy 를 사용하여 요청 큐를 일시 중지하는 것은 미니포트 드라이버의 책임입니다. |
IRB_STATUS_AUTOSENSE_VALID | IRB_STATUS_AUTOSENSE_VALID IRB의 SenseInfoBuffer 멤버에서 유효한 센스 데이터를 나타내는 비트 마스크입니다. |
IRB_STATUS_RETURN_TASKFILE_VALID | IRB_STATUS_RETURN_TASKFILE_VALID IRB의 SenseInfoBuffer 멤버에 있는 유효한 반환 작업 파일을 나타내는 비트 마스크입니다. |
AtaStatus
상태 레지스터에서 디바이스가 반환한 상태 나타냅니다. 미니포트 드라이버는 IRB_STATUS_DEVICE_ERROR IRB를 완료할 때 이 필드를 업데이트해야 합니다.
AtaError
디바이스가 오류 레지스터에서 반환한 오류 값을 나타냅니다. 미니포트 드라이버는 IRB_STATUS_DEVICE_ERROR IRB를 완료할 때 이 필드를 업데이트해야 합니다.
Channel
채널 번호를 지정합니다.
TargetId
디바이스의 대상 ID를 지정합니다.
Lun
디바이스의 논리적 단위 번호를 지정합니다.
CdbLength
Cdb에서 가리키는 버퍼의 길이(바이트)를 지정합니다.
SenseInfoBufferLength
SenseInfoBuffer가 가리키는 버퍼의 길이(바이트)를 지정합니다.
SenseInfoBufferType
SenseInfoBuffer에서 반환되는 데이터 구조의 형식을 지정합니다. ATA 명령에는 요청 센스 명령이 필요하지 않으므로 ATA_PASS_THROUGH 명령은 SenseInfoBuffer 를 사용하여 작업 파일 정보를 반환합니다. IrbFlags 멤버에서 식별된 ATA_PASS_THROUGH 명령의 경우 적절한 반환 TaskFile 크기를 SENSE_INFO_BUFFER_RETURN_TYPE_28BIT_TASKFILE 또는 로 보고해야 합니다.
SENSE_INFO_BUFFER_RETURN_TYPE_48BIT_TASKFILE.
QueueTag
이 IRB의 큐 태그입니다. 포트 드라이버는 이 필드를 0으로 설정합니다.
ReservedAsUlong
다음에 사용하도록 예약됩니다.
IrbFlags
수행해야 하는 특정 작업으로 요청을 한정합니다. 아래 표에서는 자세히 설명합니다.
플래그 | 설명 |
IRB_FLAGS_DRDY_REQUIRED | 미니포트 드라이버는 이 명령을 실행하기 전에 디바이스가 ATA 상태 레지스터에서 DRDY 비트를 설정할 때까지 기다려야 했음을 나타냅니다. |
IRB_FLAGS_USE_DMA | 요청에 연결된 분산/수집 목록이 있고 미니포트 드라이버가 DMA를 사용하여 이 요청에 대한 데이터를 전송할 수 있음을 나타냅니다. |
IRB_FLAGS_MAP_BUFFERS | IRB의 DataBuffer 필드가 매핑되었음을 나타냅니다. 이 플래그가 설정되면 미니포트가 DataBuffer 에 안전하게 액세스할 수 있습니다. 플래그가 설정되지 않은 경우 미니포트 드라이버는 DataBuffer 에 액세스하지 않아야 합니다. 미니포트 드라이버는 IdeHwBuildIo 루틴에서 IRB에서 이 플래그를 설정하여 포트 드라이버에 데이터 버퍼를 매핑하도록 요청할 수 있습니다. |
IRB_FLAGS_48BIT | IRB의 ATA 명령이 48비트 LBA 기능 집합에 속한다는 것을 나타냅니다. 이 플래그가 설정되면 _IDE_TASK_FILE 구조체의 이전 필드가 유효합니다. |
IRB_FLAGS_PIO_MULTIPLE | ATA PIO 다중 메서드를 사용하여 ATA 명령을 전송할 것임을 나타냅니다. |
IRB_FLAGS_RETURN_RESULTS | ATA 반환 작업 파일을 SenseInfoBuffer에 복사할 것임을 나타냅니다. |
IRB_FLAGS_DATA_IN | 데이터가 디바이스에서 호스트 시스템(읽기 작업)으로 전송될 것임을 나타냅니다. |
IRB_FLAGS_DATA_OUT | 데이터가 호스트 시스템(쓰기 작업)에서 디바이스로 전송될 것임을 나타냅니다. |
IRB_FLAGS_DISCARDABLE | 명령이 최선의 방법으로 수행되어야 했음을 나타냅니다. (참고: 현재 ATAport에서 사용하지 않습니다.) |
IRB_FLAGS_HIGH_PRIORITY | 이 IRB는 현재 ATA 미니포트에 있는 우선 순위가 높지 않은 IRB 전에 가능한 한 빨리 처리되어야 했음을 나타냅니다. |
TimeOutValue
요청 시간이 초과되는 시간(초)을 나타냅니다.
DataTransferLength
전송할 데이터가 포함된 데이터 버퍼의 길이(바이트)를 포함합니다.
IrbExtension
포트 드라이버에서 할당한 요청당 확장에 대한 포인터입니다.
DataBuffer
데이터가 있는 버퍼에 대한 포인터입니다.
SenseInfoBuffer
센스 데이터를 보유하는 버퍼에 대한 포인터입니다.
NextIrb
처리할 다음 IRB에 대한 포인터입니다. 포트 드라이버는 이를 NULL로 설정합니다. 미니포트 드라이버는 이 필드를 사용하여 IRB를 함께 연결할 수 있습니다.
Reserved
다음에 사용하도록 예약됩니다.
IdeTaskFile
표시된 컨트롤러에 대한 IDE 작업 파일을 보유하는 형식 IDE_TASK_FILE 구조체를 포함합니다. 이 멤버는 함수 멤버와 IRB_FUNCTION_ATA_COMMAND 사이의 비트 AND 결과가 0이 아닌 경우 정의됩니다.
Cdb[16]
명령 설명자 블록(CDB)을 포함합니다. 함수 멤버와 IRB_FUNCTION_ATAPI_COMMAND 사이의 비트 AND 결과가 0이 아닌 경우 이 멤버가 정의됩니다.
PowerChange
전원 상태 전환을 정의하는 POWER_CHANGE_INFO 형식의 열거형 값을 나타냅니다. 이 멤버는 Function 이 IRB_FUNCTION_POWER_CHANGE 같을 때마다 정의됩니다.
AsUChar[16]
멤버 IdeTaskFile, PowerChange 및 Cdb에 서명되지 않은 문자 데이터로 액세스하는 방법을 제공합니다.
설명
IDE_REQUEST_BLOCK 구조는 SCSI_REQUEST_BLOCK 유사하지만 IDE 버스에서 디바이스를 관리하는 데 더 적합한 특성을 제공합니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | irb.h(Irb.h 포함) |