;*******************************************; ; ; FFAspiStart: function to initialize ASPI operations. Steps performed: ; ; - load WNASPI32.DLL (if it exists) ; - load the address of GetASPI32Support and SendASPI32Command ; - check ASPI support ; - check that at least one SCSI2 host adapter is installed ; - create the event used for event notification ; ; Takes one parameter, the HWND of the calling program. ; ; This function returns true if successful. Otherwise it sends an error ; message in a messagebox and returns false. ; ;*******************************************; FFAspiStart PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 ; POP ashWnd ; ;===========================================; INVOKE LoadLibrary, ADDR szAspiDllName MOV hAspiLib, EAX CMP EAX,0 JNZ ASTA_1 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_1, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ASTA_1: INVOKE GetProcAddress, hAspiLib, ADDR szGetASPI32SupportInfo MOV fnGetASPI32SupportInfo,EAX CMP EAX,0 JNZ ASTA_2 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_2, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ASTA_2: INVOKE GetProcAddress, hAspiLib, ADDR szSendASPI32Command MOV fnSendASPI32Command,EAX CMP EAX,0 JNZ ASTA_3 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_3, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;-------------------------------------------;check ASPI support ASTA_3: MOV EAX,fnGetASPI32SupportInfo CALL EAX ;...........................................;OK !!! CMP AH,SS_COMP JZ ASTA_OK ;...........................................;support not present CMP AH,SS_NO_ASPI JNZ ASTA_4 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_4, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;...........................................;real mode ASTA_4: CMP AH,SS_ILLEGAL_MODE JNZ ASTA_5 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_5, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;...........................................;old manager ASTA_5: CMP AH,SS_OLD_MANAGER JNZ ASTA_6 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_6, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;...........................................; ASTA_6: CMP AH,SS_NO_ADAPTERS JNZ ASTA_7 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_7, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;...........................................; ASTA_7: CMP AH,SS_MISMATCHED_COMPONENTS JNZ ASTA_8 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_8, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;...........................................; ASTA_8: CMP AH,SS_INSUFFICIENT_RESOURCES JNZ ASTA_9 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_9, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;...........................................; ASTA_9: CMP AH,SS_FAILED_INIT JNZ ASTA_10 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_10, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;...........................................;generic error ASTA_10: INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_11, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ;===========================================; ASTA_OK: AND EAX,0FH MOV HA_Count,EAX ;# of HA installed INVOKE CreateEvent, NULL, TRUE, FALSE, NULL MOV hEventSRB,EAX CMP EAX,0 JNZ ASTA_11 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_ASTA_12, OFFSET szCaption_ASTA, MB_OK JMP ASTA_NOK ASTA_11: MOV EAX,TRUE ;true = ASPI support OK JMP ASTA_0 ASTA_NOK: MOV EAX,FALSE JMP ASTA_0 ;===========================================; ASTA_0: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFAspiStart ENDP ;*******************************************; ; ; FFAspiStop: function to terminate ASPI operations. Steps performed: ; ; - release the event handle that has been used for event notification ; - unload WNASPI32.DLL ; ;*******************************************; FFAspiStop PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; INVOKE CloseHandle, hEventSRB INVOKE FreeLibrary, hAspiLib ;===========================================; POP EBX ; POP EBP ; POP EDI ; POP ESI ; ;===========================================; RET FFAspiStop ENDP ;*******************************************; ; ; FFSCSIBusScan: function to scan the SCSI2 bus. Checks the presence ; of SCSI2 host adapters and attached SCSI2 devices. For each device ; ID, LUN and device type are given. IDE/EIDE devices are sensed as if ; they were SCSI2 devices. ; ; Takes one parameter, the HWND of the calling program. ; ;*******************************************; FFSCSIBusScan PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 ; POP ashWnd ; ;===========================================; CALL RESET_SRB_INQUIRY MOV SRB_INQUIRY.SRB_Cmd,SC_HA_INQUIRY MOV SRB_INQUIRY.SRB_HaId,0 MOV EAX,fnSendASPI32Command PUSH OFFSET SRB_INQUIRY CALL EAX ADD ESP,4 ;absolutely required MOV AL,SRB_INQUIRY.SRB_Status CMP AL,SS_COMP JZ FFSBS_1 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_SBS_1, OFFSET szCaption_SBS, MB_OK JMP FFSBS_0 FFSBS_1: LEA ESI,SRB_INQUIRY.HA_ManagerId LEA EDI,szMsg_SBS_2 ADD EDI,25 MOV ECX,16 FFSBS_2: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP FFSBS_2 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_SBS_2, OFFSET szCaption_SBS, MB_OK ;===========================================;OUTERMOST FOR/NEXT CYCLE MOV HA_num,0 FFSBS_3: CALL RESET_SRB_INQUIRY MOV SRB_INQUIRY.SRB_Cmd,SC_HA_INQUIRY MOV EAX,HA_num MOV SRB_INQUIRY.SRB_HaId,AL MOV EAX,fnSendASPI32Command PUSH OFFSET SRB_INQUIRY CALL EAX ADD ESP,4 ;absolutely required MOV AL,SRB_INQUIRY.SRB_Status CMP AL,SS_COMP JZ FFSBS_4 ;-------------------------------------------;HA inquiry failed LEA EDI,szMsg_SBS_3 ADD EDI,20 MOV EAX,HA_num ADD AL,30H MOV [EDI],AL INVOKE MessageBoxA, ashWnd, OFFSET szMsg_SBS_3, OFFSET szCaption_SBS, MB_OK JMP FFSBS_A ;-------------------------------------------;HA inquiry OK FFSBS_4: LEA EDI,szMsg_SBS_4 ADD EDI,31 MOV EAX,HA_num ADD AL,30H MOV [EDI],AL LEA ESI,SRB_INQUIRY.HA_Identifier LEA EDI,szMsg_SBS_4 ADD EDI,34 MOV ECX,16 FFSBS_5: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP FFSBS_5 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_SBS_4, OFFSET szCaption_SBS, MB_OK ;...........................................; MOV SCSI_Id,0 MOV SCSI_Lun,0 ;-------------------------------------------;MIDDLE AND INNERMOST FOR/NEXT CYCLE FFSBS_J: CALL RESET_SRB_GDEVB MOV SRB_GDEVB.SRB_Cmd,SC_GET_DEV_TYPE MOV EAX,HA_num MOV SRB_GDEVB.SRB_HaId,AL MOV EAX,SCSI_Id MOV SRB_GDEVB.SRB_Target,AL MOV EAX,SCSI_Lun MOV SRB_GDEVB.SRB_Lun,AL MOV EAX,fnSendASPI32Command PUSH OFFSET SRB_GDEVB CALL EAX ADD ESP,4 ;absolutely required MOV AL,SRB_GDEVB.SRB_Status CMP AL,SS_COMP JNZ FFSBS_B ;........................;inquiry CALL RESET_SRB_EXEC MOV SRB_EXEC.SRB_Cmd,SC_EXEC_SCSI_CMD MOV EAX,HA_num MOV SRB_EXEC.SRB_HaId,AL MOV SRB_EXEC.SRB_Flags,SRB_DIR_IN MOV EAX,SCSI_Id MOV SRB_EXEC.SRB_Target,AL MOV EAX,SCSI_Lun MOV SRB_EXEC.SRB_Lun,AL MOV SRB_EXEC.SRB_BufLen,36 MOV SRB_EXEC.SRB_BufPointer,OFFSET szBuf_SBS_5 MOV SRB_EXEC.SRB_SenseLen,SENSE_LEN MOV SRB_EXEC.SRB_CDBLen,6 LEA EDI,SRB_EXEC.CDBByte MOV AL,SCSI_INQUIRY MOV [EDI],AL ADD EDI,4 MOV AL,36 ;szBuf_SBS_5 length MOV [EDI],AL MOV EAX,fnSendASPI32Command PUSH OFFSET SRB_EXEC CALL EAX ADD ESP,4 ;absolutely required FFSBS_6: MOV AL,SRB_EXEC.SRB_Status CMP AL,SS_COMP JZ FFSBS_7 NOP JMP FFSBS_6 ;........................;builds the message FFSBS_7: LEA EDI,szCaption_SBS_5 ;caption ADD EDI,9 MOV EAX,SCSI_Id ADD AL,30H MOV [EDI],AL ADD EDI,6 MOV EAX,SCSI_Lun ADD AL,30H MOV [EDI],AL ADD EDI,4 LEA ESI,DevicesTable MOV EAX,0 MOV AL,SRB_GDEVB.SRB_DeviceType ;0 to 9 MOV EBX,33 MUL EBX ADD ESI,EAX MOV ECX,33 FFSBS_8: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP FFSBS_8 LEA EDI,szMsg_SBS_5;message LEA ESI,szBuf_SBS_5 ADD ESI,8 MOV ECX,27 FFSBS_9: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP FFSBS_9 INVOKE MessageBoxA, ashWnd, OFFSET szMsg_SBS_5, OFFSET szCaption_SBS_5, MB_OK ;-------------------------------------------; FFSBS_B: INC SCSI_Lun MOV EAX,SCSI_Lun CMP EAX,8 JB FFSBS_J ;END INNERMOST FOR/NEXT CYCLE ;...........................................; MOV SCSI_Lun,0 ;reset SCSI_Lun INC SCSI_Id MOV EAX,SCSI_Id CMP EAX,8 JB FFSBS_J ;END MIDDLE FOR/NEXT CYCLE ;...........................................; FFSBS_A: INC HA_num MOV EAX,HA_num CMP EAX,HA_Count JB FFSBS_3 ;END OUTERMOST FOR/NEXT CYCLE ;===========================================; FFSBS_0: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFSCSIBusScan ENDP ;*******************************************; RESET_SRB_INQUIRY PROC ;===========================================; LEA EDI,SRB_INQUIRY MOV AL,0 MOV ECX,60 RSEI_1: MOV [EDI],AL INC EDI LOOP RSEI_1 ;===========================================; RET RESET_SRB_INQUIRY ENDP ;*******************************************; RESET_SRB_GDEVB PROC ;===========================================; LEA EDI,SRB_GDEVB MOV AL,0 MOV ECX,12 RSEG_1: MOV [EDI],AL INC EDI LOOP RSEG_1 ;===========================================; RET RESET_SRB_GDEVB ENDP ;*******************************************; RESET_SRB_EXEC PROC ;===========================================; LEA EDI,SRB_EXEC MOV AL,0 MOV ECX,80 RSEE_1: MOV [EDI],AL INC EDI LOOP RSEE_1 ;===========================================; RET RESET_SRB_EXEC ENDP ;*******************************************;