Newer
Older
AMI-Aptio-BIOS-Reversed / DxeCore / Event / Event.c
@Ajax Dong Ajax Dong 2 days ago 9 KB Init
#include "../uefi_headers/Uefi.h"

// ==================================================================
// DXE Event and Timer Services
// Source: MdeModulePkg/Core/Dxe/Event/Event.c
// ==================================================================

// SetTimer
// SetTimer -- Set a timer event (timer delta)
//
unsigned __int64 __fastcall SetTimer(__int16 n512, __int64 n8, __int64 sub_A488, __int64 *i, __int64 *a5)
{
  if ( (n512 & 0x300) != 0 && (((n8 - 4) & 0xFFFFFFFFFFFFFFF3uLL) != 0 || n8 == 12) ) /*0xaa1c*/
    return 0x8000000000000002uLL; /*0xaa1e*/
  else
    return RegRegister(n512, n8, sub_A488, (__int64)i, 0, a5); /*0xaa3a*/
}

// SignalEvent
// SignalEvent -- Signal an event
//
unsigned __int64 __fastcall SignalEvent(int n513, __int64 n12, __int64 a3, __int64 a4, __int64 *a5, __int64 *a6)
{
  if ( (n513 & 0x300) != 0 && (((n12 - 4) & 0xFFFFFFFFFFFFFFF3uLL) != 0 || n12 == 12) ) /*0xaa5c*/
    return 0x8000000000000002uLL; /*0xaa5e*/
  else
    return RegRegister((unsigned __int16)n513, n12, a3, a4, a5, a6); /*0xaa69*/
}

