Event notification is an ideal mechanism for notifying ASPI clients of the completion of an ASPI request. ASPI clients may block on this event until completion. Upon completion of a request, the ASPI for Win32 manager sets the event to the signaled state. The ASPI client must make sure that the event is not in a signaled state when an ASPI command request is submitted to the ASPI for Win32 manager. Event notification is illustrated in the following code, which sends a SCSI Inquiry command to target #2.
SRB_ExecSCSICmd MySRB; HANDLE ASPICompletionEvent; DWORD ASPIEventStatus; DWORD ASPIStatus; char InquiryBuffer[32]; . /**************************************************/ /* Create event for MySRB. Initial state */ /* non-signaled, manual reset. */ /**************************************************/ if ((ASPICompletionEvent = CreateEvent(NULL,FALSE,FALSE,NULL)) == NULL) return FALSE; /**************************************************/ /* Code is entered with 'MySRB' zeroed. */ /**************************************************/ MySRB.SRB_Cmd = SC_EXEC_SCSI_CMD; MySRB.SRB_Flags = SRB_DIR_SCSI|SRB_EVENT_NOTIFY; MySRB.SRB_Target = 2; MySRB.SRB_BufLen = 32; MySRB.SRB_SenseLen = SENSE_LEN; MySRB.SRB_BufPointer = InquiryBuffer; MySRB.SRB_CDBLen = 6; MySRB.CDBByte[0] = SCSI_INQUIRY; MySRB.CDBByte[4] = 32; MySRB.SRB_PostProc = ASPICompletionEvent; . . ASPIStatus = SendASPI32Command ( (LPSRB) &MySRB ); /**************************************************/ /* Block on event till signaled */ /**************************************************/ if ( MySRB.SRB_Status == SS_PENDING ) ASPIEventStatus == WaitForSingleObject(ASPICompletionEvent, TIMEOUT); /**************************************************/ /* Reset event to non-signaled state. */ /**************************************************/ if (ASPIEventStatus == WAIT_OBJECT_0) ResetEvent(ASPICompletionEvent); . .