BYTE CDROM_Interface_Aspi::GetHostAdapter(char* hardwareID)
{
	ASPI_SRB sh;
	ASPI_SRB sd;
	DWORD d		= pGetASPI32SupportInfo();
	int cnt		= LOBYTE(LOWORD(d));
	int i,j,k,max;

	for(i=0; i<cnt; i++) {
		memset(&sh, 0, sizeof(sh));
		sh.hainquiry.SRB_Cmd  = SC_HA_INQUIRY;
		sh.hainquiry.SRB_HaId = i;
		pSendASPI32Command((LPSRB)&sh);
		if (sh.hainquiry.SRB_Status!=SS_COMP) continue;
		
		// Indicates the maximum number of targets the adapter supports
		// If the value is not 8 or 16, then it should be assumed max target is 8
		max = (int)sh.hainquiry.HA_Unique[3];
		if ((max!=8) && (max!=16)) max = 8;
		
		for(j=0; j<max; j++) {
			for(k=0; k<8; k++) {
				memset(&sd, 0, sizeof(sd));
				sd.gdevblock.SRB_Cmd    = SC_GET_DEV_TYPE;
				sd.gdevblock.SRB_HaId   = i;
				sd.gdevblock.SRB_Target = j;
				sd.gdevblock.SRB_Lun    = k;
				pSendASPI32Command((LPSRB)&sd);
				if (sd.gdevblock.SRB_Status == SS_COMP) {
					if (sd.gdevblock.SRB_DeviceType == DTYPE_CDROM) {						
						if ((target==j) && (lun==k)) {
							LOG(LOG_MISC,LOG_NORMAL)("SCSI: Getting Hardware vendor.");								
							// "Hardware ID = vendor" match ?
							char vendor[64];
							if (GetVendor(i,target,lun,vendor)) {
								LOG(LOG_MISC,LOG_NORMAL)("SCSI: Vendor : %s",vendor);	
								if (strstr(strupr(hardwareID),strupr(vendor))) {
									LOG(LOG_MISC,LOG_NORMAL)("SCSI: Host Adapter found: %d",i);								
									return i;								
								}
							};
						}
					}
				}
			}
		}
	}
	LOG(LOG_MISC,LOG_ERROR)("SCSI: Host Adapter not found: %d",i);									
	return 0;
};
Beispiel #2
0
int ReadSub_D8(unsigned long addr,unsigned char * pBuf,int iNum)
{
 DWORD dwStatus;

 memset(&sx,0,sizeof(sx));
 sx.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 sx.SRB_HaId       = iCD_AD;
 sx.SRB_Target     = iCD_TA;
 sx.SRB_Lun        = iCD_LU;
 sx.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 sx.SRB_BufLen     = 2368*iNum;
 sx.SRB_BufPointer = pBuf;
 sx.SRB_SenseLen   = SENSE_LEN;
 sx.SRB_CDBLen     = 12;
 sx.SRB_PostProc   = (LPVOID)hEvent;
 sx.CDBByte[0]     = 0xD8;
 sx.CDBByte[2]     = (unsigned char)((addr >> 24) & 0xFF);
 sx.CDBByte[3]     = (unsigned char)((addr >> 16) & 0xFF);
 sx.CDBByte[4]     = (unsigned char)((addr >> 8) & 0xFF);
 sx.CDBByte[5]     = (unsigned char)(addr & 0xFF);
 sx.CDBByte[9]     = iNum;
 sx.CDBByte[10]    = 1;

 ResetEvent(hEvent);
 dwStatus=pSendASPI32Command((LPSRB)&sx);
 if(dwStatus==SS_PENDING)
  WaitGenEvent(WAITFOREVER);

 if(sx.SRB_Status!=SS_COMP)
  return 0;

 return 1;
}
Beispiel #3
0
DWORD GetSCSITOC(LPTOC toc)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;

 memset(&s,0,sizeof(s));

 s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 s.SRB_HaId       = iCD_AD;
 s.SRB_Target     = iCD_TA;
 s.SRB_Lun        = iCD_LU;
 s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 s.SRB_BufLen     = 0x324;
 s.SRB_BufPointer = (BYTE FAR *)toc;
 s.SRB_SenseLen   = 0x0E;
 s.SRB_CDBLen     = 0x0A;
 s.SRB_PostProc   = (LPVOID)hEvent;
 s.CDBByte[0]     = 0x43;
 s.CDBByte[1]     = 0x00; // 0x02 for MSF
 s.CDBByte[7]     = 0x03;
 s.CDBByte[8]     = 0x24;

 ResetEvent(hEvent);
 dwStatus=pSendASPI32Command((LPSRB)&s);

 if(dwStatus==SS_PENDING) WaitGenEvent(30000);

 if(s.SRB_Status!=SS_COMP) return SS_ERR;

 return SS_COMP;
}
Beispiel #4
0
DWORD DeInitSCSI_28(void)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;
 BYTE init1[] = { 0, 0, 0, 8, 83, 0, 0, 0, 0, 0, 8, 0 };

 memset(&s,0,sizeof(s));
 s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 s.SRB_HaId       = iCD_AD;
 s.SRB_Target     = iCD_TA;
 s.SRB_Lun        = iCD_LU;
 s.SRB_Flags      = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT;
 s.SRB_BufLen     = 0x0C;
 s.SRB_BufPointer = init1;
 s.SRB_SenseLen   = SENSE_LEN;
 s.SRB_CDBLen     = 6;
 s.SRB_PostProc   = (LPVOID)hEvent;
 s.CDBByte[0]     = 0x15;
 s.CDBByte[4]     = 0x0C;

 ResetEvent(hEvent);
 dwStatus=pSendASPI32Command((LPSRB)&s);
 if(dwStatus==SS_PENDING)
  WaitGenEvent(WAITFOREVER);

 if(s.SRB_Status!=SS_COMP)
  return SS_ERR;

 return s.SRB_Status;
}
Beispiel #5
0
int GetSCSIStatus(int iA,int iT,int iL)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;
 char ret[0x324];

 memset(&s,0,sizeof(s));

 s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 s.SRB_HaId       = iCD_AD;
 s.SRB_Target     = iCD_TA;
 s.SRB_Lun        = iCD_LU;
 s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 s.SRB_BufLen     = 0x324;
 s.SRB_BufPointer = (BYTE FAR *)ret;
 s.SRB_SenseLen   = 0x0E;
 s.SRB_CDBLen     = 0x0A;
 s.SRB_PostProc   = (LPVOID)hEvent;
 s.CDBByte[0]     = 0x00;

 ResetEvent(hEvent);
 dwStatus=pSendASPI32Command((LPSRB)&s);

 if(dwStatus==SS_PENDING) WaitGenEvent(30000);

 return s.SRB_Status;
}
Beispiel #6
0
DWORD SetSCSISpeed(DWORD dwSpeed)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;

 memset(&s,0,sizeof(s));

 s.SRB_Cmd      = SC_EXEC_SCSI_CMD;
 s.SRB_HaId     = iCD_AD;
 s.SRB_Target   = iCD_TA;
 s.SRB_Lun      = iCD_LU;
 s.SRB_Flags    = SRB_DIR_OUT | SRB_EVENT_NOTIFY;
 s.SRB_SenseLen = SENSE_LEN;
 s.SRB_CDBLen   = 12;
 s.SRB_PostProc = (LPVOID)hEvent;
 s.CDBByte[0]   = 0xBB;
 s.CDBByte[2]   = (BYTE)(dwSpeed >> 8);
 s.CDBByte[3]   = (BYTE)dwSpeed;

 ResetEvent(hEvent);
 dwStatus=pSendASPI32Command((LPSRB)&s);

 if(dwStatus==SS_PENDING)
  WaitGenEvent(WAITFOREVER);

 if(s.SRB_Status!=SS_COMP) return SS_ERR;

 return SS_COMP;
}
Beispiel #7
0
BOOL TestSCSIUnitReady(void)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;

 memset(&s,0,sizeof(s));
 s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 s.SRB_HaId       = iCD_AD;
 s.SRB_Target     = iCD_TA;
 s.SRB_Lun        = iCD_LU;
 s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 s.SRB_BufLen     = 0;
 s.SRB_BufPointer = 0;
 s.SRB_SenseLen   = SENSE_LEN;
 s.SRB_CDBLen     = 6;
 s.SRB_PostProc   = (LPVOID)hEvent;
 s.CDBByte[0]     = 0x00;
 s.CDBByte[1]     = iCD_LU << 5;

 ResetEvent(hEvent);
 dwStatus = pSendASPI32Command((LPSRB)&s);

 if(dwStatus==SS_PENDING)
  WaitGenEvent(1000);

 if(s.SRB_Status!=SS_COMP)
  return FALSE;

 if(s.SRB_TargStat==STATUS_GOOD) return TRUE;          // will always be GOOD with ioctl, so no problem here

 return FALSE;
}
Beispiel #8
0
DWORD ReadSCSI_28(BOOL bWait,FRAMEBUF * f)
{
 DWORD dwStatus;

 if(!pDeInitFunc)
  {
   if(iRType==MODE_28_2)
    {
     if(InitSCSI_28_2()!=SS_COMP) return SS_ERR;
    }
   else
    {
     if(InitSCSI_28_1()!=SS_COMP) return SS_ERR;
    }
  }

 memset(&sx,0,sizeof(sx));
 sx.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 sx.SRB_HaId       = iCD_AD;
 sx.SRB_Target     = iCD_TA;
 sx.SRB_Lun        = iCD_LU;
 sx.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 sx.SRB_BufLen     = f->dwBufLen;
 sx.SRB_BufPointer = &(f->BufData[0]);
 sx.SRB_SenseLen   = SENSE_LEN;
 sx.SRB_CDBLen     = 10;
 sx.SRB_PostProc   = (LPVOID)hEvent;
 sx.CDBByte[0]     = 0x28;    // read10 command
 sx.CDBByte[1]     = iCD_LU << 5;
 sx.CDBByte[2]     = (unsigned char)((f->dwFrame >> 24) & 0xFF);
 sx.CDBByte[3]     = (unsigned char)((f->dwFrame >> 16) & 0xFF);
 sx.CDBByte[4]     = (unsigned char)((f->dwFrame >> 8) & 0xFF);
 sx.CDBByte[5]     = (unsigned char)(f->dwFrame & 0xFF);
 sx.CDBByte[8]     = (unsigned char)(f->dwFrameCnt & 0xFF);

 ResetEvent(hEvent);
 dwStatus=pSendASPI32Command((LPSRB)&sx);
 if(dwStatus==SS_PENDING)
  {
   if(bWait) WaitGenEvent(WAITFOREVER);
   else
    {
     bDoWaiting=TRUE;
     return SS_COMP;
    }
  }

 if(sx.SRB_Status!=SS_COMP)
  return SS_ERR;

 return SS_COMP;
}
Beispiel #9
0
DWORD PlaySCSIAudio(unsigned long start,unsigned long len)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;

 memset(&s,0,sizeof(s));
 s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 s.SRB_HaId       = iCD_AD;
 s.SRB_Target     = iCD_TA;
 s.SRB_Lun        = iCD_LU;
 s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 s.SRB_BufLen     = 0;
 s.SRB_BufPointer = 0;
 s.SRB_SenseLen   = SENSE_LEN;
 s.SRB_CDBLen     = 12;
 s.SRB_PostProc   = (LPVOID)hEvent;

 if(start==0)                                          // mmm... that stop doesn't seem to work on all drives... pfff
  {
   s.CDBByte[0]     = 0x4b;
   s.CDBByte[1]     = (iCD_LU << 5) | 01;
   s.CDBByte[2]     = 0;
   s.CDBByte[3]     = 0;
   s.CDBByte[4]     = 0;
   s.CDBByte[5]     = 0;
   s.CDBByte[6]     = 0;
   s.CDBByte[7]     = 0;
   s.CDBByte[8]     = 0;
   s.CDBByte[9]     = 0;
  }
 else                                                  // start playing
  {
   s.CDBByte[0]     = 0xa5;
   s.CDBByte[1]     = iCD_LU << 5;
   s.CDBByte[2]     = (unsigned char)((start >> 24) & 0xFF);
   s.CDBByte[3]     = (unsigned char)((start >> 16) & 0xFF);
   s.CDBByte[4]     = (unsigned char)((start >> 8) & 0xFF);
   s.CDBByte[5]     = (unsigned char)((start & 0xFF));
   s.CDBByte[6]     = (unsigned char)((len >> 24) & 0xFF);
   s.CDBByte[7]     = (unsigned char)((len >> 16) & 0xFF);
   s.CDBByte[8]     = (unsigned char)((len >> 8) & 0xFF);
   s.CDBByte[9]     = (unsigned char)(len & 0xFF);
  }

 ResetEvent(hEvent);

 dwStatus = pSendASPI32Command((LPSRB)&s);

 if(dwStatus==SS_PENDING) WaitGenEvent(10000);

 return s.SRB_Status;
}
Beispiel #10
0
unsigned char * GetSCSIAudioSub(void)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;
 unsigned char cB[20];

 memset(cB,0,20);
 memset(&s,0,sizeof(s));

 s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 s.SRB_HaId       = iCD_AD;
 s.SRB_Target     = iCD_TA;
 s.SRB_Lun        = iCD_LU;
 s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 s.SRB_SenseLen   = SENSE_LEN;

 s.SRB_BufLen     = 20;//44;
 s.SRB_BufPointer = cB;
 s.SRB_CDBLen     = 10;

 s.CDBByte[0]     = 0x42;
 s.CDBByte[1]     = (iCD_LU<<5)|2;   // lun & msf
 s.CDBByte[2]     = 0x40;            // subq
 s.CDBByte[3]     = 0x01;            // curr pos info
 s.CDBByte[6]     = 0;               // track number (only in isrc mode, ignored)
 s.CDBByte[7]     = 0;               // alloc len
 s.CDBByte[8]     = 20;//44;

 ResetEvent(hEvent);

 dwStatus = pSendASPI32Command((LPSRB)&s);

 if(dwStatus==SS_PENDING) WaitGenEvent(WAITFOREVER);

 if(s.SRB_Status!=SS_COMP) return NULL;

 SubAData[12]=(cB[5]<<4)|(cB[5]>>4);
 SubAData[13]=cB[6];
 SubAData[14]=cB[7];
 SubAData[15]=itob(cB[13]);
 SubAData[16]=itob(cB[14]);
 SubAData[17]=itob(cB[15]);
 SubAData[18]=0;
 SubAData[19]=itob(cB[9]);
 SubAData[20]=itob(cB[10]);
 SubAData[21]=itob(cB[11]);

 return SubAData;
}
Beispiel #11
0
DWORD ReadSCSI_BE_Sub(BOOL bWait,FRAMEBUF * f)
{
 DWORD dwStatus;

 memset(&sx,0,sizeof(sx));
 sx.SRB_Cmd        = SC_EXEC_SCSI_CMD;
 sx.SRB_HaId       = iCD_AD;
 sx.SRB_Target     = iCD_TA;
 sx.SRB_Lun        = iCD_LU;
 sx.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
 sx.SRB_BufLen     = f->dwBufLen + 16;
 sx.SRB_BufPointer = &(f->BufData[0]);
 sx.SRB_SenseLen   = SENSE_LEN;
 sx.SRB_CDBLen     = 12;
 sx.SRB_PostProc   = (LPVOID)hEvent;
 sx.CDBByte[0]     = 0xBE;
 //s.CDBByte[1]     = 0x04;
 sx.CDBByte[2]     = (unsigned char)((f->dwFrame >> 24) & 0xFF);
 sx.CDBByte[3]     = (unsigned char)((f->dwFrame >> 16) & 0xFF);
 sx.CDBByte[4]     = (unsigned char)((f->dwFrame >> 8) & 0xFF);
 sx.CDBByte[5]     = (unsigned char)(f->dwFrame & 0xFF);
 sx.CDBByte[8]     = (unsigned char)(f->dwFrameCnt & 0xFF);
 sx.CDBByte[9]     = (iRType==MODE_BE_1)?0x10:0xF8;//F0!!!!!!!!!!!
 sx.CDBByte[10]    = 0x2;

 ResetEvent(hEvent );
 dwStatus=pSendASPI32Command((LPSRB)&sx);

 if(dwStatus==SS_PENDING)
  WaitGenEvent(WAITSUB);

 if(sx.SRB_Status!=SS_COMP)
  return SS_ERR;

 memcpy(&SubCData[12],&f->BufData[2352],16);

 SubCData[15]=itob(SubCData[15]);
 SubCData[16]=itob(SubCData[16]);
 SubCData[17]=itob(SubCData[17]);

 SubCData[19]=itob(SubCData[19]);
 SubCData[20]=itob(SubCData[20]);
 SubCData[21]=itob(SubCData[21]);

 return SS_COMP;
}
Beispiel #12
0
int GetSCSIDevice(int iA,int iT,int iL)
{
 SRB_GDEVBlock s;DWORD dwStatus;

 memset(&s,0,sizeof(SRB_GDEVBlock));
 s.SRB_Cmd    = SC_GET_DEV_TYPE;
 s.SRB_HaID   = iA;
 s.SRB_Target = iT;
 s.SRB_Lun    = iL;

 ResetEvent(hEvent);

 dwStatus=pSendASPI32Command((LPSRB)&s);

 if(dwStatus==SS_PENDING)
  {WaitGenEvent(30000);dwStatus=s.SRB_Status;}

 if(dwStatus==SS_COMP) return s.SRB_DeviceType;

 return -1;
}
bool CDROM_Interface_Aspi::GetVendor(BYTE HA_num, BYTE SCSI_Id, BYTE SCSI_Lun, char* szBuffer) 
{
	ASPI_SRB srbExec;
	//	SRB_ExecSCSICmd srbExec;
	memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );

	hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

	srbExec.execscsicmd.SRB_Cmd			= SC_EXEC_SCSI_CMD ;
	srbExec.execscsicmd.SRB_HaId		= HA_num;
	srbExec.execscsicmd.SRB_Flags		= SRB_DIR_IN | SRB_EVENT_NOTIFY;
	srbExec.execscsicmd.SRB_Target		= SCSI_Id;
	srbExec.execscsicmd.SRB_Lun			= SCSI_Lun;
	srbExec.execscsicmd.SRB_BufLen		= 36;
	srbExec.execscsicmd.SRB_BufPointer	= (unsigned char*)szBuffer;
	srbExec.execscsicmd.SRB_SenseLen	= SENSE_LEN;
	srbExec.execscsicmd.SRB_CDBLen		= 6;
	srbExec.execscsicmd.SRB_PostProc	= (LPVOID)hEvent;
	srbExec.execscsicmd.CDBByte [ 0 ]	= SCSI_INQUIRY;
	srbExec.execscsicmd.CDBByte [ 4 ]	= 36;  // allocation length per szBuffer [ ]

	ResetEvent(hEvent);
	int dwStatus = pSendASPI32Command ((LPSRB)&srbExec);
