• Lunes 16 de Diciembre de 2024, 03:47

Autor Tema:  Cómo leer un sector del disco  (Leído 3157 veces)

elmer.entenza

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Cómo leer un sector del disco
« en: Viernes 17 de Septiembre de 2010, 17:55 »
0
Saludos. Necesito implementar una función en C (aunque el cuerpo sea en ensamblador) pero que devuelva en una variable (por referencia o directo, no importa la vía) el contenido de un sector del disco o de una memoria flash.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #1 en: Lunes 20 de Septiembre de 2010, 21:54 »
0
Usa CreateFile() con una ruta UNC completa (en la documentación de la MSDN de CreateFile, en la parte de discos físicos y volúmenes está qué es eso: http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

Eso sí, necesitas los permisos adecuados para hacerlo.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

elmer.entenza

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #2 en: Lunes 20 de Septiembre de 2010, 22:30 »
0
Amigo rfrog, me hubiera gustado mucho revisar lo que dices, pero el link no se me mostró accesible... me da el siguiente error...

Unable to Service Request

si tienes algo más... te lo agradecería.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #3 en: Martes 21 de Septiembre de 2010, 10:45 »
0
Click aca para el link que dejo rfog.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

elmer.entenza

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #4 en: Martes 21 de Septiembre de 2010, 15:44 »
0
Al parecer está buena la función esa. Tengo una de preguntas ahora..

En mi caso todo lo que quiero es hacer un simple programita que en FAT32 recupere un fichero que ha sido lógicamente borrado. Es decir, lo que quiero es recorrer, la estructura de la FAT y cambiar la marca de fichero borrado. Quiero además hacer esto en una tarjeta SD o una momoria flash, porque no me aceptan que lo haga en disketes por ser algo obsoleto

¿Cómo puedo acceder para leer una memoria con la función esa CreateFile? En este tema estoy severamente perdido.

Atentamete, Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #5 en: Miércoles 22 de Septiembre de 2010, 13:26 »
0
Despues de tener un HANDLE al volumendisco en cuestion usas ReadFile.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #6 en: Jueves 23 de Septiembre de 2010, 10:53 »
0
Y WriteFile luego para guardar el sector modificado, pero antes tienes que retroceder a la misma posición en la que leiste el sector.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

elmer.entenza

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #7 en: Miércoles 29 de Septiembre de 2010, 21:08 »
0
Muchas gracias colegas... Las funciones que me recomendaron salvaron toda la situación..  Las usé así..

byte[] data = new byte[count];
int n = 0;
IntPtr handle = CreateFile("F", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
fixed (byte* p = data)
{
    if (!ReadFile(handle, p, count, &n, 0))
        Console.WriteLine("Error de lectura en el medio");
}

if (n > 0)
{
    MemoryStream memStream = new MemoryStream(data);
    return memStream;
}


Ahora tengo un último problema cuando estoy leyendo en la flash solo puedo leer a partir del comienzo de la misma... y para eso cuando quiero leer un cluster cerca del final, tengo que leer casi toda la superficie de la momoria...
Cuando se trataba de los primeros 10 Mbytes más o menos no dio problemas pero más allá simplemente no funciona...

Cómo puedo realizar un offset antes, al handle tal vez??? para luego solo leer el tamanno de un cluster... sin lios...

esto es lo único que me falta... para terminar..

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Cómo leer un sector del disco
« Respuesta #8 en: Miércoles 29 de Septiembre de 2010, 22:03 »
0
Muévete directamente a donde quieras con SetFilePointer()

http://msdn.microsoft.com/en-us/library ... 41(v=VS.85).aspx
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog