59883
Windows APIを使用して、特定の光学ドライブが"CDドライブ"なのか、"DVDドライブ"なのか"Blu-
rayドライブ"なのかを取得する方法を探しています。  
win32 の GetDriveType 関数では、光学ドライブを全て DRIVE_CDROM として認識してしまうため、要求に合いません。  
DeviceIoControl
などを使用して、デバイスを直接開いて取得する方法があるように予想しますが、なにを取得して判定するのがよいのか、見つけることができません。  
参考となりそうなWebサイト、書籍、リファレンス、ソースコードなどがどこかにありましたら、お教えいただけると幸いです。
CC BY-SA 4.0
2019-10-22T08:58:26.070
59872
2019-10-22T14:40:27.503
2019-10-22T14:40:27.503
4236
36303
question
c++ windows
光学ドライブの正確なタイプを取得する方法
SCSI Multimedia Commandの`GET
CONFIGURATION`を呼ぶようです。具体的には[`IOCTL_CDROM_GET_CONFIGURATION`](https://docs.microsoft.com/en-
us/windows-hardware/drivers/ddi/content/ntddcdrm/ni-ntddcdrm-
ioctl_cdrom_get_configuration)で[`GET_CONFIGURATION_HEADER`](https://docs.microsoft.com/en-
us/windows-hardware/drivers/ddi/content/ntddmmc/ns-ntddmmc-
_get_configuration_header)を得るとその中に[`FEATURE_HEADER`](https://docs.microsoft.com/en-
us/windows-hardware/drivers/ddi/content/ntddmmc/ns-ntddmmc-
_feature_header)が含まれており、更にその中に`FeatureCode`がありますが、これが[`FEATURE_NUMBER`](https://docs.microsoft.com/en-
us/windows-hardware/drivers/ddi/content/ntddmmc/ne-ntddmmc-
_feature_number)としてドライブが持つ機能を表しています。これでドライブが`FeatureBDWrite`に対応しているかなどを調べることができそうです。

* * *

kunifさんのコメントにもありますが、Windows XP以降はExplorerからCD/DVDの書き込みに対応していますが、その内部機能は[Image
Mastering API](https://docs.microsoft.com/en-
us/windows/win32/imapi/portal)として公開されています。もちろんC++言語からも呼び出し可能ですが、COM関連の本質的でない部分の記述が煩雑になるため、C#言語でのサンプルを書いてみました。

```

    using System;
    class Program {
        static void Main() {
            dynamic master = Activator.CreateInstance(Type.GetTypeFromProgID("IMAPI2.MsftDiscMaster2"));
            foreach (string uniqueId in master) {
                dynamic recorder = Activator.CreateInstance(Type.GetTypeFromProgID("IMAPI2.MsftDiscRecorder2"));
                recorder.InitializeDiscRecorder(uniqueId);
                Console.WriteLine("{0}:", recorder.VolumePathNames[0]);
                foreach (int id in recorder.SupportedFeaturePages)
                    Console.WriteLine("    0x{0:X2}", id);
            }
        }
    }
    
```

ここで表示される値は`imapi2.h`に[`IMAPI_FEATURE_PAGE_TYPE`](https://docs.microsoft.com/en-
us/windows/win32/api/imapi2/ne-imapi2-imapi_feature_page_type)として定義されています。
CC BY-SA 4.0
2019-10-22T14:37:31.907
59883
2019-10-22T14:37:31.907
4236
59872
answer