begin process at 2012 05 29 07:26:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

MFC

 > 

la gravure multisession


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

la gravure multisession

vendredi 23 février 2007 à 11:25:40 | la gravure multisession

mniajnaa

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)&currentBlock)->Byte3;
      cdb.CDB10.LogicalBlockByte1 = ((PFOUR_BYTE)&currentBlock)->Byte2;
      cdb.CDB10.LogicalBlockByte2 = ((PFOUR_BYTE)&currentBlock)->Byte1;
      cdb.CDB10.LogicalBlockByte3 = ((PFOUR_BYTE)&currentBlock)->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);

}

 


 



Cette discussion est classée dans : buffer, cdb, mode, uchar, dwbuffersize


Répondre à ce message

Sujets en rapport avec ce message

linear frame buffer - comment mapper la memoire ? [ par roomsmush ] voila, je cherche à 'mapper' la memoire pour le Linear Frame Buffer (VESA 2.0), seulement je n'arrive pas avec DJGPP. Voici mon bout de code pour le m fopen(pathFile,"mode") error stream!=NULL [ par Yannikator ] Bonjour,Je développe un petit programme en C et je me heurte à un problème que je pense pas incontournable mais j'ai pas d'idée là... J'ai fait un fon char* dans un destructeur [ par pepsidrinker ] Premierement, merci de lire ce post, et merci a tous ceux qui veulent maider. Jai le probleme suivant: Jassigne des char* avec 'new[]' dans le constru buffer pour editeur de texte [ par dyroj ] hello all, je voudrai créer un editeur de texte, et pour cela j'ai besoin d'un buffer(une variable char) qui contiendra toute la taille du fichier(qui Frame Buffer OpenGL [ par roger000 ] <link rel="Fi copier le contenu d'un fichier dans Cstring [ par msahli3 ] bonjour , je doit modifier un programme (fait auparavant en MFC ou je ne suis pas forcément trés bon) je doit importer un fichier texte et le parsser Création DLL en mode Release [ par Argile92 ] Bonjour,Je developpe une application Excel qui utilise des fonctions C++ via une DLL.J'ai dans un premier temps fais ma DLL en mode DEBUG, aucun probl Methode post [ par thefrox ] Bonjour, je cherche a faire fonctionner la méthode post de ma requête en brutle problème c'est que le method_get je le recoit bien en $_GET['method_ge fermer une thread qui est en attente fgets() en c sous windXP [ par dyroj ] Bonjour a tous,je n'arrive pas fermer une thread qui est en attende avec la fonction fgets(),thread a quitter :DWORD WINAPI Tsend_ms_t(LPVOID lpvoid){ gets() marche plus apres fermeture de thread [ par dyroj ] bonjour, est-il normale que fgets() block quand on lapele plus dune foi, //envoi en mode tcp WINA


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales