Charles Davis : ntdll: Implement DVD_ReadKey() on Mac OS.
Alexandre Julliard
julliard at winehq.org
Mon Oct 19 09:56:12 CDT 2009
Module: wine
Branch: master
Commit: 71f430e7400aa2f63c5b041d42e3506002946c1a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=71f430e7400aa2f63c5b041d42e3506002946c1a
Author: Charles Davis <cdavis at mymail.mines.edu>
Date: Fri Oct 16 13:57:11 2009 -0600
ntdll: Implement DVD_ReadKey() on Mac OS.
---
dlls/ntdll/cdrom.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 148 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index fbb7828..5caf8b0 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -2162,6 +2162,154 @@ static NTSTATUS DVD_ReadKey(int fd, PDVD_COPY_PROTECT_KEY key)
#elif defined(__FreeBSD__) || defined(__NetBSD__)
TRACE("bsd\n");
return STATUS_NOT_SUPPORTED;
+#elif defined(__APPLE__)
+ union
+ {
+ dk_dvd_report_key_t key;
+ dk_dvd_read_structure_t disk_key;
+ } ioc;
+ union
+ {
+ DVDDiscKeyInfo disk_key;
+ DVDChallengeKeyInfo chal;
+ DVDKey1Info key1;
+ DVDTitleKeyInfo title;
+ DVDAuthenticationSuccessFlagInfo asf;
+ DVDRegionPlaybackControlInfo rpc;
+ } desc;
+ NTSTATUS ret = STATUS_NOT_SUPPORTED;
+
+ switch(key->KeyType)
+ {
+ case DvdChallengeKey:
+ ioc.key.format = kDVDKeyFormatChallengeKey;
+ ioc.key.grantID = (uint8_t)key->SessionId;
+ ioc.key.keyClass = kDVDKeyClassCSS_CPPM_CPRM;
+ ioc.key.bufferLength = sizeof(desc.chal);
+ ioc.key.buffer = &desc.chal;
+ OSWriteBigInt16(desc.chal.dataLength, 0, key->KeyLength);
+ break;
+ case DvdBusKey1:
+ ioc.key.format = kDVDKeyFormatKey1;
+ ioc.key.grantID = (uint8_t)key->SessionId;
+ ioc.key.keyClass = kDVDKeyClassCSS_CPPM_CPRM;
+ ioc.key.bufferLength = sizeof(desc.key1);
+ ioc.key.buffer = &desc.key1;
+ OSWriteBigInt16(desc.key1.dataLength, 0, key->KeyLength);
+ break;
+ case DvdTitleKey:
+ ioc.key.format = kDVDKeyFormatTitleKey;
+ ioc.key.grantID = (uint8_t)key->SessionId;
+ ioc.key.keyClass = kDVDKeyClassCSS_CPPM_CPRM;
+ ioc.key.bufferLength = sizeof(desc.title);
+ ioc.key.buffer = &desc.title;
+ ioc.key.address = (uint32_t)(key->Parameters.TitleOffset.QuadPart>>11);
+ OSWriteBigInt16(desc.title.dataLength, 0, key->KeyLength);
+ break;
+ case DvdAsf:
+ ioc.key.format = kDVDKeyFormatASF;
+ ioc.key.grantID = (uint8_t)key->SessionId;
+ ioc.key.keyClass = kDVDKeyClassCSS_CPPM_CPRM;
+ ioc.key.bufferLength = sizeof(desc.asf);
+ ioc.key.buffer = &desc.asf;
+ OSWriteBigInt16(desc.asf.dataLength, 0, key->KeyLength);
+ break;
+ case DvdGetRpcKey:
+ ioc.key.format = kDVDKeyFormatRegionState;
+ ioc.key.grantID = (uint8_t)key->SessionId;
+ ioc.key.keyClass = kDVDKeyClassCSS_CPPM_CPRM;
+ ioc.key.bufferLength = sizeof(desc.rpc);
+ ioc.key.buffer = &desc.rpc;
+ OSWriteBigInt16(desc.rpc.dataLength, 0, key->KeyLength);
+ break;
+ case DvdDiskKey:
+ ioc.disk_key.format = kDVDStructureFormatDiscKeyInfo;
+ ioc.disk_key.grantID = (uint8_t)key->SessionId;
+ ioc.disk_key.bufferLength = sizeof(desc.disk_key);
+ ioc.disk_key.buffer = &desc.disk_key;
+ break;
+ case DvdInvalidateAGID:
+ ioc.key.format = kDVDKeyFormatAGID_Invalidate;
+ ioc.key.grantID = (uint8_t)key->SessionId;
+ ioc.key.keyClass = kDVDKeyClassCSS_CPPM_CPRM;
+ break;
+ case DvdBusKey2:
+ case DvdSetRpcKey:
+ ERR("attempted to read write-only key type 0x%x\n", key->KeyType);
+ return STATUS_NOT_SUPPORTED;
+ default:
+ FIXME("got unknown key type 0x%x\n", key->KeyType);
+ return STATUS_NOT_SUPPORTED;
+ }
+
+ ret = CDROM_GetStatusCode(ioctl(fd, (key->KeyType == DvdDiskKey ? DKIOCDVDREADSTRUCTURE : DKIOCDVDREPORTKEY), &ioc));
+
+ if (ret == STATUS_SUCCESS)
+ {
+ switch(key->KeyType)
+ {
+ case DvdChallengeKey:
+ key->KeyLength = OSReadBigInt16(desc.chal.dataLength, 0);
+ memcpy(key->KeyData, desc.chal.challengeKeyValue, key->KeyLength);
+ break;
+ case DvdBusKey1:
+ key->KeyLength = OSReadBigInt16(desc.key1.dataLength, 0);
+ memcpy(key->KeyData, desc.key1.key1Value, key->KeyLength);
+ break;
+ case DvdTitleKey:
+ key->KeyLength = OSReadBigInt16(desc.title.dataLength, 0);
+ memcpy(key->KeyData, desc.title.titleKeyValue, key->KeyLength);
+ key->KeyFlags = 0;
+ if (desc.title.CPM)
+ {
+ /*key->KeyFlags |= DVD_COPYRIGHTED;*/
+ if (desc.title.CP_SEC) key->KeyFlags |= DVD_SECTOR_PROTECTED;
+ /*else key->KeyFlags |= DVD_SECTOR_NOT_PROTECTED;*/
+#if 0
+ switch (desc.title.CGMS)
+ {
+ case 0:
+ key->KeyFlags |= DVD_CGMS_COPY_PERMITTED;
+ break;
+ case 2:
+ key->KeyFlags |= DVD_CGMS_COPY_ONCE;
+ break;
+ case 3:
+ key->KeyFlags |= DVD_CGMS_NO_COPY;
+ break;
+ }
+#endif
+ } /*else key->KeyFlags |= DVD_NOT_COPYRIGHTED;*/
+ break;
+ case DvdAsf:
+ key->KeyLength = OSReadBigInt16(desc.title.dataLength, 0);
+ ((PDVD_ASF)key->KeyData)->SuccessFlag = desc.asf.successFlag;
+ break;
+ case DvdGetRpcKey:
+ key->KeyLength = OSReadBigInt16(desc.rpc.dataLength, 0);
+ ((PDVD_RPC_KEY)key->KeyData)->UserResetsAvailable =
+ desc.rpc.numberUserResets;
+ ((PDVD_RPC_KEY)key->KeyData)->ManufacturerResetsAvailable =
+ desc.rpc.numberVendorResets;
+ ((PDVD_RPC_KEY)key->KeyData)->TypeCode =
+ desc.rpc.typeCode;
+ ((PDVD_RPC_KEY)key->KeyData)->RegionMask =
+ desc.rpc.driveRegion;
+ ((PDVD_RPC_KEY)key->KeyData)->RpcScheme =
+ desc.rpc.rpcScheme;
+ case DvdDiskKey:
+ key->KeyLength = OSReadBigInt16(desc.disk_key.dataLength, 0);
+ memcpy(key->KeyData, desc.disk_key.discKeyStructures, key->KeyLength);
+ break;
+ case DvdBusKey2:
+ case DvdSetRpcKey:
+ case DvdInvalidateAGID:
+ default:
+ /* Silence warning */
+ ;
+ }
+ }
+ return ret;
#else
TRACE("outside\n");
return STATUS_NOT_SUPPORTED;
More information about the wine-cvs
mailing list