在 C 中确定 OS X 中 DVD 驱动器的区域代码,而不要求 DVD 位于驱动器中
Posted
技术标签:
【中文标题】在 C 中确定 OS X 中 DVD 驱动器的区域代码,而不要求 DVD 位于驱动器中【英文标题】:Determining a DVD drive's region code in OS X in C WITHOUT requiring that a DVD be in the drive 【发布时间】:2012-01-10 16:22:00 【问题描述】:基本上,我运行一个计算机网络,需要知道各种计算机的驱动器设置为什么区域代码。我不需要更改区域,但我不知道如何在不单独访问每台计算机并粘贴在光盘中的情况下确定区域。我尝试使用 Apple 的可可 DVD 播放框架,但这需要将磁盘插入驱动器,这有点违背目的。
那么,我是否可以使用任何 API 来确定 Mac Pro 的 DVD 驱动器上的区域代码,而无需插入光盘?我愿意用几乎任何语言编写代码。
谢谢
【问题讨论】:
【参考方案1】:我发现了一些能够在 OS X 上处理 DVD 区域设置的实用程序:DVD Info X, and Region X。 DVD Info X 将显示驱动器的区域代码,无需插入 DVD。
X 区更有趣,因为尽管它不直接服务于您的目的,its source is available。看了一下我发现Region X.m
中的ScanAll
方法就是你需要的。更具体地说,有趣的情况是找不到磁盘名称(因为没有安装磁盘)并且使用 SCSI 命令查找 DVD 驱动器的属性(printf
调用是我添加的):
task = (*scsitaskinterface)->CreateSCSITask(scsitaskinterface);
if (task)
cdb[0] = 0xa4;
cdb[1] = 0x00;
cdb[2] = 0x00;
cdb[3] = 0x00;
cdb[4] = 0x00;
cdb[5] = 0x00;
cdb[6] = 0x00;
cdb[7] = 0x00;
cdb[8] = (sizeof(DVDInfo) >> 8) & 0xff;
cdb[9] = sizeof(DVDInfo) & 0xff;
cdb[10] = 0x08;
cdb[11] = 0x00;
memset(&DVDInfo, 0, sizeof(DVDInfo));
ProcessCDB(task, cdb, 12, DirIn, &DVDInfo, sizeof(DVDInfo), 30000);
printf("drive region %#hhx\n", DVDInfo.driveRegion);
printf("number of region changes left: %hhu\n", DVDInfo.numberUserResets);
if (DVDInfo.rpcScheme == 0) RPC1++;
if (DVDInfo.rpcScheme != 0) RPC2++;
(*task)->Release(task);
我在我的 Macbook Pro 上运行了这个,结果符合预期。
显然,您需要对其进行按摩,以便将该部分隔离为您可以使用的东西,但我认为这段代码将是一个有用的起点。
【讨论】:
谢谢,成功了!您还可以使用 DVDRegionCode 枚举(在 cocoa dvd 播放框架中)将十六进制转换为可读的内容【参考方案2】:我没有这样的答案,但我有 2 个链接给你:
-
解释如何读取区域的代码(适用于 windows,不适用于 Mac):
http://www.codeproject.com/KB/system/mydvdregion.aspx
由于这些是纯 SCSI 命令 - 可能会针对 Mac 进行调整。
-
ftp://ftp.san.ru/unix/soft.cvs/wine.git/wine-git/dlls/ntdll/cdrom.c
那里有 Mac 支持 - 他们也在那里读取 DVD 区域。
【讨论】:
以上是关于在 C 中确定 OS X 中 DVD 驱动器的区域代码,而不要求 DVD 位于驱动器中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OS X 上获取 USB 驱动器的硬盘驱动器序列号?
如何使用 Cocoa 和 CGDisplayCreateImageForRect 在 Mac OS X 中截取区域截图?