Статьи по программированию
примеры программного кода
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:43.
BYTE CopySeg (BYTE byAdapter, BYTE byTarget)
{
// объявляем переменные
SRB_ExecSCSICmd Exec;
// структура обработки команды ASPI
HANDLE hEventASPI; // объект события DWORD dwStatus;
unsigned char Buffer[20];
// обнуляем структуру SRB_ExecSCSICmd и буфер
memset (&Exec, 0, sizeof (SRB_ExecSCSICmd)) ;
memset (SBuffer, 0, 20);
// заполняем буфер
Buffer[0] = 0x10; // код функции COPY 02h и высший приоритет
Buffer[4] = 0x20; // адрес и ЛНУ источника
Buffer[5] = 0x01; // адрес и ЛНУ приемника
// размер блока данных 2000 (0x7D0) байт
Buffer [10] = 0x07;
Buffer [11] = 0xD0;
// стартовый логический адрес блока источника
Buffer[12] = 0x00;
Buffer [13] = 0x00;
Buffer [14] = OxCB;
Buffer[15] = 0x20;
// стартовый логический адрес блока приемника
Buffer[16] = 0x00;
Buffer[17] = 0x01;
Buffer[18] = 0xE4;
Buffer[19] = 0x60;
// заполняем структуру данными
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 I SRB_EVENT_NOTIFY;
Exec.SRB_SenseLen = SENSE_LEN;
// размер поля отчета
Exec.SRB_BufPointer = Buffer;
Exec.SRB_BufLen = 20;
Exec.SRB_PostProc = (LPVOID) hEventASPI;
// определяем объект события
Exec.SRB_CDBLen =6;
// размер команды
Exec.CDBByte[0] = SCSI_COPY;
// код команды (0x18)
Exec.CDBByte[1] = 0x00;
// ЛНУ не используется
Exec.CDBByte[4] = 0x14;
// размер буфера 20 байт
// выполняем команду через ASPI с обработкой ожидания
for (int i = 1; i < 2; i++)
{
// создаем объект события
hEventASPI = CreateEvent (NULL, TRUE, FALSE, NULL);
ResetEvent (hEventASPI);
dwStatus = SendASPI32Command ((LPSRB) &Exec); // выполняем команду ASPI
if (dwStatus = = SS_COMP) // если команда завершена, выходим из цикла
{
CloseHandle (hEventASPI);
break;
}
if (dwStatus = = SS_PENDING) // если команда выполняется, ждем
{
if (WAITJTIMEOUT != WaitForSingleObject (hEventASPI, INFINITE))
{
CloseHandle (hEventASPI); break;
}
}
// команда выполнена без ошибок
if (Exec.SRB_Status = = SS_COMP)
{
// делаем что-то нужное
}
return Exec. SRB_Status;
}
{
// объявляем переменные
SRB_ExecSCSICmd Exec;
// структура обработки команды ASPI
HANDLE hEventASPI; // объект события DWORD dwStatus;
unsigned char Buffer[20];
// обнуляем структуру SRB_ExecSCSICmd и буфер
memset (&Exec, 0, sizeof (SRB_ExecSCSICmd)) ;
memset (SBuffer, 0, 20);
// заполняем буфер
Buffer[0] = 0x10; // код функции COPY 02h и высший приоритет
Buffer[4] = 0x20; // адрес и ЛНУ источника
Buffer[5] = 0x01; // адрес и ЛНУ приемника
// размер блока данных 2000 (0x7D0) байт
Buffer [10] = 0x07;
Buffer [11] = 0xD0;
// стартовый логический адрес блока источника
Buffer[12] = 0x00;
Buffer [13] = 0x00;
Buffer [14] = OxCB;
Buffer[15] = 0x20;
// стартовый логический адрес блока приемника
Buffer[16] = 0x00;
Buffer[17] = 0x01;
Buffer[18] = 0xE4;
Buffer[19] = 0x60;
// заполняем структуру данными
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 I SRB_EVENT_NOTIFY;
Exec.SRB_SenseLen = SENSE_LEN;
// размер поля отчета
Exec.SRB_BufPointer = Buffer;
Exec.SRB_BufLen = 20;
Exec.SRB_PostProc = (LPVOID) hEventASPI;
// определяем объект события
Exec.SRB_CDBLen =6;
// размер команды
Exec.CDBByte[0] = SCSI_COPY;
// код команды (0x18)
Exec.CDBByte[1] = 0x00;
// ЛНУ не используется
Exec.CDBByte[4] = 0x14;
// размер буфера 20 байт
// выполняем команду через ASPI с обработкой ожидания
for (int i = 1; i < 2; i++)
{
// создаем объект события
hEventASPI = CreateEvent (NULL, TRUE, FALSE, NULL);
ResetEvent (hEventASPI);
dwStatus = SendASPI32Command ((LPSRB) &Exec); // выполняем команду ASPI
if (dwStatus = = SS_COMP) // если команда завершена, выходим из цикла
{
CloseHandle (hEventASPI);
break;
}
if (dwStatus = = SS_PENDING) // если команда выполняется, ждем
{
if (WAITJTIMEOUT != WaitForSingleObject (hEventASPI, INFINITE))
{
CloseHandle (hEventASPI); break;
}
}
// команда выполнена без ошибок
if (Exec.SRB_Status = = SS_COMP)
{
// делаем что-то нужное
}
return Exec. SRB_Status;
}
Материал похожий на Пример использования команды COPY
- Пример использования команды CHANGE DEFINITION
- Пример использования команды COPY
- Пример использования команды CHANGE DEFINITION
- Пример использования команды INQUIRY
Навигация
Интересные сайты
Сейчас на сайте
Сейчас на сайте 0 пользователей и 1 гость.
Статистика
Всего материалов: 1387