Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> объем физического диска под Win9x 
:(
    Опции темы
MishaVinogradov
Дата 7.3.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 18.2.2005

Репутация: нет
Всего: 1



Как получить объем физического диска под Win9x? В MSDN описывается только процедура под Win NT. smile
PM MAIL   Вверх
Snowy
Дата 7.3.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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

PM MAIL   Вверх
p0s0l
Дата 7.3.2005, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



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


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 7.3.2005, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 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


--------------------
С уважением, г-н Посол.
PM   Вверх
Poseidon
Дата 8.3.2005, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



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

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
p0s0l
Дата 8.3.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



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



--------------------
С уважением, г-н Посол.
PM   Вверх
Poseidon
Дата 9.3.2005, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



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

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


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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 9.3.2005, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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

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

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

Тогда мы получим объем всех физических дисков системы.
PM MAIL   Вверх
p0s0l
Дата 9.3.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



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



--------------------
С уважением, г-н Посол.
PM   Вверх
Snowy
Дата 9.3.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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

Можно попробовать взять данные у биоса.
Можно попробовать через ASPI - функция SC_GET_DISK_INFO.
PM MAIL   Вверх
p0s0l
Дата 9.3.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



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



--------------------
С уважением, г-н Посол.
PM   Вверх
Snowy
Дата 9.3.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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

Отсюда вывод. Не все так просто.
Придется писать разный код под разные типы интерфейса.
А что делать с RAID? Тут как-то все неоднозначно.
Брать объем целого рейда или можно найти как-то размер каждого диска?
И нужно ли знать параметры каждого диска? И как это делать?
Лично я не нашел никакой информации. И как теперь жить после этого? smile
C другой стороны, а зачем нужна такая информация? Какая от нее польза, если только мы не пишем свой Partition Magic?
PM MAIL   Вверх
p0s0l
Дата 9.3.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



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



--------------------
С уважением, г-н Посол.
PM   Вверх
MishaVinogradov
Дата 14.3.2005, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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, то и работать они будут аналогично обыкновенному ЖД.
PM MAIL   Вверх
Snowy
Дата 14.3.2005, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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

MS не выпускала 7-ю версию DOS. 7-я это уже IBM'овский DOS.
Насколько мне известно, разницы между ними почти никакой, разве что набор утилит.
А int 21 у них полностью одинаковый.
Только сомневаюсь, что int 21h тебе поможет. Пробуй лучше через ASPI.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1338 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.