Я понимаю, что многим эта процедура покажется
неинтересной – я её привёл лишь для того, чтобы показать основы работы со
SCSI-устройствами.
Следующие две процедуры, на мой взгляд, заинтересуют
большее число пользователей. Уверен, многие из вас постоянно пользуются, или
пользовались ранее, программами, управляющими скоростью привода CD-ROM
(например, программой CDSlow). Хотите написать подобную программу сами?
Позвольте помочь вам кодом, состоящим из двух процедур, одна из которых
определяет текущую и максимально поддерживаемую скорость привода, а другая
устанавливает необходимую пользователю скорость.
Для этого я воспользовался SCSI-командой MODE
SENSE(10). Цифра десять означает, что команда десятибайтная. Это важно, потому
что существует такая же шестибайтная команда. В принципе, можно было бы
воспользоваться и шестибайтной командой, но поскольку команда MODE SENSE(10)
более совершенна, я остановил свой выбор на ней. Итак, для чего же нужна данная
команда? Всё просто, она читает значения режимов (Mode Sense), установленных
для SCSI-устройства. Существуют так называемые страницы режима (Mode Page), в
которых хранится некоторая информация (например, параметры скорости привода, параметры для записи CD-R/RW-дисков и многое другое). Доступ к этим страницам
осуществляется по их коду с использованием команды MODE SENSE.
Опишем вспомогательный тип TCDSpeeds.
type
TCDSpeeds=record
MaxSpeed, // максимальная скорость чтения
CurrentSpeed, // текущая скорость чтения
MaxWriteSpeed, // максимальная скорость
записи
CurrentWriteSpeed:integer; // текущая
скорость записи
end;
|
Теперь, я думаю, понятно для чего эта структура нужна.
// какие параметры передавать
функции, объяснять, по моему, не надо
function GetCDSpeeds(Host,Target,Lun:Byte):TCDSpeeds;
var
buffer: array [0..29] of Byte; // буфер для
принимаемых данных
|
Здесь я сделаю небольшое пояснение относительно
размера буфера. Данные, возвращаемые при использовании страницы режима CD
Capabilities and Mechanical Status Page, имеют размер 20 байт. Но, как вы
заметили, я использовал буфер размером 30 байт, и вот почему. Перед самой
страницей режима, идут заголовок режима параметров, код страницы и её размер.
Размер заголовка при использовании шестибайтной команды MODE SENSE составляет 4
байта, а при использовании команды MODE SENSE(10) – 8 байт.
Продолжим. Код, который уже встречался ранее, приведен
без комментариев: