Пример (фрагмент, процедура) определяющая номера кластеров расположения нерезидентного файла на диске на основе анализа цепочки данных файлового дескриптора


Добавил:DMT
Дата создания:26 января 2008, 19:06
Дата обновления:26 января 2008, 19:08
Просмотров:5729 последний вчера, 13:17
Комментариев: 0

Пример (фрагмент, процедура) определяющая номера кластеров расположения нерезидентного файла на диске на основе анализа цепочки данных файлового дескриптора

Текст программы
Код на C++
  1. void GetFileClusters(
  2. PCHAR lpFileName, //имя файла
  3. ULONG ClusterSize //размер кластера на диске
  4. )
  5. {
  6. HANDLE hFile; //хэндл нерезидентного файла
  7. ULONG OutSize; //размер буфера OutBuf
  8. ULONG FileSize; //размер файла
  9. ULONG Bytes, //количество байт. возвращаемых DeviceIoControl
  10. ClCount, //количество кластеров в файле
  11. r, //счетчики
  12. CnCount; //количество кластеров в файле
  13. LARGE_INTEGER PrevVCN, Lcn;
  14. STARTING_VCN_INPUT_BUFFER InBuf;
  15. //номер начального виртуального кластера
  16. PRETRIEVAL_POINTERS_BUFFER OutBuf;
  17. //буфер структуры, описывающей размещение файла
  18. //на диске
  19. hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
  20. FILE_SHARE_READ,
  21. NULL, OPEN_EXISTING, 0, 0);
  22. //открываем нерезидентный файл
  23. if (hFile != INVALID_HANDLE_VALUE)
  24. {
  25. FileSize = GetFileSize(hFile, NULL);
  26. //определяем размер файла
  27. //определяем размер буфера OutBuf
  28. OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (FileSize / ClusterSize) *
  29. sizeof(OutBuf->Extents);
  30. //выделяем память для структуры
  31. OutBuf = (PRETRIEVAL_POINTERS_BUFFER)malloc(OutSize);
  32. InBuf.StartingVcn.QuadPart = 0; //номер VCN начального экстента файла
  33. //заполняем структуру, описывающую размещение файла
  34. if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,
  35. sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
  36. {
  37. //количество кластеров в файле
  38. ClCount = (FileSize + ClusterSize - 1) / ClusterSize;
  39. //начальный VCN экстента (равен 0)
  40. PrevVCN = OutBuf->StartingVcn;
  41. //цикл перемещения по экстентам файла
  42. for (r = 0; r < OutBuf->ExtentCount; r++)
  43. { //LCN кластера начала экстента
  44. Lcn = OutBuf->Extents[r].Lcn;
  45. //количество кластеров в текущем экстенте:
  46. for(CnCount=OutBuf->Extents[r].NextVcn.QuadPart-PrevVCN.QuadPart;
  47. CnCount; CnCount--, Lcn.QuadPart++)
  48. //печатаем номер кластера
  49. printf("%I64x ",Lcn.QuadPart);
  50. //переходим к следующему экстенту
  51. PrevVCN = OutBuf->Extents[r].NextVcn;
  52. }
  53. }
  54. free(OutBuf);
  55. CloseHandle(hFile);
  56. }
  57. }
При использовании обязательна ссылка на http://DMTSoft.ru
up