PspAttachThreadToUmsCompletionList

NTSTATUS __stdcall PspAttachThreadToUmsCompletionList(INT64 a1, INT64 a2){
  _ETHREAD *CurrentThread; 
  _ETHREAD *v5; 
  __int64 UmsContextExtendedSize; 
  unsigned __int8 v7; 
  INT8 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  NTSTATUS result; 
  int v12; 
  __int128 Handle; 
  PVOID Object; 

  CurrentThread = (_ETHREAD *)a1;
  if( !a1 )
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (char)CurrentThread->Tcb.gap0[3] < 0 )
    return -1073741637;
  v5 = (_ETHREAD *)a1;
  if( !a1 )
    v5 = (_ETHREAD *)KeGetCurrentThread();
  if( (v5->Tcb.gap0[3] & 0x40) != 0 )
    return -1073741637;
  if( (*(_QWORD *)(a2 + 8) & 3) != 0 )
    goto LABEL_20;
  UmsContextExtendedSize = (unsigned int)RtlGetUmsContextExtendedSize();
  v10 = *(_QWORD *)(a2 + 16);
  if( (unsigned __int64)(UmsContextExtendedSize - 1) > 0xFFFE )
  {
    if( !UmsContextExtendedSize )
      goto LABEL_16;
    if( ((unsigned __int8)v10 & v7) == 0 )
    {
      if( v10 + UmsContextExtendedSize > v9 || v10 + UmsContextExtendedSize < v10 )
        MEMORY[0x7FFFFFFF0000] = 0;
      goto LABEL_16;
    }
LABEL_20:
    ExRaiseDatatypeMisalignment();
  }
  if( ((unsigned __int8)v10 & v7) != 0 )
    goto LABEL_20;
LABEL_16:
  Handle = *(_OWORD *)*(_QWORD *)(a2 + 8);
  Object = 0i64;
  result = ObReferenceObjectByHandle(
             *((VOID **)&Handle + 1),
             2ui64,
             (_OBJECT_TYPE *)ExEventObjectType,
             v8,
             &Object,
             0i64);
  if( result >= 0 )
  {
    v12 = KeInitializeUmsThread(a1, 0i64, Handle, (INT64)Object, *(_QWORD *)(a2 + 16));
    if( v12 < 0 )
      ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
    return v12;
  }
  return result;
}

Referenced by:

NtSetInformationThread