PDA

Ver la Versión Completa : Manipular un CD


carlocf
11-10-2008, 01:51:26
Saludos Amigos del Foro.

Hace algun tiempo hice una consulta de como poder leer sectores especificos de un Diskete, lo hice como parte de unas pruebas para mis alumnos.

Al final logre realizar mi proposito (despues de experimentar en varios disketes) el cual consistia en marcar fisicamente un diskete y luego, mediante ensamblador, lograr identificar que sectores habian sido afectados por la marca fisica.

Al usar ensamblador desde Delphi me pude enterar que Windows no dejaba acceder al anillo 0 en cual se permite el acceso directo al disco. Lo solucione con Pascal para Windows en el cual introduje mi codigo en Ensamblador y de esta manera tenia un EXE que podia verificar los sectores del Disco mediante Interrupciones(saltandose el anillo 0 de windows).Este EXE lo llamo desde la aplicación en Delphi y asunto solucionado.

Para quienes esten interesados del detalle (aunque creo que no hay nada de especial en lo que hice) les puedo explicar el detalle.

Ahora, estimados amigos, deseo hacer lo mismo pero marcando un CD y por supuesto, como ocurrio hace algun tiempo, me dirijo a Uds. para solicitar su valiosa ayuda y sugerencias para este su servidor y lego en Delphi. Mi consulta es:

Como puedo manipular el controlador del CD desde Delphi?

Si me dan alguna idea se los agradecere mucho y por supuesto al final les mostrare (por supuesto si desean) el resultado de mis experimentos

Mil gracias por su tiempo
Saludos Carlo

cHackAll
11-10-2008, 02:17:08
Bueno... carlocf, con respecto a lo que dices no creo necesario llamar a las viejas interrupciones, puedes acceder con las APIs CreateFile y _lopen al dispositivo de almacenamiento (igual que con un CD).

Ahora, hablas de marcar... BAD sectors? osea que estas interactuando con el sistema de archivos del medio; si es asi, ya habras definido la forma de marcarlo considerando que es un cd-Rom ?

Si me equivoco, aclaranos.

Saludos

Lepe
11-10-2008, 04:29:31
osea que estas interactuando con el sistema de archivos del medio; si es asi, ya habras definido la forma de marcarlo

mmmm.... ha dicho marcar físicamente, supongo que usará un clavo y arañará el CD :rolleyes:

PD: Si os hace falta un martillo, ¡¡ yo tengo uno !! :D :D

carlocf
11-10-2008, 04:49:53
Gracias por el Tiempo que se dan

Efectivamente mi intencion es marcar un CD. No usare un Clavo ni tampoco arañare el CD (las uñas las tengo cortas y esperar a que me crezcan no me servira) por supuesto tampoco usare un martillo (les comento que lo use y la verdad que los resultados no me convencen:D de pronto a Lepe le sirve marcar un Cd de esa forma aunque tambien imagino que deber marcar sus pertenencias usando el metodo del martillo:D) . Sabes cHackAll pienso utilizar una aguja fina calentada previamente para hacer una pequeña marca y luego tratar de ubicar donde se puso la marca.

Gracias por la ayuda saludos nuevamente
Atentamente Carlo

CrazySoft
11-10-2008, 16:43:14
Carlof podrias compartir el codigo me mencionas para el marcado y lectura de Discos o dar una mayor esplicacion de como hacerlo

Gracias

seoane
11-10-2008, 21:50:06
¿Con ubicar te refieres a saber que sectores machaco la marca o a situarla fisicamente sobre el disco (en milimetros)? Lo primero es sencillo, como ya te dijo chackall, Createfile y a leer. Lo segundo ya puede ser bastante mas complicado

carlocf
11-10-2008, 23:11:25
Nuevamente Saludos y mil gracias por el tiempo que se toman.

1.- Por supuesto que puedo explicarlo CrazySoft sin embargo quiero ver en que parte del Club puedo colocar esta explicacion que creo que seria como un pequeño manual.

