KeInitializeUmsThread

NTSTATUS __stdcall KeInitializeUmsThread(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5){
  int v6; 
  VOID **PoolWithTag; 
  NTSTATUS v10; 
  VOID **v11; 

  v6 = a2;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x88ui64, 1936545099i64);
  v10 = 0;
  v11 = PoolWithTag;
  if( !PoolWithTag )
    return -1073741801;
  memset(PoolWithTag + 3, 0i64, 0x70u);
  *v11 = (VOID *)a5;
  v11[1] = (VOID *)a3;
  v11[2] = (VOID *)a4;
  if( v6 )
    KeInitializeEvent((INT64)(v11 + 6), 1, 0);
  else
    KeInitializeQueue((_KQUEUE *)(v11 + 4), 1ui64);
  if( ((unsigned int)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