Charles Davis : ntdll: Implement DVD_ReadStructure() on Mac OS.
Alexandre Julliard
julliard at winehq.org
Mon Oct 19 09:56:12 CDT 2009
Module: wine
Branch: master
Commit: 192a838cd0c751f1f81cc0847777fe137910ef6f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=192a838cd0c751f1f81cc0847777fe137910ef6f
Author: Charles Davis <cdavis at mymail.mines.edu>
Date: Fri Oct 16 13:57:18 2009 -0600
ntdll: Implement DVD_ReadStructure() on Mac OS.
---
dlls/ntdll/cdrom.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 126 insertions(+), 8 deletions(-)
diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index 5caf8b0..3e520ec 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -181,12 +181,14 @@ static const char *iocodex(DWORD code)
#define MSF_OF_FRAME(m,fr) {int f=(fr); ((UCHAR *)&(m))[2]=f%CD_FRAMES;f/=CD_FRAMES;((UCHAR *)&(m))[1]=f%CD_SECS;((UCHAR *)&(m))[0]=f/CD_SECS;}
/* The documented format of DVD_LAYER_DESCRIPTOR is wrong. Even the format in the
- * DDK's header is wrong. There are four bytes at the start which always seem to
- * follow the sequence "02 08 00 00".
+ * DDK's header is wrong. There are four bytes at the start defined by
+ * MMC-5. The first two are the size of the structure in big-endian order as
+ * defined by MMC-5. The other two are reserved.
*/
typedef struct
{
- UCHAR MagicHeader[4];
+ UCHAR DataLength[2];
+ UCHAR Reserved0[2];
UCHAR BookVersion : 4;
UCHAR BookType : 4;
UCHAR MinimumRate : 4;
@@ -2329,7 +2331,7 @@ static NTSTATUS DVD_GetRegion(int dev, PDVD_REGION region)
}
/******************************************************************
- * DVD_GetRegion
+ * DVD_ReadStructure
*
*
*/
@@ -2390,10 +2392,10 @@ static NTSTATUS DVD_ReadStructure(int dev, const DVD_READ_STRUCTURE *structure,
internal_dvd_layer_descriptor *p = (internal_dvd_layer_descriptor *) layer;
struct dvd_layer *l = &s.physical.layer[s.physical.layer_num];
- p->MagicHeader[0] = 2;
- p->MagicHeader[1] = 8;
- p->MagicHeader[2] = 0;
- p->MagicHeader[3] = 0;
+ p->DataLength[0] = 2;
+ p->DataLength[1] = 8;
+ p->Reserved0[0] = 0;
+ p->Reserved0[1] = 0;
p->BookVersion = l->book_version;
p->BookType = l->book_type;
p->MinimumRate = l->min_rate;
@@ -2450,6 +2452,122 @@ static NTSTATUS DVD_ReadStructure(int dev, const DVD_READ_STRUCTURE *structure,
case DvdMaxDescriptor: /* Suppress warning */
break;
}
+#elif defined(__APPLE__)
+ NTSTATUS ret = STATUS_NOT_SUPPORTED;
+ dk_dvd_read_structure_t dvdrs;
+ union
+ {
+ DVDPhysicalFormatInfo phys;
+ DVDCopyrightInfo copy;
+ DVDDiscKeyInfo disk_key;
+ DVDManufacturingInfo manf;
+ } desc;
+ union
+ {
+ PDVD_LAYER_DESCRIPTOR layer;
+ internal_dvd_layer_descriptor *xlayer;
+ PDVD_COPYRIGHT_DESCRIPTOR copy;
+ PDVD_DISK_KEY_DESCRIPTOR disk_key;
+ PDVD_MANUFACTURER_DESCRIPTOR manf;
+ } nt_desc;
+
+ nt_desc.layer = layer;
+ dvdrs.address = (uint32_t)(structure->BlockByteOffset.QuadPart>>11);
+ dvdrs.grantID = (uint8_t)structure->SessionId;
+ dvdrs.layer = structure->LayerNumber;
+ switch(structure->Format)
+ {
+ case DvdPhysicalDescriptor:
+ dvdrs.format = kDVDStructureFormatPhysicalFormatInfo;
+ dvdrs.bufferLength = sizeof(desc.phys);
+ dvdrs.buffer = &desc.phys;
+ break;
+
+ case DvdCopyrightDescriptor:
+ dvdrs.format = kDVDStructureFormatCopyrightInfo;
+ dvdrs.bufferLength = sizeof(desc.copy);
+ dvdrs.buffer = &desc.copy;
+ break;
+
+ case DvdDiskKeyDescriptor:
+ dvdrs.format = kDVDStructureFormatDiscKeyInfo;
+ dvdrs.bufferLength = sizeof(desc.disk_key);
+ dvdrs.buffer = &desc.disk_key;
+ break;
+
+ case DvdBCADescriptor:
+ FIXME("DvdBCADescriptor NIY\n");
+ return STATUS_NOT_SUPPORTED;
+
+ case DvdManufacturerDescriptor:
+ dvdrs.format = kDVDStructureFormatManufacturingInfo;
+ dvdrs.bufferLength = sizeof(desc.manf);
+ dvdrs.buffer = &desc.manf;
+ break;
+
+ case DvdMaxDescriptor:
+ default:
+ FIXME("got unknown structure type 0x%x\n", structure->Format);
+ return STATUS_NOT_SUPPORTED;
+ }
+ ret = CDROM_GetStatusCode(ioctl(dev, DKIOCDVDREADSTRUCTURE, &dvdrs));
+ if(ret == STATUS_SUCCESS)
+ {
+ switch(structure->Format)
+ {
+ case DvdPhysicalDescriptor:
+ nt_desc.xlayer->DataLength[0] = 2;
+ nt_desc.xlayer->DataLength[1] = 8;
+ nt_desc.xlayer->Reserved0[0] = 0;
+ nt_desc.xlayer->Reserved0[1] = 0;
+ nt_desc.xlayer->BookVersion = desc.phys.partVersion;
+ nt_desc.xlayer->BookType = desc.phys.bookType;
+ nt_desc.xlayer->MinimumRate = desc.phys.minimumRate;
+ nt_desc.xlayer->DiskSize = desc.phys.discSize;
+ nt_desc.xlayer->LayerType = desc.phys.layerType;
+ nt_desc.xlayer->TrackPath = desc.phys.trackPath;
+ nt_desc.xlayer->NumberOfLayers = desc.phys.numberOfLayers;
+ nt_desc.xlayer->Reserved1 = 0;
+ nt_desc.xlayer->TrackDensity = desc.phys.trackDensity;
+ nt_desc.xlayer->LinearDensity = desc.phys.linearDensity;
+ nt_desc.xlayer->BCAFlag = desc.phys.bcaFlag;
+ nt_desc.xlayer->StartingDataSector = OSReadBigInt32(&desc.phys.zero1, 0);
+ nt_desc.xlayer->EndDataSector = OSReadBigInt32(&desc.phys.zero2, 0);
+ nt_desc.xlayer->EndLayerZeroSector = OSReadBigInt32(&desc.phys.zero3, 0);
+ nt_desc.xlayer->Reserved5 = 0;
+ nt_desc.xlayer->Reserved6 = 0;
+ break;
+
+ case DvdCopyrightDescriptor:
+ nt_desc.copy->CopyrightProtectionType =
+ desc.copy.copyrightProtectionSystemType;
+ nt_desc.copy->RegionManagementInformation =
+ desc.copy.regionMask;
+ nt_desc.copy->Reserved = 0;
+ break;
+
+ case DvdDiskKeyDescriptor:
+ memcpy(
+ nt_desc.disk_key->DiskKeyData,
+ desc.disk_key.discKeyStructures,
+ 2048);
+ break;
+
+ case DvdManufacturerDescriptor:
+ memcpy(
+ nt_desc.manf->ManufacturingInformation,
+ desc.manf.discManufacturingInfo,
+ 2048);
+ break;
+
+ case DvdBCADescriptor:
+ case DvdMaxDescriptor:
+ default:
+ /* Silence warning */
+ break;
+ }
+ }
+ return ret;
#else
FIXME("\n");
#endif
More information about the wine-cvs
mailing list