2.- Estimado seoane mi intencion es marcar mediante una aguja fina y caliente a 5 mm del borde del agujero central, luego saber que sectores y pistas fueron malogradas.

Imagino que un CD totalmente limpio no tiene ni sectores ni pistas y que estas se crean al momento de grabar informacion en tal sentido, imagino tambien, que antes debo grabar informacion para crear pistas y sectores (claro que estoy asumiendo que un CD se organiza en pistas y sectores, si no es asi por favor corrijanme)

Ahora si hago una lectura del archivo desde el CD saltara un error al no poder leer la parte del CD que esta marcada. Sin embargo hace algun tiempo intente leer un CD que tenia partes malogradas y la verdad que la PC se colgo. Ahora mis dudas son:

a.- Usar CreateFile sobre un CD ya marcado en limpio, me permitira saber en que Sector y Pista no se pudo escribir?

b.- Y si primero grabo la información y luego marco el CD (tratando que la marca se coloque en las areas grabadas), lopen me dira en que sector y pista no se pudo leer?

Nuevamente mil gracias por el tiempo y por la ayuda prestada.
Atentamente
Carlo

cHackAll
12-10-2008, 01:14:06
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 :D.

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 :D

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;

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{IOCTL_DISK_GET_DRIVE_GEOMETRY}, 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; // Use a thread !!!
if not ReadFile(hDevice, Buffer, Geometry.BytesPerSector, Dummy, nil) then
ShowMessage('El sector #' + IntToStr(Sector) + ' esta dañado !');
end;
CloseHandle(hDevice);
end;
end;

Saludos

CrazySoft
12-10-2008, 13:13:18
Gracias cHackAll

carlocf
12-10-2008, 14:15:54
Saludos y gracias por su tiempo

De acuerdo a mi compromiso y tambien con la intencion de mostrar a CrazySoft como hice mi trabajo de marcado de un Disco les detallo el trabajo

Hace algun tiempo hice una especie de Disco de seguridad en base al marcado fisico de un Diskete. Esta demas decir que no fui ni el primero ni el ultimo en hacer este trabajo.

1.- Utilizo un Diskete formateado y por supuesto en el que estoy seguro de que no existen Sectores malogrados. Cuando empece mis pruebas utilizaba Norton Utilities, opción Speed Disk (les comento que bajo Windows 98, Speed Disk mostraba un mapeo del disco en el que se podia ver como cuadros negros los sectores malogrados y al darle un click te informaba del nº de sector malogrado. Sin embargo para la version XP la misma herramienta te sigue mostrando un mapeo del disco e incluso te muestra los sectores malogrados pero al darle click ya no hay informacion del nº de sector).

2.- Utilizando una aguja fina punzo la superficie del diskete a una distancia de 10 mm medido desde el borde de la abertura. Un dibujo te ayudara mejor:http://i386.photobucket.com/albums/oo303/carlocf/MedidaDisco.jpg

3.- Una vez marcado el disco debemos buscar que pistas y sectores fueron malogrados. Te recomiendo que perfores el disco de manera leve de tal forma que la cantidad de sectores y pistas no sea muy grande. En las pruebas que hice observe lo siguiente: Si no llego a perforar el disco, despues de un tiempo, la superfice plastica retoma su forma original y los secores malogrados ya no son detectados como tal.

4.- Como la superfice plastica con el tiempo tiende a retomar su forma original no busco de inmediato los sectores malogrados, lo hago despues de un par de dias cuando creo que la superficie, alrededor del punto perforado, ya recupero su forma.

5.- En este punto uso el Norton Disk Doctor para hacer una verificacion de superficie. El NDD marcara en la FAT los sectores malogrados.En Windows 98 usaba Speed Disk para ver el Nº de Sectores afectados, pero en Windows XP ya no puedo asi que hice un programa en ensamblador que muestra la pista y los sectores malogrados. Pero gracias a cHackAll ya tienes un codigo (citado mas arriba) de como podemos usar Delphi para mostrar BAD sectors. Usa este codigo para tener un listado de Sectores malogrados.

