SOS SOS SOS SOS SOS .......
salut tout le monde
le probleme
je vais vous le decrire d'une maniere succincte
j'ai une application qui permet la gravure en multisession
mais le probleme reside dans le fait ou toutes les sessions gravees
sont cahees sauf la premiere
c à d que la premiere session gravée sur le cd est affichable
par contre toute les autres qui suivent ne le sont pas "cachées"
*le language c++
*la configuration
l'application utilise les API createfile et DeviceIoControle
de la technologie SPTI sous windows xp
je ne sais pas est ce que se sont les commandes mmc qui
en sont responsable ou bien d'autre chose ?
pour eviter ce probleme qu'est ce qu'il faut faire ?
merci d'avance pour votre aide et suggestions
****************************************************
****************************************************
voici le code de la fonction qui determine le mode d'ecriture
int SaveWriteMode(int iSimulation , UCHAR dwType, UCHAR dwSession, UCHAR dwBlockType, UCHAR dwFormat)
{
PCDVD_WRITE_PARAMETERS_PAGE params = NULL;
MODE_PARAMETER_HEADER10 header;
PMODE_PARAMETER_HEADER10 buffer;
UCHAR dwTypeCode;
DWORD dwbufferSize=sizeof(MODE_PARAMETER_HEADER10), dwmaxSize, t;
int ierr = 1; // PRESUME ERREUR
ZeroMemory(&header, sizeof(MODE_PARAMETER_HEADER10));
ZeroMemory(&cdb, sizeof(CDB));
cdb.MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10;
cdb.MODE_SENSE10.PageCode = 0x05 ;
cdb.MODE_SENSE10.Pc = 0x02 ;
cdb.MODE_SENSE10.Dbd = 1;
cdb.MODE_SENSE10.AllocationLength[0] = (UCHAR)(dwbufferSize >> 8);
cdb.MODE_SENSE10.AllocationLength[1] = (UCHAR)(dwbufferSize & 0xff);
if(!(SendCdb2DeviceEx(&cdb, 10, (PUCHAR)&header, &dwbufferSize, 0, 0, 1, 60))) goto SaveWritExit;
dwbufferSize = (header.ModeDataLength[0] << 8) + (header.ModeDataLength[1] & 0xff);
dwbufferSize += 2; dwmaxSize = dwbufferSize;
buffer = (PMODE_PARAMETER_HEADER10)LocalAlloc(LPTR,dwbufferSize);
if(!buffer) goto SaveWritExit;
ZeroMemory(&cdb,sizeof(CDB));
cdb.MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10;
cdb.MODE_SENSE10.PageCode = 0x5;
cdb.MODE_SENSE10.Pc = 0x2;
cdb.MODE_SENSE10.Dbd = 1;
cdb.MODE_SENSE10.AllocationLength[0] =(UCHAR)(dwbufferSize >> 8);
cdb.MODE_SENSE10.AllocationLength[1] =(UCHAR)(dwbufferSize & 0xff);
if(!(SendCdb2DeviceEx(&cdb, 10, (PUCHAR)buffer, &dwbufferSize, 0, 0, 1, 60))) goto relMem;
dwTypeCode = buffer->MediumType;
t = (buffer->BlockDescriptorLength[0] >> 8) + (buffer->BlockDescriptorLength[1] & 0xff);
if(t != 0) goto relMem;
params = (PCDVD_WRITE_PARAMETERS_PAGE)(buffer + 1);
ZeroMemory(buffer, FIELD_OFFSET(MODE_PARAMETER_HEADER10, BlockDescriptorLength[0]));
buffer->ModeDataLength[0] = (UCHAR)((dwbufferSize-2) >> 8);
buffer->ModeDataLength[1] =(UCHAR)((dwbufferSize-2) & 0xff);
buffer->MediumType = dwTypeCode;
params->WriteType = dwType;
params->TestWrite =(iSimulation ? 0x01 :0x00);
params->Copy = 0x00;
params->MultiSession = dwSession; //////////////////0x03
params->DataBlockType = dwBlockType; /////////////////0x04 impossible de mettre 0xc4
params->SessionFormat = dwFormat; //////////////////0x00
params->MediaCatalogNumberValid = 0x00;
params->ISRCValid = 0x00;
ZeroMemory(&cdb, sizeof(CDB));
cdb.MODE_SELECT10.OperationCode = SCSIOP_MODE_SELECT10;
cdb.MODE_SELECT10.PFBit = 1;
cdb.MODE_SELECT10.ParameterListLength[0] =(UCHAR)(dwbufferSize >> 8);
cdb.MODE_SELECT10.ParameterListLength[1] =(UCHAR)(dwbufferSize & 0xff);
if(!(SendCdb2DeviceEx(&cdb,10,(PUCHAR)buffer, &dwbufferSize, 0, 0, 0, 60))) goto relMem;
ierr = 0;
relMem: LocalFree(buffer);
SaveWritExit: return ierr;
}
*********************************************************
*********************************************************
et voici aussi le code de la fonction qui permet la gravure
int BurnSession(LONG NumberOfBlocks , LONG FirstLba)
{
SENSE_DATA senseData;
PUCHAR buffer = NULL;
LONG currentBlock;
DWORD readSize,readBytes,size, percent, bufferSize = 0x800 * 0x10;
int ignoreError, writeCompleted = 0;
char szStatus[20];
*((DWORD*) szStatus) = 0x76617247; // "Grav"
*((DWORD*) (szStatus+4)) = 0x20657275; // "ure "
*((WORD*) (szStatus+8)) = 0x203A; // ": "
buffer = (PUCHAR)LocalAlloc(LPTR, bufferSize);
if(buffer == NULL) goto err;
for(currentBlock = FirstLba ; currentBlock < FirstLba + NumberOfBlocks + POST_GAP_SIZE;){
// NumberOfBlocks est le nombre de block du fichier
writeCompleted = 0;
percent =(currentBlock*1000) / (FirstLba + NumberOfBlocks+POST_GAP_SIZE);
ultoa((percent/10), szStatus+10,10);
if(FirstLba + NumberOfBlocks - currentBlock >= 0x10) readSize = 0x800 * 0x10;
else if(FirstLba + NumberOfBlocks - currentBlock > 0){
//NumberOfBlocks=taille du fichier iso/2048
readSize = (FirstLba + NumberOfBlocks - currentBlock) * 0x800;
RtlZeroMemory(buffer, bufferSize);
}
else {
readSize = 0; readBytes = 0;
RtlZeroMemory(buffer, bufferSize);
}
if(readSize && !ReadFile(hFILEISO, buffer, readSize, &readBytes, NULL)) goto errmem;
if(readBytes != readSize) goto errmem;
while(!writeCompleted){
ZeroMemory(&senseData, sizeof(senseData));
ZeroMemory(&cdb, sizeof(CDB));
cdb.CDB10.OperationCode = SCSIOP_WRITE;
cdb.CDB10.LogicalBlockByte0 = ((PFOUR_BYTE)¤tBlock)->Byte3;
cdb.CDB10.LogicalBlockByte1 = ((PFOUR_BYTE)¤tBlock)->Byte2;
cdb.CDB10.LogicalBlockByte2 = ((PFOUR_BYTE)¤tBlock)->Byte1;
cdb.CDB10.LogicalBlockByte3 = ((PFOUR_BYTE)¤tBlock)->Byte0;
cdb.CDB10.TransferBlocksLsb = 4;///////////////+++++++
if((currentBlock + 0x10)<= (FirstLba + NumberOfBlocks + POST_GAP_SIZE)) cdb.CDB10.TransferBlocksLsb = 0x10;
else cdb.CDB10.TransferBlocksLsb = (UCHAR)(FirstLba + NumberOfBlocks + POST_GAP_SIZE - currentBlock);
writeCompleted = SendCdb2DeviceEx(&cdb, 10, buffer, &bufferSize, &senseData, sizeof(SENSE_DATA), FALSE, 50);
ignoreError = IsSenseDataInTable(AllowedBurnSense, AllowedBurnSenseEntries, &senseData);
if((!writeCompleted) && ignoreError) Sleep(100);
if(!writeCompleted && !ignoreError) goto errmem;
}
currentBlock += 0x10 ;
}
LocalFree(buffer);
}