Comment effacer un cdrom
mniajnaa
Messages postés
7
Statut
Membre
-
humm -
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;
}
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;
}
A voir également:
- Comment effacer un cdrom
- Comment effacer un iphone - Guide
- Comment effacer un compte gmail - Guide
- Comment effacer une page word - Guide
- Effacer les données de navigation sur android - Guide
- Comment effacer les messages sur google - Guide