ntdll: Fix DVD_ReadStructure's layout of layer information.

Fix DVD_ReadStructure to reflect what Windows actually does, not what
Microsoft (incorrectly) documents it to do and not what the DDK
headers (incorrectly) suggest it does.
This commit is contained in:
Troy Rollo 2006-04-08 10:05:01 +10:00 committed by Alexandre Julliard
parent 44aab2e23f
commit 90df5a967f
1 changed files with 31 additions and 1 deletions

View File

@ -176,6 +176,32 @@ static const char *iocodex(DWORD code)
#define FRAME_OF_TOC(toc, idx) FRAME_OF_ADDR((toc).TrackData[idx - (toc).FirstTrack].Address) #define FRAME_OF_TOC(toc, idx) FRAME_OF_ADDR((toc).TrackData[idx - (toc).FirstTrack].Address)
#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;} #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".
*/
typedef struct
{
UCHAR MagicHeader[4];
UCHAR BookVersion : 4;
UCHAR BookType : 4;
UCHAR MinimumRate : 4;
UCHAR DiskSize : 4;
UCHAR LayerType : 4;
UCHAR TrackPath : 1;
UCHAR NumberOfLayers : 2;
UCHAR Reserved1 : 1;
UCHAR TrackDensity : 4;
UCHAR LinearDensity : 4;
ULONG StartingDataSector;
ULONG EndDataSector;
ULONG EndLayerZeroSector;
UCHAR Reserved5 : 7;
UCHAR BCAFlag : 1;
UCHAR Reserved6;
} internal_dvd_layer_descriptor;
static NTSTATUS CDROM_ReadTOC(int, int, CDROM_TOC*); static NTSTATUS CDROM_ReadTOC(int, int, CDROM_TOC*);
static NTSTATUS CDROM_GetStatusCode(int); static NTSTATUS CDROM_GetStatusCode(int);
@ -1844,9 +1870,13 @@ static NTSTATUS DVD_ReadStructure(int dev, PDVD_READ_STRUCTURE structure, PDVD_L
{ {
case DvdPhysicalDescriptor: case DvdPhysicalDescriptor:
{ {
DVD_LAYER_DESCRIPTOR *p = layer; internal_dvd_layer_descriptor *p = (internal_dvd_layer_descriptor *) layer;
struct dvd_layer *l = &s.physical.layer[s.physical.layer_num]; 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->BookVersion = l->book_version; p->BookVersion = l->book_version;
p->BookType = l->book_type; p->BookType = l->book_type;
p->MinimumRate = l->min_rate; p->MinimumRate = l->min_rate;