【问题标题】:How to identify the type of disc in a CD-ROM drive using WinAPI?如何使用 WinAPI 识别 CD-ROM 驱动器中的光盘类型?
【发布时间】:2014-05-25 13:21:03
【问题描述】:

我正在编写一个可以处理音频 CD 和混合 CD 的应用程序。我想要一种方法来确定应用程序使用的驱动器中当前是否有音频或混合类型(至少有一个音轨)光盘。

到目前为止,我能够通过GetDriveType 确定驱动器是 CD-ROM。然而,事实证明,识别驱动器内实际存在的媒体并不容易。这是我到目前为止所得到的:

int drive_has_audio_disc(const char *root_path)
{
  char volume_name[MAX_PATH+1];
  BOOL winapi_rv;
  DWORD fs_flags;
  int rv;

  winapi_rv = GetVolumeInformation(root_path, volume_name, sizeof(volume_name),
    NULL, NULL, &fs_flags, NULL, 0);
  if(winapi_rv != 0)
  {
    rv = (strcmp(volume_name, "Audio CD") == 0 &&
      (fs_flags & FILE_READ_ONLY_VOLUME));
  }
  else
  {
    rv = (GetLastError() == ERROR_INVALID_PARAMETER) ? 0 : -1;
  }
  return rv;
}

但是,它依赖于 Windows 将名称“音频 CD”分配给所有被识别为音频的光盘。这感觉不对,而且在混合模式 CD 上会惨遭失败,因为它们在 Windows 中的名称是由数据轨道的卷名决定的。另外,else 块在这里是因为我注意到当驱动器中根本没有磁盘时,GetVolumeInformation 返回一个错误,GetLastError 等于 ERROR_INVALID_PARAMETER

理想情况下,我正在寻找类似于 Linux 上的 CDROM_DISC_STATUS ioctl 的东西。它返回CDS_NO_INFOCDS_AUDIOCDS_MIXED 或其他一些值,具体取决于光盘的内容。

还有其他方法可以解决这个问题吗?那么混合模式光盘呢?

【问题讨论】:

  • AFAIK,获取您要查找的信息的唯一方法是通过 IMAPI 接口,特别是通过包含CurrentPhysicalMediaType 属性的IDiscFormat2Data 接口。

标签: c winapi cd-rom


【解决方案1】:

您可以使用CD-ROM I/O Control Codes,尤其是IOCTL_CDROM_READ_TOC。它返回的结构如下所示:

struct TRACK_DATA {
  UCHAR Reserved;
  UCHAR Control  :4;
  UCHAR Adr  :4;
  UCHAR TrackNumber;
  UCHAR Reserved1;
  UCHAR Address[4];
} 

struct CDROM_TOC {
  UCHAR      Length[2];
  UCHAR      FirstTrack;
  UCHAR      LastTrack;
  TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
};

您可以找到如何检索它的示例on Larry Osterman's blog。 由此您应该能够确定确切的光盘类型。如果没有,请查看其他 IOCTL,我相信应该有一个可以为您提供必要的信息。

【讨论】:

  • 非常感谢!这非常有效。实际上,文档说 IOCTL_CDROM_READ_TOC 在 Vista 和更新版本中已弃用,并已被 IOCTL_CDROM_READ_TOC_EX 取代。它本质上是一样的,除了你必须指定要在输入结构中检索的数据类型。这也非常适合程序的其余部分,因为它所做的几乎所有事情都是通过 SPTD 向驱动器发出 SCSI 命令 - 这意味着添加另一个 DeviceIoControl 调用根本不是问题。 ;)
【解决方案2】:

我曾经为一个项目做类似的事情,但用的是 DVD。您可以使用DeviceIoControl(IOCTL_SCSI_PASS_THROUGH)多媒体命令 (MMC) GET CONFIGURATION 命令直接发送到驱动器以检索其当前活动的配置文件,该配置文件基于当前加载的特定类型的光盘。

CD 配置文件是:

0x0008 CD-ROM
0x0009 CD-R
0x000A CD-RW
0x0020 双倍密度 CD-ROM
0x0021 双倍密度 CD-R0x0022双倍密度CD-RW

【讨论】:

  • 感谢您的提示,尽管在这种情况下这对我来说还不够。 :)
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 2015-07-05
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多