| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > объем физического диска под Win9x |
| Автор: MishaVinogradov 7.3.2005, 18:34 |
| Как получить объем физического диска под Win9x? В MSDN описывается только процедура под Win NT. |
| Автор: 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 | ||
Встречался я с такой проблемой. Вот решение: Это происходит, т.к. возврешаемое значение, вероятно, записывается в переменную, каторая не потдерживает больших значений (например Integer). Ведь GetDiskFreeSpace возврещает значение в байтах. И если диск в 20 ГБ, то это около 20 МИЛЛИАРДОВ байт (конечно больше, т.к. там везде 1024 вместо 1000). Для решения используй переменную типа Int64, т.к этот тип умеет "запоминать" значения аж до 2 в 63 степени! |
| Автор: p0s0l 8.3.2005, 11:21 |
| Дык вроде ж требуется объём физического диска, а не логического... Поэтому GetDiskFreeSpaceEx вообще не подходит... |
| Автор: Poseidon 9.3.2005, 02:02 | ||||
Вот это точно. Как говорится: "Заболтались". Но ограничение в 2 ГБ все равно решается таким способом:
И еще: А если попробовать получить буквы всех логических дисков, потом их размер (при помощи GetDiskFreeSpaceEx), а потом сумму этих размеров. Получится размер физического. Это так, как вариант. |
| Автор: Snowy 9.3.2005, 08:15 | ||||
Бесполезно. Функция уже возвращает dword, поэтому что с ним не делай, больше он не станет. Для этого и сделана GetDiskFreeSpaceEx, которая возвращает ddword.
Тогда мы получим объем всех физических дисков системы. |
| Автор: p0s0l 9.3.2005, 12:20 | ||
|
| Автор: Snowy 9.3.2005, 12:41 |
| Думаю, с физическим диском будет не все так просто. Главная проблема: UATA, SATA, скази, рейд. Думаю, что получение параметров для них будет различаться. Можно попробовать взять данные у биоса. Можно попробовать через ASPI - функция SC_GET_DISK_INFO. |
| Автор: p0s0l 9.3.2005, 13:56 | ||||
Хотя у биоса брать - меньше геморра... наверное, оптимальный вариант всё-таки... Если обращаться к SCSI (напр, через ASPI), то можно использовать команду SCSI_RD_CAPAC... |
| Автор: Snowy 9.3.2005, 14:09 | ||
Отсюда вывод. Не все так просто. Придется писать разный код под разные типы интерфейса. А что делать с RAID? Тут как-то все неоднозначно. Брать объем целого рейда или можно найти как-то размер каждого диска? И нужно ли знать параметры каждого диска? И как это делать? Лично я не нашел никакой информации. И как теперь жить после этого? C другой стороны, а зачем нужна такая информация? Какая от нее польза, если только мы не пишем свой Partition Magic? |
| Автор: p0s0l 9.3.2005, 14:12 | ||
|
| Автор: 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 | ||
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... |
| Автор: Snowy 16.3.2005, 10:46 |
| А разве FDISK использует данные не из BIOS'a? Мне казалось, что из него... |