Форум: Форум C++Разное
Новые темы: 00
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: диск
 
 автор: 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 ? как-будто путь от непонятно чего

  Ответить  
 
 автор: exp   (03.12.2008 в 15:05)   письмо автору
 
   для: exp   (02.12.2008 в 21:07)
 

Похоже разобрался немного, \\.\ всегда ставится перед именем устройства
Наверное нужно вызвать это DeviceIoControl с другим параметром вместо
IOCTL_DISK_GET_DRIVE_GEOMETRY
, похоже на то что с FSCTL_GET_VOLUME_BITMAP.
Но могу ошибаться ,) тут куча одних только подразделов перечисляющих контрольные коды

попробовал получить другкю структуру , используя контрольный код FSCTL_GET_NTFS_VOLUME_DATA
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
BOOL GetDriveX(NTFS_VOLUME_DATA_BUFFER *pdg)
{
  HANDLE hDevice;               // handle to the drive to be examined 
  BOOL bResult;                 // results flag
  DWORD junk;                   // discard results

hDevice = CreateFile(
  "\\\\.\\PhysicalDrive1",  // drive to open
  0,                // no access to the drive
  FILE_SHARE_READ | FILE_SHARE_WRITE, //  mode
  NULL,             // default security attributes
  OPEN_EXISTING,    // disposition
  0,                // file attributes
  NULL // do not copy file attributes
);
           
  if (hDevice == INVALID_HANDLE_VALUE) // cannot open
    return (FALSE);

bResult = DeviceIoControl(
  hDevice,  // handle to device
  FSCTL_GET_NTFS_VOLUME_DATA, // dwIoControlCode
  NULL, // lpInBuffer
  0, // size of input buffer
  &pdg, // output buffer
  sizeof(*pdg), // size of output buffer
  &junk, // number of bytes returned
 (LPOVERLAPPED) NULL// OVERLAPPED structure
); 
  CloseHandle(hDevice);
  return (bResult);
}

int main(int argc, char *argv[]) {
  NTFS_VOLUME_DATA_BUFFER pdg;  // structure
  BOOL bResult;                 //flag

bResult = GetDriveX(&pdg);
  if (bResult)
    printf("VolumeSerialNumber = %I64d\n", pdg.VolumeSerialNumber);
  else 
    printf ("GetDriveX failed. Error %ld.\n", GetLastError ());

  system("PAUSE");
  return ((int)bResult);
}

возвращает GetLastError() == 1
в чём может быть ошибка ?
вроде должен был получить простую структуру

typedef struct { LARGE_INTEGER VolumeSerialNumber;
LARGE_INTEGER NumberSectors;
LARGE_INTEGER TotalClusters;
LARGE_INTEGER FreeClusters;
LARGE_INTEGER TotalReserved;
DWORD BytesPerSector; DWORD BytesPerCluster;
DWORD BytesPerFileRecordSegment;
DWORD ClustersPerFileRecordSegment;
LARGE_INTEGER MftValidDataLength;
LARGE_INTEGER MftStartLcn;
LARGE_INTEGER Mft2StartLcn;
LARGE_INTEGER MftZoneStart;
LARGE_INTEGER MftZoneEnd;
} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;

  Ответить  
 
 автор: exp   (04.12.2008 в 00:46)   письмо автору
 
   для: exp   (03.12.2008 в 15:05)
 

Вообще-то нашёл
http://www.codeguru.com/cpp/w-p/system/misc/article.php/c5765/
даже с готовой программой.
разобраться только не легче чем в msdn )

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования