Возникла такая проблема.
При чтении из MFT-области каждый 511 и 512 байты не верны.
0: 4649 4c45 3000 0300 110d 7d3b 0000 0000 FILE0.....};....
...
496: 1a21 0113 2231 1f2c c702 2101 07fe 0400 .!.."1.,..!.....
512: 4f0f 310f 34c6 e831 20ef 2de5 4121 33da O.1.4..1 .-.A!3.
...
1008: 0000 0000 0000 0000 0000 0000 0000 0400 ................
А на самом деле должен был быть получен такой результат.
0: 4649 4c45 3000 0300 110d 7d3b 0000 0000 FILE0.....};....
...
496: 1a21 0113 2231 1f2c c702 2101 07fe 2111 .!.."1.,..!.....
512: 4f0f 310f 34c6 e831 20ef 2de5 4121 33da O.1.4..1 .-.A!3.
...
1008: 0000 0000 0000 0000 0000 0000 0000 0000 ................
Если читаю из кластеров не относящихся к MFT-области то эти быйты не портятся.
0: ee3f e70d 573b 8986 24e6 bdf0 c57b c858 .?..W;..$....{.X
...
496: c918 a24c fa0b 20f5 b3a8 e9d1 b90b 7042 ...L.. .......pB
512: 5086 4fc1 60e6 81c6 8d10 fa0b 2a16 9c32 P.O.`.......*..2
...
1008: 7021 3702 22c0 f1d0 038b e105 67a7 0426 p!7.".......g..&
Читаю следующим образом.
HANDLE hDrive = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
LARGE_INTEGER n64Pos;
n64Pos.QuadPart = NTFSPartition->startMftLCN + 10809155584;
SetFilePointerEx(hDrive, n64Pos, NULL, FILE_BEGIN);
DWORD dwBytesRead;
BYTE *buf= new BYTE[1024];
ReadFile(hDrive, buf, 1024, &dwBytesRead, NULL);
Сначала подумал, что это винда мне специально портит эти байты. Побробовал прочитать тот же сектор из под линукса — Эффект оказался тем же самым.
Может кто-нибудь уже сталкивался с этой проблемой. Помогите пожалуйста. Уже не знаю что делать.