// CoreCreateEvent
// CoreCreateEvent / CreateEventEx -- Create and register a new event
//
unsigned __int64 __fastcall CoreCreateEvent(int n513, __int64 a2, __int64 a3, __int64 a4, __int64 *a5, __int64 *a6)
{
  double v6; // xmm3_8
  __int64 v8; // r14
  int n513_1; // edi
  unsigned __int64 n0x20; // rax
  __int64 *v13; // rsi
  __int64 *v14; // rax
  unsigned int n6; // ecx
  char *Info_19; // rax
  __int64 v17; // r8
  __int64 Info; // rbx
  __int64 v19; // rdx
  __int64 v20; // r8
  __int64 v21; // rdx
  __int64 v22; // r8

  v8 = a3; /*0xaa94*/
  n513_1 = n513; /*0xaa9a*/
  if ( !a6 ) /*0xaa9f*/
    return 0x8000000000000002uLL; /*0xaa9f*/
  n0x20 = 0; /*0xaab0*/
  while ( n513 != *(_DWORD *)((char *)&unk_1EB20 + n0x20) ) /*0xaabc*/
  {
    n0x20 += 4LL; /*0xaabe*/
    if ( n0x20 >= 0x20 ) /*0xaac6*/
      return 0x8000000000000002uLL; /*0xaac6*/
  }
  v13 = a5; /*0xaaca*/
  if ( a5 ) /*0xaad7*/
  {
    if ( n513 == 513 || n513 == 1610613250 ) /*0xaae4*/
      return 0x8000000000000002uLL; /*0xaae4*/
    if ( Assert_103((__int64)a5, (__int64)&qword_226B0, a3, v6) ) /*0xaaf0*/
    {
      n513_1 = 513; /*0xaaf9*/
    }
    else if ( Assert_103((__int64)a5, (__int64)&unk_22720, a3, v6) ) /*0xab07*/
    {
      n513_1 = 1610613250; /*0xab10*/
    }
  }
  else if ( n513 == 513 ) /*0xab16*/
  {
    v13 = &qword_226B0; /*0xab18*/
  }
  else
  {
    v14 = (__int64 *)&unk_22720; /*0xab26*/
    if ( n513 != 1610613250 ) /*0xab2f*/
      v14 = 0; /*0xab2f*/
    v13 = v14; /*0xab33*/
  }
  if ( (n513_1 & 0x300) != 0 ) /*0xab3c*/
  {
    if ( !v8 || (unsigned __int64)(a2 - 5) > 0x19 ) /*0xab4f*/
      return 0x8000000000000002uLL; /*0xaaab*/
  }
  else
  {
    a2 = 0; /*0xab56*/
    v8 = 0; /*0xab59*/
    a4 = 0; /*0xab5c*/
  }
  n6 = 6; /*0xab66*/
  if ( (n513_1 & 0x40000000) == 0 ) /*0xab71*/
    n6 = 4; /*0xab73*/
  Info_19 = GetInfo_19(n6, 0xB8u, a3, v6); /*0xab78*/
  Info = (__int64)Info_19; /*0xab7d*/
  if ( !Info_19 ) /*0xab83*/
    return 0x8000000000000009uLL; /*0xab85*/
  *(_QWORD *)Info_19 = 1953396325; /*0xab94*/
  *((_DWORD *)Info_19 + 2) = n513_1; /*0xab9b*/
  *((_QWORD *)Info_19 + 4) = a2; /*0xab9e*/
  *((_QWORD *)Info_19 + 5) = v8; /*0xaba2*/
  *((_QWORD *)Info_19 + 6) = a4; /*0xaba6*/
  if ( v13 ) /*0xabad*/
  {
    Assert_108((_QWORD *)Info_19 + 7, (__int64)v13, v17, v6); /*0xabb6*/
    *(_BYTE *)(Info + 88) |= 1u; /*0xabbb*/
  }
  *a6 = Info; /*0xabbf*/
  Assert_3(0x80000, "Registering Notify Function %p; Type = 0x%X\n", *(const void **)(Info + 40), *(_DWORD *)(Info + 8)); /*0xabd7*/
  if ( (n513_1 & 0x40000000) != 0 ) /*0xabde*/
  {
    *(_DWORD *)(Info + 96) = n513_1; /*0xabe0*/
    *(_QWORD *)(Info + 104) = a2; /*0xabea*/
    *(_QWORD *)(Info + 112) = v8; /*0xabee*/
    *(_QWORD *)(Info + 120) = a4; /*0xabf2*/
    *(_QWORD *)(Info + 128) = Info; /*0xabf6*/
    Assert_53(off_22838 + 2, (_QWORD *)(Info + 136), v20, v6); /*0xac08*/
  }
  DxeGetInfo_8((__int64)&unk_26088, v19, v20, v6); /*0xac14*/
  if ( (n513_1 & 0x200) != 0 ) /*0xac1d*/
    Assert_54((__int64 *)&i_6, (__int64 *)(Info + 16), v22, v6); /*0xac2a*/
  DxeGetInfo_10((__int64)&unk_26088, v21, v22, v6); /*0xac36*/
  return 0; /*0xac4c*/
}

// CheckEvent
// CheckEvent / WaitForEvent -- Check if event is signaled
//
unsigned __int64 __fastcall CheckEvent(_UNKNOWN **i, __int64 a2, __int64 a3, double a4)
{
  __int64 v6; // rdx
  __int64 v7; // r8
  bool v8; // zf
  __int64 v9; // rdx
  __int64 v10; // r8
  __int64 v11; // rdx
  __int64 v12; // r8

  if ( !i || *i != (_UNKNOWN *)1953396325 ) /*0xac7d*/
    return 0x8000000000000002uLL; /*0xac6a*/
  DxeGetInfo_8((__int64)&unk_26088, a2, a3, a4); /*0xac86*/
  if ( !*((_DWORD *)i + 3) ) /*0xac8b*/
  {
    v8 = ((_DWORD)i[1] & 0x200) == 0; /*0xac91*/
    *((_DWORD *)i + 3) = 1; /*0xac98*/
    if ( !v8 ) /*0xac9f*/
    {
      if ( ((_BYTE)i[11] & 1) != 0 ) /*0xaca5*/
      {
        DxeGetInfo_10((__int64)&unk_26088, v6, v7, a4); /*0xacae*/
        DxeGetInfo_2((__int64)(i + 7), v9, v10, a4); /*0xacb7*/
        DxeGetInfo_8((__int64)&unk_26088, v11, v12, a4); /*0xacc3*/
      }
      else
      {
        DxeGetInfo_5(i, v6, v7, a4); /*0xaccd*/
      }
    }
  }
  DxeGetInfo_10((__int64)&unk_26088, v6, v7, a4); /*0xacd9*/
  return 0; /*0xace0*/
}

