![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
MishaVinogradov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 18.2.2005 Репутация: нет Всего: 1 |
Как получить объем физического диска под Win9x? В MSDN описывается только процедура под Win NT.
![]() |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
А тебе нужно именно на WinAPI?
SysUtils.DiskSize не подойдет? GetDiskFreeSpaceEx работает во всех виндах, начиная с 95OSR2. GetDiskFreeSpace работает во всех виндах, начиная с 95, но возвращаемый размер ограничен 2Gb. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
По идее можно открыть \\.\SMARTVSD, через DeviceIoControl заслать ему SMART_RCV_DRIVE_DATA, а в регистрах указать команду IDENTIFY DEVICE... В результате получишь ID-сектор винта, откуда можно взять его параметры (например, Total Addressable Sectors умножь на 512 - будет емкость винта в байтах, доступная пользователю)...
-------------------- С уважением, г-н Посол. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Кстати, чтоб не с нуля начинать, можно взять пример из DRKB по получению серийного номера - там как раз читается ID-сектор...
Только надо будет добавить поддержку 48-битной LBA - для таких случаев нужно читать слова №100..103 в ID-секторе... Для 24-битной адресации нужно читать слова №60..61 (это соответствует полю TIdSector.ulTotalAddressableSectors... Это сообщение отредактировал(а) p0s0l - 7.3.2005, 22:19 -------------------- С уважением, г-н Посол. |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 10 Всего: 133 |
Встречался я с такой проблемой. Вот решение: Это происходит, т.к. возврешаемое значение, вероятно, записывается в переменную, каторая не потдерживает больших значений (например Integer). Ведь GetDiskFreeSpace возврещает значение в байтах. И если диск в 20 ГБ, то это около 20 МИЛЛИАРДОВ байт (конечно больше, т.к. там везде 1024 вместо 1000). Для решения используй переменную типа Int64, т.к этот тип умеет "запоминать" значения аж до 2 в 63 степени! -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Дык вроде ж требуется объём физического диска, а не логического... Поэтому GetDiskFreeSpaceEx вообще не подходит...
-------------------- С уважением, г-н Посол. |
|||
|
||||
Poseidon |
|
||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 10 Всего: 133 |
Вот это точно. Как говорится: "Заболтались". Но ограничение в 2 ГБ все равно решается таким способом:
И еще: А если попробовать получить буквы всех логических дисков, потом их размер (при помощи GetDiskFreeSpaceEx), а потом сумму этих размеров. Получится размер физического. Это так, как вариант. ![]() -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||
|
|||||
Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Бесполезно. Функция уже возвращает dword, поэтому что с ним не делай, больше он не станет. Для этого и сделана GetDiskFreeSpaceEx, которая возвращает ddword.
Тогда мы получим объем всех физических дисков системы. |
||||
|
|||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
-------------------- С уважением, г-н Посол. |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Думаю, с физическим диском будет не все так просто.
Главная проблема: UATA, SATA, скази, рейд. Думаю, что получение параметров для них будет различаться. Можно попробовать взять данные у биоса. Можно попробовать через ASPI - функция SC_GET_DISK_INFO. |
|||
|
||||
p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Хотя у биоса брать - меньше геморра... наверное, оптимальный вариант всё-таки... Если обращаться к SCSI (напр, через ASPI), то можно использовать команду SCSI_RD_CAPAC... -------------------- С уважением, г-н Посол. |
||||
|
|||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Отсюда вывод. Не все так просто. Придется писать разный код под разные типы интерфейса. А что делать с RAID? Тут как-то все неоднозначно. Брать объем целого рейда или можно найти как-то размер каждого диска? И нужно ли знать параметры каждого диска? И как это делать? Лично я не нашел никакой информации. И как теперь жить после этого? ![]() C другой стороны, а зачем нужна такая информация? Какая от нее польза, если только мы не пишем свой Partition Magic? |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
![]() -------------------- С уважением, г-н Посол. |
|||
|
||||
MishaVinogradov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 18.2.2005 Репутация: нет Всего: 1 |
Хочу внести ясность.
Для чего нужна информация о дисках: Объем диск (а, ов) нужен для сбора информации о компьютерах. (Нужна такая универсальная программа и под NT (2000, XP) и под Win 9x, т.к. имеются и те и другие системы). В MSDN (апрель 2001 года) я накопал, что этот вопрос решается через драйвер виртуального устройства, а затем через функцию MS-DOS 21h (440Dh). Копать буду пока не сделаю, т.к. FDISK все же понимает физические диски, а значит найти объем принципиально возможно. Сейчас ищу информацию о некоторых функциях MS DOS. По 6.22 у меня есть, а вот по 7.0 - нет. Если кто знает где взять подскажите. Как только допишу - помещу ответ. Как быть с RAID, SCSI и SATA пока не знаю, но я думаю, что если их поддерживает драйвер под Win9x, то и работать они будут аналогично обыкновенному ЖД. |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
MS не выпускала 7-ю версию DOS. 7-я это уже IBM'овский DOS. Насколько мне известно, разницы между ними почти никакой, разве что набор утилит. А int 21 у них полностью одинаковый. Только сомневаюсь, что int 21h тебе поможет. Пробуй лучше через ASPI. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |