MisterProper - Antes: Utilidad para limpiar entradas LFN

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

MisterProper - Antes: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 28 Jun 2017 23:51

Estoy haciendo un pequeño programa para limpiar (en otras palabras: eliminar) las entradas LFN de un disco. Por ejemplo, en muchos ordenadores retro tenemos como nuevo dispositivo de carga una tarjeta CF, o SD, o le hemos puesto un disco IDE donde antaño usábamos cintas o disquetes de 3 pulgadas... O simplemente, en un XT hemos sustituido un disco duro de pocos megas por una tarjeta de 2 GB... O nos hemos creado un fichero con una imagen de disco duro para usar en un emulador o en la MiST... Lo que sea.

El caso es que a la hora de llenar esas tarjetas o imágenes, las llevamos a nuestro PC con Windows XP, 7, 8, 10 o Linux, y grabamos desde aquí los ficheros necesarios. El problema es que casi seguramente, se habrán introducido nombres largos (entradas LFN) e incluso con los nombres cortos se habrán introducido atributos que en tiempos de nuestros micros no existían (hora de creación, hora de último acceso...) Nada de esto le sentará bien al sistema operativo del micro donde vamos a usar la tarjeta o imagen.

Así que con este programita podemos limpiar tanto las entradas LFN como los nuevos atributos, que ocupan zonas que antes estaban reservadas y unos S.O. ignoran, pero otros esperan encontrar vacías.

Al igual que otros desarrollos que estoy haciendo a la vez (y en los que está basado), está en Java, así que requiere un runtime de Java 1.5 o posterior.

La versión actual funciona sólo con imágenes de disco, así que para usarlo con tarjetas habría que pasar la tarjeta a imagen, y una vez limpia, volverla a pasar a la tarjeta.

En realidad tengo una versión programada para funcionar con imágenes y tarjetas, pero hay un "pequeño" problema con Windows (a lo mejor en Linux funciona) y es que al acceder a la tarjeta en modo lectura todo va bien, pero cuando quiero acceder a ella en modo escritura... me dice que no existe. Creo que esto es porque en Windows la tarjeta está bloqueada, y no sé cómo se desbloquea. En Windows 95 había unos comandos LOCK/UNLOCK, pero en los Windows modernos no tengo ni idea de cómo se hace, así que si alguien me puede echar una mano en esto, podré sacar la versión que funciona con tarjetas.

He probado con 4 ó 5 imágenes de discos duros, tarjetas y pen-drives, y de momento la limpieza ha funcionado y no ha ocurrido ningún accidente, pero por si acaso, convendría trabajar sobre una copia de la imagen.

Ah, los parámetros:
  • -? o -h para mostrar la ayuda
  • -res para limpiar también los campos reservados, como la hora de creación (por defecto sólo se limpian las entradas LFN)
  • -list si sólo queremos listar lo que encuentra en la imagen, pero sin limpiar nada (la imagen no se modifica)
  • -d muestra información de debug (seguramente muchas pantallas)
  • Y por supuesto, el nombre de fichero con la imagen de disco

CleanLFN.zip
CleanLFN 0.94 sin acceso a dispositivos físicos
(5.79 KiB) Descargado 11 veces
Edito: La última versión se llama MisterProper y es la 1.0, ir a los últimos posts

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 29 Jun 2017 12:03

Pues he comprobado que la versión para trabajar con dispositivos físicos funciona en Linux. En Windows parece que los dispositivos están bloqueados y no hay nada que hacer. Si alguien sabe cómo desbloquearlos, que nos lo cuente.

Subo la versión completa. Es como la del primer post, pero además admite dispositivos físicos (tarjetas, pen-drives, discos duros...) La única diferencia es que en lugar de usar un nombre de fichero hay que pasarle el nombre del dispositivo (el pen-drive en mi caso es /dev/sdb) y usar el parámetro -phys (que la otra versión no tenía). Las pruebas las he hecho sin haber montado /dev/sdb, no sé si funcionará con la unidad montada.

MUY recomendable antes de ejecutar la limpieza usar el parámetro -list para confirmar que lo que encuentra en el disco se corresponde con la realidad.