//	LOG(LOG_MISC|LOG_ERROR,"SCSI: Get vendor command send");					
	
	if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,30000);
//	LOG(LOG_MISC|LOG_ERROR,"SCSI: Pending done.");					

	CloseHandle(hEvent);
	if (srbExec.execscsicmd.SRB_Status != SS_COMP) {
		strcpy (szBuffer, "error" );
		return false;
	} else {
		safe_strncpy(szBuffer,szBuffer+8,26);
		int len = strlen(szBuffer);
		for (int i=0; i<len; i++) if (szBuffer[i]<=32) szBuffer[i]='_';
	};
	return true;
}
Beispiel #14
0
DWORD InitSCSI_28_2(void)
{
 SRB_ExecSCSICmd s;DWORD dwStatus;
 int i;
 BYTE init1[] = { 0, 0, 0, 0x08, 0, 0, 0, 0, 0, 0, 0x09, 0x30, 0x23, 6, 0, 0, 0, 0, 0, 0x80 };
 BYTE init2[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 1, 6, 32, 7, 0, 0, 0, 0 };

 for(i=0;i<2;i++)
  {
   memset( &s, 0, sizeof( s ) );
   s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
   s.SRB_HaId       = iCD_AD;
   s.SRB_Target     = iCD_TA;
   s.SRB_Lun        = iCD_LU;
   s.SRB_Flags      = SRB_EVENT_NOTIFY;
   s.SRB_BufLen     = 0x14;
   s.SRB_BufPointer = (i==0)?init1:init2;
   s.SRB_SenseLen   = SENSE_LEN;
   s.SRB_CDBLen     = 6;
   s.SRB_PostProc   = (LPVOID)hEvent;
   s.CDBByte[0]     = 0x15;
   s.CDBByte[1]     = 0x10;
   s.CDBByte[4]     = 0x14;

   ResetEvent(hEvent);

   dwStatus=pSendASPI32Command((LPSRB)&s);
   if (dwStatus == SS_PENDING)
    WaitGenEvent(WAITFOREVER);

   if(s.SRB_Status!=SS_COMP)
    return SS_ERR;
  }

 pDeInitFunc = DeInitSCSI_28;

 return s.SRB_Status;
}
Beispiel #15
0
int GetSCSICDDrives(char * pDList)
{
 int iCnt=0,iA,iT,iL;char * p=pDList;
 SRB_HAInquiry si;SRB_GDEVBlock sd;
 SRB_ExecSCSICmd s;int iNumA;char szBuf[100];
 DWORD dw,dwStatus;

 if(!pGetASPI32SupportInfo) return 0;

 dw=pGetASPI32SupportInfo();

 if(HIBYTE(LOWORD(dw))!=SS_COMP) return 0;
 iNumA=(int)LOBYTE(LOWORD(dw));

 for(iA=0;iA<iNumA;iA++)
  {
   memset(&si,0,sizeof(SRB_HAInquiry));
   si.SRB_Cmd  = SC_HA_INQUIRY;
   si.SRB_HaId = iA;
   pSendASPI32Command((LPSRB)&si);
   if(si.SRB_Status!=SS_COMP) continue;
   if(!si.HA_Unique[3]) si.HA_Unique[3]=8;
   for(iT=0;iT<si.HA_Unique[3];iT++)
    {
     for(iL=0;iL<8;iL++)
      {
       memset(&sd,0,sizeof(SRB_GDEVBlock));
       sd.SRB_Cmd    = SC_GET_DEV_TYPE;
       sd.SRB_HaID   = iA;
       sd.SRB_Target = iT;
       sd.SRB_Lun    = iL;

       pSendASPI32Command((LPSRB)&sd);
       if(sd.SRB_Status==SS_COMP &&
          sd.SRB_DeviceType==DTYPE_CDROM)
        {
         memset(&s,0,sizeof(s));

         s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
         s.SRB_HaId       = iA;
         s.SRB_Target     = iT;
         s.SRB_Lun        = iL;
         s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
         s.SRB_BufLen     = 100;
         s.SRB_BufPointer = szBuf;
         s.SRB_SenseLen   = SENSE_LEN;
         s.SRB_CDBLen     = 6;
         s.SRB_PostProc   = (LPVOID)hEvent;
         s.CDBByte[0]     = SCSI_INQUIRY;
         s.CDBByte[4]     = 100;
         ResetEvent(hEvent);
         dwStatus=pSendASPI32Command((LPSRB)&s);
         if(dwStatus==SS_PENDING)
          WaitGenEvent(WAITFOREVER);
         if(s.SRB_Status==SS_COMP)
          {
           int i;
           for(i=8 ;i<15;i++) if(szBuf[i]==' ') {szBuf[i]=0;break;}
           szBuf[15]=0;
           for(i=16;i<32;i++) if(szBuf[i]==' ') {szBuf[i]=0;break;}
           szBuf[31]=0;
           for(i=32;i<37;i++) if(szBuf[i]==' ') {szBuf[i]=0;break;}
           szBuf[36]=0;
           wsprintf(p,"[%d:%d:%d] %s %s V%s",
            iA,iT,iL,&szBuf[8],&szBuf[16],&szBuf[32]);
           iCnt++;
           p+=strlen(p)+1;
          }
        }
      }
    }
  }
 return iCnt;
}