Code: Select all
It's really weird...Code: Select all
It's really weird...Please log. Does this occur in all your DL discs or only this disc? I tried my DL disc but dic could recognize the second layer.ajshell1 wrote:I've noticed a problem with DIC.
The logs for the game in question are included in this link (plus some other games)sarami wrote:Please log. Does this occur in all your DL discs or only this disc? I tried my DL disc but dic could recognize the second layer.ajshell1 wrote:I've noticed a problem with DIC.
Code: Select all
TrackPath: Opposite Track Path
NumberOfLayers: Double Layer
TrackDensity: 0.74μm/track
LinearDensity: 0.293μm/bit
StartingDataSector: 196608 (0x30000)
EndDataSector: 15995449 (0xf41239)
EndLayerZeroSector: 2224591 (0x21f1cf)Code: Select all
TrackPath: Parallel Track Path
NumberOfLayers: Double Layer
TrackDensity: 0.74μm/track
LinearDensity: 0.293μm/bit
StartingDataSector: 196608 (0x30000)
EndDataSector: 1702255 (0x19f96f)
EndLayerZeroSector: 0 (0)Some changed. http://www.mediafire.com/file/eq80y20l9 … or_test.7zjhmiller wrote:With my Plextor PX-755A the DIC seems to freeze here (I stop the process after 1 hour or waiting):
Code: Select all
DWORD Device::readDVDTOC(DiscInfo & discInfo) {
typedef struct DVD_SESSION_INFO {
DVD_DESCRIPTOR_HEADER h;
DVD_LAYER_DESCRIPTOR d;
} DVD_SESSION_INFO;
MMCCdb cdb;
RtlZeroMemory(&cdb, sizeof(MMCCdb));
CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_DVD_STRUCTURE);
cdb.field[6] = 0; // Layer 0
cdb.field[9] = sizeof(DVD_SESSION_INFO);
DVD_SESSION_INFO dvdSessionInfo;
RtlZeroMemory(&dvdSessionInfo, sizeof(dvdSessionInfo));
DWORD retVal = runMMCCommand(&cdb, getMMCCommandLen(cdb.field[0]), (PUCHAR)&dvdSessionInfo, sizeof(dvdSessionInfo), SCSI_MMC_DATA_READ);
if (!retVal) {
ULONG layerZeroStartLsn = Utils::swapBytesUlong(dvdSessionInfo.d.StartingDataSector);
ULONG discLenLsn = 0;
if (dvdSessionInfo.d.NumberOfLayers) {
if (dvdSessionInfo.d.TrackPath == 1) {
// Opposite Track Path - Single Lead-In / Out (the same information is returned for all layers)
}
else {
// Parallel Track Path - Dual Lead-In / Out
}
ULONG layerZeroLsnEnd = Utils::swapBytesUlong(dvdSessionInfo.d.EndLayerZeroSector);
if (!layerZeroLsnEnd) {
DEBUGPRINTWE(L"Unsupported DL DVD Disc found!\n");
return ERROR_UNSUPPORTED_TYPE;
}
ULONG layerZeroLsnLen = layerZeroLsnEnd - layerZeroStartLsn + 1;
ULONG layerOneLsnEnd = Utils::swapBytesUlong(~dvdSessionInfo.d.EndDataSector) & 0xFFFFFF;
ULONG layerOneLsnLen = layerZeroLsnEnd - layerOneLsnEnd + 1;
discLenLsn = layerZeroLsnLen + layerOneLsnLen;
}
else {
ULONG endDataLsn = Utils::swapBytesUlong(dvdSessionInfo.d.EndDataSector);
discLenLsn = endDataLsn - layerZeroStartLsn + 1;
}
if (!retVal) {
SessionInfo sessionInfo;
sessionInfo.firstTrackNo = 1;
sessionInfo.lastTrackNo = 1;
sessionInfo.sessionStartLsn = 0;
sessionInfo.sessionEndLsn = discLenLsn;
sessionInfo.sessionStartMSF = 0;
sessionInfo.sessionEndMSF = discLenLsn;
if (dvdSessionInfo.d.NumberOfLayers) {
discInfo.dualLayerDVD = TRUE;
}
TrackInfo trackInfo;
trackInfo.indexNo = 1;
trackInfo.trackNo = 1;
trackInfo.trackAdr = 0;
trackInfo.startAddress = 0;
trackInfo.endAddress = discLenLsn;
trackInfo.trackFormat = DATA_MODE_FORMAT_MODE1;
sessionInfo.tracksSub.push_back(trackInfo);
discInfo.discToc[1] = sessionInfo;
discInfo.hasPvd = TRUE;
}
}
else {
retVal = Helpers::printSystemMessage(__FILE__, __LINE__, retVal);
}
return retVal;
/*DWORD bytesReturned = 0;
DWORD retVal = 0;
DVD_READ_STRUCTURE dvdReadStructure;
dvdReadStructure.BlockByteOffset.QuadPart = 0;
dvdReadStructure.SessionId = 0;
dvdReadStructure.Format = DvdPhysicalDescriptor;
dvdReadStructure.LayerNumber = 0;
typedef struct DVD_SESSION_INFO {
DVD_DESCRIPTOR_HEADER h;
DVD_LAYER_DESCRIPTOR d;
} DVD_SESSION_INFO;
DVD_SESSION_INFO dvdSessionInfo;
RtlZeroMemory(&dvdSessionInfo, sizeof(dvdSessionInfo));
if (DeviceIoControl(iDeviceHandle, IOCTL_DVD_READ_STRUCTURE, &dvdReadStructure, sizeof(DVD_READ_STRUCTURE), &dvdSessionInfo, sizeof(dvdSessionInfo), &bytesReturned, NULL)) {
ULONG endLayerZeroLsn = Utils::swapBytesUlong(dvdSessionInfo.d.EndLayerZeroSector);
ULONG sectorStartLsn = Utils::swapBytesUlong(dvdSessionInfo.d.StartingDataSector);
ULONG discLenLsn = endLayerZeroLsn - sectorStartLsn + 1;
if (dvdSessionInfo.d.NumberOfLayers) {
discLenLsn *= 2;
}
SessionInfo sessionInfo;
sessionInfo.sessionStartLsn = sectorStartLsn;
sessionInfo.sessionEndLsn = discLenLsn;
discInfo.discToc[1] = sessionInfo;
}
else {
retVal = Helpers::printSystemMessage(__FILE__, __LINE__);
}
return retVal;*/
}It's possible.reentrant wrote:Is it possible to continue execution even if there are C2 errors (I know the image will be bad but I'm aware of it)?
Code: Select all
throw FALSE;Code: Select all
break;Yes. It's checked by the func 'ContainsC2Error' of the Line 1630.reentrant wrote:Is your C2 algorithm using C2 bits to select bytes which are good / bad and rereads until there are no C2 bits set (making use of C2 bits from previous rereads)?