Команда 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 завершила разработку обновления, в котором добавлено множество функций. Обновление содержит как доработку уже имеющихся систем, так...

подробнее

 

Все новости...

 

Научно-Техническое Объединение

Тел.: +7(4752) 55-95-86

E-mail:e-mail