Re[7]: DeviceIoControl and IOCTL_DISK_GET_DRIVE_GEOMETRY
От: MShura  
Дата: 08.04.05 12:39
Оценка:
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.