Comment effacer un cdrom

mniajnaa Messages postés 7 Statut Membre -  
 humm -
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;
}

1 réponse

humm
 
bonjour les reinscriptibles pas les autres
0