begin process at 2012 02 12 13:27:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

MFC

 > 

pour effacer un cdrom


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

pour effacer un cdrom

jeudi 22 mars 2007 à 10:25:52 | pour effacer un cdrom

mniajnaa


salut tout le monde

j'ai une fonction qui efface les cdrom avec l'api DeviceIoControl .

malgré un probleme  qui entrave le fonctionnement normal de la fonction

ce dernier est ERROR_SEM_TIMEOUT ,recuperable par l'api GetLastError() ,sa signification est:

la periode d'arret de semaphre a expiré càd que l'evenement demandé ne se produit pas dans le temps indiqué(arrét).

la structure dont je doute causer ce probleme est OVERLLAPED mais je ne suis pas sur

si vous avez des suggestion surtout ne lesinez pas de me les proposer

merci d'avance


la fonction est la suivante


bool EraseDisc()
 { 
    SENSE_DATA senseData;
 DWORD dwsize = sizeof(BYTE);;
 PUCHAR buffer = NULL;
 buffer = (PUCHAR)LocalAlloc(LPTR,dwsize);
 RtlZeroMemory(buffer,dwsize);
 ZeroMemory(&cdb,sizeof(CDB));
 cdb.ERASE2.OperationCode = 0xa1;
 cdb.ERASE2.BlankingType = 0x01;

 if(!(SendCdb2DeviceEx0(&cdb,12,(PUCHAR)buffer,&dwsize,&senseData,sizeof(SENSE_DATA),1,60))) goto err;//0,0,60


    LocalFree(buffer);
    return true;
    err:
     LocalFree(buffer);  
    logfile.LOG_fn_Write("Erruer d'execution de la commande erase disc !");
    return false;
}

////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////

avec SendCdb2DeviceEx0 est la suivante

 

int SendCdb2DeviceEx0(PCDB Cdb, UCHAR CdbSize, PUCHAR Buffer, DWORD *BufferSize, PSENSE_DATA SenseData OPTIONAL, UCHAR SenseDataSize, int GetDataFromDevice, DWORD TimeOut)
{  
   OVERLAPPED * lpOverlapped =new OVERLAPPED ;
   lpOverlapped->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
   lpOverlapped->Offset = 0; 
   lpOverlapped->OffsetHigh = 0 ;
  PSPT_WITH_BUFFERS p ;
  PSENSE_DATA senseBuffer;
  DWORD packetSize, returnedBytes;
  int returnValue ;
  UCHAR length;
  if((SenseDataSize == 0) && (SenseData != NULL)) goto err;
  if((SenseDataSize != 0) && (SenseData == NULL)) goto err;
  if(SenseData && SenseDataSize) ZeroMemory(SenseData, SenseDataSize);
  if(Cdb == NULL) goto err;
  if(CdbSize < 1 || CdbSize > 16) goto err;
  if(!SptUtilValidateCdbLength(Cdb, CdbSize)) goto err;
  if(BufferSize == NULL) goto err;
  if((*BufferSize != 0) && (Buffer == NULL)) goto err;
  if((*BufferSize == 0) && (Buffer != NULL)) goto err;
  if((*BufferSize) && GetDataFromDevice) ZeroMemory(Buffer, (*BufferSize));
  packetSize = sizeof(SPT_WITH_BUFFERS) + (*BufferSize);
  p = (PSPT_WITH_BUFFERS)LocalAlloc(LPTR, packetSize);
  if(p == NULL) goto err;

  ZeroMemory(p, packetSize);
  memcpy(p->Spt.Cdb,Cdb, CdbSize);
  p->Spt.Length             = sizeof(SCSI_PASS_THROUGH);
  p->Spt.CdbLength          = CdbSize;
  p->Spt.SenseInfoLength    = SENSE_BUFFER_SIZE;
  p->Spt.DataIn             = (GetDataFromDevice ? 1 : 0);
  p->Spt.DataTransferLength = (*BufferSize);
  p->Spt.TimeOutValue       = TimeOut;
  p->Spt.SenseInfoOffset = FIELD_OFFSET(SPT_WITH_BUFFERS, SenseInfoBuffer[0]);
  p->Spt.DataBufferOffset = FIELD_OFFSET(SPT_WITH_BUFFERS, DataBuffer[0]);
  if((*BufferSize != 0) && (!GetDataFromDevice)) RtlCopyMemory(&(p->DataBuffer[0]), Buffer, *BufferSize);
  returnedBytes = 0 ;


  returnValue = DeviceIoControl(hCDROM,IOCTL_SCSI_PASS_THROUGH,p, packetSize, p, packetSize, &returnedBytes,lpOverlapped);//0

 
/////////////// meme si le disque est effacé  DeviceIoControl retourne la valeur zero

  DWORD ss= GetLastError();


////////////// la fonction GetLastError retourne la valeur 121 equivalente a ERROR_SEM_TIMEOUT


  senseBuffer = (PSENSE_DATA)p->SenseInfoBuffer ;
  if(senseBuffer->SenseKey & 0xf){
    length = senseBuffer->AdditionalSenseLength;
    length += RTL_SIZEOF_THROUGH_FIELD(SENSE_DATA, AdditionalSenseLength);
    if(length > SENSE_BUFFER_SIZE) length = SENSE_BUFFER_SIZE;
    length = min(length, SenseDataSize);
    CopyMemory(SenseData, senseBuffer, length);
    returnValue = 0;
    goto cpyData;
  }
  else if(p->Spt.ScsiStatus != 0) {returnValue = 0; goto relMem;}
  else if(!returnValue) goto relMem;
cpyData:
  if(GetDataFromDevice){
    if(*BufferSize > p->Spt.DataTransferLength) *BufferSize = p->Spt.DataTransferLength;
    memcpy(Buffer, p->DataBuffer, *BufferSize);
  }
relMem:
  LocalFree(p);
  return returnValue;
err: return 0;
}



