Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: exp   (02.12.2008 в 21:07)
Подскажите можно-ли прочитать диск просто как файл по байтам
, и будет-ли результат независим от формата файловой системы диска?

Из функций чтения диска нижнего уровня попадались только примеры использующие bios.h,
которые наверное работали в каких-то старых сомпиляторах
, и не нашёл следов таких файлов в том что попадалось

Но например работает такой пример из msdn
где-то в месте вроде раздела DeviceIoControl
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>

BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
  HANDLE hDevice;               // handle to the drive to be examined 
  BOOL bResult;                 // results flag
  DWORD junk;                   // discard results

  hDevice = CreateFile("\\\\.\\PhysicalDrive0",  // drive to open
                    0,                // no access to the drive
                    FILE_SHARE_READ | // share mode
                    FILE_SHARE_WRITE, 
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL);            // do not copy file attributes
  if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
  {    return (FALSE);  }
  bResult = DeviceIoControl(hDevice,  // device to be queried
      IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
                             NULL, 0, // no input buffer
                            pdg, sizeof(*pdg),     // output buffer
                            &junk,                 // # bytes returned
                            (LPOVERLAPPED) NULL);  // synchronous I/O
  CloseHandle(hDevice);
  return (bResult);
}

int main(int argc, char *argv[])
{
  DISK_GEOMETRY pdg;            // disk drive geometry structure
  BOOL bResult;                 // generic results flag
  ULONGLONG DiskSize;           // size of the drive, in bytes

  bResult = GetDriveGeometry (&pdg);

  if (bResult) 
  {
    printf("Cylinders = %I64d\n", pdg.Cylinders);
    printf("Tracks/cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
    printf("Sectors/track = %ld\n", (ULONG) pdg.SectorsPerTrack);
    printf("Bytes/sector = %ld\n", (ULONG) pdg.BytesPerSector);

    DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
      (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
    printf("Disk size = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,
           DiskSize / (1024 * 1024 * 1024));
  } 
  else 
  {    printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());  }
  system("PAUSE");
  return ((int)bResult);
}

Выводит например такое
Cylinders = 19457
Tracks/cylinder = 255
Sectors/track = 63
Bytes/sector = 512
Disk size = 160039272960 (Bytes) = 149 (Gb)

Из этого инфо понял только что sector это похоже и есть кластер,
и не понял ничего про цилиндры и треки.
О том какая именно ф.с. тоже нет ничего.

Но меня интересует только самое начало записи на диске
, так предполагаю что в самом первом кластере есть какая-то инфа о том какая ф.с.
, и что-то ещё.
вот как нибудь можно прочитать например первые 512 из 160039272960и байт,
и всё-ли место в этих 160039272960, или может это только доступное ?

И нашёл очень похожую на ту что в примерах с bios.h структуру ,
в файле c:\Dev-Cpp\include\ddk\winddk.h
, который похоже установился с папкой ddk, пакетом Win32API,
где-нибудь можно найти какое-нибудь инфо , о этих ddk ?
почему-то в Borland cBuilder нет такой папки ,
и даже файла с таким названием,

что сейчас применяется вместо того что применялось с bios.h ?
И хотел спросить что это за такой странный адрес \\\\.\\PhysicalDrive0 ? как-будто путь от непонятно чего


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: