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 Request Packets (IRP) を受け取るためです。これを使用すると、そのハンドルによって取得された排他アクセス ロックを自動的に解放できます。 この簡単な方法は、排他アクセスの誤ったリリースの大部分から保護します。 この機能を回避するために使用されるメソッドは、排他アクセス ロック方法の安全性と有効性を低下させる可能性があります。

メジャー コード

IRP_MJ_DEVICE_CONTROL

[入力バッファー]

呼び出し元が要求する操作に応じて、呼び出し元は Irp-AssociatedIrp.SystemBuffer> で入力として次のいずれかの構造体を提供する必要があります。

  • CDROM_EXCLUSIVE_ACCESS (CD-ROM デバイスのアクセス状態を報告するため)

  • CDROM_EXCLUSIVE_LOCK (CD-ROM デバイスを排他アクセス用にロックする場合)

  • CDROM_EXCLUSIVE_ACCESS (アプリケーションが排他アクセスのためにロックした CD-ROM デバイスのロックを解除するには)

入力バッファーの長さ

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 フィールドは STATUS_SUCCESS に設定されます。

要求が失敗した場合、 Status フィールドは次のいずれかのエラー メッセージに設定される可能性があります。

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 クラス ドライバーは、次の 2 つのエラーのいずれかが発生すると、この状態コードを返します。

  • 呼び出し元は、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 クラス ドライバーは、次の 2 つのエラーのいずれかが発生すると、この状態コードを返します。

  • 要求を追跡するために必要なファイル オブジェクトを使用できませんでした。 CD-ROM クラス ドライバーは、この呼び出し元からファイル オブジェクトを作成する要求を受信しませんでした。
  • 呼び出し元は、呼び出し元がデバイスへの排他アクセス権を持っていない場合でも、デバイスのロックを解除するために RequestType = ExclusiveAccessUnlockDevice を使用して要求を送信しました。

STATUS_INVALID_PARAMETER (Windows エラー コード: ERROR_INVALID_PARAMETER)

CD-ROM クラス ドライバーは、次の 2 つのエラーのいずれかが発生すると、この状態コードを返します。

  • 指定された RequestType は、 EXCLUSIVE_ACCESS_REQUEST_TYPEの有効なメンバーではありません。
  • CDROM_EXCLUSIVE_LOCK の CallerName メンバーの呼び出し元名文字列が、名前付け規則に違反しています。 CallerName、英数字 (A - Z、a - z、0 - 9)、スペース、ピリオド、コンマ、コロン (:)、セミコロン (;)、ハイフン (-)、アンダースコア (_)) を含む NULL で終わる文字列である必要があります。 文字列の長さは、文字列の末尾にある NULL を含め、CDROM_EXCLUSIVE_CALLER_LENGTH バイト未満である必要があります。

要件

要件
Header ntddcdrm.h (Ntddcdrm.h を含む)

こちらもご覧ください

CDROM_EXCLUSIVE_ACCESS

CDROM_EXCLUSIVE_LOCK

CDROM_EXCLUSIVE_LOCK_STATE

EXCLUSIVE_ACCESS_REQUEST_TYPE

IO_STACK_LOCATION