NtSignalAndWaitForSingleObject

NTSTATUS __stdcall NtSignalAndWaitForSingleObject(
        VOID *SignalHandle,
        VOID *WaitHandle,
        UINT8 Alertable,
        _LARGE_INTEGER *Timeout){
  char PreviousMode; 
  _LARGE_INTEGER *v7; 
  __int64 v8; 
  int v9; 
  __int64 v10; 
  VOID *WaitObject; 
  POBJECT_TYPE *v12; 
  UINT64 Tag; 
  UINT64 Taga; 
  PVOID Object; 
  _OBJECT_HANDLE_INFORMATION HandleInformation; 
  PVOID v18; 
  LONGLONG v19; 

  HandleInformation = 0i64;
  Object = 0i64;
  v19 = 0i64;
  v18 = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  v7 = Timeout;
  if( Timeout && PreviousMode )
  {
    v8 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)Timeout < 0x7FFFFFFF0000i64 )
      v8 = (__int64)Timeout;
    v19 = *(_QWORD *)v8;
    v7 = (_LARGE_INTEGER *)&v19;
  }
  LODWORD(Tag) = 1951883855;
  v9 = ObReferenceObjectByHandleWithTag(SignalHandle, 0i64, 0i64, PreviousMode, Tag, &Object, &HandleInformation);
  if( v9 >= 0 )
  {
    LODWORD(Taga) = 1951883855;
    v9 = ObReferenceObjectByHandleWithTag(WaitHandle, 0x100000ui64, 0i64, PreviousMode, Taga, &v18, 0i64);
    if( v9 < 0 )
    {
LABEL_23:
      ObfDereferenceObjectWithTag(Object, 0x7457624Fui64);
      return v9;
    }
    WaitObject = ObpGetWaitObject((_OBJECT_HEADER *)((char *)v18 - 48));
    if( !*(&WheapDeferredInternalLogsEventLock + 56)
      || ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(v10 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)(v10 - 48) >> 8)] != *(&WheapDeferredInternalLogsEventLock + 56) )
    {
      v12 = (POBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8)];
      v9 = -1073741790;
      if( v12 == ExEventObjectType )
      {
        if( PreviousMode && (~LOBYTE(HandleInformation.GrantedAccess) & 2) != 0 )
          goto LABEL_22;
        KeSetEvent((PRKEVENT)Object, 1, 1u);
        goto LABEL_20;
      }
      if( v12 == (POBJECT_TYPE *)ExMutantObjectType )
      {
        KeReleaseMutant((_KMUTANT *)Object, 1i64, 0, 1u);
LABEL_20:
        v9 = KeWaitForSingleObject((UINT64)WaitObject, 6, PreviousMode, Alertable, (INT64)v7);
LABEL_22:
        ObfDereferenceObjectWithTag(v18, 0x7457624Fui64);
        goto LABEL_23;
      }
      if( v12 == ExSemaphoreObjectType )
      {
        if( PreviousMode && (~LOBYTE(HandleInformation.GrantedAccess) & 2) != 0 )
          goto LABEL_22;
        KeReleaseSemaphore((_KSEMAPHORE *)Object, 1i64, 1i64, 1u);
        goto LABEL_20;
      }
    }
    v9 = -1073741788;
    goto LABEL_22;
  }
  return v9;
}

Referenced by:

No references.