SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: elmer.entenza en Viernes 17 de Septiembre de 2010, 17:55

Título: Cómo leer un sector del disco
Publicado por: elmer.entenza en Viernes 17 de Septiembre de 2010, 17:55
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.
Título: Re: Cómo leer un sector del disco
Publicado por: rfog en Lunes 20 de Septiembre de 2010, 21:54
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 (http://msdn.microsoft.com/en-us/library/aa363858(VS.85" onclick="window.open(this.href);return false;)).aspx

Eso sí, necesitas los permisos adecuados para hacerlo.
Título: Re: Cómo leer un sector del disco
Publicado por: elmer.entenza en Lunes 20 de Septiembre de 2010, 22:30
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.
Título: Re: Cómo leer un sector del disco
Publicado por: Eternal Idol en Martes 21 de Septiembre de 2010, 10:45
Click aca (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx) para el link que dejo rfog.
Título: Re: Cómo leer un sector del disco
Publicado por: elmer.entenza en Martes 21 de Septiembre de 2010, 15:44
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.
Título: Re: Cómo leer un sector del disco
Publicado por: Eternal Idol en Miércoles 22 de Septiembre de 2010, 13:26
Despues de tener un HANDLE al volumendisco en cuestion usas ReadFile.
Título: Re: Cómo leer un sector del disco
Publicado por: rfog en Jueves 23 de Septiembre de 2010, 10:53
Y WriteFile luego para guardar el sector modificado, pero antes tienes que retroceder a la misma posición en la que leiste el sector.
Título: Re: Cómo leer un sector del disco
Publicado por: elmer.entenza en Miércoles 29 de Septiembre de 2010, 21:08
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..
Título: Re: Cómo leer un sector del disco
Publicado por: rfog en Miércoles 29 de Septiembre de 2010, 22:03
Muévete directamente a donde quieras con SetFilePointer()

http://msdn.microsoft.com/en-us/library ... 41(v=VS.85 (http://msdn.microsoft.com/en-us/library/aa365541(v=VS.85" onclick="window.open(this.href);return false;)).aspx