// CloseEvent
// CloseEvent -- Close/destroy an event
//
unsigned __int64 __fastcall CloseEvent(__int64 i, __int64 a2, __int64 a3, double a4)
{
  unsigned __int64 v6; // rdi
  __int64 v7; // rdx
  __int64 v8; // r8
  __int64 v9; // rdx
  __int64 v10; // r8

  if ( !i || *(_QWORD *)i != 1953396325 || (*(_DWORD *)(i + 8) & 0x200) != 0 ) /*0xad16*/
    return 0x8000000000000002uLL; /*0xacfa*/
  v6 = 0x8000000000000006uLL; /*0xad1c*/
  if ( !*(_DWORD *)(i + 12) && (*(_DWORD *)(i + 8) & 0x100) != 0 ) /*0xad2f*/
  {
    DxeGetInfo_8((__int64)&unk_26088, a2, a3, a4); /*0xad38*/
    if ( !*(_DWORD *)(i + 12) ) /*0xad3d*/
      DxeGetInfo_5((_UNKNOWN **)i, v7, v8, a4); /*0xad46*/
    DxeGetInfo_10((__int64)&unk_26088, v7, v8, a4); /*0xad52*/
  }
  if ( *(_DWORD *)(i + 12) ) /*0xad57*/
  {
    DxeGetInfo_8((__int64)&unk_26088, a2, a3, a4); /*0xad64*/
    if ( *(_DWORD *)(i + 12) ) /*0xad69*/
    {
      *(_DWORD *)(i + 12) = 0; /*0xad6f*/
      v6 = 0; /*0xad73*/
    }
    DxeGetInfo_10((__int64)&unk_26088, v9, v10, a4); /*0xad7c*/
  }
  return v6; /*0xad89*/
}

