NtInitializeEnclave
NTSTATUS __stdcall NtInitializeEnclave(
PVOID ProcessHandle,
PVOID BaseAddress,
PVOID EnclaveInformation,
UINT64 EnclaveInformationLength,
UINT64 *EnclaveError){
UINT64 v5;
UINT8 *v8;
KPROCESSOR_MODE v9;
__int64 v10;
NTSTATUS v11;
UINT8 *v12;
_ETHREAD *CurrentThread;
_EPROCESS *v14;
PVOID v15;
KPROCESSOR_MODE v17;
PVOID Object;
UINT8 *v19;
PVOID v20;
UINT64 *v21;
UINT64 a2;
struct _KAPC_STATE ApcState;
v5 = (unsigned int)EnclaveInformationLength;
a2 = (UINT64)BaseAddress;
v20 = ProcessHandle;
v21 = EnclaveError;
memset(&ApcState, 0, sizeof(ApcState));
Object = 0i64;
v8 = 0i64;
v19 = 0i64;
v9 = *((_BYTE *)KeGetCurrentThread() + 562);
v17 = v9;
if( EnclaveError && v9 == 1 )
{
v10 = (__int64)EnclaveError;
if( (unsigned __int64)EnclaveError >= 0x7FFFFFFF0000i64 )
v10 = 0x7FFFFFFF0000i64;
*(_DWORD *)v10 = *(_DWORD *)v10;
}
if( !(_DWORD)EnclaveInformationLength )
goto LABEL_18;
if( (unsigned int)EnclaveInformationLength <= 0x1000 )
{
LODWORD(v12) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
v8 = v12;
v19 = v12;
if( !v12 )
{
v11 = -1073741670;
goto LABEL_23;
}
if( v17 == 1
&& v5 - 1 > 0xFFFE
&& (_DWORD)v5
&& ((unsigned __int64)EnclaveInformation + v5 > 0x7FFFFFFF0000i64
|| (char *)EnclaveInformation + v5 < EnclaveInformation) )
{
MEMORY[0x7FFFFFFF0000] = 0;
}
memmove(v12, (UINT8 *)EnclaveInformation, v5);
v9 = v17;
LABEL_18:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v14 = (_EPROCESS *)*((_QWORD *)CurrentThread + 23);
if( ProcessHandle == (PVOID)-1i64 )
{
Object = (PVOID)*((_QWORD *)CurrentThread + 23);
}
else
{
v11 = ObReferenceObjectByHandleWithTag(
ProcessHandle,
8u,
(POBJECT_TYPE)PsProcessType,
v9,
0x6D566D4Du,
&Object,
0i64);
if( v11 < 0 )
goto LABEL_23;
KeStackAttachProcess((PRKPROCESS)Object, &ApcState);
}
v11 = MiInitializeEnclave(v14, a2, v8, v5);
goto LABEL_23;
}
v11 = -1073741820;
LABEL_23:
v15 = Object;
if( Object && ProcessHandle != (PVOID)-1i64 )
{
KeUnstackDetachProcess(&ApcState);
ObfDereferenceObjectWithTag(v15, 0x6D566D4Dui64);
}
if( EnclaveError )
*(_DWORD *)EnclaveError = 0;
if( v8 )
ExFreePoolWithTag(v8, 0);
return v11;
}Referenced by:
No references.