D>По-моему, вы путаете VCN и LCN. VCN — это virtual cluster number. Допустим у вас есть файл. Он занимает на диске 5 кластеров. Тогда для этого файла VCN может принимать значения от 0 до 4. LCN — это logical cluster number, то есть номер кластера на томе.
Спасибо большое !
Именно VCN и LCN я и попутал.
Теперь всё работает.
Но я так и не понял почему в FSCTL_MOVE_FILE не прописана переверка этого параметра.
"Но это уже совсем другая история"
Ниже привожу исправленый кусок кода.
Он точно кому-то пригодится:
MoveParams.StartingVcn.QuadPart = 0;
for (ULONG r = 0; r < OutBuf->ExtentCount; r++)
{
DWORD br;
MoveParams.ClusterCount =OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart;
if(DeviceIoControl(hDisk,FSCTL_MOVE_FILE,&MoveParams,sizeof(MoveParams),NULL,0,&br,NULL))
printf("error %d\n",GetLastError());
MoveParams.StartingLcn.QuadPart=MoveParams.StartingLcn.QuadPart+MoveParams.ClusterCount;
MoveParams.StartingVcn.QuadPart = MoveParams.StartingVcn.QuadPart +MoveParams.ClusterCount;
PrevVCN = OutBuf->Extents[r].NextVcn;
}