// CoreCreatePropertiesTable
// CoreCreateEvent (TPL notify) -- Event creation with TPL notify function
//
__int64 __fastcall CoreCreatePropertiesTable(_QWORD *a1, char *src, char *p_n6, unsigned __int64 count)
{
  double v4; // xmm3_8
  _QWORD *v7; // rax
  unsigned __int64 v8; // rdx
  _QWORD *v9; // r14
  __int64 v10; // r9
  int n6_2; // r10d
  char v12; // r11
  unsigned __int64 v13; // r15
  __int64 v14; // rdi
  __int64 v15; // rsi
  int n6; // r12d
  _QWORD *v17; // r8
  int n6_1; // eax
  unsigned __int64 v19; // rcx
  int n5; // eax
  __int64 v21; // rdx
  unsigned __int64 v22; // rcx
  unsigned __int64 v23; // rcx
  char dst[8]; // [rsp+20h] [rbp-30h] BYREF
  unsigned __int64 v26; // [rsp+28h] [rbp-28h]
  unsigned __int64 v27; // [rsp+38h] [rbp-18h]
  __int64 v28; // [rsp+40h] [rbp-10h]

  MemConfig_1(dst, p_n6, 0x28u, v4); /*0xafc1*/
  v7 = a1 + 6; /*0xafca*/
  v8 = v26; /*0xafce*/
  v9 = (_QWORD *)a1[6]; /*0xafd2*/
  v10 = v28; /*0xafd5*/
  n6_2 = *(_DWORD *)dst; /*0xafd9*/
  v12 = byte_280B8; /*0xafdd*/
  v13 = v26 + (v27 << 12); /*0xafe8*/
  v14 = 0; /*0xafeb*/
  v15 = 0; /*0xafed*/
  n6 = 6; /*0xafef*/
  while ( v9 != v7 )
  {
    v17 = v9 - 1; /*0xaffc*/
    if ( *((_DWORD *)v9 - 2) != 1129467977 ) /*0xb007*/
    {
      Assert_7( /*0xb01c*/
        (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Misc\\PropertiesTable.c",
        364,
        (__int64)"CR has Bad Signature",
        v4);
      v10 = v28; /*0xb021*/
      v7 = a1 + 6; /*0xb025*/
      v8 = v26; /*0xb029*/
      v17 = v9; /*0xb02d*/
      n6_2 = *(_DWORD *)dst; /*0xb030*/
      v12 = byte_280B8; /*0xb034*/
    }
    v9 = (_QWORD *)*v9; /*0xb03b*/
    if ( v8 <= v17[3] )
    {
      *((_QWORD *)src + 1) = v8; /*0xb047*/
      n6_1 = 6; /*0xb04b*/
      *((_QWORD *)src + 2) = 0; /*0xb04e*/
      if ( !v12 ) /*0xb052*/
        n6_1 = n6_2; /*0xb052*/
      *(_DWORD *)src = n6_1; /*0xb056*/
      v19 = (((v17[3] - v8) & 0xFFF) != 0) + ((v17[3] - v8) >> 12); /*0xb071*/
      *((_QWORD *)src + 3) = v19; /*0xb07c*/
      *((_QWORD *)src + 4) = v10 | 0x4000; /*0xb080*/
      if ( v19 ) /*0xb087*/
      {
        src += count; /*0xb089*/
        ++v15; /*0xb08d*/
      }
      n5 = 5; /*0xb093*/
      if ( !v12 ) /*0xb098*/
        n5 = n6_2; /*0xb098*/
      *(_DWORD *)src = n5; /*0xb09c*/
      *((_QWORD *)src + 1) = v17[3]; /*0xb0a2*/
      *((_QWORD *)src + 2) = 0; /*0xb0a9*/
      v21 = ((v17[4] & 0xFFFLL) != 0) + (v17[4] >> 12); /*0xb0bb*/
      *((_QWORD *)src + 3) = v21; /*0xb0c7*/
      *((_QWORD *)src + 4) = v10 & 0xFFFFFFFFFFFDBFFFuLL | 0x20000; /*0xb0d0*/
      if ( v21 ) /*0xb0d7*/
      {
        src += count; /*0xb0d9*/
        ++v15; /*0xb0dd*/
      }
      v26 = v17[3] + (v17[4] & 0xFFFFFFFFFFFFF000uLL) + ((v17[4] & 0xFFFLL) != 0 ? 0x1000 : 0);
      v8 = v26; /*0xb108*/
      v27 = ((v13 - v26) >> 12) + (((v13 - v26) & 0xFFF) != 0); /*0xb124*/
      if ( !v27 ) /*0xb128*/
        break; /*0xb128*/
      v7 = a1 + 6; /*0xb12a*/
    }
  }
  v22 = a1[3] + a1[4]; /*0xb133*/
  if ( v8 < v22 ) /*0xb13e*/
  {
    *((_QWORD *)src + 2) = 0; /*0xb143*/
    *((_QWORD *)src + 1) = v8; /*0xb147*/
    if ( !v12 ) /*0xb14b*/
      n6 = n6_2; /*0xb14b*/
    v23 = v22 - v8; /*0xb14f*/
    *(_DWORD *)src = n6; /*0xb159*/
    LOBYTE(v14) = (v23 & 0xFFF) != 0; /*0xb15c*/
    *((_QWORD *)src + 3) = (v23 >> 12) + v14; /*0xb16c*/
    ++v15; /*0xb170*/
    *((_QWORD *)src + 4) = v10 | 0x4000; /*0xb173*/
  }
  return v15; /*0xb18b*/
}