pues ya logre avanzar con un programa que estoy intentando hacer, despues de re-leer, hice un pequeño avance, pero tengo un problema a ver que opinan
segun MSDN hay dos maneras de analizar la unidad C, ya sea
"\\.\C:", "\\.\C:\" o "\\\\.\\PhysicalDrive0"
En visual basic algunos programadores hacen esto
"\\.\" & Mid(Drive, 1, 2)
donde Drive es "C:\"
supuestamente deberia quedar asi... "\\.\C:"... pero al colocarlo de esa forma en el programa ya no funciona, de igual forma en C tampoco funciona
en C la unica forma que me funciona es usando "\\\\.\\PhysicalDrive0", pero tengo la duda de si funcionara o no, supuestamente si me esta funcionando, porque recibo datos, pero no se si haya alguna diferencia o porque razon en VB solo funcione si utilizan Mid, por que si hay alguna, entonces el programa falla desde el principio pero no me he dado cuenta, y me gustaria saber que opinan o si podrian compilar mi codigo y decirme si a ustedes le funciona "\\.\C:" o si es normal y solo les funciono PhysicalDrive0, mas abajo colocare mi codigo
ahora tengo otro problema, necesito la informacion de los clusters, hay estructuras que puedo usar para saber esto pero no hay para algunas cosas que necesito, pero segun un codigo de VB que analice, se pueden conseguir 3 datos que necesito analizando los datos recibidos con ReadFile
Aqui dejo una tabla de los datos que mencionare
Offset Size Description
0x0000 3 Jump to the boot loader routine
0x0003 8 System Id: "NTFS "
0x000B 2 Bytes per sector
0x000D 1 Sectors per cluster
0x000E 7 Unused
0x0015 1 Media descriptor (a)
0x0016 2 Unused
0x0018 2 Sectors per track
0x001A 2 Number of heads
0x001C 8 Unused
0x0024 4 Usually 80 00 80 00 (b)
0x0028 8 Number of sectors in the volume
0x0030 8 LCN of VCN 0 of the $MFT
0x0038 8 LCN of VCN 0 of the $MFTMirr
0x0040 4 Clusters per MFT Record (c)
0x0044 4 Clusters per Index Record (c)
0x0048 8 Volume serial number
los valores que necesito son el offset 0x0B 0x0D y 0x30
el codigo de VB usa una funcion llamaba bitconverter, que busca un offset y los valores los cambia a decimal
el offset Bytepersector lo puedo sacar con una estructura, tambien tengo entendido que en NTFS un cluster tiene 512 bytes, y eso son 8 sectores, y me faltaria encontrar LCN of VCN 0 of the $MFT
Supuestamente al leer los datos de la unidad, se puede saber eso unicamente llendo al offset y tomando los valores dependiendo del tamaño, y en la tabla esta el tamaño de cada offset
Pero mi problema es que no logro encontrar el offset para tomar el valor hexadecimal y convertirlo en decimal, aqui es donde tambien incluyo el problema anterior, no se si no los encuentro porque CreateFile no abre la unidad C: o es porque no estoy interpretando bien los datos
El resultado los compare con un codigo fuente de https://code.google.com/p/datarecover/ y obtengo el mismo resultado al ejecutar el programa, los dos me dan los mismo hexadecimales, aunque yo lo programe diferente
En VB me arroja este resultado Bitconverter donde busca los offset y convierte en decimal los bytes
512
8
786432
Pero leyendo los datos que me arroja buffer, no logro encontrar esa informacion
Me gustaria saber si alguien aqui podria ayudarme a encontrar la manera de saber donde se encuentran esos offset y como debo buscarlos para despues cambiar de hexadecimal a decimal
espero me puedan ayudar
salu2
Código
#include <Windows.h> #include <winioctl.h> #include <stdio.h> #include <stdlib.h> #define zwpath L"\\\\.\\PhysicalDrive0" int main(int argc, char *argv[]){ HANDLE hDevice; OVERLAPPED overlapped; BYTE buff[1024] = {0}; DWORD numerobyte = 0; UINT32 ret; ZeroMemory(&overlapped, sizeof(OVERLAPPED)); hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if(hDevice != INVALID_HANDLE_VALUE){ ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); }else { return NULL; } if(ret == 0){ ret = WaitForSingleObject(hDevice,INFINITE ); switch (ret) { case WAIT_OBJECT_0:break; case WAIT_TIMEOUT:break; default: break; } } else { return NULL; } CloseHandle(hDevice); for (int n=0; n<sizeof(buff); ++n) { } }