|
|
|
| Подскажите можно-ли прочитать диск просто как файл по байтам
, и будет-ли результат независим от формата файловой системы диска?
Из функций чтения диска нижнего уровня попадались только примеры использующие 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
(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
(03.12.2008 в 15:05)
| | Вообще-то нашёл
http://www.codeguru.com/cpp/w-p/system/misc/article.php/c5765/
даже с готовой программой.
разобраться только не легче чем в msdn ) | |
|
|
|
|