// G_SCSI.CPP #include #include "wnaspi32.h" #include #include /* COMMAND CDBLEN CDB-------------------------------------------------------------------*/ BYTE Inquiry[7] = {0x06, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00}; BYTE ModeSense[7] = {0x06, 0x1A, 0x00, 0x3E, 0x00, 0x00, 0x00}; BYTE ModeSense3d[11] = {0x0A, 0x5A, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; BYTE RAIDSensePage1[13] = {0x0C, 0xDA, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; BYTE RAIDSensePage2[13] = {0x0C, 0xDA, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; int main(int argc, char **argv){ DWORD ASPIStatus; SRB_ExecSCSICmd *ExecSCSICmd; BYTE *Buffer = new BYTE[0x8000]; BYTE Target; BYTE Host; WORD i, j, loop; DWORD Length; BOOL Get_Length; BYTE *CDB; BYTE Func; if( argc < 4 ){ fprintf(stdout,"usage: %s \n", argv[0]); return (-1); } Host = (BYTE)atoi(argv[1]); Target = (BYTE)atoi(argv[2]); Func = (BYTE)atoi(argv[3]); if(Func > 4) { fprintf(stdout,"Invalid Function Error\n"); return(-1); } ASPIStatus = GetASPI32SupportInfo(); //fprintf(stdout,"A=%x\n", ASPIStatus); switch( HIBYTE(LOWORD(ASPIStatus)) ){ case SS_COMP: /* * ASPI for Win32 is properly initialized */ //NumAdapters = LOBYTE(LOWORD(ASPIStatus)); break; default: fprintf(stdout,"FF"); //fprintf(stdout,"ASPI for Win32 is not initialized!!\n"); return(-1); } switch(Func){ case 0: CDB = Inquiry; Length = 32L; Get_Length = FALSE; break; case 1: CDB = ModeSense; Length = 1L; Get_Length = TRUE; break; case 2: CDB = RAIDSensePage1; Length = 1L; Get_Length = TRUE; break; case 3: CDB = RAIDSensePage2; Length = 1L; Get_Length = TRUE; break; case 4: CDB = ModeSense3d; Length = 2L; Get_Length = TRUE; break; } if(Get_Length == TRUE) loop = 1; else loop = 0; for( i = 0; i <= loop; i++) { ExecSCSICmd = new SRB_ExecSCSICmd; ExecSCSICmd->SRB_Cmd = SC_EXEC_SCSI_CMD; ExecSCSICmd->SRB_HaId = Host; ExecSCSICmd->SRB_Flags = SRB_DIR_IN; ExecSCSICmd->SRB_Hdr_Rsvd = 0; ExecSCSICmd->SRB_Target = Target; ExecSCSICmd->SRB_Lun = 0; ExecSCSICmd->SRB_BufLen = Length; ExecSCSICmd->SRB_SenseLen = SENSE_LEN; ExecSCSICmd->SRB_BufPointer = Buffer; ExecSCSICmd->SRB_CDBLen = *CDB; ExecSCSICmd->SRB_PostProc = 0; for(j = 0; j < *CDB; j++) { ExecSCSICmd->CDBByte[j] = CDB[j+1]; } switch(*CDB){ case 0x06: ExecSCSICmd->CDBByte[4] = (BYTE)(0x000000FF & Length); break; case 0x0A: ExecSCSICmd->CDBByte[7] = (BYTE)((0x0000FF00 & Length)>> 8); ExecSCSICmd->CDBByte[8] = (BYTE)(0x000000FF & Length); break; case 0x0C: ExecSCSICmd->CDBByte[8] = (BYTE)((0x0000FF00 & Length)>> 8); ExecSCSICmd->CDBByte[9] = (BYTE)(0x000000FF & Length); break; } ASPIStatus = SendASPI32Command (ExecSCSICmd); while(ExecSCSICmd->SRB_Status == SS_PENDING); // Polling switch(ExecSCSICmd->SRB_Status){ case SS_COMP: break; case SS_ERR: fprintf(stdout,"04 %02x %02x %02x", (ExecSCSICmd->SenseArea[2] & 0x0F), ExecSCSICmd->SenseArea[12], ExecSCSICmd->SenseArea[13]); return(-1); default: fprintf(stdout,"%02X", ExecSCSICmd->SRB_Status); return(-1); } switch(Func) { case 0: case 1: case 2: case 3: if(Get_Length == TRUE) Length = Buffer[0]+1; break; case 4: if(Get_Length == TRUE) Length = Buffer[0]*0x100+Buffer[1]+1; } } switch(Func) { case 0: case 1: case 2: case 3: fprintf(stdout,"00 "); for( i = 0; i < Length; i++) fprintf(stdout,"%02X ", Buffer[i]); break; case 4: fprintf(stdout,"00"); for( i = 105; i < Length; i++) { if(!fmod(i-105,16)) printf(":"); fprintf(stdout,"%c", Buffer[i]); } } return(0); }