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