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

  • 質問

  • 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月11日 0:04

回答

  •   解決しました。
    • 回答としてマーク yamami-shu 2012年4月17日 0:32
    2012年4月17日 0:32
  • 解決されたのであればせめて、同じ問題に困った第三者に対して情報を残してあげてください。

    公開されたフォーラムで質問し、「解決しました」という一言だけで済まされると、検索でこのスレッドにたどり着いた第三者がひどくがっかりする結果になります。
    (自分が同じ立場で検索したときにも、このスレッドを見たときに不満を持ちませんか?)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答としてマーク 山本春海 2012年4月27日 7:01
    2012年4月17日 13:42
    モデレータ

すべての返信

  •   解決しました。
    • 回答としてマーク yamami-shu 2012年4月17日 0:32
    2012年4月17日 0:32
  • 解決されたのであればせめて、同じ問題に困った第三者に対して情報を残してあげてください。

    公開されたフォーラムで質問し、「解決しました」という一言だけで済まされると、検索でこのスレッドにたどり着いた第三者がひどくがっかりする結果になります。
    (自分が同じ立場で検索したときにも、このスレッドを見たときに不満を持ちませんか?)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答としてマーク 山本春海 2012年4月27日 7:01
    2012年4月17日 13:42
    モデレータ