Здравствуйте, misha_irpen, Вы писали:
_>Здравствуйте, MShura, Вы писали:
MS>>Заполняется одна структура.
MS>>Если на входе handle диска, то его размер
MS>>Если на входе handle basic тома, то его размер положение и прочее.
MS>>Чтобы получить массив структур надо юзать IOCTL_DISK_GET_DRIVE_LAYOUT.
_>В общем проверил. Для жесткого диска возвращает "неверная функция", для съемных носителей — "такой запрос не поддерживается". Вот такая фигня
Работает в Win2K/XP и выше.
#include <stdio.h>
#include <windows.h>
#include <winioctl.h>
int main ( int argc, char** argv )
{
HANDLE hDisk;
UNREFERENCED_PARAMETER( argc );
UNREFERENCED_PARAMETER( argv );
hDisk = CreateFileW( L"\\\\.\\PhysicalDrive0", GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
if ( INVALID_HANDLE_VALUE != hDisk )
{
PARTITION_INFORMATION PartInfo;
DWORD Ret;
if ( DeviceIoControl( hDisk, IOCTL_DISK_GET_PARTITION_INFO,
NULL, 0,
&PartInfo, sizeof(PartInfo),
&Ret, NULL )
&& Ret == sizeof(PartInfo) )
{
unsigned long Gb, Mb;
PartInfo.PartitionLength.QuadPart /= 512;
// Do simple right 21 bit shift of 64 bit value
Gb = (PartInfo.PartitionLength.LowPart >> 21) | (PartInfo.PartitionLength.HighPart << 11);
Mb = PartInfo.PartitionLength.LowPart & 0x1FFFFF;
printf( "Disk 0: (%lu.%02lu Gb)\n", Gb, (Mb * 100) >> 21 );
}
CloseHandle( hDisk );
}
return 0;
}