// SAMPLE CODE TO RESET THE SCSI BUS // A) INCLUDE THE FOLLOWING THINGS INTO THE HEADER: - WNASPI32.H (http://www.hochfeiler.it/alvise/WNASPI32.H) - DWORD ( __stdcall *pfnSendASPI32Command )( LPSRB psrb ); // B) C++ CODE: // declarations Screen -> Cursor = crHourGlass; char ADAP_ID [ 2 ]; BYTE Adap_Id; BYTE myDevice_Id; int SenseKey; int ASC; int ASCQ; SRB_BusDeviceReset srbReset; // load WNASPI32.DLL HGLOBAL WnASPI32DllHandle = LoadLibrary ( "WNASPI32.DLL" ); if ( WnASPI32DllHandle == 0 ) { MessageBox ( NULL, "LoadLibrary:\nWNASPI32.DLL not found.", "Error FS 002", MB_ICONSTOP ); return; } // load the address of SendASPI32Command pfnSendASPI32Command = ( DWORD ( __stdcall *)( LPSRB psrb ) ) GetProcAddress ( WnASPI32DllHandle, "SendASPI32Command" ); if ( pfnSendASPI32Command == NULL ) { MessageBox ( NULL, "GetProcAddress:\npfnSendASPI32Command not found.", "Error FS 004", MB_ICONSTOP ); return; } // create an event handle HANDLE hEventSRB = CreateEvent ( NULL, true, false, NULL ); if ( !hEventSRB ) { MessageBox ( NULL, "Could not create the event object.", "Error FS 005", MB_ICONEXCLAMATION ); return; } // reset the SCSI bus memset ( &srbReset, 0, sizeof ( SRB_BusDeviceReset ) ); srbReset . SRB_Cmd = SC_RESET_DEV; srbReset . SRB_HaId = 0; // host adapter # 0 srbReset . SRB_Flags = SRB_EVENT_NOTIFY; srbReset . SRB_Target = 2; // SCSI ID = 2 srbReset . SRB_PostProc = ( LPVOID ) hEventSRB; ResetEvent ( hEventSRB ); pfnSendASPI32Command ( ( LPSRB ) &srbReset ); if ( srbReset . SRB_Status == SS_PENDING ) WaitForSingleObject ( hEventSRB, INFINITE ); if ( srbReset . SRB_Status == SS_COMP ) { int iRetCode = 0; // OK } else { int iRetCode = 1; // NOK } // unload WNASPI32.DLL FreeLibrary ( WnASPI32DllHandle ); // release the event handle and terminate CloseHandle ( hEventSRB ); Screen -> Cursor = crDefault; return iRetCode;