En Windows es complicado saber el nombre del dispositivo, en XP son de la forma \\.\PhysicalDriveX (hay que saber el número para ponerlo en el lugar de la X) y como ya he dicho, permite leer, pero no escribir. Desasignando la letra de la unidad con el administrador de discos el problema persiste. En Windows 10 ni siquiera permite leer.

Versión completa (para imágenes de disco y unidades físicas) que funciona en Linux y probablemente en Windows si se consigue desbloquear la unidad:
CleanLFN.zip
CleanLFN 0.94 con acceso a dispositivos físicos
(5.87 KiB) Descargado 9 veces

Avatar de Usuario
Kyp
Mensajes: 275
Registrado: 03 Oct 2013 17:13
Agradecido : 1 vez
Agradecimiento recibido: 24 veces

Re: Utilidad para limpiar entradas LFN

Mensajepor Kyp » 30 Jun 2017 13:40

En WinVista o superior el acceso a bajo nivel al disco está capado por las políticas de seguridad. Para poder escribir en un volumen primero tienes que conseguir acceso exclusivo al mismo (FSCTL_LOCK_VOLUME) y creo recordar que además antes hay que desmontar el volumen (FSCTL_DISMOUNT_VOLUME).

No se si Java te permite enviar IOCTL's, si no vas a tener que usar JNI (o lo que haya ahora equivalente, no uso Java desde hace años).

Hay otro IOCTL que te dice el nº de disco físico a partir del handle del volumen (IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, creo), así puedes abrir E: y obtener el nº.

