KeInitializeUmsThread

INT64 __fastcall KeInitializeUmsThread(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5){
  int v6; 
  char *PoolWithTag; 
  unsigned int v10; 
  char *v11; 
  v6 = a2;
  PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x88ui64, 0x736D554Bui64);
  v10 = 0;
  v11 = PoolWithTag;
  if( !PoolWithTag )
    return 3221225495i64;
  memset((INT64)(PoolWithTag + 24), 0i64);
  *(_QWORD *)v11 = a5;
  *((_QWORD *)v11 + 1) = a3;
  *((_QWORD *)v11 + 2) = a4;
  if( v6 )
    KeInitializeEvent((_KEVENT *)v11 + 2, SynchronizationEvent, 0);
  else
    KeInitializeQueue((_KQUEUE *)(v11 + 32), 1ui64);
  if( (KeFeatureBits & 0x10000000) != 0 )
  {
    *(_QWORD *)(a1 + 496) = v11;
    *(_QWORD *)(a1 + 504) = -1i64;
    _interlockedbittestandset((volatile signed __int32 *)a1, 31 - (v6 != 0));
  }
  else
  {
    v10 = -1073741637;
    ExFreePoolWithTag(v11, 0);
  }
  return v10;
}

Referenced by:

PspAttachThreadToUmsCompletionList
PspUmsInitThread