Как получить размер жесткого диска в байтах в Windows 2000?

Как я могу получить точный размер жесткого диска в байтах на старой Windows 2000?

IOCTL_DISK_GET_LENGTH_INFO отлично работает для томов, но не на дескрипторах физических дисков (например, //./PHYSICALDISKx) в Windows 2000. (Отлично работает для физических дисков от XP или новее)

Мы все еще должны поддерживать эту древнюю ОС...

ОБНОВИТЬ:

Код написан на C, поэтому я бы использовал простой Windows API, если это возможно.

3 ответа

Решение

Похоже, что в Windows 2000 нет IOCTL, который бы точно указывал размер жесткого диска.

Но есть обходной путь, который работал:

Я использовал IOCTL_DISK_GET_DRIVE_GEOMETRY, чтобы получить цилиндры, дорожки / цилиндры, сектора / дорожки, байты / сектора.

Умножение их дало мне приблизительный размер жесткого диска, но не точный размер (чуть меньше). Я могу рассчитать почти последний идентификатор сектора из этого.

Чтобы получить точный размер, я использовал IOCTL_SCSI_PASS_THROUGH и отправил команды чтения SCSI, чтобы попытаться выполнить чтение за пределами конца диска, поэтому у меня был номер сектора для несуществующего сектора, затем я использовал бинарный поиск, чтобы получить наибольший идентификатор сектора, где чтение было успешным.

Умножая его на байты / сектор, я получаю точный размер жесткого диска в байтах.

Вы можете получить свободное место в C (без каких-либо API и т. Д.)

Если вы бежитеdir c:\", последняя строка даст вам свободное место на диске.

Лучшее решение: "fsutil volume diskfree c:"

Или попробуйте следующий код...

void main (int argc, wchar_t **argv)
       {
          BOOL  fResult;
          unsigned __int64 i64FreeBytesToCaller,
                           i64TotalBytes,
                           i64FreeBytes;
             fResult = GetDiskFreeSpaceEx (L"C:",
                                     (PULARGE_INTEGER)&i64FreeBytesToCaller,
                                     (PULARGE_INTEGER)&i64TotalBytes,
                                     (PULARGE_INTEGER)&i64FreeBytes);
             if (fResult)
             {
                printf ("\n\nGetDiskFreeSpaceEx reports\n\n");
                printf ("Available space to caller = %I64u MB\n",
                        i64FreeBytesToCaller / (1024*1024));
                printf ("Total space               = %I64u MB\n",
                        i64TotalBytes / (1024*1024));
                printf ("Free space on drive       = %I64u MB\n",
                        i64FreeBytes / (1024*1024));
             }
       }

Всякий раз, когда мне нужно получить информацию такого типа, я обычно использую WMI, поскольку она предоставляет множество данных практически обо всем.

Другие вопросы по тегам