Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > объем физического диска под Win9x


Автор: MishaVinogradov 7.3.2005, 18:34
Как получить объем физического диска под Win9x? В MSDN описывается только процедура под Win NT. smile

Автор: Snowy 7.3.2005, 18:59
А тебе нужно именно на WinAPI?
SysUtils.DiskSize не подойдет?
GetDiskFreeSpaceEx работает во всех виндах, начиная с 95OSR2.
GetDiskFreeSpace работает во всех виндах, начиная с 95, но возвращаемый размер ограничен 2Gb.

Автор: p0s0l 7.3.2005, 21:41
По идее можно открыть \\.\SMARTVSD, через DeviceIoControl заслать ему SMART_RCV_DRIVE_DATA, а в регистрах указать команду IDENTIFY DEVICE... В результате получишь ID-сектор винта, откуда можно взять его параметры (например, Total Addressable Sectors умножь на 512 - будет емкость винта в байтах, доступная пользователю)...

Автор: p0s0l 7.3.2005, 21:58
Кстати, чтоб не с нуля начинать, можно взять пример из DRKB по получению серийного номера - там как раз читается ID-сектор...
Только надо будет добавить поддержку 48-битной LBA - для таких случаев нужно читать слова №100..103 в ID-секторе...
Для 24-битной адресации нужно читать слова №60..61 (это соответствует полю TIdSector.ulTotalAddressableSectors...

Автор: Poseidon 8.3.2005, 05:09
Цитата
GetDiskFreeSpace работает во всех виндах, начиная с 95, но возвращаемый размер ограничен 2Gb.

Встречался я с такой проблемой. Вот решение:
Это происходит, т.к. возврешаемое значение, вероятно, записывается в переменную, каторая не потдерживает больших значений (например Integer). Ведь GetDiskFreeSpace возврещает значение в байтах. И если диск в 20 ГБ, то это около 20 МИЛЛИАРДОВ байт (конечно больше, т.к. там везде 1024 вместо 1000). Для решения используй переменную типа Int64, т.к этот тип умеет "запоминать" значения аж до 2 в 63 степени!

Автор: p0s0l 8.3.2005, 11:21
Дык вроде ж требуется объём физического диска, а не логического... Поэтому GetDiskFreeSpaceEx вообще не подходит...

Автор: Poseidon 9.3.2005, 02:02
Цитата
Дык вроде ж требуется объём физического диска

Вот это точно. Как говорится: "Заболтались". Но ограничение в 2 ГБ все равно решается таким способом:
Цитата
Для решения используй переменную типа Int64


И еще: А если попробовать получить буквы всех логических дисков, потом их размер (при помощи GetDiskFreeSpaceEx), а потом сумму этих размеров. Получится размер физического.
Это так, как вариант. smile

Автор: Snowy 9.3.2005, 08:15
Цитата(Poseidon @ 8.3.2005, 05:09)
Для решения используй переменную типа Int64

Бесполезно. Функция уже возвращает dword, поэтому что с ним не делай, больше он не станет. Для этого и сделана GetDiskFreeSpaceEx, которая возвращает ddword.

Цитата(Poseidon @ 9.3.2005, 02:02)
если попробовать получить буквы всех логических дисков, потом их размер

Тогда мы получим объем всех физических дисков системы.

Автор: p0s0l 9.3.2005, 12:20
Цитата(Poseidon @ 9.3.2005, 02:02)
И еще: А если попробовать получить буквы всех логических дисков, потом их размер (при помощи GetDiskFreeSpaceEx), а потом сумму этих размеров. Получится размер физического.
Для этого во-первых, нужно узнать, какие лог. диски относятся к физическому. Ну в принципе, это решаемо. Но во-первых, в лучшем случае, получишь размер меньше реального. А во-вторых, самое главное, диск может быть не полностью разбит, поэтому такой способ выдаст вообще неправильный результат...

Автор: Snowy 9.3.2005, 12:41
Думаю, с физическим диском будет не все так просто.
Главная проблема: UATA, SATA, скази, рейд. Думаю, что получение параметров для них будет различаться.

Можно попробовать взять данные у биоса.
Можно попробовать через ASPI - функция SC_GET_DISK_INFO.

Автор: p0s0l 9.3.2005, 13:56
Цитата
Можно попробовать взять данные у биоса.
У Биоса брать - не есть гуд, т.к. если к примеру, винт большой, а я в биосе ставлю режим CHS, то я получу максимум 8 гигов (или сколько там ?)... В общем, биос может неправильно сказать, что к чему...
Цитата
Можно попробовать через ASPI - функция SC_GET_DISK_INFO.
Может у меня устаревшая версия описалова ASPI, но там в структуре, которая возвращается через SC_GET_DISK_INFO есть кол-во головок и секторов, но нет кол-ва дорожек... Тем более, опять же представление адресации в виде CHS наводит на мысль о том, что этот способ подойдёт только для маленьких винтов... И данные, похоже, берутся из биоса...
Хотя у биоса брать - меньше геморра... наверное, оптимальный вариант всё-таки...
Если обращаться к SCSI (напр, через ASPI), то можно использовать команду SCSI_RD_CAPAC...

Автор: Snowy 9.3.2005, 14:09
Цитата(p0s0l @ 9.3.2005, 13:56)
Если обращаться к SCSI (напр, через ASPI), то можно использовать команду SCSI_RD_CAPAC...

Отсюда вывод. Не все так просто.
Придется писать разный код под разные типы интерфейса.
А что делать с RAID? Тут как-то все неоднозначно.
Брать объем целого рейда или можно найти как-то размер каждого диска?
И нужно ли знать параметры каждого диска? И как это делать?
Лично я не нашел никакой информации. И как теперь жить после этого? smile
C другой стороны, а зачем нужна такая информация? Какая от нее польза, если только мы не пишем свой Partition Magic?

Автор: p0s0l 9.3.2005, 14:12
Цитата(p0s0l @ 9.3.2005, 13:56)
Хотя у биоса брать - меньше геморра... наверное, оптимальный вариант всё-таки...
Всё-таки вру smile... Оптимальный вариант - делать SCSI_RD_CAPAC через ASPI. Похоже, даже если обращаться к ATA-винтам, то типа команды эмулируются (по крайней мере, в WinXP сейчас проверил). Возможно, то же самое будет и для SATA и RAID...

Автор: MishaVinogradov 14.3.2005, 00:57
Хочу внести ясность.
Для чего нужна информация о дисках: Объем диск (а, ов) нужен для сбора информации о компьютерах. (Нужна такая универсальная программа и под NT (2000, XP) и под Win 9x, т.к. имеются и те и другие системы).
В MSDN (апрель 2001 года) я накопал, что этот вопрос решается через драйвер виртуального устройства, а затем через функцию MS-DOS 21h (440Dh). Копать буду пока не сделаю, т.к. FDISK все же понимает физические диски, а значит найти объем принципиально возможно.
Сейчас ищу информацию о некоторых функциях MS DOS. По 6.22 у меня есть, а вот по 7.0 - нет. Если кто знает где взять подскажите. Как только допишу - помещу ответ. Как быть с RAID, SCSI и SATA пока не знаю, но я думаю, что если их поддерживает драйвер под Win9x, то и работать они будут аналогично обыкновенному ЖД.

Автор: Snowy 14.3.2005, 08:06
Цитата(MishaVinogradov @ 14.3.2005, 00:57)
информацию о некоторых функциях MS DOS. По 6.22 у меня есть, а вот по 7.0

MS не выпускала 7-ю версию DOS. 7-я это уже IBM'овский DOS.
Насколько мне известно, разницы между ними почти никакой, разве что набор утилит.
А int 21 у них полностью одинаковый.
Только сомневаюсь, что int 21h тебе поможет. Пробуй лучше через ASPI.

Автор: MishaVinogradov 15.3.2005, 00:21
Седьмая версия - это как раз и есть Win9x.
А что такое ASPI?
Интересно, как же работает FDISK. Ведь он же может получатьинформацию о совершено пустом диске, без разделов.
У DOS-а есть функция получения параметров блочного устройства ($440D (подфункция $0860 или $4860), но они, кажется, все же работают с логическим диском. Буду проверять. (В Win9х они вызываются через DeviceIOControl).

Автор: Guest 16.3.2005, 10:38
Да, кажется дело зашло в тупик. Может быть, что такого понятия как "физический диск" под Win9х вообще не существует? Но Fdisk как то работает! Значит существует. Буду еще копать MSDN... smile

Автор: Snowy 16.3.2005, 10:46
А разве FDISK использует данные не из BIOS'a?
Мне казалось, что из него...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)