Статьи по программированию
примеры программного кода
Delphi, Kylix, C, C++, SQL, Visual Basic, Bash, Assembler, 1С
Qt, KOL, MFC, Rx Library, Windows, Linux, Mac OS
Пример использования команды CHANGE DEFINITION
Опубликовано codeLocker в 20.09.2008 в 12:30.
' объявляем необходимые константы
Private Const SCSI_CHANGE_DEF = &H40
Private Const SC_EXEC_J3CSI_CMD = &H2
Private Const SS_PENDING = &H0
Private Const SS_COMP = &H1
Private Const SENSE_LEN =14
Private Const SRB_DIR_OUT = &HA
Private Const SRB_EVENT_NOTIFY = SH40
Private Const INFINITE = &HFFFF
' объявляем структуры SRB_ExecSCSICmd и SECURITY_ATTRIBUTES
Private Type SRB_ExecSCSICmd
SRB_Cmd As Byte
SRB_Status As Byte
SRB_HaId As Byte
SRB_Flags As Byte
SRB_Hdr_Rsvd As Long
SRB_Target As Byte
SRB_Lun As Byte
SRB_Rsvdl As Integer
SRB_BufLen As Long
SRB_BufPointer As Long
SRB_SenseLen As Byte
SRB_CDBLen As Byte
SRB_HaStat As Byte
SRB_TargStat As Byte
SRB_PostProc As Long
SRB_Rsvd2(19) As Byte
SRB_CDBByte(15) As Byte
SRB_SenseArea (15) As Byte
End Type
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
blnheritHandle As Long
End Type
'объявляем функции
Private Declare Function SendASPI32Coinmand Lib "Wnaspi32" _
(haSRB As SRB_ExecSCSICmd) As Long
Private Declare Function CreateEvent Lib "kernel32" Alias _
"CreateEventA" (ipEventAttributes As SECURITY_ATTRIBUTES, _
ByVal bManualReset As Long, ByVal blnitialState As Long, _
ByVal lpName As String) As Long
Private Declare Function ResetEvent Lib "kernel32" Alias _
"ResetEvent" (ByVal hEvent As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
Alias "WaitForSingleObject" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" Alias _
"CloseHandle" (ByVal hObject As Long) As Long
' теперь пишем свою функцию
Public Function Change (ByVal byAdapter As Integer, _
ByVal byTarget As Integer) As Boolean
Dim Exec As SRB_ExecSCSICmd
Dim hEventASPI As Long ' дескриптор объекта события
Dim IResult As Long
' значение, возвращаемое функцией 1 заполняем структуру данными
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_PostProc = hEventASPI
' указатель на объект события
Exec.SRB_CDBLen =10
' размер команды
Exec.CDBByte(O) = SCSI_CHANGE_DEF
' заносим значение кода команды
Exec.CDBByte(l) = &H0 ' ЛНУ не используется
Exec.CDBByte(2) = &Н1 ' сохраняем значение
Exec.CDBByte(3) = &НЗ ' SCSI-2 значение
Exec.CDBByte(8) = &НА ' длина 10 байт
' выполняем команду через ASPI с обработкой ожидания
For i = 0 То 2
hEventASPI = CreateEvent (0, 1, 0, vbNullString)
If (hEventASPI = 0)Then
' не удалось создать объект события
' выходим из функции со значением FALSE
Change = 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)
Change = FALSE
Exit Function
End If
Next
If (Exec.SRB_Status = SS_COMP) Then
' обрабатываем как-нибудь полученные данные, содержащиеся в буфере
End If
' при успешном завершении удаляем из <a href='http://medico-info.ru' title='Память человека' target='_blank'>памяти</a> объект события и выходим из функции со значением TRUE
CloseHandle (hEventASPI)
Change = True
End Function
Private Const SCSI_CHANGE_DEF = &H40
Private Const SC_EXEC_J3CSI_CMD = &H2
Private Const SS_PENDING = &H0
Private Const SS_COMP = &H1
Private Const SENSE_LEN =14
Private Const SRB_DIR_OUT = &HA
Private Const SRB_EVENT_NOTIFY = SH40
Private Const INFINITE = &HFFFF
' объявляем структуры SRB_ExecSCSICmd и SECURITY_ATTRIBUTES
Private Type SRB_ExecSCSICmd
SRB_Cmd As Byte
SRB_Status As Byte
SRB_HaId As Byte
SRB_Flags As Byte
SRB_Hdr_Rsvd As Long
SRB_Target As Byte
SRB_Lun As Byte
SRB_Rsvdl As Integer
SRB_BufLen As Long
SRB_BufPointer As Long
SRB_SenseLen As Byte
SRB_CDBLen As Byte
SRB_HaStat As Byte
SRB_TargStat As Byte
SRB_PostProc As Long
SRB_Rsvd2(19) As Byte
SRB_CDBByte(15) As Byte
SRB_SenseArea (15) As Byte
End Type
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
blnheritHandle As Long
End Type
'объявляем функции
Private Declare Function SendASPI32Coinmand Lib "Wnaspi32" _
(haSRB As SRB_ExecSCSICmd) As Long
Private Declare Function CreateEvent Lib "kernel32" Alias _
"CreateEventA" (ipEventAttributes As SECURITY_ATTRIBUTES, _
ByVal bManualReset As Long, ByVal blnitialState As Long, _
ByVal lpName As String) As Long
Private Declare Function ResetEvent Lib "kernel32" Alias _
"ResetEvent" (ByVal hEvent As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
Alias "WaitForSingleObject" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" Alias _
"CloseHandle" (ByVal hObject As Long) As Long
' теперь пишем свою функцию
Public Function Change (ByVal byAdapter As Integer, _
ByVal byTarget As Integer) As Boolean
Dim Exec As SRB_ExecSCSICmd
Dim hEventASPI As Long ' дескриптор объекта события
Dim IResult As Long
' значение, возвращаемое функцией 1 заполняем структуру данными
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_PostProc = hEventASPI
' указатель на объект события
Exec.SRB_CDBLen =10
' размер команды
Exec.CDBByte(O) = SCSI_CHANGE_DEF
' заносим значение кода команды
Exec.CDBByte(l) = &H0 ' ЛНУ не используется
Exec.CDBByte(2) = &Н1 ' сохраняем значение
Exec.CDBByte(3) = &НЗ ' SCSI-2 значение
Exec.CDBByte(8) = &НА ' длина 10 байт
' выполняем команду через ASPI с обработкой ожидания
For i = 0 То 2
hEventASPI = CreateEvent (0, 1, 0, vbNullString)
If (hEventASPI = 0)Then
' не удалось создать объект события
' выходим из функции со значением FALSE
Change = 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)
Change = FALSE
Exit Function
End If
Next
If (Exec.SRB_Status = SS_COMP) Then
' обрабатываем как-нибудь полученные данные, содержащиеся в буфере
End If
' при успешном завершении удаляем из <a href='http://medico-info.ru' title='Память человека' target='_blank'>памяти</a> объект события и выходим из функции со значением TRUE
CloseHandle (hEventASPI)
Change = True
End Function
Материал похожий на Пример использования команды CHANGE DEFINITION
- Пример использования команды CHANGE DEFINITION
- Пример использования команды COPY
- Получение информации о контроллерах
- Пример использования команды COPY
Навигация
Сейчас на сайте
Сейчас на сайте 0 пользователей и 1 гость.
Статистика
Всего материалов: 1387