IOCTL_STORAGE_PERSISTENT_RESERVE_IN IOCTL(ntddstor.h)
일반 스토리지 클래스 드라이버(classpnp.sys)는 영구 예약 In 명령을 실행하기 위한 I/O 컨트롤(IOCTL) 인터페이스를 노출합니다. 영구 예약 명령 수신 시 스토리지 디바이스의 동작은 SCSI 기본 명령 - 2(SPC-2) 사양에 설명되어 있습니다. IOCTL 인터페이스를 사용하려면 호출자가 영구 예약 명령의 물리적 디바이스에 대한 읽기 권한이 있어야 합니다. 사용자 모드 애플리케이션, 서비스 및 커널 모드 드라이버는 이 IOCTL을 사용하여 영구 예약을 제어할 수 있습니다. 드라이버에서 호출되는 경우 IRQL DISPATCH_LEVEL 실행되는 스레드에서 이 IOCTL < 을 호출해야 합니다. 이 IOCTL은 FILE_READ_ACCESS 사용하여 정의되며, 디바이스 핸들에 영구 예약 명령을 실행하기 위한 읽기 권한이 있어야 합니다.
주 코드
입력 버퍼
Irp-AssociatedIrp.SystemBuffer>의 버퍼에는 PERSISTENT_RESERVE_COMMAND 구조체가 포함되어 있습니다. 비페이지 풀에서 버퍼를 할당해야 하며 대상 디바이스 및 어댑터에 맞게 올바르게 정렬해야 합니다.
PR_IN. ServiceAction은 다음 중 하나일 수 있습니다.
- RESERVATION_ACTION_READ_KEYS
- RESERVATION_ACTION_READ_RESERVATIONS
PR_IN. 할당 길이는 반환된 매개 변수 목록에 할당된 버퍼의 크기(바이트)입니다.
입력 버퍼 길이
입력 버퍼의 길이(바이트)입니다.
출력 버퍼
For PR_IN. ServiceAction = RESERVATION_ACTION_READ_KEYS 출력 버퍼는 PRI_REGISTRATION_LIST 구조를 포함하며 적어도 sizeof(PRI_REGISTRATION_LIST)여야 합니다.
For PR_IN. ServiceAction = RESERVATION_ACTION_READ_RESERVATIONS 출력 버퍼는 PRI_RESERVATION_LIST 구조를 포함하며 적어도 sizeof(PRI_RESERVATION_LIST)여야 합니다.
할당된 버퍼가 너무 작아서 모든 영구 예약 데이터를 반환하지 못하면 성공이 반환되고 매개 변수 목록 AdditionalLength 필드에 필요한 크기가 반환됩니다.
출력 버퍼 길이
출력 버퍼의 길이(바이트)입니다.
상태 블록
정보 필드는 출력 버퍼의 크기로 설정됩니다. ServiceAction = RESERVATION_ACTION_READ_KEYS 출력 버퍼는 PRI_REGISTRATION_LIST 구조입니다. ServiceAction = RESERVATION_ACTION_READ_RESERVATIONS 출력 버퍼는 PRI_REGISTRATION_LIST 구조입니다.
상태 필드는 다음 중 하나로 설정됩니다.
값 | 의미 |
---|---|
STATUS_BUFFER_OVERFLOW(ERROR_MORE_DATA) | 출력 버퍼가 너무 작아서 영구 예약 데이터를 저장할 수 없습니다. 출력 버퍼의 AdditionalLength 필드에는 반환할 데이터의 크기가 포함됩니다. |
STATUS_DEVICE_BUSY(ERROR_BUSY) | 예약 충돌로 인해 명령이 실패했습니다(자세한 내용은 SCSI 기본 명령 - 2(SPC-2)** 사양 참조). |
STATUS_INFO_LENGTH_MISMATCH | IOCTL의 입력 버퍼 길이가 sizeof(PERSISTENT_RESERVE_COMMAND)보다 작거나 PERSISTENT_RESERVE_COMMAND 데이터 구조에 지정된 크기가 sizeof(PERSISTENT_RESERVE_COMMAND)보다 작습니다. |
STATUS_INVALID_DEVICE_REQUEST(ERROR_INVALID_FUNCTION) | I/O 제어 코드(IOCTL_STORAGE_PERSISTENT_RESERVE_IN)는 스토리지 드라이버에서 지원되지 않습니다. |
STATUS_INVALID_PARAMETER(ERROR_INVALID_PARAMETER) | 입력 버퍼 구조의 크기가 잘못되었거나 채워집니다. |
STATUS_INVALID_USER_BUFFER(ERROR_INVALID_USER_BUFFER) | 입력 또는 출력 버퍼가 디바이스 또는 어댑터에 대해 올바르게 정렬되지 않았습니다. 이 상태 드라이버가 IOCTL을 스토리지 스택으로 보낼 때만 반환할 수 있습니다. I/O 관리자가 자동으로 버퍼를 정렬하기 때문에 사용자 모드 애플리케이션이 DeviceIoControl API를 통해 IOCTL을 보낼 때 이 상태 반환되지 않습니다. |
STATUS_IO_DEVICE_ERROR(ERROR_IO_DEVICE) | 디바이스에서 영구 예약 명령을 지원하지 않습니다. |
STATUS_SUCCESS | 작업이 완료되었습니다. |
요구 사항
요구 사항 | 값 |
---|---|
헤더 | ntddstor.h(Ntddstor.h 포함) |