Команда SC_GETSET_TIMEOUTS
Команда SC_GETSET_TIMEOUTS позволяет установить время ожидания для определенного контроллера. Значение простоя измеряется всегда в секундах с шагом в 0,5 с. По умолчанию время ожидания для всех адресуемых контроллеров установлено на 30 ч. Структура для работы со временем задержки называется SRB_GetSetTimeouts.
Приведем более расширенное описание полей структуры.
- SRB_Cmd
Это поле должно содержать код команды SC_RESCAN_SCSI_BUS.
- SRB_Status
После выполнения команды здесь будет храниться результат вызова функции SendASPI32Command. Ниже приведены возможные значения:
- SSCOMP — операция успешно завершена.
- SSINVALIDHA — попытка использовать недопустимый (пустой) номер контроллера.
- SSINVALIDSRB — одно или большее количество полей в структуре SRB_GetsetTimeouts были установлены неверно.
- SSNODEVICE — в системе не обнаружено поддерживаемого устройства.
- SRB_HaId
Сюда нужно поместить номер выбранного контроллера. Нумерация начинается с 0.
- SRB_Flags
Здесь надо установить одно из двух значений:
- SRBDIRIN — используйте это значение, чтобы получить текущее время ожидания.
- SRBDIROUT — применяется для установки нового времени ожидания.
- SRB_Hdr_Rsvd
Это поле зарезервировано и должно быть установлено в 0.
- SRBJTarget
Сюда поместите идентификационный номер устройства. Чтобы установить новое время ожидания для всех устройств на текущем контроллере, надо занести сюда значение OXFF.
- SRB_Lun
В это поле необходимо занести логический номер устройства на шине. Чтобы установить новое время ожидания одновременно для всех имеющихся логических номеров (адресов), надо занести сюда значение OXFF.
- SRB_Timeout
Занесите в это поле новое значение времени ожидания. Счет ведется полусекундными интервалами. Если используется флаг SRB_DIR_OUT, поле используется для установки нового времени, а с флагом SRB_DIR_IN после выполнения команды поле будет содержать текущее значение времени ожидания. Возможный диапазон задержки лежит в пределах от 0 до 108000 (максимум 30 ч). Установка значения равного 0 приравнивается к выбору максимального значения ожидания.
Приведем данные общих установок значений времени ожидания (табл. 1).
Таблица 1. Установка общих значений задержки
Hald | Target | Lun | Устройства назначения |
---|---|---|---|
00 | 01 | FF | Всем устройствам на контроллере с номером 0 |
FF | 00 | FF | Всем устройствам с номером 0 на любом контроллере |
FF | FF | 00 | Для всех устройств на логическом номере (адресе) 0 |
FF | FF | FF | Абсолютно для всех устройств |
Рассмотрим пример использования команды SC_GETSET_TIMEOUTS, В котором установим время задержки для устройства с номером 3, расположенном на контроллере под номером 0. Значение задержки определим равным 10 с.
Листинг 2.16. Пример использования команды SC_GETSET_TIMEOUTS на Visual C++
В Visual Basic этот пример будет выглядеть так.
Листинг 2.17. Пример использования команды SC_GETSET_TIMEOUTS на Visual Basic
В этом примере мы устанавливаем время ожидания 10 с для устройства под номером 3. Для получения текущего времени достаточно указать флаг SRB_DIR_IN, а после выполнения команды обработать значение поля SRB_Timeouts, куда и будет помещено искомое значение.
На этом завершим описание функции управления SendASPI32Command, но прежде чем переходить к следующей функции расширения ASPI, сделаем важное уточнение. Для тех, кто пишет программы не на Visual Basic, здесь не будет ничего полезного, и они могут переходить к следующей главе. Итак, когда мы декларируем функцию SendASPI32Command, используется обращение к библиотеке ASPI Wnaspi32.dll. И здесь оболочка разработчика Visual Basic от Microsoft приготовила небольшой, но неприятный сюрприз. При попытке выполнить нашу программу Visual Basic сгенерирует такую ошибку:
Run-time Error'49':
Bad DLL Calling Convention
Хотя в определенных версиях языка Visual Basic при создании ЕХЕ файла ошибка может и не проявиться. По признанию фирмы Microsoft, стоит полагаться не на случай, а использовать другие способы обхода этой ошибки. Не вдаваясь в подробности, заметим, что суть ошибки — в отсутствии поддержки в оболочке Visual Basic соглашения вызова функции через _cdecl (один из способов вызова для запроса функции в Visual C++). Обработка всех запросов функций в Visual Basic происходит через _stdcall, что и приводит к получению ошибки при выполнении программы в среде Visual Basic.
Наиболее простым и правильным решением этой проблемы будет написание собственной библиотеки на языке Visual C++, а уже через файл библиотеки можно корректно обрабатывать любые вызовы функций ASPI из файла Wnaspi32.dll. Для упрощения решения задачи приведем один из вариантов создания такой библиотеки. Называться наша библиотека будет, например ASPIdecl.dll. Для компиляции файла библиотеки необходимо использовать Visual C++. Вначале создаем файл экспорта (расширение DEF). Он выглядит следующим образом:
Листинг 2.18. Пример кода для файла экспорта (DEF) библиотеки ASPIdecl.dll
Файл реализации при динамическом подключении интерфейса ASPI будет выглядеть так.
Листинг 2.19. Пример файла реализации (С) библиотеки ASPIdecl.dll
He забудьте перед компиляцией включить в проект файл Wnaspi32.h. Скомпилируйте файлы проекта и получите готовую к использованию в Visual Basic динамическую библиотеку, которая возьмет на себя всю работу по корректному вызову функций ASPI. В книге не ставится цель обучить работе в оболочке программирования Visual C++, но напомним, что для получения Release-версии библиотеки нужно выбрать соответствующий тип конфигурации проекта в главном меню оболочки.
2021-04-01
Google сообщил о запуске проекта Dunant
Проект Dunant, начатый в 2018 году, был запущен в эксплуатацию. Трансатлантический интернет-кабель соединяет США и континентальную Европу. Общая протяженность...
подробнее2020-04-06
Новшества в обновленной Windows 10
Корпорация Microsoft завершила разработку обновления, в котором добавлено множество функций. Обновление содержит как доработку уже имеющихся систем, так...
подробнее