Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Manipular un CD (https://www.clubdelphi.com/foros/showthread.php?t=60715)

carlocf 11-10-2008 01:51:26

Manipular un CD
 
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

Cita:

Empezado por cHackAll (Mensaje 319527)
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

Manipular CD
 
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

Manipular CD
 
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;

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{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

Manipular CD
 
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:

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

Manipular CD
 
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

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

Código:

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

Manipular CD
 
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


La franja horaria es GMT +2. Ahora son las 13:29:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi