トップ回答者
DeviceIoControlを使用し、CDRomやBDのディスク情報をバイト配列で読み取る方法について

質問
-
DeviceIoControlを使用し、ブルーレイまたはCDドライブを制御しようと
しています。EJECT、LOAD、DiscStart等は
何とかできたのですが、CDBコマンドを送信しバイト配列で
ディスク情報を取得する方法が分かりません。
ご教授願えると助かります。
public unsafe static bool BCARead(this DriveInfo drive) { using (var volume = new Volume(drive, true)) { const int dataLength = 8; byte* data = stackalloc byte[dataLength]; SCSI_PASS_THROUGH_DIRECT* sptd = stackalloc SCSI_PASS_THROUGH_DIRECT[1]; var size = Marshal.SizeOf(typeof(SCSI_PASS_THROUGH_DIRECT)); sptd[0].Length = (ushort)size; sptd[0].PathId = 0; sptd[0].TargetId = 0; sptd[0].CdbLength = 12; sptd[0].DataIn = IOControl.SCSI_IOCTL_DATA_IN; sptd[0].DataTransferLength = dataLength; sptd[0].TimeOutValue = 5; sptd[0].DataBuffer = (void*)data; sptd[0].Cdb[0] = 0xAD; sptd[0].Cdb[1] = 0x01; sptd[0].Cdb[7] = 0x03; sptd[0].Cdb[8] = 0x10; uint bytesReturned; if (!IOControl.DeviceIoControl(volume.Handle, IOControl.IOCTL_SCSI_PASS_THROUGH_DIRECT, (void*)sptd, (uint)size, (void*)sptd, (uint)size, out bytesReturned, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error()); return ((data[1] & 0x10) == 0x10); } }
回答
-
-
解決されたのであればせめて、同じ問題に困った第三者に対して情報を残してあげてください。
公開されたフォーラムで質問し、「解決しました」という一言だけで済まされると、検索でこのスレッドにたどり着いた第三者がひどくがっかりする結果になります。
(自分が同じ立場で検索したときにも、このスレッドを見たときに不満を持ちませんか?)質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
- 回答としてマーク 山本春海 2012年4月27日 7:01
すべての返信
-
-
解決されたのであればせめて、同じ問題に困った第三者に対して情報を残してあげてください。
公開されたフォーラムで質問し、「解決しました」という一言だけで済まされると、検索でこのスレッドにたどり着いた第三者がひどくがっかりする結果になります。
(自分が同じ立場で検索したときにも、このスレッドを見たときに不満を持ちませんか?)質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
- 回答としてマーク 山本春海 2012年4月27日 7:01