carlocf
12-10-2008, 14:57:10
6.- Teniendo el listado de sectores y pistas malogrados solo debemos escoger cual de ellos usaremos para identificar a nuestro diskete. Desde un programa debes buscar en el disco el sector y pista que hayas elegido y comprobar que estos sectores se encuentran malogrados, si es asi podriamos creer que tenemos el disco correcto.

7.- Sin embargo si pensamos en el asunto un poco mas, basta encontrar otro disco que por coincidencia tenga un rango de sectores malogrados entre los cuales se encuentra los que se han seleccionado y se tomaria a este disco como nuestro disco. Entonces y gracias al manual de un amigo Angel Moreno 'Microscope-32E' donde explica este metodo de seguridad (despues de completar mis pruebas y cuando ya tenia todo el trabajo completo me contacte con Angel Moreno y me brindo su manual, debo decir que si lo hubiese encontrado antes me habria ahorrado mucho tiempo de trabajo). Angel indica que una combinacion de sectores malogrados y buenos (que se encuentren contiguos) ayuda mas que si solo se usa sectores malogrados. Les paso el correo de Angel Moreno para ver si nuestro estimado moderador marcoszorrilla puede contactarse con el y de pronto podamos tener su esplendido manual al alcance de todos. El correo es a.moreno@quipusoft.com (a.moreno@quipusoft.com)

8.- El codigo ASM que uso es el siguiente:

Asm
{Guardar los registros}
push DI
push AX
push DX
push CX
Mov DI,2 {Iniciar el Contador}
Xor AX,AX {Poner a 0 el registro AX}
bBucle:
Mov AH,4 {Colocar el indicador de Verificar Sectores}
Mov DL,bDLUnidad
Mov DH,bDHCara
Mov CH,bCHPista
Mov CL,bCLSector
Mov AL,bALNSectores
Int 13h
Jnc bOk
Jmp bErr
bOk:
Mov AH,0 {Restaurando el diskette}
Int 13h {Llamar a la Int 13}
Dec DI {Decrementamos el contador}
Cmp DI,0 {Compramos si es igual a cero}
Jne bBucle {Si no es igual saltamos a bBucle}
Jmp bErr {Si es igual a 0 saltamos a bErr}
bErr:
Mov ResAH,AH
pop CX {Restauramos los registros}
pop DX
pop AX
pop DI
End;

carlocf
12-10-2008, 15:15:25
9.- Debo comentarles (aun cuando ya lo hice anteriormente) que al usar ASM en delphi no podia acceder a las INT 13, despues de averiguar un poco por internet me entere que Windows se maneja por anillos (rings) poniendo en el anillo mas interno (ring 0) la manipulacion de las INT, pero para llegar al anillo 0 es mas complicado. Asi que en base a prueba y error descubri que Pascal para DOS en Win XP dejaba acceder a la INT13 y no falto mucho para hacer la prueba con Pascal para Windows en la que tambien es posible manejar INT. Asi que tengo el codigo anterior insertado dentro de un programa en Pascal para windows, dentro del cual puedo recuperar los valores manipulados por el codigo ASM y colocarlos en archivos de disco. Este programa (EXE) lo ejecuto desde Delphi, una vez que termina, el codigo Delphi lee el contenido de los archivos (el contenido de cada archivo esta encriptado) y de esta manera puedo manejar el resultado del codigo ASM desde Delphi. Es decir hago un manejo indirecto.

Como ven esta es la forma en que solucione mi problema. Pero Uds. amigos del foro que son mas inteligentes que yo, podran hacerlo mejor

Espero no haberlos aburrido con esta chachara (platica aburrida) y que les sirva de algo.

Un saludo
Carlo

kurono
14-10-2008, 07:12:11
amigo hackall el codigo que mostraste para indentificar sectores dañado en un disco esta buenisimo funciona a la perfecion solo ahi un incombeniente y es el siguiente como elegir la unidada a comprobar pues en el ejemplo que pusiste esta la unidad g: como predeterminada y como sabra no tadas las pc tienen las misma unidades