De todas formas las entradas LFN están pensadas para que sean 'transparentes' a sistemas antiguos (usan una combinación de atributos supuestamente 'imposible' que se deberían ignorar, pero claro, para eso el SO debe estar bien hecho y no siempre es el caso.

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 30 Jun 2017 14:17

Gracias por la información, pero la idea no era implementarlo en el programa, sino desmontar el dispositivo "a manubrio" antes de ejecutar el programa. En el programa no quería meter código específico para Windows ni para Linux. Pensaba que se podría hacer algo desde el administrador de discos, o con algún comando como el LOCK de Windows 95, pero si no lo hay... pues bye-bye Windows (una pena, pero... que lo hubieran puesto más fácil).

Si sirve de consuelo, a los que tengan montada alguna máquina virtual Linux sobre Windows, sí que les funciona, porque es lo que tengo yo para probar con pen-drives.

En cuanto a que el S.O. esté bien o mal hecho... ¿está mal hecho un S.O. que considera un directorio una entrada que tiene el atributo de directorio activado?

Avatar de Usuario
Kyp
Mensajes: 275
Registrado: 03 Oct 2013 17:13
Agradecido : 1 vez
Agradecimiento recibido: 24 veces

Re: Utilidad para limpiar entradas LFN

Mensajepor Kyp » 30 Jun 2017 23:30

Hay formas de decirle al Windows que no monte los volúmenes.

Para empezar desde el administrador de discos puedes quitar la letra de unidad pero eso solo vale si detecta el pendrive como disco con particiones pero eso no pasa siempre, depende del dispositivo.

También hay un comando para deshabilitar el montaje automático de los discos pero no lo sé de memoria y ahora no puedo buscarlo.

Si no recuerdo mal, las entradas lfn también llevan el atributo de etiqueta de volumen por lo que un S.O. bien hecho, como poco, debería al menos detectar que hay una incongruencia y no debería interpretar esa entrada como directorio válido.

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 01 Jul 2017 11:31

Nueva versión. Novedades:

En muchos pen-drives y tarjetas no hace nada porque sólo tienen una partición FAT32 o NTFS. La versión anterior no daba mucha información de por qué no hacía nada, la nueva informa de que la partición es FAT32, o NTFS, y si no hay ninguna más, indica que no hay particiones que limpiar. FAT32 no se limpia porque se supone que todos los S.O. que soportan FAT32 también soportan nombres largos. NTFS por lo mismo. Bueno, y además, porque en NTFS sería muy complicado hacerlo.

He corregido/mejorado algunos de los textos que aparecían en pantalla.

He añadido varias validaciones, que siempre vienen bien antes de hacer algo tan delicado como modificar el contenido de los directorios, incluyendo el raíz.

También he visto que algunos pen-drives y tarjetas que sólo tienen una partición, no comienzan con un MBR (tabla de particiones), sino que comienzan directamente por la partición (*). CleanLFN daba un error en estos casos, porque esperaba siempre una tabla de particiones. Para poder trabajar con estas unidades he añadido el parámetro -nopt.

Como el nuevo parámetro -nopt abre la posibilidad de trabajar también con disquetes (o imágenes de disquetes), he añadido soporte FAT12, que la anterior versión no lo tenía. Además, como siempre (ya no hablo solo de disquetes) es muy importante determinar si se usa FAT12 o FAT16, en los casos en los que no puede determinarse, el programa lanza una excepción y termina.

Para limpiar una imagen de disquete (desde Windows o Linux): java CleanLFN -nopt fichero.img
Para limpiar un disquete físico desde Windows: java CleanLFN -nopt -phys \\.\A: (o la unidad que sea)
Para limpiar un disquete físico desde Linux: java CleanLFN -nopt -phys /dev/fd0 (o la unidad que sea)

También he visto que aunque en Windows no se pueden limpiar unidades completas como \\.\PhysicalDrive2, creo que sí que se pueden limpiar partición por partición, usando las letras de unidad como si fueran un disquete. Sin embargo, fallaría la validación del campo "sectores ocultos" ("hidden sectors", en el BPB). Para ello he añadido también el parámetro -ighs, pero esta opción es sólo para valientes, porque de momento no la he probado mucho.

Para limpiar (usando esta opción en pruebas) la unidad F: de un pen-drive físico desde Windows: java CleanLFN -nopt -phys -ighs \\.\F:

En cualquier caso, y más en este último, es muy recomendable antes de limpiar, usar la opción -list para ver si sale algo raro.

El parámetro -ighs no es necesario en Linux, porque ahí tenemos acceso a las unidades físicas completas, como he puesto en posts anteriores.

(*) Siendo puristas, en estos casos sin tabla de particiones, creo que no se puede hablar de "partición", sino de "volumen", pero creo que se me ha entendido.

CleanLFN.zip
CleanLFN 0.95
(6.71 KiB) Descargado 9 veces

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 04 Jul 2017 10:46

Nueva versión con más validaciones y con más métodos para detectar si una partición usa FAT12 o FAT16. La anterior versión no procesaba algunas particiones porque no sabía si eran FAT12 o FAT16, la nueva versión realiza más averiguaciones y ahora es capaz de detectar el tipo de FAT casi siempre.

Sobre Windows no voy a dar más indicaciones porque he visto que cada versión se comporta de una manera distinta. Por ejemplo, Windows XP permite el acceso a las particiones de manera independiente usando la letra de unidad, como conté en el anterior post. Pero al ir a hacer lo mismo en Windows 10 64 bits he visto que permite acceder a las letras de unidad de mi pen-drive (\\.\E:) pero no a las de mi disco duro (\\.\C: y \\.\D:)

CleanLFN.zip
CleanLFN 0.96
(7.41 KiB) Descargado 10 veces

BlackHole
Mensajes: 662
Registrado: 03 Ago 2011 23:07
Agradecimiento recibido: 27 veces

Re: Utilidad para limpiar entradas LFN

Mensajepor BlackHole » 04 Jul 2017 20:25

¿No será que la unidad tiene que estar previamente desmontada?

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 04 Jul 2017 23:50

BlackHole escribió:¿No será que la unidad tiene que estar previamente desmontada?

Pues es lo que sospecho desde el principio. Pero, ¿cómo se desmonta una unidad en Windows? Si quitarle las letras asignadas en el administrador de discos es lo mismo que desmontar, entonces esa no es la solución (porque ya lo probé). Si en Windows se desmonta una unidad de otra manera, no la conozco.

BlackHole
Mensajes: 662
Registrado: 03 Ago 2011 23:07
Agradecimiento recibido: 27 veces

Re: Utilidad para limpiar entradas LFN

Mensajepor BlackHole » 05 Jul 2017 00:31

Dentro de DISKPART sería con la opción OFFLINE. No sé cómo se podría hacer en programación.

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 05 Jul 2017 07:57

BlackHole escribió:Dentro de DISKPART sería con la opción OFFLINE. No sé cómo se podría hacer en programación.

No, perfecto, si es que no quiero hacerlo desde el programa (no quiero meter código específico para Windows ni para Linux).

El problema es que sigue sin salirme. Conecto el pen-drive, y DISKPART me dice que es el disco 1. Hago "SELECT DISK 1", luego "OFFLINE DISK" y me dice "Error del servicio de disco virtual. No se admite la operación en medios extríbles". Esto en Windows 10. Con el disco duro no he podido probar porque donde estoy ahora sólo hay una partición que es la del propio Windows 10. De todas formas, lo normal es querer limpiar un disco (pen-drive o tarjeta) extraíble, no un disco duro, porque cualquier sistema que ejecute Java no va a tener problema con LFN en sus propios discos.

Avatar de Usuario
Kyp
Mensajes: 275
Registrado: 03 Oct 2013 17:13
Agradecido : 1 vez
Agradecimiento recibido: 24 veces

Re: Utilidad para limpiar entradas LFN

Mensajepor Kyp » 05 Jul 2017 11:34

Para evitar que Windows monte automáticamente los discos puedes usar este comando:
MOUNTVOL /n (para deshabilitar el montado automático)
MOUNTVOL /e (para habilitar el montado automático)

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 05 Jul 2017 11:50

Gracias. Probaré en casa con XP. En el trabajo con Windows 10 "MOUNTVOL /N" me dice: "Acceso denegado". Soy administrador del equipo, pero está en un dominio y a lo mejor tenemos restringido ese comando, así que lo dicho, probaré en casa.

Avatar de Usuario
Kyp
Mensajes: 275
Registrado: 03 Oct 2013 17:13
Agradecido : 1 vez
Agradecimiento recibido: 24 veces

Re: Utilidad para limpiar entradas LFN

Mensajepor Kyp » 05 Jul 2017 13:25

Me suena que ese comando es relativamente moderno y no venía con el XP. De todas formas, el bloqueo de acceso a bajo nivel al disco es algo incluido a partir de Vista. En XP no pasa que yo sepa.

Se me está ocurriendo una cosa... Igual el problema que tienes no es nada de esto... En Windows, cuando escribes sobre el disco físico o en un volumen hay que escribir siempre en bloques múltiplos del tamaño del sector (en el 99% de los casos puedes asumir que es 512 bytes aunque lo suyo es mirarlo en el BPB). Si tienes que modificar una parte más pequeña o que no es múltiplo de un sector hay que usar un buffer intermedio que si lo sea, hacer ahí los cambios, y luego escribir todo el buffer.

Avatar de Usuario
Jinks
Mensajes: 921
Registrado: 09 Oct 2013 16:47
Agradecido : 25 veces
Agradecimiento recibido: 47 veces
Contactar:

Re: Utilidad para limpiar entradas LFN

Mensajepor Jinks » 05 Jul 2017 14:17

Siempre leo y escribo sectores completos (512 bytes, no tengo ningún dispositivo con sectores de mayor tamaño). Aunque limpie sólo una entrada LFN, escribo el sector completo. En cualquier caso, el error lo da en cuanto abro el dispositivo en modo L/E, es decir, antes de leer ni escribir nada. Y según qué versiones de Windows, también da error al abrir el disposivo en modo de sólo lectura. Pero el error lo da en la apertura.

Según esta página sí que hay MOUNTVOL en XP (professional) pero no tiene ni el parámetro /N ni el /E. Es lo que decía de que en Windows no hay dos versiones que se comporten igual. Al final la solución (si la hay) va a ser distinta para cada versión/edición/bits de Windows.

Avatar de Usuario
Kyp
Mensajes: 275
Registrado: 03 Oct 2013 17:13
Agradecido : 1 vez
Agradecimiento recibido: 24 veces

Re: Utilidad para limpiar entradas LFN

Mensajepor Kyp » 05 Jul 2017 18:28

No se si habrás visto esta documentación: https://msdn.microsoft.com/en-us/librar ... 58(v=vs.85).aspx
Ahí tienes todo lo necesario para abrir un disco físico (mira la sección de comentarios). Sobre todo:
The caller must have administrative privileges. For more information, see Running with Special Privileges.
The dwCreationDisposition parameter must have the OPEN_EXISTINGflag.
When opening a volume or floppy disk, the dwShareMode parameter must have the FILE_SHARE_WRITEflag.

No se como se traducirán esos parámetros a Java pero esas tres cosas son imprescindibles.


Volver a “PC & Compatibles X86”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados