Статьи по программированию
примеры программного кода
Delphi, Kylix, C, C++, SQL, Visual Basic, Bash, Assembler, 1С
Qt, KOL, MFC, Rx Library, Windows, Linux, Mac OS
Пример использования команды INQUIRY
Опубликовано codeLocker в 20.09.2008 в 13:04.
' объявляем необходимые константы
Private Const SCSI_INQUIRY = &H12
' теперь пишем свою функцию
Public Function Getlnfo (ByVal byAdapter As Integer, _
ByVal byTarget As Integer) As Boolean
Dim Exec As SRB_ExecSCSICmd
Dim hEventASPI As Long ' дескриптор объекта события
Dim IResult As Long ' значение, возвращаемое функцией
Dim byBuff(99) As Byte ' байтовый массив для буфера данных
Dim i As Integer
' заполняем структуру данными
Exec.SRB_Cmd = SC_EXEC_SCSI_CMD
Exec.SRB_HaId = byAdapter
' как получить значения byAdapter и byTarget
' описано во второй главе книги
Exec.SRB_Target = byTarget
Exec.SRB_Lun =0
Exec.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY
Exec. SRB_BufLen = 100
' размер буфера для данных
Exec.SRB_BufPointer = VarPtr (byBuff)
' указатель на буфер данных
Exec.SRB_SenseLen = SENSE_LEN
' размер поля отчета
Exec.SRB^PostProc = hEventASPI
' указатель на объект события
Exec.SRB_CDBLen = 6
' размер команды INQUIRY
Exec.CDBByte(0) = SCSI_INQUIRY
' заносим значение кода команды
Exec.CDBByte(4) =100
' заносим размер буфера
' выполняем команду через ASPI с обработкой ожидания
For i = 0 То 2
hEventASPI = CreateEvent (0, 1, 0, vbNullString)
If (hEventASPI = 0) Then
' не удалось создать объект события
' выходим из функции со значением FALSE
Getlnfo = False
Exit Function
End If
' устанавливаем объект события в несигнальное состояние
ResetEvent (hEventASPI)
' выполняем команду
IResult = SendASPI32Command (Exec)
' проверяем возвращаемое значение
If (IResult = SS_PENDING) Then
WaitForSingleObject (hEventASPI, INFINITE)
End If
' после выполнения команды проверяем поле SRB_Status на наличие ошибки
If (Exec.SRB_Status <> SS_COMP) Then
' если произошла ошибка, удаляем из памяти объект события и
' завершаем функцию значением FALSE
CloseHandle (hEventASPI)
Getlnfo = False
Exit Function
End If
Next i
If (Exec.SRB_Status = SS_COMP) Then
' обрабатываем как-нибудь полученные данные, содержащиеся в буфере
End If
' при успешном завершении удаляем из памяти объект события
' и выходим из функции со значением TRUE
CloseHandle (hEventASPI)
Getlnfo = True
End Function
Private Const SCSI_INQUIRY = &H12
' теперь пишем свою функцию
Public Function Getlnfo (ByVal byAdapter As Integer, _
ByVal byTarget As Integer) As Boolean
Dim Exec As SRB_ExecSCSICmd
Dim hEventASPI As Long ' дескриптор объекта события
Dim IResult As Long ' значение, возвращаемое функцией
Dim byBuff(99) As Byte ' байтовый массив для буфера данных
Dim i As Integer
' заполняем структуру данными
Exec.SRB_Cmd = SC_EXEC_SCSI_CMD
Exec.SRB_HaId = byAdapter
' как получить значения byAdapter и byTarget
' описано во второй главе книги
Exec.SRB_Target = byTarget
Exec.SRB_Lun =0
Exec.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY
Exec. SRB_BufLen = 100
' размер буфера для данных
Exec.SRB_BufPointer = VarPtr (byBuff)
' указатель на буфер данных
Exec.SRB_SenseLen = SENSE_LEN
' размер поля отчета
Exec.SRB^PostProc = hEventASPI
' указатель на объект события
Exec.SRB_CDBLen = 6
' размер команды INQUIRY
Exec.CDBByte(0) = SCSI_INQUIRY
' заносим значение кода команды
Exec.CDBByte(4) =100
' заносим размер буфера
' выполняем команду через ASPI с обработкой ожидания
For i = 0 То 2
hEventASPI = CreateEvent (0, 1, 0, vbNullString)
If (hEventASPI = 0) Then
' не удалось создать объект события
' выходим из функции со значением FALSE
Getlnfo = False
Exit Function
End If
' устанавливаем объект события в несигнальное состояние
ResetEvent (hEventASPI)
' выполняем команду
IResult = SendASPI32Command (Exec)
' проверяем возвращаемое значение
If (IResult = SS_PENDING) Then
WaitForSingleObject (hEventASPI, INFINITE)
End If
' после выполнения команды проверяем поле SRB_Status на наличие ошибки
If (Exec.SRB_Status <> SS_COMP) Then
' если произошла ошибка, удаляем из памяти объект события и
' завершаем функцию значением FALSE
CloseHandle (hEventASPI)
Getlnfo = False
Exit Function
End If
Next i
If (Exec.SRB_Status = SS_COMP) Then
' обрабатываем как-нибудь полученные данные, содержащиеся в буфере
End If
' при успешном завершении удаляем из памяти объект события
' и выходим из функции со значением TRUE
CloseHandle (hEventASPI)
Getlnfo = True
End Function
Материал похожий на Пример использования команды INQUIRY
- Пример использования команды INQUIRY
- Пример использования команды SC_ABORT_SRB
- Пример использования команды COPY
- Пример использования команды SC_ABORT_SRB
Навигация
Интересные сайты
Сейчас на сайте
Сейчас на сайте 0 пользователей и 1 гость.
Статистика
Всего материалов: 1387