/* WinSCSIInfo.c ** ** SCRAMmer V37.3 - 27th Aug 1992 ** ------------------------------ ** ** Copyright (c) Giuliano C. Peritore ** Via Amaseno, 6 ** 04100 Latina ** ITALY ** ** Phone: (+39) 773 491692 Voice Only ** EMAIL mc6040@mclink.it */ #include #include #include #include #include #include #include #include #include #include #include #include "SCRAMmer.h" VOID ShadowText(UWORD ,UWORD, struct RastPort *,char *msg); VOID NormalText(UWORD ,UWORD, struct RastPort *,char *msg); LONG request_user(struct Window *,char *, char *, char *); VOID CloseWindowSafely(struct Window *); IMPORT struct IntuitionBase *IntuitionBase; IMPORT struct GfxBase *GfxBase; IMPORT struct Window *main_window; IMPORT struct Screen *def_pub_scr; IMPORT struct MsgPort *userport; IMPORT struct TextFont *tf; IMPORT struct TextAttr ta; IMPORT UWORD xfnt,yfnt,bfnt; IMPORT APTR vi; struct Window *scsi_win=0; static struct RastPort *rport; VOID refresh_scsi(VOID) { #include #define MAX_DATA_LEN 252 #define SENSE_LEN 252 static struct CMD_INQUIRY { UBYTE cmd; UBYTE pad_a[3]; UBYTE len; UBYTE pad_b; } command_inq = { SCSI_CMD_INQ, 0, 0, 0, MAX_DATA_LEN, 0 }; static struct CMD_READ_CAPACITY { UBYTE cmd; UBYTE pad_a; ULONG lba; UBYTE pad_b[2]; UBYTE pmi; UBYTE pad_c; } command_rc= { SCSI_CMD_RCP, 0, 0, /* start from sec 0 */ 0, 0, 0, 0 }; char buf[]="12345678901234567890123456789012345678"; struct MsgPort *mp_ptr; struct IOStdReq *io_ptr; struct SCSICmd scsi_cmd; ULONG scsi_id; UBYTE *scsi_data, *scsi_sense; ShadowText(X_SEP,Y_SEP+bfnt,rport,GetString(MSG_SCSI1)); if(scsi_data=AllocMem(MAX_DATA_LEN,MEMF_CHIP|MEMF_CLEAR)) { if(scsi_sense=AllocMem(SENSE_LEN,MEMF_CHIP|MEMF_CLEAR)) { if(mp_ptr=CreateMsgPort()) { if(io_ptr=CreateIORequest(mp_ptr,sizeof(struct IOStdReq))) { for(scsi_id=0;scsi_id<7;scsi_id++) { if(!OpenDevice("scsi.device",scsi_id,io_ptr,0)) { io_ptr->io_Command =HD_SCSICMD; io_ptr->io_Length =sizeof(struct SCSICmd); io_ptr->io_Data =(APTR) & scsi_cmd; scsi_cmd.scsi_Data =(UWORD *) scsi_data; scsi_cmd.scsi_Length =MAX_DATA_LEN; scsi_cmd.scsi_Command =(UBYTE *) & command_rc; scsi_cmd.scsi_CmdLength =sizeof (command_rc); scsi_cmd.scsi_Flags =SCSIF_READ | SCSIF_AUTOSENSE; scsi_cmd.scsi_SenseData =scsi_sense; scsi_cmd.scsi_SenseLength =SENSE_LEN; DoIO(io_ptr); if(io_ptr->io_Error) { sprintf(buf,"%1.1d ?\0",scsi_id); NormalText(X_SEP,Y_SEP+bfnt+yfnt*(scsi_id+1),rport,buf); } else { sprintf(buf,"%1.1d %10.10d\0",scsi_id,((*((ULONG*)&scsi_data[0]))*(*((ULONG*)&scsi_data[4])))); NormalText(X_SEP,Y_SEP+bfnt+yfnt*(scsi_id+1),rport,buf); } io_ptr->io_Command =HD_SCSICMD; io_ptr->io_Length =sizeof(struct SCSICmd); io_ptr->io_Data =(APTR) & scsi_cmd; scsi_cmd.scsi_Data =(UWORD *) scsi_data; scsi_cmd.scsi_Length =MAX_DATA_LEN; scsi_cmd.scsi_Command =(UBYTE *) & command_inq; scsi_cmd.scsi_CmdLength =sizeof (command_inq); scsi_cmd.scsi_Flags =SCSIF_READ | SCSIF_AUTOSENSE; scsi_cmd.scsi_SenseData =scsi_sense; scsi_cmd.scsi_SenseLength =SENSE_LEN; DoIO(io_ptr); if(io_ptr->io_Error) NormalText(X_SEP+xfnt*13,Y_SEP+bfnt+yfnt*(scsi_id+1),rport,"?"); else { *(scsi_data+32)=0; sprintf(buf,"%s\0",scsi_data+8); NormalText(X_SEP+xfnt*13,Y_SEP+bfnt+yfnt*(scsi_id+1),rport,buf); } CloseDevice(io_ptr); } else { sprintf(buf,"%1.1d -\0",scsi_id); NormalText(X_SEP,Y_SEP+bfnt+yfnt*(scsi_id+1),rport,buf); NormalText(X_SEP+xfnt*13,Y_SEP+bfnt+yfnt*(scsi_id+1),rport,GetString(MSG_SCSI2)); } } DeleteIORequest(io_ptr); } else request_user(scsi_win,GetString(MSG_SCSIWIN),GetString(MSG_NOIOSTDREQ),GetString(MSG_CANCEL)); DeleteMsgPort(mp_ptr); } else request_user(scsi_win,GetString(MSG_SCSIWIN),GetString(MSG_NOMSGPORT),GetString(MSG_CANCEL)); FreeMem (scsi_sense,SENSE_LEN); } else request_user(scsi_win,GetString(MSG_SCSIWIN),GetString(MSG_NOSCSISENSE),GetString(MSG_CANCEL)); FreeMem(scsi_data,MAX_DATA_LEN); } else request_user(scsi_win,GetString(MSG_SCSIWIN),GetString(MSG_NOSCSIDATA),GetString(MSG_CANCEL)); } VOID open_scsi(VOID) { UWORD w,h; w=(X_SEP*2) + 38*xfnt + (def_pub_scr->WBorLeft) + (def_pub_scr->WBorRight); h=(Y_SEP*2) + 8*yfnt + (def_pub_scr->WBorBottom) + (def_pub_scr->WBorTop) + (def_pub_scr->Font->ta_YSize) + 1; if(scsi_win=OpenWindowTags(NULL, WA_Left, (def_pub_scr->Width-w)>>2, WA_Top, (def_pub_scr->Height-h)>>2, WA_Width, w, WA_Height, h, WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO|WFLG_SIMPLE_REFRESH, WA_AutoAdjust, FALSE, WA_IDCMP, NULL, WA_Title, GetString(MSG_SCSIWIN), WA_PubScreen, def_pub_scr,TAG_END)) { rport=scsi_win->RPort; SetFont(rport,tf); scsi_win->UserPort=userport; ModifyIDCMP(scsi_win,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW); refresh_scsi(); } else request_user(main_window,GetString(MSG_SCRAMMER),GetString(MSG_NOWINDOW),GetString(MSG_CANCEL)); } VOID close_scsi(VOID) { if(scsi_win) { CloseWindowSafely(scsi_win); scsi_win=0; } }