Статьи по программированию
примеры программного кода
Delphi, Kylix, C, C++, SQL, Visual Basic, Bash, Assembler, 1С
Qt, KOL, MFC, Rx Library, Windows, Linux, Mac OS
Пример использования команды COPY
Опубликовано codeLocker в 20.09.2008 в 12:50.
' объявляем необходимые константы
Private Const SCSI_COPY = &Н18
' теперь пишем свою функцию
Public Function CopySeg (ByVal byAdapter As Integer, _
ByVal byTarget As Integer) As Boolean
Dim Exec As SRB_ExecSCSICmd
Dim hEventASPI As Long ' дескриптор объекта события
Dim IResult As Long ' значение, возвращаемое функцией
Dim Buffer(19) As Byte
' заполняем буфер
Buffer(0) = &H10 ' код функции COPY 02h и высший приоритет
Buffer(4) = &Н20 ' адрес и ЛНУ источника
Buffer(5) = &Н1 ' адрес и ЛНУ приемника
' размер блока данных 2000 (0х7О0)байт
Buffer(10) = &Н7
Buffer(11) = &HD0
' стартовый логический адрес блока источника
Buffer(12) = &Н0
Buffer(13) = &Н0
Buffer(14) = &НСВ
Buffer(15) = &H20
' стартовый логический адрес блока приемника
Buffer(16) = &Н20
Buffer (17) = &Н20
Buffer(18) = &Н20
Buffer(19) = &H20
' заполняем структуру данными
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_OUT | SRB_EVENT_NOTIFY
Exec.SRB_SenseLen = SENSE_LEN
' размер поля отчета
Exec.SRB_BufPointer = VarPtr (Buffer)
Exec. SRB_Buf Len = 20
Exec.SRB_PostProc = hEventASPI ' указатель на объект события Exec.SRB_CDBLen = 6 ' размер команды
Exec.CDBByte(0) = SCSI_COPY ' заносим значение кода команды
Exec.CDBByte(1) = &Н0 ' ЛНУ не используется
Exec.CDBByte(4) = &Н14 ' размер буфера 20 байт
' выполняем команду через ASPI с обработкой ожидания
For i = 0 То 2
hEventASPI = CreateEvent (0, 1, 0, vbNullString)
If (hEventASPI = 0) Then
' не удалось создать объект события
'выходим из функции со значением FALSE
CopySeg = 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)
CopySeg = False
Exit Function
End If
Next i
If (Exec.SRB_Status = SS_COMP) Then
' обрабатываем как-нибудь полученные данные, содержащиеся в буфере
End If
' при успешном завершении удаляем из памяти объект события
' и выходим из функции со значением TRUE
CloseHandle (hEventASPI)
CopySeg = True
End Function
Private Const SCSI_COPY = &Н18
' теперь пишем свою функцию
Public Function CopySeg (ByVal byAdapter As Integer, _
ByVal byTarget As Integer) As Boolean
Dim Exec As SRB_ExecSCSICmd
Dim hEventASPI As Long ' дескриптор объекта события
Dim IResult As Long ' значение, возвращаемое функцией
Dim Buffer(19) As Byte
' заполняем буфер
Buffer(0) = &H10 ' код функции COPY 02h и высший приоритет
Buffer(4) = &Н20 ' адрес и ЛНУ источника
Buffer(5) = &Н1 ' адрес и ЛНУ приемника
' размер блока данных 2000 (0х7О0)байт
Buffer(10) = &Н7
Buffer(11) = &HD0
' стартовый логический адрес блока источника
Buffer(12) = &Н0
Buffer(13) = &Н0
Buffer(14) = &НСВ
Buffer(15) = &H20
' стартовый логический адрес блока приемника
Buffer(16) = &Н20
Buffer (17) = &Н20
Buffer(18) = &Н20
Buffer(19) = &H20
' заполняем структуру данными
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_OUT | SRB_EVENT_NOTIFY
Exec.SRB_SenseLen = SENSE_LEN
' размер поля отчета
Exec.SRB_BufPointer = VarPtr (Buffer)
Exec. SRB_Buf Len = 20
Exec.SRB_PostProc = hEventASPI ' указатель на объект события Exec.SRB_CDBLen = 6 ' размер команды
Exec.CDBByte(0) = SCSI_COPY ' заносим значение кода команды
Exec.CDBByte(1) = &Н0 ' ЛНУ не используется
Exec.CDBByte(4) = &Н14 ' размер буфера 20 байт
' выполняем команду через ASPI с обработкой ожидания
For i = 0 То 2
hEventASPI = CreateEvent (0, 1, 0, vbNullString)
If (hEventASPI = 0) Then
' не удалось создать объект события
'выходим из функции со значением FALSE
CopySeg = 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)
CopySeg = False
Exit Function
End If
Next i
If (Exec.SRB_Status = SS_COMP) Then
' обрабатываем как-нибудь полученные данные, содержащиеся в буфере
End If
' при успешном завершении удаляем из памяти объект события
' и выходим из функции со значением TRUE
CloseHandle (hEventASPI)
CopySeg = True
End Function
Материал похожий на Пример использования команды COPY
- Пример использования команды COPY
- Пример использования команды INQUIRY
- Пример использования команды CHANGE DEFINITION
- Пример использования команды INQUIRY
Навигация
Интересные сайты
Сейчас на сайте
Сейчас на сайте 0 пользователей и 1 гость.
Статистика
Всего материалов: 1387