IOCTL_CDROM_EXCLUSIVE_ACCESS IOCTL(ntddcdrm.h)

IOCTL_CDROM_EXCLUSIVE_ACCESS 요청은 CD-ROM 클래스 드라이버에 다음을 지시합니다.

  • CD-ROM 디바이스의 액세스 상태를 보고합니다.
  • 단독 액세스를 위해 CD-ROM 디바이스를 잠급 수 있습니다.
  • 단독 액세스를 위해 CD-ROM 디바이스의 잠금을 해제합니다.
이 IOCTL이 성공하려면 유효한 FileObject 핸들이 있어야 합니다. FileObject 핸들은 단독 액세스 잠금의 후속 릴리스 없이 예기치 않은 애플리케이션 종료 또는 실수로 배타적 액세스 잠금을 획득하지 못하도록 시스템을 보호합니다. 유효한 FileObject 핸들은 애플리케이션이 닫히면 CD-ROM 클래스 드라이버가 CLEANUP 및 CLOSE I/O IRP(요청 패킷)를 받게 되므로 해당 핸들에서 가져온 배타적 액세스 잠금을 자동으로 해제하는 데 사용할 수 있기 때문입니다. 이 간단한 방법은 대부분의 실수로 인한 배타적 액세스 릴리스로부터 보호합니다. 이 기능을 방지하는 데 사용되는 모든 메서드는 단독 액세스 잠금 방법의 안전성과 효율성을 줄일 수 있습니다.

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

호출자가 요청하는 작업에 따라 호출자는 Irp-AssociatedIrp.SystemBuffer>에서 다음 구조체 중 하나를 입력으로 제공해야 합니다.

입력 버퍼 길이

IO_STACK_LOCATION 구조체의 Parameters.DeviceIoControl.InputBufferLength 멤버는 사용자가 할당한 입력 버퍼의 크기를 바이트 단위로 나타냅니다.

출력 버퍼

호출자가 CD-ROM 디바이스의 단독 액세스 상태(RequestType = ExclusiveAccessQueryState)를 요청하는 경우 CD-ROM 클래스 드라이버는 LockState 멤버가 디바이스의 액세스 상태를 나타내는 Irp-AssociatedIrp.SystemBuffer>의 버퍼에 CDROM_EXCLUSIVE_LOCK_STATE 형식 구조를 반환합니다.

출력 버퍼 길이

I/O 스택 위치(IO_STACK_LOCATION)의 Parameters.DeviceIoControl.OutputBufferLength 멤버는 출력 버퍼의 크기를 바이트 단위로 나타냅니다.

상태 블록

정보 필드는 반환되는 바이트 수로 설정됩니다. 요청이 성공하면 상태 필드가 STATUS_SUCCESS 설정됩니다.

요청이 실패하면 상태 필드가 다음 오류 메시지 중 하나로 설정될 수 있습니다.

STATUS_ACCESS_DENIED(Windows 오류 코드: ERROR_ACCESS_DENIED)

전용 액세스를 위해 디바이스가 이미 잠겨 있습니다.

STATUS_BUFFER_TOO_SMALL(Windows 오류 코드: ERROR_INSUFFICIENT_BUFFER)

출력 버퍼가 ExclusiveAccessQueryState 요청에 비해 너무 작습니다.

STATUS_INFO_LENGTH_MISMATCH(Windows 오류 코드: ERROR_BAD_LENGTH)

입력 버퍼가 너무 작습니다.

STATUS_INVALID_DEVICE_REQUEST(Windows 오류 코드: ERROR_INVALID_FUNCTION)

CD-ROM 클래스 드라이버는 다음 두 오류 중 하나가 발생할 때 이 상태 코드를 반환합니다.

  • 호출자가 PASSIVE_LEVEL 이외의 IRQL 수준에서 요청을 했습니다.
  • 호출자는 전용 모드가 아닌 디바이스의 잠금을 해제하기 위해 RequestType = ExclusiveAccessUnlockDevice 를 사용하여 요청을 보냈습니다.

STATUS_INVALID_DEVICE_STATE(Windows 오류 코드: ERROR_BAD_COMMAND)

클래스 드라이버가 탑재된 파일 시스템 드라이버에 대한 검사 일시 중단하도록 지정하지 않고 파일 시스템 드라이버가 이 디바이스에 탑재된 동안 호출자가 디바이스를 잠그려고 했습니다. 탑재된 파일 시스템 드라이버에 대한 검사 일시 중단하려면 호출자가 CDROM_EXCLUSIVE_ACCESSFlags 멤버를 1로 설정해야 합니다.

STATUS_INVALID_HANDLE(Windows 오류 코드: ERROR_INVALID_HANDLE)

CD-ROM 클래스 드라이버는 다음 두 오류 중 하나가 발생할 때 이 상태 코드를 반환합니다.

  • 요청을 추적하는 데 필요한 파일 개체를 사용할 수 없습니다. CD-ROM 클래스 드라이버가 이 호출자로부터 파일 개체를 만들라는 요청을 받지 못했습니다.
  • 호출자는 호출자에게 디바이스에 대한 단독 액세스 권한이 없더라도 디바이스 잠금을 해제하기 위해 RequestType = ExclusiveAccessUnlockDevice 를 사용하여 요청을 보냈습니다.

STATUS_INVALID_PARAMETER(Windows 오류 코드: ERROR_INVALID_PARAMETER)

CD-ROM 클래스 드라이버는 다음 두 오류 중 하나가 발생할 때 이 상태 코드를 반환합니다.

  • 지정된 RequestTypeEXCLUSIVE_ACCESS_REQUEST_TYPE 유효한 멤버가 아닙니다.
  • CDROM_EXCLUSIVE_LOCKCallerName 멤버의 호출자 이름 문자열이 명명 규칙을 위반합니다. CallerName 은 영숫자(A - Z, a - z, 0 - 9), 공백, 마침표, 쉼표, 콜론(:), 세미콜론(;), 하이픈(-) 및 밑줄(_))과 같은 문자를 포함하는 NULL로 끝나는 문자열이어야 합니다. 문자열의 길이는 문자열 끝에 있는 NULL 을 포함하여 CDROM_EXCLUSIVE_CALLER_LENGTH 바이트보다 작아야 합니다.

요구 사항

요구 사항
헤더 ntddcdrm.h(Ntddcdrm.h 포함)

추가 정보

CDROM_EXCLUSIVE_ACCESS

CDROM_EXCLUSIVE_LOCK

CDROM_EXCLUSIVE_LOCK_STATE

EXCLUSIVE_ACCESS_REQUEST_TYPE

IO_STACK_LOCATION