Aunque se adelantaron a preguntarlo, debo acotar algo que me inquieta en el sentido practico); tienes un CD (grabado o no) y digamos que podemos detectar el sector dañado y resulta ser el #666
.
Bien! tenemos el sector 666 dañado y el resto perfecto; de paso en el software mostramos un par de circulitos en representacion del CD y utilizando algo de trigonometria y tomando un angulo X marcamos con un "punto" el lugar donde se encuentra el "alfilerazo", el usuaro lo ve y todos felices
Ahora mi duda; cómo podemos saber comparando visualmente dónde está dicho sector dañado? como sabemos (girando X grados el CD) dónde esta el "punto" que vemos en la pantalla???
Paisano CrazySoft: aqui va un codigo que puedes(n) utilizar para dicho caso;
Código Delphi
[-]procedure TForm1.Button1Click(Sender: TObject);
var
hDevice, Dummy, Sectors, Sector: Cardinal;
Buffer: array [0..$FFFF] of Byte;
Geometry: record
Cylinders: Int64;
MediaType,
TracksPerCylinder,
SectorsPerTrack,
BytesPerSector: Cardinal;
end;
begin
SetErrorMode(SEM_FAILCRITICALERRORS);
hDevice := CreateFile('\\.\g:', GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDevice <> INVALID_HANDLE_VALUE then
begin
DeviceIoControl(hDevice, $70000, nil, 0, @Geometry, SizeOf(Geometry), Dummy, nil);
Sectors := Geometry.SectorsPerTrack * Geometry.TracksPerCylinder * Geometry.Cylinders;
for Sector := 0 to Sectors - 1 do
begin
Label1.Caption := 'Leyendo el sector #' + IntToStr(Sector) + '...';
Application.ProcessMessages; if not ReadFile(hDevice, Buffer, Geometry.BytesPerSector, Dummy, nil) then
ShowMessage('El sector #' + IntToStr(Sector) + ' esta dañado !');
end;
CloseHandle(hDevice);
end;
end;
Saludos