Cette discussion est classée dans : buffer, goto, err, spt, buffersize


Répondre à ce message

Sujets en rapport avec ce message

Pb de pointeur [ par DMK04 ] Bonjour,J'ai un problème avec un pointeur...Contexte : j'envoie une trame à un periphérique connecté sur port série, le périphérique répond.Mon problè Cstring et char [ par sendouda ] bonjour;je veux bien convertir un Cstring en char et puis déterminer sa taille en termes de nombre de caractères. pour ceci j'ai fait cela: char* buff Erreur de segmentation sniffer linux [ par gauthzilla ] bonjour, j'ai récuprer les sources d'un sniffer sur http://www.estvideo.com/dew/index/page/sniffer lorsque je compile sous linux, tout va bien. Mais Remplacement de chaines de caractères dans un fichier [ par tigerskin ] Bonjour !!! J'ai un problème : je souhaite réécrire une donnée dans un fichier par-dessus une autre donnée...le programme entre bien dans la condition affichage d'images par une fonction [ par Dr_zoidberg ] Bonjour, Je cherche à créer une fonction permettant d'afficher une image dans un "drawingarea" mais sans devoir faire appel à un expose_event. Le but comment vider le buffer du port série en MFC [ par donslim ] BonjourVoila, je travaille actuellement avec le port série en MFC et j'aimerai savoir comment on peux vider le buffer ?Merci d'avance de vos réponses. wavein .lpData [ par niketou ] Salut a tous.Voila mon probleme.WAVEHDR  Buffer;char *Value; Buffer.lpData=Value;Buffer.dwBufferLength=1024;Cela renvoit une donnee de type char de Taille buffer port COM [ par DMK04 ] Bonjour,je voudrais savoir si quelqu'un connait la taille du buffer d'un port série ?MerciA+ Liaison série [ par arnaud malabeux ] Bonjour,C'est la premiere fois que je pose une question .Dans une application, je travail avec une liaison série (connectée sur un port USB).Mon périp Goto syntaxe [ par darkwhite ] Salut a tous Je debute en c. Quel la syntaxe pour renvoyer a un endroit du prog : le goto


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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 : 1,154 sec (3)

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