в надежде найти тех, кто
unsigned char str[0xFF];
unsigned char CDB[ATAPI_CDB_SIZE];
long a, real_len, adapterid, targetid;
// получаем кол-во адаптеров на шине
ASPI32Status = GetASPI32SupportInfo();
AdapterCount = (LOBYTE(LOWORD(ASPI32Status)));
// готовим CDB-блок
memset(CDB, 0, ATAPI_CDB_SIZE);
CDB[0] = 0x12; // INQUIRY
CDB[4] = 0xFF; // размер ответа
// спамим порты в надежде найти тех, кто нам нужен
for (adapterid = 0; adapterid < MAX_LUN; adapterid++)
{ // внимание! нельзя здесь ^^^^^^^^^^^^^ использовать AdapterCount,
// как это рекомендуется в некоторых руководствах, поскольку номера
// адаптеров устройств далеко не всегда идут вплотную друг к другу,
// и если в нумерации возникает "разрыв", одно или более устройств
// останутся необнаруженными
for (targetid = 0; targetid < MAX_ID; targetid++)
{
a = SEND_ASPI_CMD(adapterid, targetid, CDB,
ATAPI_CDB_SIZE, 0, buf, 0xFF, ASPI_DATA_IN);
if (a == SS_COMP)
{
real_len=(buf[4]>MAX_INFO_LEN)?buf[4]:MAX_INFO_LEN;
memcpy(str,&buf[8],real_len);str[real_len]=0;
printf("%d.%d <-- %s\n",adapterid, targetid, str);
}
}
}
}
Результат работы программы на компьютере автора выглядит так, как показано в листинге 1.4.13 (обратите внимание, что адреса устройств, подключенных к виртуальной SCSI-шине, созданной драйвером ASPI, могут и не соответствовать их физическим адресам; в данном случае, привод PHILIPS висящий на физическом IDE-порту с номером 0, попал на виртуальный порт с номером 1, поскольку нулевой порт занят драйвером Virtual Clone CD, при удалении последнего из системы, соответствие виртуальных и физических адресов полностью восстанавливается, однако ручаться за это нельзя).
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий