SmKmStoreHelperWaitForCommand

NTSTATUS __stdcall SmKmStoreHelperWaitForCommand(
        _SMKM_STORE_HELPER *Helper,
        _SMKM_STORE_HELPER_PARAMS *Results,
        _LARGE_INTEGER *Timeout,
        UINT64 CancelOnTimeout){
  int v4; 
  _KEVENT *v5; 
  NTSTATUS v9; 
  _SMKM_STORE_HELPER v10; 
  signed __int32 v12; 

  v4 = CancelOnTimeout;
  v5 = (_KEVENT *)(Helper + 8);
  while( 1 )
  {
    v9 = KeWaitForSingleObject((UINT64)v5, 0, 0, 0, (INT64)Timeout);
    if( !v9 )
      break;
    if( !v4 )
      return v9;
    v12 = Helper[14];
    if( (v12 & 1) == 0 && (_InterlockedCompareExchange(Helper + 14, v12 | 2, v12) & 1) == 0 )
      return -1073741536;
  }
  KeResetEvent(v5);
  if( Results )
  {
    *(_OWORD *)Results = *((_OWORD *)Helper + 4);
    *((_OWORD *)Results + 1) = *((_OWORD *)Helper + 5);
    *((_OWORD *)Results + 2) = *((_OWORD *)Helper + 6);
  }
  v10 = Helper[14];
  Helper[14] = 0;
  return(v10 & 2) != 0 ? 0xC0000120 : 0;
}

Referenced by:

SMKM_STORE::SmStHelperSendCommand
SmKmStoreHelperCheckWaitCommand