diff --git a/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.c b/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.c index eb128fe..0f77b44 100644 --- a/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.c +++ b/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.c @@ -1,61 +1,625 @@ // -// SBPEI.efi - Full Decompilation -// Source: IDA Pro MCP port 13384 -// Functions: 26 +// SBPEI.efi - Decompiled source cleanup // #include #include -{"addr":"0xffe2fc38","code":"char *internal_memcpy(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe2fc42*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe2fc50*/\n {\n src_1 = &src[count - 1]; /*0xffe2fc64*/\n dst_1 = &dst[count - 1]; /*0xffe2fc66*/\n }\n else\n {\n count_1 = count & 3; /*0xffe2fc54*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe2fc5d*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe2fc5d*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe2fc5d*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe2fc6d*/\n return dst; /*0xffe2fc74*/\n}"} +char * +internal_memcpy ( + char *dst, + char *src, + unsigned int count + ) +{ + unsigned int count_1; + char *dst_1; + char *src_1; -{"addr":"0xffe2fc78","code":"void *internal_memset(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe2fc85*/\n return buf; /*0xffe2fc8b*/\n}"} + count_1 = count; + if (src < dst && &src[count - 1] >= dst) { + src_1 = &src[count - 1]; + dst_1 = &dst[count - 1]; + } else { + count_1 = count & 3; + qmemcpy (dst, src, 4 * (count >> 2)); + src_1 = &src[4 * (count >> 2)]; + dst_1 = &dst[4 * (count >> 2)]; + } -{"addr":"0xffe2fc98","code":"int fn_addr(int a1, int a2, int a3, int a4)\n{\n do /*0xffe2fcb1*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe2fca9*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe2fcad*/\n }\n while ( a2 ); /*0xffe2fcb1*/\n return a1; /*0xffe2fcb5*/\n}"} + qmemcpy (dst_1, src_1, count_1); + return dst; +} -{"addr":"0xffe2fcb8","code":"void *sub_FFE2FCB8(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe2fcc5*/\n return buf; /*0xffe2fccb*/\n}"} +void * +internal_memset ( + void *buf, + unsigned int count, + char value + ) +{ + memset (buf, value, count); + return buf; +} -{"addr":"0xffe2fcd8","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n (*(void ( **)(EFI_SYSTEM_TABLE *, int, int, _DWORD, _DWORD, _DWORD))(LODWORD(SystemTable->Hdr.Signature) + 88))( /*0xffe2fcef*/\n SystemTable,\n 1,\n 397312,\n 0,\n 0,\n 0);\n sub_FFE2FD3A(); /*0xffe2fcf2*/\n if ( (*(int ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 24))(\n SystemTable,\n &unk_FFE309D4) < 0 )\n {\n sub_FFE300F9(\n -1,\n SystemTable,\n \"ASSERT in %s on %i: %s\\n\",\n \"e:\\\\hs\\\\AmiCRBPkg\\\\Chipset\\\\SB\\\\SBPEI.c\",\n 239,\n \"!EFI_ERROR(Status)\");\n while ( 1 ) /*0xffe2fd2f*/\n ; /*0xffe2fd2f*/\n }\n return 0; /*0xffe2fd34*/\n}","refs":[{"addr":"0xffe2fd3a","name":"sub_FFE2FD3A"},{"addr":"0xffe300f9","name":"sub_FFE300F9"},{"addr":"0xffe30614","name":"aAssertInSOnIS","string":"ASSERT in %s on %i: %s\n"},{"addr":"0xffe305f0","name":"aEHsAmicrbpkgCh","string":"e:\\hs\\AmiCRBPkg\\Chipset\\SB\\SBPEI.c"},{"addr":"0xffe305dc","name":"aEfiErrorStatus","string":"!EFI_ERROR(Status)"},{"addr":"0xffe309d4","name":"unk_FFE309D4"}]} +int +fn_addr ( + int a1, + int a2, + int a3, + int a4 + ) +{ + do { + *(_DWORD *)(a1 + 8 * a2 - 8) = a3; + *(_DWORD *)(a1 + 8 * a2-- - 4) = a4; + } while (a2); -{"addr":"0xffe2fd3a","code":"char sub_FFE2FD3A()\n{\n unsigned __int8 n0x12; // al\n int n128_1; // eax\n __int16 v2; // si\n unsigned __int8 n0xA0; // al\n unsigned __int8 n0x64; // bl\n int v5; // eax\n int v7; // [esp+10h] [ebp-18h] BYREF\n int n128; // [esp+14h] [ebp-14h]\n _DWORD v9[4]; // [esp+18h] [ebp-10h] BYREF\n\n __outbyte(0x70u, 8u); /*0xffe2fd4f*/\n n0x12 = __inbyte(0x71u); /*0xffe2fd56*/\n if ( n0x12 > 0x12u ) /*0xffe2fd59*/\n {\n __outbyte(0x70u, 8u); /*0xffe2fd60*/\n __outbyte(0x71u, 0); /*0xffe2fd66*/\n }\n n128_1 = (unsigned __int16)sub_FFE2FF1C(0x404u); /*0xffe2fd71*/\n n128 = n128_1; /*0xffe2fd79*/\n if ( (n128_1 & 0x80u) != 0 ) /*0xffe2fd7f*/\n {\n v2 = sub_FFE2FF1C(0x406u); /*0xffe2fd8f*/\n v9[3] = 0; /*0xffe2fd98*/\n v9[2] = 512; /*0xffe2fda1*/\n v9[1] = 0; /*0xffe2fdac*/\n v9[0] = 1024000; /*0xffe2fdb0*/\n sub_FFE30177(0, 0, v9, &v7); /*0xffe2fdb8*/\n if ( (sub_FFE2FF4C((unsigned __int16 *)(v7 + 164)) & 4) == 0 ) /*0xffe2fdd1*/\n {\n __outbyte(0x70u, 0x32u); /*0xffe2fdd8*/\n n0xA0 = __inbyte(0x71u); /*0xffe2fddc*/\n if ( n0xA0 < 0xA0u && (n0xA0 & 0xFu) < 0xA ) /*0xffe2fde9*/\n {\n n0x64 = sub_FFE2FFAD(n0xA0) + 1; /*0xffe2fdf2*/\n if ( n0x64 >= 0x64u ) /*0xffe2fdf8*/\n {\n v5 = sub_FFE3000A(); /*0xffe2fdfa*/\n if ( v5 ) /*0xffe2fe01*/\n (*(void ( **)(const char *, int, const char *))(v5 + 4))( /*0xffe2fe12*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\String.c\",\n 1785,\n \"Value < 100\");\n }\n __outbyte(0x70u, 0x32u); /*0xffe2fe1d*/\n __outbyte(0x71u, (n0x64 % 0xAu) | (16 * (n0x64 / 0xAu))); /*0xffe2fe30*/\n }\n }\n LOBYTE(n128_1) = 0x80; /*0xffe2fe39*/\n __outbyte(0x404u, 0x80u); /*0xffe2fe3b*/\n if ( (_WORD)n128 == 128 && !v2 ) /*0xffe2fe46*/\n {\n __outdword(0x534u, 0x2000u); /*0xffe2fe52*/\n LOBYTE(n128_1) = 0; /*0xffe2fe4d*/\n }\n }\n return n128_1; /*0xffe2fe53*/\n}","refs":[{"addr":"0xffe2ff1c","name":"sub_FFE2FF1C"},{"addr":"0xffe30177","name":"sub_FFE30177"},{"addr":"0xffe2ffad","name":"sub_FFE2FFAD"},{"addr":"0xffe3000a","name":"sub_FFE3000A"},{"addr":"0xffe2ff4c","name":"sub_FFE2FF4C"}]} + return a1; +} -{"addr":"0xffe2fe5b","code":"int sub_FFE2FE5B(int a1, _BYTE *a2, _BYTE *a3, _BYTE *a4, _BYTE *a5)\n{\n *a3 = a2[9]; /*0xffe2fe66*/\n *a4 = a2[10]; /*0xffe2fe6f*/\n *a5 = a2[11]; /*0xffe2fe78*/\n return 0; /*0xffe2fe7c*/\n}"} +void * +internal_memset32 ( + void *buf, + unsigned int count, + int value + ) +{ + memset32 (buf, value, count); + return buf; +} -{"addr":"0xffe2fe7d","code":"int sub_FFE2FE7D(int a1, unsigned __int8 *a2, int a3)\n{\n int v3; // esi\n int v4; // eax\n void *v5; // ecx\n int v6; // esi\n unsigned __int16 *v7; // esi\n unsigned __int16 v8; // ax\n void *v10; // [esp-4h] [ebp-10h]\n\n sub_FFE3003B(64, \"\\nSbPei.c : \\nRecInitSbSataController\");\n v3 = ((a2[11] & 7 | (8 * (a2[10] & 0x1F | (32 *a2[9])))) << 12) | 0x9E; /*0xffe2feb1*/\n v4 = sub_FFE3016B(v10); /*0xffe2feb7*/\n LOBYTE(v5) = *(_BYTE *)(v4 + v3) & 0xFE; /*0xffe2febf*/\n *(_BYTE *)(v4 + v3) = (_BYTE)v5; /*0xffe2fec2*/\n v6 = ((a2[11] & 7 | (8 * (a2[10] & 0x1F | (32 *a2[9])))) << 12) | 4; /*0xffe2fee4*/\n v7 = (unsigned __int16 *)(sub_FFE3016B(v5) + v6); /*0xffe2feec*/\n v8 = sub_FFE2FF4C(v7); /*0xffe2fef0*/\n sub_FFE2FF7A(v7, v8 | 6); /*0xffe2fefd*/\n *(_DWORD *)(a3 + 12) = -1; /*0xffe2ff0c*/\n return 0; /*0xffe2ff06*/\n}","refs":[{"addr":"0xffe3003b","name":"sub_FFE3003B"},{"addr":"0xffe3062c","name":"aSbpeiCRecinits","string":"\nSbPei.c : \nRecInitSbSataController"},{"addr":"0xffe3016b","name":"sub_FFE3016B"},{"addr":"0xffe2ff4c","name":"sub_FFE2FF4C"},{"addr":"0xffe2ff7a","name":"sub_FFE2FF7A"}]} +EFI_STATUS +EFIAPI +ModuleEntryPoint ( + EFI_HANDLE ImageHandle, + EFI_SYSTEM_TABLE *SystemTable + ) +{ + (*(void (**)(EFI_SYSTEM_TABLE *, int, int, _DWORD, _DWORD, _DWORD))(LODWORD (SystemTable->Hdr.Signature) + 88)) ( + SystemTable, + 1, + 397312, + 0, + 0, + 0 + ); -{"addr":"0xffe2ff1c","code":"int __thiscall sub_FFE2FF1C(unsigned __int16 n1028)\n{\n int v2; // eax\n int result; // eax\n\n if ( (n1028 & 1) != 0 ) /*0xffe2ff22*/\n {\n v2 = sub_FFE3000A(); /*0xffe2ff24*/\n if ( v2 ) /*0xffe2ff2b*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe2ff3c*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLibMsc.c\",\n 133,\n \"(Port & 1) == 0\");\n }\n LOWORD(result) = __inword(n1028); /*0xffe2ff45*/\n return (unsigned __int16)result; /*0xffe2ff4a*/\n}","refs":[{"addr":"0xffe3000a","name":"sub_FFE3000A"}]} + InitializeSbPeiEnvironment (); + if ((*(int (**)(EFI_SYSTEM_TABLE *, void *))(LODWORD (SystemTable->Hdr.Signature) + 24)) ( + SystemTable, + &unk_FFE309D4 + ) < 0) + { + DebugAssert ( + -1, + SystemTable, + "ASSERT in %s on %i: %s\n", + "e:\\hs\\AmiCRBPkg\\Chipset\\SB\\SBPEI.c", + 239, + "!EFI_ERROR(Status)" + ); + while (1) + ; + } -{"addr":"0xffe2ff4c","code":"int sub_FFE2FF4C(unsigned __int16 *a1)\n{\n int v2; // eax\n\n if ( ((unsigned __int8)a1 & 1) != 0 ) /*0xffe2ff52*/\n {\n v2 = sub_FFE3000A(); /*0xffe2ff54*/\n if ( v2 ) /*0xffe2ff5b*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe2ff6c*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLib.c\",\n 151,\n \"(Address & 1) == 0\");\n }\n return *a1; /*0xffe2ff78*/\n}","refs":[{"addr":"0xffe3000a","name":"sub_FFE3000A"}]} + return 0; +} -{"addr":"0xffe2ff7a","code":"__int16 sub_FFE2FF7A(_WORD *a1, __int16 a2)\n{\n int v4; // eax\n\n if ( ((unsigned __int8)a1 & 1) != 0 ) /*0xffe2ff84*/\n {\n v4 = sub_FFE3000A(); /*0xffe2ff86*/\n if ( v4 ) /*0xffe2ff8d*/\n (*(void ( **)(const char *, int, const char *))(v4 + 4))( /*0xffe2ff9e*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLib.c\",\n 183,\n \"(Address & 1) == 0\");\n }\n *a1 = a2; /*0xffe2ffa4*/\n return a2; /*0xffe2ffaa*/\n}","refs":[{"addr":"0xffe3000a","name":"sub_FFE3000A"}]} +char +InitializeSbPeiEnvironment ( + VOID + ) +{ + unsigned __int8 n0x12; + int n128_1; + __int16 v2; + unsigned __int8 n0xA0; + unsigned __int8 n0x64; + int v5; + int v7; + int n128; + _DWORD v9[4]; -{"addr":"0xffe2ffad","code":"int sub_FFE2FFAD(unsigned __int8 n0xA0)\n{\n int v2; // eax\n int v3; // eax\n\n if ( n0xA0 >= 0xA0u ) /*0xffe2ffb9*/\n {\n v2 = sub_FFE3000A(); /*0xffe2ffbb*/\n if ( v2 ) /*0xffe2ffc2*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe2ffcf*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\String.c\",\n 1809,\n \"Value < 0xa0\");\n }\n if ( (n0xA0 & 0xFu) >= 0xA ) /*0xffe2ffdb*/\n {\n v3 = sub_FFE3000A(); /*0xffe2ffdd*/\n if ( v3 ) /*0xffe2ffe4*/\n (*(void ( **)(const char *, int, const char *))(v3 + 4))( /*0xffe2fff1*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\String.c\",\n 1810,\n \"(Value & 0xf) < 0xa\");\n }\n return (n0xA0 & 0xF) + 10 * (n0xA0 >> 4); /*0xffe30005*/\n}","refs":[{"addr":"0xffe3000a","name":"sub_FFE3000A"}]} + __outbyte (0x70u, 8u); + n0x12 = __inbyte (0x71u); + if (n0x12 > 0x12u) { + __outbyte (0x70u, 8u); + __outbyte (0x71u, 0); + } -{"addr":"0xffe3000a","code":"int sub_FFE3000A()\n{\n int v0; // eax\n int v2; // [esp+0h] [ebp-8h] BYREF\n int v3; // [esp+4h] [ebp-4h] BYREF\n\n v0 = sub_FFE303FD(); /*0xffe3000f*/\n if ( (*(int ( **)(int, void *, _DWORD, int *, int *))(*(_DWORD *)v0 + 32))(v0, &unk_FFE30998, 0, &v2, &v3) >= 0 ) /*0xffe3002e*/\n return v3; /*0xffe30034*/\n else\n return 0; /*0xffe30030*/\n}","refs":[{"addr":"0xffe303fd","name":"sub_FFE303FD"},{"addr":"0xffe30998","name":"unk_FFE30998"}]} + n128_1 = (unsigned __int16)ReadPortWordChecked (0x404u); + n128 = n128_1; + if ((n128_1 & 0x80u) != 0) { + v2 = ReadPortWordChecked (0x406u); + v9[3] = 0; + v9[2] = 512; + v9[1] = 0; + v9[0] = 1024000; + GetMmioBaseFromResourceList (0, 0, v9, &v7); + if ((ReadIoWordChecked ((unsigned __int16 *)(v7 + 164)) & 4) == 0) { + __outbyte (0x70u, 0x32u); + n0xA0 = __inbyte (0x71u); + if (n0xA0 < 0xA0u && (n0xA0 & 0xFu) < 0xA) { + n0x64 = BcdByteToBinary (n0xA0) + 1; + if (n0x64 >= 0x64u) { + v5 = GetPeiServicesTable (); + if (v5) { + (*(void (**)(const char *, int, const char *))(v5 + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", + 1785, + "Value < 100" + ); + } + } + __outbyte (0x70u, 0x32u); + __outbyte (0x71u, (n0x64 % 0xAu) | (16 * (n0x64 / 0xAu))); + } + } -{"addr":"0xffe3003b","code":"int sub_FFE3003B(int n64, char *_nSbPei.c_:__nRecInitSbSataController, ...)\n{\n int result; // eax\n int ( **v3)(int, char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, _nSbPei.c_:__nRecInitSbSataController);\n result = sub_FFE3000A(); /*0xffe3003c*/\n v3 = (int ( **)(int, char *, char *))result; /*0xffe30041*/\n if ( result ) /*0xffe30045*/\n {\n result = sub_FFE30195(); /*0xffe30047*/\n if ( (result & n64) != 0 ) /*0xffe30052*/\n return (*v3)(n64, _nSbPei.c_:__nRecInitSbSataController, (char *)va); /*0xffe3005e*/\n }\n return result; /*0xffe30063*/\n}","refs":[{"addr":"0xffe3000a","name":"sub_FFE3000A"},{"addr":"0xffe30195","name":"sub_FFE30195"}]} + LOBYTE (n128_1) = 0x80; + __outbyte (0x404u, 0x80u); + if ((_WORD)n128 == 128 && !v2) { + __outdword (0x534u, 0x2000u); + LOBYTE (n128_1) = 0; + } + } -{"addr":"0xffe30065","code":"int sub_FFE30065(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n int PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = sub_FFE3000A(); /*0xffe3006b*/\n if ( result ) /*0xffe30072*/\n return (*(int ( **)(int, int, int))(result + 4))( /*0xffe3007a*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe30080*/\n}","refs":[{"addr":"0xffe3000a","name":"sub_FFE3000A"}]} + return n128_1; +} -{"addr":"0xffe30083","code":"int __thiscall sub_FFE30083(void *this)\n{\n int v1; // eax\n int v2; // eax\n int v3; // eax\n int v5; // [esp+0h] [ebp-4h] BYREF\n\n v1 = sub_FFE303FD(); /*0xffe30087*/\n v5 = (int)&v5; /*0xffe3008f*/\n v2 = (*(int ( **)(int, void *, _DWORD, _DWORD))(*(_DWORD *)v1 + 32))(v1, &unk_FFE309A8, 0, 0); /*0xffe3009c*/\n if ( v2 < 0 ) /*0xffe300a4*/\n {\n sub_FFE3003B(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v2); /*0xffe300b1*/\n v3 = sub_FFE3000A(); /*0xffe300b9*/\n if ( v3 ) /*0xffe300c0*/\n (*(void ( **)(const char *, int, const char *))(v3 + 4))( /*0xffe300ce*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiPcdLib\\\\PeiPcdLib.c\",\n 49,\n \"!EFI_ERROR (Status)\");\n }\n return v5; /*0xffe300d9*/\n}","refs":[{"addr":"0xffe303fd","name":"sub_FFE303FD"},{"addr":"0xffe309a8","name":"unk_FFE309A8"},{"addr":"0xffe3003b","name":"sub_FFE3003B"},{"addr":"0xffe3000a","name":"sub_FFE3000A"}]} +int +GetSbSataDeviceAddress ( + int a1, + _BYTE *a2, + _BYTE *a3, + _BYTE *a4, + _BYTE *a5 + ) +{ + *a3 = a2[9]; + *a4 = a2[10]; + *a5 = a2[11]; + return 0; +} -{"addr":"0xffe300db","code":"int __thiscall sub_FFE300DB(void *this)\n{\n int v2; // eax\n\n v2 = sub_FFE30083(this); /*0xffe300de*/\n return (*(int ( **)(void *))(v2 + 16))(this); /*0xffe300e8*/\n}","refs":[{"addr":"0xffe30083","name":"sub_FFE30083"}]} +int +RecInitSbSataController ( + int a1, + unsigned __int8 *a2, + int a3 + ) +{ + int v3; + int v4; + void *v5; + int v6; + unsigned __int16 *v7; + unsigned __int16 v8; + void *v10; -{"addr":"0xffe300ea","code":"int __thiscall sub_FFE300EA(void *this)\n{\n int v2; // eax\n\n v2 = sub_FFE30083(this); /*0xffe300ed*/\n return (*(int ( **)(void *))(v2 + 20))(this); /*0xffe300f7*/\n}","refs":[{"addr":"0xffe30083","name":"sub_FFE30083"}]} + PeiDebugPrint (64, "\nSbPei.c : \nRecInitSbSataController"); + v3 = ((a2[11] & 7 | (8 * (a2[10] & 0x1F | (32 * a2[9])))) << 12) | 0x9E; + v4 = PcdGet16FromProtocolValue (v10); + LOBYTE (v5) = *(_BYTE *)(v4 + v3) & 0xFE; + *(_BYTE *)(v4 + v3) = (_BYTE)v5; + v6 = ((a2[11] & 7 | (8 * (a2[10] & 0x1F | (32 * a2[9])))) << 12) | 4; + v7 = (unsigned __int16 *)(PcdGet16FromProtocolValue (v5) + v6); + v8 = ReadIoWordChecked (v7); + WriteIoWordChecked (v7, v8 | 6); + *(_DWORD *)(a3 + 12) = -1; + return 0; +} -{"addr":"0xffe300f9","code":"int sub_FFE300F9(int a1, EFI_SYSTEM_TABLE *SystemTable, char *ASSERT_in_%s_on_%i:_%s_n, ...)\n{\n int result; // eax\n char *ASSERT_in_%s_on_%i:_%s_n_1; // eax\n va_list va; // [esp+18h] [ebp+14h] BYREF\n\n va_start(va, ASSERT_in_%s_on_%i:_%s_n);\n result = (*(int (__stdcall **)(EFI_SYSTEM_TABLE *))(LODWORD(SystemTable->Hdr.Signature) + 32))(SystemTable); /*0xffe30112*/\n if ( result >= 0 ) /*0xffe3011a*/\n {\n if ( SystemTable ) /*0xffe30122*/\n {\n result = sub_FFE30195(); /*0xffe30124*/\n if ( (result & a1) != 0 ) /*0xffe3012e*/\n {\n ASSERT_in_%s_on_%i:_%s_n_1 = ASSERT_in_%s_on_%i:_%s_n; /*0xffe30130*/\n if ( *ASSERT_in_%s_on_%i:_%s_n ) /*0xffe30133*/\n {\n do /*0xffe30153*/\n {\n if ( *ASSERT_in_%s_on_%i:_%s_n_1 == 37 ) /*0xffe3013b*/\n {\n if ( *++ASSERT_in_%s_on_%i:_%s_n_1 == 115 ) /*0xffe30143*/\n {\n *ASSERT_in_%s_on_%i:_%s_n_1 = 97; /*0xffe30145*/\n }\n else if ( *ASSERT_in_%s_on_%i:_%s_n_1 == 71 ) /*0xffe3014d*/\n {\n *ASSERT_in_%s_on_%i:_%s_n_1 = 103; /*0xffe3014f*/\n }\n }\n ++ASSERT_in_%s_on_%i:_%s_n_1; /*0xffe30152*/\n }\n while ( *ASSERT_in_%s_on_%i:_%s_n_1 ); /*0xffe30153*/\n ASSERT_in_%s_on_%i:_%s_n_1 = ASSERT_in_%s_on_%i:_%s_n; /*0xffe30158*/\n }\n return ((int ( *)(int, char *, char *))LODWORD(SystemTable->Hdr.Signature))( /*0xffe30161*/\n a1,\n ASSERT_in_%s_on_%i:_%s_n_1,\n (char *)va);\n }\n }\n }\n return result; /*0xffe30169*/\n}","refs":[{"addr":"0xffe30195","name":"sub_FFE30195"}]} +int +ReadPortWordChecked ( + unsigned __int16 n1028 + ) +{ + int v2; + int result; -{"addr":"0xffe3016b","code":"int __thiscall sub_FFE3016B(void *this)\n{\n int v1; // eax\n\n v1 = sub_FFE30083(this); /*0xffe3016b*/\n return (*(int ( **)(int))(v1 + 16))(5); /*0xffe30176*/\n}","refs":[{"addr":"0xffe30083","name":"sub_FFE30083"}]} + if ((n1028 & 1) != 0) { + v2 = GetPeiServicesTable (); + if (v2) { + (*(void (**)(const char *, int, const char *))(v2 + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", + 133, + "(Port & 1) == 0" + ); + } + } -{"addr":"0xffe30177","code":"int *sub_FFE30177(int a1, int a2, _DWORD *a3, int *a4)\n{\n int v4; // ecx\n\n v4 = sub_FFE3027F((int)a3) + (*a3 & 0xFFFFFFF); /*0xffe3018b*/\n *a4 = v4; /*0xffe30192*/\n return a4; /*0xffe30191*/\n}","refs":[{"addr":"0xffe3027f","name":"sub_FFE3027F"}]} + LOWORD (result) = __inword (n1028); + return (unsigned __int16)result; +} -{"addr":"0xffe30195","code":"int sub_FFE30195()\n{\n unsigned __int8 v0; // al\n char n3; // al\n char n3_1; // cl\n\n v0 = __inbyte(0x70u); /*0xffe3019b*/\n __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe301a0*/\n n3 = __inbyte(0x71u); /*0xffe301a7*/\n n3_1 = n3; /*0xffe301a8*/\n if ( (unsigned __int8)n3 <= 3u ) /*0xffe301ad*/\n {\nLABEL_4:\n if ( !n3_1 ) /*0xffe301c8*/\n return 0; /*0xffe301c8*/\n goto LABEL_5; /*0xffe301c8*/\n }\n n3_1 = n3; /*0xffe301af*/\n if ( !n3 ) /*0xffe301b7*/\n {\n n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe301c3*/\n goto LABEL_4; /*0xffe301c3*/\n }\nLABEL_5:\n if ( n3_1 != -1 )\n return n3_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe301e0*/\n}","refs":[{"addr":"0xffe30a38","name":"n3"}]} +int +ReadIoWordChecked ( + unsigned __int16 *a1 + ) +{ + int v2; -{"addr":"0xffe301e4","code":"int sub_FFE301E4(_DWORD *a1, int n8)\n{\n int v3; // [esp+Ch] [ebp-4h]\n\n v3 = sub_FFE300EA((void *)6); /*0xffe30214*/\n a1[1] = 16 *n8 + 16; /*0xffe3021d*/\n if ( !a1[4] && !a1[5] ) /*0xffe30239*/\n {\n *(_DWORD *)(v3 + 16) = sub_FFE300DB((void *)5); /*0xffe3025e*/\n *(_DWORD *)(v3 + 20) = 0; /*0xffe30275*/\n }\n return 0; /*0xffe3027b*/\n}","refs":[{"addr":"0xffe300ea","name":"sub_FFE300EA"},{"addr":"0xffe300db","name":"sub_FFE300DB"}]} + if (((unsigned __int8)a1 & 1) != 0) { + v2 = GetPeiServicesTable (); + if (v2) { + (*(void (**)(const char *, int, const char *))(v2 + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", + 151, + "(Address & 1) == 0" + ); + } + } -{"addr":"0xffe3027f","code":"int sub_FFE3027F(int a1)\n{\n int v2; // [esp+Ch] [ebp-Ch]\n int v3; // [esp+10h] [ebp-8h]\n int v4; // [esp+14h] [ebp-4h]\n\n if ( *(_DWORD *)(a1 + 12) ) /*0xffe30294*/\n {\n v3 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 255544); /*0xffe3038a*/\n v4 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 255560); /*0xffe303a6*/\n }\n else\n {\n v2 = sub_FFE300EA((void *)6); /*0xffe302a7*/\n if ( *(_DWORD *)(v2 + 4) ) /*0xffe302ad*/\n {\n v3 = *(_DWORD *)(v2 + 16 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 20); /*0xffe302c8*/\n v4 = *(_DWORD *)(v2 + 16 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 16); /*0xffe302e0*/\n }\n else\n {\n sub_FFE301E4(dword_FFE30A18, 8); /*0xffe302f3*/\n v3 = dword_FFE30A2C[4 * (unsigned __int16)*(_DWORD *)(a1 + 4)]; /*0xffe3030e*/\n v4 = dword_FFE30A28[4 * (unsigned __int16)*(_DWORD *)(a1 + 4)]; /*0xffe30325*/\n if ( !v4 && !v3 ) /*0xffe30332*/\n {\n v4 = sub_FFE300DB((void *)5); /*0xffe3035f*/\n v3 = 0; /*0xffe3036c*/\n }\n }\n }\n if ( !v4 && !v3 ) /*0xffe303b3*/\n return sub_FFE300DB((void *)5); /*0xffe303e0*/\n return v4; /*0xffe303f9*/\n}","refs":[{"addr":"0xffe300ea","name":"sub_FFE300EA"},{"addr":"0xffe301e4","name":"sub_FFE301E4"},{"addr":"0xffe30a18","name":"dword_FFE30A18"},{"addr":"0xffe30a2c","name":"dword_FFE30A2C"},{"addr":"0xffe30a28","name":"dword_FFE30A28"},{"addr":"0xffe300db","name":"sub_FFE300DB"}]} + return *a1; +} -{"addr":"0xffe303fd","code":"int __stdcall sub_FFE303FD()\n{\n int v0; // esi\n _BYTE v2[8]; // [esp+4h] [ebp-8h] BYREF\n\n sub_FFE3042F(v2); /*0xffe30406*/\n v0 = *(_DWORD *)(*(_DWORD *)&v2[2] - 4); /*0xffe3040e*/\n if ( !v0 ) /*0xffe30413*/\n sub_FFE30065( /*0xffe30422*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n (int)\"PeiServices != ((void *) 0)\");\n return v0; /*0xffe3042a*/\n}","refs":[{"addr":"0xffe3042f","name":"sub_FFE3042F"},{"addr":"0xffe30065","name":"sub_FFE30065"}]} +__int16 +WriteIoWordChecked ( + _WORD *a1, + __int16 a2 + ) +{ + int v4; -{"addr":"0xffe3042f","code":"void *__thiscall sub_FFE3042F(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe30435*/\n sub_FFE30065((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, (int)\"Idtr != ((void *) 0)\"); /*0xffe30444*/\n this_1 = this; /*0xffe3044a*/\n __sidt(this); /*0xffe3044d*/\n return this_1; /*0xffe30451*/\n}","refs":[{"addr":"0xffe30065","name":"sub_FFE30065"}]} + if (((unsigned __int8)a1 & 1) != 0) { + v4 = GetPeiServicesTable (); + if (v4) { + (*(void (**)(const char *, int, const char *))(v4 + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", + 183, + "(Address & 1) == 0" + ); + } + } + *a1 = a2; + return a2; +} + +int +BcdByteToBinary ( + unsigned __int8 n0xA0 + ) +{ + int v2; + int v3; + + if (n0xA0 >= 0xA0u) { + v2 = GetPeiServicesTable (); + if (v2) { + (*(void (**)(const char *, int, const char *))(v2 + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", + 1809, + "Value < 0xa0" + ); + } + } + + if ((n0xA0 & 0xFu) >= 0xA) { + v3 = GetPeiServicesTable (); + if (v3) { + (*(void (**)(const char *, int, const char *))(v3 + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", + 1810, + "(Value & 0xf) < 0xa" + ); + } + } + + return (n0xA0 & 0xF) + 10 * (n0xA0 >> 4); +} + +int +GetPeiServicesTable ( + VOID + ) +{ + int v0; + int v2; + int v3; + + v0 = GetPeiServices (); + if ((*(int (**)(int, void *, _DWORD, int *, int *))(*(_DWORD *)v0 + 32))(v0, &unk_FFE30998, 0, &v2, &v3) >= 0) { + return v3; + } + + return 0; +} + +int +PeiDebugPrint ( + int n64, + char *_nSbPei.c_:__nRecInitSbSataController, + ... + ) +{ + int result; + int (**v3)(int, char *, char *); + va_list va; + + va_start (va, _nSbPei.c_:__nRecInitSbSataController); + result = GetPeiServicesTable (); + v3 = (int (**)(int, char *, char *))result; + if (result) { + result = ReadRtcRegisterB (); + if ((result & n64) != 0) { + return (*v3)(n64, _nSbPei.c_:__nRecInitSbSataController, (char *)va); + } + } + + return result; +} + +int +PeiAssert ( + int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ, + int n48, + int PeiServices____((void__)_0) + ) +{ + int result; + + result = GetPeiServicesTable (); + if (result) { + return (*(int (**)(int, int, int))(result + 4)) ( + e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ, + n48, + PeiServices____((void__)_0) + ); + } + + return result; +} + +int +GetPcdProtocol ( + void *this + ) +{ + int v1; + int v2; + int v3; + int v5; + + v1 = GetPeiServices (); + v5 = (int)&v5; + v2 = (*(int (**)(int, void *, _DWORD, _DWORD))(*(_DWORD *)v1 + 32))(v1, &unk_FFE309A8, 0, 0); + if (v2 < 0) { + PeiDebugPrint (0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v2); + v3 = GetPeiServicesTable (); + if (v3) { + (*(void (**)(const char *, int, const char *))(v3 + 4)) ( + "e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c", + 49, + "!EFI_ERROR (Status)" + ); + } + } + + return v5; +} + +int +PcdGet16FromProtocol ( + void *this + ) +{ + int v2; + + v2 = GetPcdProtocol (this); + return (*(int (**)(void *))(v2 + 16))(this); +} + +int +PcdGet32FromProtocol ( + void *this + ) +{ + int v2; + + v2 = GetPcdProtocol (this); + return (*(int (**)(void *))(v2 + 20))(this); +} + +int +DebugAssert ( + int a1, + EFI_SYSTEM_TABLE *SystemTable, + char *ASSERT_in_%s_on_%i:_%s_n, + ... + ) +{ + int result; + char *ASSERT_in_%s_on_%i:_%s_n_1; + va_list va; + + va_start (va, ASSERT_in_%s_on_%i:_%s_n); + result = (*(int (__stdcall **)(EFI_SYSTEM_TABLE *))(LODWORD (SystemTable->Hdr.Signature) + 32))(SystemTable); + if (result >= 0) { + if (SystemTable) { + result = ReadRtcRegisterB (); + if ((result & a1) != 0) { + ASSERT_in_%s_on_%i:_%s_n_1 = ASSERT_in_%s_on_%i:_%s_n; + if (*ASSERT_in_%s_on_%i:_%s_n) { + do { + if (*ASSERT_in_%s_on_%i:_%s_n_1 == 37) { + if (*++ASSERT_in_%s_on_%i:_%s_n_1 == 115) { + *ASSERT_in_%s_on_%i:_%s_n_1 = 97; + } else if (*ASSERT_in_%s_on_%i:_%s_n_1 == 71) { + *ASSERT_in_%s_on_%i:_%s_n_1 = 103; + } + } + ++ASSERT_in_%s_on_%i:_%s_n_1; + } while (*ASSERT_in_%s_on_%i:_%s_n_1); + ASSERT_in_%s_on_%i:_%s_n_1 = ASSERT_in_%s_on_%i:_%s_n; + } + + return ((int (*)(int, char *, char *))LODWORD (SystemTable->Hdr.Signature)) ( + a1, + ASSERT_in_%s_on_%i:_%s_n_1, + (char *)va + ); + } + } + } + + return result; +} + +int +PcdGet16FromProtocolValue ( + void *this + ) +{ + int v1; + + v1 = GetPcdProtocol (this); + return (*(int (**)(int))(v1 + 16))(5); +} + +int * +GetMmioBaseFromResourceList ( + int a1, + int a2, + _DWORD *a3, + int *a4 + ) +{ + int v4; + + v4 = ResolvePcdResourceOffset ((int)a3) + (*a3 & 0xFFFFFFF); + *a4 = v4; + return a4; +} + +int +ReadRtcRegisterB ( + VOID + ) +{ + unsigned __int8 v0; + char n3; + char n3_1; + + v0 = __inbyte (0x70u); + __outbyte (0x70u, v0 & 0x80 | 0x4A); + n3 = __inbyte (0x71u); + n3_1 = n3; + if ((unsigned __int8)n3 <= 3u) { +LABEL_4: + if (!n3_1) { + return 0; + } + goto LABEL_5; + } + + n3_1 = n3; + if (!n3) { + n3_1 = MEMORY[0xFDAF0490] & 2 | 1; + goto LABEL_4; + } + +LABEL_5: + if (n3_1 != -1) { + return n3_1 != 1 ? -2147483578 : -2147483644; + } + + return 0; +} + +int +InitializePcdProtocolCache ( + _DWORD *a1, + int n8 + ) +{ + int v3; + + v3 = PcdGet32FromProtocol ((void *)6); + a1[1] = 16 * n8 + 16; + if (!a1[4] && !a1[5]) { + *(_DWORD *)(v3 + 16) = PcdGet16FromProtocol ((void *)5); + *(_DWORD *)(v3 + 20) = 0; + } + + return 0; +} + +int +ResolvePcdResourceOffset ( + int a1 + ) +{ + int v2; + int v3; + int v4; + + if (*(_DWORD *)(a1 + 12)) { + v3 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 255544); + v4 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 255560); + } else { + v2 = PcdGet32FromProtocol ((void *)6); + if (*(_DWORD *)(v2 + 4)) { + v3 = *(_DWORD *)(v2 + 16 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 20); + v4 = *(_DWORD *)(v2 + 16 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 16); + } else { + InitializePcdProtocolCache (dword_FFE30A18, 8); + v3 = dword_FFE30A2C[4 * (unsigned __int16)*(_DWORD *)(a1 + 4)]; + v4 = dword_FFE30A28[4 * (unsigned __int16)*(_DWORD *)(a1 + 4)]; + if (!v4 && !v3) { + v4 = PcdGet16FromProtocol ((void *)5); + v3 = 0; + } + } + } + + if (!v4 && !v3) { + return PcdGet16FromProtocol ((void *)5); + } + + return v4; +} + +int +GetPeiServices ( + VOID + ) +{ + int v0; + _BYTE v2[8]; + + ReadIdtr (v2); + v0 = *(_DWORD *)(*(_DWORD *)&v2[2] - 4); + if (!v0) { + PeiAssert ( + (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c", + 48, + (int)"PeiServices != ((void *) 0)" + ); + } + + return v0; +} + +void * +__thiscall +ReadIdtr ( + void *this + ) +{ + void *this_1; + + if (!this) { + PeiAssert ( + (int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", + 37, + (int)"Idtr != ((void *) 0)" + ); + } + + this_1 = this; + __sidt (this); + return this_1; +} diff --git a/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.h b/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.h index ef704ab..9632478 100644 --- a/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.h +++ b/AmiCRBPkg/Chipset/SB/SBPEI/SBPEI.h @@ -9,164 +9,164 @@ #include "../uefi_headers/Uefi.h" -// -// Function Prototypes -// +char * +internal_memcpy ( + char *dst, + char *src, + unsigned int count + ); + +void * +internal_memset ( + void *buf, + unsigned int count, + char value + ); + +int +fn_addr ( + int a1, + int a2, + int a3, + int a4 + ); + +void * +internal_memset32 ( + void *buf, + unsigned int count, + int value + ); EFI_STATUS EFIAPI -internal_memcpy( - VOID -); +ModuleEntryPoint ( + EFI_HANDLE ImageHandle, + EFI_SYSTEM_TABLE *SystemTable + ); -EFI_STATUS -EFIAPI -internal_memset( +char +InitializeSbPeiEnvironment ( VOID -); + ); -EFI_STATUS -EFIAPI -fn_addr( - VOID -); +int +GetSbSataDeviceAddress ( + int a1, + _BYTE *a2, + _BYTE *a3, + _BYTE *a4, + _BYTE *a5 + ); -EFI_STATUS -EFIAPI -internal_memset32( - VOID -); +int +RecInitSbSataController ( + int a1, + unsigned __int8 *a2, + int a3 + ); -EFI_STATUS -EFIAPI -_ModuleEntryPoint( - VOID -); +int +ReadPortWordChecked ( + unsigned __int16 n1028 + ); -EFI_STATUS -EFIAPI -InitializeSbPeiEnvironment( - VOID -); +int +ReadIoWordChecked ( + unsigned __int16 *a1 + ); -EFI_STATUS -EFIAPI -GetSbSataDeviceAddress( - VOID -); +__int16 +WriteIoWordChecked ( + _WORD *a1, + __int16 a2 + ); -EFI_STATUS -EFIAPI -RecInitSbSataController( - VOID -); +int +BcdByteToBinary ( + unsigned __int8 n0xA0 + ); -EFI_STATUS -EFIAPI -ReadPortWordChecked( +int +GetPeiServicesTable ( VOID -); + ); -EFI_STATUS -EFIAPI -ReadIoWordChecked( - VOID -); +int +PeiDebugPrint ( + int n64, + char *_nSbPei.c_:__nRecInitSbSataController, + ... + ); -EFI_STATUS -EFIAPI -WriteIoWordChecked( - VOID -); +int +PeiAssert ( + int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ, + int n48, + int PeiServices____((void__)_0) + ); -EFI_STATUS -EFIAPI -BcdByteToBinary( - VOID -); +int +GetPcdProtocol ( + void *this + ); -EFI_STATUS -EFIAPI -GetPeiServicesTable( - VOID -); +int +PcdGet16FromProtocol ( + void *this + ); -EFI_STATUS -EFIAPI -PeiDebugPrint( - VOID -); +int +PcdGet32FromProtocol ( + void *this + ); -EFI_STATUS -EFIAPI -PeiAssert( - VOID -); +int +DebugAssert ( + int a1, + EFI_SYSTEM_TABLE *SystemTable, + char *ASSERT_in_%s_on_%i:_%s_n, + ... + ); -EFI_STATUS -EFIAPI -GetPcdProtocol( - VOID -); +int +PcdGet16FromProtocolValue ( + void *this + ); -EFI_STATUS -EFIAPI -PcdGet16FromProtocol( - VOID -); +int * +GetMmioBaseFromResourceList ( + int a1, + int a2, + _DWORD *a3, + int *a4 + ); -EFI_STATUS -EFIAPI -PcdGet32FromProtocol( +int +ReadRtcRegisterB ( VOID -); + ); -EFI_STATUS -EFIAPI -DebugAssert( - VOID -); +int +InitializePcdProtocolCache ( + _DWORD *a1, + int n8 + ); -EFI_STATUS -EFIAPI -PcdGet16FromProtocolValue( - VOID -); +int +ResolvePcdResourceOffset ( + int a1 + ); -EFI_STATUS -EFIAPI -GetMmioBaseFromResourceList( +int +GetPeiServices ( VOID -); + ); -EFI_STATUS -EFIAPI -ReadRtcRegisterB( - VOID -); - -EFI_STATUS -EFIAPI -InitializePcdProtocolCache( - VOID -); - -EFI_STATUS -EFIAPI -ResolvePcdResourceOffset( - VOID -); - -EFI_STATUS -EFIAPI -GetPeiServicesTableValue( - VOID -); - -EFI_STATUS -EFIAPI -ReadIdtr( - VOID -); +void * +__thiscall +ReadIdtr ( + void *this + ); #endif /* __SBPEI__H__ */ diff --git a/AmiModulePkg/ACPI/ACPI/ACPI.c b/AmiModulePkg/ACPI/ACPI/ACPI.c index f88c335..bc17fbd 100644 --- a/AmiModulePkg/ACPI/ACPI/ACPI.c +++ b/AmiModulePkg/ACPI/ACPI/ACPI.c @@ -80,7 +80,7 @@ // Function: AcpiGetTable @ 0x4a4 (0x107 bytes) -unsigned __int64 __fastcall AcpiGetTable(__int64 *p_psub_4A4, __int64 a2, __int64 *a3, _DWORD *a4, _QWORD *a5) +unsigned __int64 __fastcall AcpiGetTable(__int64 *Protocol, __int64 a2, __int64 *a3, _DWORD *a4, _QWORD *a5) { __int64 v10; // rdi __int64 v11; // rax @@ -90,7 +90,7 @@ DebugPrint( /*0x4de*/ 0x80000000LL, "!!!WARNING!!! Deprecated AcpiSupport protocol is used. Use AcpiSdt/AcpiTable protocols instead. \n"); - if ( p_psub_4A4 != &psub_4A4 ) /*0x4ed*/ + if ( Protocol != &psub_4A4 ) /*0x4ed*/ return 0x8000000000000002uLL; /*0x4ef*/ if ( a2 > j_0 - 1 ) /*0x50b*/ return 0x800000000000000EuLL; /*0x50d*/ @@ -116,7 +116,7 @@ // Function: AcpiProcessTable @ 0x5ac (0x6c7 bytes) unsigned __int64 __fastcall AcpiProcessTable( - __int64 *p_psub_4A4, + __int64 *Protocol, unsigned __int8 *TableAddr, char a3, int n2, @@ -153,13 +153,13 @@ // Function: AcpiCoreNotify @ 0xc74 (0xc6 bytes) -unsigned __int64 __fastcall AcpiCoreNotify(__int64 *p_psub_4A4, unsigned int n2) +unsigned __int64 __fastcall AcpiCoreNotify(__int64 *Protocol, unsigned int n2) { bool v3; // cc unsigned __int8 v5; // cl signed __int64 v6; // rax - if ( n2 - 2 > 0x1C || p_psub_4A4 != &psub_4A4 ) /*0xc8e*/ + if ( n2 - 2 > 0x1C || Protocol != &psub_4A4 ) /*0xc8e*/ return 0x8000000000000003uLL; /*0xc8e*/ v3 = n2 <= 2; /*0xc90*/ if ( n2 == 2 ) /*0xc93*/ @@ -186,7 +186,7 @@ // Function: AcpiInstallTable @ 0xd3c (0xfe bytes) -__int64 __fastcall AcpiInstallTable(__int64 *p_psub_D3C, unsigned __int64 *p_RsdtBase, __int64 n40, _QWORD *a4) +__int64 __fastcall AcpiInstallTable(__int64 *Protocol, unsigned __int64 *p_RsdtBase, __int64 n40, _QWORD *a4) { __int64 v5; // rax __int64 v6; // rbx @@ -231,7 +231,7 @@ // Function: AcpiRemoveTable @ 0xe3c (0x4e bytes) -__int64 __fastcall AcpiRemoveTable(__int64 *p_psub_D3C, __int64 a2) +__int64 __fastcall AcpiRemoveTable(__int64 *Protocol, __int64 a2) { __int64 result; // rax __int64 v3; // [rsp+48h] [rbp+10h] BYREF @@ -3955,4 +3955,3 @@ __asm { popf } /*0x5ec9*/ return p_n1600085855; /*0x5ecc*/ } - diff --git a/AmiModulePkg/ACPI/ACPI/ACPI.h b/AmiModulePkg/ACPI/ACPI/ACPI.h index bb35a3d..3ae07a5 100644 --- a/AmiModulePkg/ACPI/ACPI/ACPI.h +++ b/AmiModulePkg/ACPI/ACPI/ACPI.h @@ -36,34 +36,33 @@ unsigned __int64 EFIAPI AcpiGetTable( - __int64 *p_psub_4A4, + __int64 *Protocol, __int64 a2, __int64 *a3, _DWORD *a4, _QWORD *a5 ); -{"addr":"0x5ac","code":"unsigned __int64 EFIAPI AcpiProcessTable( - \n __int64 *p_psub_4A4, - \n unsigned __int8 *TableAddr, - \n char a3, - \n int n2, - \n __int64 *p_TableSize + __int64 *Protocol, + unsigned __int8 *TableAddr, + char a3, + int n2, + __int64 *TableSize ); unsigned __int64 EFIAPI AcpiCoreNotify( - __int64 *p_psub_4A4, + __int64 *Protocol, unsigned int n2 ); unsigned __int64 EFIAPI AcpiInstallTable( - __int64 *p_psub_D3C, + __int64 *Protocol, __int64 a2, __int64 n40, _QWORD *a4 @@ -72,7 +71,7 @@ __int64 EFIAPI AcpiRemoveTable( - __int64 *p_psub_D3C, + __int64 *Protocol, __int64 a2 ); @@ -511,7 +510,6 @@ VOID ); -{"addr":"0x4358","code":"unsigned __int64 EFIAPI AcpiPublishTables( unsigned __int8 RsdtBuildFlag, @@ -537,7 +535,6 @@ __int64 a2 ); -{"addr":"0x5660","code":"unsigned __int64 EFIAPI AcpiCoreInitialize( VOID @@ -590,4 +587,4 @@ unsigned __int64 NameCount ); -#endif /* __ACPI_H__ */ \ No newline at end of file +#endif /* __ACPI_H__ */ diff --git a/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.c b/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.c index 335e510..d4fda05 100644 --- a/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.c +++ b/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.c @@ -77,7 +77,7 @@ { int result; // eax if ( !a2 ) /*0xffda6e91*/ return -2147483646; /*0xffda6e93*/ - result = sub_FFDA6EBE(a1, a2 - 12, a3); /*0xffda6ea8*/ + result = SataPortGetDeviceCount(a1, a2 - 12, a3); /*0xffda6ea8*/ if ( result >= 0 ) /*0xffda6eb2*/ { *a3 = *(_DWORD *)(a2 + 33); /*0xffda6eb7*/ @@ -92,7 +92,7 @@ return -2147483646; /*0xffda6ecd*/ if ( !*(_BYTE *)(a2 + 44) ) /*0xffda6ece*/ { - result = sub_FFDA77F9(SystemTable, a2); /*0xffda6eda*/ + result = SataPortGetDevice(SystemTable, a2); /*0xffda6eda*/ if ( result < 0 ) /*0xffda6ee1*/ return result; /*0xffda6ee1*/ *(_BYTE *)(a2 + 44) = 1; /*0xffda6ee3*/ @@ -106,7 +106,7 @@ int v4; // esi int result; // eax _DWORD *v6; // esi if ( !a2 || !a3 || !a4 ) /*0xffda6f0c*/ return -2147483646; /*0xffda6f3c*/ v4 = *(_DWORD *)(a2 - 12 + 4 *a3 + 45); /*0xffda6f15*/ - if ( *(_BYTE *)(a2 + 32) || (result = sub_FFDA6F44(SystemTable, a2 - 12, a3, (_DWORD *)(v4 + 7)), result >= 0) ) /*0xffda6f2f*/ + if ( *(_BYTE *)(a2 + 32) || (result = SataPortRead(SystemTable, a2 - 12, a3, (_DWORD *)(v4 + 7)), result >= 0) ) /*0xffda6f2f*/ { v6 = (_DWORD *)(v4 + 23); /*0xffda6f31*/ *a4 = *v6++; /*0xffda6f36*/ @@ -124,7 +124,7 @@ return -2147483646; /*0xffda6f5b*/ if ( !*(_BYTE *)(a2 + 44) ) /*0xffda6f5d*/ { - result = sub_FFDA77F9(SystemTable, a2); /*0xffda6f68*/ + result = SataPortGetDevice(SystemTable, a2); /*0xffda6f68*/ if ( result < 0 ) /*0xffda6f6f*/ return result; /*0xffda6f6f*/ *(_BYTE *)(a2 + 44) = 1; /*0xffda6f71*/ @@ -135,7 +135,7 @@ if ( !*(_BYTE *)(v5 + 39) ) /*0xffda6f7e*/ { if ( *(_DWORD *)(v5 + 40) == 1 ) /*0xffda6f88*/ - sub_FFDA936E((int)SystemTable, v5); /*0xffda6f8f*/ + AtaIdentifyDeviceSetup((int)SystemTable, v5); /*0xffda6f8f*/ *(_BYTE *)(v5 + 39) = 1; /*0xffda6f94*/ } v6 = (_DWORD *)(v5 + 7); /*0xffda6f9b*/ @@ -149,7 +149,7 @@ int SataPortReadExt(int SystemTable, int a2, unsigned int a3, unsigned __int64 a4, unsigned int a5, int a6) { if ( a2 && a3 ) /*0xffda6fc0*/ - return sub_FFDA6FEB(SystemTable, a2 - 12, a3, a4, a5, a6); /*0xffda6fd8*/ + return SataPortReadExt(SystemTable, a2 - 12, a3, a4, a5, a6); /*0xffda6fd8*/ else return -2147483646; /*0xffda6fe2*/ } @@ -175,7 +175,7 @@ return 0; /*0xffda702d*/ if ( !*(_BYTE *)(a2 + 44) ) /*0xffda7032*/ { - result = sub_FFDA77F9(SystemTable, a2); /*0xffda703d*/ + result = SataPortGetDevice(SystemTable, a2); /*0xffda703d*/ if ( result < 0 ) /*0xffda7044*/ return result; /*0xffda7044*/ *(_BYTE *)(a2 + 44) = 1; /*0xffda704a*/ @@ -190,9 +190,9 @@ if ( !(_BYTE)v9 ) /*0xffda709c*/ return -2147483636; /*0xffda70a3*/ if ( *(_DWORD *)(v7 + 40) ) /*0xffda70a5*/ - return sub_FFDA8E17(v7, a6, a5, a4); /*0xffda70fd*/ + return AtaPioDataTransfer(v7, a6, a5, a4); /*0xffda70fd*/ if ( a4 <= v10 && a4 + a5 / v11 <= v10 + 1 ) /*0xffda70cd*/ - return sub_FFDA8BAB(v7, a6, a5, a4, HIDWORD(a4), v11); /*0xffda70e4*/ + return AtaNonDataCommand(v7, a6, a5, a4, HIDWORD(a4), v11); /*0xffda70e4*/ } return -2147483646; /*0xffda70cd*/ } @@ -661,9 +661,9 @@ int __thiscall AhciAllocPciResource(__int64 *this) { - _DWORD *v2; // eax void *v3; // ecx _DWORD *v4; // eax __int64 v5; // rax unsigned int v6; // esi unsigned int v7; // ebx _WORD *i; // edx int n0xFFFF; // ecx __int64 v10; // rax _DWORD *v11; // eax v2 = sub_FFDAA7E4(this); /*0xffda7aa5*/ + _DWORD *v2; // eax void *v3; // ecx _DWORD *v4; // eax __int64 v5; // rax unsigned int v6; // esi unsigned int v7; // ebx _WORD *i; // edx int n0xFFFF; // ecx __int64 v10; // rax _DWORD *v11; // eax v2 = PeiGetPcdDb(this); /*0xffda7aa5*/ *this = ((__int64 ( *)(int))v2[4])(5); /*0xffda7aaf*/ - v4 = sub_FFDAA7E4(v3); /*0xffda7ab4*/ + v4 = PeiGetPcdDb(v3); /*0xffda7ab4*/ v5 = ((__int64 ( *)(int))v4[4])(5); /*0xffda7abb*/ v6 = v5 - 0x100000; /*0xffda7ac2*/ v7 = ((unsigned __int64)(v5 + 4293918720LL) >> 32) - 1; /*0xffda7aca*/ @@ -680,7 +680,7 @@ n0xFFFF = (*(_QWORD *)(v10 + 32) + *(_QWORD *)(v10 + 40)) >> 32; /*0xffda7af5*/ if ( *(_QWORD *)(v10 + 32) + *(_QWORD *)(v10 + 40) >= __PAIR64__(v7, v6) ) /*0xffda7b00*/ { - v11 = sub_FFDAA7E4((void *)n0xFFFF); /*0xffda7b13*/ + v11 = PeiGetPcdDb((void *)n0xFFFF); /*0xffda7b13*/ v10 = ((__int64 ( *)(int))v11[4])(5) + 0x10000000; /*0xffda7b1d*/ *this = v10; /*0xffda7b26*/ return v10; /*0xffda7b26*/ @@ -938,8 +938,8 @@ } else { - sub_FFDAA8D9(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", -2147483639); /*0xffda7dd8*/ - v6 = sub_FFDAA8A8(); /*0xffda7de0*/ + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", -2147483639); /*0xffda7dd8*/ + v6 = DebugGetErrorLevel(); /*0xffda7de0*/ if ( v6 ) /*0xffda7de7*/ (*(void ( **)(const char *, int, const char *))(v6 + 4))( /*0xffda7df8*/ "e:\\hs\\AmiModulePkg\\AhciRecovery\\AhciRecovery.c", @@ -983,7 +983,7 @@ return result; /*0xffda7fa9*/ } -{"addr":"0xffda7fb0","code":"int AhciPciBusEnumerate(int *HobPtr, unsigned __int8 a2, unsigned int MmioBase, char a4)\n{\n unsigned __int8 n0x1F_1; // bh\n int v5; // esi\n unsigned __int8 n7_2; // bl\n int n0x1F_2; // ebp\n int v8; // esi\n char v9; // al\n int v10; // eax\n char v11; // al\n unsigned int MmioBase_2; // edi\n int *HobPtr_2; // esi\n int v14; // ecx\n int v15; // edx\n unsigned __int8 v16; // bl\n int result; // eax\n unsigned __int64 v18; // kr00_8\n unsigned __int8 v19; // cl\n _BYTE *v20; // edx\n int v21; // esi\n unsigned int MmioBase_3; // esi\n __int64 v23; // kr08_8\n int v24; // edi\n unsigned int *v25; // edi\n int v26; // eax\n int ErrorLevel; // eax\n int v28; // [esp-Ch] [ebp-68h]\n char v30; // [esp+11h] [ebp-4Bh]\n char v31; // [esp+12h] [ebp-4Ah] BYREF\n unsigned __int8 n0x1F; // [esp+13h] [ebp-49h]\n __int16 v33; // [esp+14h] [ebp-48h] BYREF\n unsigned int MmioBase_1; // [esp+18h] [ebp-44h] BYREF\n unsigned int v35; // [esp+1Ch] [ebp-40h] BYREF\n unsigned __int8 n7[4]; /... [12405 chars total]","refs":[{"addr":"0xffdab2a0","name":"MmioBase"},{"addr":"0xffdab331","name":"byte_FFDAB331"},{"addr":"0xffdaa8d9","name":"DebugPrint"},{"addr":"0xffdaac70","name":"aAhcirecoveryEn","string":"\n AhciRecovery: Enumerating Bus:%x Dev:%x Func:%x"},{"addr":"0xffdaaa90","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffdaa8a8","name":"DebugGetErrorLevel"},{"addr":"0xffdaaac8","name":"aEHsAmimodulepk","string":"e:\\hs\\AmiModulePkg\\AhciRecovery\\AhciRecovery.c"},{"addr":"0xffdaaab4","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"},{"addr":"0xffdab29c","name":"n6"},{"addr":"0xffdab2e9","name":"byte_FFDAB2E9"}]} +/* JSON dump contamination removed; restored source continues below. */ Output truncated. Run: curl -o .ida-mcp/e8ed2f09-657a-466e-94e0-40f015e800dc.json http://127.0.0.1:13352/output/e8ed2f09-657a-466e-94e0-40f015e800dc.json int AhciResetAndInitControllers() { int *ControllerInfo; // ebx int ControllerCount; // ebp int CtrlrPtr; // eax _DWORD *AhciBase; // esi unsigned __int8 PortIndex; // cl int PortOffset; // edi int PollStatus; // eax int ErrorLevel; // eax int PollStatus2; // eax int DbgLvl2; // eax unsigned __int64 PairResult; // kr20_8 int *SataDevInfoPtr; // ebx int SataDevCount; // ebp unsigned __int64 DevBdfAddr; // kr30_8 unsigned __int8 DevIndex; // al _BYTE *DevEntryPtr; // eax int DevInfoBase; // ecx unsigned __int8 BusNum; // dl unsigned __int8 DevFuncNum; // dh unsigned __int8 RegValue; // cl int RegOffset; // esi unsigned __int64 BdfAddr64; // [esp-3Ch] [ebp-54h] @@ -1167,7 +1167,7 @@ { int v5; // eax int v6; // ecx int v7; // edi int v8; // esi int v9; // [esp+8h] [ebp-4h] BYREF if ( !a2 ) /*0xffda88f0*/ return 0; /*0xffda88f2*/ - v5 = sub_FFDA892B(a2); /*0xffda88fa*/ + v5 = HobCalcTotalSize(a2); /*0xffda88fa*/ v6 = *SystemTable; /*0xffda88ff*/ v7 = v5; /*0xffda8902*/ v9 = 0; /*0xffda8904*/ @@ -1342,7 +1342,7 @@ (*(void ( **)(int *, int, _DWORD))(*(_DWORD *)SystemTable + 84))(&v20, 37, 0); /*0xffda8c42*/ n64 = 64; /*0xffda8c4c*/ v22 = v33; /*0xffda8c51*/ - v11 = sub_FFDAA85A(v31, v17); /*0xffda8c5e*/ + v11 = _PAIR64__(v31, v17); /*0xffda8c5e*/ v26 = v11; /*0xffda8c6c*/ v25 = BYTE1(v31); /*0xffda8c73*/ v28 = HIBYTE(v11); /*0xffda8c7c*/ @@ -1353,7 +1353,7 @@ n36 = 36; /*0xffda8cab*/ v34 = v7 *v33; /*0xffda8cb0*/ v21 = v34; /*0xffda8cb4*/ - if ( sub_FFDA9D23((int *)a1, (int)&v20) < 0 ) /*0xffda8cc0*/ + if ( AtaCommandSubmit((int *)a1, (int)&v20) < 0 ) /*0xffda8cc0*/ break; /*0xffda8cc0*/ a2 += v34; /*0xffda8cc8*/ v17 = (v21 / v7 + __PAIR64__(v17, v31)) >> 32; /*0xffda8cda*/ @@ -1383,7 +1383,7 @@ v20 = a2; /*0xffda8d8e*/ v13 = v35 ? n256_1 : n256; v21 = v7 *v13; /*0xffda8daf*/ - if ( sub_FFDA9D23((int *)a1, (int)&v20) < 0 ) /*0xffda8dc0*/ + if ( AtaCommandSubmit((int *)a1, (int)&v20) < 0 ) /*0xffda8dc0*/ break; /*0xffda8dc0*/ if ( v35 ) /*0xffda8dcf*/ n256_2 = n256_1; /*0xffda8dd9*/ @@ -2104,7 +2104,7 @@ { *(_DWORD *)(v7 + v4 + 304) |= 0x7FF0F03u; /*0xffda9ebc*/ *(_DWORD *)(v7 + v4 + 272) |= 0xFFC000FF; /*0xffda9ec7*/ - sub_FFDAA8D9(0x80000000, "PxSERR Port Serial ATA Error Data32_SERR:%x Data32_IS :%x\n", v8, v2); /*0xffda9ede*/ + DebugPrint(0x80000000, "PxSERR Port Serial ATA Error Data32_SERR:%x Data32_IS :%x\n", v8, v2); /*0xffda9ede*/ return -2147483641; /*0xffda9ede*/ } if ( *(_BYTE *)(v3 + 32) == 95 ) /*0xffda9e12*/ @@ -2121,16 +2121,16 @@ v1 = v10; /*0xffda9e53*/ } while ( n0xEA60 < 0xEA60 ); /*0xffda9e5d*/ - sub_FFDAA36D(v4, v11, 0x38u, 0xFFFF, 200); /*0xffda9e71*/ + AhciPortPollRegister(v4, v11, 0x38u, 0xFFFF, 200); /*0xffda9e71*/ if ( *(_DWORD *)(v7 + v4 + 312) ) /*0xffda9e79*/ { - sub_FFDAA8D9(0x80000000, "Command Issue (CI) not clear Data32_CI:%x\n", *(_DWORD *)(v7 + v4 + 312)); /*0xffda9e95*/ + DebugPrint(0x80000000, "Command Issue (CI) not clear Data32_CI:%x\n", *(_DWORD *)(v7 + v4 + 312)); /*0xffda9e95*/ } else { if ( (*(_DWORD *)(v7 + v4 + 288) & 9) == 0 ) /*0xffda9ea8*/ return 0; /*0xffda9eba*/ - sub_FFDAA8D9(0x80000000, "BSY and DRQ not cleared Task File Data Reg:%x\n", *(_DWORD *)(v7 + v4 + 288)); /*0xffda9eb6*/ + DebugPrint(0x80000000, "BSY and DRQ not cleared Task File Data Reg:%x\n", *(_DWORD *)(v7 + v4 + 288)); /*0xffda9eb6*/ } return -2147483641; /*0xffda9eeb*/ } @@ -2181,7 +2181,7 @@ while ( n0x400000 ) /*0xffdaa03f*/ { *v7 = *a2; /*0xffda9fda*/ - v7[1] = sub_FFDAA85A(*a2, 0); /*0xffda9fe6*/ + v7[1] = _PAIR64__(*a2, 0); /*0xffda9fe6*/ n0x3FFFFF = 0x3FFFFF; /*0xffda9fe9*/ if ( n0x400000 < 0x400000 ) /*0xffda9ff6*/ n0x3FFFFF = n0x400000 - 1; /*0xffda9ff8*/ @@ -2232,7 +2232,7 @@ *(_DWORD *)(a2 + 4) = 0; /*0xffdaa10f*/ *(_WORD *)(a2 + 2) = 0; /*0xffdaa112*/ *(_DWORD *)(a2 + 8) = a3; /*0xffdaa11b*/ - *(_DWORD *)(a2 + 12) = sub_FFDAA85A(a3, a4); /*0xffdaa125*/ + *(_DWORD *)(a2 + 12) = _PAIR64__(a3, a4); /*0xffdaa125*/ return 0; /*0xffdaa12a*/ } @@ -2244,7 +2244,7 @@ v4 = v1 << 7; /*0xffdaa13b*/ if ( (*(_BYTE *)(v4 + *v3 + 288) & 0x88) == 0 ) /*0xffdaa149*/ return v2; /*0xffdaa149*/ - result = sub_FFDAA40C( /*0xffdaa171*/ + result = AhciPortCOMRESET( /*0xffdaa171*/ v3, v1, 255, @@ -2506,12 +2506,12 @@ int v1; // eax int v2; // eax int v3; // eax void *this_1; // [esp+0h] [ebp-4h] this_1 = this; /*0xffdaa7e7*/ - v1 = sub_FFDAAA23(); /*0xffdaa7e8*/ + v1 = PeiServicesGetPointer(); /*0xffdaa7e8*/ v2 = (*(int (__stdcall **)(int))(*(_DWORD *)v1 + 32))(v1); /*0xffdaa7fd*/ if ( v2 < 0 ) /*0xffdaa805*/ { - sub_FFDAA8D9(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v2); /*0xffdaa812*/ - v3 = sub_FFDAA8A8(); /*0xffdaa81a*/ + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v2); /*0xffdaa812*/ + v3 = DebugGetErrorLevel(); /*0xffdaa81a*/ if ( v3 ) /*0xffdaa821*/ (*(void ( **)(const char *, int, const char *))(v3 + 4))( /*0xffdaa82f*/ "e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c", @@ -2540,7 +2540,7 @@ int DebugGetErrorLevel() { - int v0; // eax int v2; // [esp+0h] [ebp-8h] BYREF int v3; // [esp+4h] [ebp-4h] BYREF v0 = sub_FFDAAA23(); /*0xffdaa8ad*/ + int v0; // eax int v2; // [esp+0h] [ebp-8h] BYREF int v3; // [esp+4h] [ebp-4h] BYREF v0 = PeiServicesGetPointer(); /*0xffdaa8ad*/ if ( (*(int ( **)(int, void *, _DWORD, int *, int *))(*(_DWORD *)v0 + 32))(v0, &unk_FFDAB190, 0, &v2, &v3) >= 0 ) /*0xffdaa8cc*/ return v3; /*0xffdaa8d2*/ else return 0; /*0xffdaa8ce*/ @@ -2553,7 +2553,7 @@ v3 = (int ( **)(int, const char *, char *))result; /*0xffdaa8df*/ if ( result ) /*0xffdaa8e3*/ { - result = sub_FFDAA9D4(); /*0xffdaa8e5*/ + result = PchGetRtcPowerStatus(); /*0xffdaa8e5*/ if ( (result & a1) != 0 ) /*0xffdaa8f0*/ return (*v3)(a1, a2, (char *)va); /*0xffdaa8fc*/ } @@ -2576,7 +2576,7 @@ int HobGetHandoffInfoTable() { - int v0; // eax int v1; // eax int v2; // eax int v3; // eax int v5; // [esp+4h] [ebp-4h] BYREF v0 = sub_FFDAAA23(); /*0xffdaa926*/ + int v0; // eax int v1; // eax int v2; // eax int v3; // eax int v5; // [esp+4h] [ebp-4h] BYREF v0 = PeiServicesGetPointer(); /*0xffdaa926*/ v1 = (*(int ( **)(int, int *))(*(_DWORD *)v0 + 48))(v0, &v5); /*0xffdaa932*/ if ( v1 < 0 ) /*0xffdaa93e*/ { @@ -2652,7 +2652,7 @@ { int v0; // esi _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF int v3; // [esp+6h] [ebp-6h] - sub_FFDAAA55(v2); /*0xffdaaa2c*/ + AsmReadIdtr(v2); /*0xffdaaa2c*/ v0 = *(_DWORD *)(v3 - 4); /*0xffdaaa34*/ if ( !v0 ) /*0xffdaaa39*/ DebugAssert( /*0xffdaaa48*/ diff --git a/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.h b/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.h index 5334f2e..1150e91 100644 --- a/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.h +++ b/AmiModulePkg/AhciRecovery/AhciRecovery/AhciRecovery.h @@ -170,7 +170,7 @@ char a2 ); -{"addr":"0xffda7fb0","code":"int +int EFIAPI AhciPciBusEnumerate( int *HobPtr, @@ -496,4 +496,4 @@ void *this ); -#endif /* __AHCIRECOVERY_H__ */ \ No newline at end of file +#endif /* __AHCIRECOVERY_H__ */ diff --git a/AmiModulePkg/AmiStatusCode/StatusCodePei/StatusCodePei.c b/AmiModulePkg/AmiStatusCode/StatusCodePei/StatusCodePei.c index f377874..660a4de 100644 --- a/AmiModulePkg/AmiStatusCode/StatusCodePei/StatusCodePei.c +++ b/AmiModulePkg/AmiStatusCode/StatusCodePei/StatusCodePei.c @@ -1,181 +1,2724 @@ -// -// StatusCodePei.efi - Full Decompilation -// Source: IDA Pro MCP port 13392 -// Functions: 86 -// - #include #include -{"addr":"0xffe3f18c","code":"void *SetMem(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe3f199*/\n return buf; /*0xffe3f19f*/\n}"} +void *SetMem(void *buf, unsigned int count, char value) +{ + memset(buf, value, count); /*0xffe3f199*/ + return buf; /*0xffe3f19f*/ +} + + +char *CopyMem(char *dst, char *src, unsigned int count) +{ + unsigned int count_1; // edx + char *dst_1; // edi + char *src_1; // esi + + count_1 = count; /*0xffe3f1b6*/ + if ( src < dst && &src[count - 1] >= dst ) /*0xffe3f1c4*/ + { + src_1 = &src[count - 1]; /*0xffe3f1d8*/ + dst_1 = &dst[count - 1]; /*0xffe3f1da*/ + } + else + { + count_1 = count & 3; /*0xffe3f1c8*/ + qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe3f1d1*/ + src_1 = &src[4 * (count >> 2)]; /*0xffe3f1d1*/ + dst_1 = &dst[4 * (count >> 2)]; /*0xffe3f1d1*/ + } + qmemcpy(dst_1, src_1, count_1); /*0xffe3f1e1*/ + return dst; /*0xffe3f1e8*/ +} + + +int CopyMemDwords(int a1, int a2, int a3, int a4) +{ + do /*0xffe3f225*/ + { + *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe3f21d*/ + *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe3f221*/ + } + while ( a2 ); /*0xffe3f225*/ + return a1; /*0xffe3f229*/ +} + + +void *SetMem32(void *buf, unsigned int count, int value) +{ + memset32(buf, value, count); /*0xffe3f239*/ + return buf; /*0xffe3f23f*/ +} + + +EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + if ( (MmioRead32(1024068) & 0x80u) == 0 ) /*0xffe3f2d8*/ + { + MmioWrite32(1024064, 1280); /*0xffe3f2e4*/ + IoOr32(); /*0xffe3f2e9*/ + } + return StatusCodePeiEntry(ImageHandle, SystemTable); +} + + +int __thiscall StatusCodeAllocCallbackNode(void *Node) +{ + int PeiServices; // eax + int NodeBase; // [esp+0h] [ebp-4h] + + PeiServices = GetPeiServices(); /*0xffe3f2ff*/ + if ( (*(int (__stdcall **)(int))(*(_DWORD *)PeiServices + 52))(PeiServices) < 0 ) /*0xffe3f317*/ + return 0; /*0xffe3f319*/ + ZeroMem((unsigned int)Node + 8, src, 0x10u); /*0xffe3f32b*/ + *(_DWORD *)(NodeBase + 24) = 0; /*0xffe3f339*/ + return NodeBase + 24; /*0xffe3f33e*/ +} + + +int StatusCodeRemoveCallback(_WORD *Callback) +{ + _WORD *Callback_1; // esi + _WORD *PpiList; // eax + int GuidScanResult; // ecx + int Index; // edx + + Callback_1 = Callback; /*0xffe3f344*/ + if ( !Callback ) /*0xffe3f349*/ + return -2147483646; /*0xffe3f34b*/ + PpiList = FindGuidInPpiList(src); /*0xffe3f357*/ +LABEL_4: + for ( Callback = PpiList; ; PpiList = Callback ) /*0xffe3f35c*/ + { + if ( !PpiList ) /*0xffe3f389*/ + return -2147483634; /*0xffe3f392*/ + Index = 0; /*0xffe3f361*/ + if ( *((_DWORD *)PpiList + 6) ) /*0xffe3f363*/ + break; /*0xffe3f363*/ +LABEL_8: + if ( SPrintScanGuid(GuidScanResult, &Callback) < 0 ) /*0xffe3f37e*/ + { + PpiList = 0; /*0xffe3f380*/ + goto LABEL_4; /*0xffe3f382*/ + } + } + while ( *(_WORD **)&PpiList[2 *Index + 14] != Callback_1 ) /*0xffe3f36c*/ + { + if ( (unsigned int)++Index >= *((_DWORD *)PpiList + 6) ) /*0xffe3f372*/ + goto LABEL_8; /*0xffe3f372*/ + } + *(_DWORD *)&PpiList[2 *Index + 14] = *(_DWORD *)&PpiList[2 * (*((_DWORD *)PpiList + 6))-- + 12]; /*0xffe3f39a*/ + return 0; /*0xffe3f390*/ +} + + +int StatusCodeRegisterCallback(_WORD *Callback) +{ + _WORD *Callback_1; // edi + _WORD *PpiList; // eax + void *This; // ecx + _DWORD *CallbackNode; // esi + unsigned int CallbackCount; // edx + unsigned int CallbackCount_1; // ecx + _DWORD *CallbackPtr; // eax + + Callback_1 = Callback; /*0xffe3f3a9*/ + if ( !Callback ) /*0xffe3f3ae*/ + return -2147483646; /*0xffe3f3b0*/ + PpiList = FindGuidInPpiList(src); /*0xffe3f3bd*/ + CallbackNode = 0; /*0xffe3f3c2*/ + Callback = PpiList; /*0xffe3f3c4*/ + if ( PpiList ) /*0xffe3f3c9*/ + { + do /*0xffe3f403*/ + { + CallbackCount = *((_DWORD *)PpiList + 6); /*0xffe3f3cb*/ + if ( CallbackCount < 8 ) /*0xffe3f3d1*/ + CallbackNode = PpiList + 12; /*0xffe3f3d3*/ + CallbackCount_1 = 0; /*0xffe3f3d6*/ + if ( CallbackCount ) /*0xffe3f3da*/ + { + CallbackPtr = PpiList + 14; /*0xffe3f3dc*/ + while ( (_WORD *)*CallbackPtr != Callback_1 ) /*0xffe3f3e1*/ + { + ++CallbackCount_1; /*0xffe3f3e3*/ + ++CallbackPtr; /*0xffe3f3e4*/ + if ( CallbackCount_1 >= CallbackCount ) /*0xffe3f3e9*/ + goto LABEL_10; /*0xffe3f3e9*/ + } + return -2147483628; /*0xffe3f420*/ + } +LABEL_10: + if ( SPrintScanGuid(CallbackCount_1, &Callback) >= 0 ) /*0xffe3f3f5*/ + { + PpiList = Callback; /*0xffe3f3fe*/ + } + else + { + PpiList = 0; /*0xffe3f3f7*/ + Callback = 0; /*0xffe3f3f9*/ + } + } + while ( PpiList ); /*0xffe3f403*/ + if ( CallbackNode ) /*0xffe3f407*/ + goto LABEL_18; /*0xffe3f407*/ + } + CallbackNode = (_DWORD *)StatusCodeAllocCallbackNode(This); /*0xffe3f40e*/ + if ( !CallbackNode ) /*0xffe3f412*/ + return -2147483639; /*0xffe3f414*/ +LABEL_18: + CallbackNode[++*CallbackNode] = Callback_1; /*0xffe3f422*/ + return 0; /*0xffe3f42d*/ +} + + +int StatusCodeDispatchCallbacks( + int PeiServices, + int CodeType, + int Value, + int Instance, + int CallerId, + int StatusCodeData) +{ + int GuidScanResult; // ecx + unsigned __int16 *GuidInPpiList; // esi + unsigned int Index; // ebx + void ( **Callback)(int, int, int, int, int, int); // edi + unsigned __int16 *GuidInPpiList_1; // [esp+14h] [ebp-8h] BYREF + int PeiServices_1; // [esp+18h] [ebp-4h] + + PeiServices_1 = PeiServices; /*0xffe3f436*/ + GuidInPpiList = FindGuidInPpiList(src); /*0xffe3f447*/ +LABEL_2: + GuidInPpiList_1 = GuidInPpiList; /*0xffe3f449*/ + while ( GuidInPpiList ) /*0xffe3f493*/ + { + Index = 0; /*0xffe3f44f*/ + if ( *((_DWORD *)GuidInPpiList + 6) ) /*0xffe3f451*/ + { + Callback = (void ( **)(int, int, int, int, int, int))(GuidInPpiList + 14); /*0xffe3f456*/ + do /*0xffe3f47a*/ + { + (*Callback++)(PeiServices_1, CodeType, Value, Instance, CallerId, StatusCodeData); /*0xffe3f46e*/ + ++Index; /*0xffe3f476*/ + } + while ( Index < *((_DWORD *)GuidInPpiList + 6) ); /*0xffe3f47a*/ + } + if ( SPrintScanGuid(GuidScanResult, &GuidInPpiList_1) < 0 ) /*0xffe3f487*/ + { + GuidInPpiList = 0; /*0xffe3f489*/ + goto LABEL_2; /*0xffe3f48b*/ + } + GuidInPpiList = GuidInPpiList_1; /*0xffe3f48d*/ + } + return 0; /*0xffe3f495*/ +} + + +int StatusCodeReport(int PeiServices, int CodeType, int Value, int Instance, int CallerId, int StatusCodeData) +{ + char Buffer[256]; // [esp+0h] [ebp-100h] BYREF + + StatusCodeDispatchCallbacks(PeiServices, CodeType, Value, Instance, CallerId, StatusCodeData); /*0xffe3f4ba*/ + return SerialPortWrite(PeiServices, CodeType, Value, Instance, CallerId, StatusCodeData, Buffer); /*0xffe3f4e0*/ +} + + +int ( *StatusCodeSerialReport(int Value, unsigned __int8 *FormatString, int Args))(int a1, char *_r_n) +{ + int Index; // ebx + int ( *PeiServices_1)(int, char *); // eax + int ( *PeiServices)(int, char *); // esi + void ( *Callback)(char *, int); // eax + int StatusCodeData[5]; // [esp+10h] [ebp-178h] BYREF + int Value_1; // [esp+24h] [ebp-164h] + int StatusCodeData2; // [esp+28h] [ebp-160h] + int StatusCodeData3; // [esp+2Ch] [ebp-15Ch] + int StatusCodeData4; // [esp+30h] [ebp-158h] + int StatusCodeData5; // [esp+34h] [ebp-154h] + int StatusCodeData6; // [esp+38h] [ebp-150h] + int StatusCodeData7; // [esp+3Ch] [ebp-14Ch] + int StatusCodeData8; // [esp+40h] [ebp-148h] + int StatusCodeData9; // [esp+44h] [ebp-144h] + int StatusCodeData10; // [esp+48h] [ebp-140h] + int StatusCodeData11; // [esp+4Ch] [ebp-13Ch] + int StatusCodeData12; // [esp+50h] [ebp-138h] + int StatusCodeData13; // [esp+54h] [ebp-134h] + int StatusCodeData14; // [esp+58h] [ebp-130h] + int StatusCodeData15; // [esp+5Ch] [ebp-12Ch] + int StatusCodeData16; // [esp+60h] [ebp-128h] + int StatusCodeData17; // [esp+64h] [ebp-124h] + int StatusCodeData18; // [esp+68h] [ebp-120h] + int StatusCodeData19; // [esp+6Ch] [ebp-11Ch] + int StatusCodeData20; // [esp+70h] [ebp-118h] + int StatusCodeData21; // [esp+74h] [ebp-114h] + int StatusCodeData22; // [esp+78h] [ebp-110h] + int StatusCodeData23; // [esp+7Ch] [ebp-10Ch] + int StatusCodeData24; // [esp+80h] [ebp-108h] + int StatusCodeData25; // [esp+84h] [ebp-104h] + char OutputBuffer; // [esp+88h] [ebp-100h] BYREF + _BYTE TempBuffer[255]; // [esp+89h] [ebp-FFh] BYREF + + Index = 0; /*0xffe3f4f1*/ + StatusCodeData[1] = -1706126778; /*0xffe3f4f3*/ + StatusCodeData[0] = 23330836; /*0xffe3f500*/ + StatusCodeData[2] = 299226451; /*0xffe3f51d*/ + StatusCodeData[3] = 100721287; /*0xffe3f525*/ + StatusCodeData[4] = -1178385111; /*0xffe3f52d*/ + Value_1 = 0; /*0xffe3f535*/ + StatusCodeData2 = 0; /*0xffe3f539*/ + StatusCodeData3 = 0; /*0xffe3f53d*/ + StatusCodeData4 = 0; /*0xffe3f541*/ + StatusCodeData5 = 0; /*0xffe3f545*/ + StatusCodeData6 = 0; /*0xffe3f549*/ + StatusCodeData7 = 0; /*0xffe3f54d*/ + StatusCodeData8 = 0; /*0xffe3f551*/ + StatusCodeData9 = 0; /*0xffe3f555*/ + StatusCodeData10 = 0; /*0xffe3f559*/ + StatusCodeData11 = 0; /*0xffe3f55d*/ + StatusCodeData12 = 0; /*0xffe3f561*/ + StatusCodeData13 = 0; /*0xffe3f565*/ + StatusCodeData14 = 0; /*0xffe3f569*/ + StatusCodeData15 = 0; /*0xffe3f56d*/ + StatusCodeData16 = 0; /*0xffe3f571*/ + StatusCodeData17 = 0; /*0xffe3f575*/ + StatusCodeData18 = 0; /*0xffe3f579*/ + StatusCodeData19 = 0; /*0xffe3f57d*/ + StatusCodeData20 = 0; /*0xffe3f581*/ + StatusCodeData21 = 0; /*0xffe3f585*/ + StatusCodeData22 = 0; /*0xffe3f58c*/ + StatusCodeData23 = 0; /*0xffe3f593*/ + StatusCodeData24 = 0; /*0xffe3f59a*/ + StatusCodeData25 = 0; /*0xffe3f5a1*/ + OutputBuffer = 0; /*0xffe3f5a8*/ + SetMemWrapper((int)TempBuffer, TempBuffer, 0, 0xFFu); /*0xffe3f5af*/ + PeiServices_1 = (int ( *)(int, char *))GetPeiServices(); /*0xffe3f5b7*/ + PeiServices = PeiServices_1; /*0xffe3f5bc*/ + if ( FormatString ) /*0xffe3f5c1*/ + { + AsciiSPrintUnicodeFormat(&OutputBuffer, 0x100u, 0, FormatString, Args, 0); /*0xffe3f5d7*/ + Value_1 = Value; /*0xffe3f5f0*/ + StatusCodeDispatchCallbacks((int)PeiServices, 3, 50659328, 0, 0, (int)StatusCodeData); /*0xffe3f5f4*/ + for ( Callback = (void ( *)(char *, int))i[0]; /*0xffe3f5f9*/ + Callback; + Callback = (void ( *)(char *, int))dword_FFE43E14[Index++] ) + { + Callback(&OutputBuffer, Value); /*0xffe3f60c*/ + } + return PeiServicesInstallPpi((int)PeiServices, &OutputBuffer); /*0xffe3f625*/ + } + return PeiServices_1; /*0xffe3f62a*/ +} + + +int ( *StatusCodeDebugAssert(double AssertString, int LineNumber))(int a1, char *_r_n) +{ + int Index; // ebx + int PeiServices; // esi + void ( *i)(char *, _DWORD, _DWORD); // eax + double ExtraInfo; // [esp+0h] [ebp-180h] + int StatusCodeData[30]; // [esp+8h] [ebp-178h] BYREF + char AssertBuffer; // [esp+80h] [ebp-100h] BYREF + _BYTE TempBuffer[255]; // [esp+81h] [ebp-FFh] BYREF + + Index = 0; /*0xffe3f63e*/ + StatusCodeData[1] = -1706126778; /*0xffe3f640*/ + StatusCodeData[0] = 23330836; /*0xffe3f64c*/ + StatusCodeData[2] = 299226451; /*0xffe3f669*/ + StatusCodeData[3] = 100721287; /*0xffe3f671*/ + StatusCodeData[4] = -1178385111; /*0xffe3f679*/ + memset(&StatusCodeData[6], 0, 96); /*0xffe3f685*/ + AssertBuffer = 0; /*0xffe3f6ee*/ + SetMemWrapper((int)TempBuffer, TempBuffer, 0, 0xFFu); /*0xffe3f6f5*/ + PeiServices = GetPeiServices(); /*0xffe3f705*/ + AsciiSPrint( + &AssertBuffer, + 0x100u, + "ASSERT %a(%d): %a\n Press any key to continue. \n", + AssertString, + LineNumber, + ExtraInfo); + StatusCodeData[5] = 0x80000000; /*0xffe3f728*/ + StatusCodeDispatchCallbacks(PeiServices, 3, 50659328, 0, 0, (int)StatusCodeData); /*0xffe3f73d*/ + for ( i = (void ( *)(char *, _DWORD, _DWORD))i_0; i; i = (void ( *)(char *, _DWORD, _DWORD))::i[Index++] ) /*0xffe3f742*/ + i(&AssertBuffer, LODWORD(AssertString), HIDWORD(AssertString)); /*0xffe3f75a*/ + return PeiServicesInstallPpi(PeiServices, &AssertBuffer); /*0xffe3f779*/ +} + + +int StatusCodePeiEntry(int FileHandle, int __return_address) +{ + int v4; // eax + int PeiServices; // eax + int Status; // eax + int Status_1; // esi + int ReportStatusCodePpi; // eax + int v10; // eax + int Status_2; // eax + int v12; // eax + int StatusCodePpi; // esi + int v14; // eax + int Status_3; // eax + int v16; // eax + int Descriptor_1; // esi + int v18; // eax + int Status_4; // eax + int v20; // eax + int Index; // edi + int (*i)(); // eax + void *This; // ecx + char StatusCodePpiBuffer[4]; // [esp+8h] [ebp-10h] BYREF + char StatusCodePpiBuffer2[4]; // [esp+Ch] [ebp-Ch] BYREF + int Descriptor; // [esp+10h] [ebp-8h] BYREF + int Descriptor2; // [esp+14h] [ebp-4h] BYREF + + v4 = GetPeiServices(); /*0xffe3f78b*/ + if ( (*(int ( **)(int))(*(_DWORD *)v4 + 116))(FileHandle) == -2147483628 ) /*0xffe3f79c*/ + { + PeiServices = GetPeiServices(); /*0xffe3f7a2*/ + Status = (*(int ( **)(int, void *, _DWORD, int *, char *))(*(_DWORD *)PeiServices + 32))( /*0xffe3f7b9*/ + PeiServices, + &unk_FFE4356C, + 0, + &Descriptor2, + StatusCodePpiBuffer2); + Status_1 = Status; /*0xffe3f7bc*/ + if ( Status >= 0 ) /*0xffe3f7c3*/ + { + v10 = GetPeiServices(); /*0xffe3f7fd*/ + Status_2 = (*(int ( **)(int, void *, _DWORD, int *, char *))(*(_DWORD *)v10 + 32))( /*0xffe3f814*/ + v10, + &unk_FFE4353C, + 0, + &Descriptor, + StatusCodePpiBuffer); + Status_1 = Status_2; /*0xffe3f817*/ + if ( Status_2 >= 0 ) /*0xffe3f81e*/ + { + StatusCodePpi = Descriptor2; /*0xffe3f848*/ + v14 = GetPeiServices(); /*0xffe3f84b*/ + Status_3 = (*(int ( **)(int, int, void *))(*(_DWORD *)v14 + 28))(v14, StatusCodePpi, &unk_FFE4367C); /*0xffe3f859*/ + Status_1 = Status_3; /*0xffe3f85c*/ + if ( Status_3 >= 0 ) /*0xffe3f863*/ + { + Descriptor_1 = Descriptor; /*0xffe3f894*/ + v18 = GetPeiServices(); /*0xffe3f897*/ + Status_4 = (*(int ( **)(int, int, void *))(*(_DWORD *)v18 + 28))(v18, Descriptor_1, &unk_FFE435B8); /*0xffe3f8a5*/ + Status_1 = Status_4; /*0xffe3f8a8*/ + if ( Status_4 < 0 ) /*0xffe3f8af*/ + { + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status_4); /*0xffe3f8c0*/ + v20 = LocateReportStatusCodePpi(); /*0xffe3f8c8*/ + if ( v20 ) /*0xffe3f8cf*/ + (*(void ( **)(const char *, int, const char *))(v20 + 4))( /*0xffe3f8df*/ + "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c", + 513, + "!EFI_ERROR (Status)"); + } + } + else + { + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status_3); /*0xffe3f870*/ + v16 = LocateReportStatusCodePpi(); /*0xffe3f878*/ + if ( v16 ) /*0xffe3f87f*/ + (*(void ( **)(const char *, int, const char *))(v16 + 4))( /*0xffe3f88f*/ + "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c", + 506, + "!EFI_ERROR (Status)"); + } + } + else + { + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status_2); /*0xffe3f82b*/ + v12 = LocateReportStatusCodePpi(); /*0xffe3f833*/ + if ( v12 ) /*0xffe3f83a*/ + (*(void ( **)(const char *, int, const char *))(v12 + 4))( /*0xffe3f846*/ + "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c", + 499, + "!EFI_ERROR (Status)"); + } + } + else + { + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffe3f7d0*/ + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe3f7d8*/ + if ( ReportStatusCodePpi ) /*0xffe3f7df*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe3f7f0*/ + "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c", + 486, + "!EFI_ERROR (Status)"); + } + return Status_1; /*0xffe3f7f6*/ + } + else + { + Index = 0; /*0xffe3f8e5*/ + for ( i = PpiDescriptorPtr; i; i = (int (*)())dword_FFE427FC[Index++] ) /*0xffe3f8e7*/ + i(); /*0xffe3f8f0*/ + (*(void ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE435AC); /*0xffe3f908*/ + StatusCodeAllocCallbackNode(This); /*0xffe3f90b*/ + (*(void ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE435B8); /*0xffe3f918*/ + return (*(int ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE4367C); /*0xffe3f923*/ + } +} + + +int DebugAssertMsgs(int StatusCodeData, int _r_n) +{ + int v2; // esi + int v3; // eax + + v2 = StatusCodeData + 52; /*0xffe3f931*/ + v3 = 0; /*0xffe3f934*/ + if ( *(_BYTE *)(StatusCodeData + 52) ) /*0xffe3f936*/ + { + do /*0xffe3f93b*/ + ++v3; /*0xffe3f93a*/ + while ( *(_BYTE *)(v3 + v2) ); /*0xffe3f93b*/ + } + SPrintAsciiFormat( + _r_n, + 256, + (int)"ASSERT in %s on %i: %s\n", + (const char *)(StatusCodeData + 52), + *(_DWORD *)(StatusCodeData + 40), + (const char *)(v2 + v3 + 1)); + return 0; /*0xffe3f95e*/ +} + + +int StatusCodeToErrorStr(int n7, int _r_n) +{ + int n7_1; // esi + int i; // eax + double v5; // [esp-4h] [ebp-8h] + + n7_1 = ::n7; /*0xffe3f961*/ + for ( i = 0; ; ++i ) + { + if ( !n7_1 ) + { + SPrintAsciiFormat( + _r_n, + 256, + (int)"ERROR: Class:%X; Subclass:%X; Operation: %X\n", + n7 & 0xFF000000, + n7 & 0xFF0000, + (unsigned __int16)n7); + return 0; /*0xffe3f999*/ + } + if ( n7_1 == n7 ) /*0xffe3f96d*/ + break; /*0xffe3f96d*/ + n7_1 = dword_FFE435E4[2 *i]; /*0xffe3f96f*/ + } + LODWORD(v5) = (&off_FFE435E0)[2 *i]; // "Memory not installed" /*0xffe3f9a5*/ + SPrintAsciiFormat(_r_n, 256, (int)"ERROR: %a\n", v5); + return 0; /*0xffe3f9a3*/ +} + + +int StatusCodeFormatMsg(int CodeType, int Value, int StatusCodeData, _BYTE *Buffer) +{ + char *SrcPtr; // esi + char *WideSrcPtr; // ebp + unsigned __int16 Index; // dx + int DataType; // eax + char CharByte; // al + __int16 CharSize; // ax + char WideCharByte; // al + int DataPtr; // ecx + + if ( !StatusCodeData ) /*0xffe3f9d6*/ + goto LABEL_24; /*0xffe3f9d6*/ + if ( StrnCmp((_BYTE *)(StatusCodeData + 4), src_3) ) /*0xffe3f9e7*/ + { + if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_0) ) /*0xffe3fa69*/ + { + AsciiSPrintUnicodeFormat( /*0xffe3fa8d*/ + Buffer, + 0x100u, + 0, + (unsigned __int8 *)(StatusCodeData + 120), + va, + (unsigned __int16 *)(StatusCodeData + 24)); + return 0; /*0xffe3fa95*/ + } + if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_1) ) /*0xffe3fa9f*/ + { + if ( (_BYTE)CodeType != 2 ) /*0xffe3faac*/ + return 0; /*0xffe3faac*/ + if ( (CodeType & 0xFF000000) == 0x90000000 && (_WORD)Value == 7 ) /*0xffe3fac0*/ + { + DataPtr = StatusCodeData; /*0xffe3fac2*/ +LABEL_23: + DebugAssertMsgs(DataPtr, (int)Buffer); /*0xffe3fadb*/ + return 0; /*0xffe3fae4*/ + } +LABEL_25: + StatusCodeToErrorStr(Value, (int)Buffer); /*0xffe3faeb*/ + return 0; /*0xffe3faf1*/ + } + if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_2) ) /*0xffe3face*/ + { + DataPtr = StatusCodeData + 20; /*0xffe3fad8*/ + goto LABEL_23; /*0xffe3fad8*/ + } +LABEL_24: + if ( (_BYTE)CodeType != 2 ) /*0xffe3fae9*/ + return 0; /*0xffe3fae9*/ + goto LABEL_25; /*0xffe3fae9*/ + } + SrcPtr = *(char **)(StatusCodeData + 24); /*0xffe3f9f1*/ + WideSrcPtr = SrcPtr; /*0xffe3f9f4*/ + for ( Index = 0; ; Index += CharSize ) /*0xffe3f9fa*/ + { + DataType = *(_DWORD *)(StatusCodeData + 20); /*0xffe3f9fe*/ + if ( (DataType || !*SrcPtr) && (DataType != 1 || !*(_WORD *)WideSrcPtr) ) /*0xffe3fa10*/ + break; /*0xffe3fa10*/ + if ( Index >= 0xFFu ) /*0xffe3fa1e*/ + break; /*0xffe3fa1e*/ + if ( DataType ) /*0xffe3fa22*/ + { + WideCharByte = *WideSrcPtr; /*0xffe3fa37*/ + WideSrcPtr += 2; /*0xffe3fa3a*/ + Buffer[Index] = WideCharByte; /*0xffe3fa42*/ + CharSize = 2; /*0xffe3fa45*/ + } + else + { + CharByte = *SrcPtr++; /*0xffe3fa24*/ + Buffer[Index] = CharByte; /*0xffe3fa2a*/ + CharSize = 1; /*0xffe3fa2f*/ + } + } + Buffer[Index] = 0; /*0xffe3fa59*/ + return 0; /*0xffe3faf8*/ +} + + +int SetMem16(int a1, char *_r_n) +{ + char *_r_n_1; // ecx + int n2; // edx + char *v4; // esi + char n10; // al + + _r_n_1 = _r_n; /*0xffe3fafe*/ + n2 = 0; /*0xffe3fb02*/ + if ( _r_n && *_r_n ) /*0xffe3fb08*/ + { + do /*0xffe3fb43*/ + { + v4 = &_r_n_1[n2]; /*0xffe3fb0d*/ + n10 = _r_n_1[n2]; /*0xffe3fb10*/ + if ( n10 == 13 && v4[1] == 10 ) /*0xffe3fb1a*/ + { + n2 += 2; /*0xffe3fb1c*/ + } + else if ( n10 == 10 ) /*0xffe3fb23*/ + { + if ( n2 ) /*0xffe3fb27*/ + ComPortPollLsrTx(_r_n_1, n2); /*0xffe3fb29*/ + ComPortPollLsrTx("\r\n", 2); /*0xffe3fb36*/ + _r_n_1 = v4 + 1; /*0xffe3fb3b*/ + n2 = 0; /*0xffe3fb3e*/ + } + else + { + ++n2; /*0xffe3fb42*/ + } + } + while ( _r_n_1[n2] ); /*0xffe3fb43*/ + if ( n2 ) /*0xffe3fb4c*/ + ComPortPollLsrTx(_r_n_1, n2); /*0xffe3fb4e*/ + } + return 0; /*0xffe3fb55*/ +} + + +int PpiDescriptorPtr() +{ + ComPortInitialize(); /*0xffe3fb56*/ + return 0; /*0xffe3fb5d*/ +} + + +int ( *PeiServicesInstallPpi(int PeiServices, char *_r_n))(int a1, char *_r_n) +{ + int v4; // esi + int ( *SetMem16_1)(int, char *); // eax + + v4 = 0; /*0xffe3fb65*/ + for ( SetMem16_1 = SetMem16; SetMem16_1; SetMem16_1 = (int ( *)(int, char *))dword_FFE427F4[v4++] ) /*0xffe3fb67*/ + SetMem16_1(PeiServices, _r_n); /*0xffe3fb70*/ + return SetMem16_1; /*0xffe3fb80*/ +} + + +int SerialPortWrite( + int PeiServices, + int CodeType, + int Value, + int Instance, + int CallerId, + int StatusCodeData, + char *Buffer) +{ + int Index1; // edi + void ( *Callback1)(int, unsigned __int8, int); // eax + int Index2; // edi + void ( *i)(int, int, __int16); // eax + int *HandlerTable; // eax + + Index1 = 0; /*0xffe3fb90*/ + for ( Callback1 = (void ( *)(int, unsigned __int8, int))BasePrintFillBuffer; /*0xffe3fb92*/ + Callback1; + Callback1 = (void ( *)(int, unsigned __int8, int))*(&funcs_FFE3FB9C + Index1++) ) + { + Callback1(PeiServices, CodeType, Value); /*0xffe3fb9c*/ + } + *Buffer = 0; /*0xffe3fbba*/ + StatusCodeFormatMsg(CodeType, Value, StatusCodeData, Buffer); /*0xffe3fbbc*/ + if ( *Buffer ) /*0xffe3fbc1*/ + PeiServicesInstallPpi(PeiServices, Buffer); /*0xffe3fbcc*/ + Index2 = 0; /*0xffe3fbd1*/ + for ( i = (void ( *)(int, int, __int16))BasePrintParseHexByte; /*0xffe3fbd3*/ + i; + i = (void ( *)(int, int, __int16))dword_FFE427EC[Index2++] ) + { + i(PeiServices, CodeType, Value); /*0xffe3fbe9*/ + } + if ( (_BYTE)CodeType == 2 ) /*0xffe3fbfd*/ + { + HandlerTable = ::HandlerTable; /*0xffe3fc06*/ + if ( byte_FFE43E1C ) /*0xffe3fc0b*/ + HandlerTable = (int *)&unk_FFE43E20; /*0xffe3fc0d*/ + while ( *HandlerTable ) /*0xffe3fc25*/ + { + if ( *HandlerTable == Value && HandlerTable[1] ) /*0xffe3fc18*/ + { + ((void ( *)(int, int))HandlerTable[1])(PeiServices, Value); /*0xffe3fc2b*/ + return 0; /*0xffe3fc2b*/ + } + HandlerTable += 2; /*0xffe3fc1e*/ + } + } + return 0; /*0xffe3fc30*/ +} + + +int BasePrintIsHexDigit(int a1, unsigned __int8 a2) +{ + int result; // eax + + result = a2; /*0xffe3fc37*/ + __outbyte(0x80u, a2); /*0xffe3fc41*/ + return result; /*0xffe3fc42*/ +} + + +int BasePrintFillBuffer(int a1, unsigned __int8 a2, int a3) +{ + unsigned int n2; // eax + int v4; // eax + int v5; // ebx + unsigned __int8 v6; // al + void ( *i)(int, unsigned __int8); // eax + unsigned __int8 v9; // [esp+Ch] [ebp+Ch] + + n2 = a2 - 1; /*0xffe3fc4a*/ + if ( n2 < 2 ) /*0xffe3fc4e*/ + { + v4 = (int)*(&off_FFE4287C + n2); /*0xffe3fc50*/ + v5 = 0; /*0xffe3fc58*/ + while ( 1 ) /*0xffe3fc64*/ + { + if ( !*(_DWORD *)v4 ) /*0xffe3fc64*/ + { + v6 = 0; /*0xffe3fc6a*/ + goto LABEL_7; /*0xffe3fc6a*/ + } + if ( *(_DWORD *)v4 == a3 ) /*0xffe3fc5f*/ + break; /*0xffe3fc5f*/ + v4 += 8; /*0xffe3fc61*/ + } + v6 = *(_BYTE *)(v4 + 4); /*0xffe3fc7a*/ +LABEL_7: + v9 = v6; /*0xffe3fc6c*/ + if ( v6 ) /*0xffe3fc71*/ + { + for ( i = (void ( *)(int, unsigned __int8))BasePrintIsHexDigit; /*0xffe3fc73*/ + i; + i = (void ( *)(int, unsigned __int8))funcs_FFE3FC85[v5++] ) + { + i(a1, v9); /*0xffe3fc85*/ + } + } + } + return 0; /*0xffe3fc98*/ +} + + +int BasePrintProduceSChar(int a1, unsigned __int8 n2, int a3) +{ + unsigned int n2_1; // esi + int i; // eax + unsigned __int8 v5; // al + int v6; // edi + + n2_1 = n2 - 1; /*0xffe3fca5*/ + if ( n2_1 < 2 ) /*0xffe3fcaa*/ + { + for ( i = (int)*(&off_FFE42884 + n2_1); ; i += 8 ) /*0xffe3fcac*/ + { + if ( !*(_DWORD *)i ) /*0xffe3fcbd*/ + { + v5 = 0; /*0xffe3fcc3*/ + goto LABEL_7; /*0xffe3fcc3*/ + } + if ( *(_DWORD *)i == a3 ) /*0xffe3fcb8*/ + break; /*0xffe3fcb8*/ + } + v5 = *(_BYTE *)(i + 4); /*0xffe3fd01*/ +LABEL_7: + if ( v5 ) /*0xffe3fcc7*/ + { + v6 = v5; /*0xffe3fcc9*/ + do /*0xffe3fce8*/ + { + ComPortSetBaud(0xE56Cu, 0x61A80u); /*0xffe3fcd6*/ + TimerDelay(0x186A0u); /*0xffe3fce0*/ + --v6; /*0xffe3fce5*/ + } + while ( v6 ); /*0xffe3fce8*/ + } + if ( n2 == 2 ) /*0xffe3fced*/ + TimerDelay(0xF4240u); /*0xffe3fcf4*/ + } + return 0; /*0xffe3fcf9*/ +} + + +int BasePrintParseHexByte(int a1, int a2, __int16 a3) +{ + int v3; // esi + + if ( (a3 & 0xFF00) == 0x8100 && (_BYTE)a3 ) /*0xffe3fd21*/ + { + v3 = (unsigned __int8)a3; /*0xffe3fd23*/ + do /*0xffe3fd42*/ + { + ComPortSetBaud(0x33198u, 0x9C40u); /*0xffe3fd30*/ + TimerDelay(0x186A0u); /*0xffe3fd3a*/ + --v3; /*0xffe3fd3f*/ + } + while ( v3 ); /*0xffe3fd42*/ + } + return 0; /*0xffe3fd46*/ +} + + +int LocateReportStatusCodePpi() +{ + int PeiServices; // eax + _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF + int v3; // [esp+4h] [ebp-4h] BYREF + + PeiServices = GetPeiServices(); /*0xffe3fd50*/ + if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)PeiServices + 32))( /*0xffe3fd6f*/ + PeiServices, + &unk_FFE4354C, + 0, + v2, + &v3) >= 0 ) + return v3; /*0xffe3fd75*/ + else + return 0; /*0xffe3fd71*/ +} + + +int DebugPrint(int a1, const char *a2, ...) +{ + int result; // eax + int ( **v3)(int, const char *, char *); // esi + va_list va; // [esp+10h] [ebp+Ch] BYREF + + va_start(va, a2); + result = LocateReportStatusCodePpi(); /*0xffe3fd7d*/ + v3 = (int ( **)(int, const char *, char *))result; /*0xffe3fd82*/ + if ( result ) /*0xffe3fd86*/ + { + result = DebugEnabled(); /*0xffe3fd88*/ + if ( (result & a1) != 0 ) /*0xffe3fd93*/ + return (*v3)(a1, a2, (char *)va); /*0xffe3fd9f*/ + } + return result; /*0xffe3fda4*/ +} + + +int CpuDeadLoop( + int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ, + int n48, + const char *PeiServices____((void__)_0)) +{ + int result; // eax + + result = LocateReportStatusCodePpi(); /*0xffe3fdac*/ + if ( result ) /*0xffe3fdb3*/ + return (*(int ( **)(int, int, const char *))(result + 4))( /*0xffe3fdbb*/ + e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ, + n48, + PeiServices____((void__)_0)); + return result; /*0xffe3fdc1*/ +} + + +int GetPeiServices() +{ + int v0; // esi + _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF + int v3; // [esp+6h] [ebp-6h] + + PeiServicesGetTss(v2); /*0xffe3fdcd*/ + v0 = *(_DWORD *)(v3 - 4); /*0xffe3fdd5*/ + if ( !v0 ) /*0xffe3fdda*/ + CpuDeadLoop( /*0xffe3fde9*/ + (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c", + 48, + "PeiServices != ((void *) 0)"); + return v0; /*0xffe3fdf1*/ +} + + +unsigned int AsciiSPrint( + _BYTE *p__r_n, + unsigned int n0xF4240, + unsigned __int8 *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n, + ...) +{ + va_list va; // [esp+10h] [ebp+10h] BYREF + + va_start(va, ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n); + return AsciiSPrintUnicodeFormat(p__r_n, n0xF4240, 0, ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n, (int)va, 0); /*0xffe3fe13*/ +} + + +_BYTE *BasePrintFillChar(_BYTE *a1, unsigned int a2, int i, __int16 a4, int a5) +{ + int j; // esi + + for ( j = 0; j < i; ++j ) /*0xffe3fe20*/ + { + if ( (unsigned int)a1 >= a2 ) /*0xffe3fe27*/ + break; /*0xffe3fe27*/ + *a1 = a4; /*0xffe3fe2d*/ + if ( a5 != 1 ) /*0xffe3fe2f*/ + a1[1] = HIBYTE(a4); /*0xffe3fe36*/ + a1 += a5; /*0xffe3fe39*/ + } + return a1; /*0xffe3fe42*/ +} + + +_BYTE *SPrintMarker(_BYTE *_r_n, unsigned int n16, int a3, unsigned int a4) +{ + _BYTE *_r_n_1; // esi + int ReportStatusCodePpi; // eax + int v7; // eax + int v8; // edx + unsigned __int64 v9; // rtt + unsigned int v11; // [esp-4h] [ebp-1Ch] + int v12; // [esp+Ch] [ebp-Ch] BYREF + int *v13; // [esp+10h] [ebp-8h] + unsigned int n16_1; // [esp+14h] [ebp-4h] + + _r_n_1 = _r_n; /*0xffe3fe4f*/ + v13 = &v12; /*0xffe3fe57*/ + n16_1 = n16; /*0xffe3fe5a*/ + *_r_n = 0; /*0xffe3fe5d*/ + do /*0xffe3fe9e*/ + { + if ( !n16 ) /*0xffe3fe62*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe3fe64*/ + if ( ReportStatusCodePpi ) /*0xffe3fe6b*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe3fe79*/ + "e:\\hs\\MdePkg\\Library\\BaseLib\\DivU64x32Remainder.c", + 47, + "Divisor != 0"); + } + v11 = a4 / n16_1; /*0xffe3fe89*/ + LODWORD(v9) = a3; /*0xffe3fe8d*/ + HIDWORD(v9) = a4 % n16_1; /*0xffe3fe8d*/ + v7 = v9 / n16_1; /*0xffe3fe8d*/ + v8 = v9 % n16_1; /*0xffe3fe8d*/ + if ( v13 ) /*0xffe3fe92*/ + *v13 = v8; /*0xffe3fe94*/ + ++_r_n_1; /*0xffe3fe9a*/ + a3 = v7; /*0xffe3fe9b*/ + a4 = v11; /*0xffe3fea0*/ + *_r_n_1 = byte_FFE42EBC[v12]; /*0xffe3fea9*/ + } + while ( v11 | v7 ); /*0xffe3fe9e*/ + return _r_n_1; /*0xffe3fead*/ +} + + + +unsigned int PciCf8Read(_BYTE *_r_n, unsigned int n38, __int16 a3, char *%02d_%02d_%04d__%02d:%02d, ...) +{ + va_list va; // [esp+18h] [ebp+18h] BYREF + + va_start(va, %02d_%02d_%04d__%02d:%02d); + return AsciiSPrintUnicodeFormat(_r_n, n38, a3, (unsigned __int8 *)%02d_%02d_%04d__%02d:%02d, (int)va, 0); /*0xffe40b1a*/ +} + + +int PpiListIteratorInit() +{ + int PeiServices; // eax + int v1; // eax + int ReportStatusCodePpi; // eax + int v3; // eax + int v5; // [esp+4h] [ebp-4h] BYREF + + PeiServices = GetPeiServices(); /*0xffe40b21*/ + v1 = (*(int ( **)(int, int *))(*(_DWORD *)PeiServices + 48))(PeiServices, &v5); /*0xffe40b2d*/ + if ( v1 < 0 ) /*0xffe40b39*/ + { + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); /*0xffe40b46*/ + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe40b4e*/ + if ( ReportStatusCodePpi ) /*0xffe40b55*/ + (*(void ( **)(char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe40b5f*/ + "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c", + 50, + "!EFI_ERROR (Status)"); + } + if ( !v5 ) /*0xffe40b69*/ + { + v3 = LocateReportStatusCodePpi(); /*0xffe40b6b*/ + if ( v3 ) /*0xffe40b72*/ + (*(void ( **)(char *, int, const char *))(v3 + 4))( /*0xffe40b7c*/ + "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c", + 51, + "HobList != ((void *) 0)"); + } + return v5; /*0xffe40b85*/ +} + + +_WORD *PpiListIteratorNext(int a1, _WORD *i) +{ + _WORD *i_1; // esi + int ReportStatusCodePpi; // eax + + i_1 = i; /*0xffe40b8b*/ + if ( !i ) /*0xffe40b8f*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe40b91*/ + if ( ReportStatusCodePpi ) /*0xffe40b98*/ + (*(void ( **)(char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe40ba6*/ + "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c", + 82, + "HobStart != ((void *) 0)"); + } + while ( 1 ) /*0xffe40bbf*/ + { + if ( *i_1 == 0xFFFF ) /*0xffe40bc5*/ + return 0; /*0xffe40bca*/ + if ( *i_1 == 4 ) /*0xffe40bb7*/ + break; /*0xffe40bb7*/ + i_1 = (_WORD *)((char *)i_1 + (unsigned __int16)i_1[1]); /*0xffe40bbd*/ + } + return i_1; /*0xffe40bc9*/ +} + + +_WORD *__thiscall FindGuidInPpiList(char *this) +{ + _WORD *i; // edx + int v3; // ecx + _WORD *v4; // eax + _WORD *v5; // esi + + for ( i = (_WORD *)PpiListIteratorInit(); ; i = (_WORD *)((char *)v5 + (unsigned __int16)v5[1]) ) /*0xffe40bde*/ + { + v4 = PpiListIteratorNext(v3, i); /*0xffe40bf6*/ + v5 = v4; /*0xffe40bfb*/ + if ( !v4 || GuidCompare(this, (int)(v4 + 4)) ) /*0xffe40be7*/ + break; /*0xffe40be7*/ + } + return v5; /*0xffe40c01*/ +} + + +int StrnCmp(_BYTE *a1, _BYTE *src) +{ + _BYTE *v2; // esi + _BYTE *v3; // edi + int n4; // ebx + int v5; // ecx + + v2 = a1; /*0xffe40c0b*/ + v3 = a1 + 16; /*0xffe40c10*/ + n4 = (unsigned __int8)a1 & 3; /*0xffe40c13*/ + if ( ((unsigned __int8)a1 & 3) != 0 && n4 == ((unsigned __int8)src & 3) ) /*0xffe40c1f*/ + { + v5 = 4 - n4; /*0xffe40c24*/ + if ( n4 != 4 ) /*0xffe40c26*/ + { + do /*0xffe40c33*/ + { + if ( *v2 != *src ) /*0xffe40c2c*/ + break; /*0xffe40c2c*/ + ++v2; /*0xffe40c2e*/ + ++src; /*0xffe40c2f*/ + --v5; /*0xffe40c30*/ + } + while ( v5 ); /*0xffe40c33*/ + } + } + while ( v2 <= v3 - 4 && *(_DWORD *)v2 == *(_DWORD *)src ) /*0xffe40c3e*/ + { + v2 += 4; /*0xffe40c40*/ + src += 4; /*0xffe40c43*/ + } + while ( 1 ) /*0xffe40c54*/ + { + if ( v2 >= v3 ) /*0xffe40c56*/ + return 0; /*0xffe40c5d*/ + if ( *v2 != *src ) /*0xffe40c50*/ + break; /*0xffe40c50*/ + ++v2; /*0xffe40c52*/ + ++src; /*0xffe40c53*/ + } + return (char)*v2 - (char)*src; /*0xffe40c5a*/ +} + + +_BYTE *NumberToString(_BYTE *a1, unsigned int n10, __int64 n0xA, char a4) +{ + int v4; // ebx + int _EDX; // edx + int n0xA_1; // ecx + char v9; // al + + v4 = HIDWORD(n0xA); /*0xffe40c69*/ + if ( n0xA >= 0 ) /*0xffe40c7a*/ + goto LABEL_2; /*0xffe40c7a*/ + if ( n10 == 10 ) /*0xffe40c89*/ + { + n0xA_1 = -(int)n0xA; /*0xffe40c8f*/ + _EDX = (unsigned __int64)-n0xA >> 32; /*0xffe40c94*/ + goto LABEL_8; /*0xffe40c96*/ + } + if ( a4 ) /*0xffe40c9d*/ +LABEL_2: + _EDX = HIDWORD(n0xA); /*0xffe40c82*/ + else + _EDX = 0; /*0xffe40c9f*/ + n0xA_1 = n0xA; /*0xffe40ca1*/ +LABEL_8: + if ( __PAIR64__(n0xA_1, _EDX) ) /*0xffe40ca7*/ + { + do /*0xffe40cd0*/ + { + n0xA_1 = Udiv64Remainder(n10, (unsigned int *)&n0xA, n0xA_1, _EDX); /*0xffe40cb8*/ + if ( (unsigned int)n0xA >= 0xA ) /*0xffe40cc1*/ + v9 = n0xA + 87; /*0xffe40cc7*/ + else + v9 = n0xA + 48; /*0xffe40cc3*/ + *a1++ = v9; /*0xffe40cc9*/ + } + while ( __PAIR64__(n0xA_1, _EDX) ); /*0xffe40cd0*/ + } + else + { + *a1++ = 48; /*0xffe40cd4*/ + } + if ( n10 == 10 && v4 < 0 ) /*0xffe40cdf*/ + *a1++ = 45; /*0xffe40ce7*/ + *a1 = 0; /*0xffe40cec*/ + return a1 - 1; /*0xffe40ceb*/ +} + + +char *StringReverse(char *a1, unsigned int n10, __int64 n0xA, char a4) +{ + char *v5; // esi + char *v6; // eax + char v7; // dl + + v5 = a1; /*0xffe40d02*/ + v6 = NumberToString(a1, n10, n0xA, a4); /*0xffe40d08*/ + if ( a1 < v6 ) /*0xffe40d12*/ + { + do /*0xffe40d20*/ + { + v7 = *v5; /*0xffe40d16*/ + *v5++ = *v6; /*0xffe40d18*/ + *v6-- = v7; /*0xffe40d1b*/ + } + while ( v5 < v6 ); /*0xffe40d20*/ + } + return a1; /*0xffe40d24*/ +} + + +unsigned int AsciiStrDecimalToUintn(char *a1, char **p_Status_Code:_%X) +{ + char v2; // bl + unsigned int n0x7FFFFFFF; // esi + char n57; // al + char n10; // al + char v7; // [esp+Ch] [ebp-4h] + + v2 = 1; /*0xffe40d2d*/ + v7 = 0; /*0xffe40d31*/ + n0x7FFFFFFF = 0; /*0xffe40d35*/ + while ( *a1 == 32 || *a1 == 9 ) /*0xffe40d3f*/ + ++a1; /*0xffe40d41*/ + if ( !*a1 ) /*0xffe40d44*/ + { + *p_Status_Code:_%X = a1; /*0xffe40d4a*/ + return 0; /*0xffe40d4e*/ + } + if ( *a1 == 45 ) /*0xffe40d52*/ + { + v2 = -1; /*0xffe40d54*/ + ++a1; /*0xffe40d57*/ + } + if ( *a1 == 43 ) /*0xffe40d5b*/ + ++a1; /*0xffe40d5d*/ + while ( 1 ) /*0xffe40d64*/ + { + n57 = *a1; /*0xffe40d64*/ + if ( *a1 >= 48 && n57 <= 57 ) /*0xffe40d6c*/ + { + n10 = n57 - 48; /*0xffe40d6e*/ + goto LABEL_17; /*0xffe40d70*/ + } + if ( (n57 & 0xDFu) < 0x41 || (n57 & 0xDFu) > 0x5A ) /*0xffe40d7f*/ + break; /*0xffe40d7f*/ + n10 = (n57 & 0xDF) - 55; /*0xffe40d83*/ +LABEL_17: + if ( n10 >= 10 ) /*0xffe40d8b*/ + break; /*0xffe40d8b*/ + n0x7FFFFFFF = n10 + 10 *n0x7FFFFFFF; /*0xffe40d90*/ + if ( v2 == 1 ) /*0xffe40d95*/ + { + if ( n0x7FFFFFFF < 0x80000000 ) /*0xffe40d99*/ + goto LABEL_23; /*0xffe40d99*/ + } + else if ( n0x7FFFFFFF <= 0x80000000 ) /*0xffe40d9f*/ + { + goto LABEL_23; /*0xffe40d9f*/ + } + v7 = 1; /*0xffe40da1*/ +LABEL_23: + ++a1; /*0xffe40da6*/ + } + *p_Status_Code:_%X = a1; /*0xffe40da9*/ + if ( v7 ) /*0xffe40db0*/ + { + n0x7FFFFFFF = 0x7FFFFFFF; /*0xffe40db2*/ + if ( v2 == -1 ) /*0xffe40dba*/ + n0x7FFFFFFF = 0x80000000; /*0xffe40dbc*/ + } + return n0x7FFFFFFF *v2; /*0xffe40dc5*/ +} + + +char *__thiscall AsciiStrToUpper(char *this) +{ + char *i; // eax + char n122; // dl + + for ( i = this; *i; ++i ) /*0xffe40dca*/ + { + n122 = *i; /*0xffe40dd1*/ + if ( *i >= 97 && n122 <= 122 ) /*0xffe40ddb*/ + *i = n122 - 32; /*0xffe40de0*/ + } + return this; /*0xffe40dea*/ +} + + +char *SPrintUnicodeFormat(int p_StatusText, char *Status_Code:_%X, ...) +{ + va_list va; // [esp+Ch] [ebp+Ch] BYREF + + va_start(va, Status_Code:_%X); + return (char *)SPrintAsciiFormatWorker(p_StatusText, 0, Status_Code:_%X, va); /*0xffe40e01*/ +} + + +char *EfiStatusToStr(int n2) +{ + unsigned int n3; // edx + + if ( !n2 ) /*0xffe40e04*/ + return "EFI_SUCCESS"; /*0xffe40e0b*/ + if ( n2 < 0 ) /*0xffe40e0c*/ + { + n3 = n2 & 0x1FFFFFFF; /*0xffe40e42*/ + if ( (n2 & 0xA0000000) == 0xA0000000 ) /*0xffe40e4b*/ + { + if ( n3 >= 3 ) /*0xffe40e50*/ + return 0; /*0xffe40e50*/ + // "EFI_INTERRUPT_PENDING" + return &MEMORY[0xFFE43964][25 *n3]; /*0xffe40e55*/ + } + else if ( (n2 & 0xC0000000) == 0xC0000000 ) /*0xffe40e64*/ + { + if ( n3 > 2 ) /*0xffe40e69*/ + return 0; /*0xffe40e69*/ + // "ABLE_YET" + return &MEMORY[0xFFE439A3][25 *n3]; /*0xffe40e6e*/ + } + else + { + if ( n3 > 0x1E ) /*0xffe40e78*/ + return 0; /*0xffe40e78*/ + // "E_BOF" + return &MEMORY[0xFFE439DB][25 *n3]; /*0xffe40e7d*/ + } + } + else if ( (n2 & 0x20000000) != 0 ) /*0xffe40e14*/ + { + if ( (unsigned int)n2 >= 2 ) /*0xffe40e19*/ + return 0; /*0xffe40e1d*/ + // "EFI_WARN_INTERRUPT_SOURCE_PENDING" + return &MEMORY[0xFFE4391C][35 *n2]; /*0xffe40e21*/ + } + else + { + if ( (unsigned int)n2 > 4 ) /*0xffe40e2a*/ + return 0; /*0xffe40e2a*/ + return (char *)&unk_FFE4389A + 26 *n2; /*0xffe40e2f*/ + } +} + + + +int SPrintAsciiFormat(int a1, int a2, int a3, ...) +{ + va_list va; // [esp+14h] [ebp+14h] BYREF + + va_start(va, a3); + return SPrintAsciiFormatWorker(a3, va); /*0xffe41215*/ +} + + +int SPrintGuidMarker(int n8, unsigned __int16 **p_i) +{ + unsigned __int16 *i; // ecx + int n4; // eax + + if ( !p_i ) /*0xffe41219*/ + return -2147483646; /*0xffe4121b*/ + i = *p_i; /*0xffe41221*/ + if ( **p_i == 0xFFFF ) /*0xffe4122c*/ + return -2147483634; /*0xffe41241*/ + while ( 1 ) /*0xffe41232*/ + { + i = (unsigned __int16 *)((char *)i + i[1]); /*0xffe41232*/ + n4 = *i; /*0xffe41234*/ + if ( n4 == 4 ) /*0xffe4123a*/ + break; /*0xffe4123a*/ + if ( (_WORD)n4 == 0xFFFF ) /*0xffe4123f*/ + return -2147483634; /*0xffe4123f*/ + } + *p_i = i; /*0xffe41248*/ + return 0; /*0xffe41220*/ +} + + +int SPrintScanGuid(int n8, unsigned __int16 **p_i) +{ + unsigned __int16 *i_1; // edi + int v4; // eax + int result; // eax + int n8_2; // ecx + int n8_1; // [esp-4h] [ebp-10h] + unsigned __int16 *i; // [esp+8h] [ebp-4h] BYREF + + if ( !p_i ) /*0xffe41258*/ + return -2147483646; /*0xffe4128b*/ + i = *p_i; /*0xffe4125c*/ + while ( 1 ) /*0xffe4127a*/ + { + result = SPrintGuidMarker(n8, &i); /*0xffe4127a*/ + if ( result < 0 ) /*0xffe41281*/ + break; /*0xffe41281*/ + i_1 = i; /*0xffe41261*/ + n8_1 = n8_2; /*0xffe41269*/ + v4 = StrnCmp((_BYTE *)i + 8, src); /*0xffe4126d*/ + n8 = n8_1; /*0xffe41272*/ + if ( !v4 ) /*0xffe41275*/ + { + *p_i = i_1; /*0xffe41285*/ + return 0; /*0xffe41289*/ + } + } + return result; /*0xffe41290*/ +} + + +int Udiv64Remainder(unsigned int _EDI, unsigned int *p_n0xA, int n0xA, int _EDX) +{ + int n0xA_1; // eax + int n64; // ecx + + n0xA_1 = n0xA; /*0xffe412a5*/ + _EDX = _EDX; /*0xffe412a8*/ + _EDI = 0; /*0xffe412ae*/ + n64 = 64; /*0xffe412b0*/ + do + { + __asm /*0xffe412b7*/ + { + rcl edx, 1 + rcl edi, 1 + } + n0xA_1 = 2 *n0xA_1 + (_EDI >= _EDI); /*0xffe412c0*/ + _EDI = _EDI - (_EDI >= _EDI ? _EDI : 0); + --n64; /*0xffe412c6*/ + } + while ( n64 ); + if ( p_n0xA ) /*0xffe412d9*/ + *p_n0xA = _EDI; /*0xffe412de*/ + return n0xA_1; /*0xffe412d4*/ +} + + +unsigned int TimerDelayLoop(unsigned int a1) +{ + unsigned int v1; // esi + unsigned int n0x400000; // edi + unsigned __int32 v3; // ebx + unsigned int result; // eax + + v1 = a1 >> 22; /*0xffe412f7*/ + n0x400000 = a1 & 0x3FFFFF; /*0xffe412fa*/ + do /*0xffe41332*/ + { + v3 = n0x400000 + (IoPortRead32(0x508u) & 0xFFFFFF); /*0xffe4130f*/ + n0x400000 = 0x400000; /*0xffe41311*/ + while ( ((v3 - IoPortRead32(0x508u)) & 0x800000) == 0 ) /*0xffe4132b*/ + _mm_pause(); /*0xffe41318*/ + result = v1--; /*0xffe4132d*/ + } + while ( result ); /*0xffe41332*/ + return result; /*0xffe41334*/ +} + + +unsigned int __thiscall TimerDelay(unsigned int n100000) +{ + unsigned __int64 v2; // rtt + + LODWORD(v2) = 3579545 *n100000; /*0xffe4136f*/ + HIDWORD(v2) = ((3579545 * (unsigned __int64)n100000) >> 32) % 0xF4240; /*0xffe4136f*/ + TimerDelayLoop(v2 / 0xF4240); /*0xffe41374*/ + return n100000; /*0xffe4137b*/ +} + + +int ComPortGetBase() +{ + unsigned __int8 n33; // al + + __outbyte(0x72u, 0x5Cu); /*0xffe4138a*/ + n33 = __inbyte(0x73u); /*0xffe41391*/ + return n33 != 33 ? 1016 : 760; +} + + +int __thiscall ComPortInitialize(void *this) +{ + int result; // eax + unsigned __int8 v2; // al + unsigned int n115200; // ecx + unsigned int v4; // ebx + int Base; // eax + unsigned __int16 Base_1; // di + unsigned __int16 v7; // bp + unsigned __int8 v8; // al + unsigned __int8 v9; // cl + unsigned __int8 v10; // al + unsigned __int8 v11; // al + int v12; // esi + unsigned __int8 v13; // al + int v14; // esi + unsigned __int8 v15; // al + unsigned __int8 v16; // al + + result = PciCfgInit((unsigned int)this); /*0xffe413a6*/ + if ( result >= 0 ) + { + __outbyte(0x72u, 0x5Cu); /*0xffe413bc*/ + __inbyte(0x73u); /*0xffe413c3*/ + __outbyte(0x72u, 0x6Cu); /*0xffe413c9*/ + v2 = __inbyte(0x73u); /*0xffe413cd*/ + switch ( v2 ) + { + case 0xA7: + n115200 = 115200; /*0xffe413d7*/ + break; + case 0xA6: + n115200 = 57600; /*0xffe413df*/ + break; + case 0xA5: + n115200 = 38400; /*0xffe413ea*/ + break; + case 0xA4: + n115200 = 19200; /*0xffe413f5*/ + break; + default: + n115200 = v2 != 0xA3 ? 115200 : 9600; + break; + } + v4 = 0x1C200 / n115200; /*0xffe41414*/ + Base = ComPortGetBase(); /*0xffe41416*/ + Base_1 = Base; /*0xffe4141b*/ + if ( Base ) /*0xffe4141f*/ + { + v7 = Base + 3; /*0xffe41429*/ + v8 = __inbyte(Base + 3); /*0xffe4142f*/ + v9 = v8; /*0xffe41430*/ + v10 = __inbyte(Base_1 + 3); /*0xffe41432*/ + __outbyte(Base_1 + 3, v10 | 0x80); /*0xffe41435*/ + v11 = __inbyte(Base_1 + 1); /*0xffe41439*/ + v12 = v11 << 8; /*0xffe4143d*/ + v13 = __inbyte(Base_1); /*0xffe41443*/ + v14 = v13 | v12; /*0xffe41447*/ + v15 = __inbyte(Base_1 + 3); /*0xffe4144c*/ + __outbyte(Base_1 + 3, v15 & 0x7F); /*0xffe4144f*/ + if ( (((v9 & 0x3F) == 3) & (unsigned __int8)((v14 != v4) - 1)) == 0 ) /*0xffe41462*/ + { + do /*0xffe4146f*/ + v16 = __inbyte(Base_1 + 5); /*0xffe4146a*/ + while ( (v16 & 0x60) != 0x60 ); /*0xffe4146f*/ + __outbyte(v7, 0x80u); /*0xffe41476*/ + __outbyte(Base_1 + 1, BYTE1(v4)); /*0xffe4147f*/ + __outbyte(Base_1, v4); /*0xffe41485*/ + __outbyte(v7, 3u); /*0xffe4148b*/ + __outbyte(Base_1 + 2, 0); /*0xffe41494*/ + __outbyte(Base_1 + 2, 1u); /*0xffe41497*/ + __outbyte(Base_1 + 4, 0); /*0xffe414a0*/ + } + return 0; /*0xffe414a1*/ + } + else + { + return -2147483641; /*0xffe41421*/ + } + } + return result; /*0xffe414a8*/ +} + + +int ComPortPollLsrTx(char *_r_n, int n2) +{ + unsigned __int8 *_r_n_1; // ebp + int n0xFFFF; // esi + int Base; // eax + unsigned __int16 Base_1; // cx + unsigned __int16 v8; // cx + unsigned __int8 v9; // al + int v10; // ebx + unsigned __int8 v11; // al + unsigned int n0x10; // ebx + int n2_1; // [esp+Ch] [ebp-4h] + + _r_n_1 = (unsigned __int8 *)_r_n; /*0xffe414ac*/ + n0xFFFF = 0; /*0xffe414ae*/ + if ( !_r_n ) /*0xffe414b5*/ + return 0; /*0xffe414b5*/ + Base = ComPortGetBase(); /*0xffe414bb*/ + Base_1 = Base; /*0xffe414c0*/ + if ( !Base ) /*0xffe414c4*/ + return 0; /*0xffe414b9*/ + if ( !n2 ) /*0xffe414c8*/ + { + v8 = Base + 5; /*0xffe414ca*/ + do /*0xffe414de*/ + { + v9 = __inbyte(v8); /*0xffe414d0*/ + if ( (v9 & 0x60) == 0x60 ) /*0xffe414d5*/ + break; /*0xffe414d5*/ + ++n0xFFFF; /*0xffe414d7*/ + } + while ( n0xFFFF != 0xFFFF ); /*0xffe414de*/ + return 0; /*0xffe414de*/ + } + n2_1 = n2; /*0xffe414e2*/ +LABEL_10: + v10 = 0; /*0xffe414e7*/ + while ( 1 ) /*0xffe414ef*/ + { + v11 = __inbyte(Base_1 + 5); /*0xffe414ef*/ + if ( (v11 & 0x40) != 0 ) /*0xffe414f2*/ + break; /*0xffe414f2*/ + if ( ++v10 == 0xFFFF ) /*0xffe414fb*/ + return 0; /*0xffe414ff*/ + } + n0x10 = 0; /*0xffe41501*/ + while ( n2 ) /*0xffe41505*/ + { + __outbyte(Base_1, *_r_n_1); /*0xffe4150d*/ + ++n0x10; /*0xffe4150e*/ + --n2; /*0xffe4150f*/ + ++_r_n_1; /*0xffe41510*/ + if ( n0x10 >= 0x10 ) /*0xffe41514*/ + { + if ( n2 ) /*0xffe41518*/ + goto LABEL_10; /*0xffe41518*/ + return n2_1; /*0xffe41518*/ + } + } + return n2_1; /*0xffe4151f*/ +} + + +unsigned __int8 ComPortSetBaud(unsigned int n209304, unsigned int n40000) +{ + __int16 v2; // cx + unsigned __int8 v3; // al + unsigned __int8 v4; // al + unsigned __int8 result; // al + + v2 = ((n209304 >> 1) + 119318200) / n209304; /*0xffe41536*/ + __outbyte(0x43u, 0x54u); /*0xffe41541*/ + __outbyte(0x41u, 0x12u); /*0xffe4154a*/ + __outbyte(0x43u, 0xB6u); /*0xffe41550*/ + __outbyte(0x42u, v2); /*0xffe41559*/ + __outbyte(0x42u, HIBYTE(v2)); /*0xffe4155f*/ + v3 = __inbyte(0x61u); /*0xffe41566*/ + __outbyte(0x61u, v3 | 3); /*0xffe41569*/ + TimerDelay(n40000); /*0xffe4156c*/ + v4 = __inbyte(0x61u); /*0xffe41574*/ + result = v4 & 0xFC; /*0xffe41575*/ + __outbyte(0x61u, result); /*0xffe41577*/ + return result; /*0xffe41578*/ +} + + +char __thiscall ProgressDisplay10(char *_10%) +{ + int v2; // [esp-Ch] [ebp-5Ch] + int v3; // [esp-8h] [ebp-58h] + char v4; // [esp-4h] [ebp-54h] + int v5[20]; // [esp+0h] [ebp-50h] BYREF + + SPrintUnicodeFormat((int)v5, "== Progress : %s ==", _10%); + return VideoDisplayProgress(9u, 0, 7, (int)v5, v2, v3, v4, v5[0]); /*0xffe415a3*/ +} + + +void ProgressStatusCodeHandler(int PeiServices, unsigned __int8 StatusCode) +{ + int StatusText; // [esp+8h] [ebp-50h] BYREF + + SPrintUnicodeFormat((int)&StatusText, "Status Code: %X", StatusCode); + VideoDisplayProgress(0x18u, 0x3Eu, 7, &StatusText); /*0xffe415ce*/ + DebugPrint(64, "Status Code: %X\n", StatusCode); + switch ( StatusCode ) + { + case 0x11u: + ProgressDisplay10(" 10%"); /*0xffe416b5*/ + VideoScrollBackground(0, 5u); /*0xffe416be*/ + VideoDisplayProgress(0xBu, 0, 14, "UPI initialization: Starting..."); + break; + case 0x19u: + ProgressDisplay10(" 20%"); /*0xffe4167d*/ + VideoScrollBackground(5u, 0xAu); /*0xffe41686*/ + VideoDisplayProgress(0xBu, 0, 7, "UPI initialization: Done "); + VideoDisplayProgress(0xCu, 0, 14, "Basic IO initialization: Starting... "); + break; + case 0x2Fu: + ProgressDisplay10(" 30%"); /*0xffe41651*/ + VideoScrollBackground(0xAu, 0xFu); /*0xffe4165a*/ + VideoDisplayProgress(0xCu, 0, 7, "Basic IO initialization: Done "); + VideoDisplayProgress(0xDu, 0, 14, "Memory initialization: Starting... "); + break; + case 0x33u: + ProgressDisplay10(" 40%"); /*0xffe41639*/ + VideoScrollBackground(0xFu, 0x14u); /*0xffe41642*/ + break; + case 0x4Fu: + ProgressDisplay10(" 50%"); /*0xffe4160d*/ + VideoScrollBackground(0xFu, 0x19u); /*0xffe41616*/ + VideoDisplayProgress(0xDu, 0, 7, "Memory initialization: Done "); + VideoDisplayProgress(0xEu, 0, 14, "UEFI kernel initialization: Starting... "); + break; + } +} + + +char IoOr32() +{ + __int16 v0; // kr00_2 + unsigned int v1; // esi + unsigned __int8 v2; // al + char v3; // bl + __int16 v5; // [esp+10h] [ebp-4h] + + v0 = __readeflags(); /*0xffe416e0*/ + v5 = v0; /*0xffe416e2*/ + _disable(); /*0xffe416e6*/ + v1 = IoPortRead32(0xCF8u); /*0xffe416fa*/ + IoPortWrite32(0xCF8u, 0x8000FA44); /*0xffe416fc*/ + v2 = __inbyte(0xCFCu); /*0xffe41707*/ + v3 = v2 | 0x80; /*0xffe4170a*/ + __outbyte(0xCFCu, v2 | 0x80); /*0xffe4170f*/ + IoPortWrite32(0xCF8u, v1); /*0xffe41714*/ + if ( (v5 & 0x200) != 0 ) /*0xffe41722*/ + _enable(); /*0xffe41724*/ + else + _disable(); /*0xffe41727*/ + return v3; /*0xffe41728*/ +} + -{"addr":"0xffe3f1ac","code":"char *CopyMem(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe3f1b6*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe3f1c4*/\n {\n src_1 = &src[count - 1]; /*0xffe3f1d8*/\n dst_1 = &dst[count - 1]; /*0xffe3f1da*/\n }\n else\n {\n count_1 = count & 3; /*0xffe3f1c8*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe3f1d1*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe3f1d1*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe3f1d1*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe3f1e1*/\n return dst; /*0xffe3f1e8*/\n}"} +int IoPortRead16(unsigned __int16 a1) +{ + int ReportStatusCodePpi; // eax + int result; // eax -{"addr":"0xffe3f20c","code":"int CopyMemDwords(int a1, int a2, int a3, int a4)\n{\n do /*0xffe3f225*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe3f21d*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe3f221*/\n }\n while ( a2 ); /*0xffe3f225*/\n return a1; /*0xffe3f229*/\n}"} + if ( (a1 & 1) != 0 ) /*0xffe41736*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41738*/ + if ( ReportStatusCodePpi ) /*0xffe4173f*/ + (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822440, 133, (char *)-1822456); /*0xffe41750*/ + } + LOWORD(result) = __inword(a1); /*0xffe41759*/ + return (unsigned __int16)result; /*0xffe4175e*/ +} -{"addr":"0xffe3f22c","code":"void *SetMem32(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe3f239*/\n return buf; /*0xffe3f23f*/\n}"} -{"addr":"0xffe3f2cc","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n if ( (sub_FFE41DDF(1024068) & 0x80u) == 0 ) /*0xffe3f2d8*/\n {\n sub_FFE41F03(1024064, 1280); /*0xffe3f2e4*/\n sub_FFE416DB(); /*0xffe3f2e9*/\n }\n return sub_FFE3F77F(ImageHandle, SystemTable);\n}","refs":[{"addr":"0xffe41f03","name":"MmioWrite32"},{"addr":"0xffe416db","name":"IoOr32"},{"addr":"0xffe41ddf","name":"MmioRead32"},{"addr":"0xffe3f77f","name":"StatusCodePeiEntry"}]} +unsigned __int16 IoPortWrite16(unsigned __int16 a1, unsigned __int16 n1280) +{ + int ReportStatusCodePpi; // eax -{"addr":"0xffe3f2fb","code":"int __thiscall StatusCodeAllocCallbackNode(void *Node)\n{\n int PeiServices; // eax\n int NodeBase; // [esp+0h] [ebp-4h]\n\n PeiServices = GetPeiServices(); /*0xffe3f2ff*/\n if ( (*(int (__stdcall **)(int))(*(_DWORD *)PeiServices + 52))(PeiServices) < 0 ) /*0xffe3f317*/\n return 0; /*0xffe3f319*/\n ZeroMem((unsigned int)Node + 8, src, 0x10u); /*0xffe3f32b*/\n *(_DWORD *)(NodeBase + 24) = 0; /*0xffe3f339*/\n return NodeBase + 24; /*0xffe3f33e*/\n}","refs":[{"addr":"0xffe3fdc4","name":"GetPeiServices"},{"addr":"0xffe424bc","name":"ZeroMem"},{"addr":"0xffe4359c","name":"src"}]} + if ( (a1 & 1) != 0 ) /*0xffe4176a*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4176c*/ + if ( ReportStatusCodePpi ) /*0xffe41773*/ + (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822440, 163, (char *)-1822456); /*0xffe41784*/ + } + __outword(a1, n1280); /*0xffe41790*/ + return n1280; /*0xffe41792*/ +} -{"addr":"0xffe3f340","code":"int StatusCodeRemoveCallback(_WORD *Callback)\n{\n _WORD *Callback_1; // esi\n _WORD *PpiList; // eax\n int GuidScanResult; // ecx\n int Index; // edx\n\n Callback_1 = Callback; /*0xffe3f344*/\n if ( !Callback ) /*0xffe3f349*/\n return -2147483646; /*0xffe3f34b*/\n PpiList = FindGuidInPpiList(src); /*0xffe3f357*/\nLABEL_4:\n for ( Callback = PpiList; ; PpiList = Callback ) /*0xffe3f35c*/\n {\n if ( !PpiList ) /*0xffe3f389*/\n return -2147483634; /*0xffe3f392*/\n Index = 0; /*0xffe3f361*/\n if ( *((_DWORD *)PpiList + 6) ) /*0xffe3f363*/\n break; /*0xffe3f363*/\nLABEL_8:\n if ( SPrintScanGuid(GuidScanResult, &Callback) < 0 ) /*0xffe3f37e*/\n {\n PpiList = 0; /*0xffe3f380*/\n goto LABEL_4; /*0xffe3f382*/\n }\n }\n while ( *(_WORD **)&PpiList[2 *Index + 14] != Callback_1 ) /*0xffe3f36c*/\n {\n if ( (unsigned int)++Index >= *((_DWORD *)PpiList + 6) ) /*0xffe3f372*/\n goto LABEL_8; /*0xffe3f372*/\n }\n *(_DWORD *)&PpiList[2 *Index + 14] = *(_DWORD *)&PpiList[2 * (*((_DWORD *)PpiList + 6))-- + 12]; /*0xffe3f39a*/\n return 0; /*0xffe3f390*/\n}","refs":[{"addr":"0xffe40bcf","name":"FindGuidInPpiList"},{"addr":"0xffe4359c","name":"src"},{"addr":"0xffe4124e","name":"SPrintScanGuid"}]} -{"addr":"0xffe3f3a5","code":"int StatusCodeRegisterCallback(_WORD *Callback)\n{\n _WORD *Callback_1; // edi\n _WORD *PpiList; // eax\n void *This; // ecx\n _DWORD *CallbackNode; // esi\n unsigned int CallbackCount; // edx\n unsigned int CallbackCount_1; // ecx\n _DWORD *CallbackPtr; // eax\n\n Callback_1 = Callback; /*0xffe3f3a9*/\n if ( !Callback ) /*0xffe3f3ae*/\n return -2147483646; /*0xffe3f3b0*/\n PpiList = FindGuidInPpiList(src); /*0xffe3f3bd*/\n CallbackNode = 0; /*0xffe3f3c2*/\n Callback = PpiList; /*0xffe3f3c4*/\n if ( PpiList ) /*0xffe3f3c9*/\n {\n do /*0xffe3f403*/\n {\n CallbackCount = *((_DWORD *)PpiList + 6); /*0xffe3f3cb*/\n if ( CallbackCount < 8 ) /*0xffe3f3d1*/\n CallbackNode = PpiList + 12; /*0xffe3f3d3*/\n CallbackCount_1 = 0; /*0xffe3f3d6*/\n if ( CallbackCount ) /*0xffe3f3da*/\n {\n CallbackPtr = PpiList + 14; /*0xffe3f3dc*/\n while ( (_WORD *)*CallbackPtr != Callback_1 ) /*0xffe3f3e1*/\n {\n ++CallbackCount_1; /*0xffe3f3e3*/\n ++CallbackPtr; /*0xffe3f3e4*/\n if ( CallbackCount_1 >= CallbackCount ) /*0xffe3f3e9*/\n goto LABEL_10; /*0xffe3f3e9*/\n }\n return -2147483628; /*0xffe3f420*/\n }\nLABEL_10:\n if ( SPrintScanGuid(CallbackCount_1, &Callback) >= 0 ) /*0xffe3f3f5*/\n {\n PpiList = Callback; /*0xffe3f3fe*/\n }\n else\n {\n PpiList = 0; /*0xffe3f3f7*/\n Callback = 0; /*0xffe3f3f9*/\n }\n }\n while ( PpiList ); /*0xffe3f403*/\n if ( CallbackNode ) /*0xffe3f407*/\n goto LABEL_18; /*0xffe3f407*/\n }\n CallbackNode = (_DWORD *)StatusCodeAllocCallbackNode(This); /*0xffe3f40e*/\n if ( !CallbackNode ) /*0xffe3f412*/\n return -2147483639; /*0xffe3f414*/\nLABEL_18:\n CallbackNode[++*CallbackNode] = Callback_1; /*0xffe3f422*/\n return 0; /*0xffe3f42d*/\n}","refs":[{"addr":"0xffe40bcf","name":"FindGuidInPpiList"},{"addr":"0xffe4359c","name":"src"},{"addr":"0xffe4124e","name":"SPrintScanGuid"},{"addr":"0xffe3f2fb","name":"StatusCodeAllocCallbackNode"}]} +unsigned __int32 IoPortRead32(unsigned __int16 a1) +{ + int ReportStatusCodePpi; // eax -{"addr":"0xffe3f430","code":"int StatusCodeDispatchCallbacks(\n int PeiServices,\n int CodeType,\n int Value,\n int Instance,\n int CallerId,\n int StatusCodeData)\n{\n int GuidScanResult; // ecx\n unsigned __int16 *GuidInPpiList; // esi\n unsigned int Index; // ebx\n void ( **Callback)(int, int, int, int, int, int); // edi\n unsigned __int16 *GuidInPpiList_1; // [esp+14h] [ebp-8h] BYREF\n int PeiServices_1; // [esp+18h] [ebp-4h]\n\n PeiServices_1 = PeiServices; /*0xffe3f436*/\n GuidInPpiList = FindGuidInPpiList(src); /*0xffe3f447*/\nLABEL_2:\n GuidInPpiList_1 = GuidInPpiList; /*0xffe3f449*/\n while ( GuidInPpiList ) /*0xffe3f493*/\n {\n Index = 0; /*0xffe3f44f*/\n if ( *((_DWORD *)GuidInPpiList + 6) ) /*0xffe3f451*/\n {\n Callback = (void ( **)(int, int, int, int, int, int))(GuidInPpiList + 14); /*0xffe3f456*/\n do /*0xffe3f47a*/\n {\n (*Callback++)(PeiServices_1, CodeType, Value, Instance, CallerId, StatusCodeData); /*0xffe3f46e*/\n ++Index; /*0xffe3f476*/\n }\n while ( Index < *((_DWORD *)GuidInPpiList + 6) ); /*0xffe3f47a*/\n }\n if ( SPrintScanGuid(GuidScanResult, &GuidInPpiList_1) < 0 ) /*0xffe3f487*/\n {\n GuidInPpiList = 0; /*0xffe3f489*/\n goto LABEL_2; /*0xffe3f48b*/\n }\n GuidInPpiList = GuidInPpiList_1; /*0xffe3f48d*/\n }\n return 0; /*0xffe3f495*/\n}","refs":[{"addr":"0xffe40bcf","name":"FindGuidInPpiList"},{"addr":"0xffe4359c","name":"src"},{"addr":"0xffe4124e","name":"SPrintScanGuid"}]} + if ( (a1 & 3) != 0 ) /*0xffe4179b*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4179d*/ + if ( ReportStatusCodePpi ) /*0xffe417a4*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe417b5*/ + "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", + 193, + "(Port & 3) == 0"); + } + return __indword(a1); /*0xffe417bf*/ +} -{"addr":"0xffe3f49f","code":"int StatusCodeReport(int PeiServices, int CodeType, int Value, int Instance, int CallerId, int StatusCodeData)\n{\n char Buffer[256]; // [esp+0h] [ebp-100h] BYREF\n\n StatusCodeDispatchCallbacks(PeiServices, CodeType, Value, Instance, CallerId, StatusCodeData); /*0xffe3f4ba*/\n return SerialPortWrite(PeiServices, CodeType, Value, Instance, CallerId, StatusCodeData, Buffer); /*0xffe3f4e0*/\n}","refs":[{"addr":"0xffe3f430","name":"StatusCodeDispatchCallbacks"},{"addr":"0xffe3fb84","name":"SerialPortWrite"}]} -{"addr":"0xffe3f4e4","code":"int ( *StatusCodeSerialReport(int Value, unsigned __int8 *FormatString, int Args))(int a1, char *_r_n)\n{\n int Index; // ebx\n int ( *PeiServices_1)(int, char *); // eax\n int ( *PeiServices)(int, char *); // esi\n void ( *Callback)(char *, int); // eax\n int StatusCodeData[5]; // [esp+10h] [ebp-178h] BYREF\n int Value_1; // [esp+24h] [ebp-164h]\n int StatusCodeData2; // [esp+28h] [ebp-160h]\n int StatusCodeData3; // [esp+2Ch] [ebp-15Ch]\n int StatusCodeData4; // [esp+30h] [ebp-158h]\n int StatusCodeData5; // [esp+34h] [ebp-154h]\n int StatusCodeData6; // [esp+38h] [ebp-150h]\n int StatusCodeData7; // [esp+3Ch] [ebp-14Ch]\n int StatusCodeData8; // [esp+40h] [ebp-148h]\n int StatusCodeData9; // [esp+44h] [ebp-144h]\n int StatusCodeData10; // [esp+48h] [ebp-140h]\n int StatusCodeData11; // [esp+4Ch] [ebp-13Ch]\n int StatusCodeData12; // [esp+50h] [ebp-138h]\n int StatusCodeData13; // [esp+54h] [ebp-134h]\n int StatusCodeData14; // [esp+58h] [ebp-130h]\n int StatusCodeData15; // [esp+5Ch] [ebp-12Ch]\n int StatusCodeData16; // [esp+60h] [ebp-128h]\n int StatusCodeData17; // [esp+64h] [ebp-124h]\n int StatusCodeData18; // [esp+68h] [ebp-120h]\n int StatusCodeData19; // [esp+6Ch] [ebp-11Ch]\n int StatusCodeData20; // [esp+70h] [ebp-118h]\n int StatusCodeData21; // [esp+74h] [ebp-114h]\n int StatusCodeData22; // [esp+78h] [ebp-110h]\n int StatusCodeData23; // [esp+7Ch] [ebp-10Ch]\n int StatusCodeData24; // [esp+80h] [ebp-108h]\n int StatusCodeData25; // [esp+84h] [ebp-104h]\n char OutputBuffer; // [esp+88h] [ebp-100h] BYREF\n _BYTE TempBuffer[255]; // [esp+89h] [ebp-FFh] BYREF\n\n Index = 0; /*0xffe3f4f1*/\n StatusCodeData[1] = -1706126778; /*0xffe3f4f3*/\n StatusCodeData[0] = 23330836; /*0xffe3f500*/\n StatusCodeData[2] = 299226451; /*0xffe3f51d*/\n StatusCodeData[3] = 100721287; /*0xffe3f525*/\n StatusCodeData[4] = -1178385111; /*0xffe3f52d*/\n Value_1 = 0; /*0xffe3f535*/\n StatusCodeData2 = 0; /*0xffe3f539*/\n StatusCodeData3 = 0; /*0xffe3f53d*/\n StatusCodeData4 = 0; /*0xffe3f541*/\n StatusCodeData5 = 0; /*0xffe3f545*/\n StatusCodeData6 = 0; /*0xffe3f549*/\n StatusCodeData7 = 0; /*0xffe3f54d*/\n StatusCodeData8 = 0; /*0xffe3f551*/\n StatusCodeData9 = 0; /*0xffe3f555*/\n StatusCodeData10 = 0; /*0xffe3f559*/\n StatusCodeData11 = 0; /*0xffe3f55d*/\n StatusCodeData12 = 0; /*0xffe3f561*/\n StatusCodeData13 = 0; /*0xffe3f565*/\n StatusCodeData14 = 0; /*0xffe3f569*/\n StatusCodeData15 = 0; /*0xffe3f56d*/\n StatusCodeData16 = 0; /*0xffe3f571*/\n StatusCodeData17 = 0; /*0xffe3f575*/\n StatusCodeData18 = 0; /*0xffe3f579*/\n StatusCodeData19 = 0; /*0xffe3f57d*/\n StatusCodeData20 = 0; /*0xffe3f581*/\n StatusCodeData21 = 0; /*0xffe3f585*/\n StatusCodeData22 = 0; /*0xffe3f58c*/\n StatusCodeData23 = 0; /*0xffe3f593*/\n StatusCodeData24 = 0; /*0xffe3f59a*/\n StatusCodeData25 = 0; /*0xffe3f5a1*/\n OutputBuffer = 0; /*0xffe3f5a8*/\n SetMemWrapper((int)TempBuffer, TempBuffer, 0, 0xFFu); /*0xffe3f5af*/\n PeiServices_1 = (int ( *)(int, char *))GetPeiServices(); /*0xffe3f5b7*/\n PeiServices = PeiServices_1; /*0xffe3f5bc*/\n if ( FormatString ) /*0xffe3f5c1*/\n {\n AsciiSPrintUnicodeFormat(&OutputBuffer, 0x100u, 0, FormatString, Args, 0); /*0xffe3f5d7*/\n Value_1 = Value; /*0xffe3f5f0*/\n StatusCodeDispatchCallbacks((int)PeiServices, 3, 50659328, 0, 0, (int)StatusCodeData); /*0xffe3f5f4*/\n for ( Callback = (void ( *)(char *, int))i[0]; /*0xffe3f5f9*/\n Callback;\n Callback = (void ( *)(char *, int))dword_FFE43E14[Index++] )\n {\n Callback(&OutputBuffer, Value); /*0xffe3f60c*/\n }\n return PeiServicesInstallPpi((int)PeiServices, &OutputBuffer); /*0xffe3f625*/\n }\n return PeiServices_1; /*0xffe3f62a*/\n}","refs":[{"addr":"0xffe4245c","name":"SetMemWrapper"},{"addr":"0xffe3fdc4","name":"GetPeiServices"},{"addr":"0xffe3feb5","name":"AsciiSPrintUnicodeFormat"},{"addr":"0xffe3f430","name":"StatusCodeDispatchCallbacks"},{"addr":"0xffe43e10","name":"i"},{"addr":"0xffe43e14","name":"HandlerTable"},{"addr":"0xffe3fb5e","name":"PeiServicesInstallPpi"}]} +unsigned int IoPortWrite32(unsigned __int16 a1, unsigned int a2) +{ + int ReportStatusCodePpi; // eax -{"addr":"0xffe3f631","code":"int ( *StatusCodeDebugAssert(double AssertString, int LineNumber))(int a1, char *_r_n)\n{\n int Index; // ebx\n int PeiServices; // esi\n void ( *i)(char *, _DWORD, _DWORD); // eax\n double ExtraInfo; // [esp+0h] [ebp-180h]\n int StatusCodeData[30]; // [esp+8h] [ebp-178h] BYREF\n char AssertBuffer; // [esp+80h] [ebp-100h] BYREF\n _BYTE TempBuffer[255]; // [esp+81h] [ebp-FFh] BYREF\n\n Index = 0; /*0xffe3f63e*/\n StatusCodeData[1] = -1706126778; /*0xffe3f640*/\n StatusCodeData[0] = 23330836; /*0xffe3f64c*/\n StatusCodeData[2] = 299226451; /*0xffe3f669*/\n StatusCodeData[3] = 100721287; /*0xffe3f671*/\n StatusCodeData[4] = -1178385111; /*0xffe3f679*/\n memset(&StatusCodeData[6], 0, 96); /*0xffe3f685*/\n AssertBuffer = 0; /*0xffe3f6ee*/\n SetMemWrapper((int)TempBuffer, TempBuffer, 0, 0xFFu); /*0xffe3f6f5*/\n PeiServices = GetPeiServices(); /*0xffe3f705*/\n AsciiSPrint(\n &AssertBuffer,\n 0x100u,\n \"ASSERT %a(%d): %a\\n Press any key to continue. \\n\",\n AssertString,\n LineNumber,\n ExtraInfo);\n StatusCodeData[5] = 0x80000000; /*0xffe3f728*/\n StatusCodeDispatchCallbacks(PeiServices, 3, 50659328, 0, 0, (int)StatusCodeData); /*0xffe3f73d*/\n for ( i = (void ( *)(char *, _DWORD, _DWORD))i_0; i; i = (void ( *)(char *, _DWORD, _DWORD))::i[Index++] ) /*0xffe3f742*/\n i(&AssertBuffer, LODWORD(AssertString), HIDWORD(AssertString)); /*0xffe3f75a*/\n return PeiServicesInstallPpi(PeiServices, &AssertBuffer); /*0xffe3f779*/\n}","refs":[{"addr":"0xffe4245c","name":"SetMemWrapper"},{"addr":"0xffe3fdc4","name":"GetPeiServices"},{"addr":"0xffe3fdf6","name":"AsciiSPrint"},{"addr":"0xffe4284c","name":"ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n","string":"ASSERT %a(%d): %a\n Press any key to continue. \n"},{"addr":"0xffe3f430","name":"StatusCodeDispatchCallbacks"},{"addr":"0xffe43e0c","name":"i_0"},{"addr":"0xffe43e10","name":"i"},{"addr":"0xffe3fb5e","name":"PeiServicesInstallPpi"}]} + if ( (a1 & 3) != 0 ) /*0xffe417ca*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe417cc*/ + if ( ReportStatusCodePpi ) /*0xffe417d3*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe417e4*/ + "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", + 223, + "(Port & 3) == 0"); + } + __outdword(a1, a2); /*0xffe417ef*/ + return a2; /*0xffe417f0*/ +} -{"addr":"0xffe3f77f","code":"int StatusCodePeiEntry(int FileHandle, int __return_address)\n{\n int v4; // eax\n int PeiServices; // eax\n int Status; // eax\n int Status_1; // esi\n int ReportStatusCodePpi; // eax\n int v10; // eax\n int Status_2; // eax\n int v12; // eax\n int StatusCodePpi; // esi\n int v14; // eax\n int Status_3; // eax\n int v16; // eax\n int Descriptor_1; // esi\n int v18; // eax\n int Status_4; // eax\n int v20; // eax\n int Index; // edi\n int (*i)(); // eax\n void *This; // ecx\n char StatusCodePpiBuffer[4]; // [esp+8h] [ebp-10h] BYREF\n char StatusCodePpiBuffer2[4]; // [esp+Ch] [ebp-Ch] BYREF\n int Descriptor; // [esp+10h] [ebp-8h] BYREF\n int Descriptor2; // [esp+14h] [ebp-4h] BYREF\n\n v4 = GetPeiServices(); /*0xffe3f78b*/\n if ( (*(int ( **)(int))(*(_DWORD *)v4 + 116))(FileHandle) == -2147483628 ) /*0xffe3f79c*/\n {\n PeiServices = GetPeiServices(); /*0xffe3f7a2*/\n Status = (*(int ( **)(int, void *, _DWORD, int *, char *))(*(_DWORD *)PeiServices + 32))( /*0xffe3f7b9*/\n PeiServices,\n &unk_FFE4356C,\n 0,\n &Descriptor2,\n StatusCodePpiBuffer2);\n Status_1 = Status; /*0xffe3f7bc*/\n if ( Status >= 0 ) /*0xffe3f7c3*/\n {\n v10 = GetPeiServices(); /*0xffe3f7fd*/\n Status_2 = (*(int ( **)(int, void *, _DWORD, int *, char *))(*(_DWORD *)v10 + 32))( /*0xffe3f814*/\n v10,\n &unk_FFE4353C,\n 0,\n &Descriptor,\n StatusCodePpiBuffer);\n Status_1 = Status_2; /*0xffe3f817*/\n if ( Status_2 >= 0 ) /*0xffe3f81e*/\n {\n StatusCodePpi = Descriptor2; /*0xffe3f848*/\n v14 = GetPeiServices(); /*0xffe3f84b*/\n Status_3 = (*(int ( **)(int, int, void *))(*(_DWORD *)v14 + 28))(v14, StatusCodePpi, &unk_FFE4367C); /*0xffe3f859*/\n Status_1 = Status_3; /*0xffe3f85c*/\n if ( Status_3 >= 0 ) /*0xffe3f863*/\n {\n Descriptor_1 = Descriptor; /*0xffe3f894*/\n v18 = GetPeiServices(); /*0xffe3f897*/\n Status_4 = (*(int ( **)(int, int, void *))(*(_DWORD *)v18 + 28))(v18, Descriptor_1, &unk_FFE435B8); /*0xffe3f8a5*/\n Status_1 = Status_4; /*0xffe3f8a8*/\n if ( Status_4 < 0 ) /*0xffe3f8af*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status_4); /*0xffe3f8c0*/\n v20 = LocateReportStatusCodePpi(); /*0xffe3f8c8*/\n if ( v20 ) /*0xffe3f8cf*/\n (*(void ( **)(const char *, int, const char *))(v20 + 4))( /*0xffe3f8df*/\n \"e:\\\\hs\\\\AmiModulePkg\\\\AmiStatusCode\\\\StatusCodePei.c\",\n 513,\n \"!EFI_ERROR (Status)\");\n }\n }\n else\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status_3); /*0xffe3f870*/\n v16 = LocateReportStatusCodePpi(); /*0xffe3f878*/\n if ( v16 ) /*0xffe3f87f*/\n (*(void ( **)(const char *, int, const char *))(v16 + 4))( /*0xffe3f88f*/\n \"e:\\\\hs\\\\AmiModulePkg\\\\AmiStatusCode\\\\StatusCodePei.c\",\n 506,\n \"!EFI_ERROR (Status)\");\n }\n }\n else\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status_2); /*0xffe3f82b*/\n v12 = LocateReportStatusCodePpi(); /*0xffe3f833*/\n if ( v12 ) /*0xffe3f83a*/\n (*(void ( **)(const char *, int, const char *))(v12 + 4))( /*0xffe3f846*/\n \"e:\\\\hs\\\\AmiModulePkg\\\\AmiStatusCode\\\\StatusCodePei.c\",\n 499,\n \"!EFI_ERROR (Status)\");\n }\n }\n else\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status); /*0xffe3f7d0*/\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe3f7d8*/\n if ( ReportStatusCodePpi ) /*0xffe3f7df*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe3f7f0*/\n \"e:\\\\hs\\\\AmiModulePkg\\\\AmiStatusCode\\\\StatusCodePei.c\",\n 486,\n \"!EFI_ERROR (Status)\");\n }\n return Status_1; /*0xffe3f7f6*/\n }\n else\n {\n Index = 0; /*0xffe3f8e5*/\n for ( i = PpiDescriptorPtr; i; i = (int (*)())dword_FFE427FC[Index++] ) /*0xffe3f8e7*/\n i(); /*0xffe3f8f0*/\n (*(void ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE435AC); /*0xffe3f908*/\n StatusCodeAllocCallbackNode(This); /*0xffe3f90b*/\n (*(void ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE435B8); /*0xffe3f918*/\n return (*(int ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE4367C); /*0xffe3f923*/\n }\n}","refs":[{"addr":"0xffe3fdc4","name":"GetPeiServices"},{"addr":"0xffe4356c","name":"unk_FFE4356C"},{"addr":"0xffe4353c","name":"unk_FFE4353C"},{"addr":"0xffe4367c","name":"unk_FFE4367C"},{"addr":"0xffe435b8","name":"unk_FFE435B8"},{"addr":"0xffe3fd7c","name":"DebugPrint"},{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe4279c","name":"aEHsAmimodulepk","string":"e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c"},{"addr":"0xffe3fb56","name":"PpiDescriptorPtr"},{"addr":"0xffe427fc","name":"dword_FFE427FC"},{"addr":"0xffe435ac","name":"unk_FFE435AC"},{"addr":"0xffe3f2fb","name":"StatusCodeAllocCallbackNode"}]} -{"addr":"0xffe3f930","code":"int DebugAssertMsgs(int StatusCodeData, int _r_n)\n{\n int v2; // esi\n int v3; // eax\n\n v2 = StatusCodeData + 52; /*0xffe3f931*/\n v3 = 0; /*0xffe3f934*/\n if ( *(_BYTE *)(StatusCodeData + 52) ) /*0xffe3f936*/\n {\n do /*0xffe3f93b*/\n ++v3; /*0xffe3f93a*/\n while ( *(_BYTE *)(v3 + v2) ); /*0xffe3f93b*/\n }\n SPrintAsciiFormat(\n _r_n,\n 256,\n (int)\"ASSERT in %s on %i: %s\\n\",\n (const char *)(StatusCodeData + 52),\n *(_DWORD *)(StatusCodeData + 40),\n (const char *)(v2 + v3 + 1));\n return 0; /*0xffe3f95e*/\n}","refs":[{"addr":"0xffe411f9","name":"SPrintAsciiFormat"},{"addr":"0xffe42800","name":"aAssertInSOnIS","string":"ASSERT in %s on %i: %s\n"}]} +__int16 IoPortWrite8(_WORD *a1, __int16 n1280) +{ + int ReportStatusCodePpi; // eax -{"addr":"0xffe3f960","code":"int StatusCodeToErrorStr(int n7, int _r_n)\n{\n int n7_1; // esi\n int i; // eax\n double v5; // [esp-4h] [ebp-8h]\n\n n7_1 = ::n7; /*0xffe3f961*/\n for ( i = 0; ; ++i )\n {\n if ( !n7_1 )\n {\n SPrintAsciiFormat(\n _r_n,\n 256,\n (int)\"ERROR: Class:%X; Subclass:%X; Operation: %X\\n\",\n n7 & 0xFF000000,\n n7 & 0xFF0000,\n (unsigned __int16)n7);\n return 0; /*0xffe3f999*/\n }\n if ( n7_1 == n7 ) /*0xffe3f96d*/\n break; /*0xffe3f96d*/\n n7_1 = dword_FFE435E4[2 *i]; /*0xffe3f96f*/\n }\n LODWORD(v5) = (&off_FFE435E0)[2 *i]; // \"Memory not installed\" /*0xffe3f9a5*/\n SPrintAsciiFormat(_r_n, 256, (int)\"ERROR: %a\\n\", v5);\n return 0; /*0xffe3f9a3*/\n}","refs":[{"addr":"0xffe435dc","name":"n7"},{"addr":"0xffe411f9","name":"SPrintAsciiFormat"},{"addr":"0xffe42818","name":"aErrorClassXSub","string":"ERROR: Class:%X; Subclass:%X; Operation: %X\n"},{"addr":"0xffe435e4","name":"dword_FFE435E4"},{"addr":"0xffe435e0","name":"off_FFE435E0"},{"addr":"0xffe42790","name":"aErrorA","string":"ERROR: %a\n"}]} + if ( ((unsigned __int8)a1 & 1) != 0 ) /*0xffe417fd*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe417ff*/ + if ( ReportStatusCodePpi ) /*0xffe41806*/ + (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822372, 183, (char *)-1822324); /*0xffe41817*/ + } + *a1 = n1280; /*0xffe4181d*/ + return n1280; /*0xffe41823*/ +} -{"addr":"0xffe3f9c1","code":"int StatusCodeFormatMsg(int CodeType, int Value, int StatusCodeData, _BYTE *Buffer)\n{\n char *SrcPtr; // esi\n char *WideSrcPtr; // ebp\n unsigned __int16 Index; // dx\n int DataType; // eax\n char CharByte; // al\n __int16 CharSize; // ax\n char WideCharByte; // al\n int DataPtr; // ecx\n\n if ( !StatusCodeData ) /*0xffe3f9d6*/\n goto LABEL_24; /*0xffe3f9d6*/\n if ( StrnCmp((_BYTE *)(StatusCodeData + 4), src_3) ) /*0xffe3f9e7*/\n {\n if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_0) ) /*0xffe3fa69*/\n {\n AsciiSPrintUnicodeFormat( /*0xffe3fa8d*/\n Buffer,\n 0x100u,\n 0,\n (unsigned __int8 *)(StatusCodeData + 120),\n va,\n (unsigned __int16 *)(StatusCodeData + 24));\n return 0; /*0xffe3fa95*/\n }\n if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_1) ) /*0xffe3fa9f*/\n {\n if ( (_BYTE)CodeType != 2 ) /*0xffe3faac*/\n return 0; /*0xffe3faac*/\n if ( (CodeType & 0xFF000000) == 0x90000000 && (_WORD)Value == 7 ) /*0xffe3fac0*/\n {\n DataPtr = StatusCodeData; /*0xffe3fac2*/\nLABEL_23:\n DebugAssertMsgs(DataPtr, (int)Buffer); /*0xffe3fadb*/\n return 0; /*0xffe3fae4*/\n }\nLABEL_25:\n StatusCodeToErrorStr(Value, (int)Buffer); /*0xffe3faeb*/\n return 0; /*0xffe3faf1*/\n }\n if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_2) ) /*0xffe3face*/\n {\n DataPtr = StatusCodeData + 20; /*0xffe3fad8*/\n goto LABEL_23; /*0xffe3fad8*/\n }\nLABEL_24:\n if ( (_BYTE)CodeType != 2 ) /*0xffe3fae9*/\n return 0; /*0xffe3fae9*/\n goto LABEL_25; /*0xffe3fae9*/\n }\n SrcPtr = *(char **)(StatusCodeData + 24); /*0xffe3f9f1*/\n WideSrcPtr = SrcPtr; /*0xffe3f9f4*/\n for ( Index = 0; ; Index += CharSize ) /*0xffe3f9fa*/\n {\n DataType = *(_DWORD *)(StatusCodeData + 20); /*0xffe3f9fe*/\n if ( (DataType || !*SrcPtr) && (DataType != 1 || !*(_WORD *)WideSrcPtr) ) /*0xffe3fa10*/\n break; /*0xffe3fa10*/\n if ( Index >= 0xFFu ) /*0xffe3fa1e*/\n break; /*0xffe3fa1e*/\n if ( DataType ) /*0xffe3fa22*/\n {\n WideCharByte = *WideSrcPtr; /*0xffe3fa37*/\n WideSrcPtr += 2; /*0xffe3fa3a*/\n Buffer[Index] = WideCharByte; /*0xffe3fa42*/\n CharSize = 2; /*0xffe3fa45*/\n }\n else\n {\n CharByte = *SrcPtr++; /*0xffe3fa24*/\n Buffer[Index] = CharByte; /*0xffe3fa2a*/\n CharSize = 1; /*0xffe3fa2f*/\n }\n }\n Buffer[Index] = 0; /*0xffe3fa59*/\n return 0; /*0xffe3faf8*/\n}","refs":[{"addr":"0xffe3feb5","name":"AsciiSPrintUnicodeFormat"},{"addr":"0xffe43e2c","name":"va"},{"addr":"0xffe40c09","name":"StrnCmp"},{"addr":"0xffe4358c","name":"src_0"},{"addr":"0xffe3f930","name":"DebugAssertMsgs"},{"addr":"0xffe3f960","name":"StatusCodeToErrorStr"},{"addr":"0xffe4352c","name":"src_1"},{"addr":"0xffe4368c","name":"src_2"},{"addr":"0xffe4357c","name":"src_3"}]} -{"addr":"0xffe3fafe","code":"int SetMem16(int a1, char *_r_n)\n{\n char *_r_n_1; // ecx\n int n2; // edx\n char *v4; // esi\n char n10; // al\n\n _r_n_1 = _r_n; /*0xffe3fafe*/\n n2 = 0; /*0xffe3fb02*/\n if ( _r_n && *_r_n ) /*0xffe3fb08*/\n {\n do /*0xffe3fb43*/\n {\n v4 = &_r_n_1[n2]; /*0xffe3fb0d*/\n n10 = _r_n_1[n2]; /*0xffe3fb10*/\n if ( n10 == 13 && v4[1] == 10 ) /*0xffe3fb1a*/\n {\n n2 += 2; /*0xffe3fb1c*/\n }\n else if ( n10 == 10 ) /*0xffe3fb23*/\n {\n if ( n2 ) /*0xffe3fb27*/\n ComPortPollLsrTx(_r_n_1, n2); /*0xffe3fb29*/\n ComPortPollLsrTx(\"\\r\\n\", 2); /*0xffe3fb36*/\n _r_n_1 = v4 + 1; /*0xffe3fb3b*/\n n2 = 0; /*0xffe3fb3e*/\n }\n else\n {\n ++n2; /*0xffe3fb42*/\n }\n }\n while ( _r_n_1[n2] ); /*0xffe3fb43*/\n if ( n2 ) /*0xffe3fb4c*/\n ComPortPollLsrTx(_r_n_1, n2); /*0xffe3fb4e*/\n }\n return 0; /*0xffe3fb55*/\n}","refs":[{"addr":"0xffe414a9","name":"ComPortPollLsrTx"},{"addr":"0xffe42848","name":"_r_n","string":"\r\n"}]} +int DebugEnabled() +{ + unsigned __int8 v0; // al + char n3; // al + char n3_1; // cl -{"addr":"0xffe3fb56","code":"int PpiDescriptorPtr()\n{\n ComPortInitialize(); /*0xffe3fb56*/\n return 0; /*0xffe3fb5d*/\n}","refs":[{"addr":"0xffe413a5","name":"ComPortInitialize"}]} + v0 = __inbyte(0x70u); /*0xffe4182c*/ + __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe41831*/ + n3 = __inbyte(0x71u); /*0xffe41838*/ + n3_1 = n3; /*0xffe41839*/ + if ( (unsigned __int8)n3 <= 3u ) /*0xffe4183e*/ + { +LABEL_4: + if ( !n3_1 ) /*0xffe41859*/ + return 0; /*0xffe41859*/ + goto LABEL_5; /*0xffe41859*/ + } + n3_1 = n3; /*0xffe41840*/ + if ( !n3 ) /*0xffe41848*/ + { + n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe41854*/ + goto LABEL_4; /*0xffe41854*/ + } +LABEL_5: + if ( n3_1 != -1 ) + return n3_1 != 1 ? -2147483578 : -2147483644; + return 0; /*0xffe41871*/ +} -{"addr":"0xffe3fb5e","code":"int ( *PeiServicesInstallPpi(int PeiServices, char *_r_n))(int a1, char *_r_n)\n{\n int v4; // esi\n int ( *SetMem16_1)(int, char *); // eax\n\n v4 = 0; /*0xffe3fb65*/\n for ( SetMem16_1 = SetMem16; SetMem16_1; SetMem16_1 = (int ( *)(int, char *))dword_FFE427F4[v4++] ) /*0xffe3fb67*/\n SetMem16_1(PeiServices, _r_n); /*0xffe3fb70*/\n return SetMem16_1; /*0xffe3fb80*/\n}","refs":[{"addr":"0xffe3fafe","name":"SetMem16"},{"addr":"0xffe427f4","name":"dword_FFE427F4"}]} -{"addr":"0xffe3fb84","code":"int SerialPortWrite(\n int PeiServices,\n int CodeType,\n int Value,\n int Instance,\n int CallerId,\n int StatusCodeData,\n char *Buffer)\n{\n int Index1; // edi\n void ( *Callback1)(int, unsigned __int8, int); // eax\n int Index2; // edi\n void ( *i)(int, int, __int16); // eax\n int *HandlerTable; // eax\n\n Index1 = 0; /*0xffe3fb90*/\n for ( Callback1 = (void ( *)(int, unsigned __int8, int))BasePrintFillBuffer; /*0xffe3fb92*/\n Callback1;\n Callback1 = (void ( *)(int, unsigned __int8, int))*(&funcs_FFE3FB9C + Index1++) )\n {\n Callback1(PeiServices, CodeType, Value); /*0xffe3fb9c*/\n }\n *Buffer = 0; /*0xffe3fbba*/\n StatusCodeFormatMsg(CodeType, Value, StatusCodeData, Buffer); /*0xffe3fbbc*/\n if ( *Buffer ) /*0xffe3fbc1*/\n PeiServicesInstallPpi(PeiServices, Buffer); /*0xffe3fbcc*/\n Index2 = 0; /*0xffe3fbd1*/\n for ( i = (void ( *)(int, int, __int16))BasePrintParseHexByte; /*0xffe3fbd3*/\n i;\n i = (void ( *)(int, int, __int16))dword_FFE427EC[Index2++] )\n {\n i(PeiServices, CodeType, Value); /*0xffe3fbe9*/\n }\n if ( (_BYTE)CodeType == 2 ) /*0xffe3fbfd*/\n {\n HandlerTable = ::HandlerTable; /*0xffe3fc06*/\n if ( byte_FFE43E1C ) /*0xffe3fc0b*/\n HandlerTable = (int *)&unk_FFE43E20; /*0xffe3fc0d*/\n while ( *HandlerTable ) /*0xffe3fc25*/\n {\n if ( *HandlerTable == Value && HandlerTable[1] ) /*0xffe3fc18*/\n {\n ((void ( *)(int, int))HandlerTable[1])(PeiServices, Value); /*0xffe3fc2b*/\n return 0; /*0xffe3fc2b*/\n }\n HandlerTable += 2; /*0xffe3fc1e*/\n }\n }\n return 0; /*0xffe3fc30*/\n}","refs":[{"addr":"0xffe3fc43","name":"BasePrintFillBuffer"},{"addr":"0xffe427e0","name":"funcs_FFE3FB9C"},{"addr":"0xffe3f9c1","name":"StatusCodeFormatMsg"},{"addr":"0xffe3fb5e","name":"PeiServicesInstallPpi"},{"addr":"0xffe3fd06","name":"BasePrintParseHexByte"},{"addr":"0xffe427ec","name":"dword_FFE427EC"},{"addr":"0xffe43e14","name":"HandlerTable"},{"addr":"0xffe43e20","name":"unk_FFE43E20"},{"addr":"0xffe43e1c","name":"byte_FFE43E1C"}]} +bool GuidCompare(char *this, int a2) +{ + __int64 v4; // rax + int v5; // ebp + __int64 v6; // rax + int v7; // edi + __int64 v8; // kr00_8 + __int64 v9; // rax + int v11; // [esp+10h] [ebp-Ch] + int v12; // [esp+14h] [ebp-8h] -{"addr":"0xffe3fc37","code":"int BasePrintIsHexDigit(int a1, unsigned __int8 a2)\n{\n int result; // eax\n\n result = a2; /*0xffe3fc37*/\n __outbyte(0x80u, a2); /*0xffe3fc41*/\n return result; /*0xffe3fc42*/\n}"} + v4 = GuidCopy(this); /*0xffe41880*/ + v12 = HIDWORD(v4); /*0xffe41887*/ + v5 = v4; /*0xffe4188b*/ + v6 = GuidCopy((void *)a2); /*0xffe4188d*/ + v11 = HIDWORD(v6); /*0xffe41895*/ + v7 = v6; /*0xffe41899*/ + v8 = GuidCopy(this + 8); /*0xffe418a7*/ + v9 = GuidCopy((void *)(a2 + 8)); /*0xffe418a9*/ + return v5 == v7 && v12 == v11 && v8 == v9; /*0xffe418cc*/ +} -{"addr":"0xffe3fc43","code":"int BasePrintFillBuffer(int a1, unsigned __int8 a2, int a3)\n{\n unsigned int n2; // eax\n int v4; // eax\n int v5; // ebx\n unsigned __int8 v6; // al\n void ( *i)(int, unsigned __int8); // eax\n unsigned __int8 v9; // [esp+Ch] [ebp+Ch]\n\n n2 = a2 - 1; /*0xffe3fc4a*/\n if ( n2 < 2 ) /*0xffe3fc4e*/\n {\n v4 = (int)*(&off_FFE4287C + n2); /*0xffe3fc50*/\n v5 = 0; /*0xffe3fc58*/\n while ( 1 ) /*0xffe3fc64*/\n {\n if ( !*(_DWORD *)v4 ) /*0xffe3fc64*/\n {\n v6 = 0; /*0xffe3fc6a*/\n goto LABEL_7; /*0xffe3fc6a*/\n }\n if ( *(_DWORD *)v4 == a3 ) /*0xffe3fc5f*/\n break; /*0xffe3fc5f*/\n v4 += 8; /*0xffe3fc61*/\n }\n v6 = *(_BYTE *)(v4 + 4); /*0xffe3fc7a*/\nLABEL_7:\n v9 = v6; /*0xffe3fc6c*/\n if ( v6 ) /*0xffe3fc71*/\n {\n for ( i = (void ( *)(int, unsigned __int8))BasePrintIsHexDigit; /*0xffe3fc73*/\n i;\n i = (void ( *)(int, unsigned __int8))funcs_FFE3FC85[v5++] )\n {\n i(a1, v9); /*0xffe3fc85*/\n }\n }\n }\n return 0; /*0xffe3fc98*/\n}","refs":[{"addr":"0xffe4287c","name":"off_FFE4287C"},{"addr":"0xffe3fc37","name":"BasePrintIsHexDigit"},{"addr":"0xffe427d4","name":"funcs_FFE3FC85"}]} -{"addr":"0xffe3fc9a","code":"int BasePrintProduceSChar(int a1, unsigned __int8 n2, int a3)\n{\n unsigned int n2_1; // esi\n int i; // eax\n unsigned __int8 v5; // al\n int v6; // edi\n\n n2_1 = n2 - 1; /*0xffe3fca5*/\n if ( n2_1 < 2 ) /*0xffe3fcaa*/\n {\n for ( i = (int)*(&off_FFE42884 + n2_1); ; i += 8 ) /*0xffe3fcac*/\n {\n if ( !*(_DWORD *)i ) /*0xffe3fcbd*/\n {\n v5 = 0; /*0xffe3fcc3*/\n goto LABEL_7; /*0xffe3fcc3*/\n }\n if ( *(_DWORD *)i == a3 ) /*0xffe3fcb8*/\n break; /*0xffe3fcb8*/\n }\n v5 = *(_BYTE *)(i + 4); /*0xffe3fd01*/\nLABEL_7:\n if ( v5 ) /*0xffe3fcc7*/\n {\n v6 = v5; /*0xffe3fcc9*/\n do /*0xffe3fce8*/\n {\n ComPortSetBaud(0xE56Cu, 0x61A80u); /*0xffe3fcd6*/\n TimerDelay(0x186A0u); /*0xffe3fce0*/\n --v6; /*0xffe3fce5*/\n }\n while ( v6 ); /*0xffe3fce8*/\n }\n if ( n2 == 2 ) /*0xffe3fced*/\n TimerDelay(0xF4240u); /*0xffe3fcf4*/\n }\n return 0; /*0xffe3fcf9*/\n}","refs":[{"addr":"0xffe42884","name":"off_FFE42884"},{"addr":"0xffe41524","name":"ComPortSetBaud"},{"addr":"0xffe41339","name":"TimerDelay"}]} +void *__thiscall PeiServicesGetTss(void *this) +{ + void *this_1; // eax -{"addr":"0xffe3fd06","code":"int BasePrintParseHexByte(int a1, int a2, __int16 a3)\n{\n int v3; // esi\n\n if ( (a3 & 0xFF00) == 0x8100 && (_BYTE)a3 ) /*0xffe3fd21*/\n {\n v3 = (unsigned __int8)a3; /*0xffe3fd23*/\n do /*0xffe3fd42*/\n {\n ComPortSetBaud(0x33198u, 0x9C40u); /*0xffe3fd30*/\n TimerDelay(0x186A0u); /*0xffe3fd3a*/\n --v3; /*0xffe3fd3f*/\n }\n while ( v3 ); /*0xffe3fd42*/\n }\n return 0; /*0xffe3fd46*/\n}","refs":[{"addr":"0xffe41524","name":"ComPortSetBaud"},{"addr":"0xffe41339","name":"TimerDelay"}]} + if ( !this ) /*0xffe418da*/ + CpuDeadLoop((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, "Idtr != ((void *) 0)"); /*0xffe418e9*/ + this_1 = this; /*0xffe418ef*/ + __sidt(this); /*0xffe418f2*/ + return this_1; /*0xffe418f6*/ +} -{"addr":"0xffe3fd4b","code":"int LocateReportStatusCodePpi()\n{\n int PeiServices; // eax\n _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF\n int v3; // [esp+4h] [ebp-4h] BYREF\n\n PeiServices = GetPeiServices(); /*0xffe3fd50*/\n if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)PeiServices + 32))( /*0xffe3fd6f*/\n PeiServices,\n &unk_FFE4354C,\n 0,\n v2,\n &v3) >= 0 )\n return v3; /*0xffe3fd75*/\n else\n return 0; /*0xffe3fd71*/\n}","refs":[{"addr":"0xffe3fdc4","name":"GetPeiServices"},{"addr":"0xffe4354c","name":"unk_FFE4354C"}]} -{"addr":"0xffe3fd7c","code":"int DebugPrint(int a1, const char *a2, ...)\n{\n int result; // eax\n int ( **v3)(int, const char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a2);\n result = LocateReportStatusCodePpi(); /*0xffe3fd7d*/\n v3 = (int ( **)(int, const char *, char *))result; /*0xffe3fd82*/\n if ( result ) /*0xffe3fd86*/\n {\n result = DebugEnabled(); /*0xffe3fd88*/\n if ( (result & a1) != 0 ) /*0xffe3fd93*/\n return (*v3)(a1, a2, (char *)va); /*0xffe3fd9f*/\n }\n return result; /*0xffe3fda4*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe41826","name":"DebugEnabled"}]} +__int16 __thiscall PciReadBuffer(void *this) +{ + int ReportStatusCodePpi; // eax -{"addr":"0xffe3fda6","code":"int CpuDeadLoop(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n const char *PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = LocateReportStatusCodePpi(); /*0xffe3fdac*/\n if ( result ) /*0xffe3fdb3*/\n return (*(int ( **)(int, int, const char *))(result + 4))( /*0xffe3fdbb*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe3fdc1*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} + if ( !this ) /*0xffe418fc*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe418fe*/ + if ( ReportStatusCodePpi ) /*0xffe41905*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41913*/ + "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", + 38, + "Buffer != ((void *) 0)"); + } + return *(_WORD *)this; /*0xffe4191c*/ +} -{"addr":"0xffe3fdc4","code":"int GetPeiServices()\n{\n int v0; // esi\n _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF\n int v3; // [esp+6h] [ebp-6h]\n\n PeiServicesGetTss(v2); /*0xffe3fdcd*/\n v0 = *(_DWORD *)(v3 - 4); /*0xffe3fdd5*/\n if ( !v0 ) /*0xffe3fdda*/\n CpuDeadLoop( /*0xffe3fde9*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n \"PeiServices != ((void *) 0)\");\n return v0; /*0xffe3fdf1*/\n}","refs":[{"addr":"0xffe418d4","name":"PeiServicesGetTss"},{"addr":"0xffe3fda6","name":"CpuDeadLoop"},{"addr":"0xffe428c4","name":"aEHsMdepkgLibra","string":"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c"},{"addr":"0xffe428a4","name":"PeiServices____((void__)_0)","string":"PeiServices != ((void *) 0)"}]} -{"addr":"0xffe3fdf6","code":"unsigned int AsciiSPrint(\n _BYTE *p__r_n,\n unsigned int n0xF4240,\n unsigned __int8 *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n,\n ...)\n{\n va_list va; // [esp+10h] [ebp+10h] BYREF\n\n va_start(va, ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n);\n return AsciiSPrintUnicodeFormat(p__r_n, n0xF4240, 0, ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n, (int)va, 0); /*0xffe3fe13*/\n}","refs":[{"addr":"0xffe3feb5","name":"AsciiSPrintUnicodeFormat"}]} +int __thiscall PciWriteBuffer(void *this) +{ + int ReportStatusCodePpi; // eax -{"addr":"0xffe3fe14","code":"_BYTE *BasePrintFillChar(_BYTE *a1, unsigned int a2, int i, __int16 a4, int a5)\n{\n int j; // esi\n\n for ( j = 0; j < i; ++j ) /*0xffe3fe20*/\n {\n if ( (unsigned int)a1 >= a2 ) /*0xffe3fe27*/\n break; /*0xffe3fe27*/\n *a1 = a4; /*0xffe3fe2d*/\n if ( a5 != 1 ) /*0xffe3fe2f*/\n a1[1] = HIBYTE(a4); /*0xffe3fe36*/\n a1 += a5; /*0xffe3fe39*/\n }\n return a1; /*0xffe3fe42*/\n}"} + if ( !this ) /*0xffe41923*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41925*/ + if ( ReportStatusCodePpi ) /*0xffe4192c*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe4193d*/ + "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", + 141, + "Buffer != ((void *) 0)"); + } + return *(_DWORD *)this; /*0xffe41945*/ +} -{"addr":"0xffe3fe48","code":"_BYTE *SPrintMarker(_BYTE *_r_n, unsigned int n16, int a3, unsigned int a4)\n{\n _BYTE *_r_n_1; // esi\n int ReportStatusCodePpi; // eax\n int v7; // eax\n int v8; // edx\n unsigned __int64 v9; // rtt\n unsigned int v11; // [esp-4h] [ebp-1Ch]\n int v12; // [esp+Ch] [ebp-Ch] BYREF\n int *v13; // [esp+10h] [ebp-8h]\n unsigned int n16_1; // [esp+14h] [ebp-4h]\n\n _r_n_1 = _r_n; /*0xffe3fe4f*/\n v13 = &v12; /*0xffe3fe57*/\n n16_1 = n16; /*0xffe3fe5a*/\n *_r_n = 0; /*0xffe3fe5d*/\n do /*0xffe3fe9e*/\n {\n if ( !n16 ) /*0xffe3fe62*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe3fe64*/\n if ( ReportStatusCodePpi ) /*0xffe3fe6b*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe3fe79*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\DivU64x32Remainder.c\",\n 47,\n \"Divisor != 0\");\n }\n v11 = a4 / n16_1; /*0xffe3fe89*/\n LODWORD(v9) = a3; /*0xffe3fe8d*/\n HIDWORD(v9) = a4 % n16_1; /*0xffe3fe8d*/\n v7 = v9 / n16_1; /*0xffe3fe8d*/\n v8 = v9 % n16_1; /*0xffe3fe8d*/\n if ( v13 ) /*0xffe3fe92*/\n *v13 = v8; /*0xffe3fe94*/\n ++_r_n_1; /*0xffe3fe9a*/\n a3 = v7; /*0xffe3fe9b*/\n a4 = v11; /*0xffe3fea0*/\n *_r_n_1 = byte_FFE42EBC[v12]; /*0xffe3fea9*/\n }\n while ( v11 | v7 ); /*0xffe3fe9e*/\n return _r_n_1; /*0xffe3fead*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe42ebc","name":"byte_FFE42EBC"}]} -Output truncated. Run: curl -o .ida-mcp/19d922d8-8166-4d4e-b49a-0eae28caa306.json http://127.0.0.1:13392/output/19d922d8-8166-4d4e-b49a-0eae28caa306.json +__int64 __thiscall GuidCopy(void *this) +{ + int ReportStatusCodePpi; // eax -{"addr":"0xffe40afd","code":"unsigned int PciCf8Read(_BYTE *_r_n, unsigned int n38, __int16 a3, char *%02d_%02d_%04d__%02d:%02d, ...)\n{\n va_list va; // [esp+18h] [ebp+18h] BYREF\n\n va_start(va, %02d_%02d_%04d__%02d:%02d);\n return AsciiSPrintUnicodeFormat(_r_n, n38, a3, (unsigned __int8 *)%02d_%02d_%04d__%02d:%02d, (int)va, 0); /*0xffe40b1a*/\n}","refs":[{"addr":"0xffe3feb5","name":"AsciiSPrintUnicodeFormat"}]} + if ( !this ) /*0xffe4194c*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4194e*/ + if ( ReportStatusCodePpi ) /*0xffe41955*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41966*/ + "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", + 192, + "Buffer != ((void *) 0)"); + } + return *(_QWORD *)this; /*0xffe41971*/ +} -{"addr":"0xffe40b1c","code":"int PpiListIteratorInit()\n{\n int PeiServices; // eax\n int v1; // eax\n int ReportStatusCodePpi; // eax\n int v3; // eax\n int v5; // [esp+4h] [ebp-4h] BYREF\n\n PeiServices = GetPeiServices(); /*0xffe40b21*/\n v1 = (*(int ( **)(int, int *))(*(_DWORD *)PeiServices + 48))(PeiServices, &v5); /*0xffe40b2d*/\n if ( v1 < 0 ) /*0xffe40b39*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v1); /*0xffe40b46*/\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe40b4e*/\n if ( ReportStatusCodePpi ) /*0xffe40b55*/\n (*(void ( **)(char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe40b5f*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 50,\n \"!EFI_ERROR (Status)\");\n }\n if ( !v5 ) /*0xffe40b69*/\n {\n v3 = LocateReportStatusCodePpi(); /*0xffe40b6b*/\n if ( v3 ) /*0xffe40b72*/\n (*(void ( **)(char *, int, const char *))(v3 + 4))( /*0xffe40b7c*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 51,\n \"HobList != ((void *) 0)\");\n }\n return v5; /*0xffe40b85*/\n}","refs":[{"addr":"0xffe3fdc4","name":"GetPeiServices"},{"addr":"0xffe3fd7c","name":"DebugPrint"},{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe42ebd","name":"a123456789abcde","string":"123456789ABCDEFe:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c"},{"addr":"0xffe42ef4","name":"aHoblistVoid0","string":"HobList != ((void *) 0)"}]} -{"addr":"0xffe40b8a","code":"_WORD *PpiListIteratorNext(int a1, _WORD *i)\n{\n _WORD *i_1; // esi\n int ReportStatusCodePpi; // eax\n\n i_1 = i; /*0xffe40b8b*/\n if ( !i ) /*0xffe40b8f*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe40b91*/\n if ( ReportStatusCodePpi ) /*0xffe40b98*/\n (*(void ( **)(char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe40ba6*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 82,\n \"HobStart != ((void *) 0)\");\n }\n while ( 1 ) /*0xffe40bbf*/\n {\n if ( *i_1 == 0xFFFF ) /*0xffe40bc5*/\n return 0; /*0xffe40bca*/\n if ( *i_1 == 4 ) /*0xffe40bb7*/\n break; /*0xffe40bb7*/\n i_1 = (_WORD *)((char *)i_1 + (unsigned __int16)i_1[1]); /*0xffe40bbd*/\n }\n return i_1; /*0xffe40bc9*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe42ebd","name":"a123456789abcde","string":"123456789ABCDEFe:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c"},{"addr":"0xffe42f0c","name":"aHobstartVoid0","string":"HobStart != ((void *) 0)"}]} +unsigned int PciCf8Write(_WORD *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n) +{ + int ReportStatusCodePpi; // eax + unsigned int n0xF4240; // eax -{"addr":"0xffe40bcf","code":"_WORD *__thiscall FindGuidInPpiList(char *this)\n{\n _WORD *i; // edx\n int v3; // ecx\n _WORD *v4; // eax\n _WORD *v5; // esi\n\n for ( i = (_WORD *)PpiListIteratorInit(); ; i = (_WORD *)((char *)v5 + (unsigned __int16)v5[1]) ) /*0xffe40bde*/\n {\n v4 = PpiListIteratorNext(v3, i); /*0xffe40bf6*/\n v5 = v4; /*0xffe40bfb*/\n if ( !v4 || GuidCompare(this, (int)(v4 + 4)) ) /*0xffe40be7*/\n break; /*0xffe40be7*/\n }\n return v5; /*0xffe40c01*/\n}","refs":[{"addr":"0xffe40b1c","name":"PpiListIteratorInit"},{"addr":"0xffe40b8a","name":"PpiListIteratorNext"},{"addr":"0xffe41875","name":"GuidCompare"}]} + if ( ((unsigned __int8)ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n & 1) != 0 ) /*0xffe41979*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4197b*/ + if ( ReportStatusCodePpi ) /*0xffe41982*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41993*/ + "e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", + 128, + "((UINTN) String & 0x00000001) == 0"); + } + if ( !ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n ) /*0xffe4199b*/ + return 0; /*0xffe419bd*/ + n0xF4240 = 0; /*0xffe4199f*/ + if ( *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n ) /*0xffe419a1*/ + { + while ( n0xF4240 < 0xF4240 ) /*0xffe419ab*/ + { + if ( !ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n[++n0xF4240] ) /*0xffe419ae*/ + return n0xF4240; /*0xffe419b2*/ + } + return 1000001; /*0xffe419b6*/ + } + return n0xF4240; /*0xffe419b4*/ +} -{"addr":"0xffe40c09","code":"int StrnCmp(_BYTE *a1, _BYTE *src)\n{\n _BYTE *v2; // esi\n _BYTE *v3; // edi\n int n4; // ebx\n int v5; // ecx\n\n v2 = a1; /*0xffe40c0b*/\n v3 = a1 + 16; /*0xffe40c10*/\n n4 = (unsigned __int8)a1 & 3; /*0xffe40c13*/\n if ( ((unsigned __int8)a1 & 3) != 0 && n4 == ((unsigned __int8)src & 3) ) /*0xffe40c1f*/\n {\n v5 = 4 - n4; /*0xffe40c24*/\n if ( n4 != 4 ) /*0xffe40c26*/\n {\n do /*0xffe40c33*/\n {\n if ( *v2 != *src ) /*0xffe40c2c*/\n break; /*0xffe40c2c*/\n ++v2; /*0xffe40c2e*/\n ++src; /*0xffe40c2f*/\n --v5; /*0xffe40c30*/\n }\n while ( v5 ); /*0xffe40c33*/\n }\n }\n while ( v2 <= v3 - 4 && *(_DWORD *)v2 == *(_DWORD *)src ) /*0xffe40c3e*/\n {\n v2 += 4; /*0xffe40c40*/\n src += 4; /*0xffe40c43*/\n }\n while ( 1 ) /*0xffe40c54*/\n {\n if ( v2 >= v3 ) /*0xffe40c56*/\n return 0; /*0xffe40c5d*/\n if ( *v2 != *src ) /*0xffe40c50*/\n break; /*0xffe40c50*/\n ++v2; /*0xffe40c52*/\n ++src; /*0xffe40c53*/\n }\n return (char)*v2 - (char)*src; /*0xffe40c5a*/\n}"} -{"addr":"0xffe40c68","code":"_BYTE *NumberToString(_BYTE *a1, unsigned int n10, __int64 n0xA, char a4)\n{\n int v4; // ebx\n int _EDX; // edx\n int n0xA_1; // ecx\n char v9; // al\n\n v4 = HIDWORD(n0xA); /*0xffe40c69*/\n if ( n0xA >= 0 ) /*0xffe40c7a*/\n goto LABEL_2; /*0xffe40c7a*/\n if ( n10 == 10 ) /*0xffe40c89*/\n {\n n0xA_1 = -(int)n0xA; /*0xffe40c8f*/\n _EDX = (unsigned __int64)-n0xA >> 32; /*0xffe40c94*/\n goto LABEL_8; /*0xffe40c96*/\n }\n if ( a4 ) /*0xffe40c9d*/\nLABEL_2:\n _EDX = HIDWORD(n0xA); /*0xffe40c82*/\n else\n _EDX = 0; /*0xffe40c9f*/\n n0xA_1 = n0xA; /*0xffe40ca1*/\nLABEL_8:\n if ( __PAIR64__(n0xA_1, _EDX) ) /*0xffe40ca7*/\n {\n do /*0xffe40cd0*/\n {\n n0xA_1 = Udiv64Remainder(n10, (unsigned int *)&n0xA, n0xA_1, _EDX); /*0xffe40cb8*/\n if ( (unsigned int)n0xA >= 0xA ) /*0xffe40cc1*/\n v9 = n0xA + 87; /*0xffe40cc7*/\n else\n v9 = n0xA + 48; /*0xffe40cc3*/\n *a1++ = v9; /*0xffe40cc9*/\n }\n while ( __PAIR64__(n0xA_1, _EDX) ); /*0xffe40cd0*/\n }\n else\n {\n *a1++ = 48; /*0xffe40cd4*/\n }\n if ( n10 == 10 && v4 < 0 ) /*0xffe40cdf*/\n *a1++ = 45; /*0xffe40ce7*/\n *a1 = 0; /*0xffe40cec*/\n return a1 - 1; /*0xffe40ceb*/\n}","refs":[{"addr":"0xffe41296","name":"Udiv64Remainder"}]} +unsigned int __thiscall PciCf8Modify(_BYTE *this) +{ + unsigned int n0xF4240; // eax -{"addr":"0xffe40cf6","code":"char *StringReverse(char *a1, unsigned int n10, __int64 n0xA, char a4)\n{\n char *v5; // esi\n char *v6; // eax\n char v7; // dl\n\n v5 = a1; /*0xffe40d02*/\n v6 = NumberToString(a1, n10, n0xA, a4); /*0xffe40d08*/\n if ( a1 < v6 ) /*0xffe40d12*/\n {\n do /*0xffe40d20*/\n {\n v7 = *v5; /*0xffe40d16*/\n *v5++ = *v6; /*0xffe40d18*/\n *v6-- = v7; /*0xffe40d1b*/\n }\n while ( v5 < v6 ); /*0xffe40d20*/\n }\n return a1; /*0xffe40d24*/\n}","refs":[{"addr":"0xffe40c68","name":"NumberToString"}]} + n0xF4240 = 0; /*0xffe419c1*/ + if ( this && *this ) /*0xffe419c7*/ + { + while ( n0xF4240 < 0xF4240 ) /*0xffe419d0*/ + { + if ( !*(this + ++n0xF4240) ) /*0xffe419d3*/ + return n0xF4240; /*0xffe419d7*/ + } + return 1000001; /*0xffe419da*/ + } + return n0xF4240; /*0xffe419d9*/ +} -{"addr":"0xffe40d27","code":"unsigned int AsciiStrDecimalToUintn(char *a1, char **p_Status_Code:_%X)\n{\n char v2; // bl\n unsigned int n0x7FFFFFFF; // esi\n char n57; // al\n char n10; // al\n char v7; // [esp+Ch] [ebp-4h]\n\n v2 = 1; /*0xffe40d2d*/\n v7 = 0; /*0xffe40d31*/\n n0x7FFFFFFF = 0; /*0xffe40d35*/\n while ( *a1 == 32 || *a1 == 9 ) /*0xffe40d3f*/\n ++a1; /*0xffe40d41*/\n if ( !*a1 ) /*0xffe40d44*/\n {\n *p_Status_Code:_%X = a1; /*0xffe40d4a*/\n return 0; /*0xffe40d4e*/\n }\n if ( *a1 == 45 ) /*0xffe40d52*/\n {\n v2 = -1; /*0xffe40d54*/\n ++a1; /*0xffe40d57*/\n }\n if ( *a1 == 43 ) /*0xffe40d5b*/\n ++a1; /*0xffe40d5d*/\n while ( 1 ) /*0xffe40d64*/\n {\n n57 = *a1; /*0xffe40d64*/\n if ( *a1 >= 48 && n57 <= 57 ) /*0xffe40d6c*/\n {\n n10 = n57 - 48; /*0xffe40d6e*/\n goto LABEL_17; /*0xffe40d70*/\n }\n if ( (n57 & 0xDFu) < 0x41 || (n57 & 0xDFu) > 0x5A ) /*0xffe40d7f*/\n break; /*0xffe40d7f*/\n n10 = (n57 & 0xDF) - 55; /*0xffe40d83*/\nLABEL_17:\n if ( n10 >= 10 ) /*0xffe40d8b*/\n break; /*0xffe40d8b*/\n n0x7FFFFFFF = n10 + 10 *n0x7FFFFFFF; /*0xffe40d90*/\n if ( v2 == 1 ) /*0xffe40d95*/\n {\n if ( n0x7FFFFFFF < 0x80000000 ) /*0xffe40d99*/\n goto LABEL_23; /*0xffe40d99*/\n }\n else if ( n0x7FFFFFFF <= 0x80000000 ) /*0xffe40d9f*/\n {\n goto LABEL_23; /*0xffe40d9f*/\n }\n v7 = 1; /*0xffe40da1*/\nLABEL_23:\n ++a1; /*0xffe40da6*/\n }\n *p_Status_Code:_%X = a1; /*0xffe40da9*/\n if ( v7 ) /*0xffe40db0*/\n {\n n0x7FFFFFFF = 0x7FFFFFFF; /*0xffe40db2*/\n if ( v2 == -1 ) /*0xffe40dba*/\n n0x7FFFFFFF = 0x80000000; /*0xffe40dbc*/\n }\n return n0x7FFFFFFF *v2; /*0xffe40dc5*/\n}"} -{"addr":"0xffe40dca","code":"char *__thiscall AsciiStrToUpper(char *this)\n{\n char *i; // eax\n char n122; // dl\n\n for ( i = this; *i; ++i ) /*0xffe40dca*/\n {\n n122 = *i; /*0xffe40dd1*/\n if ( *i >= 97 && n122 <= 122 ) /*0xffe40ddb*/\n *i = n122 - 32; /*0xffe40de0*/\n }\n return this; /*0xffe40dea*/\n}"} +unsigned int __thiscall VideoAsciiStrLen(_BYTE *this) +{ + _BYTE *this_1; // esi + int ReportStatusCodePpi; // eax + unsigned int n0xF4240; // edi + int v4; // eax -{"addr":"0xffe40deb","code":"char *SPrintUnicodeFormat(int p_StatusText, char *Status_Code:_%X, ...)\n{\n va_list va; // [esp+Ch] [ebp+Ch] BYREF\n\n va_start(va, Status_Code:_%X);\n return (char *)SPrintAsciiFormatWorker(p_StatusText, 0, Status_Code:_%X, va); /*0xffe40e01*/\n}","refs":[{"addr":"0xffe40e84","name":"SPrintAsciiFormatWorker"}]} + this_1 = this; /*0xffe419e2*/ + if ( !this ) /*0xffe419ec*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe419ee*/ + if ( ReportStatusCodePpi ) /*0xffe419f5*/ + (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822044, 1082, (char *)-1822004); /*0xffe41a02*/ + } + n0xF4240 = 0; /*0xffe41a08*/ + while ( *this_1 ) /*0xffe41a33*/ + { + if ( n0xF4240 >= 0xF4240 ) /*0xffe41a12*/ + { + v4 = LocateReportStatusCodePpi(); /*0xffe41a14*/ + if ( v4 ) /*0xffe41a1b*/ + (*(void ( **)(char *, int, char *))(v4 + 4))((char *)-1822044, 1090, (char *)-1821980); /*0xffe41a28*/ + } + ++this_1; /*0xffe41a2e*/ + ++n0xF4240; /*0xffe41a2f*/ + } + return n0xF4240; /*0xffe41a37*/ +} -{"addr":"0xffe40e02","code":"char *EfiStatusToStr(int n2)\n{\n unsigned int n3; // edx\n\n if ( !n2 ) /*0xffe40e04*/\n return \"EFI_SUCCESS\"; /*0xffe40e0b*/\n if ( n2 < 0 ) /*0xffe40e0c*/\n {\n n3 = n2 & 0x1FFFFFFF; /*0xffe40e42*/\n if ( (n2 & 0xA0000000) == 0xA0000000 ) /*0xffe40e4b*/\n {\n if ( n3 >= 3 ) /*0xffe40e50*/\n return 0; /*0xffe40e50*/\n // \"EFI_INTERRUPT_PENDING\"\n return &MEMORY[0xFFE43964][25 *n3]; /*0xffe40e55*/\n }\n else if ( (n2 & 0xC0000000) == 0xC0000000 ) /*0xffe40e64*/\n {\n if ( n3 > 2 ) /*0xffe40e69*/\n return 0; /*0xffe40e69*/\n // \"ABLE_YET\"\n return &MEMORY[0xFFE439A3][25 *n3]; /*0xffe40e6e*/\n }\n else\n {\n if ( n3 > 0x1E ) /*0xffe40e78*/\n return 0; /*0xffe40e78*/\n // \"E_BOF\"\n return &MEMORY[0xFFE439DB][25 *n3]; /*0xffe40e7d*/\n }\n }\n else if ( (n2 & 0x20000000) != 0 ) /*0xffe40e14*/\n {\n if ( (unsigned int)n2 >= 2 ) /*0xffe40e19*/\n return 0; /*0xffe40e1d*/\n // \"EFI_WARN_INTERRUPT_SOURCE_PENDING\"\n return &MEMORY[0xFFE4391C][35 *n2]; /*0xffe40e21*/\n }\n else\n {\n if ( (unsigned int)n2 > 4 ) /*0xffe40e2a*/\n return 0; /*0xffe40e2a*/\n return (char *)&unk_FFE4389A + 26 *n2; /*0xffe40e2f*/\n }\n}","refs":[{"addr":"0xffe42f28","name":"aEfiSuccess","string":"EFI_SUCCESS"},{"addr":"0xffe4389a","name":"unk_FFE4389A"}]} -Output truncated. Run: curl -o .ida-mcp/f736ced0-db34-44d9-baad-5879d69018ff.json http://127.0.0.1:13392/output/f736ced0-db34-44d9-baad-5879d69018ff.json +int __thiscall PciCfgInit(void *This) +{ + unsigned __int8 PlatformId; // al + char *IoConfigTable; // esi + int IoTableCount; // edi + void *ConfigTable; // edx + char *v5; // esi + int n2; // edi + unsigned int Index; // edi + int PciAddr; // esi + void *This_1; // [esp-4h] [ebp-14h] + void *This_2; // [esp-4h] [ebp-14h] + int Data; // [esp+Ch] [ebp-4h] BYREF -{"addr":"0xffe411f9","code":"int SPrintAsciiFormat(int a1, int a2, int a3, ...)\n{\n va_list va; // [esp+14h] [ebp+14h] BYREF\n\n va_start(va, a3);\n return SPrintAsciiFormatWorker(a3, va); /*0xffe41215*/\n}","refs":[{"addr":"0xffe40e84","name":"SPrintAsciiFormatWorker"}]} + __outbyte(0x72u, 0x5Cu); /*0xffe41a6a*/ + PlatformId = __inbyte(0x73u); /*0xffe41a71*/ + if ( PlatformId == 33 ) /*0xffe41a74*/ + { + IoConfigTable = (char *)&unk_FFE43D6E; /*0xffe41a78*/ + IoTableCount = 3; /*0xffe41a7d*/ + do /*0xffe41a96*/ + { + IoReadEx((int)This, *((_WORD *)IoConfigTable - 1), *IoConfigTable, *(_DWORD *)(IoConfigTable + 2)); /*0xffe41a89*/ + IoConfigTable += 8; /*0xffe41a8e*/ + This = This_1; /*0xffe41a92*/ + --IoTableCount; /*0xffe41a93*/ + } + while ( IoTableCount ); /*0xffe41a96*/ + ConfigTable = &unk_FFE43D9C; /*0xffe41a98*/ + } + else + { + v5 = (char *)&unk_FFE43D8E; /*0xffe41aa1*/ + n2 = 2; /*0xffe41aa6*/ + do /*0xffe41abf*/ + { + IoReadEx((int)This, *((_WORD *)v5 - 1), *v5, *(_DWORD *)(v5 + 2)); /*0xffe41ab2*/ + v5 += 8; /*0xffe41ab7*/ + This = This_2; /*0xffe41abb*/ + --n2; /*0xffe41abc*/ + } + while ( n2 ); /*0xffe41abf*/ + ConfigTable = &unk_FFE43D3C; /*0xffe41ac1*/ + } + CopyMemWrapper((int)This, (int)ConfigTable); /*0xffe41ac7*/ + for ( Index = 0; Index < 18; Index += 3 ) /*0xffe41acf*/ + { + PciAddr = (unsigned __int8)byte_FFE43DCC[Index *4] | 0x1E6E2000; /*0xffe41adc*/ + PciCfgAddrWrite(PciAddr, &Data); /*0xffe41ae4*/ + Data = dword_FFE43DD4[Index] | Data & dword_FFE43DD0[Index]; /*0xffe41afb*/ + PciCfgWriteVerify(PciAddr, Data); /*0xffe41aff*/ + } + return 0; /*0xffe41b0c*/ +} -{"addr":"0xffe41217","code":"int SPrintGuidMarker(int n8, unsigned __int16 **p_i)\n{\n unsigned __int16 *i; // ecx\n int n4; // eax\n\n if ( !p_i ) /*0xffe41219*/\n return -2147483646; /*0xffe4121b*/\n i = *p_i; /*0xffe41221*/\n if ( **p_i == 0xFFFF ) /*0xffe4122c*/\n return -2147483634; /*0xffe41241*/\n while ( 1 ) /*0xffe41232*/\n {\n i = (unsigned __int16 *)((char *)i + i[1]); /*0xffe41232*/\n n4 = *i; /*0xffe41234*/\n if ( n4 == 4 ) /*0xffe4123a*/\n break; /*0xffe4123a*/\n if ( (_WORD)n4 == 0xFFFF ) /*0xffe4123f*/\n return -2147483634; /*0xffe4123f*/\n }\n *p_i = i; /*0xffe41248*/\n return 0; /*0xffe41220*/\n}"} -{"addr":"0xffe4124e","code":"int SPrintScanGuid(int n8, unsigned __int16 **p_i)\n{\n unsigned __int16 *i_1; // edi\n int v4; // eax\n int result; // eax\n int n8_2; // ecx\n int n8_1; // [esp-4h] [ebp-10h]\n unsigned __int16 *i; // [esp+8h] [ebp-4h] BYREF\n\n if ( !p_i ) /*0xffe41258*/\n return -2147483646; /*0xffe4128b*/\n i = *p_i; /*0xffe4125c*/\n while ( 1 ) /*0xffe4127a*/\n {\n result = SPrintGuidMarker(n8, &i); /*0xffe4127a*/\n if ( result < 0 ) /*0xffe41281*/\n break; /*0xffe41281*/\n i_1 = i; /*0xffe41261*/\n n8_1 = n8_2; /*0xffe41269*/\n v4 = StrnCmp((_BYTE *)i + 8, src); /*0xffe4126d*/\n n8 = n8_1; /*0xffe41272*/\n if ( !v4 ) /*0xffe41275*/\n {\n *p_i = i_1; /*0xffe41285*/\n return 0; /*0xffe41289*/\n }\n }\n return result; /*0xffe41290*/\n}","refs":[{"addr":"0xffe41217","name":"SPrintGuidMarker"},{"addr":"0xffe40c09","name":"StrnCmp"},{"addr":"0xffe4359c","name":"src"}]} +char PciCfgAddrWrite(int Address, int *DataOut) +{ + unsigned __int8 ConfigByte; // al + unsigned __int8 ConfigByte2; // al + unsigned __int8 DataByte0; // al + unsigned __int8 DataByte0_1; // ah + unsigned __int8 DataByte1; // al + unsigned __int8 DataByte1_1; // cl + unsigned __int8 DataByte2; // al + unsigned __int8 DataByte2_1; // bl + unsigned __int8 DataByte3; // al -{"addr":"0xffe41296","code":"int Udiv64Remainder(unsigned int _EDI, unsigned int *p_n0xA, int n0xA, int _EDX)\n{\n int n0xA_1; // eax\n int n64; // ecx\n\n n0xA_1 = n0xA; /*0xffe412a5*/\n _EDX = _EDX; /*0xffe412a8*/\n _EDI = 0; /*0xffe412ae*/\n n64 = 64; /*0xffe412b0*/\n do\n {\n __asm /*0xffe412b7*/\n {\n rcl edx, 1\n rcl edi, 1\n }\n n0xA_1 = 2 *n0xA_1 + (_EDI >= _EDI); /*0xffe412c0*/\n _EDI = _EDI - (_EDI >= _EDI ? _EDI : 0);\n --n64; /*0xffe412c6*/\n }\n while ( n64 );\n if ( p_n0xA ) /*0xffe412d9*/\n *p_n0xA = _EDI; /*0xffe412de*/\n return n0xA_1; /*0xffe412d4*/\n}"} + __outbyte(0x2Eu, 0xA5u); /*0xffe41b22*/ + __outbyte(0x2Eu, 0xA5u); /*0xffe41b23*/ + __outbyte(0x2Eu, 7u); /*0xffe41b26*/ + __outbyte(0x2Fu, 0xDu); /*0xffe41b2f*/ + __outbyte(0x2Eu, 0x30u); /*0xffe41b35*/ + ConfigByte = __inbyte(0x2Fu); /*0xffe41b39*/ + __outbyte(0x2Fu, ConfigByte | 1); /*0xffe41b3c*/ + __outbyte(0x2Eu, 0xF0u); /*0xffe41b42*/ + __outbyte(0x2Fu, HIBYTE(Address)); /*0xffe41b4b*/ + __outbyte(0x2Eu, 0xF1u); /*0xffe41b51*/ + __outbyte(0x2Fu, BYTE2(Address)); /*0xffe41b5a*/ + __outbyte(0x2Eu, 0xF2u); /*0xffe41b60*/ + __outbyte(0x2Fu, BYTE1(Address)); /*0xffe41b69*/ + __outbyte(0x2Eu, 0xF3u); /*0xffe41b6f*/ + __outbyte(0x2Fu, Address); /*0xffe41b75*/ + __outbyte(0x2Eu, 0xF8u); /*0xffe41b7b*/ + ConfigByte2 = __inbyte(0x2Fu); /*0xffe41b7f*/ + __outbyte(0x2Fu, ConfigByte2 & 0xFC | 2); /*0xffe41b84*/ + __outbyte(0x2Eu, 0xFEu); /*0xffe41b8a*/ + __inbyte(0x2Fu); /*0xffe41b8e*/ + __outbyte(0x2Eu, 0xF4u); /*0xffe41b94*/ + DataByte0 = __inbyte(0x2Fu); /*0xffe41b98*/ + DataByte0_1 = DataByte0; /*0xffe41b99*/ + __outbyte(0x2Eu, 0xF5u); /*0xffe41ba0*/ + DataByte1 = __inbyte(0x2Fu); /*0xffe41ba4*/ + DataByte1_1 = DataByte1; /*0xffe41ba5*/ + __outbyte(0x2Eu, 0xF6u); /*0xffe41bac*/ + DataByte2 = __inbyte(0x2Fu); /*0xffe41bb0*/ + DataByte2_1 = DataByte2; /*0xffe41bb1*/ + __outbyte(0x2Eu, 0xF7u); /*0xffe41bb8*/ + DataByte3 = __inbyte(0x2Fu); /*0xffe41bbc*/ + *DataOut = DataByte3 | ((DataByte2_1 | ((DataByte1_1 | (DataByte0_1 << 8)) << 8)) << 8); /*0xffe41bd8*/ + __outbyte(0x2Eu, 0xAAu); /*0xffe41bdf*/ + return -86; /*0xffe41be0*/ +} -{"addr":"0xffe412ea","code":"unsigned int TimerDelayLoop(unsigned int a1)\n{\n unsigned int v1; // esi\n unsigned int n0x400000; // edi\n unsigned __int32 v3; // ebx\n unsigned int result; // eax\n\n v1 = a1 >> 22; /*0xffe412f7*/\n n0x400000 = a1 & 0x3FFFFF; /*0xffe412fa*/\n do /*0xffe41332*/\n {\n v3 = n0x400000 + (IoPortRead32(0x508u) & 0xFFFFFF); /*0xffe4130f*/\n n0x400000 = 0x400000; /*0xffe41311*/\n while ( ((v3 - IoPortRead32(0x508u)) & 0x800000) == 0 ) /*0xffe4132b*/\n _mm_pause(); /*0xffe41318*/\n result = v1--; /*0xffe4132d*/\n }\n while ( result ); /*0xffe41332*/\n return result; /*0xffe41334*/\n}","refs":[{"addr":"0xffe41795","name":"IoPortRead32"}]} -{"addr":"0xffe41339","code":"unsigned int __thiscall TimerDelay(unsigned int n100000)\n{\n unsigned __int64 v2; // rtt\n\n LODWORD(v2) = 3579545 *n100000; /*0xffe4136f*/\n HIDWORD(v2) = ((3579545 * (unsigned __int64)n100000) >> 32) % 0xF4240; /*0xffe4136f*/\n TimerDelayLoop(v2 / 0xF4240); /*0xffe41374*/\n return n100000; /*0xffe4137b*/\n}","refs":[{"addr":"0xffe412ea","name":"TimerDelayLoop"}]} +char PciCfgWriteVerify(int Address, int Data) +{ + unsigned __int8 ConfigByte; // al + unsigned __int8 ConfigByte2; // al -{"addr":"0xffe41380","code":"int ComPortGetBase()\n{\n unsigned __int8 n33; // al\n\n __outbyte(0x72u, 0x5Cu); /*0xffe4138a*/\n n33 = __inbyte(0x73u); /*0xffe41391*/\n return n33 != 33 ? 1016 : 760;\n}"} + __outbyte(0x2Eu, 0xA5u); /*0xffe41bf2*/ + __outbyte(0x2Eu, 0xA5u); /*0xffe41bf3*/ + __outbyte(0x2Eu, 7u); /*0xffe41bf6*/ + __outbyte(0x2Fu, 0xDu); /*0xffe41bff*/ + __outbyte(0x2Eu, 0x30u); /*0xffe41c05*/ + ConfigByte = __inbyte(0x2Fu); /*0xffe41c09*/ + __outbyte(0x2Fu, ConfigByte | 1); /*0xffe41c0c*/ + __outbyte(0x2Eu, 0xF0u); /*0xffe41c12*/ + __outbyte(0x2Fu, HIBYTE(Address)); /*0xffe41c1b*/ + __outbyte(0x2Eu, 0xF1u); /*0xffe41c21*/ + __outbyte(0x2Fu, BYTE2(Address)); /*0xffe41c2a*/ + __outbyte(0x2Eu, 0xF2u); /*0xffe41c30*/ + __outbyte(0x2Fu, BYTE1(Address)); /*0xffe41c39*/ + __outbyte(0x2Eu, 0xF3u); /*0xffe41c3f*/ + __outbyte(0x2Fu, Address); /*0xffe41c45*/ + __outbyte(0x2Eu, 0xF4u); /*0xffe41c4b*/ + __outbyte(0x2Fu, HIBYTE(Data)); /*0xffe41c54*/ + __outbyte(0x2Eu, 0xF5u); /*0xffe41c5a*/ + __outbyte(0x2Fu, BYTE2(Data)); /*0xffe41c63*/ + __outbyte(0x2Eu, 0xF6u); /*0xffe41c69*/ + __outbyte(0x2Fu, BYTE1(Data)); /*0xffe41c72*/ + __outbyte(0x2Eu, 0xF7u); /*0xffe41c78*/ + __outbyte(0x2Fu, Data); /*0xffe41c7e*/ + __outbyte(0x2Eu, 0xF8u); /*0xffe41c84*/ + ConfigByte2 = __inbyte(0x2Fu); /*0xffe41c88*/ + __outbyte(0x2Fu, ConfigByte2 & 0xFC | 2); /*0xffe41c8d*/ + __outbyte(0x2Eu, 0xFEu); /*0xffe41c93*/ + __outbyte(0x2Fu, 0xCFu); /*0xffe41c99*/ + __outbyte(0x2Eu, 0xAAu); /*0xffe41c9f*/ + return -86; /*0xffe41ca0*/ +} -{"addr":"0xffe413a5","code":"int __thiscall ComPortInitialize(void *this)\n{\n int result; // eax\n unsigned __int8 v2; // al\n unsigned int n115200; // ecx\n unsigned int v4; // ebx\n int Base; // eax\n unsigned __int16 Base_1; // di\n unsigned __int16 v7; // bp\n unsigned __int8 v8; // al\n unsigned __int8 v9; // cl\n unsigned __int8 v10; // al\n unsigned __int8 v11; // al\n int v12; // esi\n unsigned __int8 v13; // al\n int v14; // esi\n unsigned __int8 v15; // al\n unsigned __int8 v16; // al\n\n result = PciCfgInit((unsigned int)this); /*0xffe413a6*/\n if ( result >= 0 )\n {\n __outbyte(0x72u, 0x5Cu); /*0xffe413bc*/\n __inbyte(0x73u); /*0xffe413c3*/\n __outbyte(0x72u, 0x6Cu); /*0xffe413c9*/\n v2 = __inbyte(0x73u); /*0xffe413cd*/\n switch ( v2 )\n {\n case 0xA7:\n n115200 = 115200; /*0xffe413d7*/\n break;\n case 0xA6:\n n115200 = 57600; /*0xffe413df*/\n break;\n case 0xA5:\n n115200 = 38400; /*0xffe413ea*/\n break;\n case 0xA4:\n n115200 = 19200; /*0xffe413f5*/\n break;\n default:\n n115200 = v2 != 0xA3 ? 115200 : 9600;\n break;\n }\n v4 = 0x1C200 / n115200; /*0xffe41414*/\n Base = ComPortGetBase(); /*0xffe41416*/\n Base_1 = Base; /*0xffe4141b*/\n if ( Base ) /*0xffe4141f*/\n {\n v7 = Base + 3; /*0xffe41429*/\n v8 = __inbyte(Base + 3); /*0xffe4142f*/\n v9 = v8; /*0xffe41430*/\n v10 = __inbyte(Base_1 + 3); /*0xffe41432*/\n __outbyte(Base_1 + 3, v10 | 0x80); /*0xffe41435*/\n v11 = __inbyte(Base_1 + 1); /*0xffe41439*/\n v12 = v11 << 8; /*0xffe4143d*/\n v13 = __inbyte(Base_1); /*0xffe41443*/\n v14 = v13 | v12; /*0xffe41447*/\n v15 = __inbyte(Base_1 + 3); /*0xffe4144c*/\n __outbyte(Base_1 + 3, v15 & 0x7F); /*0xffe4144f*/\n if ( (((v9 & 0x3F) == 3) & (unsigned __int8)((v14 != v4) - 1)) == 0 ) /*0xffe41462*/\n {\n do /*0xffe4146f*/\n v16 = __inbyte(Base_1 + 5); /*0xffe4146a*/\n while ( (v16 & 0x60) != 0x60 ); /*0xffe4146f*/\n __outbyte(v7, 0x80u); /*0xffe41476*/\n __outbyte(Base_1 + 1, BYTE1(v4)); /*0xffe4147f*/\n __outbyte(Base_1, v4); /*0xffe41485*/\n __outbyte(v7, 3u); /*0xffe4148b*/\n __outbyte(Base_1 + 2, 0); /*0xffe41494*/\n __outbyte(Base_1 + 2, 1u); /*0xffe41497*/\n __outbyte(Base_1 + 4, 0); /*0xffe414a0*/\n }\n return 0; /*0xffe414a1*/\n }\n else\n {\n return -2147483641; /*0xffe41421*/\n }\n }\n return result; /*0xffe414a8*/\n}","refs":[{"addr":"0xffe41a58","name":"PciCfgInit"},{"addr":"0xffe41380","name":"ComPortGetBase"}]} -{"addr":"0xffe414a9","code":"int ComPortPollLsrTx(char *_r_n, int n2)\n{\n unsigned __int8 *_r_n_1; // ebp\n int n0xFFFF; // esi\n int Base; // eax\n unsigned __int16 Base_1; // cx\n unsigned __int16 v8; // cx\n unsigned __int8 v9; // al\n int v10; // ebx\n unsigned __int8 v11; // al\n unsigned int n0x10; // ebx\n int n2_1; // [esp+Ch] [ebp-4h]\n\n _r_n_1 = (unsigned __int8 *)_r_n; /*0xffe414ac*/\n n0xFFFF = 0; /*0xffe414ae*/\n if ( !_r_n ) /*0xffe414b5*/\n return 0; /*0xffe414b5*/\n Base = ComPortGetBase(); /*0xffe414bb*/\n Base_1 = Base; /*0xffe414c0*/\n if ( !Base ) /*0xffe414c4*/\n return 0; /*0xffe414b9*/\n if ( !n2 ) /*0xffe414c8*/\n {\n v8 = Base + 5; /*0xffe414ca*/\n do /*0xffe414de*/\n {\n v9 = __inbyte(v8); /*0xffe414d0*/\n if ( (v9 & 0x60) == 0x60 ) /*0xffe414d5*/\n break; /*0xffe414d5*/\n ++n0xFFFF; /*0xffe414d7*/\n }\n while ( n0xFFFF != 0xFFFF ); /*0xffe414de*/\n return 0; /*0xffe414de*/\n }\n n2_1 = n2; /*0xffe414e2*/\nLABEL_10:\n v10 = 0; /*0xffe414e7*/\n while ( 1 ) /*0xffe414ef*/\n {\n v11 = __inbyte(Base_1 + 5); /*0xffe414ef*/\n if ( (v11 & 0x40) != 0 ) /*0xffe414f2*/\n break; /*0xffe414f2*/\n if ( ++v10 == 0xFFFF ) /*0xffe414fb*/\n return 0; /*0xffe414ff*/\n }\n n0x10 = 0; /*0xffe41501*/\n while ( n2 ) /*0xffe41505*/\n {\n __outbyte(Base_1, *_r_n_1); /*0xffe4150d*/\n ++n0x10; /*0xffe4150e*/\n --n2; /*0xffe4150f*/\n ++_r_n_1; /*0xffe41510*/\n if ( n0x10 >= 0x10 ) /*0xffe41514*/\n {\n if ( n2 ) /*0xffe41518*/\n goto LABEL_10; /*0xffe41518*/\n return n2_1; /*0xffe41518*/\n }\n }\n return n2_1; /*0xffe4151f*/\n}","refs":[{"addr":"0xffe41380","name":"ComPortGetBase"}]} +void VideoScrollBackground(unsigned __int8 StartRow, unsigned __int8 StartRow_1) +{ + int FbSize; // edi + int FbBase; // esi + _WORD *FbInfo; // eax + int RowOffset; // edx + int WidthPixels; // ebx + int CurrentPtr; // edx + int LineDistance; // ecx + int NextLineBase; // ebp + int RowCount; // eax + unsigned int WidthPixels_3; // esi + unsigned int WidthPixels_2; // eax + int PixelPtr; // ecx + int FbDelta; // ebx + int WidthPixels_1; // [esp+8h] [ebp-Ch] + int n68; // [esp+Ch] [ebp-8h] + int LineDistance_1; // [esp+10h] [ebp-4h] -{"addr":"0xffe41524","code":"unsigned __int8 ComPortSetBaud(unsigned int n209304, unsigned int n40000)\n{\n __int16 v2; // cx\n unsigned __int8 v3; // al\n unsigned __int8 v4; // al\n unsigned __int8 result; // al\n\n v2 = ((n209304 >> 1) + 119318200) / n209304; /*0xffe41536*/\n __outbyte(0x43u, 0x54u); /*0xffe41541*/\n __outbyte(0x41u, 0x12u); /*0xffe4154a*/\n __outbyte(0x43u, 0xB6u); /*0xffe41550*/\n __outbyte(0x42u, v2); /*0xffe41559*/\n __outbyte(0x42u, HIBYTE(v2)); /*0xffe4155f*/\n v3 = __inbyte(0x61u); /*0xffe41566*/\n __outbyte(0x61u, v3 | 3); /*0xffe41569*/\n TimerDelay(n40000); /*0xffe4156c*/\n v4 = __inbyte(0x61u); /*0xffe41574*/\n result = v4 & 0xFC; /*0xffe41575*/\n __outbyte(0x61u, result); /*0xffe41577*/\n return result; /*0xffe41578*/\n}","refs":[{"addr":"0xffe41339","name":"TimerDelay"}]} + FbSize = 0; /*0xffe41cad*/ + if ( StartRow <= StartRow_1 ) /*0xffe41cb1*/ + { + FbBase = -1879048192; /*0xffe41cbe*/ + FbInfo = FindGuidInPpiList(byte_FFE4355C); /*0xffe41cc3*/ + if ( FbInfo && *((_BYTE *)FbInfo + 24) && (*((_DWORD *)FbInfo + 14) || *((_DWORD *)FbInfo + 15)) ) /*0xffe41cd7*/ + { + FbSize = *((_DWORD *)FbInfo + 14); /*0xffe41cdc*/ + FbBase = *((_DWORD *)FbInfo + 10); /*0xffe41cdf*/ + } + RowOffset = 12 *StartRow; /*0xffe41ce5*/ + WidthPixels = 3 * (StartRow_1 - StartRow + 1); /*0xffe41cf0*/ + CurrentPtr = FbBase + RowOffset + 690728; /*0xffe41cf9*/ + LineDistance = FbSize - FbBase; /*0xffe41cfb*/ + LineDistance_1 = FbSize - FbBase; /*0xffe41cff*/ + NextLineBase = FbSize - FbBase; /*0xffe41d03*/ + RowCount = 68; /*0xffe41d07*/ + WidthPixels_1 = WidthPixels; /*0xffe41d08*/ + n68 = 68; /*0xffe41d0c*/ + do /*0xffe41d7c*/ + { + if ( FbSize ) /*0xffe41d12*/ + NextLineBase = LineDistance + CurrentPtr; /*0xffe41d14*/ + WidthPixels_3 = 0; /*0xffe41d17*/ + if ( WidthPixels ) /*0xffe41d1b*/ + { + WidthPixels_2 = WidthPixels_1; /*0xffe41d1d*/ + PixelPtr = CurrentPtr + 1; /*0xffe41d21*/ + FbDelta = NextLineBase - CurrentPtr; /*0xffe41d26*/ + do /*0xffe41d61*/ + { + if ( *(_BYTE *)(PixelPtr + 1) > 0x91u && *(_BYTE *)PixelPtr > 0x91u && *(_BYTE *)(PixelPtr - 1) > 0x91u ) /*0xffe41d37*/ + { + *(_WORD *)PixelPtr = -13120; /*0xffe41d39*/ + *(_BYTE *)(PixelPtr - 1) = 10; /*0xffe41d3e*/ + if ( FbSize ) /*0xffe41d44*/ + { + *(_BYTE *)(FbDelta + PixelPtr + 1) = -52; /*0xffe41d46*/ + *(_BYTE *)(FbDelta + PixelPtr) = *(_BYTE *)PixelPtr; /*0xffe41d4d*/ + *(_BYTE *)(NextLineBase + 4 *WidthPixels_3) = *(_BYTE *)(PixelPtr - 1); /*0xffe41d53*/ + WidthPixels_2 = WidthPixels_1; /*0xffe41d57*/ + } + } + ++WidthPixels_3; /*0xffe41d5b*/ + PixelPtr += 4; /*0xffe41d5c*/ + } + while ( WidthPixels_3 < WidthPixels_2 ); /*0xffe41d61*/ + RowCount = n68; /*0xffe41d63*/ + WidthPixels = WidthPixels_1; /*0xffe41d67*/ + LineDistance = LineDistance_1; /*0xffe41d6b*/ + } + CurrentPtr += 4096; /*0xffe41d6f*/ + n68 = --RowCount; /*0xffe41d78*/ + } + while ( RowCount ); /*0xffe41d7c*/ + } +} -{"addr":"0xffe4157c","code":"char __thiscall ProgressDisplay10(char *_10%)\n{\n int v2; // [esp-Ch] [ebp-5Ch]\n int v3; // [esp-8h] [ebp-58h]\n char v4; // [esp-4h] [ebp-54h]\n int v5[20]; // [esp+0h] [ebp-50h] BYREF\n\n SPrintUnicodeFormat((int)v5, \"== Progress : %s ==\", _10%);\n return VideoDisplayProgress(9u, 0, 7, (int)v5, v2, v3, v4, v5[0]); /*0xffe415a3*/\n}","refs":[{"addr":"0xffe40deb","name":"SPrintUnicodeFormat"},{"addr":"0xffe42f40","name":"Status_Code:_%X","string":"== Progress : %s =="},{"addr":"0xffe41d86","name":"VideoDisplayProgress"}]} -{"addr":"0xffe415a7","code":"void ProgressStatusCodeHandler(int PeiServices, unsigned __int8 StatusCode)\n{\n int StatusText; // [esp+8h] [ebp-50h] BYREF\n\n SPrintUnicodeFormat((int)&StatusText, \"Status Code: %X\", StatusCode);\n VideoDisplayProgress(0x18u, 0x3Eu, 7, &StatusText); /*0xffe415ce*/\n DebugPrint(64, \"Status Code: %X\\n\", StatusCode);\n switch ( StatusCode )\n {\n case 0x11u:\n ProgressDisplay10(\" 10%\"); /*0xffe416b5*/\n VideoScrollBackground(0, 5u); /*0xffe416be*/\n VideoDisplayProgress(0xBu, 0, 14, \"UPI initialization: Starting...\");\n break;\n case 0x19u:\n ProgressDisplay10(\" 20%\"); /*0xffe4167d*/\n VideoScrollBackground(5u, 0xAu); /*0xffe41686*/\n VideoDisplayProgress(0xBu, 0, 7, \"UPI initialization: Done \");\n VideoDisplayProgress(0xCu, 0, 14, \"Basic IO initialization: Starting... \");\n break;\n case 0x2Fu:\n ProgressDisplay10(\" 30%\"); /*0xffe41651*/\n VideoScrollBackground(0xAu, 0xFu); /*0xffe4165a*/\n VideoDisplayProgress(0xCu, 0, 7, \"Basic IO initialization: Done \");\n VideoDisplayProgress(0xDu, 0, 14, \"Memory initialization: Starting... \");\n break;\n case 0x33u:\n ProgressDisplay10(\" 40%\"); /*0xffe41639*/\n VideoScrollBackground(0xFu, 0x14u); /*0xffe41642*/\n break;\n case 0x4Fu:\n ProgressDisplay10(\" 50%\"); /*0xffe4160d*/\n VideoScrollBackground(0xFu, 0x19u); /*0xffe41616*/\n VideoDisplayProgress(0xDu, 0, 7, \"Memory initialization: Done \");\n VideoDisplayProgress(0xEu, 0, 14, \"UEFI kernel initialization: Starting... \");\n break;\n }\n}","refs":[{"addr":"0xffe40deb","name":"SPrintUnicodeFormat"},{"addr":"0xffe41d86","name":"VideoDisplayProgress"},{"addr":"0xffe3fd7c","name":"DebugPrint"},{"addr":"0xffe4157c","name":"ProgressDisplay10"},{"addr":"0xffe41ca4","name":"VideoScrollBackground"}]} +char VideoDisplayProgress(unsigned __int8 a1, unsigned __int8 a2, char a3, _BYTE *a4) +{ + unsigned int i_1; // ebp + _BYTE *v7; // esi + char n32; // al + unsigned int i; // ecx -{"addr":"0xffe416db","code":"char IoOr32()\n{\n __int16 v0; // kr00_2\n unsigned int v1; // esi\n unsigned __int8 v2; // al\n char v3; // bl\n __int16 v5; // [esp+10h] [ebp-4h]\n\n v0 = __readeflags(); /*0xffe416e0*/\n v5 = v0; /*0xffe416e2*/\n _disable(); /*0xffe416e6*/\n v1 = IoPortRead32(0xCF8u); /*0xffe416fa*/\n IoPortWrite32(0xCF8u, 0x8000FA44); /*0xffe416fc*/\n v2 = __inbyte(0xCFCu); /*0xffe41707*/\n v3 = v2 | 0x80; /*0xffe4170a*/\n __outbyte(0xCFCu, v2 | 0x80); /*0xffe4170f*/\n IoPortWrite32(0xCF8u, v1); /*0xffe41714*/\n if ( (v5 & 0x200) != 0 ) /*0xffe41722*/\n _enable(); /*0xffe41724*/\n else\n _disable(); /*0xffe41727*/\n return v3; /*0xffe41728*/\n}","refs":[{"addr":"0xffe41795","name":"IoPortRead32"},{"addr":"0xffe417c1","name":"IoPortWrite32"}]} + i_1 = VideoAsciiStrLen(a4); /*0xffe41d9c*/ + v7 = (_BYTE *)(2 * (a2 + 80 *a1) + 753664); /*0xffe41da6*/ + n32 = 32; /*0xffe41dad*/ + __outbyte(0x3D4u, 0xAu); /*0xffe41db7*/ + __outbyte(0x3D5u, 0x20u); /*0xffe41dbf*/ + for ( i = 0; i < i_1; *(v7 - 1) = a3 ) /*0xffe41dc4*/ + { + n32 = a4[i++]; /*0xffe41dca*/ + *v7 = n32; /*0xffe41dce*/ + v7 += 2; /*0xffe41dd0*/ + } + return n32; /*0xffe41dda*/ +} -{"addr":"0xffe41730","code":"int IoPortRead16(unsigned __int16 a1)\n{\n int ReportStatusCodePpi; // eax\n int result; // eax\n\n if ( (a1 & 1) != 0 ) /*0xffe41736*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41738*/\n if ( ReportStatusCodePpi ) /*0xffe4173f*/\n (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822440, 133, (char *)-1822456); /*0xffe41750*/\n }\n LOWORD(result) = __inword(a1); /*0xffe41759*/\n return (unsigned __int16)result; /*0xffe4175e*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} -{"addr":"0xffe41760","code":"unsigned __int16 IoPortWrite16(unsigned __int16 a1, unsigned __int16 n1280)\n{\n int ReportStatusCodePpi; // eax\n\n if ( (a1 & 1) != 0 ) /*0xffe4176a*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4176c*/\n if ( ReportStatusCodePpi ) /*0xffe41773*/\n (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822440, 163, (char *)-1822456); /*0xffe41784*/\n }\n __outword(a1, n1280); /*0xffe41790*/\n return n1280; /*0xffe41792*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} +unsigned __int8 __thiscall MmioRead32(unsigned int n1024068) +{ + int ReportStatusCodePpi; // eax + __int16 v3; // kr00_2 + unsigned int v4; // esi + unsigned __int8 v5; // al + unsigned __int8 v6; // bl + __int16 v8; // [esp+10h] [ebp-4h] -{"addr":"0xffe41795","code":"unsigned __int32 IoPortRead32(unsigned __int16 a1)\n{\n int ReportStatusCodePpi; // eax\n\n if ( (a1 & 3) != 0 ) /*0xffe4179b*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4179d*/\n if ( ReportStatusCodePpi ) /*0xffe417a4*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe417b5*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLibMsc.c\",\n 193,\n \"(Port & 3) == 0\");\n }\n return __indword(a1); /*0xffe417bf*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} + if ( (n1024068 & 0xF0000F00) != 0 ) /*0xffe41dec*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41dee*/ + if ( ReportStatusCodePpi ) /*0xffe41df5*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41e03*/ + "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c", + 121, + "((Address) & (~0xffff0ff | (0))) == 0"); + } + v3 = __readeflags(); /*0xffe41e09*/ + v8 = v3; /*0xffe41e0b*/ + _disable(); /*0xffe41e0f*/ + v4 = IoPortRead32(0xCF8u); /*0xffe41e2f*/ + IoPortWrite32(0xCF8u, n1024068 & 0xFC | (n1024068 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41e3b*/ + v5 = __inbyte((n1024068 & 3) + 3324); /*0xffe41e49*/ + v6 = v5; /*0xffe41e4a*/ + IoPortWrite32(0xCF8u, v4); /*0xffe41e50*/ + if ( (v8 & 0x200) != 0 ) /*0xffe41e5e*/ + _enable(); /*0xffe41e60*/ + else + _disable(); /*0xffe41e63*/ + return v6; /*0xffe41e64*/ +} -{"addr":"0xffe417c1","code":"unsigned int IoPortWrite32(unsigned __int16 a1, unsigned int a2)\n{\n int ReportStatusCodePpi; // eax\n\n if ( (a1 & 3) != 0 ) /*0xffe417ca*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe417cc*/\n if ( ReportStatusCodePpi ) /*0xffe417d3*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe417e4*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLibMsc.c\",\n 223,\n \"(Port & 3) == 0\");\n }\n __outdword(a1, a2); /*0xffe417ef*/\n return a2; /*0xffe417f0*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} -{"addr":"0xffe417f3","code":"__int16 IoPortWrite8(_WORD *a1, __int16 n1280)\n{\n int ReportStatusCodePpi; // eax\n\n if ( ((unsigned __int8)a1 & 1) != 0 ) /*0xffe417fd*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe417ff*/\n if ( ReportStatusCodePpi ) /*0xffe41806*/\n (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822372, 183, (char *)-1822324); /*0xffe41817*/\n }\n *a1 = n1280; /*0xffe4181d*/\n return n1280; /*0xffe41823*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} +__int16 __thiscall MmioRead16(unsigned int n1015936) +{ + int ReportStatusCodePpi; // eax + __int16 v3; // kr00_2 + unsigned int v4; // esi + __int16 v5; // di + __int16 v7; // [esp+Ch] [ebp-4h] -{"addr":"0xffe41826","code":"int DebugEnabled()\n{\n unsigned __int8 v0; // al\n char n3; // al\n char n3_1; // cl\n\n v0 = __inbyte(0x70u); /*0xffe4182c*/\n __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe41831*/\n n3 = __inbyte(0x71u); /*0xffe41838*/\n n3_1 = n3; /*0xffe41839*/\n if ( (unsigned __int8)n3 <= 3u ) /*0xffe4183e*/\n {\nLABEL_4:\n if ( !n3_1 ) /*0xffe41859*/\n return 0; /*0xffe41859*/\n goto LABEL_5; /*0xffe41859*/\n }\n n3_1 = n3; /*0xffe41840*/\n if ( !n3 ) /*0xffe41848*/\n {\n n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe41854*/\n goto LABEL_4; /*0xffe41854*/\n }\nLABEL_5:\n if ( n3_1 != -1 )\n return n3_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe41871*/\n}","refs":[{"addr":"0xffe43e28","name":"n3"}]} + if ( (n1015936 & 0xF0000F01) != 0 ) /*0xffe41e7b*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41e7d*/ + if ( ReportStatusCodePpi ) /*0xffe41e84*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41e95*/ + "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c", + 613, + "((Address) & (~0xffff0ff | (1))) == 0"); + } + v3 = __readeflags(); /*0xffe41e9b*/ + v7 = v3; /*0xffe41e9d*/ + _disable(); /*0xffe41ea0*/ + v4 = IoPortRead32(0xCF8u); /*0xffe41ec0*/ + IoPortWrite32(0xCF8u, n1015936 & 0xFC | (n1015936 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41ecc*/ + v5 = IoPortRead16((n1015936 & 2) + 3324); /*0xffe41ee1*/ + IoPortWrite32(0xCF8u, v4); /*0xffe41ee6*/ + if ( (v7 & 0x200) != 0 ) /*0xffe41ef3*/ + _enable(); /*0xffe41ef5*/ + else + _disable(); /*0xffe41ef8*/ + return v5; /*0xffe41efc*/ +} -{"addr":"0xffe41875","code":"bool GuidCompare(char *this, int a2)\n{\n __int64 v4; // rax\n int v5; // ebp\n __int64 v6; // rax\n int v7; // edi\n __int64 v8; // kr00_8\n __int64 v9; // rax\n int v11; // [esp+10h] [ebp-Ch]\n int v12; // [esp+14h] [ebp-8h]\n\n v4 = GuidCopy(this); /*0xffe41880*/\n v12 = HIDWORD(v4); /*0xffe41887*/\n v5 = v4; /*0xffe4188b*/\n v6 = GuidCopy((void *)a2); /*0xffe4188d*/\n v11 = HIDWORD(v6); /*0xffe41895*/\n v7 = v6; /*0xffe41899*/\n v8 = GuidCopy(this + 8); /*0xffe418a7*/\n v9 = GuidCopy((void *)(a2 + 8)); /*0xffe418a9*/\n return v5 == v7 && v12 == v11 && v8 == v9; /*0xffe418cc*/\n}","refs":[{"addr":"0xffe41947","name":"GuidCopy"}]} -{"addr":"0xffe418d4","code":"void *__thiscall PeiServicesGetTss(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe418da*/\n CpuDeadLoop((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, \"Idtr != ((void *) 0)\"); /*0xffe418e9*/\n this_1 = this; /*0xffe418ef*/\n __sidt(this); /*0xffe418f2*/\n return this_1; /*0xffe418f6*/\n}","refs":[{"addr":"0xffe3fda6","name":"CpuDeadLoop"}]} +unsigned __int16 MmioWrite32(unsigned int n1024064, unsigned __int16 n1280) +{ + int ReportStatusCodePpi; // eax + __int16 v5; // kr00_2 + unsigned int v6; // esi + unsigned __int16 v7; // di + __int16 v9; // [esp+10h] [ebp-4h] -{"addr":"0xffe418f7","code":"__int16 __thiscall PciReadBuffer(void *this)\n{\n int ReportStatusCodePpi; // eax\n\n if ( !this ) /*0xffe418fc*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe418fe*/\n if ( ReportStatusCodePpi ) /*0xffe41905*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41913*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 38,\n \"Buffer != ((void *) 0)\");\n }\n return *(_WORD *)this; /*0xffe4191c*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe4288c","name":"aBufferVoid0_0","string":"Buffer != ((void *) 0)"}]} + if ( (n1024064 & 0xF0000F01) != 0 ) /*0xffe41f12*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41f14*/ + if ( ReportStatusCodePpi ) /*0xffe41f1b*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41f2c*/ + "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c", + 652, + "((Address) & (~0xffff0ff | (1))) == 0"); + } + v5 = __readeflags(); /*0xffe41f32*/ + v9 = v5; /*0xffe41f34*/ + _disable(); /*0xffe41f38*/ + v6 = IoPortRead32(0xCF8u); /*0xffe41f58*/ + IoPortWrite32(0xCF8u, n1024064 & 0xFC | (n1024064 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41f64*/ + v7 = IoPortWrite16((n1024064 & 2) + 3324, n1280); /*0xffe41f7b*/ + IoPortWrite32(0xCF8u, v6); /*0xffe41f80*/ + if ( (v9 & 0x200) != 0 ) /*0xffe41f8e*/ + _enable(); /*0xffe41f90*/ + else + _disable(); /*0xffe41f93*/ + return v7; /*0xffe41f97*/ +} -{"addr":"0xffe4191e","code":"int __thiscall PciWriteBuffer(void *this)\n{\n int ReportStatusCodePpi; // eax\n\n if ( !this ) /*0xffe41923*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41925*/\n if ( ReportStatusCodePpi ) /*0xffe4192c*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe4193d*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 141,\n \"Buffer != ((void *) 0)\");\n }\n return *(_DWORD *)this; /*0xffe41945*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe4288c","name":"aBufferVoid0_0","string":"Buffer != ((void *) 0)"}]} -{"addr":"0xffe41947","code":"__int64 __thiscall GuidCopy(void *this)\n{\n int ReportStatusCodePpi; // eax\n\n if ( !this ) /*0xffe4194c*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4194e*/\n if ( ReportStatusCodePpi ) /*0xffe41955*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41966*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 192,\n \"Buffer != ((void *) 0)\");\n }\n return *(_QWORD *)this; /*0xffe41971*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe4288c","name":"aBufferVoid0_0","string":"Buffer != ((void *) 0)"}]} +unsigned __int32 IoRead32(unsigned int a1) +{ + int ReportStatusCodePpi; // eax + __int16 v3; // kr00_2 + unsigned int v4; // esi + unsigned __int32 v5; // edi + __int16 v7; // [esp+Ch] [ebp-4h] -{"addr":"0xffe41973","code":"unsigned int PciCf8Write(_WORD *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n)\n{\n int ReportStatusCodePpi; // eax\n unsigned int n0xF4240; // eax\n\n if ( ((unsigned __int8)ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n & 1) != 0 ) /*0xffe41979*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4197b*/\n if ( ReportStatusCodePpi ) /*0xffe41982*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41993*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 128,\n \"((UINTN) String & 0x00000001) == 0\");\n }\n if ( !ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n ) /*0xffe4199b*/\n return 0; /*0xffe419bd*/\n n0xF4240 = 0; /*0xffe4199f*/\n if ( *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n ) /*0xffe419a1*/\n {\n while ( n0xF4240 < 0xF4240 ) /*0xffe419ab*/\n {\n if ( !ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n[++n0xF4240] ) /*0xffe419ae*/\n return n0xF4240; /*0xffe419b2*/\n }\n return 1000001; /*0xffe419b6*/\n }\n return n0xF4240; /*0xffe419b4*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} + if ( (a1 & 0xF0000F03) != 0 ) /*0xffe41fac*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41fae*/ + if ( ReportStatusCodePpi ) /*0xffe41fb5*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41fc6*/ + "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c", + 1114, + "((Address) & (~0xffff0ff | (3))) == 0"); + } + v3 = __readeflags(); /*0xffe41fcc*/ + v7 = v3; /*0xffe41fce*/ + _disable(); /*0xffe41fd1*/ + v4 = IoPortRead32(0xCF8u); /*0xffe41ff1*/ + IoPortWrite32(0xCF8u, a1 & 0xFC | (a1 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41ffb*/ + v5 = IoPortRead32(0xCFCu); /*0xffe4200c*/ + IoPortWrite32(0xCF8u, v4); /*0xffe4200e*/ + if ( (v7 & 0x200) != 0 ) /*0xffe4201b*/ + _enable(); /*0xffe4201d*/ + else + _disable(); /*0xffe42020*/ + return v5; /*0xffe42023*/ +} -{"addr":"0xffe419c1","code":"unsigned int __thiscall PciCf8Modify(_BYTE *this)\n{\n unsigned int n0xF4240; // eax\n\n n0xF4240 = 0; /*0xffe419c1*/\n if ( this && *this ) /*0xffe419c7*/\n {\n while ( n0xF4240 < 0xF4240 ) /*0xffe419d0*/\n {\n if ( !*(this + ++n0xF4240) ) /*0xffe419d3*/\n return n0xF4240; /*0xffe419d7*/\n }\n return 1000001; /*0xffe419da*/\n }\n return n0xF4240; /*0xffe419d9*/\n}"} -{"addr":"0xffe419e0","code":"unsigned int __thiscall VideoAsciiStrLen(_BYTE *this)\n{\n _BYTE *this_1; // esi\n int ReportStatusCodePpi; // eax\n unsigned int n0xF4240; // edi\n int v4; // eax\n\n this_1 = this; /*0xffe419e2*/\n if ( !this ) /*0xffe419ec*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe419ee*/\n if ( ReportStatusCodePpi ) /*0xffe419f5*/\n (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822044, 1082, (char *)-1822004); /*0xffe41a02*/\n }\n n0xF4240 = 0; /*0xffe41a08*/\n while ( *this_1 ) /*0xffe41a33*/\n {\n if ( n0xF4240 >= 0xF4240 ) /*0xffe41a12*/\n {\n v4 = LocateReportStatusCodePpi(); /*0xffe41a14*/\n if ( v4 ) /*0xffe41a1b*/\n (*(void ( **)(char *, int, char *))(v4 + 4))((char *)-1822044, 1090, (char *)-1821980); /*0xffe41a28*/\n }\n ++this_1; /*0xffe41a2e*/\n ++n0xF4240; /*0xffe41a2f*/\n }\n return n0xF4240; /*0xffe41a37*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"}]} +unsigned int IoAnd32(unsigned int a1, unsigned int OrMask) +{ + int ReportStatusCodePpi; // eax + __int16 v5; // kr00_2 + unsigned int v6; // esi + unsigned int v7; // edi + __int16 v9; // [esp+10h] [ebp-4h] -{"addr":"0xffe41a58","code":"int __thiscall PciCfgInit(void *This)\n{\n unsigned __int8 PlatformId; // al\n char *IoConfigTable; // esi\n int IoTableCount; // edi\n void *ConfigTable; // edx\n char *v5; // esi\n int n2; // edi\n unsigned int Index; // edi\n int PciAddr; // esi\n void *This_1; // [esp-4h] [ebp-14h]\n void *This_2; // [esp-4h] [ebp-14h]\n int Data; // [esp+Ch] [ebp-4h] BYREF\n\n __outbyte(0x72u, 0x5Cu); /*0xffe41a6a*/\n PlatformId = __inbyte(0x73u); /*0xffe41a71*/\n if ( PlatformId == 33 ) /*0xffe41a74*/\n {\n IoConfigTable = (char *)&unk_FFE43D6E; /*0xffe41a78*/\n IoTableCount = 3; /*0xffe41a7d*/\n do /*0xffe41a96*/\n {\n IoReadEx((int)This, *((_WORD *)IoConfigTable - 1), *IoConfigTable, *(_DWORD *)(IoConfigTable + 2)); /*0xffe41a89*/\n IoConfigTable += 8; /*0xffe41a8e*/\n This = This_1; /*0xffe41a92*/\n --IoTableCount; /*0xffe41a93*/\n }\n while ( IoTableCount ); /*0xffe41a96*/\n ConfigTable = &unk_FFE43D9C; /*0xffe41a98*/\n }\n else\n {\n v5 = (char *)&unk_FFE43D8E; /*0xffe41aa1*/\n n2 = 2; /*0xffe41aa6*/\n do /*0xffe41abf*/\n {\n IoReadEx((int)This, *((_WORD *)v5 - 1), *v5, *(_DWORD *)(v5 + 2)); /*0xffe41ab2*/\n v5 += 8; /*0xffe41ab7*/\n This = This_2; /*0xffe41abb*/\n --n2; /*0xffe41abc*/\n }\n while ( n2 ); /*0xffe41abf*/\n ConfigTable = &unk_FFE43D3C; /*0xffe41ac1*/\n }\n CopyMemWrapper((int)This, (int)ConfigTable); /*0xffe41ac7*/\n for ( Index = 0; Index < 18; Index += 3 ) /*0xffe41acf*/\n {\n PciAddr = (unsigned __int8)byte_FFE43DCC[Index *4] | 0x1E6E2000; /*0xffe41adc*/\n PciCfgAddrWrite(PciAddr, &Data); /*0xffe41ae4*/\n Data = dword_FFE43DD4[Index] | Data & dword_FFE43DD0[Index]; /*0xffe41afb*/\n PciCfgWriteVerify(PciAddr, Data); /*0xffe41aff*/\n }\n return 0; /*0xffe41b0c*/\n}","refs":[{"addr":"0xffe43d6e","name":"unk_FFE43D6E"},{"addr":"0xffe42188","name":"IoReadEx"},{"addr":"0xffe43d9c","name":"unk_FFE43D9C"},{"addr":"0xffe43d8e","name":"unk_FFE43D8E"},{"addr":"0xffe43d3c","name":"unk_FFE43D3C"},{"addr":"0xffe42422","name":"CopyMemWrapper"},{"addr":"0xffe43dcc","name":"byte_FFE43DCC"},{"addr":"0xffe41b14","name":"PciCfgAddrWrite"},{"addr":"0xffe43dd4","name":"dword_FFE43DD4"},{"addr":"0xffe43dd0","name":"dword_FFE43DD0"},{"addr":"0xffe41be5","name":"PciCfgWriteVerify"}]} + if ( (a1 & 0xF0000F03) != 0 ) /*0xffe42039*/ + { + ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4203b*/ + if ( ReportStatusCodePpi ) /*0xffe42042*/ + (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe42053*/ + "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c", + 1153, + "((Address) & (~0xffff0ff | (3))) == 0"); + } + v5 = __readeflags(); /*0xffe42059*/ + v9 = v5; /*0xffe4205b*/ + _disable(); /*0xffe4205f*/ + v6 = IoPortRead32(0xCF8u); /*0xffe4207f*/ + IoPortWrite32(0xCF8u, a1 & 0xFC | (a1 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe42089*/ + v7 = IoPortWrite32(0xCFCu, OrMask); /*0xffe4209c*/ + IoPortWrite32(0xCF8u, v6); /*0xffe4209e*/ + if ( (v9 & 0x200) != 0 ) /*0xffe420ac*/ + _enable(); /*0xffe420ae*/ + else + _disable(); /*0xffe420b1*/ + return v7; /*0xffe420b4*/ +} -{"addr":"0xffe41b14","code":"char PciCfgAddrWrite(int Address, int *DataOut)\n{\n unsigned __int8 ConfigByte; // al\n unsigned __int8 ConfigByte2; // al\n unsigned __int8 DataByte0; // al\n unsigned __int8 DataByte0_1; // ah\n unsigned __int8 DataByte1; // al\n unsigned __int8 DataByte1_1; // cl\n unsigned __int8 DataByte2; // al\n unsigned __int8 DataByte2_1; // bl\n unsigned __int8 DataByte3; // al\n\n __outbyte(0x2Eu, 0xA5u); /*0xffe41b22*/\n __outbyte(0x2Eu, 0xA5u); /*0xffe41b23*/\n __outbyte(0x2Eu, 7u); /*0xffe41b26*/\n __outbyte(0x2Fu, 0xDu); /*0xffe41b2f*/\n __outbyte(0x2Eu, 0x30u); /*0xffe41b35*/\n ConfigByte = __inbyte(0x2Fu); /*0xffe41b39*/\n __outbyte(0x2Fu, ConfigByte | 1); /*0xffe41b3c*/\n __outbyte(0x2Eu, 0xF0u); /*0xffe41b42*/\n __outbyte(0x2Fu, HIBYTE(Address)); /*0xffe41b4b*/\n __outbyte(0x2Eu, 0xF1u); /*0xffe41b51*/\n __outbyte(0x2Fu, BYTE2(Address)); /*0xffe41b5a*/\n __outbyte(0x2Eu, 0xF2u); /*0xffe41b60*/\n __outbyte(0x2Fu, BYTE1(Address)); /*0xffe41b69*/\n __outbyte(0x2Eu, 0xF3u); /*0xffe41b6f*/\n __outbyte(0x2Fu, Address); /*0xffe41b75*/\n __outbyte(0x2Eu, 0xF8u); /*0xffe41b7b*/\n ConfigByte2 = __inbyte(0x2Fu); /*0xffe41b7f*/\n __outbyte(0x2Fu, ConfigByte2 & 0xFC | 2); /*0xffe41b84*/\n __outbyte(0x2Eu, 0xFEu); /*0xffe41b8a*/\n __inbyte(0x2Fu); /*0xffe41b8e*/\n __outbyte(0x2Eu, 0xF4u); /*0xffe41b94*/\n DataByte0 = __inbyte(0x2Fu); /*0xffe41b98*/\n DataByte0_1 = DataByte0; /*0xffe41b99*/\n __outbyte(0x2Eu, 0xF5u); /*0xffe41ba0*/\n DataByte1 = __inbyte(0x2Fu); /*0xffe41ba4*/\n DataByte1_1 = DataByte1; /*0xffe41ba5*/\n __outbyte(0x2Eu, 0xF6u); /*0xffe41bac*/\n DataByte2 = __inbyte(0x2Fu); /*0xffe41bb0*/\n DataByte2_1 = DataByte2; /*0xffe41bb1*/\n __outbyte(0x2Eu, 0xF7u); /*0xffe41bb8*/\n DataByte3 = __inbyte(0x2Fu); /*0xffe41bbc*/\n *DataOut = DataByte3 | ((DataByte2_1 | ((DataByte1_1 | (DataByte0_1 << 8)) << 8)) << 8); /*0xffe41bd8*/\n __outbyte(0x2Eu, 0xAAu); /*0xffe41bdf*/\n return -86; /*0xffe41be0*/\n}"} -{"addr":"0xffe41be5","code":"char PciCfgWriteVerify(int Address, int Data)\n{\n unsigned __int8 ConfigByte; // al\n unsigned __int8 ConfigByte2; // al\n\n __outbyte(0x2Eu, 0xA5u); /*0xffe41bf2*/\n __outbyte(0x2Eu, 0xA5u); /*0xffe41bf3*/\n __outbyte(0x2Eu, 7u); /*0xffe41bf6*/\n __outbyte(0x2Fu, 0xDu); /*0xffe41bff*/\n __outbyte(0x2Eu, 0x30u); /*0xffe41c05*/\n ConfigByte = __inbyte(0x2Fu); /*0xffe41c09*/\n __outbyte(0x2Fu, ConfigByte | 1); /*0xffe41c0c*/\n __outbyte(0x2Eu, 0xF0u); /*0xffe41c12*/\n __outbyte(0x2Fu, HIBYTE(Address)); /*0xffe41c1b*/\n __outbyte(0x2Eu, 0xF1u); /*0xffe41c21*/\n __outbyte(0x2Fu, BYTE2(Address)); /*0xffe41c2a*/\n __outbyte(0x2Eu, 0xF2u); /*0xffe41c30*/\n __outbyte(0x2Fu, BYTE1(Address)); /*0xffe41c39*/\n __outbyte(0x2Eu, 0xF3u); /*0xffe41c3f*/\n __outbyte(0x2Fu, Address); /*0xffe41c45*/\n __outbyte(0x2Eu, 0xF4u); /*0xffe41c4b*/\n __outbyte(0x2Fu, HIBYTE(Data)); /*0xffe41c54*/\n __outbyte(0x2Eu, 0xF5u); /*0xffe41c5a*/\n __outbyte(0x2Fu, BYTE2(Data)); /*0xffe41c63*/\n __outbyte(0x2Eu, 0xF6u); /*0xffe41c69*/\n __outbyte(0x2Fu, BYTE1(Data)); /*0xffe41c72*/\n __outbyte(0x2Eu, 0xF7u); /*0xffe41c78*/\n __outbyte(0x2Fu, Data); /*0xffe41c7e*/\n __outbyte(0x2Eu, 0xF8u); /*0xffe41c84*/\n ConfigByte2 = __inbyte(0x2Fu); /*0xffe41c88*/\n __outbyte(0x2Fu, ConfigByte2 & 0xFC | 2); /*0xffe41c8d*/\n __outbyte(0x2Eu, 0xFEu); /*0xffe41c93*/\n __outbyte(0x2Fu, 0xCFu); /*0xffe41c99*/\n __outbyte(0x2Eu, 0xAAu); /*0xffe41c9f*/\n return -86; /*0xffe41ca0*/\n}"} +int IoOr32Ex(int PciHandle, __int16 RegMask) +{ + unsigned __int8 ShiftCount; // bl + unsigned __int16 SlotIndex; // di + __int16 SlotValue; // ax + unsigned __int16 Temp; // cx + unsigned __int8 BitCount; // al + unsigned __int16 n4; // cx + unsigned int OrMask; // esi -{"addr":"0xffe41ca4","code":"void VideoScrollBackground(unsigned __int8 StartRow, unsigned __int8 StartRow_1)\n{\n int FbSize; // edi\n int FbBase; // esi\n _WORD *FbInfo; // eax\n int RowOffset; // edx\n int WidthPixels; // ebx\n int CurrentPtr; // edx\n int LineDistance; // ecx\n int NextLineBase; // ebp\n int RowCount; // eax\n unsigned int WidthPixels_3; // esi\n unsigned int WidthPixels_2; // eax\n int PixelPtr; // ecx\n int FbDelta; // ebx\n int WidthPixels_1; // [esp+8h] [ebp-Ch]\n int n68; // [esp+Ch] [ebp-8h]\n int LineDistance_1; // [esp+10h] [ebp-4h]\n\n FbSize = 0; /*0xffe41cad*/\n if ( StartRow <= StartRow_1 ) /*0xffe41cb1*/\n {\n FbBase = -1879048192; /*0xffe41cbe*/\n FbInfo = FindGuidInPpiList(byte_FFE4355C); /*0xffe41cc3*/\n if ( FbInfo && *((_BYTE *)FbInfo + 24) && (*((_DWORD *)FbInfo + 14) || *((_DWORD *)FbInfo + 15)) ) /*0xffe41cd7*/\n {\n FbSize = *((_DWORD *)FbInfo + 14); /*0xffe41cdc*/\n FbBase = *((_DWORD *)FbInfo + 10); /*0xffe41cdf*/\n }\n RowOffset = 12 *StartRow; /*0xffe41ce5*/\n WidthPixels = 3 * (StartRow_1 - StartRow + 1); /*0xffe41cf0*/\n CurrentPtr = FbBase + RowOffset + 690728; /*0xffe41cf9*/\n LineDistance = FbSize - FbBase; /*0xffe41cfb*/\n LineDistance_1 = FbSize - FbBase; /*0xffe41cff*/\n NextLineBase = FbSize - FbBase; /*0xffe41d03*/\n RowCount = 68; /*0xffe41d07*/\n WidthPixels_1 = WidthPixels; /*0xffe41d08*/\n n68 = 68; /*0xffe41d0c*/\n do /*0xffe41d7c*/\n {\n if ( FbSize ) /*0xffe41d12*/\n NextLineBase = LineDistance + CurrentPtr; /*0xffe41d14*/\n WidthPixels_3 = 0; /*0xffe41d17*/\n if ( WidthPixels ) /*0xffe41d1b*/\n {\n WidthPixels_2 = WidthPixels_1; /*0xffe41d1d*/\n PixelPtr = CurrentPtr + 1; /*0xffe41d21*/\n FbDelta = NextLineBase - CurrentPtr; /*0xffe41d26*/\n do /*0xffe41d61*/\n {\n if ( *(_BYTE *)(PixelPtr + 1) > 0x91u && *(_BYTE *)PixelPtr > 0x91u && *(_BYTE *)(PixelPtr - 1) > 0x91u ) /*0xffe41d37*/\n {\n *(_WORD *)PixelPtr = -13120; /*0xffe41d39*/\n *(_BYTE *)(PixelPtr - 1) = 10; /*0xffe41d3e*/\n if ( FbSize ) /*0xffe41d44*/\n {\n *(_BYTE *)(FbDelta + PixelPtr + 1) = -52; /*0xffe41d46*/\n *(_BYTE *)(FbDelta + PixelPtr) = *(_BYTE *)PixelPtr; /*0xffe41d4d*/\n *(_BYTE *)(NextLineBase + 4 *WidthPixels_3) = *(_BYTE *)(PixelPtr - 1); /*0xffe41d53*/\n WidthPixels_2 = WidthPixels_1; /*0xffe41d57*/\n }\n }\n ++WidthPixels_3; /*0xffe41d5b*/\n PixelPtr += 4; /*0xffe41d5c*/\n }\n while ( WidthPixels_3 < WidthPixels_2 ); /*0xffe41d61*/\n RowCount = n68; /*0xffe41d63*/\n WidthPixels = WidthPixels_1; /*0xffe41d67*/\n LineDistance = LineDistance_1; /*0xffe41d6b*/\n }\n CurrentPtr += 4096; /*0xffe41d6f*/\n n68 = --RowCount; /*0xffe41d78*/\n }\n while ( RowCount ); /*0xffe41d7c*/\n }\n}","refs":[{"addr":"0xffe40bcf","name":"FindGuidInPpiList"},{"addr":"0xffe4355c","name":"byte_FFE4355C"}]} + ShiftCount = 0; /*0xffe420c7*/ + for ( SlotIndex = 0; SlotIndex < 4u; ++SlotIndex ) /*0xffe420c9*/ + { + SlotValue = IoRead32(4 *SlotIndex + 1015940); /*0xffe420d6*/ + if ( (SlotValue & 1) == 0 ) /*0xffe420dd*/ + break; /*0xffe420dd*/ + if ( (SlotValue & 0xFFFC) == RegMask ) /*0xffe420e7*/ + break; /*0xffe420e7*/ + } + if ( SlotIndex == 4 ) /*0xffe420f2*/ + return -2147483639; /*0xffe420f4*/ + Temp = 4; /*0xffe42102*/ + BitCount = 0; /*0xffe42105*/ + do /*0xffe42114*/ + { + Temp >>= 1; /*0xffe42107*/ + ++BitCount; /*0xffe4210a*/ + } + while ( (Temp & 1) == 0 ); /*0xffe42114*/ + n4 = 4; /*0xffe4211a*/ + do /*0xffe42122*/ + { + ++ShiftCount; /*0xffe4211d*/ + n4 >>= 1; /*0xffe4211f*/ + } + while ( n4 ); /*0xffe42122*/ + if ( BitCount == ShiftCount - 1 ) /*0xffe4212d*/ + --ShiftCount; /*0xffe4212f*/ + OrMask = ((((1 << ShiftCount) - 1) & 0xFFFC) << 16) | (unsigned __int16)(RegMask & ~((1 << ShiftCount) - 1)) | 1; /*0xffe4215c*/ + IoAnd32(4 *SlotIndex + 1015940, OrMask); /*0xffe42168*/ + *(_DWORD *)((unsigned __int16)(4 *SlotIndex + 10032) | 0xFDEF0000) = OrMask; /*0xffe4217c*/ + return 0; /*0xffe42180*/ +} -{"addr":"0xffe41d86","code":"char VideoDisplayProgress(unsigned __int8 a1, unsigned __int8 a2, char a3, _BYTE *a4)\n{\n unsigned int i_1; // ebp\n _BYTE *v7; // esi\n char n32; // al\n unsigned int i; // ecx\n\n i_1 = VideoAsciiStrLen(a4); /*0xffe41d9c*/\n v7 = (_BYTE *)(2 * (a2 + 80 *a1) + 753664); /*0xffe41da6*/\n n32 = 32; /*0xffe41dad*/\n __outbyte(0x3D4u, 0xAu); /*0xffe41db7*/\n __outbyte(0x3D5u, 0x20u); /*0xffe41dbf*/\n for ( i = 0; i < i_1; *(v7 - 1) = a3 ) /*0xffe41dc4*/\n {\n n32 = a4[i++]; /*0xffe41dca*/\n *v7 = n32; /*0xffe41dce*/\n v7 += 2; /*0xffe41dd0*/\n }\n return n32; /*0xffe41dda*/\n}","refs":[{"addr":"0xffe419e0","name":"VideoAsciiStrLen"}]} -{"addr":"0xffe41ddf","code":"unsigned __int8 __thiscall MmioRead32(unsigned int n1024068)\n{\n int ReportStatusCodePpi; // eax\n __int16 v3; // kr00_2\n unsigned int v4; // esi\n unsigned __int8 v5; // al\n unsigned __int8 v6; // bl\n __int16 v8; // [esp+10h] [ebp-4h]\n\n if ( (n1024068 & 0xF0000F00) != 0 ) /*0xffe41dec*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41dee*/\n if ( ReportStatusCodePpi ) /*0xffe41df5*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41e03*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BasePciCf8Lib\\\\PciCf8Lib.c\",\n 121,\n \"((Address) & (~0xffff0ff | (0))) == 0\");\n }\n v3 = __readeflags(); /*0xffe41e09*/\n v8 = v3; /*0xffe41e0b*/\n _disable(); /*0xffe41e0f*/\n v4 = IoPortRead32(0xCF8u); /*0xffe41e2f*/\n IoPortWrite32(0xCF8u, n1024068 & 0xFC | (n1024068 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41e3b*/\n v5 = __inbyte((n1024068 & 3) + 3324); /*0xffe41e49*/\n v6 = v5; /*0xffe41e4a*/\n IoPortWrite32(0xCF8u, v4); /*0xffe41e50*/\n if ( (v8 & 0x200) != 0 ) /*0xffe41e5e*/\n _enable(); /*0xffe41e60*/\n else\n _disable(); /*0xffe41e63*/\n return v6; /*0xffe41e64*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe41795","name":"IoPortRead32"},{"addr":"0xffe417c1","name":"IoPortWrite32"}]} +int IoReadEx(int PciHandle, __int16 Register, char SubFunction, int Width) +{ + __int16 MaskLow; // bx + __int16 MaskHigh; // bp + __int16 WidthMask; // si + __int16 DefaultValue; // di + unsigned __int8 Index; // cl + __int16 SearchReg; // ax + __int16 MaskLow_2; // ax + unsigned __int8 MaskLow_1; // cl + __int16 n1016; // ax + unsigned __int8 v14; // cl + __int16 n1008; // ax + __int16 AccessWidth; // [esp-4h] [ebp-40h] + int n57672688; // [esp+14h] [ebp-28h] + __int16 v18; // [esp+18h] [ebp-24h] + _DWORD v19[2]; // [esp+1Ch] [ebp-20h] + _DWORD v20[5]; // [esp+24h] [ebp-18h] + __int16 v21; // [esp+38h] [ebp-4h] + __int16 n5; // [esp+44h] [ebp+8h] + __int16 ConfigLow; // [esp+44h] [ebp+8h] -{"addr":"0xffe41e6c","code":"__int16 __thiscall MmioRead16(unsigned int n1015936)\n{\n int ReportStatusCodePpi; // eax\n __int16 v3; // kr00_2\n unsigned int v4; // esi\n __int16 v5; // di\n __int16 v7; // [esp+Ch] [ebp-4h]\n\n if ( (n1015936 & 0xF0000F01) != 0 ) /*0xffe41e7b*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41e7d*/\n if ( ReportStatusCodePpi ) /*0xffe41e84*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41e95*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BasePciCf8Lib\\\\PciCf8Lib.c\",\n 613,\n \"((Address) & (~0xffff0ff | (1))) == 0\");\n }\n v3 = __readeflags(); /*0xffe41e9b*/\n v7 = v3; /*0xffe41e9d*/\n _disable(); /*0xffe41ea0*/\n v4 = IoPortRead32(0xCF8u); /*0xffe41ec0*/\n IoPortWrite32(0xCF8u, n1015936 & 0xFC | (n1015936 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41ecc*/\n v5 = IoPortRead16((n1015936 & 2) + 3324); /*0xffe41ee1*/\n IoPortWrite32(0xCF8u, v4); /*0xffe41ee6*/\n if ( (v7 & 0x200) != 0 ) /*0xffe41ef3*/\n _enable(); /*0xffe41ef5*/\n else\n _disable(); /*0xffe41ef8*/\n return v5; /*0xffe41efc*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe41795","name":"IoPortRead32"},{"addr":"0xffe417c1","name":"IoPortWrite32"},{"addr":"0xffe41730","name":"IoPortRead16"}]} + v20[0] = 49808376; /*0xffe4218e*/ + v21 = 0; /*0xffe42198*/ + MaskLow = 0; /*0xffe4219d*/ + v18 = 0; /*0xffe4219f*/ + MaskHigh = -1; /*0xffe421a4*/ + WidthMask = 0; /*0xffe421ad*/ + v20[1] = 36176416; /*0xffe421af*/ + v20[2] = 48759352; /*0xffe421b7*/ + v20[3] = 65536824; /*0xffe421bf*/ + v20[4] = 48235248; /*0xffe421c7*/ + v19[0] = 41419640; /*0xffe421cf*/ + v19[1] = 956; /*0xffe421d7*/ + n57672688 = 57672688; /*0xffe421df*/ + DefaultValue = -1; /*0xffe421e8*/ + if ( Width == 1 ) /*0xffe421ed*/ + { + if ( !Register ) /*0xffe42378*/ + { + DefaultValue = -9; /*0xffe4237a*/ + goto LABEL_47; /*0xffe4237f*/ + } + v14 = 0; /*0xffe42381*/ + n1008 = 1008; /*0xffe42383*/ + do /*0xffe4239a*/ + { + if ( n1008 == Register ) /*0xffe4238b*/ + break; /*0xffe4238b*/ + n1008 = *((_WORD *)&n57672688 + ++v14); /*0xffe42392*/ + } + while ( n1008 ); /*0xffe4239a*/ + if ( !*((_WORD *)&n57672688 + v14) ) /*0xffe423a4*/ + return -2147483645; /*0xffe423a4*/ + MaskHigh = -4097; /*0xffe423ad*/ + AccessWidth = 8; /*0xffe423b2*/ + MaskLow_2 = v14 << 12; /*0xffe423b4*/ + goto LABEL_46; /*0xffe423b4*/ + } + if ( Width <= 1 ) /*0xffe421f3*/ + return -2147483645; /*0xffe421f3*/ + if ( Width <= 5 ) + { + DefaultValue = Register == 0 ? -1025 : -1; + WidthMask = Register != 0 ? 0x400 : 0; + goto LABEL_47; /*0xffe42373*/ + } + switch ( Width ) /*0xffe42205*/ + { + case 6: /*0xffe42205*/ + if ( !Register ) /*0xffe422eb*/ + { + DefaultValue = (SubFunction == 0) - 3; /*0xffe422fb*/ + goto LABEL_47; /*0xffe422fe*/ + } + MaskLow_1 = 0; /*0xffe42303*/ + n1016 = 1016; /*0xffe42305*/ + do /*0xffe4231c*/ + { + if ( n1016 == Register ) /*0xffe4230d*/ + break; /*0xffe4230d*/ + n1016 = *((_WORD *)v20 + ++MaskLow_1); /*0xffe42314*/ + } + while ( n1016 ); /*0xffe4231c*/ + if ( !*((_WORD *)v20 + MaskLow_1) ) /*0xffe42326*/ + return -2147483645; /*0xffe42326*/ + if ( !SubFunction ) /*0xffe42330*/ + { + MaskLow = MaskLow_1; /*0xffe42344*/ + WidthMask = 1; /*0xffe42347*/ + MaskHigh = -8; /*0xffe42348*/ + goto LABEL_47; /*0xffe4234d*/ + } + MaskHigh = -113; /*0xffe42335*/ + AccessWidth = 2; /*0xffe4233a*/ + MaskLow_2 = 16 *MaskLow_1; /*0xffe4233c*/ + goto LABEL_46; /*0xffe42340*/ + case 7: /*0xffe42205*/ + if ( !Register ) /*0xffe422a4*/ + { + DefaultValue = -5; /*0xffe422a6*/ + goto LABEL_47; /*0xffe422ab*/ + } + Index = 0; /*0xffe422b0*/ + SearchReg = 888; /*0xffe422b2*/ + do /*0xffe422c9*/ + { + if ( SearchReg == Register ) /*0xffe422ba*/ + break; /*0xffe422ba*/ + SearchReg = *((_WORD *)v19 + ++Index); /*0xffe422c1*/ + } + while ( SearchReg ); /*0xffe422c9*/ + if ( !*((_WORD *)v19 + Index) ) /*0xffe422d3*/ + return -2147483645; /*0xffe422d3*/ + MaskHigh = -769; /*0xffe422d8*/ + AccessWidth = 4; /*0xffe422dd*/ + MaskLow_2 = Index << 8; /*0xffe422df*/ +LABEL_46: + WidthMask = AccessWidth; /*0xffe423b8*/ + MaskLow = MaskLow_2; /*0xffe423b9*/ + goto LABEL_47; /*0xffe423b9*/ + case 8: /*0xffe42205*/ + if ( !Register ) /*0xffe42266*/ + { + DefaultValue = -769; /*0xffe42268*/ + goto LABEL_47; /*0xffe4226d*/ + } + WidthMask = 512; /*0xffe42272*/ + if ( Register == 512 ) /*0xffe4227a*/ + { + WidthMask = 256; /*0xffe4227c*/ + goto LABEL_47; /*0xffe42281*/ + } + if ( Register == 520 ) /*0xffe4228e*/ + goto LABEL_47; /*0xffe4228e*/ + return -2147483645; /*0xffe4228e*/ + } + if ( Width != 255 ) /*0xffe4221e*/ + return -2147483645; /*0xffe4221e*/ + if ( Register != 46 ) /*0xffe42224*/ + { + if ( Register == 78 ) /*0xffe42234*/ + { + WidthMask = 0x2000; /*0xffe42236*/ + goto LABEL_47; /*0xffe4223b*/ + } + if ( Register == 98 ) /*0xffe42244*/ + { + WidthMask = 2048; /*0xffe42246*/ + goto LABEL_47; /*0xffe4224b*/ + } + if ( Register ) /*0xffe42253*/ + { + IoOr32Ex(PciHandle, Register); /*0xffe42257*/ + goto LABEL_47; /*0xffe4225e*/ + } + return -2147483645; /*0xffe422a0*/ + } + WidthMask = 4096; /*0xffe42226*/ +LABEL_47: + n5 = MaskLow | MaskHigh & MmioRead16(0xF8080u); /*0xffe423bc*/ + MmioWrite32(0xF8080u, n5); /*0xffe423d9*/ + IoPortWrite8((_WORD *)0xFDEF2770, n5); /*0xffe423e7*/ + ConfigLow = WidthMask | DefaultValue & MmioRead16(0xF8082u); /*0xffe42404*/ + MmioWrite32(0xF8082u, ConfigLow); /*0xffe42408*/ + IoPortWrite8((_WORD *)0xFDEF2774, ConfigLow); /*0xffe42416*/ + return 0; /*0xffe42299*/ +} -{"addr":"0xffe41f03","code":"unsigned __int16 MmioWrite32(unsigned int n1024064, unsigned __int16 n1280)\n{\n int ReportStatusCodePpi; // eax\n __int16 v5; // kr00_2\n unsigned int v6; // esi\n unsigned __int16 v7; // di\n __int16 v9; // [esp+10h] [ebp-4h]\n\n if ( (n1024064 & 0xF0000F01) != 0 ) /*0xffe41f12*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41f14*/\n if ( ReportStatusCodePpi ) /*0xffe41f1b*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41f2c*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BasePciCf8Lib\\\\PciCf8Lib.c\",\n 652,\n \"((Address) & (~0xffff0ff | (1))) == 0\");\n }\n v5 = __readeflags(); /*0xffe41f32*/\n v9 = v5; /*0xffe41f34*/\n _disable(); /*0xffe41f38*/\n v6 = IoPortRead32(0xCF8u); /*0xffe41f58*/\n IoPortWrite32(0xCF8u, n1024064 & 0xFC | (n1024064 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41f64*/\n v7 = IoPortWrite16((n1024064 & 2) + 3324, n1280); /*0xffe41f7b*/\n IoPortWrite32(0xCF8u, v6); /*0xffe41f80*/\n if ( (v9 & 0x200) != 0 ) /*0xffe41f8e*/\n _enable(); /*0xffe41f90*/\n else\n _disable(); /*0xffe41f93*/\n return v7; /*0xffe41f97*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe41795","name":"IoPortRead32"},{"addr":"0xffe417c1","name":"IoPortWrite32"},{"addr":"0xffe41760","name":"IoPortWrite16"}]} -{"addr":"0xffe41f9d","code":"unsigned __int32 IoRead32(unsigned int a1)\n{\n int ReportStatusCodePpi; // eax\n __int16 v3; // kr00_2\n unsigned int v4; // esi\n unsigned __int32 v5; // edi\n __int16 v7; // [esp+Ch] [ebp-4h]\n\n if ( (a1 & 0xF0000F03) != 0 ) /*0xffe41fac*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41fae*/\n if ( ReportStatusCodePpi ) /*0xffe41fb5*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41fc6*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BasePciCf8Lib\\\\PciCf8Lib.c\",\n 1114,\n \"((Address) & (~0xffff0ff | (3))) == 0\");\n }\n v3 = __readeflags(); /*0xffe41fcc*/\n v7 = v3; /*0xffe41fce*/\n _disable(); /*0xffe41fd1*/\n v4 = IoPortRead32(0xCF8u); /*0xffe41ff1*/\n IoPortWrite32(0xCF8u, a1 & 0xFC | (a1 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41ffb*/\n v5 = IoPortRead32(0xCFCu); /*0xffe4200c*/\n IoPortWrite32(0xCF8u, v4); /*0xffe4200e*/\n if ( (v7 & 0x200) != 0 ) /*0xffe4201b*/\n _enable(); /*0xffe4201d*/\n else\n _disable(); /*0xffe42020*/\n return v5; /*0xffe42023*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe41795","name":"IoPortRead32"},{"addr":"0xffe417c1","name":"IoPortWrite32"}]} +unsigned __int8 CopyMemWrapper(int This, int ConfigTable) +{ + unsigned __int8 *v2; // esi + int n11; // edi + unsigned __int8 v4; // bl + unsigned __int8 v5; // al + unsigned __int8 result; // al -{"addr":"0xffe4202a","code":"unsigned int IoAnd32(unsigned int a1, unsigned int OrMask)\n{\n int ReportStatusCodePpi; // eax\n __int16 v5; // kr00_2\n unsigned int v6; // esi\n unsigned int v7; // edi\n __int16 v9; // [esp+10h] [ebp-4h]\n\n if ( (a1 & 0xF0000F03) != 0 ) /*0xffe42039*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4203b*/\n if ( ReportStatusCodePpi ) /*0xffe42042*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe42053*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BasePciCf8Lib\\\\PciCf8Lib.c\",\n 1153,\n \"((Address) & (~0xffff0ff | (3))) == 0\");\n }\n v5 = __readeflags(); /*0xffe42059*/\n v9 = v5; /*0xffe4205b*/\n _disable(); /*0xffe4205f*/\n v6 = IoPortRead32(0xCF8u); /*0xffe4207f*/\n IoPortWrite32(0xCF8u, a1 & 0xFC | (a1 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe42089*/\n v7 = IoPortWrite32(0xCFCu, OrMask); /*0xffe4209c*/\n IoPortWrite32(0xCF8u, v6); /*0xffe4209e*/\n if ( (v9 & 0x200) != 0 ) /*0xffe420ac*/\n _enable(); /*0xffe420ae*/\n else\n _disable(); /*0xffe420b1*/\n return v7; /*0xffe420b4*/\n}","refs":[{"addr":"0xffe3fd4b","name":"LocateReportStatusCodePpi"},{"addr":"0xffe41795","name":"IoPortRead32"},{"addr":"0xffe417c1","name":"IoPortWrite32"}]} + v2 = (unsigned __int8 *)(ConfigTable + 3); /*0xffe42427*/ + n11 = 11; /*0xffe4242a*/ + do /*0xffe4244e*/ + { + if ( *(v2 - 1) ) /*0xffe4242b*/ + { + v5 = __inbyte(*(_WORD *)(v2 - 3)); /*0xffe42439*/ + v4 = *v2 | v5 & *(v2 - 1); /*0xffe4243f*/ + } + else + { + v4 = *v2; /*0xffe42431*/ + } + result = v4; /*0xffe42445*/ + __outbyte(*(_WORD *)(v2 - 3), v4); /*0xffe42447*/ + v2 += 4; /*0xffe42448*/ + --n11; /*0xffe4244b*/ + } + while ( n11 ); /*0xffe4244e*/ + return result; /*0xffe42450*/ +} -{"addr":"0xffe420ba","code":"int IoOr32Ex(int PciHandle, __int16 RegMask)\n{\n unsigned __int8 ShiftCount; // bl\n unsigned __int16 SlotIndex; // di\n __int16 SlotValue; // ax\n unsigned __int16 Temp; // cx\n unsigned __int8 BitCount; // al\n unsigned __int16 n4; // cx\n unsigned int OrMask; // esi\n\n ShiftCount = 0; /*0xffe420c7*/\n for ( SlotIndex = 0; SlotIndex < 4u; ++SlotIndex ) /*0xffe420c9*/\n {\n SlotValue = IoRead32(4 *SlotIndex + 1015940); /*0xffe420d6*/\n if ( (SlotValue & 1) == 0 ) /*0xffe420dd*/\n break; /*0xffe420dd*/\n if ( (SlotValue & 0xFFFC) == RegMask ) /*0xffe420e7*/\n break; /*0xffe420e7*/\n }\n if ( SlotIndex == 4 ) /*0xffe420f2*/\n return -2147483639; /*0xffe420f4*/\n Temp = 4; /*0xffe42102*/\n BitCount = 0; /*0xffe42105*/\n do /*0xffe42114*/\n {\n Temp >>= 1; /*0xffe42107*/\n ++BitCount; /*0xffe4210a*/\n }\n while ( (Temp & 1) == 0 ); /*0xffe42114*/\n n4 = 4; /*0xffe4211a*/\n do /*0xffe42122*/\n {\n ++ShiftCount; /*0xffe4211d*/\n n4 >>= 1; /*0xffe4211f*/\n }\n while ( n4 ); /*0xffe42122*/\n if ( BitCount == ShiftCount - 1 ) /*0xffe4212d*/\n --ShiftCount; /*0xffe4212f*/\n OrMask = ((((1 << ShiftCount) - 1) & 0xFFFC) << 16) | (unsigned __int16)(RegMask & ~((1 << ShiftCount) - 1)) | 1; /*0xffe4215c*/\n IoAnd32(4 *SlotIndex + 1015940, OrMask); /*0xffe42168*/\n *(_DWORD *)((unsigned __int16)(4 *SlotIndex + 10032) | 0xFDEF0000) = OrMask; /*0xffe4217c*/\n return 0; /*0xffe42180*/\n}","refs":[{"addr":"0xffe41f9d","name":"IoRead32"},{"addr":"0xffe4202a","name":"IoAnd32"}]} -{"addr":"0xffe42188","code":"int IoReadEx(int PciHandle, __int16 Register, char SubFunction, int Width)\n{\n __int16 MaskLow; // bx\n __int16 MaskHigh; // bp\n __int16 WidthMask; // si\n __int16 DefaultValue; // di\n unsigned __int8 Index; // cl\n __int16 SearchReg; // ax\n __int16 MaskLow_2; // ax\n unsigned __int8 MaskLow_1; // cl\n __int16 n1016; // ax\n unsigned __int8 v14; // cl\n __int16 n1008; // ax\n __int16 AccessWidth; // [esp-4h] [ebp-40h]\n int n57672688; // [esp+14h] [ebp-28h]\n __int16 v18; // [esp+18h] [ebp-24h]\n _DWORD v19[2]; // [esp+1Ch] [ebp-20h]\n _DWORD v20[5]; // [esp+24h] [ebp-18h]\n __int16 v21; // [esp+38h] [ebp-4h]\n __int16 n5; // [esp+44h] [ebp+8h]\n __int16 ConfigLow; // [esp+44h] [ebp+8h]\n\n v20[0] = 49808376; /*0xffe4218e*/\n v21 = 0; /*0xffe42198*/\n MaskLow = 0; /*0xffe4219d*/\n v18 = 0; /*0xffe4219f*/\n MaskHigh = -1; /*0xffe421a4*/\n WidthMask = 0; /*0xffe421ad*/\n v20[1] = 36176416; /*0xffe421af*/\n v20[2] = 48759352; /*0xffe421b7*/\n v20[3] = 65536824; /*0xffe421bf*/\n v20[4] = 48235248; /*0xffe421c7*/\n v19[0] = 41419640; /*0xffe421cf*/\n v19[1] = 956; /*0xffe421d7*/\n n57672688 = 57672688; /*0xffe421df*/\n DefaultValue = -1; /*0xffe421e8*/\n if ( Width == 1 ) /*0xffe421ed*/\n {\n if ( !Register ) /*0xffe42378*/\n {\n DefaultValue = -9; /*0xffe4237a*/\n goto LABEL_47; /*0xffe4237f*/\n }\n v14 = 0; /*0xffe42381*/\n n1008 = 1008; /*0xffe42383*/\n do /*0xffe4239a*/\n {\n if ( n1008 == Register ) /*0xffe4238b*/\n break; /*0xffe4238b*/\n n1008 = *((_WORD *)&n57672688 + ++v14); /*0xffe42392*/\n }\n while ( n1008 ); /*0xffe4239a*/\n if ( !*((_WORD *)&n57672688 + v14) ) /*0xffe423a4*/\n return -2147483645; /*0xffe423a4*/\n MaskHigh = -4097; /*0xffe423ad*/\n AccessWidth = 8; /*0xffe423b2*/\n MaskLow_2 = v14 << 12; /*0xffe423b4*/\n goto LABEL_46; /*0xffe423b4*/\n }\n if ( Width <= 1 ) /*0xffe421f3*/\n return -2147483645; /*0xffe421f3*/\n if ( Width <= 5 )\n {\n DefaultValue = Register == 0 ? -1025 : -1;\n WidthMask = Register != 0 ? 0x400 : 0;\n goto LABEL_47; /*0xffe42373*/\n }\n switch ( Width ) /*0xffe42205*/\n {\n case 6: /*0xffe42205*/\n if ( !Register ) /*0xffe422eb*/\n {\n DefaultValue = (SubFunction == 0) - 3; /*0xffe422fb*/\n goto LABEL_47; /*0xffe422fe*/\n }\n MaskLow_1 = 0; /*0xffe42303*/\n n1016 = 1016; /*0xffe42305*/\n do /*0xffe4231c*/\n {\n if ( n1016 == Register ) /*0xffe4230d*/\n break; /*0xffe4230d*/\n n1016 = *((_WORD *)v20 + ++MaskLow_1); /*0xffe42314*/\n }\n while ( n1016 ); /*0xffe4231c*/\n if ( !*((_WORD *)v20 + MaskLow_1) ) /*0xffe42326*/\n return -2147483645; /*0xffe42326*/\n if ( !SubFunction ) /*0xffe42330*/\n {\n MaskLow = MaskLow_1; /*0xffe42344*/\n WidthMask = 1; /*0xffe42347*/\n MaskHigh = -8; /*0xffe42348*/\n goto LABEL_47; /*0xffe4234d*/\n }\n MaskHigh = -113; /*0xffe42335*/\n AccessWidth = 2; /*0xffe4233a*/\n MaskLow_2 = 16 *MaskLow_1; /*0xffe4233c*/\n goto LABEL_46; /*0xffe42340*/\n case 7: /*0xffe42205*/\n if ( !Register ) /*0xffe422a4*/\n {\n DefaultValue = -5; /*0xffe422a6*/\n goto LABEL_47; /*0xffe422ab*/\n }\n Index = 0; /*0xffe422b0*/\n SearchReg = 888; /*0xffe422b2*/\n do /*0xffe422c9*/\n {\n if ( SearchReg == Register ) /*0xffe422ba*/\n break; /*0xffe422ba*/\n SearchReg = *((_WORD *)v19 + ++Index); /*0xffe422c1*/\n }\n while ( SearchReg ); /*0xffe422c9*/\n if ( !*((_WORD *)v19 + Index) ) /*0xffe422d3*/\n return -2147483645; /*0xffe422d3*/\n MaskHigh = -769; /*0xffe422d8*/\n AccessWidth = 4; /*0xffe422dd*/\n MaskLow_2 = Index << 8; /*0xffe422df*/\nLABEL_46:\n WidthMask = AccessWidth; /*0xffe423b8*/\n MaskLow = MaskLow_2; /*0xffe423b9*/\n goto LABEL_47; /*0xffe423b9*/\n case 8: /*0xffe42205*/\n if ( !Register ) /*0xffe42266*/\n {\n DefaultValue = -769; /*0xffe42268*/\n goto LABEL_47; /*0xffe4226d*/\n }\n WidthMask = 512; /*0xffe42272*/\n if ( Register == 512 ) /*0xffe4227a*/\n {\n WidthMask = 256; /*0xffe4227c*/\n goto LABEL_47; /*0xffe42281*/\n }\n if ( Register == 520 ) /*0xffe4228e*/\n goto LABEL_47; /*0xffe4228e*/\n return -2147483645; /*0xffe4228e*/\n }\n if ( Width != 255 ) /*0xffe4221e*/\n return -2147483645; /*0xffe4221e*/\n if ( Register != 46 ) /*0xffe42224*/\n {\n if ( Register == 78 ) /*0xffe42234*/\n {\n WidthMask = 0x2000; /*0xffe42236*/\n goto LABEL_47; /*0xffe4223b*/\n }\n if ( Register == 98 ) /*0xffe42244*/\n {\n WidthMask = 2048; /*0xffe42246*/\n goto LABEL_47; /*0xffe4224b*/\n }\n if ( Register ) /*0xffe42253*/\n {\n IoOr32Ex(PciHandle, Register); /*0xffe42257*/\n goto LABEL_47; /*0xffe4225e*/\n }\n return -2147483645; /*0xffe422a0*/\n }\n WidthMask = 4096; /*0xffe42226*/\nLABEL_47:\n n5 = MaskLow | MaskHigh & MmioRead16(0xF8080u); /*0xffe423bc*/\n MmioWrite32(0xF8080u, n5); /*0xffe423d9*/\n IoPortWrite8((_WORD *)0xFDEF2770, n5); /*0xffe423e7*/\n ConfigLow = WidthMask | DefaultValue & MmioRead16(0xF8082u); /*0xffe42404*/\n MmioWrite32(0xF8082u, ConfigLow); /*0xffe42408*/\n IoPortWrite8((_WORD *)0xFDEF2774, ConfigLow); /*0xffe42416*/\n return 0; /*0xffe42299*/\n}","refs":[{"addr":"0xffe420ba","name":"IoOr32Ex"},{"addr":"0xffe41e6c","name":"MmioRead16"},{"addr":"0xffe41f03","name":"MmioWrite32"},{"addr":"0xffe417f3","name":"IoPortWrite8"}]} +_BYTE *__usercall SetMemWrapper@(int value@, _BYTE *buf, char a3, unsigned int n255) +{ + unsigned int n255_1; // ecx + _BYTE *buf_1; // edi + __int16 value_1; // bx + int value_2; // eax + int v8; // edx + char n255_2; // dl + unsigned int count; // ecx -{"addr":"0xffe42422","code":"unsigned __int8 CopyMemWrapper(int This, int ConfigTable)\n{\n unsigned __int8 *v2; // esi\n int n11; // edi\n unsigned __int8 v4; // bl\n unsigned __int8 v5; // al\n unsigned __int8 result; // al\n\n v2 = (unsigned __int8 *)(ConfigTable + 3); /*0xffe42427*/\n n11 = 11; /*0xffe4242a*/\n do /*0xffe4244e*/\n {\n if ( *(v2 - 1) ) /*0xffe4242b*/\n {\n v5 = __inbyte(*(_WORD *)(v2 - 3)); /*0xffe42439*/\n v4 = *v2 | v5 & *(v2 - 1); /*0xffe4243f*/\n }\n else\n {\n v4 = *v2; /*0xffe42431*/\n }\n result = v4; /*0xffe42445*/\n __outbyte(*(_WORD *)(v2 - 3), v4); /*0xffe42447*/\n v2 += 4; /*0xffe42448*/\n --n11; /*0xffe4244b*/\n }\n while ( n11 ); /*0xffe4244e*/\n return result; /*0xffe42450*/\n}"} + n255_1 = n255; /*0xffe4245c*/ + LOBYTE(value) = a3; /*0xffe42460*/ + buf_1 = buf; /*0xffe4246f*/ + BYTE1(value) = a3; /*0xffe42478*/ + value_1 = value; /*0xffe4247a*/ + value_2 = value << 16; /*0xffe4247d*/ + LOWORD(value_2) = value_1; /*0xffe42480*/ + if ( n255 >= 4 ) /*0xffe42486*/ + { + v8 = (unsigned __int8)buf & 3; /*0xffe4248a*/ + if ( ((unsigned __int8)buf & 3) != 0 ) /*0xffe4248d*/ + { + memset(buf, value_1, 4 - v8); /*0xffe42498*/ + buf_1 = &buf[4 - v8]; /*0xffe42498*/ + n255_1 = n255 - (4 - v8); /*0xffe4249a*/ + } + n255_2 = n255_1; /*0xffe4249c*/ + count = n255_1 >> 2; /*0xffe4249e*/ + memset32(buf_1, value_2, count); /*0xffe424a1*/ + buf_1 += 4 *count; /*0xffe424a1*/ + n255_1 = n255_2 & 3; /*0xffe424a6*/ + } + memset(buf_1, value_1, n255_1); /*0xffe424a8*/ + return buf; /*0xffe424ad*/ +} -{"addr":"0xffe4245c","code":"_BYTE *__usercall SetMemWrapper@(int value@, _BYTE *buf, char a3, unsigned int n255)\n{\n unsigned int n255_1; // ecx\n _BYTE *buf_1; // edi\n __int16 value_1; // bx\n int value_2; // eax\n int v8; // edx\n char n255_2; // dl\n unsigned int count; // ecx\n\n n255_1 = n255; /*0xffe4245c*/\n LOBYTE(value) = a3; /*0xffe42460*/\n buf_1 = buf; /*0xffe4246f*/\n BYTE1(value) = a3; /*0xffe42478*/\n value_1 = value; /*0xffe4247a*/\n value_2 = value << 16; /*0xffe4247d*/\n LOWORD(value_2) = value_1; /*0xffe42480*/\n if ( n255 >= 4 ) /*0xffe42486*/\n {\n v8 = (unsigned __int8)buf & 3; /*0xffe4248a*/\n if ( ((unsigned __int8)buf & 3) != 0 ) /*0xffe4248d*/\n {\n memset(buf, value_1, 4 - v8); /*0xffe42498*/\n buf_1 = &buf[4 - v8]; /*0xffe42498*/\n n255_1 = n255 - (4 - v8); /*0xffe4249a*/\n }\n n255_2 = n255_1; /*0xffe4249c*/\n count = n255_1 >> 2; /*0xffe4249e*/\n memset32(buf_1, value_2, count); /*0xffe424a1*/\n buf_1 += 4 *count; /*0xffe424a1*/\n n255_1 = n255_2 & 3; /*0xffe424a6*/\n }\n memset(buf_1, value_1, n255_1); /*0xffe424a8*/\n return buf; /*0xffe424ad*/\n}"} -{"addr":"0xffe424bc","code":"unsigned int ZeroMem(unsigned int dst, char *src, unsigned int n16)\n{\n char *src_1; // esi\n unsigned int dst_1; // edi\n unsigned int n16_1; // ecx\n char v10; // dl\n char *n4; // eax\n unsigned int count; // eax\n int count_1; // ebx\n char n16_2; // al\n unsigned int v15; // ecx\n int n16_3; // eax\n\n __asm { pushfw } /*0xffe424c2*/\n src_1 = src; /*0xffe424c7*/\n dst_1 = dst; /*0xffe424ca*/\n n16_1 = n16; /*0xffe424cd*/\n v10 = 0; /*0xffe424d0*/\n n4 = &src[-dst]; /*0xffe424d4*/\n if ( (unsigned int)src < dst ) /*0xffe424d6*/\n {\n n4 = (char *)(dst - (_DWORD)src); /*0xffe424db*/\n if ( (unsigned int)&src[n16] >= dst ) /*0xffe424df*/\n {\n src_1 = &src[n16]; /*0xffe424e1*/\n dst_1 = n16 + dst; /*0xffe424e3*/\n v10 = 1; /*0xffe424e6*/\n }\n }\n if ( n16 < 4 || (unsigned int)n4 < 4 ) /*0xffe424f1*/\n goto LABEL_19; /*0xffe424f1*/\n count = (unsigned __int8)src_1 & 3; /*0xffe424f7*/\n count_1 = dst_1 & 3; /*0xffe424fa*/\n if ( v10 ) /*0xffe424ff*/\n {\n --src_1; /*0xffe42501*/\n --dst_1; /*0xffe42502*/\n }\n if ( count == count_1 && count ) /*0xffe42509*/\n {\n if ( !v10 ) /*0xffe4250d*/\n count = 4 - count; /*0xffe42511*/\n qmemcpy((void *)dst_1, src_1, count); /*0xffe42517*/\n src_1 += count; /*0xffe42517*/\n dst_1 += count; /*0xffe42517*/\n n16_1 = n16 - count; /*0xffe42519*/\n }\n if ( v10 ) /*0xffe4251d*/\n {\n src_1 -= 3; /*0xffe4251f*/\n dst_1 -= 3; /*0xffe42522*/\n }\n n16_2 = n16_1; /*0xffe42525*/\n v15 = n16_1 >> 2; /*0xffe42527*/\n qmemcpy((void *)dst_1, src_1, 4 *v15); /*0xffe4252a*/\n src_1 += 4 *v15; /*0xffe4252a*/\n dst_1 += 4 *v15; /*0xffe4252a*/\n n16_3 = n16_2 & 3; /*0xffe4252c*/\n if ( n16_3 ) /*0xffe4252f*/\n {\n if ( v10 ) /*0xffe42533*/\n {\n src_1 += 4; /*0xffe42535*/\n dst_1 += 4; /*0xffe42538*/\n }\n n16_1 = n16_3; /*0xffe4253b*/\nLABEL_19:\n if ( v10 ) /*0xffe4253f*/\n {\n --src_1; /*0xffe42541*/\n --dst_1; /*0xffe42542*/\n }\n qmemcpy((void *)dst_1, src_1, n16_1); /*0xffe42543*/\n }\n __asm { popfw } /*0xffe42545*/\n return dst; /*0xffe42548*/\n}"} +unsigned int ZeroMem(unsigned int dst, char *src, unsigned int n16) +{ + char *src_1; // esi + unsigned int dst_1; // edi + unsigned int n16_1; // ecx + char v10; // dl + char *n4; // eax + unsigned int count; // eax + int count_1; // ebx + char n16_2; // al + unsigned int v15; // ecx + int n16_3; // eax + __asm { pushfw } /*0xffe424c2*/ + src_1 = src; /*0xffe424c7*/ + dst_1 = dst; /*0xffe424ca*/ + n16_1 = n16; /*0xffe424cd*/ + v10 = 0; /*0xffe424d0*/ + n4 = &src[-dst]; /*0xffe424d4*/ + if ( (unsigned int)src < dst ) /*0xffe424d6*/ + { + n4 = (char *)(dst - (_DWORD)src); /*0xffe424db*/ + if ( (unsigned int)&src[n16] >= dst ) /*0xffe424df*/ + { + src_1 = &src[n16]; /*0xffe424e1*/ + dst_1 = n16 + dst; /*0xffe424e3*/ + v10 = 1; /*0xffe424e6*/ + } + } + if ( n16 < 4 || (unsigned int)n4 < 4 ) /*0xffe424f1*/ + goto LABEL_19; /*0xffe424f1*/ + count = (unsigned __int8)src_1 & 3; /*0xffe424f7*/ + count_1 = dst_1 & 3; /*0xffe424fa*/ + if ( v10 ) /*0xffe424ff*/ + { + --src_1; /*0xffe42501*/ + --dst_1; /*0xffe42502*/ + } + if ( count == count_1 && count ) /*0xffe42509*/ + { + if ( !v10 ) /*0xffe4250d*/ + count = 4 - count; /*0xffe42511*/ + qmemcpy((void *)dst_1, src_1, count); /*0xffe42517*/ + src_1 += count; /*0xffe42517*/ + dst_1 += count; /*0xffe42517*/ + n16_1 = n16 - count; /*0xffe42519*/ + } + if ( v10 ) /*0xffe4251d*/ + { + src_1 -= 3; /*0xffe4251f*/ + dst_1 -= 3; /*0xffe42522*/ + } + n16_2 = n16_1; /*0xffe42525*/ + v15 = n16_1 >> 2; /*0xffe42527*/ + qmemcpy((void *)dst_1, src_1, 4 *v15); /*0xffe4252a*/ + src_1 += 4 *v15; /*0xffe4252a*/ + dst_1 += 4 *v15; /*0xffe4252a*/ + n16_3 = n16_2 & 3; /*0xffe4252c*/ + if ( n16_3 ) /*0xffe4252f*/ + { + if ( v10 ) /*0xffe42533*/ + { + src_1 += 4; /*0xffe42535*/ + dst_1 += 4; /*0xffe42538*/ + } + n16_1 = n16_3; /*0xffe4253b*/ +LABEL_19: + if ( v10 ) /*0xffe4253f*/ + { + --src_1; /*0xffe42541*/ + --dst_1; /*0xffe42542*/ + } + qmemcpy((void *)dst_1, src_1, n16_1); /*0xffe42543*/ + } + __asm { popfw } /*0xffe42545*/ + return dst; /*0xffe42548*/ +} diff --git a/AmiModulePkg/Nvme/NvmeDynamicSetup/NvmeDynamicSetup.h b/AmiModulePkg/Nvme/NvmeDynamicSetup/NvmeDynamicSetup.h index 5140879..ee6b791 100644 --- a/AmiModulePkg/Nvme/NvmeDynamicSetup/NvmeDynamicSetup.h +++ b/AmiModulePkg/Nvme/NvmeDynamicSetup/NvmeDynamicSetup.h @@ -102,13 +102,11 @@ unsigned __int8 *a4 ); -{"addr":"0x1058","code":"__int64 EFIAPI NvmeInitDynamicMainForm( VOID ); -{"addr":"0x196c","code":"unsigned __int64 EFIAPI NvmeEnumerateNvmeDevices( VOID @@ -605,13 +603,13 @@ unsigned __int64 EFIAPI StrLenSafe( - _WORD *%02d_%02d_%04d__%02d:%02d + _WORD *String ); unsigned __int64 EFIAPI AsciiStrLenSafe( - _BYTE *%02d_%02d_%04d__%02d:%02d + _BYTE *String ); void * @@ -703,14 +701,13 @@ __int64 n16 ); -{"addr":"0x5eb4","code":"unsigned __int64 EFIAPI InternalPrintEngine( - \n unsigned __int64 _r_n, - \n unsigned __int64 n0xF4240, - \n __int16 n320, - \n unsigned __int8 *%02d_%02d_%04d__%02d:%02d, - \n unsigned __int16 **va + unsigned __int64 BufferSize, + unsigned __int64 Count, + __int16 Precision, + unsigned __int8 *FormatString, + unsigned __int16 **VaList ); unsigned __int64 @@ -741,4 +738,4 @@ unsigned __int64 n8 ); -#endif /* __NVMEDYNAMICSETUP_H__ */ \ No newline at end of file +#endif /* __NVMEDYNAMICSETUP_H__ */ diff --git a/AmiModulePkg/TCG/TCM/TCMPEI/TCMPEI.c b/AmiModulePkg/TCG/TCM/TCMPEI/TCMPEI.c index 870e0cf..759155c 100644 --- a/AmiModulePkg/TCG/TCM/TCMPEI/TCMPEI.c +++ b/AmiModulePkg/TCG/TCM/TCMPEI/TCMPEI.c @@ -1,93 +1,926 @@ // -// TCMPEI.efi - Full Decompilation -// Source: IDA Pro MCP port 13382 -// Functions: 42 +// TCMPEI.efi - cleaned decompilation // #include #include -{"addr":"0xffe2d800","code":"char *internal_memcpy(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe2d80a*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe2d818*/\n {\n src_1 = &src[count - 1]; /*0xffe2d82c*/\n dst_1 = &dst[count - 1]; /*0xffe2d82e*/\n }\n else\n {\n count_1 = count & 3; /*0xffe2d81c*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe2d825*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe2d825*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe2d825*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe2d835*/\n return dst; /*0xffe2d83c*/\n}"} +#define TcmBaseRegister ((volatile UINT8 *)(UINTN)0xFFE2ECDC) +#define TcmEntryContext ((void *)(UINTN)0xFFE2ECD0) -{"addr":"0xffe2d840","code":"void *internal_memset(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe2d84d*/\n return buf; /*0xffe2d853*/\n}"} +char *internal_memcpy(char *dst, char *src, unsigned int count) +{ + unsigned int count_1; + char *dst_1; + char *src_1; -{"addr":"0xffe2d860","code":"int fn_addr(int a1, int a2, int a3, int a4)\n{\n do /*0xffe2d879*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe2d871*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe2d875*/\n }\n while ( a2 ); /*0xffe2d879*/\n return a1; /*0xffe2d87d*/\n}"} + count_1 = count; + if (src < dst && &src[count - 1] >= dst) { + src_1 = &src[count - 1]; + dst_1 = &dst[count - 1]; + } else { + count_1 = count & 3; + qmemcpy(dst, src, 4 * (count >> 2)); + src_1 = &src[4 * (count >> 2)]; + dst_1 = &dst[4 * (count >> 2)]; + } + qmemcpy(dst_1, src_1, count_1); + return dst; +} -{"addr":"0xffe2d880","code":"void *internal_memset32(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe2d88d*/\n return buf; /*0xffe2d893*/\n}"} +void *internal_memset(void *buf, unsigned int count, char value) +{ + memset(buf, value, count); + return buf; +} -{"addr":"0xffe2d940","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n void *v2; // ecx\n void *v3; // ecx\n int v4; // eax\n\n if ( *(char *)(TcmGetPcdBaseAddress(v2) + 1024068) >= 0 ) /*0xffe2d950*/\n {\n TcmSetLocality(); /*0xffe2d952*/\n v4 = TcmGetPcdBaseAddress(v3); /*0xffe2d957*/\n *(_BYTE *)(v4 + 1024068) |= 0x80u; /*0xffe2d962*/\n }\n if ( *(_WORD *)(dword_FFE2ECDC + 3840) == 6990 ) /*0xffe2d97d*/\n return (*(int ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 24))( /*0xffe2d991*/\n SystemTable,\n &unk_FFE2ECD0);\n else\n return -1610612735; /*0xffe2d97f*/\n}","refs":[{"addr":"0xffe2e6bc","name":"TcmSetLocality"},{"addr":"0xffe2e6b0","name":"TcmGetPcdBaseAddress"},{"addr":"0xffe2ecd0","name":"unk_FFE2ECD0"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"}]} +int fn_addr(int a1, int a2, int a3, int a4) +{ + do { + *(_DWORD *)(a1 + 8 * a2 - 8) = a3; + *(_DWORD *)(a1 + 8 * a2-- - 4) = a4; + } while (a2); + return a1; +} -{"addr":"0xffe2d997","code":"int TcmStartup(int this, __int16 n2)\n{\n int v2; // eax\n __int16 v4; // [esp+0h] [ebp-1Ch] BYREF\n int n201326592; // [esp+2h] [ebp-1Ah]\n int v6; // [esp+6h] [ebp-16h]\n __int16 v7; // [esp+Ah] [ebp-12h]\n _WORD v8[8]; // [esp+Ch] [ebp-10h] BYREF\n\n v4 = -16128; /*0xffe2d9a6*/\n n201326592 = 201326592; /*0xffe2d9b5*/\n v6 = -1719664640; /*0xffe2d9c3*/\n v7 = __ROL2__(n2, 8); /*0xffe2d9ca*/\n v2 = TcmFifoTransmit(dword_FFE2ECDC, (int)&v4, 0xCu, (int)v8, 10); /*0xffe2d9ce*/\n return TcmCheckResponse(v2, v8); /*0xffe2d9e1*/\n}","refs":[{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"}]} +void *internal_memset32(void *buf, unsigned int count, int value) +{ + memset32(buf, value, count); + return buf; +} -{"addr":"0xffe2d9e5","code":"int TcmContinueSelfTest()\n{\n int v0; // eax\n _WORD v2[6]; // [esp+0h] [ebp-1Ch] BYREF\n __int16 v3; // [esp+Ch] [ebp-10h] BYREF\n int n167772160; // [esp+Eh] [ebp-Eh]\n int n1400897536; // [esp+12h] [ebp-Ah]\n\n n167772160 = 167772160; /*0xffe2d9f0*/\n v3 = -16128; /*0xffe2d9f7*/\n n1400897536 = 1400897536; /*0xffe2da06*/\n v0 = TcmFifoTransmit(dword_FFE2ECDC, (int)&v3, 0xAu, (int)v2, 10); /*0xffe2da14*/\n return TcmCheckResponse(v0, v2); /*0xffe2da27*/\n}","refs":[{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"}]} +EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + void *v2; + void *v3; + int v4; -{"addr":"0xffe2da2b","code":"int TcmSetDeactivated()\n{\n int v0; // eax\n _WORD v2[6]; // [esp+0h] [ebp-1Ch] BYREF\n __int16 v3; // [esp+Ch] [ebp-10h] BYREF\n int n167772160; // [esp+Eh] [ebp-Eh]\n int n1887436800; // [esp+12h] [ebp-Ah]\n\n n167772160 = 167772160; /*0xffe2da36*/\n v3 = -16128; /*0xffe2da3d*/\n n1887436800 = 1887436800; /*0xffe2da4c*/\n v0 = TcmFifoTransmit(dword_FFE2ECDC, (int)&v3, 0xAu, (int)v2, 10); /*0xffe2da5a*/\n return TcmCheckResponse(v0, v2); /*0xffe2da6d*/\n}","refs":[{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"}]} + if (*(char *)(TcmGetPcdBaseAddress(v2) + 1024068) >= 0) { + TcmSetLocality(); + v4 = TcmGetPcdBaseAddress(v3); + *(_BYTE *)(v4 + 1024068) |= 0x80u; + } + if (*(_WORD *)(TcmBaseRegister + 3840) == 6990) + return (*(int (**)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 24))(SystemTable, TcmEntryContext); + return -1610612735; +} -{"addr":"0xffe2da71","code":"int TcmSetPhysicalPresence(int this, char a2)\n{\n int v2; // eax\n __int16 v4; // [esp+0h] [ebp-1Ch] BYREF\n int n184549376; // [esp+2h] [ebp-1Ah]\n int n1920991232; // [esp+6h] [ebp-16h]\n char v7; // [esp+Ah] [ebp-12h]\n _WORD v8[8]; // [esp+Ch] [ebp-10h] BYREF\n\n n184549376 = 184549376; /*0xffe2da7c*/\n v4 = -16128; /*0xffe2da83*/\n n1920991232 = 1920991232; /*0xffe2da92*/\n v7 = a2; /*0xffe2daa0*/\n v2 = TcmFifoTransmit(dword_FFE2ECDC, (int)&v4, 0xBu, (int)v8, 10); /*0xffe2daa3*/\n return TcmCheckResponse(v2, v8); /*0xffe2dab6*/\n}","refs":[{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"}]} +int TcmStartup(int this, __int16 n2) +{ + int v2; + __int16 v4; + int n201326592; + int v6; + __int16 v7; + _WORD v8[8]; -{"addr":"0xffe2daba","code":"int __usercall TcmBuildCommandPacket@(unsigned int n4@, unsigned int n0x108, int n17, int a4)\n{\n int n17_1; // esi\n int v5; // eax\n _BYTE *v6; // edx\n _WORD v8[7]; // [esp+8h] [ebp-40h] BYREF\n _BYTE v9[22]; // [esp+16h] [ebp-32h] BYREF\n __int16 v10; // [esp+2Ch] [ebp-1Ch] BYREF\n int n369098752; // [esp+2Eh] [ebp-1Ah]\n int n1702887424; // [esp+32h] [ebp-16h]\n unsigned __int32 v13; // [esp+36h] [ebp-12h]\n int n0x4000000; // [esp+3Ah] [ebp-Eh]\n unsigned __int32 v15; // [esp+3Eh] [ebp-Ah]\n\n n17_1 = n17; /*0xffe2dac2*/\n v10 = -16128; /*0xffe2daca*/\n v15 = _byteswap_ulong(n0x108); /*0xffe2dad4*/\n n369098752 = 369098752; /*0xffe2dade*/\n n1702887424 = 1702887424; /*0xffe2daeb*/\n v13 = _byteswap_ulong(n4); /*0xffe2dafb*/\n n0x4000000 = 0x4000000; /*0xffe2dafe*/\n v5 = TcmFifoTransmit(dword_FFE2ECDC, (int)&v10, 0x16u, (int)v8, n17 + 14); /*0xffe2db05*/\n v6 = (_BYTE *)(n17 + a4); /*0xffe2db17*/\n do /*0xffe2db23*/\n {\n --v6; /*0xffe2db1a*/\n *v6 = v9[(_DWORD)v6 - a4]; /*0xffe2db1e*/\n --n17_1; /*0xffe2db20*/\n }\n while ( n17_1 ); /*0xffe2db23*/\n return TcmCheckResponse(v5, v8); /*0xffe2db32*/\n}","refs":[{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"}]} + v4 = -16128; + n201326592 = 201326592; + v6 = -1719664640; + v7 = __ROL2__(n2, 8); + v2 = TcmFifoTransmit((int)TcmBaseRegister, (int)&v4, 0xCu, (int)v8, 10); + return TcmCheckResponse(v2, v8); +} -{"addr":"0xffe2db38","code":"int __thiscall TcmStartupClear(void *this)\n{\n int v1; // eax\n int v2; // esi\n int v3; // eax\n\n v1 = TcmStartup((int)this, 1); /*0xffe2db3c*/\n v2 = v1; /*0xffe2db41*/\n if ( v1 ) /*0xffe2db45*/\n {\n TcmDebugPrint(0x80000000, \"Tcm StartUp Clear error, returned %r\\n\", v1); /*0xffe2db4d*/\n }\n else\n {\n v3 = TcmContinueSelfTest(); /*0xffe2db4f*/\n v2 = v3; /*0xffe2db54*/\n if ( v3 ) /*0xffe2db58*/\n TcmDebugPrint(0x80000000, \"Tcm ContinueSelfTest error, returned %r\\n\", v3); /*0xffe2db65*/\n }\n return v2; /*0xffe2db6f*/\n}","refs":[{"addr":"0xffe2d997","name":"TcmStartup"},{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e778","name":"aTcmStartupClea","string":"Tcm StartUp Clear error, returned %r\n"},{"addr":"0xffe2d9e5","name":"TcmContinueSelfTest"},{"addr":"0xffe2e7a0","name":"aTcmContinuesel","string":"Tcm ContinueSelfTest error, returned %r\n"}]} +int TcmContinueSelfTest() +{ + int v0; + _WORD v2[6]; + __int16 v3; + int n167772160; + int n1400897536; -{"addr":"0xffe2db71","code":"int __thiscall TcmStartupState(void *this)\n{\n int v1; // eax\n int v2; // esi\n int v3; // eax\n\n v1 = TcmStartup((int)this, 2); /*0xffe2db75*/\n v2 = v1; /*0xffe2db7a*/\n if ( v1 ) /*0xffe2db7e*/\n {\n TcmDebugPrint(0x80000000, \"Tcm Startup state error, returned %r\\n\", v1); /*0xffe2db86*/\n }\n else\n {\n v3 = TcmContinueSelfTest(); /*0xffe2db88*/\n v2 = v3; /*0xffe2db8d*/\n if ( v3 ) /*0xffe2db91*/\n TcmDebugPrint(0x80000000, \"Tcm ContinueSelfTest error, returned %r\\n\", v3); /*0xffe2db9e*/\n }\n return v2; /*0xffe2dba8*/\n}","refs":[{"addr":"0xffe2d997","name":"TcmStartup"},{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e7cc","name":"aTcmStartupStat","string":"Tcm Startup state error, returned %r\n"},{"addr":"0xffe2d9e5","name":"TcmContinueSelfTest"},{"addr":"0xffe2e7a0","name":"aTcmContinuesel","string":"Tcm ContinueSelfTest error, returned %r\n"}]} + n167772160 = 167772160; + v3 = -16128; + n1400897536 = 1400897536; + v0 = TcmFifoTransmit((int)TcmBaseRegister, (int)&v3, 0xAu, (int)v2, 10); + return TcmCheckResponse(v0, v2); +} -{"addr":"0xffe2dbaa","code":"int TcmPhysicalEnable()\n{\n int v0; // eax\n int v1; // eax\n int v2; // esi\n int v3; // eax\n int v5; // [esp-4h] [ebp-20h]\n _WORD v6[6]; // [esp+4h] [ebp-18h] BYREF\n __int16 v7; // [esp+10h] [ebp-Ch] BYREF\n int n167772160; // [esp+12h] [ebp-Ah]\n int n1870659584; // [esp+16h] [ebp-6h]\n\n n167772160 = 167772160; /*0xffe2dbb6*/\n v7 = -16128; /*0xffe2dbbd*/\n n1870659584 = 1870659584; /*0xffe2dbcc*/\n v0 = TcmFifoTransmit(dword_FFE2ECDC, (int)&v7, 0xAu, (int)v6, 10); /*0xffe2dbda*/\n v1 = TcmCheckResponse(v0, v6); /*0xffe2dbe7*/\n v2 = v1; /*0xffe2dbec*/\n if ( v1 ) /*0xffe2dbf1*/\n {\n TcmDebugPrint(0x80000000, \"Tcm Physical enable error, returned %r\\n\", v1); /*0xffe2dbf9*/\n }\n else\n {\n v3 = TcmSetPhysicalPresence(v5, 0); /*0xffe2dbfd*/\n v2 = v3; /*0xffe2dc02*/\n if ( v3 ) /*0xffe2dc06*/\n TcmDebugPrint(0x80000000, \"Tcm Set activate error, returned %r\\n\", v3); /*0xffe2dc13*/\n }\n return v2; /*0xffe2dc1d*/\n}","refs":[{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"},{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e7f4","name":"aTcmPhysicalEna","string":"Tcm Physical enable error, returned %r\n"},{"addr":"0xffe2da71","name":"TcmSetPhysicalPresence"},{"addr":"0xffe2e81c","name":"aTcmSetActivate","string":"Tcm Set activate error, returned %r\n"}]} +int TcmSetDeactivated() +{ + int v0; + _WORD v2[6]; + __int16 v3; + int n167772160; + int n1887436800; -{"addr":"0xffe2dc22","code":"int __thiscall TcmPhysicalSetDeactivated(void *this)\n{\n int v1; // eax\n int v2; // esi\n int v3; // eax\n\n v1 = TcmSetPhysicalPresence((int)this, 1); /*0xffe2dc25*/\n v2 = v1; /*0xffe2dc2a*/\n if ( v1 ) /*0xffe2dc2e*/\n {\n TcmDebugPrint(0x80000000, \"Tcm Set deactivate error, returned %r\\n\", v1); /*0xffe2dc36*/\n }\n else\n {\n v3 = TcmSetDeactivated(); /*0xffe2dc38*/\n v2 = v3; /*0xffe2dc3d*/\n if ( v3 ) /*0xffe2dc41*/\n TcmDebugPrint(0x80000000, \"Tcm Physical disable error, returned %r\\n\", v3); /*0xffe2dc4e*/\n }\n return v2; /*0xffe2dc58*/\n}","refs":[{"addr":"0xffe2da71","name":"TcmSetPhysicalPresence"},{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e844","name":"aTcmSetDeactiva","string":"Tcm Set deactivate error, returned %r\n"},{"addr":"0xffe2da2b","name":"TcmSetDeactivated"},{"addr":"0xffe2e86c","name":"aTcmPhysicalDis","string":"Tcm Physical disable error, returned %r\n"}]} + n167772160 = 167772160; + v3 = -16128; + n1887436800 = 1887436800; + v0 = TcmFifoTransmit((int)TcmBaseRegister, (int)&v3, 0xAu, (int)v2, 10); + return TcmCheckResponse(v0, v2); +} -{"addr":"0xffe2dc5a","code":"int TcmForceClear()\n{\n int v0; // eax\n int v1; // eax\n int v2; // esi\n _WORD v4[6]; // [esp+4h] [ebp-18h] BYREF\n __int16 v5; // [esp+10h] [ebp-Ch] BYREF\n int n167772160; // [esp+12h] [ebp-Ah]\n int n1568669696; // [esp+16h] [ebp-6h]\n\n n167772160 = 167772160; /*0xffe2dc66*/\n v5 = -16128; /*0xffe2dc6d*/\n n1568669696 = 1568669696; /*0xffe2dc7c*/\n v0 = TcmFifoTransmit(dword_FFE2ECDC, (int)&v5, 0xAu, (int)v4, 10); /*0xffe2dc8a*/\n v1 = TcmCheckResponse(v0, v4); /*0xffe2dc97*/\n v2 = v1; /*0xffe2dc9c*/\n if ( v1 ) /*0xffe2dca1*/\n TcmDebugPrint(0x80000000, \"Tcm Force clear error, returned %r\\n\", v1); /*0xffe2dcae*/\n return v2; /*0xffe2dcb8*/\n}","refs":[{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2ecdc","name":"dword_FFE2ECDC"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"},{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e898","name":"aTcmForceClearE","string":"Tcm Force clear error, returned %r\n"}]} +int TcmSetPhysicalPresence(int this, char a2) +{ + int v2; + __int16 v4; + int n184549376; + int n1920991232; + char v7; + _WORD v8[8]; -{"addr":"0xffe2dcbd","code":"int TcmGetFlags(bool *a1, bool *a2, bool *a3)\n{\n int v3; // eax\n int v4; // esi\n bool v6; // zf\n int v7; // eax\n _BYTE v8[23]; // [esp+4h] [ebp-18h] BYREF\n char v9; // [esp+1Bh] [ebp-1h] BYREF\n\n v3 = TcmBuildCommandPacket(4u, 0x108u, 17, (int)v8); /*0xffe2dcd2*/\n v4 = v3; /*0xffe2dcd7*/\n if ( v3 ) /*0xffe2dcde*/\n {\n TcmDebugPrint(0x80000000, \"Tcm Get Pflag error, returned %r\\n\", v3); /*0xffe2dceb*/\n return v4; /*0xffe2dcf5*/\n }\n v6 = v8[4] == 0; /*0xffe2dd01*/\n *a1 = v8[2] == 0; /*0xffe2dd05*/\n *a2 = v6; /*0xffe2dd0d*/\n v7 = TcmBuildCommandPacket(5u, 0x111u, 1, (int)&v9); /*0xffe2dd1d*/\n v4 = v7; /*0xffe2dd22*/\n if ( v7 ) /*0xffe2dd29*/\n {\n TcmDebugPrint(0x80000000, \"Tcm Get Vflag error, returned %r\\n\", v7); /*0xffe2dd31*/\n return v4; /*0xffe2dd31*/\n }\n *a3 = v9 != 0; /*0xffe2dd3d*/\n return 0; /*0xffe2dd41*/\n}","refs":[{"addr":"0xffe2daba","name":"TcmBuildCommandPacket"},{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e8bc","name":"aTcmGetPflagErr","string":"Tcm Get Pflag error, returned %r\n"},{"addr":"0xffe2e8e0","name":"aTcmGetVflagErr","string":"Tcm Get Vflag error, returned %r\n"}]} + n184549376 = 184549376; + v4 = -16128; + n1920991232 = 1920991232; + v7 = a2; + v2 = TcmFifoTransmit((int)TcmBaseRegister, (int)&v4, 0xBu, (int)v8, 10); + return TcmCheckResponse(v2, v8); +} -{"addr":"0xffe2dd46","code":"int TcmCheckResponse(int a1, _WORD *a2)\n{\n if ( !a1 && *a2 != 0xC400 ) /*0xffe2dd52*/\n {\n TcmDebugPrint(0x80000000, \"Tcm no response.\\n\"); /*0xffe2dd5e*/\n return -2147483632; /*0xffe2dd65*/\n }\n return a1; /*0xffe2dd6c*/\n}","refs":[{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e904","name":"aTcmNoResponse","string":"Tcm no response.\n"}]} +int __usercall TcmBuildCommandPacket@(unsigned int n4@, unsigned int n0x108, int n17, int a4) +{ + int n17_1; + int v5; + _BYTE *v6; + _WORD v8[7]; + _BYTE v9[22]; + __int16 v10; + int n369098752; + int n1702887424; + unsigned __int32 v13; + int n0x4000000; + unsigned __int32 v15; -{"addr":"0xffe2dd6d","code":"int TcmSm3CompressionFunction(_DWORD *dst, _DWORD *a2, int *this)\n{\n int n2043430169; // ebp\n int v4; // ecx\n int v5; // edi\n int v6; // ebx\n int v7; // esi\n int n16; // eax\n int v9; // edx\n int v10; // ecx\n int v11; // edx\n int v12; // ecx\n _DWORD *v13; // edi\n int v14; // edi\n int v15; // eax\n int v16; // edx\n _DWORD *v17; // ecx\n int v18; // ecx\n int v19; // edx\n int v20; // edx\n int v22; // [esp+10h] [ebp-2Ch]\n int v23; // [esp+14h] [ebp-28h]\n int v24; // [esp+18h] [ebp-24h]\n int v27; // [esp+24h] [ebp-18h]\n int n16_1; // [esp+28h] [ebp-14h]\n int v29; // [esp+2Ch] [ebp-10h]\n int v30; // [esp+2Ch] [ebp-10h]\n int v31; // [esp+30h] [ebp-Ch]\n int v32; // [esp+34h] [ebp-8h]\n\n n2043430169 = 2043430169; /*0xffe2dd77*/\n v4 = *this; /*0xffe2dd87*/\n v5 = *(this + 2); /*0xffe2dd89*/\n v6 = *(this + 4); /*0xffe2dd8c*/\n v31 = *(this + 3); /*0xffe2dd9d*/\n v23 = *(this + 5); /*0xffe2dda4*/\n v24 = *(this + 6); /*0xffe2ddab*/\n v7 = *(this + 1); /*0xffe2ddb2*/\n v32 = *(this + 7); /*0xffe2ddb6*/\n n16 = 0; /*0xffe2ddba*/\n v22 = *this; /*0xffe2ddbc*/\n v27 = v5; /*0xffe2ddc0*/\n n16_1 = 0; /*0xffe2ddc4*/\n while ( 1 )\n {\n if ( n16 )\n n2043430169 = n16 == 16 ? -1651869049 : __ROL4__(n2043430169, 1);\n else\n n2043430169 = 2043430169; /*0xffe2ddd2*/\n v9 = __ROL4__(v4, 12); /*0xffe2dde9*/\n v10 = __ROL4__(n2043430169 + v9 + v6, 7); /*0xffe2ddf1*/\n v11 = v10 ^ v9; /*0xffe2ddf4*/\n v29 = v10; /*0xffe2ddf6*/\n if ( n16 > 15 ) /*0xffe2ddfd*/\n {\n v12 = v5 & v7 | v22 & (v5 | v7); /*0xffe2de15*/\n n16 = n16_1; /*0xffe2de17*/\n }\n else\n {\n v12 = v5 ^ v7 ^ v22; /*0xffe2de05*/\n }\n v13 = a2++; /*0xffe2de1b*/\n v14 = v31 + v11 + v12 + *v13; /*0xffe2de2c*/\n if ( n16 > 15 ) /*0xffe2de33*/\n {\n v16 = v23 & v6 | v24 & ~v6; /*0xffe2de4d*/\n v15 = v24; /*0xffe2de4f*/\n }\n else\n {\n v15 = v24; /*0xffe2de39*/\n v16 = v24 ^ v23 ^ v6; /*0xffe2de3d*/\n }\n v17 = dst++; /*0xffe2de53*/\n v18 = v32 + v29 + v16 + *v17; /*0xffe2de68*/\n v32 = v15; /*0xffe2de6c*/\n v24 = __ROR4__(v23, 13); /*0xffe2de77*/\n v23 = v6; /*0xffe2de7d*/\n v31 = v27; /*0xffe2de8b*/\n v19 = v7; /*0xffe2de93*/\n v7 = v22; /*0xffe2de95*/\n v6 = v18 ^ __ROL4__(v18, 9) ^ __ROR4__(v18, 15); /*0xffe2de99*/\n v20 = __ROL4__(v19, 9); /*0xffe2de9b*/\n v4 = v14; /*0xffe2de9e*/\n n16 = n16_1 + 1; /*0xffe2dea0*/\n v27 = v20; /*0xffe2dea1*/\n v30 = v22; /*0xffe2dea5*/\n v22 = v14; /*0xffe2dea9*/\n n16_1 = n16; /*0xffe2dead*/\n if ( n16 > 63 ) /*0xffe2deb4*/\n break; /*0xffe2deb4*/\n v5 = v20; /*0xffe2ddca*/\n }\n *this ^= v14; /*0xffe2dec9*/\n *(this + 1) ^= v30; /*0xffe2decf*/\n *(this + 5) ^= v23; /*0xffe2ded6*/\n *(this + 2) ^= v20; /*0xffe2ded9*/\n *(this + 4) ^= v6; /*0xffe2dedc*/\n *(this + 3) ^= v31; /*0xffe2dedf*/\n *(this + 6) ^= v24; /*0xffe2dee6*/\n *(this + 7) ^= v32; /*0xffe2deed*/\n return v24; /*0xffe2dec8*/\n}"} + n17_1 = n17; + v10 = -16128; + v15 = _byteswap_ulong(n0x108); + n369098752 = 369098752; + n1702887424 = 1702887424; + v13 = _byteswap_ulong(n4); + n0x4000000 = 0x4000000; + v5 = TcmFifoTransmit((int)TcmBaseRegister, (int)&v10, 0x16u, (int)v8, n17 + 14); + v6 = (_BYTE *)(n17 + a4); + do { + --v6; + *v6 = v9[(_DWORD)v6 - a4]; + --n17_1; + } while (n17_1); + return TcmCheckResponse(v5, v8); +} -{"addr":"0xffe2def7","code":"char TcmSm3WordSwap(int this, unsigned int n0x40, int thisa)\n{\n unsigned int v3; // edx\n char *v4; // esi\n char *v5; // edi\n char v6; // cl\n char result; // al\n char v8; // cl\n\n v3 = n0x40 >> 2; /*0xffe2def7*/\n if ( v3 ) /*0xffe2defc*/\n {\n v4 = (char *)(thisa + 1); /*0xffe2df04*/\n v5 = (char *)(this + 3); /*0xffe2df05*/\n do /*0xffe2df25*/\n {\n v6 = *(v4 - 1); /*0xffe2df0a*/\n *(v4 - 1) = *v5; /*0xffe2df0d*/\n result = *(v5 - 1); /*0xffe2df10*/\n *v5 = v6; /*0xffe2df13*/\n v5 += 4; /*0xffe2df15*/\n v8 = *v4; /*0xffe2df18*/\n *v4 = result; /*0xffe2df1a*/\n v4 += 4; /*0xffe2df1c*/\n *(v4 - 3) = v8; /*0xffe2df1f*/\n --v3; /*0xffe2df22*/\n }\n while ( v3 ); /*0xffe2df25*/\n }\n return result; /*0xffe2df29*/\n}"} +int __thiscall TcmStartupClear(void *this) +{ + int v1; + int v2; + int v3; -{"addr":"0xffe2df2a","code":"int __thiscall TcmSm3ProcessBlock(int *this)\n{\n int *dst_1; // esi\n int n64; // ebx\n _DWORD *dst_2; // esi\n int n52; // edi\n int v6; // ecx\n int v7; // edx\n int v8; // ecx\n int v9; // eax\n _DWORD dst[68]; // [esp+10h] [ebp-210h] BYREF\n _DWORD v13[64]; // [esp+120h] [ebp-100h] BYREF\n\n dst_1 = this + 10; /*0xffe2df36*/\n n64 = 64; /*0xffe2df3c*/\n TcmSm3WordSwap((int)(this + 10), 0x40u, (int)(this + 10)); /*0xffe2df41*/\n qmemcpy(dst, dst_1, 0x40u); /*0xffe2df4e*/\n dst_2 = dst; /*0xffe2df52*/\n n52 = 52; /*0xffe2df56*/\n do /*0xffe2df84*/\n {\n v6 = dst_2[3]; /*0xffe2df5a*/\n v7 = *dst_2 ^ dst_2[7] ^ __ROL4__(dst_2[13], 15); /*0xffe2df63*/\n ++dst_2; /*0xffe2df65*/\n dst_2[15] = v7 ^ dst_2[9] ^ __ROR4__(v7, 9) ^ __ROL4__(v7, 15) ^ __ROL4__(v6, 7); /*0xffe2df7e*/\n --n52; /*0xffe2df81*/\n }\n while ( n52 ); /*0xffe2df84*/\n v8 = 0; /*0xffe2df86*/\n do /*0xffe2df9d*/\n {\n v9 = dst[v8 + 4]; /*0xffe2df88*/\n ++v8; /*0xffe2df8c*/\n dst[v8 + 67] = dst[v8 - 1] ^ v9; /*0xffe2df93*/\n --n64; /*0xffe2df9a*/\n }\n while ( n64 ); /*0xffe2df9d*/\n return TcmSm3CompressionFunction(dst, v13, this); /*0xffe2dfb1*/\n}","refs":[{"addr":"0xffe2def7","name":"TcmSm3WordSwap"},{"addr":"0xffe2dd6d","name":"TcmSm3CompressionFunction"}]} + v1 = TcmStartup((int)this, 1); + v2 = v1; + if (v1) { + TcmDebugPrint(0x80000000, "Tcm StartUp Clear error, returned %r\n", v1); + } else { + v3 = TcmContinueSelfTest(); + v2 = v3; + if (v3) + TcmDebugPrint(0x80000000, "Tcm ContinueSelfTest error, returned %r\n", v3); + } + return v2; +} -{"addr":"0xffe2dfbc","code":"char __thiscall TcmSm3Finalize(int this)\n{\n int v2; // edx\n unsigned int n0x40; // eax\n\n v2 = *(_DWORD *)(this + 36); /*0xffe2dfc2*/\n *(_DWORD *)(this + 32) += 8 *v2; /*0xffe2dfca*/\n *(_BYTE *)(v2 + this + 40) = 0x80; /*0xffe2dfcd*/\n n0x40 = ++*(_DWORD *)(this + 36); /*0xffe2dfd5*/\n if ( n0x40 > 0x38 ) /*0xffe2dfdb*/\n {\n while ( n0x40 < 0x40 ) /*0xffe2dfec*/\n {\n *(_BYTE *)(this + n0x40 + 40) = 0; /*0xffe2dfdf*/\n n0x40 = ++*(_DWORD *)(this + 36); /*0xffe2dfe6*/\n }\n TcmSm3ProcessBlock((int *)this); /*0xffe2dfee*/\n *(_DWORD *)(this + 36) = 0; /*0xffe2dff3*/\n }\n while ( *(_DWORD *)(this + 36) < 0x38u ) /*0xffe2e006*/\n *(_BYTE *)(this + (*(_DWORD *)(this + 36))++ + 40) = 0; /*0xffe2dffb*/\n *(_DWORD *)(this + 96) = 0; /*0xffe2e008*/\n *(_BYTE *)(this + 103) = *(_BYTE *)(this + 32); /*0xffe2e010*/\n *(_BYTE *)(this + 102) = BYTE1(*(_DWORD *)(this + 32)); /*0xffe2e019*/\n *(_BYTE *)(this + 101) = *(_BYTE *)(this + 34); /*0xffe2e01f*/\n *(_BYTE *)(this + 100) = *(_BYTE *)(this + 35); /*0xffe2e025*/\n TcmSm3ProcessBlock((int *)this); /*0xffe2e028*/\n return TcmSm3WordSwap(this, 0x20u, this); /*0xffe2e039*/\n}","refs":[{"addr":"0xffe2df2a","name":"TcmSm3ProcessBlock"},{"addr":"0xffe2def7","name":"TcmSm3WordSwap"}]} +int __thiscall TcmStartupState(void *this) +{ + int v1; + int v2; + int v3; -{"addr":"0xffe2e03c","code":"char TcmSm3(_BYTE *a1, int a2)\n{\n int n64; // esi\n int v6[8]; // [esp+10h] [ebp-68h] BYREF\n int v7; // [esp+30h] [ebp-48h]\n int n64_1; // [esp+34h] [ebp-44h]\n _BYTE v9[64]; // [esp+38h] [ebp-40h]\n\n v7 = 0; /*0xffe2e045*/\n v6[0] = 1937774191; /*0xffe2e04f*/\n v6[1] = 1226093241; /*0xffe2e059*/\n v6[2] = 388252375; /*0xffe2e061*/\n v6[3] = -628488704; /*0xffe2e069*/\n v6[4] = -1452330820; /*0xffe2e071*/\n v6[5] = 372324522; /*0xffe2e079*/\n v6[6] = -477237683; /*0xffe2e081*/\n v6[7] = -1325724082; /*0xffe2e089*/\nLABEL_4:\n n64 = 0; /*0xffe2e0ba*/\n n64_1 = 0; /*0xffe2e0bc*/\n while ( a2 ) /*0xffe2e0c2*/\n {\n --a2; /*0xffe2e095*/\n v9[n64] = *a1++; /*0xffe2e096*/\n n64 = n64_1 + 1; /*0xffe2e09f*/\n n64_1 = n64; /*0xffe2e0a0*/\n if ( n64 == 64 ) /*0xffe2e0a7*/\n {\n TcmSm3ProcessBlock(v6); /*0xffe2e0ad*/\n v7 += 512; /*0xffe2e0b2*/\n goto LABEL_4; /*0xffe2e0b2*/\n }\n }\n return TcmSm3Finalize((int)v6); /*0xffe2e0cd*/\n}","refs":[{"addr":"0xffe2df2a","name":"TcmSm3ProcessBlock"},{"addr":"0xffe2dfbc","name":"TcmSm3Finalize"}]} + v1 = TcmStartup((int)this, 2); + v2 = v1; + if (v1) { + TcmDebugPrint(0x80000000, "Tcm Startup state error, returned %r\n", v1); + } else { + v3 = TcmContinueSelfTest(); + v2 = v3; + if (v3) + TcmDebugPrint(0x80000000, "Tcm ContinueSelfTest error, returned %r\n", v3); + } + return v2; +} -{"addr":"0xffe2e0d4","code":"int TcmPcrExtend(int a1, _BYTE *a2, int a3, char *src, __int16 a5)\n{\n int v5; // eax\n __int16 v7; // [esp+0h] [ebp-38h] BYREF\n int n738197504; // [esp+2h] [ebp-36h]\n int n343932928; // [esp+6h] [ebp-32h]\n __int16 v10; // [esp+Ah] [ebp-2Eh]\n char dst[32]; // [esp+Ch] [ebp-2Ch] BYREF\n _WORD v12[6]; // [esp+2Ch] [ebp-Ch] BYREF\n\n TcmSm3(a2, a3); /*0xffe2e0e1*/\n n738197504 = 738197504; /*0xffe2e0f1*/\n v7 = -16128; /*0xffe2e0f8*/\n n343932928 = 343932928; /*0xffe2e102*/\n v10 = a5; /*0xffe2e109*/\n TcmMemoryCopy(dst, src, 0x20u); /*0xffe2e10d*/\n v5 = TcmFifoTransmit(a1, (int)&v7, 0x2Cu, (int)v12, 10); /*0xffe2e121*/\n return TcmCheckResponse(v5, v12); /*0xffe2e134*/\n}","refs":[{"addr":"0xffe2e03c","name":"TcmSm3"},{"addr":"0xffe2e432","name":"TcmMemoryCopy"},{"addr":"0xffe2e406","name":"TcmFifoTransmit"},{"addr":"0xffe2dd46","name":"TcmCheckResponse"}]} +int TcmPhysicalEnable() +{ + int v0; + int v1; + int v2; + int v3; + int v5; + _WORD v6[6]; + __int16 v7; + int n167772160; + int n1870659584; -{"addr":"0xffe2e138","code":"int __thiscall TcmMicroDelay(void *this)\n{\n unsigned __int64 v1; // rtt\n __int64 v3; // [esp+0h] [ebp-8h]\n\n v3 = TcmGetTimeConstant(); /*0xffe2e149*/\n LODWORD(v1) = v3; /*0xffe2e162*/\n HIDWORD(v1) = HIDWORD(v3) % 0xF4240; /*0xffe2e162*/\n return TcmDelayCycles(v1 / 0xF4240); /*0xffe2e16c*/\n}","refs":[{"addr":"0xffe2e614","name":"TcmGetTimeConstant"},{"addr":"0xffe2e51a","name":"TcmDelayCycles"}]} + n167772160 = 167772160; + v7 = -16128; + n1870659584 = 1870659584; + v0 = TcmFifoTransmit((int)TcmBaseRegister, (int)&v7, 0xAu, (int)v6, 10); + v1 = TcmCheckResponse(v0, v6); + v2 = v1; + if (v1) { + TcmDebugPrint(0x80000000, "Tcm Physical enable error, returned %r\n", v1); + } else { + v3 = TcmSetPhysicalPresence(v5, 0); + v2 = v3; + if (v3) + TcmDebugPrint(0x80000000, "Tcm Set activate error, returned %r\n", v3); + } + return v2; +} -{"addr":"0xffe2e170","code":"int TcmWaitForStatusBits(_BYTE *a1, unsigned __int8 n0x40, unsigned __int8 n8)\n{\n int v5; // esi\n\n v5 = 0; /*0xffe2e177*/\n while ( (n0x40 & *a1) != n0x40 || (*a1 & n8) != 0 ) /*0xffe2e187*/\n {\n TcmMicroDelay(a1); /*0xffe2e189*/\n if ( (unsigned int)++v5 >= 0xC350 ) /*0xffe2e195*/\n return 1; /*0xffe2e19d*/\n }\n return 0; /*0xffe2e19a*/\n}","refs":[{"addr":"0xffe2e138","name":"TcmMicroDelay"}]} +int __thiscall TcmPhysicalSetDeactivated(void *this) +{ + int v1; + int v2; + int v3; -{"addr":"0xffe2e1a2","code":"int TcmReadStatusRegister(unsigned __int8 a1, _WORD *p_i)\n{\n int v4; // esi\n int v5; // edi\n unsigned __int8 v6; // dl\n bool v7; // zf\n void *v8; // ecx\n\n if ( !p_i ) /*0xffe2e1a7*/\n return 2; /*0xffe2e1ab*/\n v4 = 0; /*0xffe2e1b3*/\n v5 = a1 << 12; /*0xffe2e1b5*/\n while ( 1 ) /*0xffe2e1b8*/\n {\n v6 = *(_BYTE *)(v5 - 19660775); /*0xffe2e1b8*/\n v8 = (void *)(*(unsigned __int8 *)(v5 - 19660774) << 8); /*0xffe2e1cc*/\n v7 = v6 + (_WORD)v8 == 0; /*0xffe2e1d2*/\n LOWORD(v8) = v6 + (_WORD)v8; /*0xffe2e1d2*/\n *p_i = (_WORD)v8; /*0xffe2e1d5*/\n if ( !v7 ) /*0xffe2e1d8*/\n break; /*0xffe2e1d8*/\n TcmMicroDelay(v8); /*0xffe2e1da*/\n if ( (unsigned int)++v4 >= 0xC350 ) /*0xffe2e1e6*/\n return 1; /*0xffe2e1eb*/\n }\n return 0; /*0xffe2e1ac*/\n}","refs":[{"addr":"0xffe2e138","name":"TcmMicroDelay"}]} + v1 = TcmSetPhysicalPresence((int)this, 1); + v2 = v1; + if (v1) { + TcmDebugPrint(0x80000000, "Tcm Set deactivate error, returned %r\n", v1); + } else { + v3 = TcmSetDeactivated(); + v2 = v3; + if (v3) + TcmDebugPrint(0x80000000, "Tcm Physical disable error, returned %r\n", v3); + } + return v2; +} -{"addr":"0xffe2e1f3","code":"int TcmSetCommandReady(unsigned __int8 a1)\n{\n _BYTE *v2; // [esp-4h] [ebp-4h]\n\n v2 = (_BYTE *)((a1 << 12) - 19660776); /*0xffe2e201*/\n *v2 = 64; /*0xffe2e204*/\n return TcmWaitForStatusBits(v2, 0x40u, 0); /*0xffe2e20e*/\n}","refs":[{"addr":"0xffe2e170","name":"TcmWaitForStatusBits"}]} +int TcmForceClear() +{ + int v0; + int v1; + int v2; + _WORD v4[6]; + __int16 v5; + int n167772160; + int n1568669696; -{"addr":"0xffe2e20f","code":"int TcmFifoIO(unsigned __int8 a1, int a2, unsigned int a3, int a4, unsigned int *a5)\n{\n int result; // eax\n int v6; // ebp\n _BYTE *v7; // ecx\n char v8; // al\n unsigned __int8 v9; // bl\n unsigned int v10; // esi\n int i; // ecx\n char v12; // al\n int n4_1; // esi\n unsigned int n0xA; // edi\n int i_2; // ebx\n unsigned int n0xA_1; // ebp\n int n4; // [esp-14h] [ebp-2Ch]\n int i_1; // [esp+4h] [ebp-14h] BYREF\n int v20; // [esp+8h] [ebp-10h]\n unsigned int dst_; // [esp+Ch] [ebp-Ch] BYREF\n int v22; // [esp+10h] [ebp-8h]\n _BYTE *v23; // [esp+14h] [ebp-4h]\n\n v20 = a2; /*0xffe2e217*/\n if ( MEMORY[0xFED40000] == 0xFF ) /*0xffe2e223*/\n return 3; /*0xffe2e228*/\n v6 = a1 << 12; /*0xffe2e231*/\n v22 = v6; /*0xffe2e234*/\n v7 = (_BYTE *)(v6 - 19660800); /*0xffe2e238*/\n v8 = *(_BYTE *)(v6 - 19660800); /*0xffe2e23e*/\n v23 = (_BYTE *)(v6 - 19660800); /*0xffe2e240*/\n if ( v8 == -1 ) /*0xffe2e246*/\n return 6; /*0xffe2e24b*/\n *v7 = 2; /*0xffe2e255*/\n result = TcmWaitForStatusBits(v7, 0xA0u, 0); /*0xffe2e258*/\n if ( !result ) /*0xffe2e261*/\n {\n v9 = a1; /*0xffe2e268*/\n result = TcmSetCommandReady(a1); /*0xffe2e26e*/\n if ( !result ) /*0xffe2e275*/\n {\n v10 = 0; /*0xffe2e281*/\n if ( a3 ) /*0xffe2e285*/\n {\n while ( !TcmReadStatusRegister(a1, &i_1) ) /*0xffe2e294*/\n {\n for ( i = i_1; (_WORD)i; i_1 = i ) /*0xffe2e29a*/\n {\n if ( v10 >= a3 ) /*0xffe2e2a2*/\n goto LABEL_14; /*0xffe2e2a2*/\n v12 = *(_BYTE *)(v10 + v20); /*0xffe2e2a8*/\n ++v10; /*0xffe2e2ab*/\n i += 0xFFFF; /*0xffe2e2ac*/\n *(_BYTE *)(v6 - 19660764) = v12; /*0xffe2e2b2*/\n }\n if ( v10 >= a3 ) /*0xffe2e2c3*/\n goto LABEL_14; /*0xffe2e2c3*/\n }\n goto LABEL_36; /*0xffe2e294*/\n }\nLABEL_14:\n if ( TcmWaitForStatusBits((_BYTE *)(v6 - 19660776), 0x80u, 8u) ) /*0xffe2e2d2*/\n {\n n4 = 4; /*0xffe2e2dd*/\n }\n else\n {\n *(_BYTE *)(v6 - 19660776) = 32; /*0xffe2e2ea*/\n if ( TcmWaitForStatusBits((_BYTE *)(v6 - 19660776), 0x90u, 0) ) /*0xffe2e2ef*/\n goto LABEL_36; /*0xffe2e2ef*/\n n0xA = 0; /*0xffe2e2fe*/\n i_1 = 0; /*0xffe2e300*/\n while ( 2 ) /*0xffe2e315*/\n {\n n4_1 = TcmReadStatusRegister(v9, &i_1); /*0xffe2e315*/\n if ( n4_1 ) /*0xffe2e319*/\n {\nLABEL_36:\n n4_1 = 1; /*0xffe2e3e9*/\n goto LABEL_37; /*0xffe2e3eb*/\n }\n LOWORD(i_2) = i_1; /*0xffe2e31f*/\n while ( (_WORD)i_2 ) /*0xffe2e32a*/\n {\n i_2 = i_1; /*0xffe2e332*/\n *(_BYTE *)(n0xA + a4) = *(_BYTE *)(v6 - 19660764); /*0xffe2e336*/\n if ( ++n0xA == 10 ) /*0xffe2e33d*/\n goto LABEL_26; /*0xffe2e33d*/\n i_2 += 0xFFFF; /*0xffe2e33f*/\n i_1 = i_2; /*0xffe2e345*/\n }\n if ( n0xA < 0xA ) /*0xffe2e34e*/\n {\n v9 = a1; /*0xffe2e306*/\n continue; /*0xffe2e306*/\n }\n break;\n }\nLABEL_26:\n TcmMemoryCopy((char *)&dst_, (char *)(a4 + 2), 4u); /*0xffe2e350*/\n n0xA_1 = (((dst_ << 16) | dst_ & 0xFF00) << 8) | ((HIWORD(dst_) | dst_ & 0xFF0000) >> 8); /*0xffe2e384*/\n if ( *a5 >= n0xA_1 ) /*0xffe2e38c*/\n {\n *a5 = n0xA_1; /*0xffe2e395*/\n if ( n0xA < n0xA_1 ) /*0xffe2e399*/\n {\n while ( !(_WORD)i_2 ) /*0xffe2e39e*/\n {\nLABEL_32:\n n4_1 = TcmReadStatusRegister(a1, &i_1); /*0xffe2e3c8*/\n if ( n4_1 ) /*0xffe2e3d9*/\n goto LABEL_36; /*0xffe2e3d9*/\n if ( n0xA >= n0xA_1 ) /*0xffe2e3dd*/\n goto LABEL_37; /*0xffe2e3dd*/\n LOWORD(i_2) = i_1; /*0xffe2e3df*/\n }\n while ( 1 ) /*0xffe2e3ae*/\n {\n *(_BYTE *)(n0xA + a4) = *(_BYTE *)(v22 - 19660764); /*0xffe2e3ae*/\n if ( ++n0xA == n0xA_1 ) /*0xffe2e3b4*/\n break; /*0xffe2e3b4*/\n i_1 += 0xFFFF; /*0xffe2e3bf*/\n if ( !(_WORD)i_1 ) /*0xffe2e3c6*/\n goto LABEL_32; /*0xffe2e3c6*/\n }\n n4_1 = 0; /*0xffe2e3e5*/\n }\n goto LABEL_37; /*0xffe2e3e7*/\n }\n n4 = 5; /*0xffe2e38e*/\n }\n n4_1 = n4; /*0xffe2e2df*/\nLABEL_37:\n TcmSetCommandReady(a1); /*0xffe2e3ec*/\n *v23 = 32; /*0xffe2e3fa*/\n return n4_1; /*0xffe2e3fd*/\n }\n }\n return result; /*0xffe2e402*/\n}","refs":[{"addr":"0xffe2e170","name":"TcmWaitForStatusBits"},{"addr":"0xffe2e1f3","name":"TcmSetCommandReady"},{"addr":"0xffe2e1a2","name":"TcmReadStatusRegister"},{"addr":"0xffe2e432","name":"TcmMemoryCopy"}]} + n167772160 = 167772160; + v5 = -16128; + n1568669696 = 1568669696; + v0 = TcmFifoTransmit((int)TcmBaseRegister, (int)&v5, 0xAu, (int)v4, 10); + v1 = TcmCheckResponse(v0, v4); + v2 = v1; + if (v1) + TcmDebugPrint(0x80000000, "Tcm Force clear error, returned %r\n", v1); + return v2; +} -{"addr":"0xffe2e406","code":"int TcmFifoTransmit(int a1, int a2, unsigned int a3, int a4, int a5)\n{\n return TcmFifoIO((unsigned int)(a1 + 19660800) >> 12, a2, a3, a4, (unsigned int *)&a5); /*0xffe2e430*/\n}","refs":[{"addr":"0xffe2e20f","name":"TcmFifoIO"}]} +int TcmGetFlags(bool *a1, bool *a2, bool *a3) +{ + int v3; + int v4; + bool v6; + int v7; + _BYTE v8[23]; + char v9; -{"addr":"0xffe2e432","code":"char *TcmMemoryCopy(char *dst, char *src, unsigned int n32)\n{\n int v5; // eax\n int v6; // eax\n\n if ( n32 - 1 > -1 - (int)dst ) /*0xffe2e448*/\n {\n v5 = TcmGetPeiServices(); /*0xffe2e44a*/\n if ( v5 ) /*0xffe2e451*/\n (*(void ( **)(const char *, int, const char *))(v5 + 4))( /*0xffe2e45f*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\CopyMemWrapper.c\",\n 56,\n \"(Length - 1) <= (0xFFFFFFFF - (UINTN)DestinationBuffer)\");\n }\n if ( n32 - 1 > -1 - (int)src ) /*0xffe2e469*/\n {\n v6 = TcmGetPeiServices(); /*0xffe2e46b*/\n if ( v6 ) /*0xffe2e472*/\n (*(void ( **)(const char *, int, const char *))(v6 + 4))( /*0xffe2e480*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\CopyMemWrapper.c\",\n 57,\n \"(Length - 1) <= (0xFFFFFFFF - (UINTN)SourceBuffer)\");\n }\n if ( dst == src ) /*0xffe2e488*/\n return dst; /*0xffe2e48a*/\n else\n return internal_memcpy(dst, src, n32); /*0xffe2e494*/\n}","refs":[{"addr":"0xffe2e4a1","name":"TcmGetPeiServices"},{"addr":"0xffe2e950","name":"aEHsMdepkgLibra","string":"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c"},{"addr":"0xffe2e918","name":"aLength10xfffff","string":"(Length - 1) <= (0xFFFFFFFF - (UINTN)DestinationBuffer)"},{"addr":"0xffe2e98c","name":"aLength10xfffff_0","string":"(Length - 1) <= (0xFFFFFFFF - (UINTN)SourceBuffer)"},{"addr":"0xffe2d800","name":"internal_memcpy"}]} + v3 = TcmBuildCommandPacket(4u, 0x108u, 17, (int)v8); + v4 = v3; + if (v3) { + TcmDebugPrint(0x80000000, "Tcm Get Pflag error, returned %r\n", v3); + return v4; + } + v6 = v8[4] == 0; + *a1 = v8[2] == 0; + *a2 = v6; + v7 = TcmBuildCommandPacket(5u, 0x111u, 1, (int)&v9); + v4 = v7; + if (v7) { + TcmDebugPrint(0x80000000, "Tcm Get Vflag error, returned %r\n", v7); + return v4; + } + *a3 = v9 != 0; + return 0; +} -{"addr":"0xffe2e4a1","code":"int TcmGetPeiServices()\n{\n int v0; // eax\n _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF\n int v3; // [esp+4h] [ebp-4h] BYREF\n\n v0 = TcmGetPeiServicesFromTable(); /*0xffe2e4a6*/\n if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)v0 + 32))(v0, &unk_FFE2EC80, 0, v2, &v3) >= 0 ) /*0xffe2e4c5*/\n return v3; /*0xffe2e4cb*/\n else\n return 0; /*0xffe2e4c7*/\n}","refs":[{"addr":"0xffe2e65b","name":"TcmGetPeiServicesFromTable"},{"addr":"0xffe2ec80","name":"unk_FFE2EC80"}]} +int TcmCheckResponse(int a1, _WORD *a2) +{ + if (!a1 && *a2 != 0xC400) { + TcmDebugPrint(0x80000000, "Tcm no response.\n"); + return -2147483632; + } + return a1; +} -{"addr":"0xffe2e4d2","code":"int TcmDebugPrint(int a1, const char *a2, ...)\n{\n int result; // eax\n int ( **v3)(int, const char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a2);\n result = TcmGetPeiServices(); /*0xffe2e4d3*/\n v3 = (int ( **)(int, const char *, char *))result; /*0xffe2e4d8*/\n if ( result ) /*0xffe2e4dc*/\n {\n result = TcmGetTpmDebugLevel(); /*0xffe2e4de*/\n if ( (result & a1) != 0 ) /*0xffe2e4e9*/\n return (*v3)(a1, a2, (char *)va); /*0xffe2e4f5*/\n }\n return result; /*0xffe2e4fa*/\n}","refs":[{"addr":"0xffe2e4a1","name":"TcmGetPeiServices"},{"addr":"0xffe2e569","name":"TcmGetTpmDebugLevel"}]} +int TcmSm3CompressionFunction(_DWORD *dst, _DWORD *a2, int *this) +{ + int n2043430169; + int v4; + int v5; + int v6; + int v7; + int n16; + int v9; + int v10; + int v11; + int v12; + _DWORD *v13; + int v14; + int v15; + int v16; + _DWORD *v17; + int v18; + int v19; + int v20; + int v22; + int v23; + int v24; + int v27; + int n16_1; + int v29; + int v30; + int v31; + int v32; -{"addr":"0xffe2e4fc","code":"int TcmPeiServicesAssert(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n int PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = TcmGetPeiServices(); /*0xffe2e502*/\n if ( result ) /*0xffe2e509*/\n return (*(int ( **)(int, int, int))(result + 4))( /*0xffe2e511*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe2e517*/\n}","refs":[{"addr":"0xffe2e4a1","name":"TcmGetPeiServices"}]} + n2043430169 = 2043430169; + v4 = *this; + v5 = *(this + 2); + v6 = *(this + 4); + v31 = *(this + 3); + v23 = *(this + 5); + v24 = *(this + 6); + v7 = *(this + 1); + v32 = *(this + 7); + n16 = 0; + v22 = *this; + v27 = v5; + n16_1 = 0; + while (1) { + if (n16) + n2043430169 = n16 == 16 ? -1651869049 : __ROL4__(n2043430169, 1); + else + n2043430169 = 2043430169; + v9 = __ROL4__(v4, 12); + v10 = __ROL4__(n2043430169 + v9 + v6, 7); + v11 = v10 ^ v9; + v29 = v10; + if (n16 > 15) { + v12 = v5 & v7 | v22 & (v5 | v7); + n16 = n16_1; + } else { + v12 = v5 ^ v7 ^ v22; + } + v13 = a2++; + v14 = v31 + v11 + v12 + *v13; + if (n16 > 15) { + v16 = v23 & v6 | v24 & ~v6; + v15 = v24; + } else { + v15 = v24; + v16 = v24 ^ v23 ^ v6; + } + v17 = dst++; + v18 = v32 + v29 + v16 + *v17; + v32 = v15; + v24 = __ROR4__(v23, 13); + v23 = v6; + v31 = v27; + v19 = v7; + v7 = v22; + v6 = v18 ^ __ROL4__(v18, 9) ^ __ROR4__(v18, 15); + v20 = __ROL4__(v19, 9); + v4 = v14; + n16 = n16_1 + 1; + v27 = v20; + v30 = v22; + v22 = v14; + n16_1 = n16; + if (n16 > 63) + break; + v5 = v20; + } + *this ^= v14; + *(this + 1) ^= v30; + *(this + 5) ^= v23; + *(this + 2) ^= v20; + *(this + 4) ^= v6; + *(this + 3) ^= v31; + *(this + 6) ^= v24; + *(this + 7) ^= v32; + return v24; +} -{"addr":"0xffe2e51a","code":"unsigned int TcmDelayCycles(unsigned int a1)\n{\n unsigned int v1; // esi\n unsigned int n0x400000; // edi\n unsigned __int32 v3; // ebx\n unsigned int result; // eax\n\n v1 = a1 >> 22; /*0xffe2e527*/\n n0x400000 = a1 & 0x3FFFFF; /*0xffe2e52a*/\n do /*0xffe2e562*/\n {\n v3 = n0x400000 + (TcmIoRead32(0x508u) & 0xFFFFFF); /*0xffe2e53f*/\n n0x400000 = 0x400000; /*0xffe2e541*/\n while ( ((v3 - TcmIoRead32(0x508u)) & 0x800000) == 0 ) /*0xffe2e55b*/\n _mm_pause(); /*0xffe2e548*/\n result = v1--; /*0xffe2e55d*/\n }\n while ( result ); /*0xffe2e562*/\n return result; /*0xffe2e564*/\n}","refs":[{"addr":"0xffe2e5b8","name":"TcmIoRead32"}]} +char TcmSm3WordSwap(int this, unsigned int n0x40, int thisa) +{ + unsigned int v3; + char *v4; + char *v5; + char v6; + char result; + char v8; -{"addr":"0xffe2e569","code":"int TcmGetTpmDebugLevel()\n{\n unsigned __int8 v0; // al\n char n3; // al\n char n3_1; // cl\n\n v0 = __inbyte(0x70u); /*0xffe2e56f*/\n __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe2e574*/\n n3 = __inbyte(0x71u); /*0xffe2e57b*/\n n3_1 = n3; /*0xffe2e57c*/\n if ( (unsigned __int8)n3 <= 3u ) /*0xffe2e581*/\n {\nLABEL_4:\n if ( !n3_1 ) /*0xffe2e59c*/\n return 0; /*0xffe2e59c*/\n goto LABEL_5; /*0xffe2e59c*/\n }\n n3_1 = n3; /*0xffe2e583*/\n if ( !n3 ) /*0xffe2e58b*/\n {\n n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe2e597*/\n goto LABEL_4; /*0xffe2e597*/\n }\nLABEL_5:\n if ( n3_1 != -1 )\n return n3_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe2e5b4*/\n}","refs":[{"addr":"0xffe2ece0","name":"n3"}]} + v3 = n0x40 >> 2; + if (v3) { + v4 = (char *)(thisa + 1); + v5 = (char *)(this + 3); + do { + v6 = *(v4 - 1); + *(v4 - 1) = *v5; + result = *(v5 - 1); + *v5 = v6; + v5 += 4; + v8 = *v4; + *v4 = result; + v4 += 4; + *(v4 - 3) = v8; + --v3; + } while (v3); + } + return result; +} -{"addr":"0xffe2e5b8","code":"unsigned __int32 __thiscall TcmIoRead32(unsigned __int16 n1288)\n{\n int v2; // eax\n\n if ( (n1288 & 3) != 0 ) /*0xffe2e5be*/\n {\n v2 = TcmGetPeiServices(); /*0xffe2e5c0*/\n if ( v2 ) /*0xffe2e5c7*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe2e5d8*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLibMsc.c\",\n 193,\n \"(Port & 3) == 0\");\n }\n return __indword(n1288); /*0xffe2e5e2*/\n}","refs":[{"addr":"0xffe2e4a1","name":"TcmGetPeiServices"},{"addr":"0xffe2e9c0","name":"aEHsMdepkgLibra_0","string":"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c"},{"addr":"0xffe2e9f4","name":"aPort30","string":"(Port & 3) == 0"}]} +int __thiscall TcmSm3ProcessBlock(int *this) +{ + int *dst_1; + int n64; + _DWORD *dst_2; + int n52; + int v6; + int v7; + int v8; + int v9; + _DWORD dst[68]; + _DWORD v13[64]; -{"addr":"0xffe2e614","code":"__int64 TcmGetTimeConstant()\n{\n return 107386350; /*0xffe2e63a*/\n}"} + dst_1 = this + 10; + n64 = 64; + TcmSm3WordSwap((int)(this + 10), 0x40u, (int)(this + 10)); + qmemcpy(dst, dst_1, 0x40u); + dst_2 = dst; + n52 = 52; + do { + v6 = dst_2[3]; + v7 = *dst_2 ^ dst_2[7] ^ __ROL4__(dst_2[13], 15); + ++dst_2; + dst_2[15] = v7 ^ dst_2[9] ^ __ROR4__(v7, 9) ^ __ROL4__(v7, 15) ^ __ROL4__(v6, 7); + --n52; + } while (n52); + v8 = 0; + do { + v9 = dst[v8 + 4]; + ++v8; + dst[v8 + 67] = dst[v8 - 1] ^ v9; + --n64; + } while (n64); + return TcmSm3CompressionFunction(dst, v13, this); +} -{"addr":"0xffe2e65b","code":"int TcmGetPeiServicesFromTable()\n{\n int v0; // esi\n _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF\n int v3; // [esp+6h] [ebp-6h]\n\n TcmReadIdtr(v2); /*0xffe2e664*/\n v0 = *(_DWORD *)(v3 - 4); /*0xffe2e66c*/\n if ( !v0 ) /*0xffe2e671*/\n TcmPeiServicesAssert( /*0xffe2e680*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n (int)\"PeiServices != ((void *) 0)\");\n return v0; /*0xffe2e688*/\n}","refs":[{"addr":"0xffe2e68d","name":"TcmReadIdtr"},{"addr":"0xffe2e4fc","name":"TcmPeiServicesAssert"},{"addr":"0xffe2ea68","name":"aEHsMdepkgLibra_1","string":"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c"},{"addr":"0xffe2ea48","name":"aPeiservicesVoi","string":"PeiServices != ((void *) 0)"}]} +char __thiscall TcmSm3Finalize(int this) +{ + int v2; + unsigned int n0x40; -{"addr":"0xffe2e68d","code":"void *__thiscall TcmReadIdtr(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe2e693*/\n TcmPeiServicesAssert((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, (int)\"Idtr != ((void *) 0)\"); /*0xffe2e6a2*/\n this_1 = this; /*0xffe2e6a8*/\n __sidt(this); /*0xffe2e6ab*/\n return this_1; /*0xffe2e6af*/\n}","refs":[{"addr":"0xffe2e4fc","name":"TcmPeiServicesAssert"},{"addr":"0xffe2ead0","name":"aEHsMdepkgLibra_2","string":"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c"},{"addr":"0xffe2eab8","name":"aIdtrVoid0","string":"Idtr != ((void *) 0)"}]} + v2 = *(_DWORD *)(this + 36); + *(_DWORD *)(this + 32) += 8 * v2; + *(_BYTE *)(v2 + this + 40) = 0x80; + n0x40 = ++*(_DWORD *)(this + 36); + if (n0x40 > 0x38) { + while (n0x40 < 0x40) { + *(_BYTE *)(this + n0x40 + 40) = 0; + n0x40 = ++*(_DWORD *)(this + 36); + } + TcmSm3ProcessBlock((int *)this); + *(_DWORD *)(this + 36) = 0; + } + while (*(_DWORD *)(this + 36) < 0x38u) + *(_BYTE *)(this + (*(_DWORD *)(this + 36))++ + 40) = 0; + *(_DWORD *)(this + 96) = 0; + *(_BYTE *)(this + 103) = *(_BYTE *)(this + 32); + *(_BYTE *)(this + 102) = BYTE1(*(_DWORD *)(this + 32)); + *(_BYTE *)(this + 101) = *(_BYTE *)(this + 34); + *(_BYTE *)(this + 100) = *(_BYTE *)(this + 35); + TcmSm3ProcessBlock((int *)this); + return TcmSm3WordSwap(this, 0x20u, this); +} -{"addr":"0xffe2e6b0","code":"int __thiscall TcmGetPcdBaseAddress(void *this)\n{\n int ( **v1)(int); // eax\n\n v1 = (int ( **)(int))TcmGetPcdInterface(this); /*0xffe2e6b0*/\n return v1[4](5); /*0xffe2e6bb*/\n}","refs":[{"addr":"0xffe2e6cd","name":"TcmGetPcdInterface"}]} +char TcmSm3(_BYTE *a1, int a2) +{ + int n64; + int v6[8]; + int v7; + int n64_1; + _BYTE v9[64]; -{"addr":"0xffe2e6bc","code":"int __thiscall TcmSetLocality(void *this)\n{\n int v1; // ebx\n int v2; // eax\n\n v1 = TcmGetPcdBaseAddress(this) + 1024064; /*0xffe2e5e5*/\n if ( (v1 & 1) != 0 ) /*0xffe2e5ea*/\n {\n v2 = TcmGetPeiServices(); /*0xffe2e5ec*/\n if ( v2 ) /*0xffe2e5f3*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe2e604*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLib.c\",\n 183,\n \"(Address & 1) == 0\");\n }\n *(_WORD *)v1 = 1280; /*0xffe2e60f*/\n return 1280; /*0xffe2e613*/\n}","refs":[{"addr":"0xffe2e6b0","name":"TcmGetPcdBaseAddress"},{"addr":"0xffe2e4a1","name":"TcmGetPeiServices"},{"addr":"0xffe2ea04","name":"aEHsMdepkgLibra_3","string":"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c"},{"addr":"0xffe2ea34","name":"aAddress10","string":"(Address & 1) == 0"}]} + v7 = 0; + v6[0] = 1937774191; + v6[1] = 1226093241; + v6[2] = 388252375; + v6[3] = -628488704; + v6[4] = -1452330820; + v6[5] = 372324522; + v6[6] = -477237683; + v6[7] = -1325724082; +LABEL_4: + n64 = 0; + n64_1 = 0; + while (a2) { + --a2; + v9[n64] = *a1++; + n64 = n64_1 + 1; + n64_1 = n64; + if (n64 == 64) { + TcmSm3ProcessBlock(v6); + v7 += 512; + goto LABEL_4; + } + } + return TcmSm3Finalize((int)v6); +} -{"addr":"0xffe2e6cd","code":"void *__thiscall TcmGetPcdInterface(void *this)\n{\n int v1; // eax\n int v2; // eax\n int v3; // eax\n void *this_1; // [esp+0h] [ebp-4h]\n\n this_1 = this; /*0xffe2e6d0*/\n v1 = TcmGetPeiServicesFromTable(); /*0xffe2e6d1*/\n v2 = (*(int (__stdcall **)(int))(*(_DWORD *)v1 + 32))(v1); /*0xffe2e6e6*/\n if ( v2 < 0 ) /*0xffe2e6ee*/\n {\n TcmDebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v2); /*0xffe2e6fb*/\n v3 = TcmGetPeiServices(); /*0xffe2e703*/\n if ( v3 ) /*0xffe2e70a*/\n (*(void ( **)(const char *, int, const char *))(v3 + 4))( /*0xffe2e718*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiPcdLib\\\\PeiPcdLib.c\",\n 49,\n \"!EFI_ERROR (Status)\");\n }\n return this_1; /*0xffe2e723*/\n}","refs":[{"addr":"0xffe2e65b","name":"TcmGetPeiServicesFromTable"},{"addr":"0xffe2e4d2","name":"TcmDebugPrint"},{"addr":"0xffe2e740","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe2e4a1","name":"TcmGetPeiServices"},{"addr":"0xffe2eafc","name":"aEHsMdepkgLibra_4","string":"e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c"},{"addr":"0xffe2e764","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"}]} +int TcmPcrExtend(int a1, _BYTE *a2, int a3, char *src, __int16 a5) +{ + int v5; + __int16 v7; + int n738197504; + int n343932928; + __int16 v10; + char dst[32]; + _WORD v12[6]; + TcmSm3(a2, a3); + n738197504 = 738197504; + v7 = -16128; + n343932928 = 343932928; + v10 = a5; + TcmMemoryCopy(dst, src, 0x20u); + v5 = TcmFifoTransmit(a1, (int)&v7, 0x2Cu, (int)v12, 10); + return TcmCheckResponse(v5, v12); +} + +int __thiscall TcmMicroDelay(void *this) +{ + unsigned __int64 v1; + __int64 v3; + + v3 = TcmGetTimeConstant(); + LODWORD(v1) = v3; + HIDWORD(v1) = HIDWORD(v3) % 0xF4240; + return TcmDelayCycles(v1 / 0xF4240); +} + +int TcmWaitForStatusBits(_BYTE *a1, unsigned __int8 n0x40, unsigned __int8 n8) +{ + int v5; + + v5 = 0; + while ((n0x40 & *a1) != n0x40 || (*a1 & n8) != 0) { + TcmMicroDelay(a1); + if ((unsigned int)++v5 >= 0xC350) + return 1; + } + return 0; +} + +int TcmReadStatusRegister(unsigned __int8 a1, _WORD *p_i) +{ + int v4; + int v5; + unsigned __int8 v6; + bool v7; + void *v8; + + if (!p_i) + return 2; + v4 = 0; + v5 = a1 << 12; + while (1) { + v6 = *(_BYTE *)(v5 - 19660775); + v8 = (void *)(*(unsigned __int8 *)(v5 - 19660774) << 8); + v7 = v6 + (_WORD)v8 == 0; + LOWORD(v8) = v6 + (_WORD)v8; + *p_i = (_WORD)v8; + if (!v7) + break; + TcmMicroDelay(v8); + if ((unsigned int)++v4 >= 0xC350) + return 1; + } + return 0; +} + +int TcmSetCommandReady(unsigned __int8 a1) +{ + _BYTE *v2; + + v2 = (_BYTE *)((a1 << 12) - 19660776); + *v2 = 64; + return TcmWaitForStatusBits(v2, 0x40u, 0); +} + +int TcmFifoIO(unsigned __int8 a1, int a2, unsigned int a3, int a4, unsigned int *a5) +{ + int result; + int v6; + _BYTE *v7; + char v8; + unsigned __int8 v9; + unsigned int v10; + int i; + char v12; + int n4_1; + unsigned int n0xA; + int i_2; + unsigned int n0xA_1; + int n4; + int i_1; + int v20; + unsigned int dst_; + int v22; + _BYTE *v23; + + v20 = a2; + if (MEMORY[0xFED40000] == 0xFF) + return 3; + v6 = a1 << 12; + v22 = v6; + v7 = (_BYTE *)(v6 - 19660800); + v8 = *(_BYTE *)(v6 - 19660800); + v23 = (_BYTE *)(v6 - 19660800); + if (v8 == -1) + return 6; + *v7 = 2; + result = TcmWaitForStatusBits(v7, 0xA0u, 0); + if (!result) { + v9 = a1; + result = TcmSetCommandReady(a1); + if (!result) { + v10 = 0; + if (a3) { + while (!TcmReadStatusRegister(a1, &i_1)) { + for (i = i_1; (_WORD)i; i_1 = i) { + if (v10 >= a3) + goto LABEL_14; + v12 = *(_BYTE *)(v10 + v20); + ++v10; + i += 0xFFFF; + *(_BYTE *)(v6 - 19660764) = v12; + } + if (v10 >= a3) + goto LABEL_14; + } + goto LABEL_36; + } +LABEL_14: + if (TcmWaitForStatusBits((_BYTE *)(v6 - 19660776), 0x80u, 8u)) { + n4 = 4; + } else { + *(_BYTE *)(v6 - 19660776) = 32; + if (TcmWaitForStatusBits((_BYTE *)(v6 - 19660776), 0x90u, 0)) + goto LABEL_36; + n0xA = 0; + i_1 = 0; + while (2) { + n4_1 = TcmReadStatusRegister(v9, &i_1); + if (n4_1) { +LABEL_36: + n4_1 = 1; + goto LABEL_37; + } + LOWORD(i_2) = i_1; + while ((_WORD)i_2) { + i_2 = i_1; + *(_BYTE *)(n0xA + a4) = *(_BYTE *)(v6 - 19660764); + if (++n0xA == 10) + goto LABEL_26; + i_2 += 0xFFFF; + i_1 = i_2; + } + if (n0xA < 0xA) { + v9 = a1; + continue; + } + break; + } +LABEL_26: + TcmMemoryCopy((char *)&dst_, (char *)(a4 + 2), 4u); + n0xA_1 = (((dst_ << 16) | dst_ & 0xFF00) << 8) | ((HIWORD(dst_) | dst_ & 0xFF0000) >> 8); + if (*a5 >= n0xA_1) { + *a5 = n0xA_1; + if (n0xA < n0xA_1) { + while (!(_WORD)i_2) { +LABEL_32: + n4_1 = TcmReadStatusRegister(a1, &i_1); + if (n4_1) + goto LABEL_36; + if (n0xA >= n0xA_1) + goto LABEL_37; + LOWORD(i_2) = i_1; + } + while (1) { + *(_BYTE *)(n0xA + a4) = *(_BYTE *)(v22 - 19660764); + if (++n0xA == n0xA_1) + break; + i_1 += 0xFFFF; + if (!(_WORD)i_1) + goto LABEL_32; + } + n4_1 = 0; + } + goto LABEL_37; + } + n4 = 5; + } + n4_1 = n4; +LABEL_37: + TcmSetCommandReady(a1); + *v23 = 32; + return n4_1; + } + } + return result; +} + +int TcmFifoTransmit(int a1, int a2, unsigned int a3, int a4, int a5) +{ + return TcmFifoIO((unsigned int)(a1 + 19660800) >> 12, a2, a3, a4, (unsigned int *)&a5); +} + +char *TcmMemoryCopy(char *dst, char *src, unsigned int n32) +{ + int v5; + int v6; + + if (n32 - 1 > -1 - (int)dst) { + v5 = TcmGetPeiServices(); + if (v5) + (*(void (**)(const char *, int, const char *))(v5 + 4))("e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c", 56, "(Length - 1) <= (0xFFFFFFFF - (UINTN)DestinationBuffer)"); + } + if (n32 - 1 > -1 - (int)src) { + v6 = TcmGetPeiServices(); + if (v6) + (*(void (**)(const char *, int, const char *))(v6 + 4))("e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c", 57, "(Length - 1) <= (0xFFFFFFFF - (UINTN)SourceBuffer)"); + } + if (dst == src) + return dst; + return internal_memcpy(dst, src, n32); +} + +int TcmGetPeiServices() +{ + int v0; + _BYTE v2[4]; + int v3; + + v0 = TcmGetPeiServicesFromTable(); + if ((*(int (**)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)v0 + 32))(v0, &unk_FFE2EC80, 0, v2, &v3) >= 0) + return v3; + return 0; +} + +int TcmDebugPrint(int a1, const char *a2, ...) +{ + int result; + int (**v3)(int, const char *, char *); + va_list va; + + va_start(va, a2); + result = TcmGetPeiServices(); + v3 = (int (**)(int, const char *, char *))result; + if (result) { + result = TcmGetTpmDebugLevel(); + if ((result & a1) != 0) + return (*v3)(a1, a2, (char *)va); + } + return result; +} + +int TcmPeiServicesAssert(int e, int n48, int PeiServices) +{ + int result; + + result = TcmGetPeiServices(); + if (result) + return (*(int (**)(int, int, int))(result + 4))(e, n48, PeiServices); + return result; +} + +unsigned int TcmDelayCycles(unsigned int a1) +{ + unsigned int v1; + unsigned int n0x400000; + unsigned __int32 v3; + unsigned int result; + + v1 = a1 >> 22; + n0x400000 = a1 & 0x3FFFFF; + do { + v3 = n0x400000 + (TcmIoRead32(0x508u) & 0xFFFFFF); + n0x400000 = 0x400000; + while (((v3 - TcmIoRead32(0x508u)) & 0x800000) == 0) + _mm_pause(); + result = v1--; + } while (result); + return result; +} + +int TcmGetTpmDebugLevel() +{ + unsigned __int8 v0; + char n3; + char n3_1; + + v0 = __inbyte(0x70u); + __outbyte(0x70u, v0 & 0x80 | 0x4A); + n3 = __inbyte(0x71u); + n3_1 = n3; + if ((unsigned __int8)n3 <= 3u) { +LABEL_4: + if (!n3_1) + return 0; + goto LABEL_5; + } + n3_1 = n3; + if (!n3) { + n3_1 = MEMORY[0xFDAF0490] & 2 | 1; + goto LABEL_4; + } +LABEL_5: + if (n3_1 != -1) + return n3_1 != 1 ? -2147483578 : -2147483644; + return 0; +} + +unsigned __int32 __thiscall TcmIoRead32(unsigned __int16 n1288) +{ + int v2; + + if ((n1288 & 3) != 0) { + v2 = TcmGetPeiServices(); + if (v2) + (*(void (**)(const char *, int, const char *))(v2 + 4))("e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", 193, "(Port & 3) == 0"); + } + return __indword(n1288); +} + +__int64 TcmGetTimeConstant() +{ + return 107386350; +} + +int TcmGetPeiServicesFromTable() +{ + int v0; + _BYTE v2[2]; + int v3; + + TcmReadIdtr(v2); + v0 = *(_DWORD *)(v3 - 4); + if (!v0) + TcmPeiServicesAssert((int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c", 48, (int)"PeiServices != ((void *) 0)"); + return v0; +} + +void *__thiscall TcmReadIdtr(void *this) +{ + void *this_1; + + if (!this) + TcmPeiServicesAssert((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, (int)"Idtr != ((void *) 0)"); + this_1 = this; + __sidt(this); + return this_1; +} + +int __thiscall TcmGetPcdBaseAddress(void *this) +{ + int (**v1)(int); + + v1 = (int (**)(int))TcmGetPcdInterface(this); + return v1[4](5); +} + +int __thiscall TcmSetLocality(void *this) +{ + int v1; + int v2; + + v1 = TcmGetPcdBaseAddress(this) + 1024064; + if ((v1 & 1) != 0) { + v2 = TcmGetPeiServices(); + if (v2) + (*(void (**)(const char *, int, const char *))(v2 + 4))("e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", 183, "(Address & 1) == 0"); + } + *(_WORD *)v1 = 1280; + return 1280; +} + +void *__thiscall TcmGetPcdInterface(void *this) +{ + int v1; + int v2; + int v3; + void *this_1; + + this_1 = this; + v1 = TcmGetPeiServicesFromTable(); + v2 = (*(int (__stdcall **)(int))(*(_DWORD *)v1 + 32))(v1); + if (v2 < 0) { + TcmDebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v2); + v3 = TcmGetPeiServices(); + if (v3) + (*(void (**)(const char *, int, const char *))(v3 + 4))("e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c", 49, "!EFI_ERROR (Status)"); + } + return this_1; +} diff --git a/AmiModulePkg/TCG2/Common/TcgDxe/Tcg2Dxe/Tcg2Dxe.c b/AmiModulePkg/TCG2/Common/TcgDxe/Tcg2Dxe/Tcg2Dxe.c index c890cd1..d7f9780 100644 --- a/AmiModulePkg/TCG2/Common/TcgDxe/Tcg2Dxe/Tcg2Dxe.c +++ b/AmiModulePkg/TCG2/Common/TcgDxe/Tcg2Dxe/Tcg2Dxe.c @@ -75,7 +75,7 @@ static UINT32 mDefaultProvision; // 0x19B2 // =========================================================================== -// Debug Print (sub_9C8C) +// Debug Print // =========================================================================== // AMD platform debug output via IO port 0x70/0x71 (CMOS). // Checks CMOS index 0x4B bit for debug level. @@ -124,7 +124,7 @@ } // =========================================================================== -// Tcg2GetSpecVersion (sub_9B4) +// Tcg2GetSpecVersion // =========================================================================== // Returns byte at offset 6 from TPM2 protocol structure. @@ -143,7 +143,7 @@ } // =========================================================================== -// MorCheckAndClear (sub_D00) +// MorCheckAndClear // =========================================================================== // Reads MemoryOverwriteRequestControl variable. If MOR bit is set, // performs memory clear and reports. @@ -175,12 +175,12 @@ } // =========================================================================== -// TreeGetCapability (sub_1928) +// TreeGetCapability // =========================================================================== // Fills EFI_TCG2_PROTOCOL capabilities structure. // =========================================================================== -// TreeSetActivePcrs (sub_1820) +// TreeSetActivePcrs // =========================================================================== // Sets active PCR banks. Validates against supported banks. // Persists via AMITCGPPIVAR2 UEFI variable. @@ -220,7 +220,7 @@ } // =========================================================================== -// TreeGetResultOfSetActivePcrs (sub_1728) +// TreeGetResultOfSetActivePcrs // =========================================================================== // Checks result of a prior SetActivePcrs via AMITCGPPIVAR variable. @@ -268,7 +268,7 @@ } // =========================================================================== -// TreeGetEventLog (sub_1EEC) +// TreeGetEventLog // =========================================================================== // Returns event log location, last entry pointer, and truncated flag. // Checks TCG2 spec version and returns appropriate log. @@ -335,7 +335,7 @@ } // =========================================================================== -// Tpm20DxeAcpiUpdate (sub_7DA4) +// Tpm20DxeAcpiUpdate // =========================================================================== // Registered as a notification callback. // Locates DSDT, updates TPM device ASL objects. @@ -363,7 +363,7 @@ } // =========================================================================== -// TpmServFlagsLockCallback (sub_7B88) +// TpmServFlagsLockCallback // =========================================================================== // Called when gEdkiiVariableLockProtocolGuid is available. // Locks the TpmServFlags variable. @@ -390,7 +390,7 @@ } // =========================================================================== -// CopyTcgLog (sub_411C) +// CopyTcgLog // =========================================================================== // Copies the TCG event log from the PEI HOB into the allocated // DXE event log buffer. @@ -427,7 +427,7 @@ } // =========================================================================== -// InstallTrEEProtocol (sub_7ED8) +// InstallTrEEProtocol // =========================================================================== // Allocates event log buffers, installs TCG2 config table, // and registers the TrEE (TCG2) protocol. @@ -487,7 +487,7 @@ } // =========================================================================== -// TrEEUpdateTpmDeviceASL (sub_4324) +// TrEEUpdateTpmDeviceASL // =========================================================================== // Updates ACPI DSDT with TPM device ASL objects // (TCMF, TTDP, PPIV, TTPF). @@ -525,7 +525,7 @@ } // =========================================================================== -// LibGetDsdt (sub_FEAC) +// LibGetDsdt // =========================================================================== // Locate DSDT table in ACPI tables. // Searches RSDT/XSDT to find DSDT address. @@ -584,7 +584,7 @@ } // =========================================================================== -// DriverInit (sub_420) +// DriverInit // =========================================================================== // Standard UEFI driver init. Saves image handle, system table, // boot services, runtime services. Calls DxeServicesTableLib init @@ -620,7 +620,7 @@ } // =========================================================================== -// TreeDxeEntry (sub_8238) - Main Driver Entry +// TreeDxeEntry - Main Driver Entry // =========================================================================== // Flow: // 1. Locate TPM2 Device Protocol (gEfiTpm2DeviceProtocolGuid) @@ -686,7 +686,7 @@ } // Phase 4: Read TpmServFlags via RT->GetVariable - // (sub_7CA0 wrapper - retries if EFI_INVALID_PARAMETER) + // (wrapper - retries if EFI_INVALID_PARAMETER) // Phase 5: Lock TpmServFlags EFI_LOCK_PROTOCOL *VariableLock; @@ -834,7 +834,7 @@ } // =========================================================================== -// SecureBootSetupCheck (sub_43C) +// SecureBootSetupCheck // =========================================================================== // Reads SecureBootSetup and SetupMode variables to determine // secure boot state. Called before main entry during init. @@ -886,10 +886,10 @@ // =========================================================================== // Address range summary: // 0x000-0x2C0 HEADER (PE32+ headers) -// 0x2C0-0x3F4 Early init stubs (sub_2C0 through sub_3F0) +// 0x2C0-0x3F4 Early init stubs // 0x3F4 _ModuleEntryPoint -// 0x420 DriverInit (sub_420) -// 0x43C SecureBootSetupCheck (sub_43C) +// 0x420 DriverInit +// 0x43C SecureBootSetupCheck // 0x610 Tpm2SequenceComplete (SM3 variant) // 0x748 HashMultiAlg (combines all algorithm hashes) // 0xD00 MorCheckAndClear diff --git a/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.c b/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.c index 899e516..360d4aa 100644 --- a/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.c +++ b/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.c @@ -80,44 +80,44 @@ ::ImageHandle = ImageHandle; /*0x3e3*/ if ( !ImageHandle ) /*0x3f7*/ - sub_774( /*0x406*/ + AssertReport( /*0x406*/ (__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 51, (__int64)"gImageHandle != ((void *) 0)"); ::SystemTable = (__int64)SystemTable; /*0x40b*/ if ( !SystemTable ) /*0x415*/ - sub_774( /*0x424*/ + AssertReport( /*0x424*/ (__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 57, (__int64)"gST != ((void *) 0)"); BootServices = (__int64)SystemTable->BootServices; /*0x42d*/ if ( !BootServices ) /*0x437*/ - sub_774( /*0x446*/ + AssertReport( /*0x446*/ (__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 63, (__int64)"gBS != ((void *) 0)"); RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x44f*/ if ( !RuntimeServices ) /*0x459*/ - sub_774( /*0x46c*/ + AssertReport( /*0x46c*/ (__int64)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c", 47, (__int64)"gRT != ((void *) 0)"); - sub_7B4(ImageHandle); /*0x471*/ - v3 = sub_9EC(); /*0x476*/ + DxeGetHobList(ImageHandle); /*0x471*/ + v3 = GetPcdProtocol(); /*0x476*/ qword_1300 = (*(__int64 (__fastcall **)(__int64))(v3 + 32))(5); /*0x488*/ - if ( *(char *)sub_88C(1024068) >= 0 ) /*0x49a*/ + if ( *(char *)PciExpressLibAddress(1024068) >= 0 ) /*0x49a*/ { - v4 = (_WORD *)sub_88C(1024064); /*0x49f*/ - sub_988(v4); /*0x4a7*/ - v5 = (_BYTE *)sub_88C(1024068); /*0x4ae*/ + v4 = (_WORD *)PciExpressLibAddress(1024064); /*0x49f*/ + IoWrite16((UINTN)v4, 1280); /*0x4a7*/ + v5 = (_BYTE *)PciExpressLibAddress(1024068); /*0x4ae*/ *v5 |= 0x80u; /*0x4b8*/ } callerseflags_w = _getcallerseflags_w(); /*0x4bf*/ disable_w(); /*0x4c2*/ v7 = (callerseflags_w & 0x200) != 0; /*0x4d1*/ - v8 = sub_9BC(0x508u) & 0xFFFFFF; /*0x4db*/ + v8 = IoRead32(0x508u) & 0xFFFFFF; /*0x4db*/ _rdtsc_w(); /*0x4e1*/ - while ( ((v8 + 357 - sub_9BC(0x508u)) & 0x800000) == 0 ) /*0x501*/ + while ( ((v8 + 357 - IoRead32(0x508u)) & 0x800000) == 0 ) /*0x501*/ mm_pause_w(); /*0x4e8*/ _rdtsc_w(); /*0x503*/ if ( v7 ) /*0x50a*/ @@ -153,10 +153,10 @@ { v3 -= 24; /*0x55c*/ --v2; /*0x570*/ - if ( !sub_AE8(v3, (__int64)&qword_12C0, 16) ) /*0x573*/ + if ( !CompareMemWithAssert(v3, (__int64)&qword_12C0, 16) ) /*0x573*/ { v8 = *(__int16 **)(v3 + 16); /*0x58b*/ - if ( (sub_8C8(&v8, &v10) & 0x8000000000000000uLL) == 0LL ) /*0x598*/ + if ( (DevicePathFindProtocolNode(&v8, &v10) & 0x8000000000000000uLL) == 0LL ) /*0x598*/ break; /*0x598*/ } if ( !v2 ) /*0x5a1*/ @@ -175,14 +175,14 @@ if ( v5 >= 0 ) /*0x5d9*/ { if ( (*(__int64 (**)(void))(v9 + 24))() < 0 ) /*0x5eb*/ - sub_6EC(0x80000000LL, (__int64)"\n Possible ERROR Processing Ppi Request from O.S.\n"); /*0x5f6*/ + DebugPrint(0x80000000LL, (__int64)"\n Possible ERROR Processing Ppi Request from O.S.\n"); /*0x5f6*/ if ( (*(__int64 (**)(void))(v9 + 16))() < 0 ) /*0x606*/ - sub_6EC(0x80000000LL, (__int64)"\n Possible ERROR Processing Tcg Setup\n"); /*0x612*/ + DebugPrint(0x80000000LL, (__int64)"\n Possible ERROR Processing Tcg Setup\n"); /*0x612*/ if ( (*(__int64 (**)(void))(v9 + 8))() < 0 ) /*0x622*/ - sub_6EC(0x80000000LL, (__int64)"\n Possible ERROR Measuring PCI Option Roms\n"); /*0x62e*/ + DebugPrint(0x80000000LL, (__int64)"\n Possible ERROR Measuring PCI Option Roms\n"); /*0x62e*/ v6 = (*(__int64 (**)(void))(v9 + 32))(); /*0x63b*/ if ( v6 < 0 ) /*0x641*/ - sub_6EC(0x80000000LL, (__int64)"\n Possible ERROR process Tcg Ready to boot Callback\n"); /*0x64d*/ + DebugPrint(0x80000000LL, (__int64)"\n Possible ERROR process Tcg Ready to boot Callback\n"); /*0x64d*/ return v6; /*0x652*/ } return v1; /*0x658*/ @@ -236,7 +236,7 @@ va_list va; // [rsp+40h] [rbp+18h] BYREF va_start(va, Format); - v3 = sub_66C(); /*0x703*/ + v3 = GetDebugProtocol(); /*0x703*/ v4 = 0; /*0x708*/ v5 = (void (__fastcall **)(UINTN, const CHAR8 *, __int64 *))v3; /*0x70b*/ if ( v3 ) /*0x711*/ @@ -296,7 +296,7 @@ if ( *(_QWORD *)(SystemTable + 104) ) /*0x7e3*/ { v4 = 0; /*0x7e9*/ - while ( !sub_A78(ImageHandle, v4 + *(_QWORD *)(SystemTable + 112)) ) /*0x7f9*/ + while ( !GuidCompare(ImageHandle, v4 + *(_QWORD *)(SystemTable + 112)) ) /*0x7f9*/ { ++v3; /*0x7fb*/ v4 += 24; /*0x7fe*/ @@ -309,13 +309,13 @@ else { LABEL_6: - sub_6EC(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x808*/ - sub_774((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x836*/ + DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x808*/ + AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x836*/ result = qword_12F8; /*0x83b*/ } if ( !result ) /*0x845*/ { - sub_774((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x858*/ + AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x858*/ return qword_12F8; /*0x85d*/ } } @@ -361,7 +361,7 @@ if ( *v6 == -1 ) /*0x927*/ v6 = *a1; /*0x927*/ } - if ( *v6 == 4 && !sub_AE8(qword_12B0, (_BYTE *)v6 + 8, 16) ) /*0x942*/ + if ( *v6 == 4 && !CompareMemWithAssert(qword_12B0, (_BYTE *)v6 + 8, 16) ) /*0x942*/ { v3 = 0; /*0x950*/ *a2 = v6 + 12; /*0x952*/ @@ -454,26 +454,26 @@ if ( a1 == a2 ) /*0xb0d*/ return 0; /*0xb0f*/ if ( !a1 ) /*0xb19*/ - sub_774( /*0xb2c*/ + AssertReport( /*0xb2c*/ (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c", 60, (__int64)"DestinationBuffer != ((void *) 0)"); if ( !a2 ) /*0xb34*/ - sub_774( /*0xb47*/ + AssertReport( /*0xb47*/ (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c", 61, (__int64)"SourceBuffer != ((void *) 0)"); if ( n16 - 1 > (unsigned __int64)(-1LL - (_QWORD)a1) ) /*0xb5d*/ - sub_774( /*0xb70*/ + AssertReport( /*0xb70*/ (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c", 62, (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)"); if ( n16 - 1 > (unsigned __int64)(-1LL - (_QWORD)a2) ) /*0xb7b*/ - sub_774( /*0xb90*/ + AssertReport( /*0xb90*/ (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c", 63, (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)"); - return sub_330(a1, a2, n16); /*0xbb7*/ + return CompareMemInternal(a1, a2, n16); /*0xbb7*/ } @@ -486,4 +486,3 @@ AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0xbe1*/ return *Buffer; /*0xbe9*/ } - diff --git a/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.h b/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.h index 6e21482..808a7f5 100644 --- a/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.h +++ b/AmiModulePkg/TCG2/Common/TcgDxe/TcgDxe/TcgDxe.h @@ -259,6 +259,67 @@ int a4 ); +unsigned __int64 +EFIAPI +CompareMemInternal( + _BYTE *a1, + _BYTE *a2, + __int64 n16 +); + +__int64 +EFIAPI +GetDebugProtocol( + VOID +); + +__int64 +EFIAPI +DxeGetHobList( + __int64 ImageHandle +); + +__int64 +EFIAPI +PciExpressLibAddress( + __int64 n1024064 +); + +__int64 +EFIAPI +DevicePathFindProtocolNode( + __int16 **a1, + _QWORD *a2 +); + +UINT16 +EFIAPI +IoWrite16( + UINTN Port, + UINT16 Value +); + +__int64 +EFIAPI +GetPcdProtocol( + VOID +); + +bool +EFIAPI +GuidCompare( + __int64 ImageHandle, + __int64 a2 +); + +unsigned __int64 +EFIAPI +CompareMemWithAssert( + _BYTE *a1, + _BYTE *a2, + __int64 n16 +); + __int64 EFIAPI TcgLogEvent( @@ -322,6 +383,12 @@ __int64 a3 ); +UINT64 +EFIAPI +ReadUnaligned64( + const UINT64 *Buffer +); + void * EFIAPI CopyMem( @@ -428,7 +495,7 @@ void EFIAPI -nullsub_1( +NoOp( VOID ); @@ -436,7 +503,7 @@ EFIAPI CreateEvent( __int64 a1, - __int64 (__fastcall *sub_175C)(), + __int64 (__fastcall *NotifyFunction)(), __int64 a3, __int64 a4 ); @@ -644,4 +711,4 @@ EFI_STATUS_CODE_VALUE Value ); -#endif /* __TCGDXE_H__ */ \ No newline at end of file +#endif /* __TCGDXE_H__ */ diff --git a/AmiModulePkg/TCG2/Common/TcgPeiPlatform/TcgPeiplatform.c b/AmiModulePkg/TCG2/Common/TcgPeiPlatform/TcgPeiplatform.c index 2e5e513..ea99314 100644 --- a/AmiModulePkg/TCG2/Common/TcgPeiPlatform/TcgPeiplatform.c +++ b/AmiModulePkg/TCG2/Common/TcgPeiPlatform/TcgPeiplatform.c @@ -1,37 +1,291 @@ // -// TcgPeiplatform.efi - Full Decompilation -// Source: IDA Pro MCP port 13381 -// Functions: 14 +// TcgPeiplatform.efi - cleaned decompilation // #include #include -{"addr":"0xffe2cd34","code":"void *InternalMemSetMem(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe2cd41*/\n return buf; /*0xffe2cd47*/\n}"} +VOID * +EFIAPI +InternalMemSetMem ( + IN VOID *Buffer, + IN UINTN Count, + IN CHAR8 Value + ) +{ + return memset (Buffer, Value, Count); +} -{"addr":"0xffe2cd54","code":"int InternalMemSetMem32(int a1, int a2, int a3, int a4)\n{\n do /*0xffe2cd6d*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe2cd65*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe2cd69*/\n }\n while ( a2 ); /*0xffe2cd6d*/\n return a1; /*0xffe2cd71*/\n}"} +VOID * +EFIAPI +InternalMemSetMem32 ( + IN VOID *Buffer, + IN UINTN Count, + IN UINT32 Value1, + IN UINT32 Value2 + ) +{ + UINT32 *Ptr; -{"addr":"0xffe2cd74","code":"void *InternalMemZeroMem(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe2cd81*/\n return buf; /*0xffe2cd87*/\n}"} + Ptr = (UINT32 *)Buffer; + while (Count != 0) { + *Ptr++ = Value1; + *Ptr++ = Value2; + Count--; + } -{"addr":"0xffe2cd94","code":"char *InternalMemCopyMem(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe2cd9e*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe2cdac*/\n {\n src_1 = &src[count - 1]; /*0xffe2cdc0*/\n dst_1 = &dst[count - 1]; /*0xffe2cdc2*/\n }\n else\n {\n count_1 = count & 3; /*0xffe2cdb0*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe2cdb9*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe2cdb9*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe2cdb9*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe2cdc9*/\n return dst; /*0xffe2cdd0*/\n}"} + return Buffer; +} -{"addr":"0xffe2cdf4","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n int v2; // ebp\n int PcdPpi; // eax\n int Signature; // eax\n EFI_STATUS result; // eax\n void ( **ImageHandle_1)(EFI_SYSTEM_TABLE *); // [esp-8h] [ebp-Ch] BYREF\n _DWORD v7[2]; // [esp-4h] [ebp-8h] BYREF\n\n if ( *(char *)(GetPcdPpi() + 1024068) >= 0 ) /*0xffe2ce05*/\n {\n PcdSetSku(); /*0xffe2ce07*/\n PcdPpi = GetPcdPpi(); /*0xffe2ce0c*/\n *(_BYTE *)(PcdPpi + 1024068) |= 0x80u; /*0xffe2ce18*/\n }\n v7[1] = v2; /*0xffe2cedb*/\n v7[0] = ImageHandle; /*0xffe2cede*/\n ImageHandle_1 = (void ( **)(EFI_SYSTEM_TABLE *))ImageHandle; /*0xffe2cedf*/\n Signature = SystemTable->Hdr.Signature; /*0xffe2ceed*/\n ImageHandle_1 = 0; /*0xffe2cef6*/\n if ( (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, void ( ***)(EFI_SYSTEM_TABLE *)))(Signature + 32))( /*0xffe2cf01*/\n SystemTable,\n &unk_FFE2D4A4,\n 0,\n 0,\n &ImageHandle_1) < 0 )\n return 0; /*0xffe2cf03*/\n (*ImageHandle_1)(SystemTable); /*0xffe2cf0b*/\n result = (*(int ( **)(EFI_SYSTEM_TABLE *, int, _DWORD *))(LODWORD(SystemTable->Hdr.Signature) + 76))( /*0xffe2cf16*/\n SystemTable,\n 16,\n v7);\n if ( (result & 0x80000000) == 0 ) /*0xffe2cf1e*/\n {\n *(_DWORD *)v7[0] = -2147483616; /*0xffe2cf23*/\n *(_DWORD *)(v7[0] + 4) = &unk_FFE2D494; /*0xffe2cf2c*/\n *(_DWORD *)(v7[0] + 8) = &loc_FFE2CE28; /*0xffe2cf36*/\n *(_DWORD *)(v7[0] + 12) = ImageHandle; /*0xffe2cf40*/\n return (*(int ( **)(EFI_SYSTEM_TABLE *, _DWORD))(LODWORD(SystemTable->Hdr.Signature) + 36))( /*0xffe2cf49*/\n SystemTable,\n v7[0]);\n }\n return result; /*0xffe2cf53*/\n}","refs":[{"addr":"0xffe2d0ca","name":"PcdSetSku"},{"addr":"0xffe2d0be","name":"GetPcdPpi"},{"addr":"0xffe2d4a4","name":"unk_FFE2D4A4"},{"addr":"0xffe2d494","name":"unk_FFE2D494"},{"addr":"0xffe2ce28","name":"loc_FFE2CE28"}]} +VOID * +EFIAPI +InternalMemZeroMem ( + IN VOID *Buffer, + IN UINTN Count + ) +{ + return memset (Buffer, 0, Count); +} -{"addr":"0xffe2cf54","code":"int GetDebugOutput()\n{\n int PeiServicesTable; // eax\n _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF\n int v3; // [esp+4h] [ebp-4h] BYREF\n\n PeiServicesTable = GetPeiServicesTable(); /*0xffe2cf59*/\n if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)PeiServicesTable + 32))( /*0xffe2cf78*/\n PeiServicesTable,\n &unk_FFE2D474,\n 0,\n v2,\n &v3) >= 0 )\n return v3; /*0xffe2cf7e*/\n else\n return 0; /*0xffe2cf7a*/\n}","refs":[{"addr":"0xffe2d069","name":"GetPeiServicesTable"},{"addr":"0xffe2d474","name":"unk_FFE2D474"}]} +VOID * +EFIAPI +InternalMemCopyMem ( + OUT VOID *Destination, + IN CONST VOID *Source, + IN UINTN Count + ) +{ + return memmove (Destination, Source, Count); +} -{"addr":"0xffe2cf85","code":"int DebugPrint(int a1, int _nASSERT_EFI_ERROR_(Status___%r)_n, ...)\n{\n int result; // eax\n int ( **v3)(int, int, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, _nASSERT_EFI_ERROR_(Status___%r)_n);\n result = GetDebugOutput(); /*0xffe2cf86*/\n v3 = (int ( **)(int, int, char *))result; /*0xffe2cf8b*/\n if ( result ) /*0xffe2cf8f*/\n {\n result = TpmIsPresent(); /*0xffe2cf91*/\n if ( (result & a1) != 0 ) /*0xffe2cf9c*/\n return (*v3)(a1, _nASSERT_EFI_ERROR_(Status___%r)_n, (char *)va); /*0xffe2cfa8*/\n }\n return result; /*0xffe2cfad*/\n}","refs":[{"addr":"0xffe2cf54","name":"GetDebugOutput"},{"addr":"0xffe2cfcd","name":"TpmIsPresent"}]} +STATIC +VOID * +EFIAPI +GetDebugOutputProtocol ( + VOID + ) +{ + EFI_PEI_SERVICES *PeiServices; + VOID *DebugOutput; -{"addr":"0xffe2cfaf","code":"int DebugAssert(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n int PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = GetDebugOutput(); /*0xffe2cfb5*/\n if ( result ) /*0xffe2cfbc*/\n return (*(int ( **)(int, int, int))(result + 4))( /*0xffe2cfc4*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe2cfca*/\n}","refs":[{"addr":"0xffe2cf54","name":"GetDebugOutput"}]} + PeiServices = GetPeiServicesTable (); + if (EFI_ERROR (PeiServices->LocatePpi (PeiServices, &gEfiPeiDebugOutputPpiGuid, 0, NULL, &DebugOutput))) { + return NULL; + } -{"addr":"0xffe2cfcd","code":"int TpmIsPresent()\n{\n unsigned __int8 v0; // al\n char n3; // al\n char n3_1; // cl\n\n v0 = __inbyte(0x70u); /*0xffe2cfd3*/\n __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe2cfd8*/\n n3 = __inbyte(0x71u); /*0xffe2cfdf*/\n n3_1 = n3; /*0xffe2cfe0*/\n if ( (unsigned __int8)n3 <= 3u ) /*0xffe2cfe5*/\n {\nLABEL_4:\n if ( !n3_1 ) /*0xffe2d000*/\n return 0; /*0xffe2d000*/\n goto LABEL_5; /*0xffe2d000*/\n }\n n3_1 = n3; /*0xffe2cfe7*/\n if ( !n3 ) /*0xffe2cfef*/\n {\n n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe2cffb*/\n goto LABEL_4; /*0xffe2cffb*/\n }\nLABEL_5:\n if ( n3_1 != -1 )\n return n3_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe2d018*/\n}","refs":[{"addr":"0xffe2d4d0","name":"n3"}]} + return DebugOutput; +} -{"addr":"0xffe2d069","code":"int GetPeiServicesTable()\n{\n int v0; // esi\n _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF\n int v3; // [esp+6h] [ebp-6h]\n\n AsmReadIdtr(v2); /*0xffe2d072*/\n v0 = *(_DWORD *)(v3 - 4); /*0xffe2d07a*/\n if ( !v0 ) /*0xffe2d07f*/\n DebugAssert( /*0xffe2d08e*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n (int)\"PeiServices != ((void *) 0)\");\n return v0; /*0xffe2d096*/\n}","refs":[{"addr":"0xffe2d09b","name":"AsmReadIdtr"},{"addr":"0xffe2cfaf","name":"DebugAssert"},{"addr":"0xffe2d234","name":"aEHsMdepkgLibra","string":"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c"},{"addr":"0xffe2d214","name":"aPeiservicesVoi","string":"PeiServices != ((void *) 0)"}]} +INTN +EFIAPI +TpmIsPresent ( + VOID + ) +{ + UINT8 Value; + UINT8 TpmState; -{"addr":"0xffe2d09b","code":"void *__thiscall AsmReadIdtr(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe2d0a1*/\n DebugAssert((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, (int)\"Idtr != ((void *) 0)\"); /*0xffe2d0b0*/\n this_1 = this; /*0xffe2d0b6*/\n __sidt(this); /*0xffe2d0b9*/\n return this_1; /*0xffe2d0bd*/\n}","refs":[{"addr":"0xffe2cfaf","name":"DebugAssert"},{"addr":"0xffe2d29c","name":"aEHsMdepkgLibra_0","string":"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c"},{"addr":"0xffe2d284","name":"aIdtrVoid0","string":"Idtr != ((void *) 0)"}]} + Value = __inbyte (0x70); + __outbyte (0x70, (UINT8)((Value & 0x80) | 0x4A)); + TpmState = __inbyte (0x71); -{"addr":"0xffe2d0be","code":"int __thiscall GetPcdPpi(void *this)\n{\n int ( **PcdProtocol)(int); // eax\n\n PcdProtocol = (int ( **)(int))GetPcdProtocol(this); /*0xffe2d0be*/\n return PcdProtocol[4](5); /*0xffe2d0c9*/\n}","refs":[{"addr":"0xffe2d0db","name":"GetPcdProtocol"}]} + if (TpmState <= 3) { + if (TpmState == 0) { + return 0; + } + } else if (TpmState == 0) { + TpmState = (UINT8)((MEMORY[0xFDAF0490] & 2) | 1); + if (TpmState == 0) { + return 0; + } + } -{"addr":"0xffe2d0ca","code":"int __thiscall PcdSetSku(void *this)\n{\n int v1; // ebx\n int DebugOutput; // eax\n\n v1 = GetPcdPpi(this) + 1024064; /*0xffe2d03a*/\n if ( (v1 & 1) != 0 ) /*0xffe2d03f*/\n {\n DebugOutput = GetDebugOutput(); /*0xffe2d041*/\n if ( DebugOutput ) /*0xffe2d048*/\n (*(void ( **)(const char *, int, const char *))(DebugOutput + 4))( /*0xffe2d059*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLib.c\",\n 183,\n \"(Address & 1) == 0\");\n }\n *(_WORD *)v1 = 1280; /*0xffe2d064*/\n return 1280; /*0xffe2d068*/\n}","refs":[{"addr":"0xffe2d0be","name":"GetPcdPpi"},{"addr":"0xffe2cf54","name":"GetDebugOutput"},{"addr":"0xffe2d1d0","name":"aEHsMdepkgLibra_1","string":"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c"},{"addr":"0xffe2d200","name":"aAddress10","string":"(Address & 1) == 0"}]} + if (TpmState != 0xFF) { + return (TpmState != 1) ? EFI_NOT_FOUND : EFI_DEVICE_ERROR; + } -{"addr":"0xffe2d0db","code":"void *__thiscall GetPcdProtocol(void *this)\n{\n int PeiServicesTable; // eax\n int v2; // eax\n int DebugOutput; // eax\n void *this_1; // [esp+0h] [ebp-4h]\n\n this_1 = this; /*0xffe2d0de*/\n PeiServicesTable = GetPeiServicesTable(); /*0xffe2d0df*/\n v2 = (*(int (__stdcall **)(int))(*(_DWORD *)PeiServicesTable + 32))(PeiServicesTable); /*0xffe2d0f4*/\n if ( v2 < 0 ) /*0xffe2d0fc*/\n {\n DebugPrint(0x80000000, (int)\"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v2); /*0xffe2d109*/\n DebugOutput = GetDebugOutput(); /*0xffe2d111*/\n if ( DebugOutput ) /*0xffe2d118*/\n (*(void ( **)(const char *, int, const char *))(DebugOutput + 4))( /*0xffe2d126*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiPcdLib\\\\PeiPcdLib.c\",\n 49,\n \"!EFI_ERROR (Status)\");\n }\n return this_1; /*0xffe2d131*/\n}","refs":[{"addr":"0xffe2d069","name":"GetPeiServicesTable"},{"addr":"0xffe2cf85","name":"DebugPrint"},{"addr":"0xffe2d134","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe2cf54","name":"GetDebugOutput"},{"addr":"0xffe2d2c8","name":"aEHsMdepkgLibra_2","string":"e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c"},{"addr":"0xffe2d158","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"}]} + return 0; +} +EFI_PEI_SERVICES * +EFIAPI +GetPeiServicesTable ( + VOID + ) +{ + EFI_PEI_SERVICES *PeiServices; + + PeiServices = NULL; + AsmReadIdtr (&PeiServices); + if (PeiServices == NULL) { + return NULL; + } + + return PeiServices; +} + +VOID +EFIAPI +AsmReadIdtr ( + OUT VOID *Idtr + ) +{ + if (Idtr == NULL) { + return; + } + + __sidt (Idtr); +} + +VOID * +EFIAPI +GetPcdProtocol ( + IN VOID *This + ) +{ + EFI_PEI_SERVICES *PeiServices; + EFI_STATUS Status; + + PeiServices = GetPeiServicesTable (); + if (PeiServices == NULL) { + return This; + } + + Status = PeiServices->LocatePpi (PeiServices, NULL, 0, NULL, NULL); + if (EFI_ERROR (Status)) { + DebugPrint (DEBUG_ERROR, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); + } + + return This; +} + +INTN +EFIAPI +GetPcdPpi ( + IN VOID *This + ) +{ + VOID *PcdProtocol; + + PcdProtocol = GetPcdProtocol (This); + return ((INTN (*)(INTN))PcdProtocol)(5); +} + +INTN +EFIAPI +PcdSetSku ( + IN VOID *This + ) +{ + UINTN Address; + INTN DebugOutput; + + Address = (UINTN)GetPcdPpi (This) + 1024064; + if ((Address & 1) != 0) { + DebugOutput = (INTN)GetDebugOutputProtocol (); + if (DebugOutput != 0) { + ((VOID (*)(CONST CHAR8 *, INTN, CONST CHAR8 *))(DebugOutput + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", + 183, + "(Address & 1) == 0" + ); + } + } + + *(UINT16 *)Address = 1280; + return 1280; +} + +EFI_STATUS +EFIAPI +GetDebugOutput ( + VOID + ) +{ + EFI_PEI_SERVICES *PeiServices; + VOID *DebugOutput; + EFI_STATUS Status; + + PeiServices = GetPeiServicesTable (); + Status = PeiServices->LocatePpi (PeiServices, &gEfiPeiDebugOutputPpiGuid, 0, NULL, &DebugOutput); + if (EFI_ERROR (Status)) { + return 0; + } + + return (EFI_STATUS)(UINTN)DebugOutput; +} + +EFI_STATUS +EFIAPI +DebugPrint ( + IN UINTN ErrorLevel, + IN CONST CHAR8 *Format, + ... + ) +{ + VA_LIST Va; + VOID *DebugOutput; + + VA_START (Va, Format); + DebugOutput = (VOID *)GetDebugOutput (); + if (DebugOutput != NULL && (TpmIsPresent () & (INTN)ErrorLevel) != 0) { + return ((EFI_STATUS (*)(UINTN, CONST CHAR8 *, VA_LIST))(DebugOutput))(ErrorLevel, Format, Va); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +DebugAssert ( + IN CONST CHAR8 *FileName, + IN INTN LineNumber, + IN CONST CHAR8 *Description + ) +{ + VOID *DebugOutput; + + DebugOutput = (VOID *)GetDebugOutput (); + if (DebugOutput != NULL) { + return ((EFI_STATUS (*)(CONST CHAR8 *, INTN, CONST CHAR8 *))((UINTN)DebugOutput + 4))(FileName, LineNumber, Description); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +ModuleEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + VOID *Registration; + + if (*(CHAR8 *)(GetPcdPpi (NULL) + 1024068) >= 0) { + PcdSetSku (NULL); + *(UINT8 *)(GetPcdPpi (NULL) + 1024068) |= 0x80; + } + + Registration = NULL; + if (SystemTable->BootServices->LocateProtocol (&gEfiPeiDebugOutputPpiGuid, NULL, &Registration) < 0) { + return 0; + } + + ((VOID (*)(EFI_SYSTEM_TABLE *))Registration)(SystemTable); + + Status = SystemTable->BootServices->InstallConfigurationTable ( + SystemTable, + &gEfiPeiDebugOutputPpiGuid, + ImageHandle + ); + if ((Status & EFI_ERROR_MASK) == 0) { + return SystemTable->BootServices->HandleProtocol ( + SystemTable, + &gEfiPeiDebugOutputPpiGuid + ); + } + + return Status; +} diff --git a/LenovoServerPkg/Driver/LnvDriverPei/LnvDriverPei.c b/LenovoServerPkg/Driver/LnvDriverPei/LnvDriverPei.c index 4aabef4..895a132 100644 --- a/LenovoServerPkg/Driver/LnvDriverPei/LnvDriverPei.c +++ b/LenovoServerPkg/Driver/LnvDriverPei/LnvDriverPei.c @@ -1,83 +1,731 @@ // -// LnvDriverPei.efi - Full Decompilation -// Source: IDA Pro MCP port 13390 -// Functions: 37 +// LnvDriverPei.efi - cleaned decompilation // #include #include -{"addr":"0xffe3bf94","code":"void *MemSet(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe3bfa1*/\n return buf; /*0xffe3bfa7*/\n}"} +void *MemSet(void *buf, unsigned int count, char value) +{ + memset(buf, value, count); + return buf; +} -{"addr":"0xffe3bfb4","code":"int CopyMem(int a1, int a2, int a3, int a4)\n{\n do /*0xffe3bfcd*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe3bfc5*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe3bfc9*/\n }\n while ( a2 ); /*0xffe3bfcd*/\n return a1; /*0xffe3bfd1*/\n}"} +int CopyMem(int a1, int a2, int a3, int a4) +{ + do { + *(_DWORD *)(a1 + 8 * a2 - 8) = a3; + *(_DWORD *)(a1 + 8 * a2-- - 4) = a4; + } while (a2); + return a1; +} -{"addr":"0xffe3bfd4","code":"void *MemZero(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe3bfe1*/\n return buf; /*0xffe3bfe7*/\n}"} +void *MemZero(void *buf, unsigned int count, int value) +{ + memset32(buf, value, count); + return buf; +} -{"addr":"0xffe3bff4","code":"char *AsciiStrCpyS(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe3bffe*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe3c00c*/\n {\n src_1 = &src[count - 1]; /*0xffe3c020*/\n dst_1 = &dst[count - 1]; /*0xffe3c022*/\n }\n else\n {\n count_1 = count & 3; /*0xffe3c010*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe3c019*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe3c019*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe3c019*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe3c029*/\n return dst; /*0xffe3c030*/\n}"} +char *AsciiStrCpyS(char *dst, char *src, unsigned int count) +{ + unsigned int count_1; + char *dst_1; + char *src_1; -{"addr":"0xffe3c054","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n int NotifyStatus; // eax\n int ConstructorStatus; // edi\n int InitStatus; // eax\n EFI_STATUS FinalStatus; // edi\n\n if ( (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, void *))(LODWORD(SystemTable->Hdr.Signature) + 32))( /*0xffe3c073*/\n SystemTable,\n &unk_FFE3E344,\n 0,\n 0,\n &unk_FFE3E3C8) < 0 )\n {\n NotifyStatus = (*(int ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( /*0xffe3c07d*/\n SystemTable,\n &unk_FFE3E3B8);\n ConstructorStatus = NotifyStatus; /*0xffe3c080*/\n if ( NotifyStatus < 0 ) /*0xffe3c086*/\n {\n DebugPrint(-1, \"PEI - PeiLnvSendIpmiCmdLibConstructor NotifyPpi Status = %r \\n\", NotifyStatus); /*0xffe3c090*/\n DebugPrint(-1, \"PeiLnvSendIpmiCmdLibConstructor Status = %r \\n\", ConstructorStatus); /*0xffe3c09d*/\n }\n }\n InitStatus = (*(int ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( /*0xffe3c0ad*/\n SystemTable,\n &unk_FFE3E394);\n FinalStatus = InitStatus; /*0xffe3c0b0*/\n if ( InitStatus < 0 ) /*0xffe3c0b6*/\n DebugPrint(-1, \"PEI - LnvDriverPEI_Init NotifyPpi Status = %r \\n\", InitStatus); /*0xffe3c0c0*/\n LnvDebugSwitchInit(SystemTable); /*0xffe3c0ca*/\n return FinalStatus; /*0xffe3c0d1*/\n}","refs":[{"addr":"0xffe3e3b8","name":"unk_FFE3E3B8"},{"addr":"0xffe3c296","name":"DebugPrint"},{"addr":"0xffe3da04","name":"aPeiPeilnvsendi","string":"PEI - PeiLnvSendIpmiCmdLibConstructor NotifyPpi Status = %r \n"},{"addr":"0xffe3da44","name":"aPeilnvsendipmi","string":"PeiLnvSendIpmiCmdLibConstructor Status = %r \n"},{"addr":"0xffe3e344","name":"unk_FFE3E344"},{"addr":"0xffe3e3c8","name":"unk_FFE3E3C8"},{"addr":"0xffe3e394","name":"unk_FFE3E394"},{"addr":"0xffe3d8e8","name":"aPeiLnvdriverpe","string":"PEI - LnvDriverPEI_Init NotifyPpi Status = %r \n"},{"addr":"0xffe3c0fe","name":"LnvDebugSwitchInit"}]} + count_1 = count; + if (src < dst && &src[count - 1] >= dst) { + src_1 = &src[count - 1]; + dst_1 = &dst[count - 1]; + } else { + count_1 = count & 3; + qmemcpy(dst, src, 4 * (count >> 2)); + src_1 = &src[4 * (count >> 2)]; + dst_1 = &dst[4 * (count >> 2)]; + } + qmemcpy(dst_1, src_1, count_1); + return dst; +} -{"addr":"0xffe3c0d4","code":"int MemoryDiscoveredPpiCallback()\n{\n LnvDebugSwitchPpiCallback(\"PEI - gEfiPeiMemoryDiscoveredPpiGuid Signaled\"); /*0xffe3c0d9*/\n return 0; /*0xffe3c0e1*/\n}","refs":[{"addr":"0xffe3c406","name":"LnvDebugSwitchPpiCallback"},{"addr":"0xffe3d72c","name":"aPeiGefipeimemo","string":"PEI - gEfiPeiMemoryDiscoveredPpiGuid Signaled"}]} +static int GetDebugService(void); +static int DebugPrintLevelEnabled(void); +static int PeiServicesGetPointer(void); +static int LnvDebugSwitchPpiCallback(char *fmt, ...); +static int CmosWriteByte(int CmosAddress, int DataValue); +static char *InternalBuildGuidHob(int HobGuid, char *DataBuffer); -{"addr":"0xffe3c0e2","code":"int BootInRecoveryModePpiCallback()\n{\n LnvDebugSwitchPpiCallback(\"PEI - gEfiPeiBootInRecoveryModePpiGuid Signaled\"); /*0xffe3c0e7*/\n return 0; /*0xffe3c0ef*/\n}","refs":[{"addr":"0xffe3c406","name":"LnvDebugSwitchPpiCallback"},{"addr":"0xffe3d75c","name":"aPeiGefipeiboot","string":"PEI - gEfiPeiBootInRecoveryModePpiGuid Signaled"}]} +EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + int NotifyStatus; + int ConstructorStatus; + int InitStatus; + EFI_STATUS FinalStatus; -{"addr":"0xffe3c0f0","code":"int EndOfPeiSignalPpiCallback()\n{\n LnvDebugSwitchPpiCallback(\"PEI - gEfiEndOfPeiSignalPpiGuid Signaled\"); /*0xffe3c0f5*/\n return 0; /*0xffe3c0fd*/\n}","refs":[{"addr":"0xffe3c406","name":"LnvDebugSwitchPpiCallback"},{"addr":"0xffe3d78c","name":"aPeiGefiendofpe","string":"PEI - gEfiEndOfPeiSignalPpiGuid Signaled"}]} + if ((*(int (**)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, void *))(LODWORD(SystemTable->Hdr.Signature) + 32))( + SystemTable, + &unk_FFE3E344, + 0, + 0, + &unk_FFE3E3C8) < 0) + { + NotifyStatus = (*(int (**)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( + SystemTable, + &unk_FFE3E3B8); + ConstructorStatus = NotifyStatus; + if (NotifyStatus < 0) { + DebugPrint(-1, "PEI - PeiLnvSendIpmiCmdLibConstructor NotifyPpi Status = %r \n", NotifyStatus); + DebugPrint(-1, "PeiLnvSendIpmiCmdLibConstructor Status = %r \n", ConstructorStatus); + } + } -{"addr":"0xffe3c0fe","code":"int __thiscall LnvDebugSwitchInit(EFI_SYSTEM_TABLE *SystemTable)\n{\n int Signature; // eax\n int result; // eax\n int PeiSwitchValue; // edx\n int CmosStatus; // eax\n int HobGuid; // ecx\n int DebugValue; // edx\n int DxeCmosStatus; // eax\n int DxeDebugValue; // edx\n int PeiCmosStatus; // eax\n int HobGuid_1; // ecx\n int DxeSwitchByte; // edx\n int DxeCmosStatus2; // eax\n int SmmDebugByte; // edx\n _BYTE ConfigData[3]; // [esp+8h] [ebp-18h] BYREF\n unsigned __int8 PeiDebugSwitch; // [esp+Bh] [ebp-15h]\n char src[4]; // [esp+Ch] [ebp-14h] BYREF\n unsigned __int8 SmmDebugSwitch; // [esp+10h] [ebp-10h]\n int DataSize; // [esp+14h] [ebp-Ch] BYREF\n int ( **GetVariableProtocol)(_DWORD, const __int16 *, void *, _DWORD, int *, _BYTE *); // [esp+18h] [ebp-8h] BYREF\n char DefaultDebugSwitch; // [esp+1Fh] [ebp-1h] BYREF\n\n Signature = SystemTable->Hdr.Signature; /*0xffe3c104*/\n DataSize = 10; /*0xffe3c10d*/\n GetVariableProtocol = 0; /*0xffe3c11c*/\n DefaultDebugSwitch = 0x80; /*0xffe3c11f*/\n result = (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, int ( ***)(_DWORD, const __int16 *, void *, _DWORD, int *, _BYTE *)))(Signature + 32))( /*0xffe3c123*/\n SystemTable,\n &unk_FFE3E324,\n 0,\n 0,\n &GetVariableProtocol);\n if ( !result ) /*0xffe3c12b*/\n {\n result = (*GetVariableProtocol)(GetVariableProtocol, L\"LnvSetup\", &unk_FFE3E374, 0, &DataSize, ConfigData); /*0xffe3c148*/\n if ( !result ) /*0xffe3c14f*/\n {\n if ( ConfigData[2] ) /*0xffe3c15d*/\n {\n LOBYTE(PeiSwitchValue) = PeiDebugSwitch; /*0xffe3c1db*/\n PeiCmosStatus = CmosWriteByte(33360, PeiSwitchValue); /*0xffe3c1de*/\n if ( PeiCmosStatus < 0 ) /*0xffe3c1e8*/\n DebugPrint( /*0xffe3c1f6*/\n -1,\n \"RDBG CmosWriteByte PEI_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \\n\",\n PeiDebugSwitch,\n PeiCmosStatus);\n InternalBuildGuidHob(HobGuid_1, src); /*0xffe3c202*/\n DebugPrint(-1, \"RDBG BuildGuidDataHob gLnvDebugSwitchHobGuid \\n\"); /*0xffe3c20f*/\n LOBYTE(DxeSwitchByte) = src[0]; /*0xffe3c214*/\n DxeCmosStatus2 = CmosWriteByte(33368, DxeSwitchByte); /*0xffe3c21e*/\n if ( DxeCmosStatus2 < 0 ) /*0xffe3c225*/\n DebugPrint( /*0xffe3c233*/\n -1,\n \"RDBG CmosWriteByte DXE_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \\n\",\n (unsigned __int8)src[0],\n DxeCmosStatus2);\n LOBYTE(SmmDebugByte) = SmmDebugSwitch; /*0xffe3c23b*/\n result = CmosWriteByte(33376, SmmDebugByte); /*0xffe3c243*/\n if ( result < 0 ) /*0xffe3c24a*/\n return DebugPrint( /*0xffe3c258*/\n -1,\n \"RDBG CmosWriteByte SMM_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \\n\",\n SmmDebugSwitch,\n result);\n }\n else\n {\n LOBYTE(PeiSwitchValue) = DefaultDebugSwitch; /*0xffe3c15f*/\n CmosStatus = CmosWriteByte(33360, PeiSwitchValue); /*0xffe3c162*/\n if ( CmosStatus < 0 ) /*0xffe3c16c*/\n DebugPrint( /*0xffe3c17a*/\n -1,\n \"RDBG CmosWriteByte PEI_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \\n\",\n (unsigned __int8)DefaultDebugSwitch,\n CmosStatus);\n InternalBuildGuidHob(HobGuid, &DefaultDebugSwitch); /*0xffe3c186*/\n DebugPrint(-1, \"RDBG BuildGuidDataHob gLnvDebugSwitchHobGuid \\n\"); /*0xffe3c193*/\n LOBYTE(DebugValue) = DefaultDebugSwitch; /*0xffe3c198*/\n DxeCmosStatus = CmosWriteByte(33368, DebugValue); /*0xffe3c1a2*/\n if ( DxeCmosStatus < 0 ) /*0xffe3c1a9*/\n DebugPrint( /*0xffe3c1b7*/\n -1,\n \"RDBG CmosWriteByte DXE_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \\n\",\n (unsigned __int8)DefaultDebugSwitch,\n DxeCmosStatus);\n LOBYTE(DxeDebugValue) = DefaultDebugSwitch; /*0xffe3c1bf*/\n result = CmosWriteByte(33376, DxeDebugValue); /*0xffe3c1c7*/\n if ( result < 0 ) /*0xffe3c1ce*/\n return DebugPrint( /*0xffe3c1d9*/\n -1,\n \"RDBG CmosWriteByte SMM_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \\n\",\n (unsigned __int8)DefaultDebugSwitch,\n result);\n }\n }\n }\n return result; /*0xffe3c260*/\n}","refs":[{"addr":"0xffe3e324","name":"unk_FFE3E324"},{"addr":"0xffe3e374","name":"unk_FFE3E374"},{"addr":"0xffe3c3da","name":"CmosWriteByte"},{"addr":"0xffe3c296","name":"DebugPrint"},{"addr":"0xffe3c32e","name":"InternalBuildGuidHob"}]} + InitStatus = (*(int (**)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( + SystemTable, + &unk_FFE3E394); + FinalStatus = InitStatus; + if (InitStatus < 0) + DebugPrint(-1, "PEI - LnvDriverPEI_Init NotifyPpi Status = %r \n", InitStatus); -{"addr":"0xffe3c265","code":"int GetDebugService()\n{\n int PpiServices; // eax\n int Guid; // [esp+0h] [ebp-8h] BYREF\n int DebugServicePtr; // [esp+4h] [ebp-4h] BYREF\n\n PpiServices = PeiServicesGetPointer(); /*0xffe3c26a*/\n if ( (*(int ( **)(int, void *, _DWORD, int *, int *))(*(_DWORD *)PpiServices + 32))( /*0xffe3c289*/\n PpiServices,\n &unk_FFE3E334,\n 0,\n &Guid,\n &DebugServicePtr) >= 0 )\n return DebugServicePtr; /*0xffe3c28f*/\n else\n return 0; /*0xffe3c28b*/\n}","refs":[{"addr":"0xffe3c596","name":"PeiServicesGetPointer"},{"addr":"0xffe3e334","name":"unk_FFE3E334"}]} + LnvDebugSwitchInit(SystemTable); + return FinalStatus; +} -{"addr":"0xffe3c296","code":"int DebugPrint(int a1, const char *a2, ...)\n{\n int result; // eax\n int ( **v3)(int, const char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a2);\n result = GetDebugService(); /*0xffe3c297*/\n v3 = (int ( **)(int, const char *, char *))result; /*0xffe3c29c*/\n if ( result ) /*0xffe3c2a0*/\n {\n result = DebugPrintLevelEnabled(); /*0xffe3c2a2*/\n if ( (result & a1) != 0 ) /*0xffe3c2ad*/\n return (*v3)(a1, a2, (char *)va); /*0xffe3c2b9*/\n }\n return result; /*0xffe3c2be*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"},{"addr":"0xffe3c547","name":"DebugPrintLevelEnabled"}]} +int MemoryDiscoveredPpiCallback(void) +{ + LnvDebugSwitchPpiCallback("PEI - gEfiPeiMemoryDiscoveredPpiGuid Signaled"); + return 0; +} -{"addr":"0xffe3c2c0","code":"int PeiServicesGetIdt(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n int PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = GetDebugService(); /*0xffe3c2c6*/\n if ( result ) /*0xffe3c2cd*/\n return (*(int ( **)(int, int, int))(result + 4))( /*0xffe3c2d5*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe3c2db*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"}]} +int BootInRecoveryModePpiCallback(void) +{ + LnvDebugSwitchPpiCallback("PEI - gEfiPeiBootInRecoveryModePpiGuid Signaled"); + return 0; +} -{"addr":"0xffe3c2de","code":"int InternalHobConstructor(int HobGuid, int HobType)\n{\n int PpiServices; // eax\n int DebugService; // eax\n int HobPtr; // [esp+4h] [ebp-4h] BYREF\n\n PpiServices = PeiServicesGetPointer(); /*0xffe3c2e5*/\n if ( (*(int ( **)(int, int, int, int *))(*(_DWORD *)PpiServices + 52))(PpiServices, 4, HobType, &HobPtr) < 0 ) /*0xffe3c2fd*/\n HobPtr = 0; /*0xffe3c2ff*/\n if ( !HobPtr ) /*0xffe3c307*/\n {\n DebugService = GetDebugService(); /*0xffe3c309*/\n if ( DebugService ) /*0xffe3c310*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3c321*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 250,\n \"Hob != ((void *) 0)\");\n }\n return HobPtr; /*0xffe3c2fa*/\n}","refs":[{"addr":"0xffe3c596","name":"PeiServicesGetPointer"},{"addr":"0xffe3c265","name":"GetDebugService"}]} +int EndOfPeiSignalPpiCallback(void) +{ + LnvDebugSwitchPpiCallback("PEI - gEfiEndOfPeiSignalPpiGuid Signaled"); + return 0; +} -{"addr":"0xffe3c32e","code":"char *InternalBuildGuidHob(int HobGuid, char *DataBuffer)\n{\n int DebugService; // eax\n int HobPtr; // eax\n int HobCopy; // esi\n\n if ( !DataBuffer ) /*0xffe3c334*/\n {\n DebugService = GetDebugService(); /*0xffe3c336*/\n if ( DebugService ) /*0xffe3c33d*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3c34e*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 466,\n \"Data != ((void *) 0) || DataLength == 0\");\n }\n HobPtr = InternalHobConstructor(HobGuid, 25); /*0xffe3c357*/\n HobCopy = HobPtr; /*0xffe3c35c*/\n if ( !HobPtr ) /*0xffe3c360*/\n return 0; /*0xffe3c360*/\n HobConstructorInternal((void *)(HobPtr + 8)); /*0xffe3c365*/\n if ( HobCopy == -24 ) /*0xffe3c36f*/\n return 0; /*0xffe3c37c*/\n else\n return StrCpySInternal((char *)(HobCopy + 24), DataBuffer); /*0xffe3c374*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"},{"addr":"0xffe3c2de","name":"InternalHobConstructor"},{"addr":"0xffe3c5c8","name":"HobConstructorInternal"},{"addr":"0xffe3c5f9","name":"StrCpySInternal"}]} +int __thiscall LnvDebugSwitchInit(EFI_SYSTEM_TABLE *SystemTable) +{ + int Signature; + int result; + int PeiSwitchValue; + int CmosStatus; + int HobGuid; + int DebugValue; + int DxeCmosStatus; + int DxeDebugValue; + int PeiCmosStatus; + int HobGuid_1; + int DxeSwitchByte; + int DxeCmosStatus2; + int SmmDebugByte; + _BYTE ConfigData[3]; + unsigned __int8 PeiDebugSwitch; + char src[4]; + unsigned __int8 SmmDebugSwitch; + int DataSize; + int (**GetVariableProtocol)(_DWORD, const __int16 *, void *, _DWORD, int *, _BYTE *); + char DefaultDebugSwitch; -{"addr":"0xffe3c381","code":"int __thiscall GetCmosService(void *this)\n{\n int PpiServices; // eax\n _DWORD CmosProtocolGuid[4]; // [esp+4h] [ebp-10h] BYREF\n\n CmosProtocolGuid[0] = -859887738; /*0xffe3c38a*/\n CmosProtocolGuid[1] = 1124650348; /*0xffe3c391*/\n CmosProtocolGuid[2] = 1482881725; /*0xffe3c398*/\n CmosProtocolGuid[3] = -2118136208; /*0xffe3c39f*/\n if ( !this ) /*0xffe3c3a8*/\n return -2147483646; /*0xffe3c3aa*/\n PpiServices = PeiServicesGetPointer(); /*0xffe3c3b1*/\n if ( PpiServices ) /*0xffe3c3ba*/\n return (*(int ( **)(int, _DWORD *, _DWORD, _DWORD, void *))(*(_DWORD *)PpiServices + 32))( /*0xffe3c3cf*/\n PpiServices,\n CmosProtocolGuid,\n 0,\n 0,\n this);\n else\n return -2147483645; /*0xffe3c3bc*/\n}","refs":[{"addr":"0xffe3c596","name":"PeiServicesGetPointer"}]} + Signature = SystemTable->Hdr.Signature; + DataSize = 10; + GetVariableProtocol = 0; + DefaultDebugSwitch = 0x80; + result = (*(int (**)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, int (***)(_DWORD, const __int16 *, void *, _DWORD, int *, _BYTE *)))(Signature + 32))( + SystemTable, + &unk_FFE3E324, + 0, + 0, + &GetVariableProtocol); + if (!result) { + result = (*GetVariableProtocol)(GetVariableProtocol, L"LnvSetup", &unk_FFE3E374, 0, &DataSize, ConfigData); + if (!result) { + if (ConfigData[2]) { + LOBYTE(PeiSwitchValue) = PeiDebugSwitch; + PeiCmosStatus = CmosWriteByte(33360, PeiSwitchValue); + if (PeiCmosStatus < 0) + DebugPrint(-1, "RDBG CmosWriteByte PEI_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \n", PeiDebugSwitch, PeiCmosStatus); + InternalBuildGuidHob(HobGuid_1, src); + DebugPrint(-1, "RDBG BuildGuidDataHob gLnvDebugSwitchHobGuid \n"); + LOBYTE(DxeSwitchByte) = src[0]; + DxeCmosStatus2 = CmosWriteByte(33368, DxeSwitchByte); + if (DxeCmosStatus2 < 0) + DebugPrint(-1, "RDBG CmosWriteByte DXE_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \n", (unsigned __int8)src[0], DxeCmosStatus2); + LOBYTE(SmmDebugByte) = SmmDebugSwitch; + result = CmosWriteByte(33376, SmmDebugByte); + if (result < 0) + return DebugPrint(-1, "RDBG CmosWriteByte SMM_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \n", SmmDebugSwitch, result); + } else { + LOBYTE(PeiSwitchValue) = DefaultDebugSwitch; + CmosStatus = CmosWriteByte(33360, PeiSwitchValue); + if (CmosStatus < 0) + DebugPrint(-1, "RDBG CmosWriteByte PEI_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \n", (unsigned __int8)DefaultDebugSwitch, CmosStatus); + InternalBuildGuidHob(HobGuid, &DefaultDebugSwitch); + DebugPrint(-1, "RDBG BuildGuidDataHob gLnvDebugSwitchHobGuid \n"); + LOBYTE(DebugValue) = DefaultDebugSwitch; + DxeCmosStatus = CmosWriteByte(33368, DebugValue); + if (DxeCmosStatus < 0) + DebugPrint(-1, "RDBG CmosWriteByte DXE_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \n", (unsigned __int8)DefaultDebugSwitch, DxeCmosStatus); + LOBYTE(DxeDebugValue) = DefaultDebugSwitch; + result = CmosWriteByte(33376, DxeDebugValue); + if (result < 0) + return DebugPrint(-1, "RDBG CmosWriteByte SMM_DEBUG_SWITCH_BY_NVRAM_OFFSET , %x , Status = %r \n", (unsigned __int8)DefaultDebugSwitch, result); + } + } + } + return result; +} -{"addr":"0xffe3c3da","code":"int CmosWriteByte(int CmosAddress, int DataValue)\n{\n int Status; // eax\n int CmosProtocol; // [esp+8h] [ebp-4h] BYREF\n\n CmosProtocol = 0; /*0xffe3c3de*/\n Status = GetCmosService(&CmosProtocol); /*0xffe3c3eb*/\n if ( Status >= 0 ) /*0xffe3c3f2*/\n return (*(int ( **)(int, int, int))(CmosProtocol + 8))(CmosProtocol, CmosAddress, DataValue); /*0xffe3c3fa*/\n return Status; /*0xffe3c400*/\n}","refs":[{"addr":"0xffe3c381","name":"GetCmosService"}]} +int GetDebugService(void) +{ + int PpiServices; + int Guid; + int DebugServicePtr; -{"addr":"0xffe3c406","code":"int LnvDebugSwitchPpiCallback(char *%04d_%02d_%02d_%02d:%02d:%02d_:_%a., ...)\n{\n int Status; // eax\n unsigned int SprintLength; // eax\n unsigned int FormatLength; // ebx\n int PpiServices; // eax\n double DebugBuffer; // [esp-14h] [ebp-22Ch]\n char DebugStatus; // [esp+4h] [ebp-214h] BYREF\n _BYTE LogBuffer[255]; // [esp+5h] [ebp-213h] BYREF\n _BYTE _r_n[230]; // [esp+104h] [ebp-114h] BYREF\n char PrintStatus; // [esp+1EAh] [ebp-2Eh]\n unsigned __int16 RtcYear; // [esp+204h] [ebp-14h] BYREF\n unsigned __int8 RtcMonth; // [esp+206h] [ebp-12h]\n unsigned __int8 RtcDay; // [esp+207h] [ebp-11h]\n unsigned __int8 RtcHour; // [esp+208h] [ebp-10h]\n unsigned __int8 RtcMinute; // [esp+209h] [ebp-Fh]\n unsigned __int8 RtcSecond; // [esp+20Ah] [ebp-Eh]\n char OutputByte; // [esp+217h] [ebp-1h] BYREF\n va_list va; // [esp+224h] [ebp+Ch] BYREF\n\n va_start(va, %04d_%02d_%02d_%02d:%02d:%02d_:_%a.);\n OutputByte = 0; /*0xffe3c412*/\n if ( !%04d_%02d_%02d_%02d:%02d:%02d_:_%a. ) /*0xffe3c418*/\n return -2147483646; /*0xffe3c41a*/\n SprintLength = AsciiSPrint(_r_n, 0x100u, 0, %04d_%02d_%02d_%02d:%02d:%02d_:_%a., (char *)va); /*0xffe3c438*/\n PrintStatus = SprintLength <= 0xE6 ? PrintStatus : 0;\n ReadRtcDateTime(&RtcYear); /*0xffe3c44e*/\n DebugStatus = 0; /*0xffe3c459*/\n LODWORD(DebugBuffer) = _r_n; /*0xffe3c45f*/\n FormatLength = AsciiSPrintFormat(\n LogBuffer,\n 0xFEu,\n \"%04d/%02d/%02d-%02d:%02d:%02d : %a.\",\n RtcYear,\n RtcMonth,\n RtcDay,\n RtcHour,\n RtcMinute,\n RtcSecond,\n DebugBuffer);\n if ( FormatLength > 0xFD ) /*0xffe3c49f*/\n return -2147483643; /*0xffe3c4a1*/\n PpiServices = PeiServicesGetPointer(); /*0xffe3c4a9*/\n Status = (*(int ( **)(int, void *, _DWORD, _DWORD, char **))(*(_DWORD *)PpiServices + 32))( /*0xffe3c4be*/\n PpiServices,\n &unk_FFE3E344,\n 0,\n 0,\n &%04d_%02d_%02d_%02d:%02d:%02d_:_%a.);\n if ( Status >= 0 ) /*0xffe3c4c6*/\n return (*((int ( **)(char *, int, _DWORD, int, char *, _DWORD, _DWORD, char *))%04d_%02d_%02d_%02d:%02d:%02d_:_%a. /*0xffe3c4e4*/\n + 3))(\n %04d_%02d_%02d_%02d:%02d:%02d_:_%a.,\n 46,\n 0,\n 71,\n &DebugStatus,\n (unsigned __int8)(FormatLength + 2),\n 0,\n &OutputByte);\n return Status; /*0xffe3c4eb*/\n}","refs":[{"addr":"0xffe3c949","name":"AsciiSPrint"},{"addr":"0xffe3c7a4","name":"ReadRtcDateTime"},{"addr":"0xffe3c88b","name":"AsciiSPrintFormat"},{"addr":"0xffe3d994","name":"%04d_%02d_%02d_%02d:%02d:%02d_:_%a.","string":"%04d/%02d/%02d-%02d:%02d:%02d : %a."},{"addr":"0xffe3c596","name":"PeiServicesGetPointer"},{"addr":"0xffe3e344","name":"unk_FFE3E344"}]} + PpiServices = PeiServicesGetPointer(); + if ((*(int (**)(int, void *, _DWORD, int *, int *))(*(_DWORD *)PpiServices + 32))( + PpiServices, + &unk_FFE3E334, + 0, + &Guid, + &DebugServicePtr) >= 0) + return DebugServicePtr; + return 0; +} -{"addr":"0xffe3c4f0","code":"int PeiLnvSendIpmiCmdConstructor(int PeiServices)\n{\n int LocateStatus; // eax\n int ReturnStatus; // esi\n int DebugService; // eax\n\n LocateStatus = (*(int ( **)(int, void *, _DWORD, _DWORD, void *))(*(_DWORD *)PeiServices + 32))( /*0xffe3c506*/\n PeiServices,\n &unk_FFE3E344,\n 0,\n 0,\n &unk_FFE3E3C8);\n ReturnStatus = LocateStatus; /*0xffe3c509*/\n if ( LocateStatus < 0 ) /*0xffe3c510*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", LocateStatus); /*0xffe3c51d*/\n DebugService = GetDebugService(); /*0xffe3c525*/\n if ( DebugService ) /*0xffe3c52c*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3c53d*/\n \"e:\\\\hs\\\\LenovoServerPkg\\\\Library\\\\LnvIpmiLib\\\\IpmiCmd\\\\PeiLnvSendIpmiCmdLib.c\",\n 218,\n \"!EFI_ERROR (Status)\");\n }\n return ReturnStatus; /*0xffe3c545*/\n}","refs":[{"addr":"0xffe3e344","name":"unk_FFE3E344"},{"addr":"0xffe3e3c8","name":"unk_FFE3E3C8"},{"addr":"0xffe3c296","name":"DebugPrint"},{"addr":"0xffe3d6f4","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe3c265","name":"GetDebugService"},{"addr":"0xffe3d9bc","name":"aEHsLenovoserve","string":"e:\\hs\\LenovoServerPkg\\Library\\LnvIpmiLib\\IpmiCmd\\PeiLnvSendIpmiCmdLib.c"},{"addr":"0xffe3d718","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"}]} +int DebugPrint(int a1, const char *a2, ...) +{ + int result; + int (**v3)(int, const char *, char *); + va_list va; -{"addr":"0xffe3c547","code":"int DebugPrintLevelEnabled()\n{\n unsigned __int8 RtcIndexReg; // al\n char DebugLevel; // al\n char LevelCheck; // cl\n\n RtcIndexReg = __inbyte(0x70u); /*0xffe3c54d*/\n __outbyte(0x70u, RtcIndexReg & 0x80 | 0x4A); /*0xffe3c552*/\n DebugLevel = __inbyte(0x71u); /*0xffe3c559*/\n LevelCheck = DebugLevel; /*0xffe3c55a*/\n if ( (unsigned __int8)DebugLevel <= 3u ) /*0xffe3c55f*/\n {\nLABEL_4:\n if ( !LevelCheck ) /*0xffe3c57a*/\n return 0; /*0xffe3c57a*/\n goto LABEL_5; /*0xffe3c57a*/\n }\n LevelCheck = n3; /*0xffe3c561*/\n if ( !n3 ) /*0xffe3c569*/\n {\n LevelCheck = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe3c575*/\n goto LABEL_4; /*0xffe3c575*/\n }\nLABEL_5:\n if ( LevelCheck != -1 )\n return LevelCheck != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe3c592*/\n}","refs":[{"addr":"0xffe3e3c4","name":"n3"}]} + va_start(va, a2); + result = GetDebugService(); + v3 = (int (**)(int, const char *, char *))result; + if (result) { + result = DebugPrintLevelEnabled(); + if ((result & a1) != 0) + return (*v3)(a1, a2, (char *)va); + } + return result; +} -{"addr":"0xffe3c596","code":"int PeiServicesGetPointer()\n{\n int PeiServicesPtr; // esi\n _BYTE Idtr[2]; // [esp+4h] [ebp-8h] BYREF\n int IdtrBase; // [esp+6h] [ebp-6h]\n\n X86ReadIdtr(Idtr); /*0xffe3c59f*/\n PeiServicesPtr = *(_DWORD *)(IdtrBase - 4); /*0xffe3c5a7*/\n if ( !PeiServicesPtr ) /*0xffe3c5ac*/\n PeiServicesGetIdt( /*0xffe3c5bb*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n (int)\"PeiServices != ((void *) 0)\");\n return PeiServicesPtr; /*0xffe3c5c3*/\n}","refs":[{"addr":"0xffe3d5c0","name":"X86ReadIdtr"},{"addr":"0xffe3c2c0","name":"PeiServicesGetIdt"}]} +int PeiServicesGetIdt(int a, int b, int c) +{ + int result; -{"addr":"0xffe3c5c8","code":"void *__thiscall HobConstructorInternal(void *this)\n{\n __int64 Unaligned64; // rax\n __int64 Unaligned64_1; // rax\n\n Unaligned64 = ReadUnaligned64(&unk_FFE3E314); /*0xffe3c5d0*/\n WriteUnaligned32(Unaligned64, SHIDWORD(Unaligned64)); /*0xffe3c5d9*/\n Unaligned64_1 = ReadUnaligned64(&unk_FFE3E31C); /*0xffe3c5e3*/\n WriteUnaligned32(Unaligned64_1, SHIDWORD(Unaligned64_1)); /*0xffe3c5ed*/\n return this; /*0xffe3c5f7*/\n}","refs":[{"addr":"0xffe3d60a","name":"ReadUnaligned64"},{"addr":"0xffe3e314","name":"unk_FFE3E314"},{"addr":"0xffe3d636","name":"WriteUnaligned32"},{"addr":"0xffe3e31c","name":"unk_FFE3E31C"}]} + result = GetDebugService(); + if (result) + return (*(int (**)(int, int, int))(result + 4))(a, b, c); + return result; +} -{"addr":"0xffe3c5f9","code":"char *StrCpySInternal(char *dst, char *src)\n{\n if ( dst == src ) /*0xffe3c5fb*/\n return dst; /*0xffe3c5fd*/\n else\n return AsciiStrCpyS(dst, src, 1u); /*0xffe3c604*/\n}","refs":[{"addr":"0xffe3bff4","name":"AsciiStrCpyS"}]} +int InternalHobConstructor(int HobGuid, int HobType) +{ + int PpiServices; + int DebugService; + int HobPtr; -{"addr":"0xffe3c60d","code":"int RtcCenturySet(char CenturyByte)\n{\n int RtcDataPtr; // ecx\n int RtcDataPtr_1; // esi\n unsigned __int8 CenturyBcd; // bh\n unsigned __int8 CenturyMsb; // ah\n char CenturyBcd2; // bh\n unsigned __int8 CenturyLsb; // bl\n unsigned int CenturyDec; // edx\n char CenturyDec2; // cl\n unsigned int CenturyDec3; // edx\n int CenturyResult; // edx\n unsigned __int8 RtcIndexRead; // al\n\n RtcDataPtr_1 = RtcDataPtr; /*0xffe3c613*/\n CenturyBcd = *(_BYTE *)(RtcDataPtr + 4); /*0xffe3c618*/\n CenturyMsb = CenturyBcd & 0x7F; /*0xffe3c61a*/\n CenturyBcd2 = CenturyBcd >> 7; /*0xffe3c61d*/\n *(_BYTE *)(RtcDataPtr + 4) = CenturyMsb; /*0xffe3c620*/\n if ( (CenturyByte & 4) == 0 ) /*0xffe3c625*/\n {\n CenturyLsb = *(_BYTE *)(RtcDataPtr + 6); /*0xffe3c63a*/\n CenturyDec = *(unsigned __int8 *)(RtcDataPtr + 2); /*0xffe3c63f*/\n *(_WORD *)RtcDataPtr = (unsigned __int8)(*(_BYTE *)RtcDataPtr - 6 * (*(_BYTE *)RtcDataPtr >> 4)); /*0xffe3c648*/\n CenturyDec2 = -6 * (CenturyDec >> 4); /*0xffe3c657*/\n CenturyDec3 = *(unsigned __int8 *)(RtcDataPtr_1 + 3); /*0xffe3c659*/\n *(_BYTE *)(RtcDataPtr_1 + 2) += CenturyDec2; /*0xffe3c65d*/\n *(_BYTE *)(RtcDataPtr_1 + 3) += -6 * (CenturyDec3 >> 4); /*0xffe3c671*/\n CenturyResult = *(unsigned __int8 *)(RtcDataPtr_1 + 5) >> 4; /*0xffe3c688*/\n *(_BYTE *)(RtcDataPtr_1 + 4) = CenturyMsb - 6 * (CenturyMsb >> 4); /*0xffe3c68b*/\n *(_BYTE *)(RtcDataPtr_1 + 5) += -6 *CenturyResult; /*0xffe3c69c*/\n *(_BYTE *)(RtcDataPtr_1 + 6) = CenturyLsb - 6 * (CenturyLsb >> 4); /*0xffe3c6af*/\n }\n if ( (CenturyByte & 2) == 0 ) /*0xffe3c6b6*/\n {\n if ( CenturyBcd2 ) /*0xffe3c6ba*/\n {\n RtcIndexRead = *(_BYTE *)(RtcDataPtr_1 + 4); /*0xffe3c6bc*/\n if ( RtcIndexRead < 0xCu ) /*0xffe3c6c1*/\n *(_BYTE *)(RtcDataPtr_1 + 4) = RtcIndexRead + 12; /*0xffe3c6c5*/\n }\n else if ( *(_BYTE *)(RtcDataPtr_1 + 4) == 12 ) /*0xffe3c6ce*/\n {\n *(_BYTE *)(RtcDataPtr_1 + 4) = 0; /*0xffe3c6d0*/\n }\n }\n *(_DWORD *)(RtcDataPtr_1 + 8) = 0; /*0xffe3c6d8*/\n *(_WORD *)(RtcDataPtr_1 + 12) = 2047; /*0xffe3c6db*/\n *(_BYTE *)(RtcDataPtr_1 + 14) = 0; /*0xffe3c6df*/\n return 2047; /*0xffe3c6e2*/\n}"} + PpiServices = PeiServicesGetPointer(); + if ((*(int (**)(int, int, int, int *))(*(_DWORD *)PpiServices + 52))(PpiServices, 4, HobType, &HobPtr) < 0) + HobPtr = 0; + if (!HobPtr) { + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c", 250, "Hob != ((void *) 0)"); + } + return HobPtr; +} -{"addr":"0xffe3c6e5","code":"bool IsLeapYear()\n{\n unsigned __int8 RtcIndexReg; // al\n unsigned __int8 CenturyReg; // al\n unsigned __int8 CenturyReg_1; // cl\n unsigned __int8 RtcIndexReg2; // al\n unsigned __int8 YearReg; // al\n unsigned __int8 RtcIndexReg3; // al\n char CenturyCalc; // bl\n unsigned __int8 RtcIndexReg4; // al\n\n RtcIndexReg = __inbyte(0x70u); /*0xffe3c6ee*/\n __outbyte(0x70u, RtcIndexReg & 0x80 | 0x32); /*0xffe3c6f3*/\n CenturyReg = __inbyte(0x71u); /*0xffe3c6fa*/\n CenturyReg_1 = CenturyReg; /*0xffe3c6fb*/\n RtcIndexReg2 = __inbyte(0x70u); /*0xffe3c700*/\n __outbyte(0x70u, RtcIndexReg2 & 0x80 | 0x32); /*0xffe3c705*/\n __outbyte(0x71u, 0); /*0xffe3c70b*/\n YearReg = __inbyte(0x70u); /*0xffe3c70f*/\n __outbyte(0x70u, YearReg & 0x80 | 0x32); /*0xffe3c714*/\n RtcIndexReg3 = __inbyte(0x71u); /*0xffe3c718*/\n CenturyCalc = RtcIndexReg3 & 0x7F; /*0xffe3c71b*/\n RtcIndexReg4 = __inbyte(0x70u); /*0xffe3c721*/\n __outbyte(0x70u, RtcIndexReg4 & 0x80 | 0x32); /*0xffe3c726*/\n __outbyte(0x71u, CenturyReg_1); /*0xffe3c72c*/\n return CenturyCalc == 25 || CenturyCalc == 32; /*0xffe3c73d*/\n}"} +char *InternalBuildGuidHob(int HobGuid, char *DataBuffer) +{ + int DebugService; + int HobPtr; + int HobCopy; -{"addr":"0xffe3c741","code":"bool IsHobInitialized()\n{\n unsigned __int8 RtcIndexReg; // al\n unsigned __int8 HobInitFlag; // al\n int TimeoutCount; // ecx\n unsigned __int8 RtcIndexReg2; // al\n char RtcUpdateFlag; // al\n unsigned __int8 RtcIndexReg3; // al\n unsigned __int8 RtcIndexReg4; // al\n unsigned __int8 n0x80; // al\n\n RtcIndexReg = __inbyte(0x70u); /*0xffe3c74a*/\n __outbyte(0x70u, RtcIndexReg & 0x80 | 0xD); /*0xffe3c74f*/\n HobInitFlag = __inbyte(0x71u); /*0xffe3c756*/\n if ( HobInitFlag < 0x80u ) /*0xffe3c759*/\n return 0; /*0xffe3c759*/\n TimeoutCount = 10001; /*0xffe3c75b*/\n RtcIndexReg2 = __inbyte(0x70u); /*0xffe3c763*/\n __outbyte(0x70u, RtcIndexReg2 & 0x80 | 0xA); /*0xffe3c768*/\n RtcUpdateFlag = __inbyte(0x71u); /*0xffe3c76c*/\n while ( RtcUpdateFlag < 0 && TimeoutCount ) /*0xffe3c771*/\n {\n RtcIndexReg3 = __inbyte(0x70u); /*0xffe3c776*/\n __outbyte(0x70u, RtcIndexReg3 & 0x80 | 0xA); /*0xffe3c77b*/\n RtcUpdateFlag = __inbyte(0x71u); /*0xffe3c77f*/\n --TimeoutCount; /*0xffe3c780*/\n }\n RtcIndexReg4 = __inbyte(0x70u); /*0xffe3c788*/\n __outbyte(0x70u, RtcIndexReg4 & 0x80 | 0xD); /*0xffe3c78d*/\n n0x80 = __inbyte(0x71u); /*0xffe3c791*/\n return TimeoutCount && n0x80 >= 0x80u; /*0xffe3c79a*/\n}"} + if (!DataBuffer) { + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c", 466, "Data != ((void *) 0) || DataLength == 0"); + } + HobPtr = InternalHobConstructor(HobGuid, 25); + HobCopy = HobPtr; + if (!HobPtr) + return 0; + HobConstructorInternal((void *)(HobPtr + 8)); + if (HobCopy == -24) + return 0; + return StrCpySInternal((char *)(HobCopy + 24), DataBuffer); +} -{"addr":"0xffe3c7a4","code":"char __thiscall ReadRtcDateTime(_BYTE *this)\n{\n unsigned __int8 RtcIndexVal; // al\n char CenturyByte; // al\n unsigned __int8 SecIndexVal; // al\n unsigned __int8 RtcSecond; // al\n unsigned __int8 MinIndexVal; // al\n unsigned __int8 RtcMinute; // al\n unsigned __int8 HourIndexVal; // al\n unsigned __int8 RtcHour; // al\n unsigned __int8 DayIndexVal; // al\n unsigned __int8 RtcDay; // al\n unsigned __int8 MonthIndexVal; // al\n unsigned __int8 RtcMonth; // al\n unsigned __int8 YearIndexVal; // al\n unsigned __int8 RtcYearLow; // al\n bool IsLeapYear; // zf\n unsigned __int8 CentIndexVal; // al\n unsigned __int8 RtcCentury; // al\n char CenturyByte_1; // [esp+4h] [ebp-4h]\n\n if ( !this || !IsHobInitialized() ) /*0xffe3c7b6*/\n return 0; /*0xffe3c7af*/\n RtcIndexVal = __inbyte(0x70u); /*0xffe3c7c7*/\n __outbyte(0x70u, RtcIndexVal & 0x80 | 0xB); /*0xffe3c7cc*/\n CenturyByte = __inbyte(0x71u); /*0xffe3c7d3*/\n CenturyByte_1 = CenturyByte; /*0xffe3c7d4*/\n SecIndexVal = __inbyte(0x70u); /*0xffe3c7da*/\n __outbyte(0x70u, SecIndexVal & 0x80); /*0xffe3c7dd*/\n RtcSecond = __inbyte(0x71u); /*0xffe3c7e1*/\n *(this + 6) = RtcSecond; /*0xffe3c7e2*/\n MinIndexVal = __inbyte(0x70u); /*0xffe3c7e8*/\n __outbyte(0x70u, MinIndexVal & 0x80 | 2); /*0xffe3c7ed*/\n RtcMinute = __inbyte(0x71u); /*0xffe3c7f1*/\n *(this + 5) = RtcMinute; /*0xffe3c7f2*/\n HourIndexVal = __inbyte(0x70u); /*0xffe3c7f8*/\n __outbyte(0x70u, HourIndexVal & 0x80 | 4); /*0xffe3c7fd*/\n RtcHour = __inbyte(0x71u); /*0xffe3c801*/\n *(this + 4) = RtcHour; /*0xffe3c802*/\n DayIndexVal = __inbyte(0x70u); /*0xffe3c808*/\n __outbyte(0x70u, DayIndexVal & 0x80 | 7); /*0xffe3c80d*/\n RtcDay = __inbyte(0x71u); /*0xffe3c811*/\n *(this + 3) = RtcDay; /*0xffe3c812*/\n MonthIndexVal = __inbyte(0x70u); /*0xffe3c818*/\n __outbyte(0x70u, MonthIndexVal & 0x80 | 8); /*0xffe3c81d*/\n RtcMonth = __inbyte(0x71u); /*0xffe3c821*/\n *(this + 2) = RtcMonth; /*0xffe3c822*/\n YearIndexVal = __inbyte(0x70u); /*0xffe3c828*/\n __outbyte(0x70u, YearIndexVal & 0x80 | 9); /*0xffe3c82d*/\n RtcYearLow = __inbyte(0x71u); /*0xffe3c831*/\n *(_WORD *)this = RtcYearLow; /*0xffe3c83a*/\n RtcCenturySet(CenturyByte_1); /*0xffe3c83d*/\n IsLeapYear = ::IsLeapYear(); /*0xffe3c84b*/\n CentIndexVal = __inbyte(0x70u); /*0xffe3c84d*/\n __outbyte(0x70u, CentIndexVal & 0x80 | 0x32); /*0xffe3c854*/\n RtcCentury = __inbyte(0x71u); /*0xffe3c858*/\n if ( IsLeapYear ) /*0xffe3c84e*/\n RtcCentury &= ~0x80u; /*0xffe3c859*/\n *(_WORD *)this += 100 * (unsigned __int8)(RtcCentury - 6 * (RtcCentury >> 4)); /*0xffe3c881*/\n return 1; /*0xffe3c886*/\n}","refs":[{"addr":"0xffe3c741","name":"IsHobInitialized"},{"addr":"0xffe3c60d","name":"RtcCenturySet"},{"addr":"0xffe3c6e5","name":"IsLeapYear"}]} +int __thiscall GetCmosService(void *this) +{ + int PpiServices; + _DWORD CmosProtocolGuid[4]; -{"addr":"0xffe3c88b","code":"unsigned int AsciiSPrintFormat(_BYTE *_r_n, unsigned int n254, char *%04d_%02d_%02d_%02d:%02d:%02d_:_%a., ...)\n{\n va_list va; // [esp+10h] [ebp+10h] BYREF\n\n va_start(va, %04d_%02d_%02d_%02d:%02d:%02d_:_%a.);\n return AsciiSPrint(_r_n, n254, 0, %04d_%02d_%02d_%02d:%02d:%02d_:_%a., (char *)va); /*0xffe3c8a7*/\n}","refs":[{"addr":"0xffe3c949","name":"AsciiSPrint"}]} + CmosProtocolGuid[0] = -859887738; + CmosProtocolGuid[1] = 1124650348; + CmosProtocolGuid[2] = 1482881725; + CmosProtocolGuid[3] = -2118136208; + if (!this) + return -2147483646; + PpiServices = PeiServicesGetPointer(); + if (PpiServices) + return (*(int (**)(int, _DWORD *, _DWORD, _DWORD, void *))(*(_DWORD *)PpiServices + 32))(PpiServices, CmosProtocolGuid, 0, 0, this); + return -2147483645; +} -{"addr":"0xffe3c8a8","code":"_BYTE *BasePrintLibSPrintMarker(_BYTE *a1, unsigned int a2, int i, __int16 a4, int a5)\n{\n int j; // esi\n\n for ( j = 0; j < i; ++j ) /*0xffe3c8b4*/\n {\n if ( (unsigned int)a1 >= a2 ) /*0xffe3c8bb*/\n break; /*0xffe3c8bb*/\n *a1 = a4; /*0xffe3c8c1*/\n if ( a5 != 1 ) /*0xffe3c8c3*/\n a1[1] = HIBYTE(a4); /*0xffe3c8ca*/\n a1 += a5; /*0xffe3c8cd*/\n }\n return a1; /*0xffe3c8d6*/\n}"} +int CmosWriteByte(int CmosAddress, int DataValue) +{ + int Status; + int CmosProtocol; -{"addr":"0xffe3c8dc","code":"_BYTE *DivU64x32Remainder(_BYTE *_r_n, unsigned int n16, int a3, unsigned int a4)\n{\n _BYTE *_r_n_1; // esi\n int DebugService; // eax\n int v7; // eax\n int v8; // edx\n unsigned __int64 v9; // rtt\n unsigned int v11; // [esp-4h] [ebp-1Ch]\n int v12; // [esp+Ch] [ebp-Ch] BYREF\n int *v13; // [esp+10h] [ebp-8h]\n unsigned int n16_1; // [esp+14h] [ebp-4h]\n\n _r_n_1 = _r_n; /*0xffe3c8e3*/\n v13 = &v12; /*0xffe3c8eb*/\n n16_1 = n16; /*0xffe3c8ee*/\n *_r_n = 0; /*0xffe3c8f1*/\n do /*0xffe3c932*/\n {\n if ( !n16 ) /*0xffe3c8f6*/\n {\n DebugService = GetDebugService(); /*0xffe3c8f8*/\n if ( DebugService ) /*0xffe3c8ff*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3c90d*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\DivU64x32Remainder.c\",\n 47,\n \"Divisor != 0\");\n }\n v11 = a4 / n16_1; /*0xffe3c91d*/\n LODWORD(v9) = a3; /*0xffe3c921*/\n HIDWORD(v9) = a4 % n16_1; /*0xffe3c921*/\n v7 = v9 / n16_1; /*0xffe3c921*/\n v8 = v9 % n16_1; /*0xffe3c921*/\n if ( v13 ) /*0xffe3c926*/\n *v13 = v8; /*0xffe3c928*/\n ++_r_n_1; /*0xffe3c92e*/\n a3 = v7; /*0xffe3c92f*/\n a4 = v11; /*0xffe3c934*/\n *_r_n_1 = byte_FFE3E094[v12]; /*0xffe3c93d*/\n }\n while ( v11 | v7 ); /*0xffe3c932*/\n return _r_n_1; /*0xffe3c941*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"},{"addr":"0xffe3e094","name":"byte_FFE3E094"}]} + CmosProtocol = 0; + Status = GetCmosService(&CmosProtocol); + if (Status >= 0) + return (*(int (**)(int, int, int))(CmosProtocol + 8))(CmosProtocol, CmosAddress, DataValue); + return Status; +} -Output truncated. Run: curl -o .ida-mcp/0b8a686b-3f89-4e9f-afda-7d760be8fb15.json http://127.0.0.1:13390/output/0b8a686b-3f89-4e9f-afda-7d760be8fb15.json +int LnvDebugSwitchPpiCallback(char *fmt, ...) +{ + int Status; + unsigned int SprintLength; + unsigned int FormatLength; + int PpiServices; + double DebugBuffer; + char DebugStatus; + _BYTE LogBuffer[255]; + _BYTE _r_n[230]; + char PrintStatus; + unsigned __int16 RtcYear; + unsigned __int8 RtcMonth; + unsigned __int8 RtcDay; + unsigned __int8 RtcHour; + unsigned __int8 RtcMinute; + unsigned __int8 RtcSecond; + char OutputByte; + va_list va; -{"addr":"0xffe3d5a1","code":"unsigned int AsciiSPrintUnicode(_BYTE *_r_n, unsigned int n38, __int16 a3, char *%02d_%02d_%04d__%02d:%02d, ...)\n{\n va_list va; // [esp+18h] [ebp+18h] BYREF\n\n va_start(va, %02d_%02d_%04d__%02d:%02d);\n return AsciiSPrint(_r_n, n38, a3, %02d_%02d_%04d__%02d:%02d, (char *)va); /*0xffe3d5be*/\n}","refs":[{"addr":"0xffe3c949","name":"AsciiSPrint"}]} + va_start(va, fmt); + OutputByte = 0; + if (!fmt) + return -2147483646; + SprintLength = AsciiSPrint(_r_n, 0x100u, 0, fmt, (char *)va); + PrintStatus = SprintLength <= 0xE6 ? PrintStatus : 0; + ReadRtcDateTime(&RtcYear); + DebugStatus = 0; + LODWORD(DebugBuffer) = _r_n; + FormatLength = AsciiSPrintFormat(LogBuffer, 0xFEu, "%04d/%02d/%02d-%02d:%02d:%02d : %a.", RtcYear, RtcMonth, RtcDay, RtcHour, RtcMinute, RtcSecond, DebugBuffer); + if (FormatLength > 0xFD) + return -2147483643; + PpiServices = PeiServicesGetPointer(); + Status = (*(int (**)(int, void *, _DWORD, _DWORD, char **))(*(_DWORD *)PpiServices + 32))(PpiServices, &unk_FFE3E344, 0, 0, &fmt); + if (Status >= 0) + return (*((int (**)(char *, int, _DWORD, int, char *, _DWORD, _DWORD, char *))fmt + 3))(fmt, 46, 0, 71, &DebugStatus, (unsigned __int8)(FormatLength + 2), 0, &OutputByte); + return Status; +} -{"addr":"0xffe3d5c0","code":"void *__thiscall X86ReadIdtr(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe3d5c6*/\n PeiServicesGetIdt((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, (int)\"Idtr != ((void *) 0)\"); /*0xffe3d5d5*/\n this_1 = this; /*0xffe3d5db*/\n __sidt(this); /*0xffe3d5de*/\n return this_1; /*0xffe3d5e2*/\n}","refs":[{"addr":"0xffe3c2c0","name":"PeiServicesGetIdt"},{"addr":"0xffe3e095","name":"a123456789abcde","string":"123456789ABCDEFIdtr != ((void *) 0)"}]} +int PeiLnvSendIpmiCmdConstructor(int PeiServices) +{ + int LocateStatus; + int ReturnStatus; + int DebugService; -{"addr":"0xffe3d5e3","code":"__int16 __thiscall ReadUnaligned16(void *this)\n{\n int DebugService; // eax\n\n if ( !this ) /*0xffe3d5e8*/\n {\n DebugService = GetDebugService(); /*0xffe3d5ea*/\n if ( DebugService ) /*0xffe3d5f1*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3d5ff*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 38,\n \"Buffer != ((void *) 0)\");\n }\n return *(_WORD *)this; /*0xffe3d608*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"}]} + LocateStatus = (*(int (**)(int, void *, _DWORD, _DWORD, void *))(*(_DWORD *)PeiServices + 32))(PeiServices, &unk_FFE3E344, 0, 0, &unk_FFE3E3C8); + ReturnStatus = LocateStatus; + if (LocateStatus < 0) { + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", LocateStatus); + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\LenovoServerPkg\\Library\\LnvIpmiLib\\IpmiCmd\\PeiLnvSendIpmiCmdLib.c", 218, "!EFI_ERROR (Status)"); + } + return ReturnStatus; +} -{"addr":"0xffe3d60a","code":"__int64 __thiscall ReadUnaligned64(void *this)\n{\n int DebugService; // eax\n\n if ( !this ) /*0xffe3d60f*/\n {\n DebugService = GetDebugService(); /*0xffe3d611*/\n if ( DebugService ) /*0xffe3d618*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3d629*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 192,\n \"Buffer != ((void *) 0)\");\n }\n return *(_QWORD *)this; /*0xffe3d634*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"}]} +int DebugPrintLevelEnabled(void) +{ + unsigned __int8 RtcIndexReg; + char DebugLevel; + char LevelCheck; -{"addr":"0xffe3d636","code":"int WriteUnaligned32(int Unaligned64, int a2)\n{\n _DWORD *v2; // ecx\n _DWORD *v3; // esi\n int DebugService; // eax\n\n v3 = v2; /*0xffe3d637*/\n if ( !v2 ) /*0xffe3d63b*/\n {\n DebugService = GetDebugService(); /*0xffe3d63d*/\n if ( DebugService ) /*0xffe3d644*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3d655*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 219,\n \"Buffer != ((void *) 0)\");\n }\n *v3 = Unaligned64; /*0xffe3d663*/\n v3[1] = a2; /*0xffe3d665*/\n return Unaligned64; /*0xffe3d668*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"}]} + RtcIndexReg = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg & 0x80 | 0x4A); + DebugLevel = __inbyte(0x71u); + LevelCheck = DebugLevel; + if ((unsigned __int8)DebugLevel <= 3u) { + if (!LevelCheck) + return 0; + goto LABEL_5; + } + LevelCheck = n3; + if (!n3) { + LevelCheck = MEMORY[0xFDAF0490] & 2 | 1; + } +LABEL_5: + if (LevelCheck != -1) + return LevelCheck != 1 ? -2147483578 : -2147483644; + return 0; +} -{"addr":"0xffe3d66a","code":"unsigned int __thiscall StrLenInternal(char *%04d_%02d_%02d_%02d:%02d:%02d_:_%a.)\n{\n int DebugService; // eax\n unsigned int StrIndex; // eax\n\n if ( ((unsigned __int8)%04d_%02d_%02d_%02d:%02d:%02d_:_%a. & 1) != 0 ) /*0xffe3d670*/\n {\n DebugService = GetDebugService(); /*0xffe3d672*/\n if ( DebugService ) /*0xffe3d679*/\n (*(void ( **)(const char *, int, const char *))(DebugService + 4))( /*0xffe3d68a*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 128,\n \"((UINTN) String & 0x00000001) == 0\");\n }\n if ( !%04d_%02d_%02d_%02d:%02d:%02d_:_%a. ) /*0xffe3d692*/\n return 0; /*0xffe3d6b4*/\n StrIndex = 0; /*0xffe3d696*/\n if ( *(_WORD *)%04d_%02d_%02d_%02d:%02d:%02d_:_%a. ) /*0xffe3d698*/\n {\n while ( StrIndex < 0xF4240 ) /*0xffe3d6a2*/\n {\n ++StrIndex; /*0xffe3d6a4*/\n if ( !*((_WORD *)%04d_%02d_%02d_%02d:%02d:%02d_:_%a. + StrIndex) ) /*0xffe3d6a5*/\n return StrIndex; /*0xffe3d6a9*/\n }\n return 1000001; /*0xffe3d6ad*/\n }\n return StrIndex; /*0xffe3d6ab*/\n}","refs":[{"addr":"0xffe3c265","name":"GetDebugService"}]} +int PeiServicesGetPointer(void) +{ + int PeiServicesPtr; + _BYTE Idtr[2]; + int IdtrBase; -{"addr":"0xffe3d6b8","code":"unsigned int __thiscall StrSizeInternal(char *%04d_%02d_%02d_%02d:%02d:%02d_:_%a.)\n{\n unsigned int n0xF4240; // eax\n\n n0xF4240 = 0; /*0xffe3d6b8*/\n if ( %04d_%02d_%02d_%02d:%02d:%02d_:_%a. && *%04d_%02d_%02d_%02d:%02d:%02d_:_%a. ) /*0xffe3d6be*/\n {\n while ( n0xF4240 < 0xF4240 ) /*0xffe3d6c7*/\n {\n if ( !*(%04d_%02d_%02d_%02d:%02d:%02d_:_%a. + ++n0xF4240) ) /*0xffe3d6ca*/\n return n0xF4240; /*0xffe3d6ce*/\n }\n return 1000001; /*0xffe3d6d1*/\n }\n return n0xF4240; /*0xffe3d6d0*/\n}"} + X86ReadIdtr(Idtr); + PeiServicesPtr = *(_DWORD *)(IdtrBase - 4); + if (!PeiServicesPtr) + PeiServicesGetIdt((int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c", 48, (int)"PeiServices != ((void *) 0)"); + return PeiServicesPtr; +} +void *HobConstructorInternal(void *this) +{ + __int64 Unaligned64; + __int64 Unaligned64_1; + + Unaligned64 = ReadUnaligned64(&unk_FFE3E314); + WriteUnaligned32(Unaligned64, SHIDWORD(Unaligned64)); + Unaligned64_1 = ReadUnaligned64(&unk_FFE3E31C); + WriteUnaligned32(Unaligned64_1, SHIDWORD(Unaligned64_1)); + return this; +} + +char *StrCpySInternal(char *dst, char *src) +{ + if (dst == src) + return dst; + return AsciiStrCpyS(dst, src, 1u); +} + +int RtcCenturySet(char CenturyByte) +{ + int RtcDataPtr; + int RtcDataPtr_1; + unsigned __int8 CenturyBcd; + unsigned __int8 CenturyMsb; + char CenturyBcd2; + unsigned __int8 CenturyLsb; + unsigned int CenturyDec; + char CenturyDec2; + unsigned int CenturyDec3; + int CenturyResult; + unsigned __int8 RtcIndexRead; + + RtcDataPtr_1 = RtcDataPtr; + CenturyBcd = *(_BYTE *)(RtcDataPtr + 4); + CenturyMsb = CenturyBcd & 0x7F; + CenturyBcd2 = CenturyBcd >> 7; + *(_BYTE *)(RtcDataPtr + 4) = CenturyMsb; + if ((CenturyByte & 4) == 0) { + CenturyLsb = *(_BYTE *)(RtcDataPtr + 6); + CenturyDec = *(unsigned __int8 *)(RtcDataPtr + 2); + *(_WORD *)RtcDataPtr = (unsigned __int8)(*(_BYTE *)RtcDataPtr - 6 * (*(_BYTE *)RtcDataPtr >> 4)); + CenturyDec2 = -6 * (CenturyDec >> 4); + CenturyDec3 = *(unsigned __int8 *)(RtcDataPtr_1 + 3); + *(_BYTE *)(RtcDataPtr_1 + 2) += CenturyDec2; + *(_BYTE *)(RtcDataPtr_1 + 3) += -6 * (CenturyDec3 >> 4); + CenturyResult = *(unsigned __int8 *)(RtcDataPtr_1 + 5) >> 4; + *(_BYTE *)(RtcDataPtr_1 + 4) = CenturyMsb - 6 * (CenturyMsb >> 4); + *(_BYTE *)(RtcDataPtr_1 + 5) += -6 * CenturyResult; + *(_BYTE *)(RtcDataPtr_1 + 6) = CenturyLsb - 6 * (CenturyLsb >> 4); + } + if ((CenturyByte & 2) == 0) { + if (CenturyBcd2) { + RtcIndexRead = *(_BYTE *)(RtcDataPtr_1 + 4); + if (RtcIndexRead < 0xCu) + *(_BYTE *)(RtcDataPtr_1 + 4) = RtcIndexRead + 12; + } else if (*(_BYTE *)(RtcDataPtr_1 + 4) == 12) { + *(_BYTE *)(RtcDataPtr_1 + 4) = 0; + } + } + *(_DWORD *)(RtcDataPtr_1 + 8) = 0; + *(_WORD *)(RtcDataPtr_1 + 12) = 2047; + *(_BYTE *)(RtcDataPtr_1 + 14) = 0; + return 2047; +} + +bool IsLeapYear(void) +{ + unsigned __int8 RtcIndexReg; + unsigned __int8 CenturyReg; + unsigned __int8 CenturyReg_1; + unsigned __int8 RtcIndexReg2; + unsigned __int8 YearReg; + unsigned __int8 RtcIndexReg3; + char CenturyCalc; + unsigned __int8 RtcIndexReg4; + + RtcIndexReg = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg & 0x80 | 0x32); + CenturyReg = __inbyte(0x71u); + CenturyReg_1 = CenturyReg; + RtcIndexReg2 = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg2 & 0x80 | 0x32); + __outbyte(0x71u, 0); + YearReg = __inbyte(0x70u); + __outbyte(0x70u, YearReg & 0x80 | 0x32); + RtcIndexReg3 = __inbyte(0x71u); + CenturyCalc = RtcIndexReg3 & 0x7F; + RtcIndexReg4 = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg4 & 0x80 | 0x32); + __outbyte(0x71u, CenturyReg_1); + return CenturyCalc == 25 || CenturyCalc == 32; +} + +bool IsHobInitialized(void) +{ + unsigned __int8 RtcIndexReg; + unsigned __int8 HobInitFlag; + int TimeoutCount; + unsigned __int8 RtcIndexReg2; + char RtcUpdateFlag; + unsigned __int8 RtcIndexReg3; + unsigned __int8 RtcIndexReg4; + unsigned __int8 n0x80; + + RtcIndexReg = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg & 0x80 | 0xD); + HobInitFlag = __inbyte(0x71u); + if (HobInitFlag < 0x80u) + return 0; + TimeoutCount = 10001; + RtcIndexReg2 = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg2 & 0x80 | 0xA); + RtcUpdateFlag = __inbyte(0x71u); + while (RtcUpdateFlag < 0 && TimeoutCount) { + RtcIndexReg3 = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg3 & 0x80 | 0xA); + RtcUpdateFlag = __inbyte(0x71u); + --TimeoutCount; + } + RtcIndexReg4 = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexReg4 & 0x80 | 0xD); + n0x80 = __inbyte(0x71u); + return TimeoutCount && n0x80 >= 0x80u; +} + +char __thiscall ReadRtcDateTime(_BYTE *this) +{ + unsigned __int8 RtcIndexVal; + char CenturyByte; + unsigned __int8 SecIndexVal; + unsigned __int8 RtcSecond; + unsigned __int8 MinIndexVal; + unsigned __int8 RtcMinute; + unsigned __int8 HourIndexVal; + unsigned __int8 RtcHour; + unsigned __int8 DayIndexVal; + unsigned __int8 RtcDay; + unsigned __int8 MonthIndexVal; + unsigned __int8 RtcMonth; + unsigned __int8 YearIndexVal; + unsigned __int8 RtcYearLow; + bool IsLeapYear; + unsigned __int8 CentIndexVal; + unsigned __int8 RtcCentury; + char CenturyByte_1; + + if (!this || !IsHobInitialized()) + return 0; + RtcIndexVal = __inbyte(0x70u); + __outbyte(0x70u, RtcIndexVal & 0x80 | 0xB); + CenturyByte = __inbyte(0x71u); + CenturyByte_1 = CenturyByte; + SecIndexVal = __inbyte(0x70u); + __outbyte(0x70u, SecIndexVal & 0x80); + RtcSecond = __inbyte(0x71u); + *(this + 6) = RtcSecond; + MinIndexVal = __inbyte(0x70u); + __outbyte(0x70u, MinIndexVal & 0x80 | 2); + RtcMinute = __inbyte(0x71u); + *(this + 5) = RtcMinute; + HourIndexVal = __inbyte(0x70u); + __outbyte(0x70u, HourIndexVal & 0x80 | 4); + RtcHour = __inbyte(0x71u); + *(this + 4) = RtcHour; + DayIndexVal = __inbyte(0x70u); + __outbyte(0x70u, DayIndexVal & 0x80 | 7); + RtcDay = __inbyte(0x71u); + *(this + 3) = RtcDay; + MonthIndexVal = __inbyte(0x70u); + __outbyte(0x70u, MonthIndexVal & 0x80 | 8); + RtcMonth = __inbyte(0x71u); + *(this + 2) = RtcMonth; + YearIndexVal = __inbyte(0x70u); + __outbyte(0x70u, YearIndexVal & 0x80 | 9); + RtcYearLow = __inbyte(0x71u); + *(_WORD *)this = RtcYearLow; + RtcCenturySet(CenturyByte_1); + IsLeapYear = ::IsLeapYear(); + CentIndexVal = __inbyte(0x70u); + __outbyte(0x70u, CentIndexVal & 0x80 | 0x32); + RtcCentury = __inbyte(0x71u); + if (IsLeapYear) + RtcCentury &= ~0x80u; + *(_WORD *)this += 100 * (unsigned __int8)(RtcCentury - 6 * (RtcCentury >> 4)); + return 1; +} + +unsigned int AsciiSPrintFormat(_BYTE *_r_n, unsigned int n254, char *fmt, ...) +{ + va_list va; + + va_start(va, fmt); + return AsciiSPrint(_r_n, n254, 0, fmt, (char *)va); +} + +_BYTE *BasePrintLibSPrintMarker(_BYTE *a1, unsigned int a2, int i, __int16 a4, int a5) +{ + int j; + + for (j = 0; j < i; ++j) { + if ((unsigned int)a1 >= a2) + break; + *a1 = a4; + if (a5 != 1) + a1[1] = HIBYTE(a4); + a1 += a5; + } + return a1; +} + +_BYTE *DivU64x32Remainder(_BYTE *_r_n, unsigned int n16, int a3, unsigned int a4) +{ + _BYTE *_r_n_1; + int DebugService; + int v7; + int v8; + unsigned __int64 v9; + unsigned int v11; + int v12; + int *v13; + unsigned int n16_1; + + _r_n_1 = _r_n; + v13 = &v12; + n16_1 = n16; + *_r_n = 0; + do { + if (!n16) { + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\MdePkg\\Library\\BaseLib\\DivU64x32Remainder.c", 47, "Divisor != 0"); + } + v11 = a4 / n16_1; + LODWORD(v9) = a3; + HIDWORD(v9) = a4 % n16_1; + v7 = v9 / n16_1; + v8 = v9 % n16_1; + if (v13) + *v13 = v8; + ++_r_n_1; + a3 = v7; + a4 = v11; + *_r_n_1 = byte_FFE3E094[v12]; + } while (v11 | v7); + return _r_n_1; +} + +unsigned int AsciiSPrintUnicode(_BYTE *_r_n, unsigned int n38, __int16 a3, char *fmt, ...) +{ + va_list va; + + va_start(va, fmt); + return AsciiSPrint(_r_n, n38, a3, fmt, (char *)va); +} + +void *__thiscall X86ReadIdtr(void *this) +{ + void *this_1; + + if (!this) + PeiServicesGetIdt((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, (int)"Idtr != ((void *) 0)"); + this_1 = this; + __sidt(this); + return this_1; +} + +__int16 __thiscall ReadUnaligned16(void *this) +{ + int DebugService; + + if (!this) { + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 38, "Buffer != ((void *) 0)"); + } + return *(_WORD *)this; +} + +__int64 __thiscall ReadUnaligned64(void *this) +{ + int DebugService; + + if (!this) { + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, "Buffer != ((void *) 0)"); + } + return *(_QWORD *)this; +} + +int WriteUnaligned32(int Unaligned64, int a2) +{ + _DWORD *v2; + _DWORD *v3; + int DebugService; + + v3 = v2; + if (!v2) { + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 219, "Buffer != ((void *) 0)"); + } + *v3 = Unaligned64; + v3[1] = a2; + return Unaligned64; +} + +unsigned int __thiscall StrLenInternal(char *String) +{ + int DebugService; + unsigned int StrIndex; + + if (((unsigned __int8)String & 1) != 0) { + DebugService = GetDebugService(); + if (DebugService) + (*(void (**)(const char *, int, const char *))(DebugService + 4))("e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", 128, "((UINTN) String & 0x00000001) == 0"); + } + if (!String) + return 0; + StrIndex = 0; + if (*(_WORD *)String) { + while (StrIndex < 0xF4240) { + ++StrIndex; + if (!*((_WORD *)String + StrIndex)) + return StrIndex; + } + return 1000001; + } + return StrIndex; +} + +unsigned int __thiscall StrSizeInternal(char *String) +{ + unsigned int n0xF4240; + + n0xF4240 = 0; + if (String && *String) { + while (n0xF4240 < 0xF4240) { + if (!*(String + ++n0xF4240)) + return n0xF4240; + } + return 1000001; + } + return n0xF4240; +} diff --git a/LenovoServerPkg/Driver/LnvPurleyDriverPei/LnvPurleyDriverPei.c b/LenovoServerPkg/Driver/LnvPurleyDriverPei/LnvPurleyDriverPei.c index 6083c9f..0be59dd 100644 --- a/LenovoServerPkg/Driver/LnvPurleyDriverPei/LnvPurleyDriverPei.c +++ b/LenovoServerPkg/Driver/LnvPurleyDriverPei/LnvPurleyDriverPei.c @@ -1,35 +1,224 @@ // // LnvPurleyDriverPei.efi - Full Decompilation -// Source: IDA Pro MCP port 13391 -// Functions: 13 // #include #include -{"addr":"0xffe3e7bc","code":"void *memset(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe3e7c9*/\n return buf; /*0xffe3e7cf*/\n}"} +void *memset(void *buf, unsigned int count, char value) +{ + memset(buf, value, count); + return buf; +} -{"addr":"0xffe3e7dc","code":"int InternalFillMemory(int a1, int a2, int a3, int a4)\n{\n do /*0xffe3e7f5*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe3e7ed*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe3e7f1*/\n }\n while ( a2 ); /*0xffe3e7f5*/\n return a1; /*0xffe3e7f9*/\n}"} +int InternalFillMemory(int a1, int a2, int a3, int a4) +{ + do { + *(_DWORD *)(a1 + 8 * a2 - 8) = a3; + *(_DWORD *)(a1 + 8 * a2-- - 4) = a4; + } while (a2); -{"addr":"0xffe3e7fc","code":"void *memset32(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe3e809*/\n return buf; /*0xffe3e80f*/\n}"} + return a1; +} -{"addr":"0xffe3e81c","code":"char *CopyMem(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe3e826*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe3e834*/\n {\n src_1 = &src[count - 1]; /*0xffe3e848*/\n dst_1 = &dst[count - 1]; /*0xffe3e84a*/\n }\n else\n {\n count_1 = count & 3; /*0xffe3e838*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe3e841*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe3e841*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe3e841*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe3e851*/\n return dst; /*0xffe3e858*/\n}"} +void *memset32(void *buf, unsigned int count, int value) +{ + memset32(buf, value, count); + return buf; +} -{"addr":"0xffe3e87c","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n int v2; // eax\n int v3; // edi\n int v4; // eax\n EFI_STATUS v5; // esi\n\n if ( (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, void *))(LODWORD(SystemTable->Hdr.Signature) + 32))( /*0xffe3e89a*/\n SystemTable,\n &unk_FFE3EDEC,\n 0,\n 0,\n &unk_FFE3EE60) < 0 )\n {\n v2 = (*(int ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( /*0xffe3e8a5*/\n SystemTable,\n &unk_FFE3EE50);\n v3 = v2; /*0xffe3e8a8*/\n if ( v2 < 0 ) /*0xffe3e8ae*/\n {\n DebugPrint(-1, \"PEI - PeiLnvSendIpmiCmdLibConstructor NotifyPpi Status = %r \\n\", v2); /*0xffe3e8b8*/\n DebugPrint(-1, \"PeiLnvSendIpmiCmdLibConstructor Status = %r \\n\", v3); /*0xffe3e8c5*/\n }\n }\n v4 = (*(int ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( /*0xffe3e8d6*/\n SystemTable,\n &unk_FFE3EE2C);\n v5 = v4; /*0xffe3e8d9*/\n if ( v4 < 0 ) /*0xffe3e8df*/\n DebugPrint(-1, \"PEI - LnvPurleyDriverPEI_Init Notify PPI Status = %r \\n\", v4); /*0xffe3e8e9*/\n return v5; /*0xffe3e8f3*/\n}","refs":[{"addr":"0xffe3ee50","name":"gLnvPurleyNotifyPpiDescriptor2"},{"addr":"0xffe3e929","name":"DebugPrint"},{"addr":"0xffe3eb34","name":"aPeiPeilnvsendi","string":"PEI - PeiLnvSendIpmiCmdLibConstructor NotifyPpi Status = %r \n"},{"addr":"0xffe3eb74","name":"aPeilnvsendipmi","string":"PeiLnvSendIpmiCmdLibConstructor Status = %r \n"},{"addr":"0xffe3edec","name":"gLnvPurleyDriverPpiGuid"},{"addr":"0xffe3ee60","name":"gLnvPurleyInstallPpiDescriptor"},{"addr":"0xffe3ee2c","name":"gLnvPurleyNotifyPpiDescriptor1"},{"addr":"0xffe3eab4","name":"aPeiLnvpurleydr","string":"PEI - LnvPurleyDriverPEI_Init Notify PPI Status = %r \n"}]} +char *CopyMem(char *dst, char *src, unsigned int count) +{ + unsigned int count_1; + char *dst_1; + char *src_1; -{"addr":"0xffe3e8f5","code":"int PpiNotifyCallbackStub()\n{\n return 0; /*0xffe3e8f7*/\n}"} + count_1 = count; + if (src < dst && &src[count - 1] >= dst) { + src_1 = &src[count - 1]; + dst_1 = &dst[count - 1]; + } else { + count_1 = count & 3; + qmemcpy(dst, src, 4 * (count >> 2)); + src_1 = &src[4 * (count >> 2)]; + dst_1 = &dst[4 * (count >> 2)]; + } -{"addr":"0xffe3e8f8","code":"int GetDebugPpiInterface()\n{\n int PeiServicesTablePointer; // eax\n int v2; // [esp+0h] [ebp-8h] BYREF\n int v3; // [esp+4h] [ebp-4h] BYREF\n\n PeiServicesTablePointer = GetPeiServicesTablePointer(); /*0xffe3e8fd*/\n if ( (*(int ( **)(int, void *, _DWORD, int *, int *))(*(_DWORD *)PeiServicesTablePointer + 32))( /*0xffe3e91c*/\n PeiServicesTablePointer,\n &unk_FFE3EDDC,\n 0,\n &v2,\n &v3) >= 0 )\n return v3; /*0xffe3e922*/\n else\n return 0; /*0xffe3e91e*/\n}","refs":[{"addr":"0xffe3ea17","name":"GetPeiServicesTablePointer"},{"addr":"0xffe3eddc","name":"gLnvPurleyDebugPpiGuid"}]} + qmemcpy(dst_1, src_1, count_1); + return dst; +} -{"addr":"0xffe3e929","code":"int DebugPrint(int a1, const char *PEI___PeiLnvSendIpmiCmdLibConstructor_NotifyPpi_Status___%r__n, ...)\n{\n int result; // eax\n int ( **v3)(int, const char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, PEI___PeiLnvSendIpmiCmdLibConstructor_NotifyPpi_Status___%r__n);\n result = GetDebugPpiInterface(); /*0xffe3e92a*/\n v3 = (int ( **)(int, const char *, char *))result; /*0xffe3e92f*/\n if ( result ) /*0xffe3e933*/\n {\n result = PeiGetPlatformType(); /*0xffe3e935*/\n if ( (result & a1) != 0 ) /*0xffe3e940*/\n return (*v3)(a1, PEI___PeiLnvSendIpmiCmdLibConstructor_NotifyPpi_Status___%r__n, (char *)va); /*0xffe3e94c*/\n }\n return result; /*0xffe3e951*/\n}","refs":[{"addr":"0xffe3e8f8","name":"GetDebugPpiInterface"},{"addr":"0xffe3e9c8","name":"PeiGetPlatformType"}]} +EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + int v2; + int v3; + int v4; + EFI_STATUS v5; -{"addr":"0xffe3e953","code":"int DebugAssert(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n int PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = GetDebugPpiInterface(); /*0xffe3e959*/\n if ( result ) /*0xffe3e960*/\n return (*(int ( **)(int, int, int))(result + 4))( /*0xffe3e968*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe3e96e*/\n}","refs":[{"addr":"0xffe3e8f8","name":"GetDebugPpiInterface"}]} + if ((*(int (**)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, void *))(LODWORD(SystemTable->Hdr.Signature) + 32))( + SystemTable, + &unk_FFE3EDEC, + 0, + 0, + &unk_FFE3EE60) < 0) + { + v2 = (*(int (**)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( + SystemTable, + &unk_FFE3EE50); + v3 = v2; + if (v2 < 0) { + DebugPrint(-1, "PEI - PeiLnvSendIpmiCmdLibConstructor NotifyPpi Status = %r \n", v2); + DebugPrint(-1, "PeiLnvSendIpmiCmdLibConstructor Status = %r \n", v3); + } + } -{"addr":"0xffe3e971","code":"int LnvSendIpmiCmd(int a1)\n{\n int v1; // eax\n int v2; // esi\n int DebugPpiInterface; // eax\n\n v1 = (*(int ( **)(int, void *, _DWORD, _DWORD, void *))(*(_DWORD *)a1 + 32))( /*0xffe3e987*/\n a1,\n &unk_FFE3EDEC,\n 0,\n 0,\n &unk_FFE3EE60);\n v2 = v1; /*0xffe3e98a*/\n if ( v1 < 0 ) /*0xffe3e991*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v1); /*0xffe3e99e*/\n DebugPpiInterface = GetDebugPpiInterface(); /*0xffe3e9a6*/\n if ( DebugPpiInterface ) /*0xffe3e9ad*/\n (*(void ( **)(const char *, int, const char *))(DebugPpiInterface + 4))( /*0xffe3e9be*/\n \"e:\\\\hs\\\\LenovoServerPkg\\\\Library\\\\LnvIpmiLib\\\\IpmiCmd\\\\PeiLnvSendIpmiCmdLib.c\",\n 218,\n \"!EFI_ERROR (Status)\");\n }\n return v2; /*0xffe3e9c6*/\n}","refs":[{"addr":"0xffe3edec","name":"gLnvPurleyDriverPpiGuid"},{"addr":"0xffe3ee60","name":"gLnvPurleyInstallPpiDescriptor"},{"addr":"0xffe3e929","name":"DebugPrint"},{"addr":"0xffe3e8f8","name":"GetDebugPpiInterface"},{"addr":"0xffe3eaec","name":"aEHsLenovoserve","string":"e:\\hs\\LenovoServerPkg\\Library\\LnvIpmiLib\\IpmiCmd\\PeiLnvSendIpmiCmdLib.c"},{"addr":"0xffe3eaa0","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"}]} + v4 = (*(int (**)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( + SystemTable, + &unk_FFE3EE2C); + v5 = v4; + if (v4 < 0) { + DebugPrint(-1, "PEI - LnvPurleyDriverPEI_Init Notify PPI Status = %r \n", v4); + } + return v5; +} -{"addr":"0xffe3e9c8","code":"int PeiGetPlatformType()\n{\n unsigned __int8 v0; // al\n char n3; // al\n char n3_1; // cl\n\n v0 = __inbyte(0x70u); /*0xffe3e9ce*/\n __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe3e9d3*/\n n3 = __inbyte(0x71u); /*0xffe3e9da*/\n n3_1 = n3; /*0xffe3e9db*/\n if ( (unsigned __int8)n3 <= 3u ) /*0xffe3e9e0*/\n {\nLABEL_4:\n if ( !n3_1 ) /*0xffe3e9fb*/\n return 0; /*0xffe3e9fb*/\n goto LABEL_5; /*0xffe3e9fb*/\n }\n n3_1 = n3; /*0xffe3e9e2*/\n if ( !n3 ) /*0xffe3e9ea*/\n {\n n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe3e9f6*/\n goto LABEL_4; /*0xffe3e9f6*/\n }\nLABEL_5:\n if ( n3_1 != -1 )\n return n3_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe3ea13*/\n}","refs":[{"addr":"0xffe3ee5c","name":"n3"}]} +int PpiNotifyCallbackStub(void) +{ + return 0; +} -{"addr":"0xffe3ea17","code":"int GetPeiServicesTablePointer()\n{\n int v0; // esi\n _BYTE v2[8]; // [esp+4h] [ebp-8h] BYREF\n\n InternalX86ReadIdtr(v2); /*0xffe3ea20*/\n v0 = *(_DWORD *)(*(_DWORD *)&v2[2] - 4); /*0xffe3ea28*/\n if ( !v0 ) /*0xffe3ea2d*/\n DebugAssert( /*0xffe3ea3c*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n (int)\"PeiServices != ((void *) 0)\");\n return v0; /*0xffe3ea44*/\n}","refs":[{"addr":"0xffe3ea49","name":"InternalX86ReadIdtr"},{"addr":"0xffe3e953","name":"DebugAssert"}]} +int GetDebugPpiInterface(void) +{ + int PeiServicesTablePointer; + int v2; + int v3; -{"addr":"0xffe3ea49","code":"void *__thiscall InternalX86ReadIdtr(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe3ea4f*/\n DebugAssert((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, (int)\"Idtr != ((void *) 0)\"); /*0xffe3ea5e*/\n this_1 = this; /*0xffe3ea64*/\n __sidt(this); /*0xffe3ea67*/\n return this_1; /*0xffe3ea6b*/\n}","refs":[{"addr":"0xffe3e953","name":"DebugAssert"}]} + PeiServicesTablePointer = GetPeiServicesTablePointer(); + if ((*(int (**)(int, void *, _DWORD, int *, int *))(*(_DWORD *)PeiServicesTablePointer + 32))( + PeiServicesTablePointer, + &unk_FFE3EDDC, + 0, + &v2, + &v3) >= 0) + { + return v3; + } + return 0; +} + +int DebugPrint(int a1, const char *Format, ...) +{ + int result; + int (**v3)(int, const char *, char *); + va_list va; + + va_start(va, Format); + result = GetDebugPpiInterface(); + v3 = (int (**)(int, const char *, char *))result; + if (result) { + result = PeiGetPlatformType(); + if ((result & a1) != 0) { + return (*v3)(a1, Format, (char *)va); + } + } + + return result; +} + +int DebugAssert(int e, int n48, int PeiServices) +{ + int result; + + result = GetDebugPpiInterface(); + if (result) { + return (*(int (**)(int, int, int))(result + 4))(e, n48, PeiServices); + } + + return result; +} + +int LnvSendIpmiCmd(int a1) +{ + int v1; + int v2; + int DebugPpiInterface; + + v1 = (*(int (**)(int, void *, _DWORD, _DWORD, void *))(*(_DWORD *)a1 + 32))( + a1, + &unk_FFE3EDEC, + 0, + 0, + &unk_FFE3EE60); + v2 = v1; + if (v1 < 0) { + DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); + DebugPpiInterface = GetDebugPpiInterface(); + if (DebugPpiInterface) { + (*(void (**)(const char *, int, const char *))(DebugPpiInterface + 4))( + "e:\\hs\\LenovoServerPkg\\Library\\LnvIpmiLib\\IpmiCmd\\PeiLnvSendIpmiCmdLib.c", + 218, + "!EFI_ERROR (Status)"); + } + } + + return v2; +} + +int PeiGetPlatformType(void) +{ + unsigned __int8 v0; + char n3; + char n3_1; + + v0 = __inbyte(0x70u); + __outbyte(0x70u, v0 & 0x80 | 0x4A); + n3 = __inbyte(0x71u); + n3_1 = n3; + if ((unsigned __int8)n3 <= 3u) { +LABEL_4: + if (!n3_1) { + return 0; + } + goto LABEL_5; + } + n3_1 = n3; + if (!n3) { + n3_1 = MEMORY[0xFDAF0490] & 2 | 1; + goto LABEL_4; + } +LABEL_5: + if (n3_1 != -1) { + return n3_1 != 1 ? -2147483578 : -2147483644; + } + return 0; +} + +int GetPeiServicesTablePointer(void) +{ + int v0; + _BYTE v2[8]; + + InternalX86ReadIdtr(v2); + v0 = *(_DWORD *)(*(_DWORD *)&v2[2] - 4); + if (!v0) { + DebugAssert( + (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c", + 48, + (int)"PeiServices != ((void *) 0)"); + } + + return v0; +} + +void *__thiscall InternalX86ReadIdtr(void *this) +{ + void *this_1; + + if (!this) { + DebugAssert((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, (int)"Idtr != ((void *) 0)"); + } + this_1 = this; + __sidt(this); + return this_1; +} diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.c b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.c index 603d011..b849fd5 100644 --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.c +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.c @@ -7,163 +7,2640 @@ #include #include -{"addr":"0xffc15298","code":"int DxeIplZeroMem()\n{\n unsigned __int32 v0; // eax\n unsigned __int64 v1; // rax\n _BYTE retaddr[8]; // [esp+0h] [ebp+0h]\n\n _disable(); /*0xffc15298*/\n *(_DWORD *)retaddr = &byte_FFC152BF; /*0xffc15299*/\n v0 = __readcr4(); /*0xffc152a0*/\n LOBYTE(v0) = v0 | 0x20; /*0xffc152a3*/\n __writecr4(v0); /*0xffc152a5*/\n v1 = __readmsr(0xC0000080); /*0xffc152ad*/\n BYTE1(v1) |= 1u; /*0xffc152af*/\n __writemsr(0xC0000080, v1); /*0xffc152b2*/\n LODWORD(v1) = __readcr0(); /*0xffc152b4*/\n __writecr0(v1 | 0x80000000); /*0xffc152bb*/\n return MK_FP(*(_WORD *)retaddr, *(_DWORD *)retaddr)(-1073741696, HIDWORD(v1));\n}","refs":[{"addr":"0xffc152bf","name":"byte_FFC152BF"}]} -{"addr":"0xffc152e8","code":"char *DxeIplCopyMem(char *dst, char *src, unsigned int count_1)\n{\n unsigned int count; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count = count_1; /*0xffc152f2*/\n if ( src < dst && &src[count_1 - 1] >= dst ) /*0xffc15300*/\n {\n src_1 = &src[count_1 - 1]; /*0xffc15314*/\n dst_1 = &dst[count_1 - 1]; /*0xffc15316*/\n }\n else\n {\n count = count_1 & 3; /*0xffc15304*/\n qmemcpy(dst, src, 4 * (count_1 >> 2)); /*0xffc1530d*/\n src_1 = &src[4 * (count_1 >> 2)]; /*0xffc1530d*/\n dst_1 = &dst[4 * (count_1 >> 2)]; /*0xffc1530d*/\n }\n qmemcpy(dst_1, src_1, count); /*0xffc1531d*/\n return dst; /*0xffc15324*/\n}"} -{"addr":"0xffc15328","code":"void *DxeIplSetMem32(void *buf, unsigned int count)\n{\n memset(buf, 0, count); /*0xffc1533f*/\n return buf; /*0xffc15346*/\n}"} -{"addr":"0xffc15348","code":"void *DxeIplSetMem64(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffc15355*/\n return buf; /*0xffc1535b*/\n}"} -{"addr":"0xffc15368","code":"int DxeIplGetNextHob(int a1, int a2, int a3, int a4)\n{\n do /*0xffc15381*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffc15379*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffc1537d*/\n }\n while ( a2 ); /*0xffc15381*/\n return a1; /*0xffc15385*/\n}"} -{"addr":"0xffc15388","code":"void *DxeIplGetFirstHob(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffc15395*/\n return buf; /*0xffc1539b*/\n}"} -{"addr":"0xffc15428","code":"_WORD *DxeIplSetMem16(_WORD *a1, int a2, __int16 a3)\n{\n _WORD *v3; // edi\n\n v3 = a1; /*0xffc1542d*/\n while ( a2 ) /*0xffc15435*/\n {\n *v3++ = a3; /*0xffc15435*/\n --a2; /*0xffc15435*/\n }\n return a1; /*0xffc1543c*/\n}"} -{"addr":"0xffc1543e","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n void *v2; // ecx\n int v3; // ebp\n void *v4; // ecx\n void *v5; // ecx\n int ModuleBase; // eax\n bool v7; // zf\n EFI_STATUS result; // eax\n int v9; // [esp-14h] [ebp-1Ch]\n _DWORD *v10; // [esp-14h] [ebp-1Ch]\n _BYTE v11[6]; // [esp-Ch] [ebp-14h] BYREF\n int v12; // [esp-4h] [ebp-Ch] BYREF\n _BYTE *v13; // [esp+0h] [ebp-8h]\n int v14; // [esp+4h] [ebp-4h]\n\n if ( *(char *)(DxeIplGetModuleBase(v2) + 1024068) >= 0 ) /*0xffc1544f*/\n {\n DxeIplInitGlobalFlags(v4); /*0xffc15451*/\n ModuleBase = DxeIplGetModuleBase(v5); /*0xffc15456*/\n *(_BYTE *)(ModuleBase + 1024068) |= 0x80u; /*0xffc15462*/\n }\n DxeIplInstallPpi((char *)FvDeviceHandle, (int (*)())DxeIplPpiNotifyCallback, (int (*)())DxeIplPeiEndCallback); /*0xffc15473*/\n DxeIplInstallPpi((char *)DxeIplPpi, (int (*)())DxeIplDxeIplPpiNotify, (int (*)())DxeIplEndOfPeiNotify); /*0xffc15489*/\n off_FFC18DF8 = &unk_FFC18B10; /*0xffc15493*/\n n64 = 64; /*0xffc1549d*/\n v14 = v3; /*0xffc154ad*/\n v7 = DxeIplGetPlatformBootMode() == 17; /*0xffc154bb*/\n v13 = v11; /*0xffc154c1*/\n if ( v7 ) /*0xffc154c4*/\n {\n __sidt(v13); /*0xffc15506*/\n (*(void ( **)(_DWORD, void *))(**(_DWORD **)(*(_DWORD *)&v11[2] - 4) + 36))( /*0xffc15517*/\n *(_DWORD *)(*(_DWORD *)&v11[2] - 4),\n &unk_FFC18A64);\n return DxeIplReportStatus(&unk_FFC18A7C); /*0xffc15517*/\n }\n __sidt(v13); /*0xffc154c9*/\n result = (*(int ( **)(EFI_HANDLE))(**(_DWORD **)(*(_DWORD *)&v11[2] - 4) + 116))(ImageHandle); /*0xffc154d5*/\n if ( result ) /*0xffc154db*/\n {\n result = DxeIplLocatePpiByGuid((int)&unk_FFC18D68, 0, v9, (int)&v12); /*0xffc154e9*/\n if ( (result & 0x80000000) == 0 ) /*0xffc154f2*/\n {\n DxeIplDebugPrint(v10); /*0xffc154f9*/\n return DxeIplReportStatus(&unk_FFC18A7C); /*0xffc1551c*/\n }\n }\n return result; /*0xffc1552a*/\n}","refs":[{"addr":"0xffc189f5","name":"DxeIplInitGlobalFlags"},{"addr":"0xffc189e9","name":"DxeIplGetModuleBase"},{"addr":"0xffc1643f","name":"DxeIplInstallPpi"},{"addr":"0xffc18d18","name":"FvDeviceHandle"},{"addr":"0xffc16e63","name":"DxeIplPpiNotifyCallback"},{"addr":"0xffc16ee0","name":"DxeIplPeiEndCallback"},{"addr":"0xffc18d58","name":"DxeIplPpi"},{"addr":"0xffc17152","name":"DxeIplDxeIplPpiNotify"},{"addr":"0xffc171c8","name":"DxeIplEndOfPeiNotify"},{"addr":"0xffc18df8","name":"off_FFC18DF8"},{"addr":"0xffc18b10","name":"unk_FFC18B10"},{"addr":"0xffc18dfc","name":"n64"},{"addr":"0xffc16085","name":"DxeIplGetPlatformBootMode"},{"addr":"0xffc18a64","name":"unk_FFC18A64"},{"addr":"0xffc16201","name":"DxeIplReportStatus"},{"addr":"0xffc18a7c","name":"unk_FFC18A7C"},{"addr":"0xffc16226","name":"DxeIplLocatePpiByGuid"},{"addr":"0xffc18d68","name":"unk_FFC18D68"},{"addr":"0xffc1552b","name":"DxeIplDebugPrint"}]} -{"addr":"0xffc1552b","code":"int __thiscall DxeIplDebugPrint(_DWORD *this)\n{\n int v1; // esi\n int v2; // ebp\n _DWORD *v3; // edi\n int v4; // ebx\n _DWORD *this_1; // [esp+0h] [ebp-4h] BYREF\n\n this_1 = this; /*0xffc1552b*/\n if ( DxeIplFvOpenDevice(&this_1) >= 0 ) /*0xffc15536*/\n {\n v1 = this_1[1]; /*0xffc1553d*/\n v2 = this_1[2]; /*0xffc15540*/\n if ( v1 ) /*0xffc15545*/\n {\n v3 = (_DWORD *)DxeIplAllocateZeroPages(12 *v1); /*0xffc15553*/\n v4 = v2 + 16 *v1; /*0xffc15558*/\n do /*0xffc1557a*/\n {\n v4 -= 16; /*0xffc1555a*/\n *v3 = -2147483632; /*0xffc1555d*/\n v3[2] = &off_FFC18A4C; /*0xffc15565*/\n v3[1] = v4; /*0xffc1556c*/\n DxeIplReportStatus(v3); /*0xffc1556f*/\n v3 += 3; /*0xffc15574*/\n --v1; /*0xffc15577*/\n }\n while ( v1 ); /*0xffc1557a*/\n }\n }\n return DxeIplReportStatus(&unk_FFC18A54);\n}","refs":[{"addr":"0xffc1634f","name":"DxeIplAllocateZeroPages"},{"addr":"0xffc18a4c","name":"off_FFC18A4C"},{"addr":"0xffc16201","name":"DxeIplReportStatus"},{"addr":"0xffc163a4","name":"DxeIplFvOpenDevice"},{"addr":"0xffc18a54","name":"unk_FFC18A54"}]} -{"addr":"0xffc1558d","code":"char DxeIplMeasureFv(int a1, unsigned int n128)\n{\n unsigned int n128_1; // eax\n int v4; // eax\n\n if ( !a1 ) /*0xffc15592*/\n return 0; /*0xffc15592*/\n n128_1 = 8 * (n128 >> 3); /*0xffc1559f*/\n if ( n128_1 != n128 || *(_DWORD *)(n128_1 + a1 - 8) != 15 ) /*0xffc155ab*/\n return 0; /*0xffc15597*/\n v4 = 0; /*0xffc155ad*/\n if ( n128 >> 3 != 1 ) /*0xffc155b2*/\n {\n while ( *(_DWORD *)(a1 + 8 *v4) < 0xFu ) /*0xffc155b8*/\n {\n if ( ++v4 >= (n128 >> 3) - 1 ) /*0xffc155bd*/\n return 1; /*0xffc155bd*/\n }\n return 0; /*0xffc155b8*/\n }\n return 1; /*0xffc15596*/\n}"} -{"addr":"0xffc155c3","code":"int DxeIplFvReadSection(int a1, int a2, int *a3, unsigned int *a4, int a5)\n{\n int v5; // edi\n int result; // eax\n unsigned int v7; // esi\n unsigned int v8; // ecx\n int v9; // ecx\n int v10; // eax\n _BYTE v11[4]; // [esp+Ch] [ebp-14h] BYREF\n _DWORD *v12; // [esp+10h] [ebp-10h] BYREF\n unsigned int v13; // [esp+14h] [ebp-Ch] BYREF\n unsigned int v14; // [esp+18h] [ebp-8h]\n unsigned int v15; // [esp+1Ch] [ebp-4h] BYREF\n\n v5 = 0; /*0xffc155d3*/\n result = DxeIplFvOpenDevice(&v12); /*0xffc155d5*/\n if ( result >= 0 ) /*0xffc155df*/\n {\n v7 = 0; /*0xffc155ef*/\n v8 = v12[1]; /*0xffc15603*/\n v14 = v8; /*0xffc15606*/\n if ( v8 ) /*0xffc1560c*/\n {\n v8 = v12[2]; /*0xffc1560e*/\n while ( !(unsigned __int8)DxeIplFvIsAddrValid(v8) ) /*0xffc15618*/\n {\n ++v7; /*0xffc1561a*/\n v8 = v9 + 16; /*0xffc1561b*/\n if ( v7 >= v14 ) /*0xffc15622*/\n goto LABEL_6; /*0xffc15622*/\n }\n result = (*(int ( **)(int, unsigned int *, unsigned int *, _BYTE *))(v12[4] + 4 *v7))(a2, &v13, &v15, v11); /*0xffc15675*/\n }\n else\n {\nLABEL_6:\n result = -2147483645; /*0xffc15624*/\n }\n if ( result >= 0 ) /*0xffc1562b*/\n {\n if ( v15 ) /*0xffc15637*/\n {\n v5 = DxeIplAllocatePages(v8, (v15 >> 12) + ((v15 & 0xFFF) != 0)); /*0xffc15651*/\n if ( !v5 ) /*0xffc15655*/\n return -2147483639; /*0xffc15655*/\n }\n if ( (v11[0] & 1) != 0 && v13 ) /*0xffc1568d*/\n {\n v10 = DxeIplAllocatePages(v8, (v13 >> 12) + ((v13 & 0xFFF) != 0) + 1); /*0xffc156a0*/\n *a3 = v10; /*0xffc156a5*/\n if ( !v10 ) /*0xffc156a9*/\n return -2147483639; /*0xffc1565c*/\n *a3 = v10 + 4092; /*0xffc156b0*/\n }\n result = DxeIplDecompress(v5, a5); /*0xffc156ba*/\n if ( result >= 0 ) /*0xffc156c3*/\n {\n *a4 = v13; /*0xffc156cc*/\n return 0; /*0xffc156ce*/\n }\n }\n }\n return result; /*0xffc156d0*/\n}","refs":[{"addr":"0xffc163a4","name":"DxeIplFvOpenDevice"},{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc1632d","name":"DxeIplAllocatePages"},{"addr":"0xffc164ee","name":"DxeIplDecompress"}]} -{"addr":"0xffc156d7","code":"int DxeIplFvExtractSection(int FvHandle, unsigned int SrcSize_, int *DstBuffer, unsigned int *DstSize)\n{\n unsigned int SectionType; // ecx\n unsigned int SectionStart; // eax\n int TypeFlag; // ecx\n unsigned int SectionType_2; // edi\n int HeaderSize; // ecx\n unsigned int CompSize; // edx\n unsigned __int8 *src; // ebx\n int Scratch; // ecx\n unsigned __int8 **Pages; // ebp\n int DstAlloc; // eax\n int DstPtr; // esi\n int BufAlloc; // eax\n int SavedCtx; // [esp-14h] [ebp-18h]\n unsigned int SectionType_1; // [esp+0h] [ebp-4h] BYREF\n\n SectionType_1 = SectionType; /*0xffc156d7*/\n SectionStart = SrcSize_; /*0xffc156d8*/\n if ( *(_BYTE *)(SrcSize_ + 3) != 1 ) /*0xffc156e0*/\n return -2147483646; /*0xffc156e8*/\n TypeFlag = *(_DWORD *)SrcSize_ & 0xFFFFFF; /*0xffc156f0*/\n if ( TypeFlag == 0xFFFFFF ) /*0xffc156f6*/\n {\n SectionType_2 = *(_DWORD *)(SrcSize_ + 8); /*0xffc156fe*/\n HeaderSize = 13; /*0xffc15703*/\n CompSize = *(_DWORD *)(SrcSize_ + 4) - 13; /*0xffc15704*/\n LOBYTE(SrcSize_) = *(_BYTE *)(SrcSize_ + 12); /*0xffc15706*/\n }\n else\n {\n SectionType_2 = *(_DWORD *)(SrcSize_ + 4); /*0xffc1570c*/\n CompSize = TypeFlag - 9; /*0xffc1570f*/\n LOBYTE(SrcSize_) = *(_BYTE *)(SrcSize_ + 8); /*0xffc15717*/\n HeaderSize = 9; /*0xffc1571b*/\n }\n src = (unsigned __int8 *)(HeaderSize + SectionStart); /*0xffc1571c*/\n if ( (_BYTE)SrcSize_ ) /*0xffc15729*/\n {\n if ( (unsigned __int8)SrcSize_ != 1 || DxeIplLzmaGetProp(src, CompSize, &SectionType_1, &SrcSize_) < 0 ) /*0xffc15745*/\n return -2147483634; /*0xffc15745*/\n Pages = (unsigned __int8 **)DxeIplAllocatePages(SavedCtx, (SrcSize_ >> 12) + ((SrcSize_ & 0xFFF) != 0)); /*0xffc15764*/\n if ( Pages ) /*0xffc15768*/\n {\n SectionType_2 = SectionType_1; /*0xffc1576a*/\n DstAlloc = DxeIplAllocatePages(Scratch, (SectionType_1 >> 12) + ((SectionType_1 & 0xFFF) != 0) + 1); /*0xffc1577e*/\n if ( DstAlloc ) /*0xffc15787*/\n {\n DstPtr = DstAlloc + 4092; /*0xffc15789*/\n if ( (DxeIplLzmaDecodeProp(src, (unsigned __int8 *)(DstAlloc + 4092), Pages, 1) & 0x80000000) != 0 ) /*0xffc1579f*/\n return -2147483634; /*0xffc157a6*/\n goto LABEL_16; /*0xffc1579f*/\n }\n }\n return -2147483639; /*0xffc157cc*/\n }\n BufAlloc = DxeIplAllocatePages(HeaderSize, (SectionType_2 >> 12) + ((SectionType_2 & 0xFFF) != 0) + 1); /*0xffc157bc*/\n if ( !BufAlloc ) /*0xffc157c5*/\n return -2147483639; /*0xffc157c5*/\n DstPtr = BufAlloc + 4092; /*0xffc157ce*/\n DxeIplFvFreePages((char *)(BufAlloc + 4092), (char *)src, SectionType_2); /*0xffc157d9*/\nLABEL_16:\n *DstSize = SectionType_2; /*0xffc157df*/\n *DstBuffer = DstPtr; /*0xffc157e9*/\n return 0; /*0xffc156e8*/\n}","refs":[{"addr":"0xffc16d80","name":"DxeIplLzmaGetProp"},{"addr":"0xffc1632d","name":"DxeIplAllocatePages"},{"addr":"0xffc16daf","name":"DxeIplLzmaDecodeProp"},{"addr":"0xffc162d3","name":"DxeIplFvFreePages"}]} -{"addr":"0xffc157f3","code":"int DxeIplFvProcessSections(int a1, int a2)\n{\n int i; // edx\n int result; // eax\n int v4; // esi\n\n for ( i = DxeIplGetPeiServices(); ; i = v4 + *(unsigned __int16 *)(v4 + 2) ) /*0xffc157f9*/\n {\n result = DxeIplLocatePpi(2, i); /*0xffc15817*/\n v4 = result; /*0xffc1581c*/\n if ( !result ) /*0xffc15820*/\n break; /*0xffc15820*/\n if ( (unsigned __int8)DxeIplFvIsAddrValid(&unk_FFC18CD8) ) /*0xffc15805*/\n {\n DxeIplFreePages(*(_DWORD *)(v4 + 24), *(_DWORD *)(v4 + 28), *(_DWORD *)(v4 + 32), *(_DWORD *)(v4 + 36)); /*0xffc15830*/\n *(_DWORD *)(v4 + 36) = 0; /*0xffc1583c*/\n *(_DWORD *)(v4 + 24) = a1; /*0xffc15840*/\n *(_DWORD *)(v4 + 28) = a2; /*0xffc15847*/\n *(_DWORD *)(v4 + 32) = 0x100000; /*0xffc1584a*/\n return a2; /*0xffc15843*/\n }\n }\n return result; /*0xffc15822*/\n}","refs":[{"addr":"0xffc16008","name":"DxeIplGetPeiServices"},{"addr":"0xffc16033","name":"DxeIplLocatePpi"},{"addr":"0xffc161b3","name":"DxeIplFreePages"},{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc18cd8","name":"unk_FFC18CD8"}]} -{"addr":"0xffc15853","code":"int __thiscall DxeIplCheckBootMode(void *this)\n{\n int v1; // esi\n int v3; // [esp-4h] [ebp-Ch]\n int ( **v4)(_DWORD); // [esp+4h] [ebp-4h] BYREF\n\n v1 = DxeIplLocatePpiByGuid(this, &v4); /*0xffc1586b*/\n if ( v1 >= 0 ) /*0xffc15872*/\n {\n DxeIplGetBootModeFromHob(v3, \"DxeIpl\"); /*0xffc1588f*/\n return (*v4)(v4); /*0xffc1589b*/\n }\n else\n {\n DxeIplReportStatusCode(-2147483646, 50532354); /*0xffc1587e*/\n return v1; /*0xffc15886*/\n }\n}","refs":[{"addr":"0xffc16226","name":"DxeIplLocatePpiByGuid"},{"addr":"0xffc17107","name":"DxeIplGetBootModeFromHob"},{"addr":"0xffc16f4a","name":"DxeIplReportStatusCode"}]} -{"addr":"0xffc158a3","code":"int __thiscall DxeIplGetNextFfsFile(void *this)\n{\n int i_1; // esi\n int v2; // edi\n int v3; // eax\n int v4; // eax\n int i; // ecx\n int v6; // ecx\n int v7; // eax\n _BYTE v9[2]; // [esp+10h] [ebp-18h] BYREF\n int v10; // [esp+12h] [ebp-16h]\n int v11; // [esp+18h] [ebp-10h] BYREF\n _BYTE *v12; // [esp+1Ch] [ebp-Ch] BYREF\n _BYTE v13[6]; // [esp+20h] [ebp-8h] BYREF\n\n i_1 = 0; /*0xffc158b8*/\n v2 = DxeIplLocatePpiByGuid(this, &v12); /*0xffc158bf*/\n if ( v2 >= 0 ) /*0xffc158ca*/\n {\n *(_DWORD *)v13 = v9; /*0xffc158e3*/\n __sidt(v9); /*0xffc158e9*/\n v2 = (*(int ( **)(_DWORD, _BYTE *))v12)(*(_DWORD *)(v10 - 4), v12); /*0xffc158fa*/\n }\n else\n {\n DxeIplReportStatusCode(-2147483646, 50532358); /*0xffc158d6*/\n }\n if ( v2 >= 0 /*0xffc1591d*/\n && (v3 = DxeIplGetPeiServices(), (v4 = DxeIplGetBootModeGuid(&unk_FFC18CB8, v3)) != 0)\n && !*(_BYTE *)(v4 + 32)\n && *(_QWORD *)(v4 + 24) )\n {\n DxeIplGetPlatformBootMode(); /*0xffc15925*/\n for ( i = 0; DxeIplOpenFv(i, &v11) >= 0; i = i_1 ) /*0xffc1592a*/\n ++i_1; /*0xffc1592e*/\n }\n else\n {\n v12 = v9; /*0xffc15942*/\n __sidt(v9); /*0xffc15948*/\n v6 = *(_DWORD *)(v10 - 4); /*0xffc1594e*/\n v12 = v13; /*0xffc15954*/\n __sidt(v13); /*0xffc1595a*/\n (*(void ( **)(int, int, int, _DWORD, _DWORD, _DWORD))(**(_DWORD **)(*(_DWORD *)&v13[2] - 4) + 88))( /*0xffc1596f*/\n v6,\n -2147483646,\n 50532359,\n 0,\n 0,\n 0);\n v7 = DxeIplGetPeiBootMode(); /*0xffc15972*/\n if ( (*(unsigned __int8 ( **)(int))(v7 + 24))(9) ) /*0xffc15979*/\n {\n v12 = v9; /*0xffc15986*/\n __sidt(v9); /*0xffc1598c*/\n (*(void ( **)(int, _DWORD, _DWORD, _DWORD))(**(_DWORD **)(v10 - 4) + 128))(2, 0, 0, 0); /*0xffc1599c*/\n DxeIplNullStall(); /*0xffc159a5*/\n }\n }\n return i_1; /*0xffc159aa*/\n}","refs":[{"addr":"0xffc16226","name":"DxeIplLocatePpiByGuid"},{"addr":"0xffc16f4a","name":"DxeIplReportStatusCode"},{"addr":"0xffc16085","name":"DxeIplGetPlatformBootMode"},{"addr":"0xffc16254","name":"DxeIplOpenFv"},{"addr":"0xffc16386","name":"DxeIplGetPeiBootMode"},{"addr":"0xffc15fb3","name":"DxeIplNullStall"},{"addr":"0xffc16008","name":"DxeIplGetPeiServices"},{"addr":"0xffc16056","name":"DxeIplGetBootModeGuid"},{"addr":"0xffc18cb8","name":"unk_FFC18CB8"}]} -{"addr":"0xffc159b3","code":"int __thiscall DxeIplDiscoverDxeCore(void *n32)\n{\n _WORD *i; // eax\n int v3; // ecx\n const __int16 *PreviousMemoryTypeInformation; // edi\n int v5; // esi\n int n64; // edx\n unsigned int n128; // [esp+10h] [ebp-8Ch] BYREF\n int ( **v9)(_DWORD, const __int16 *, void *, _DWORD, unsigned int *, _BYTE *); // [esp+14h] [ebp-88h] BYREF\n _BYTE v10[132]; // [esp+18h] [ebp-84h] BYREF\n\n for ( i = (_WORD *)DxeIplGetPeiServices(); ; *i = -2 ) /*0xffc159bf*/\n {\n i = (_WORD *)DxeIplGetBootModeGuid(&unk_FFC18CC8, i); /*0xffc159d7*/\n if ( !i ) /*0xffc159de*/\n break; /*0xffc159de*/\n }\n if ( DxeIplLocatePpiByGuid(v3, &v9) < 0 ) /*0xffc159fb*/\n goto LABEL_13; /*0xffc159fb*/\n n128 = 128; /*0xffc159fd*/\n PreviousMemoryTypeInformation = L\"PreviousMemoryTypeInformation\"; /*0xffc15a05*/\n if ( n32 != (void *)5 ) /*0xffc15a0d*/\n PreviousMemoryTypeInformation = L\"MemoryTypeInformation\"; /*0xffc15a0f*/\n v5 = (*v9)(v9, PreviousMemoryTypeInformation, &unk_FFC18DD8, 0, &n128, v10); /*0xffc15a29*/\n if ( v5 == -2147483634 ) /*0xffc15a34*/\n v5 = (*v9)(v9, PreviousMemoryTypeInformation, &unk_FFC18CC8, 0, &n128, v10); /*0xffc15a4e*/\n if ( v5 < 0 ) /*0xffc15a52*/\n goto LABEL_13; /*0xffc15a52*/\n if ( !DxeIplMeasureFv((int)v10, n128) ) /*0xffc15a5c*/\n v5 = -2147483645; /*0xffc15a6f*/\n if ( v5 < 0 ) /*0xffc15a76*/\n {\nLABEL_13:\n n64 = n64; /*0xffc15a78*/\n n128 = n64; /*0xffc15a83*/\n }\n DxeIplAllocPagesBelow4G(n64); /*0xffc15a8c*/\n return DxeIplAllocPagesBelow4G(16); /*0xffc15a9e*/\n}","refs":[{"addr":"0xffc16008","name":"DxeIplGetPeiServices"},{"addr":"0xffc16056","name":"DxeIplGetBootModeGuid"},{"addr":"0xffc18cc8","name":"unk_FFC18CC8"},{"addr":"0xffc16226","name":"DxeIplLocatePpiByGuid"},{"addr":"0xffc18dd8","name":"unk_FFC18DD8"},{"addr":"0xffc1558d","name":"DxeIplMeasureFv"},{"addr":"0xffc18dfc","name":"n64"},{"addr":"0xffc16191","name":"DxeIplAllocPagesBelow4G"}]} -{"addr":"0xffc15aa9","code":"int DxeIplEntry(int PeiServicesPtr, int BootServices)\n{\n int Guid; // ecx\n int Vol; // esi\n int NextFfsFile; // edi\n int PlatformBootMode; // eax\n void *Status; // ecx\n void *PlatformBootMode_1; // ebx\n int FvSection; // eax\n int PpiStatus; // ecx\n int FvStatus; // eax\n int DxeHandle; // ecx\n int PpiStatus_1; // [esp-4h] [ebp-64h]\n int DxeHandle_1; // [esp+Ch] [ebp-54h] BYREF\n int v15; // [esp+10h] [ebp-50h] BYREF\n _BYTE *v16; // [esp+14h] [ebp-4Ch]\n int ( **v17)(_DWORD, int, int *, __int64 *, int *, _BYTE *); // [esp+18h] [ebp-48h] BYREF\n _BYTE v18[4]; // [esp+1Ch] [ebp-44h] BYREF\n _BYTE v19[2]; // [esp+20h] [ebp-40h] BYREF\n int v20; // [esp+22h] [ebp-3Eh]\n int v21[2]; // [esp+28h] [ebp-38h] BYREF\n __int64 v22; // [esp+30h] [ebp-30h] BYREF\n int v23[2]; // [esp+38h] [ebp-28h] BYREF\n _BYTE v24[32]; // [esp+40h] [ebp-20h] BYREF\n\n Vol = 0; /*0xffc15abd*/\n NextFfsFile = 0; /*0xffc15abf*/\n DxeIplDebugPrintGuid(Guid, \"DxeIpl\"); /*0xffc15ac1*/\n (*(void ( **)(int, int, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)BootServices + 88))( /*0xffc15ad9*/\n BootServices,\n 1,\n 50466817,\n 0,\n 0,\n 0);\n PlatformBootMode = DxeIplGetPlatformBootMode(); /*0xffc15adf*/\n PlatformBootMode_1 = (void *)PlatformBootMode; /*0xffc15ae4*/\n if ( PlatformBootMode == 17 ) /*0xffc15ae9*/\n {\n if ( DxeIplCheckBootMode(Status) < 0 ) /*0xffc15af2*/\n {\n DxeIplReportStatusCode(2, 50532357); /*0xffc15b01*/\n v16 = v19; /*0xffc15b0d*/\n __sidt(v19); /*0xffc15b15*/\n (*(void ( **)(_DWORD))(**(_DWORD **)(v20 - 4) + 92))(*(_DWORD *)(v20 - 4)); /*0xffc15b22*/\n }\n }\n else if ( PlatformBootMode == 32 || PlatformBootMode == 18 ) /*0xffc15b30*/\n {\n NextFfsFile = DxeIplGetNextFfsFile(Status); /*0xffc15b37*/\n PlatformBootMode_1 = (void *)DxeIplGetPlatformBootMode(); /*0xffc15b3e*/\n }\n DxeIplReportStatus(&unk_FFC18AC4); /*0xffc15b45*/\n DxeIplDiscoverDxeCore(PlatformBootMode_1); /*0xffc15b4c*/\n do /*0xffc15b68*/\n {\n FvStatus = DxeIplOpenFv(NextFfsFile++, (int)&v15); /*0xffc15b70*/\n if ( FvStatus < 0 ) /*0xffc15b78*/\n {\n DxeIplReportStatusCode(2, 50466816); /*0xffc15b87*/\n DxeIplGetBootModeFromHob(); /*0xffc15b91*/\n return -2147483634; /*0xffc15ba4*/\n }\n DxeHandle_1 = 0; /*0xffc15b5c*/\n FvSection = DxeIplReadFvSection(v15, (int)&DxeHandle_1); /*0xffc15b60*/\n PpiStatus = PpiStatus_1; /*0xffc15b65*/\n }\n while ( FvSection < 0 ); /*0xffc15b68*/\n do /*0xffc15bdc*/\n DxeIplLocatePpiByGuid((int)&unk_FFC18D88, Vol++, PpiStatus, (int)&v17); /*0xffc15bb2*/\n while ( (*v17)(v17, DxeHandle_1, v23, &v22, v21, v18) < 0 ); /*0xffc15bdc*/\n DxeHandle = DxeHandle_1; /*0xffc15bde*/\n v16 = v19; /*0xffc15be6*/\n __sidt(v19); /*0xffc15bee*/\n (*(void ( **)(int, _BYTE *))(**(_DWORD **)(v20 - 4) + 108))(DxeHandle, v24); /*0xffc15c00*/\n DxeIplDecompressPages( /*0xffc15c2f*/\n v23[0],\n v23[1],\n v22 + (-(int)v22 & 0xFFF),\n (v22 + (unsigned __int64)(-(int)v22 & 0xFFF)) >> 32,\n v21[0],\n v21[1]);\n DxeIplTransferToDxeCore(); /*0xffc15c3f*/\n DxeIplNullStall(); /*0xffc15c47*/\n return -2147483639; /*0xffc15b9e*/\n}","refs":[{"addr":"0xffc1708f","name":"DxeIplDebugPrintGuid"},{"addr":"0xffc16085","name":"DxeIplGetPlatformBootMode"},{"addr":"0xffc16f4a","name":"DxeIplReportStatusCode"},{"addr":"0xffc15853","name":"DxeIplCheckBootMode"},{"addr":"0xffc158a3","name":"DxeIplGetNextFfsFile"},{"addr":"0xffc16201","name":"DxeIplReportStatus"},{"addr":"0xffc18ac4","name":"unk_FFC18AC4"},{"addr":"0xffc159b3","name":"DxeIplDiscoverDxeCore"},{"addr":"0xffc16254","name":"DxeIplOpenFv"},{"addr":"0xffc17107","name":"DxeIplGetBootModeFromHob"},{"addr":"0xffc1627d","name":"DxeIplReadFvSection"},{"addr":"0xffc16226","name":"DxeIplLocatePpiByGuid"},{"addr":"0xffc18d88","name":"unk_FFC18D88"},{"addr":"0xffc160ea","name":"DxeIplDecompressPages"},{"addr":"0xffc15c56","name":"DxeIplTransferToDxeCore"},{"addr":"0xffc15fb3","name":"DxeIplNullStall"}]} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +int DxeIplZeroMem() +{ + unsigned __int32 v0; // eax + unsigned __int64 v1; // rax + _BYTE retaddr[8]; // [esp+0h] [ebp+0h] + + _disable(); /*0xffc15298*/ + *(_DWORD *)retaddr = &byte_FFC152BF; /*0xffc15299*/ + v0 = __readcr4(); /*0xffc152a0*/ + LOBYTE(v0) = v0 | 0x20; /*0xffc152a3*/ + __writecr4(v0); /*0xffc152a5*/ + v1 = __readmsr(0xC0000080); /*0xffc152ad*/ + BYTE1(v1) |= 1u; /*0xffc152af*/ + __writemsr(0xC0000080, v1); /*0xffc152b2*/ + LODWORD(v1) = __readcr0(); /*0xffc152b4*/ + __writecr0(v1 | 0x80000000); /*0xffc152bb*/ + return MK_FP(*(_WORD *)retaddr, *(_DWORD *)retaddr)(-1073741696, HIDWORD(v1)); +} + +char *DxeIplCopyMem(char *dst, char *src, unsigned int count_1) +{ + unsigned int count; // edx + char *dst_1; // edi + char *src_1; // esi + + count = count_1; /*0xffc152f2*/ + if ( src < dst && &src[count_1 - 1] >= dst ) /*0xffc15300*/ + { + src_1 = &src[count_1 - 1]; /*0xffc15314*/ + dst_1 = &dst[count_1 - 1]; /*0xffc15316*/ + } + else + { + count = count_1 & 3; /*0xffc15304*/ + qmemcpy(dst, src, 4 * (count_1 >> 2)); /*0xffc1530d*/ + src_1 = &src[4 * (count_1 >> 2)]; /*0xffc1530d*/ + dst_1 = &dst[4 * (count_1 >> 2)]; /*0xffc1530d*/ + } + qmemcpy(dst_1, src_1, count); /*0xffc1531d*/ + return dst; /*0xffc15324*/ +} + +void *DxeIplSetMem32(void *buf, unsigned int count) +{ + memset(buf, 0, count); /*0xffc1533f*/ + return buf; /*0xffc15346*/ +} + +void *DxeIplSetMem64(void *buf, unsigned int count, char value) +{ + memset(buf, value, count); /*0xffc15355*/ + return buf; /*0xffc1535b*/ +} + +int DxeIplGetNextHob(int a1, int a2, int a3, int a4) +{ + do /*0xffc15381*/ + { + *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffc15379*/ + *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffc1537d*/ + } + while ( a2 ); /*0xffc15381*/ + return a1; /*0xffc15385*/ +} + +void *DxeIplGetFirstHob(void *buf, unsigned int count, int value) +{ + memset32(buf, value, count); /*0xffc15395*/ + return buf; /*0xffc1539b*/ +} + +_WORD *DxeIplSetMem16(_WORD *a1, int a2, __int16 a3) +{ + _WORD *v3; // edi + + v3 = a1; /*0xffc1542d*/ + while ( a2 ) /*0xffc15435*/ + { + *v3++ = a3; /*0xffc15435*/ + --a2; /*0xffc15435*/ + } + return a1; /*0xffc1543c*/ +} + +EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + void *v2; // ecx + int v3; // ebp + void *v4; // ecx + void *v5; // ecx + int ModuleBase; // eax + bool v7; // zf + EFI_STATUS result; // eax + int v9; // [esp-14h] [ebp-1Ch] + _DWORD *v10; // [esp-14h] [ebp-1Ch] + _BYTE v11[6]; // [esp-Ch] [ebp-14h] BYREF + int v12; // [esp-4h] [ebp-Ch] BYREF + _BYTE *v13; // [esp+0h] [ebp-8h] + int v14; // [esp+4h] [ebp-4h] + + if ( *(char *)(DxeIplGetModuleBase(v2) + 1024068) >= 0 ) /*0xffc1544f*/ + { + DxeIplInitGlobalFlags(v4); /*0xffc15451*/ + ModuleBase = DxeIplGetModuleBase(v5); /*0xffc15456*/ + *(_BYTE *)(ModuleBase + 1024068) |= 0x80u; /*0xffc15462*/ + } + DxeIplInstallPpi((char *)FvDeviceHandle, (int (*)())DxeIplPpiNotifyCallback, (int (*)())DxeIplPeiEndCallback); /*0xffc15473*/ + DxeIplInstallPpi((char *)DxeIplPpi, (int (*)())DxeIplDxeIplPpiNotify, (int (*)())DxeIplEndOfPeiNotify); /*0xffc15489*/ + off_FFC18DF8 = &unk_FFC18B10; /*0xffc15493*/ + n64 = 64; /*0xffc1549d*/ + v14 = v3; /*0xffc154ad*/ + v7 = DxeIplGetPlatformBootMode() == 17; /*0xffc154bb*/ + v13 = v11; /*0xffc154c1*/ + if ( v7 ) /*0xffc154c4*/ + { + __sidt(v13); /*0xffc15506*/ + (*(void ( **)(_DWORD, void *))(**(_DWORD **)(*(_DWORD *)&v11[2] - 4) + 36))( /*0xffc15517*/ + *(_DWORD *)(*(_DWORD *)&v11[2] - 4), + &unk_FFC18A64); + return DxeIplReportStatus(&unk_FFC18A7C); /*0xffc15517*/ + } + __sidt(v13); /*0xffc154c9*/ + result = (*(int ( **)(EFI_HANDLE))(**(_DWORD **)(*(_DWORD *)&v11[2] - 4) + 116))(ImageHandle); /*0xffc154d5*/ + if ( result ) /*0xffc154db*/ + { + result = DxeIplLocatePpiByGuid((int)&unk_FFC18D68, 0, v9, (int)&v12); /*0xffc154e9*/ + if ( (result & 0x80000000) == 0 ) /*0xffc154f2*/ + { + DxeIplDebugPrint(v10); /*0xffc154f9*/ + return DxeIplReportStatus(&unk_FFC18A7C); /*0xffc1551c*/ + } + } + return result; /*0xffc1552a*/ +} + +int __thiscall DxeIplDebugPrint(_DWORD *this) +{ + int v1; // esi + int v2; // ebp + _DWORD *v3; // edi + int v4; // ebx + _DWORD *this_1; // [esp+0h] [ebp-4h] BYREF + + this_1 = this; /*0xffc1552b*/ + if ( DxeIplFvOpenDevice(&this_1) >= 0 ) /*0xffc15536*/ + { + v1 = this_1[1]; /*0xffc1553d*/ + v2 = this_1[2]; /*0xffc15540*/ + if ( v1 ) /*0xffc15545*/ + { + v3 = (_DWORD *)DxeIplAllocateZeroPages(12 *v1); /*0xffc15553*/ + v4 = v2 + 16 *v1; /*0xffc15558*/ + do /*0xffc1557a*/ + { + v4 -= 16; /*0xffc1555a*/ + *v3 = -2147483632; /*0xffc1555d*/ + v3[2] = &off_FFC18A4C; /*0xffc15565*/ + v3[1] = v4; /*0xffc1556c*/ + DxeIplReportStatus(v3); /*0xffc1556f*/ + v3 += 3; /*0xffc15574*/ + --v1; /*0xffc15577*/ + } + while ( v1 ); /*0xffc1557a*/ + } + } + return DxeIplReportStatus(&unk_FFC18A54); +} + +char DxeIplMeasureFv(int a1, unsigned int n128) +{ + unsigned int n128_1; // eax + int v4; // eax + + if ( !a1 ) /*0xffc15592*/ + return 0; /*0xffc15592*/ + n128_1 = 8 * (n128 >> 3); /*0xffc1559f*/ + if ( n128_1 != n128 || *(_DWORD *)(n128_1 + a1 - 8) != 15 ) /*0xffc155ab*/ + return 0; /*0xffc15597*/ + v4 = 0; /*0xffc155ad*/ + if ( n128 >> 3 != 1 ) /*0xffc155b2*/ + { + while ( *(_DWORD *)(a1 + 8 *v4) < 0xFu ) /*0xffc155b8*/ + { + if ( ++v4 >= (n128 >> 3) - 1 ) /*0xffc155bd*/ + return 1; /*0xffc155bd*/ + } + return 0; /*0xffc155b8*/ + } + return 1; /*0xffc15596*/ +} + +int DxeIplFvReadSection(int a1, int a2, int *a3, unsigned int *a4, int a5) +{ + int v5; // edi + int result; // eax + unsigned int v7; // esi + unsigned int v8; // ecx + int v9; // ecx + int v10; // eax + _BYTE v11[4]; // [esp+Ch] [ebp-14h] BYREF + _DWORD *v12; // [esp+10h] [ebp-10h] BYREF + unsigned int v13; // [esp+14h] [ebp-Ch] BYREF + unsigned int v14; // [esp+18h] [ebp-8h] + unsigned int v15; // [esp+1Ch] [ebp-4h] BYREF + + v5 = 0; /*0xffc155d3*/ + result = DxeIplFvOpenDevice(&v12); /*0xffc155d5*/ + if ( result >= 0 ) /*0xffc155df*/ + { + v7 = 0; /*0xffc155ef*/ + v8 = v12[1]; /*0xffc15603*/ + v14 = v8; /*0xffc15606*/ + if ( v8 ) /*0xffc1560c*/ + { + v8 = v12[2]; /*0xffc1560e*/ + while ( !(unsigned __int8)DxeIplFvIsAddrValid(v8) ) /*0xffc15618*/ + { + ++v7; /*0xffc1561a*/ + v8 = v9 + 16; /*0xffc1561b*/ + if ( v7 >= v14 ) /*0xffc15622*/ + goto LABEL_6; /*0xffc15622*/ + } + result = (*(int ( **)(int, unsigned int *, unsigned int *, _BYTE *))(v12[4] + 4 *v7))(a2, &v13, &v15, v11); /*0xffc15675*/ + } + else + { +LABEL_6: + result = -2147483645; /*0xffc15624*/ + } + if ( result >= 0 ) /*0xffc1562b*/ + { + if ( v15 ) /*0xffc15637*/ + { + v5 = DxeIplAllocatePages(v8, (v15 >> 12) + ((v15 & 0xFFF) != 0)); /*0xffc15651*/ + if ( !v5 ) /*0xffc15655*/ + return -2147483639; /*0xffc15655*/ + } + if ( (v11[0] & 1) != 0 && v13 ) /*0xffc1568d*/ + { + v10 = DxeIplAllocatePages(v8, (v13 >> 12) + ((v13 & 0xFFF) != 0) + 1); /*0xffc156a0*/ + *a3 = v10; /*0xffc156a5*/ + if ( !v10 ) /*0xffc156a9*/ + return -2147483639; /*0xffc1565c*/ + *a3 = v10 + 4092; /*0xffc156b0*/ + } + result = DxeIplDecompress(v5, a5); /*0xffc156ba*/ + if ( result >= 0 ) /*0xffc156c3*/ + { + *a4 = v13; /*0xffc156cc*/ + return 0; /*0xffc156ce*/ + } + } + } + return result; /*0xffc156d0*/ +} + +int DxeIplFvExtractSection(int FvHandle, unsigned int SrcSize_, int *DstBuffer, unsigned int *DstSize) +{ + unsigned int SectionType; // ecx + unsigned int SectionStart; // eax + int TypeFlag; // ecx + unsigned int SectionType_2; // edi + int HeaderSize; // ecx + unsigned int CompSize; // edx + unsigned __int8 *src; // ebx + int Scratch; // ecx + unsigned __int8 **Pages; // ebp + int DstAlloc; // eax + int DstPtr; // esi + int BufAlloc; // eax + int SavedCtx; // [esp-14h] [ebp-18h] + unsigned int SectionType_1; // [esp+0h] [ebp-4h] BYREF + + SectionType_1 = SectionType; /*0xffc156d7*/ + SectionStart = SrcSize_; /*0xffc156d8*/ + if ( *(_BYTE *)(SrcSize_ + 3) != 1 ) /*0xffc156e0*/ + return -2147483646; /*0xffc156e8*/ + TypeFlag = *(_DWORD *)SrcSize_ & 0xFFFFFF; /*0xffc156f0*/ + if ( TypeFlag == 0xFFFFFF ) /*0xffc156f6*/ + { + SectionType_2 = *(_DWORD *)(SrcSize_ + 8); /*0xffc156fe*/ + HeaderSize = 13; /*0xffc15703*/ + CompSize = *(_DWORD *)(SrcSize_ + 4) - 13; /*0xffc15704*/ + LOBYTE(SrcSize_) = *(_BYTE *)(SrcSize_ + 12); /*0xffc15706*/ + } + else + { + SectionType_2 = *(_DWORD *)(SrcSize_ + 4); /*0xffc1570c*/ + CompSize = TypeFlag - 9; /*0xffc1570f*/ + LOBYTE(SrcSize_) = *(_BYTE *)(SrcSize_ + 8); /*0xffc15717*/ + HeaderSize = 9; /*0xffc1571b*/ + } + src = (unsigned __int8 *)(HeaderSize + SectionStart); /*0xffc1571c*/ + if ( (_BYTE)SrcSize_ ) /*0xffc15729*/ + { + if ( (unsigned __int8)SrcSize_ != 1 || DxeIplLzmaGetProp(src, CompSize, &SectionType_1, &SrcSize_) < 0 ) /*0xffc15745*/ + return -2147483634; /*0xffc15745*/ + Pages = (unsigned __int8 **)DxeIplAllocatePages(SavedCtx, (SrcSize_ >> 12) + ((SrcSize_ & 0xFFF) != 0)); /*0xffc15764*/ + if ( Pages ) /*0xffc15768*/ + { + SectionType_2 = SectionType_1; /*0xffc1576a*/ + DstAlloc = DxeIplAllocatePages(Scratch, (SectionType_1 >> 12) + ((SectionType_1 & 0xFFF) != 0) + 1); /*0xffc1577e*/ + if ( DstAlloc ) /*0xffc15787*/ + { + DstPtr = DstAlloc + 4092; /*0xffc15789*/ + if ( (DxeIplLzmaDecodeProp(src, (unsigned __int8 *)(DstAlloc + 4092), Pages, 1) & 0x80000000) != 0 ) /*0xffc1579f*/ + return -2147483634; /*0xffc157a6*/ + goto LABEL_16; /*0xffc1579f*/ + } + } + return -2147483639; /*0xffc157cc*/ + } + BufAlloc = DxeIplAllocatePages(HeaderSize, (SectionType_2 >> 12) + ((SectionType_2 & 0xFFF) != 0) + 1); /*0xffc157bc*/ + if ( !BufAlloc ) /*0xffc157c5*/ + return -2147483639; /*0xffc157c5*/ + DstPtr = BufAlloc + 4092; /*0xffc157ce*/ + DxeIplFvFreePages((char *)(BufAlloc + 4092), (char *)src, SectionType_2); /*0xffc157d9*/ +LABEL_16: + *DstSize = SectionType_2; /*0xffc157df*/ + *DstBuffer = DstPtr; /*0xffc157e9*/ + return 0; /*0xffc156e8*/ +} + +int DxeIplFvProcessSections(int a1, int a2) +{ + int i; // edx + int result; // eax + int v4; // esi + + for ( i = DxeIplGetPeiServices(); ; i = v4 + *(unsigned __int16 *)(v4 + 2) ) /*0xffc157f9*/ + { + result = DxeIplLocatePpi(2, i); /*0xffc15817*/ + v4 = result; /*0xffc1581c*/ + if ( !result ) /*0xffc15820*/ + break; /*0xffc15820*/ + if ( (unsigned __int8)DxeIplFvIsAddrValid(&unk_FFC18CD8) ) /*0xffc15805*/ + { + DxeIplFreePages(*(_DWORD *)(v4 + 24), *(_DWORD *)(v4 + 28), *(_DWORD *)(v4 + 32), *(_DWORD *)(v4 + 36)); /*0xffc15830*/ + *(_DWORD *)(v4 + 36) = 0; /*0xffc1583c*/ + *(_DWORD *)(v4 + 24) = a1; /*0xffc15840*/ + *(_DWORD *)(v4 + 28) = a2; /*0xffc15847*/ + *(_DWORD *)(v4 + 32) = 0x100000; /*0xffc1584a*/ + return a2; /*0xffc15843*/ + } + } + return result; /*0xffc15822*/ +} + +int __thiscall DxeIplCheckBootMode(void *this) +{ + int v1; // esi + int v3; // [esp-4h] [ebp-Ch] + int ( **v4)(_DWORD); // [esp+4h] [ebp-4h] BYREF + + v1 = DxeIplLocatePpiByGuid(this, &v4); /*0xffc1586b*/ + if ( v1 >= 0 ) /*0xffc15872*/ + { + DxeIplGetBootModeFromHob(v3, "DxeIpl"); /*0xffc1588f*/ + return (*v4)(v4); /*0xffc1589b*/ + } + else + { + DxeIplReportStatusCode(-2147483646, 50532354); /*0xffc1587e*/ + return v1; /*0xffc15886*/ + } +} + +int __thiscall DxeIplGetNextFfsFile(void *this) +{ + int i_1; // esi + int v2; // edi + int v3; // eax + int v4; // eax + int i; // ecx + int v6; // ecx + int v7; // eax + _BYTE v9[2]; // [esp+10h] [ebp-18h] BYREF + int v10; // [esp+12h] [ebp-16h] + int v11; // [esp+18h] [ebp-10h] BYREF + _BYTE *v12; // [esp+1Ch] [ebp-Ch] BYREF + _BYTE v13[6]; // [esp+20h] [ebp-8h] BYREF + + i_1 = 0; /*0xffc158b8*/ + v2 = DxeIplLocatePpiByGuid(this, &v12); /*0xffc158bf*/ + if ( v2 >= 0 ) /*0xffc158ca*/ + { + *(_DWORD *)v13 = v9; /*0xffc158e3*/ + __sidt(v9); /*0xffc158e9*/ + v2 = (*(int ( **)(_DWORD, _BYTE *))v12)(*(_DWORD *)(v10 - 4), v12); /*0xffc158fa*/ + } + else + { + DxeIplReportStatusCode(-2147483646, 50532358); /*0xffc158d6*/ + } + if ( v2 >= 0 /*0xffc1591d*/ + && (v3 = DxeIplGetPeiServices(), (v4 = DxeIplGetBootModeGuid(&unk_FFC18CB8, v3)) != 0) + && !*(_BYTE *)(v4 + 32) + && *(_QWORD *)(v4 + 24) ) + { + DxeIplGetPlatformBootMode(); /*0xffc15925*/ + for ( i = 0; DxeIplOpenFv(i, &v11) >= 0; i = i_1 ) /*0xffc1592a*/ + ++i_1; /*0xffc1592e*/ + } + else + { + v12 = v9; /*0xffc15942*/ + __sidt(v9); /*0xffc15948*/ + v6 = *(_DWORD *)(v10 - 4); /*0xffc1594e*/ + v12 = v13; /*0xffc15954*/ + __sidt(v13); /*0xffc1595a*/ + (*(void ( **)(int, int, int, _DWORD, _DWORD, _DWORD))(**(_DWORD **)(*(_DWORD *)&v13[2] - 4) + 88))( /*0xffc1596f*/ + v6, + -2147483646, + 50532359, + 0, + 0, + 0); + v7 = DxeIplGetPeiBootMode(); /*0xffc15972*/ + if ( (*(unsigned __int8 ( **)(int))(v7 + 24))(9) ) /*0xffc15979*/ + { + v12 = v9; /*0xffc15986*/ + __sidt(v9); /*0xffc1598c*/ + (*(void ( **)(int, _DWORD, _DWORD, _DWORD))(**(_DWORD **)(v10 - 4) + 128))(2, 0, 0, 0); /*0xffc1599c*/ + DxeIplNullStall(); /*0xffc159a5*/ + } + } + return i_1; /*0xffc159aa*/ +} + +int __thiscall DxeIplDiscoverDxeCore(void *n32) +{ + _WORD *i; // eax + int v3; // ecx + const __int16 *PreviousMemoryTypeInformation; // edi + int v5; // esi + int n64; // edx + unsigned int n128; // [esp+10h] [ebp-8Ch] BYREF + int ( **v9)(_DWORD, const __int16 *, void *, _DWORD, unsigned int *, _BYTE *); // [esp+14h] [ebp-88h] BYREF + _BYTE v10[132]; // [esp+18h] [ebp-84h] BYREF + + for ( i = (_WORD *)DxeIplGetPeiServices(); ; *i = -2 ) /*0xffc159bf*/ + { + i = (_WORD *)DxeIplGetBootModeGuid(&unk_FFC18CC8, i); /*0xffc159d7*/ + if ( !i ) /*0xffc159de*/ + break; /*0xffc159de*/ + } + if ( DxeIplLocatePpiByGuid(v3, &v9) < 0 ) /*0xffc159fb*/ + goto LABEL_13; /*0xffc159fb*/ + n128 = 128; /*0xffc159fd*/ + PreviousMemoryTypeInformation = L"PreviousMemoryTypeInformation"; /*0xffc15a05*/ + if ( n32 != (void *)5 ) /*0xffc15a0d*/ + PreviousMemoryTypeInformation = L"MemoryTypeInformation"; /*0xffc15a0f*/ + v5 = (*v9)(v9, PreviousMemoryTypeInformation, &unk_FFC18DD8, 0, &n128, v10); /*0xffc15a29*/ + if ( v5 == -2147483634 ) /*0xffc15a34*/ + v5 = (*v9)(v9, PreviousMemoryTypeInformation, &unk_FFC18CC8, 0, &n128, v10); /*0xffc15a4e*/ + if ( v5 < 0 ) /*0xffc15a52*/ + goto LABEL_13; /*0xffc15a52*/ + if ( !DxeIplMeasureFv((int)v10, n128) ) /*0xffc15a5c*/ + v5 = -2147483645; /*0xffc15a6f*/ + if ( v5 < 0 ) /*0xffc15a76*/ + { +LABEL_13: + n64 = n64; /*0xffc15a78*/ + n128 = n64; /*0xffc15a83*/ + } + DxeIplAllocPagesBelow4G(n64); /*0xffc15a8c*/ + return DxeIplAllocPagesBelow4G(16); /*0xffc15a9e*/ +} + +int DxeIplEntry(int PeiServicesPtr, int BootServices) +{ + int Guid; // ecx + int Vol; // esi + int NextFfsFile; // edi + int PlatformBootMode; // eax + void *Status; // ecx + void *PlatformBootMode_1; // ebx + int FvSection; // eax + int PpiStatus; // ecx + int FvStatus; // eax + int DxeHandle; // ecx + int PpiStatus_1; // [esp-4h] [ebp-64h] + int DxeHandle_1; // [esp+Ch] [ebp-54h] BYREF + int v15; // [esp+10h] [ebp-50h] BYREF + _BYTE *v16; // [esp+14h] [ebp-4Ch] + int ( **v17)(_DWORD, int, int *, __int64 *, int *, _BYTE *); // [esp+18h] [ebp-48h] BYREF + _BYTE v18[4]; // [esp+1Ch] [ebp-44h] BYREF + _BYTE v19[2]; // [esp+20h] [ebp-40h] BYREF + int v20; // [esp+22h] [ebp-3Eh] + int v21[2]; // [esp+28h] [ebp-38h] BYREF + __int64 v22; // [esp+30h] [ebp-30h] BYREF + int v23[2]; // [esp+38h] [ebp-28h] BYREF + _BYTE v24[32]; // [esp+40h] [ebp-20h] BYREF + + Vol = 0; /*0xffc15abd*/ + NextFfsFile = 0; /*0xffc15abf*/ + DxeIplDebugPrintGuid(Guid, "DxeIpl"); /*0xffc15ac1*/ + (*(void ( **)(int, int, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)BootServices + 88))( /*0xffc15ad9*/ + BootServices, + 1, + 50466817, + 0, + 0, + 0); + PlatformBootMode = DxeIplGetPlatformBootMode(); /*0xffc15adf*/ + PlatformBootMode_1 = (void *)PlatformBootMode; /*0xffc15ae4*/ + if ( PlatformBootMode == 17 ) /*0xffc15ae9*/ + { + if ( DxeIplCheckBootMode(Status) < 0 ) /*0xffc15af2*/ + { + DxeIplReportStatusCode(2, 50532357); /*0xffc15b01*/ + v16 = v19; /*0xffc15b0d*/ + __sidt(v19); /*0xffc15b15*/ + (*(void ( **)(_DWORD))(**(_DWORD **)(v20 - 4) + 92))(*(_DWORD *)(v20 - 4)); /*0xffc15b22*/ + } + } + else if ( PlatformBootMode == 32 || PlatformBootMode == 18 ) /*0xffc15b30*/ + { + NextFfsFile = DxeIplGetNextFfsFile(Status); /*0xffc15b37*/ + PlatformBootMode_1 = (void *)DxeIplGetPlatformBootMode(); /*0xffc15b3e*/ + } + DxeIplReportStatus(&unk_FFC18AC4); /*0xffc15b45*/ + DxeIplDiscoverDxeCore(PlatformBootMode_1); /*0xffc15b4c*/ + do /*0xffc15b68*/ + { + FvStatus = DxeIplOpenFv(NextFfsFile++, (int)&v15); /*0xffc15b70*/ + if ( FvStatus < 0 ) /*0xffc15b78*/ + { + DxeIplReportStatusCode(2, 50466816); /*0xffc15b87*/ + DxeIplGetBootModeFromHob(); /*0xffc15b91*/ + return -2147483634; /*0xffc15ba4*/ + } + DxeHandle_1 = 0; /*0xffc15b5c*/ + FvSection = DxeIplReadFvSection(v15, (int)&DxeHandle_1); /*0xffc15b60*/ + PpiStatus = PpiStatus_1; /*0xffc15b65*/ + } + while ( FvSection < 0 ); /*0xffc15b68*/ + do /*0xffc15bdc*/ + DxeIplLocatePpiByGuid((int)&unk_FFC18D88, Vol++, PpiStatus, (int)&v17); /*0xffc15bb2*/ + while ( (*v17)(v17, DxeHandle_1, v23, &v22, v21, v18) < 0 ); /*0xffc15bdc*/ + DxeHandle = DxeHandle_1; /*0xffc15bde*/ + v16 = v19; /*0xffc15be6*/ + __sidt(v19); /*0xffc15bee*/ + (*(void ( **)(int, _BYTE *))(**(_DWORD **)(v20 - 4) + 108))(DxeHandle, v24); /*0xffc15c00*/ + DxeIplDecompressPages( /*0xffc15c2f*/ + v23[0], + v23[1], + v22 + (-(int)v22 & 0xFFF), + (v22 + (unsigned __int64)(-(int)v22 & 0xFFF)) >> 32, + v21[0], + v21[1]); + DxeIplTransferToDxeCore(); /*0xffc15c3f*/ + DxeIplNullStall(); /*0xffc15c47*/ + return -2147483639; /*0xffc15b9e*/ +} + +int DxeIplTransferToDxeCore() +{ + int v0; // ecx + int v1; // ecx + int v2; // ecx + __int64 v4; // [esp+Ch] [ebp-10h] BYREF + unsigned __int32 v5; // [esp+18h] [ebp-4h] + + DxeIplFvGetFileSize(&v4); /*0xffc15c68*/ + v5 = (unsigned __int64)(v4 + 1048544) >> 32; /*0xffc15c83*/ + __lgdt("G"); /*0xffc15c90*/ + v5 = DxeIplCreatePageTables(); /*0xffc15c9f*/ + DxeIplDebugPrintGuid(v0, "PeiEnd"); /*0xffc15ca5*/ + DxeIplReportStatus(&unk_FFC18A70); /*0xffc15cb2*/ + DxeIplGetBootModeFromHob(v1, "PeiEnd"); /*0xffc15cbc*/ + DxeIplGetBootModeFromHob(v2, "DxeIpl"); /*0xffc15cc6*/ + __writecr3(v5); /*0xffc15cd1*/ + DxeIplFvProcessSections(v4, SHIDWORD(v4)); /*0xffc15cdc*/ + return DxeIplZeroMem(); /*0xffc15cf9*/ +} + +int __thiscall DxeIplCreatePageTables(void *this) +{ + unsigned __int8 ( **PeiServices)(int); // eax + _WORD *i; // eax + _WORD *Ppi; // eax + int PhysAddrBits; // ecx + unsigned __int8 MaxPhysAddr; // bl + int result; // eax + int NumPml4Entries; // esi + __int64 v8; // rax + __int64 NumPdptEntries; // rax + int NumPml4Entries_2; // edx + int Pml4Table; // eax + unsigned int Index; // edx + _DWORD *Pml4Table_1; // edi + int *PdptTable_1; // eax + int NumPml4Entries_5; // ecx + int *PdptTable; // esi + bool v17; // zf + int v18; // eax + int PageAttr_1; // edi + int n512_5; // ecx + unsigned int Index_2; // kr00_4 + _DWORD *Pml4Table_4; // edi + unsigned int n512_4; // edx + _DWORD *PdptTable_4; // edi + _DWORD *PdptTable_5; // edx + int v26; // eax + unsigned int Index_3; // ecx + int n512_3; // edi + unsigned __int64 Index_4; // kr08_8 + unsigned int v30; // edi + int v31; // ebx + int PhysAddrBits_1; // [esp-4h] [ebp-54h] + int PhysAddrBits_2; // [esp-4h] [ebp-54h] + int Pml4Table_2; // [esp+14h] [ebp-3Ch] + int NumPml4Entries_4; // [esp+18h] [ebp-38h] + unsigned int n512_2; // [esp+1Ch] [ebp-34h] + int v37; // [esp+20h] [ebp-30h] BYREF + unsigned int NumPml4Entries_1; // [esp+24h] [ebp-2Ch] + int NumPml4Entries_3; // [esp+28h] [ebp-28h] + unsigned int n512_1; // [esp+2Ch] [ebp-24h] + int *PdptTable_2; // [esp+30h] [ebp-20h] + unsigned int n512; // [esp+34h] [ebp-1Ch] + _DWORD *PdptTable_3; // [esp+38h] [ebp-18h] + _DWORD *Pml4Table_3; // [esp+3Ch] [ebp-14h] + int PageAttr; // [esp+40h] [ebp-10h] + int Enable1GPages; // [esp+44h] [ebp-Ch] + unsigned int Index_1; // [esp+48h] [ebp-8h] + unsigned int p_n36; // [esp+4Ch] [ebp-4h] BYREF + + LOBYTE(Enable1GPages) = 0; /*0xffc15d0b*/ + PeiServices = (unsigned __int8 ( **)(int))DxeIplGetPeiBootMode(this); /*0xffc15d0e*/ + if ( PeiServices[6](4) ) /*0xffc15d15*/ + { + DxeIplGetBootMode(0x80000000, &p_n36, PhysAddrBits_1, PhysAddrBits_1, 0); /*0xffc15d2a*/ + if ( p_n36 >= 0x80000001 ) /*0xffc15d38*/ + { + DxeIplGetBootMode(-2147483647, 0, -2147483647, -2147483647, &v37); /*0xffc15d42*/ + if ( (v37 & 0x4000000) != 0 ) /*0xffc15d51*/ + LOBYTE(Enable1GPages) = 1; /*0xffc15d53*/ + } + } + i = (_WORD *)DxeIplGetPeiServices(); /*0xffc15d57*/ + Ppi = DxeIplLocatePpi(6, i); /*0xffc15d61*/ + if ( Ppi ) /*0xffc15d68*/ + { + MaxPhysAddr = *((_BYTE *)Ppi + 8); /*0xffc15d6a*/ + } + else + { + DxeIplGetBootMode(0x80000000, &p_n36, PhysAddrBits, PhysAddrBits, 0); /*0xffc15d77*/ + PhysAddrBits = -2147483640; /*0xffc15d7c*/ + if ( p_n36 < 0x80000008 ) /*0xffc15d87*/ + { + MaxPhysAddr = 36; /*0xffc15d9c*/ + } + else + { + DxeIplGetBootMode(-2147483640, &p_n36, -2147483640, -2147483640, 0); /*0xffc15d8f*/ + MaxPhysAddr = p_n36; /*0xffc15d94*/ + } + } + LOBYTE(Index_1) = MaxPhysAddr; /*0xffc15d9e*/ + if ( MaxPhysAddr > 0x30u ) /*0xffc15da4*/ + { + MaxPhysAddr = 48; /*0xffc15da6*/ + LOBYTE(Index_1) = 48; /*0xffc15da8*/ + } + if ( dword_FFC18E48 ) /*0xffc15db2*/ + { + result = dword_FFC18E48(Index_1, Enable1GPages); /*0xffc15dba*/ + PhysAddrBits = PhysAddrBits_2; /*0xffc15dbd*/ + if ( result ) /*0xffc15dc0*/ + return result; /*0xffc15dc0*/ + } + if ( MaxPhysAddr > 0x27u ) /*0xffc15dcc*/ + { + NumPml4Entries_1 = MaxPhysAddr - 39; /*0xffc15e12*/ + LOBYTE(PhysAddrBits) = MaxPhysAddr - 39; /*0xffc15e15*/ + NumPdptEntries = 0x100000000LL; /*0xffc15e18*/ + if ( ((MaxPhysAddr - 39) & 0x20) == 0 ) /*0xffc15e20*/ + NumPdptEntries = 1; /*0xffc15e22*/ + NumPml4Entries = NumPdptEntries << (PhysAddrBits & 0x1F); /*0xffc15e2c*/ + NumPml4Entries_1 = NumPml4Entries; /*0xffc15e33*/ + LODWORD(NumPdptEntries) = 512; /*0xffc15e36*/ + n512 = 512; /*0xffc15e38*/ + } + else + { + PhysAddrBits = 1; /*0xffc15dd3*/ + NumPml4Entries_3 = MaxPhysAddr - 30; /*0xffc15dd4*/ + NumPml4Entries = 1; /*0xffc15ddb*/ + NumPml4Entries_1 = 1; /*0xffc15ddd*/ + LOBYTE(PhysAddrBits) = MaxPhysAddr - 30; /*0xffc15de3*/ + v8 = 0x100000000LL; /*0xffc15de6*/ + if ( ((MaxPhysAddr - 30) & 0x20) == 0 ) /*0xffc15dee*/ + v8 = 1; /*0xffc15df0*/ + NumPdptEntries = v8 << (PhysAddrBits & 0x1F); /*0xffc15df8*/ + n512 = NumPdptEntries; /*0xffc15dfa*/ + } + if ( (_BYTE)Enable1GPages ) /*0xffc15e42*/ + NumPml4Entries_2 = NumPml4Entries; /*0xffc15e4c*/ + else + NumPml4Entries_2 = NumPml4Entries * (NumPdptEntries + 1); /*0xffc15e47*/ + Pml4Table = DxeIplAllocatePages(PhysAddrBits, NumPml4Entries_2 + 1); /*0xffc15e4f*/ + Index = 0; /*0xffc15e56*/ + PageAttr = 0; /*0xffc15e58*/ + Pml4Table_1 = (_DWORD *)Pml4Table; /*0xffc15e5b*/ + Pml4Table_2 = Pml4Table; /*0xffc15e5d*/ + PdptTable_1 = (int *)(Pml4Table + 4096); /*0xffc15e60*/ + NumPml4Entries_5 = 0; /*0xffc15e65*/ + Pml4Table_3 = (_DWORD *)Pml4Table_2; /*0xffc15e67*/ + Index_1 = 0; /*0xffc15e6a*/ + if ( !NumPml4Entries ) /*0xffc15e6f*/ + { +LABEL_44: + v31 = 512 - NumPml4Entries_5; /*0xffc15f95*/ + do /*0xffc15fa7*/ + { + DxeIplSetMem32(Pml4Table_1, 8u); /*0xffc15f9a*/ + Pml4Table_1 += 2; /*0xffc15fa0*/ + --v31; /*0xffc15fa4*/ + } + while ( v31 ); /*0xffc15fa7*/ + return Pml4Table_2; /*0xffc15fa7*/ + } + NumPml4Entries_3 = NumPml4Entries; /*0xffc15e75*/ + NumPml4Entries_4 = NumPml4Entries; /*0xffc15e78*/ + do /*0xffc15f87*/ + { + Pml4Table_1[1] = 0; /*0xffc15e7b*/ + PdptTable = PdptTable_1; /*0xffc15e7f*/ + *Pml4Table_1 = PdptTable_1; /*0xffc15e86*/ + *Pml4Table_1 |= 2u; /*0xffc15e88*/ + *Pml4Table_1 |= 1u; /*0xffc15e8b*/ + v17 = (_BYTE)Enable1GPages == 0; /*0xffc15e8e*/ + PdptTable_3 = PdptTable_1 + 1024; /*0xffc15e92*/ + v18 = Pml4Table_1[1]; /*0xffc15e95*/ + PdptTable_2 = PdptTable; /*0xffc15e98*/ + Pml4Table_1[1] = v18; /*0xffc15e9b*/ + if ( v17 ) /*0xffc15e9e*/ + { + n512_4 = 0; /*0xffc15edc*/ + if ( n512 ) /*0xffc15ee0*/ + { + PdptTable_4 = PdptTable_3; /*0xffc15ee2*/ + n512_1 = n512; /*0xffc15ee5*/ + n512_2 = n512; /*0xffc15ee8*/ + do /*0xffc15f4c*/ + { + PdptTable[1] = 0; /*0xffc15eeb*/ + PdptTable_5 = PdptTable_4; /*0xffc15eef*/ + v26 = PdptTable[1]; /*0xffc15ef1*/ + Index_3 = Index_1; /*0xffc15efa*/ + *PdptTable = (int)PdptTable_4; /*0xffc15efd*/ + *PdptTable |= 2u; /*0xffc15eff*/ + *PdptTable |= 1u; /*0xffc15f02*/ + PdptTable_3 = PdptTable_4 + 1024; /*0xffc15f05*/ + n512_3 = 512; /*0xffc15f08*/ + PdptTable[1] = v26; /*0xffc15f0a*/ + Index_4 = __PAIR64__(PageAttr, Index_3); /*0xffc15f0d*/ + do /*0xffc15f34*/ + { + *PdptTable_5 = Index_4 | 2; /*0xffc15f15*/ + *PdptTable_5 |= 1u; /*0xffc15f19*/ + *PdptTable_5 |= 0x80u; /*0xffc15f1c*/ + PdptTable_5[1] = HIDWORD(Index_4); /*0xffc15f28*/ + PdptTable_5 += 2; /*0xffc15f2b*/ + Index_4 += 0x200000LL; /*0xffc15f2e*/ + --n512_3; /*0xffc15f31*/ + } + while ( n512_3 ); /*0xffc15f34*/ + PdptTable_4 = PdptTable_3; /*0xffc15f36*/ + PageAttr = HIDWORD(Index_4); /*0xffc15f39*/ + PdptTable = PdptTable_2 + 2; /*0xffc15f3f*/ + Index_1 = Index_4; /*0xffc15f42*/ + v17 = n512_1-- == 1; /*0xffc15f45*/ + PdptTable_2 += 2; /*0xffc15f49*/ + } + while ( !v17 ); /*0xffc15f4c*/ + Pml4Table_4 = Pml4Table_3; /*0xffc15f4e*/ + if ( n512 >= 0x200 ) /*0xffc15f54*/ + goto LABEL_40; /*0xffc15f54*/ + n512_4 = n512_2; /*0xffc15f56*/ + } + v30 = 512 - n512_4; /*0xffc15f60*/ + do /*0xffc15f72*/ + { + DxeIplSetMem32(PdptTable, 8u); /*0xffc15f65*/ + PdptTable += 2; /*0xffc15f6b*/ + --v30; /*0xffc15f6f*/ + } + while ( v30 ); /*0xffc15f72*/ + Pml4Table_4 = Pml4Table_3; /*0xffc15f74*/ +LABEL_40: + Index = Index_1; /*0xffc15f77*/ + goto LABEL_41; /*0xffc15f77*/ + } + PageAttr_1 = PageAttr; /*0xffc15ea0*/ + n512_5 = 512; /*0xffc15ea3*/ + do /*0xffc15ec9*/ + { + *PdptTable = Index | 2; /*0xffc15eaa*/ + *PdptTable |= 1u; /*0xffc15eae*/ + *PdptTable |= 0x80u; /*0xffc15eb1*/ + PdptTable[1] = PageAttr_1; /*0xffc15ebd*/ + PdptTable += 2; /*0xffc15ec0*/ + Index_2 = Index + 0x40000000; /*0xffc15ec3*/ + PageAttr_1 = (__PAIR64__(PageAttr_1, Index) + 0x40000000) >> 32; /*0xffc15ec3*/ + Index += 0x40000000; /*0xffc15ec3*/ + --n512_5; /*0xffc15ec6*/ + } + while ( n512_5 ); /*0xffc15ec9*/ + PageAttr = PageAttr_1; /*0xffc15ecb*/ + Pml4Table_4 = Pml4Table_3; /*0xffc15ece*/ + Index_1 = Index_2; /*0xffc15ed1*/ +LABEL_41: + PdptTable_1 = PdptTable_3; /*0xffc15f7a*/ + Pml4Table_1 = Pml4Table_4 + 2; /*0xffc15f7d*/ + v17 = NumPml4Entries_3-- == 1; /*0xffc15f80*/ + Pml4Table_3 = Pml4Table_1; /*0xffc15f84*/ + } + while ( !v17 ); /*0xffc15f87*/ + if ( NumPml4Entries_1 < 0x200 ) /*0xffc15f90*/ + { + NumPml4Entries_5 = NumPml4Entries_4; /*0xffc15f92*/ + goto LABEL_44; /*0xffc15f92*/ + } + return Pml4Table_2; /*0xffc15fac*/ +} + +void DxeIplNullStall() +{ + while ( 1 ) /*0xffc15fbe*/ + ; /*0xffc15fbe*/ +} + +int DxeIplGetBootMode(int _EAX, unsigned int *p_n36, int PhysAddrBits, int a4, _DWORD *a5) +{ + _EAX = _EAX; /*0xffc15fdd*/ + __asm { cpuid } /*0xffc15fe0*/ + if ( p_n36 ) /*0xffc15fe6*/ + *p_n36 = _EAX; /*0xffc15fe8*/ + if ( a5 ) /*0xffc15ffc*/ + *a5 = _EDX; /*0xffc15ffe*/ + return _EAX; /*0xffc16003*/ +} + +int DxeIplGetPeiServices() +{ + _BYTE v1[2]; // [esp+0h] [ebp-10h] BYREF + int v2; // [esp+2h] [ebp-Eh] + _DWORD v3[2]; // [esp+8h] [ebp-8h] BYREF + + v3[1] = v1; /*0xffc16011*/ + __sidt(v1); /*0xffc16017*/ + (*(void ( **)(_DWORD, _DWORD *))(**(_DWORD **)(v2 - 4) + 48))(*(_DWORD *)(v2 - 4), v3); /*0xffc16027*/ + return v3[0]; /*0xffc1602f*/ +} + +_WORD *DxeIplLocatePpi(__int16 n6, _WORD *i) +{ + while ( 1 ) /*0xffc16046*/ + { + if ( *i == 0xFFFF ) /*0xffc1604c*/ + return 0; /*0xffc16051*/ + if ( *i == n6 ) /*0xffc1603e*/ + break; /*0xffc1603e*/ + i = (_WORD *)((char *)i + (unsigned __int16)i[1]); /*0xffc16044*/ + } + return i; /*0xffc16050*/ +} + +_WORD *DxeIplGetBootModeGuid(int a1, _WORD *i) +{ + _WORD *v3; // esi + + while ( 1 ) /*0xffc16079*/ + { + v3 = DxeIplLocatePpi(4, i); /*0xffc16079*/ + if ( !v3 || (unsigned __int8)DxeIplFvIsAddrValid(a1) ) /*0xffc16062*/ + break; /*0xffc16062*/ + i = (_WORD *)((char *)v3 + (unsigned __int16)v3[1]); /*0xffc1606f*/ + } + return v3; /*0xffc1607f*/ +} + +int DxeIplGetPlatformBootMode() +{ + _BYTE v1[2]; // [esp+0h] [ebp-10h] BYREF + int v2; // [esp+2h] [ebp-Eh] + _DWORD v3[2]; // [esp+8h] [ebp-8h] BYREF + + v3[1] = v1; /*0xffc1608e*/ + __sidt(v1); /*0xffc16094*/ + (*(void ( **)(_DWORD, _DWORD *))(**(_DWORD **)(v2 - 4) + 40))(*(_DWORD *)(v2 - 4), v3); /*0xffc160a4*/ + return v3[0]; /*0xffc160ac*/ +} + +int DxeIplSetBootMode(int n2, int n72) +{ + _BYTE v3[2]; // [esp+8h] [ebp-10h] BYREF + int v4; // [esp+Ah] [ebp-Eh] + _DWORD v5[2]; // [esp+10h] [ebp-8h] BYREF + + v5[1] = v3; /*0xffc160bb*/ + __sidt(v3); /*0xffc160c1*/ + if ( (*(int ( **)(_DWORD, int, int, _DWORD *))(**(_DWORD **)(v4 - 4) + 52))(*(_DWORD *)(v4 - 4), n2, n72, v5) >= 0 ) /*0xffc160dd*/ + return v5[0]; /*0xffc160e3*/ + else + return 0; /*0xffc160df*/ +} + +_DWORD *DxeIplDecompressPages(int a1, int a2, int a3, int a4, int a5, int a6) +{ + int v6; // ecx + int v7; // edi + _DWORD *result; // eax + _DWORD *v9; // esi + + v7 = v6; /*0xffc160f2*/ + result = (_DWORD *)DxeIplSetBootMode(2, 72); /*0xffc160f7*/ + v9 = result; /*0xffc160fc*/ + if ( result ) /*0xffc16100*/ + { + result[2] = dword_FFC18D28; /*0xffc16108*/ + result[3] = dword_FFC18D2C; /*0xffc16111*/ + result[4] = dword_FFC18D30; /*0xffc16119*/ + result[5] = dword_FFC18D34; /*0xffc16121*/ + result[6] = a1; /*0xffc16127*/ + result[7] = a2; /*0xffc1612d*/ + result[8] = a3; /*0xffc16133*/ + result[9] = a4; /*0xffc16139*/ + result[10] = 3; /*0xffc16142*/ + DxeIplSetMem32(result + 11, 4u); /*0xffc16149*/ + DxeIplFvSetError(v9 + 12, v7); /*0xffc16155*/ + v9[16] = a5; /*0xffc1615d*/ + v9[17] = a6; /*0xffc16163*/ + return (_DWORD *)a6; /*0xffc16160*/ + } + return result; /*0xffc16166*/ +} + +int DxeIplAllocPages(_DWORD *DxeIplPpi, int BufferSize) +{ + int Status; // eax + int FvEntry; // esi + + Status = DxeIplSetBootMode(4, BufferSize + 24); /*0xffc16175*/ + FvEntry = Status; /*0xffc1617a*/ + if ( Status ) /*0xffc1617e*/ + { + DxeIplFvSetError((_DWORD *)(Status + 8), DxeIplPpi); /*0xffc16185*/ + return FvEntry + 24; /*0xffc1618a*/ + } + return Status; /*0xffc1618d*/ +} + +char *DxeIplAllocPagesBelow4G(_DWORD *DxeIplPpi, char *SourceData, int BufferSize) +{ + char *Destination; // eax + + Destination = (char *)DxeIplAllocPages(DxeIplPpi, BufferSize); /*0xffc16198*/ + if ( Destination ) /*0xffc1619f*/ + return DxeIplFvFreePages(Destination, SourceData, BufferSize); /*0xffc161ab*/ + return Destination; /*0xffc161a1*/ +} + +_DWORD *DxeIplFreePages(int a1, int a2, int a3, int a4) +{ + _DWORD *result; // eax + _DWORD *v5; // esi + + result = (_DWORD *)DxeIplSetBootMode(2, 48); /*0xffc161ba*/ + v5 = result; /*0xffc161bf*/ + if ( result ) /*0xffc161c3*/ + { + DxeIplSetMem32(result + 2, 0x10u); /*0xffc161cb*/ + v5[7] = a2; /*0xffc161d8*/ + v5[8] = a3; /*0xffc161df*/ + v5[9] = a4; /*0xffc161e8*/ + v5[10] = 4; /*0xffc161ed*/ + v5[6] = a1; /*0xffc161f4*/ + return DxeIplSetMem32(v5 + 11, 4u); /*0xffc161f7*/ + } + return result; /*0xffc161ff*/ +} + +int __thiscall DxeIplReportStatus(void *this) +{ + _BYTE v2[2]; // [esp+0h] [ebp-Ch] BYREF + int v3; // [esp+2h] [ebp-Ah] + _BYTE *v4; // [esp+8h] [ebp-4h] + + v4 = v2; /*0xffc1620a*/ + __sidt(v2); /*0xffc16210*/ + return (*(int ( **)(_DWORD, void *))(**(_DWORD **)(v3 - 4) + 24))(*(_DWORD *)(v3 - 4), this); /*0xffc16222*/ +} + +int DxeIplLocatePpiByGuid(int a1, int a2, int a3, int a4) +{ + _BYTE v5[2]; // [esp+4h] [ebp-Ch] BYREF + int v6; // [esp+6h] [ebp-Ah] + _BYTE *v7; // [esp+Ch] [ebp-4h] + + v7 = v5; /*0xffc16230*/ + __sidt(v5); /*0xffc16236*/ + return (*(int ( **)(_DWORD, int, int, _DWORD, int))(**(_DWORD **)(v6 - 4) + 32))( /*0xffc1624f*/ + *(_DWORD *)(v6 - 4), + a1, + a2, + 0, + a4); +} + +int DxeIplOpenFv(int i, int a2) +{ + _BYTE v3[2]; // [esp+4h] [ebp-Ch] BYREF + int v4; // [esp+6h] [ebp-Ah] + _BYTE *v5; // [esp+Ch] [ebp-4h] + + v5 = v3; /*0xffc1625e*/ + __sidt(v3); /*0xffc16264*/ + return (*(int ( **)(_DWORD, int, int))(**(_DWORD **)(v4 - 4) + 56))(*(_DWORD *)(v4 - 4), i, a2); /*0xffc16278*/ +} + +int __usercall DxeIplReadFvSection@(int a1@, int p_DxeHandle) +{ + _BYTE v3[2]; // [esp+0h] [ebp-Ch] BYREF + int v4; // [esp+2h] [ebp-Ah] + _BYTE *v5; // [esp+8h] [ebp-4h] + + v5 = v3; /*0xffc16286*/ + __sidt(v3); /*0xffc1628c*/ + return (*(int ( **)(_DWORD, int, int, int))(**(_DWORD **)(v4 - 4) + 60))( /*0xffc162a4*/ + *(_DWORD *)(v4 - 4), + 5, + a1, + p_DxeHandle); +} + +int __usercall DxeIplFvGetFileSize@(int FfsHeader@, int p_FileSize) +{ + _BYTE v3[2]; // [esp+0h] [ebp-Ch] BYREF + int v4; // [esp+2h] [ebp-Ah] + _BYTE *v5; // [esp+8h] [ebp-4h] + + v5 = v3; /*0xffc162b1*/ + __sidt(v3); /*0xffc162b7*/ + return (*(int ( **)(_DWORD, int, int, int))(**(_DWORD **)(v4 - 4) + 72))( /*0xffc162cf*/ + *(_DWORD *)(v4 - 4), + 4, + FfsHeader, + p_FileSize); +} + +char *DxeIplFvFreePages(char *dst, char *src, unsigned int n0x14) +{ + if ( !n0x14 || dst == src ) /*0xffc162df*/ + return dst; /*0xffc162da*/ + else + return DxeIplCopyMem(dst, src, n0x14); /*0xffc162e7*/ +} + +_DWORD *DxeIplFvSetError(_DWORD *a1, _DWORD *DxeIplPpi) +{ + *a1 = *DxeIplPpi; /*0xffc162f2*/ + a1[1] = DxeIplPpi[1]; /*0xffc162f7*/ + a1[2] = DxeIplPpi[2]; /*0xffc162fd*/ + a1[3] = DxeIplPpi[3]; /*0xffc16303*/ + return a1; /*0xffc16308*/ +} + +bool DxeIplFvIsAddrValid(_DWORD *a1, _DWORD *a2) +{ + return *a1 == *a2 && a1[1] == a2[1] && a1[2] == a2[2] && a1[3] == a2[3]; /*0xffc16329*/ +} + +int DxeIplAllocatePages(int Buffer, int FfsHeader) +{ + int FileSize; // [esp+0h] [ebp-8h] BYREF + + if ( FfsHeader && DxeIplFvGetFileSize(FfsHeader, (int)&FileSize) >= 0 ) /*0xffc16346*/ + return FileSize; /*0xffc16348*/ + else + return 0; /*0xffc16336*/ +} + +int __thiscall DxeIplAllocateZeroPages(void *PeiServices) +{ + _BYTE Idtr[2]; // [esp+4h] [ebp-10h] BYREF + int GdtBase; // [esp+6h] [ebp-Eh] + _DWORD Memory[2]; // [esp+Ch] [ebp-8h] BYREF + + Memory[1] = Idtr; /*0xffc16359*/ + __sidt(Idtr); /*0xffc1635f*/ + if ( (*(int ( **)(_DWORD, void *, _DWORD *))(**(_DWORD **)(GdtBase - 4) + 76))( /*0xffc16379*/ + *(_DWORD *)(GdtBase - 4), + PeiServices, + Memory) >= 0 ) + return Memory[0]; /*0xffc1637f*/ + else + return 0; /*0xffc1637b*/ +} + +void *__thiscall DxeIplGetPeiBootMode(void *this) +{ + void *this_1; // [esp+0h] [ebp-4h] BYREF + + this_1 = this; /*0xffc16389*/ + DxeIplLocatePpiByGuid((int)&unk_FFC18DE8, 0, (int)this, (int)&this_1); /*0xffc16396*/ + return this_1; /*0xffc163a2*/ +} + +int __thiscall DxeIplFvOpenDevice(_DWORD **p_this) +{ + _WORD *i_1; // eax + _WORD *i; // eax + _DWORD *v4; // ecx + _WORD *i_2; // esi + int v6; // eax + int v8; // eax + int v9; // eax + + i_1 = (_WORD *)DxeIplGetPeiServices(); /*0xffc163b0*/ + for ( i = DxeIplLocatePpi(4, i_1); ; i = DxeIplLocatePpi(4, (_WORD *)((char *)i_2 + (unsigned __int16)i_2[1])) ) /*0xffc163ba*/ + { + i_2 = i; /*0xffc163ee*/ + if ( !i ) /*0xffc163f2*/ + { + v6 = DxeIplAllocPages((int)dword_FFC18DB8, 404); /*0xffc163fb*/ + v4 = (_DWORD *)v6; /*0xffc16400*/ + if ( !v6 ) /*0xffc16404*/ + { + *p_this = 0; /*0xffc16406*/ + return -2147483639; /*0xffc1640d*/ + } + *(_DWORD *)(v6 + 4) = 0; /*0xffc16419*/ + v8 = v6 + 20; /*0xffc1641d*/ + *v4 = 1229473104; /*0xffc16420*/ + goto LABEL_11; /*0xffc16420*/ + } + if ( DxeIplFvIsAddrValid((_DWORD *)i + 2, dword_FFC18DB8) ) /*0xffc163d0*/ + { + v4 = i_2 + 12; /*0xffc163d9*/ + if ( *((_DWORD *)i_2 + 6) == 1229473104 ) /*0xffc163de*/ + break; /*0xffc163de*/ + } + } + v8 = (int)(i_2 + 22); /*0xffc1640f*/ + if ( *((_WORD **)i_2 + 8) == i_2 + 22 ) /*0xffc16415*/ + goto LABEL_12; /*0xffc16415*/ +LABEL_11: + v4[2] = v8; /*0xffc16422*/ + v9 = v8 + 256; /*0xffc16425*/ + v4[3] = v9; /*0xffc1642a*/ + v4[4] = v9 + 64; /*0xffc16430*/ +LABEL_12: + *p_this = v4; /*0xffc16433*/ + return 0; /*0xffc16437*/ +} + +int DxeIplInstallPpi(char *DxeIplPpi, int (*DxeIplPeiEndCallback)(), int (*DxeIplPpiNotifyCallback)()) +{ + int Status; // eax + _DWORD *FvDevice; // esi + unsigned int Index; // edi + unsigned int NumEntries; // ebx + _DWORD *FvEntry; // ecx + char *PpiData; // edx + int v9; // ecx + _DWORD *DeviceHandle; // [esp+14h] [ebp-4h] BYREF + + Status = DxeIplFvOpenDevice(&DeviceHandle); /*0xffc16457*/ + if ( Status >= 0 ) /*0xffc1645e*/ + { + FvDevice = DeviceHandle; /*0xffc16464*/ + Index = 0; /*0xffc16468*/ + NumEntries = DeviceHandle[1]; /*0xffc1646a*/ + if ( NumEntries ) /*0xffc1646f*/ + { + FvEntry = (_DWORD *)DeviceHandle[2]; /*0xffc16471*/ + PpiData = DxeIplPpi; /*0xffc16474*/ + while ( !DxeIplFvIsAddrValid(FvEntry, PpiData) ) /*0xffc1647f*/ + { + ++Index; /*0xffc16481*/ + FvEntry = (_DWORD *)(v9 + 16); /*0xffc16482*/ + if ( Index >= NumEntries ) /*0xffc16487*/ + goto LABEL_6; /*0xffc16487*/ + } + *(_DWORD *)(FvDevice[3] + 4 *Index) = DxeIplPpiNotifyCallback; /*0xffc1649f*/ + *(_DWORD *)(FvDevice[4] + 4 *Index) = DxeIplPeiEndCallback; /*0xffc164a5*/ + } + else + { +LABEL_6: + if ( NumEntries >= 0x10 ) /*0xffc1648c*/ + return -2147483639; /*0xffc16493*/ + DxeIplFvSetError((_DWORD *)(FvDevice[2] + 16 *NumEntries), DxeIplPpi); /*0xffc164b8*/ + *(_DWORD *)(FvDevice[3] + 4 *FvDevice[1]) = DxeIplPpiNotifyCallback; /*0xffc164c8*/ + *(_DWORD *)(FvDevice[4] + 4 *FvDevice[1]++) = DxeIplPeiEndCallback; /*0xffc164d5*/ + DxeIplAllocPagesBelow4G(DxeIplPpi, DxeIplPpi, 16); /*0xffc164df*/ + } + return 0; /*0xffc164e5*/ + } + return Status; /*0xffc164e7*/ +} + +int DxeIplDecompress(_DWORD *a1, int a2, int a3, int a4) +{ + int result; // eax + _DWORD *this_1; // ebx + unsigned int v7; // esi + _DWORD *v8; // edx + _DWORD *v9; // ecx + int v10; // ecx + _DWORD *this; // [esp+10h] [ebp-8h] BYREF + int v12; // [esp+14h] [ebp-4h] + + v12 = a2; /*0xffc164fc*/ + result = DxeIplFvOpenDevice(&this); /*0xffc16504*/ + if ( result >= 0 ) + { + this_1 = this; /*0xffc16512*/ + v7 = 0; /*0xffc16523*/ + v8 = (_DWORD *)((char *)a1 + ((*a1 & 0xFFFFFF) != 0xFFFFFF ? 0xFFFFFFFC : 0) + 8); + if ( this[1] ) /*0xffc1652b*/ + { + v9 = (_DWORD *)this[2]; /*0xffc16530*/ + while ( !DxeIplFvIsAddrValid(v9, v8) ) /*0xffc1653a*/ + { + ++v7; /*0xffc1653c*/ + v9 = (_DWORD *)(v10 + 16); /*0xffc1653d*/ + if ( v7 >= this_1[1] ) /*0xffc16543*/ + return -2147483645; /*0xffc16543*/ + } + return (*(int ( **)(_DWORD *, int, int, int))(this_1[3] + 4 *v7))(a1, v12, a3, a4); /*0xffc1655f*/ + } + else + { + return -2147483645; /*0xffc16545*/ + } + } + return result; /*0xffc1654a*/ +} + +int DxeIplDecompressLzma(int a1, unsigned __int16 n8_1) +{ + unsigned __int16 n8; // di + char n8_2; // cl + __int64 v5; // rax + int v6; // eax + int v7; // eax + int v8; // ecx + int result; // eax + unsigned int v10; // [esp+Ch] [ebp-10h] -{"addr":"0xffc15c56","code":"int DxeIplTransferToDxeCore()\n{\n int v0; // ecx\n int v1; // ecx\n int v2; // ecx\n __int64 v4; // [esp+Ch] [ebp-10h] BYREF\n unsigned __int32 v5; // [esp+18h] [ebp-4h]\n\n DxeIplFvGetFileSize(&v4); /*0xffc15c68*/\n v5 = (unsigned __int64)(v4 + 1048544) >> 32; /*0xffc15c83*/\n __lgdt(\"G\"); /*0xffc15c90*/\n v5 = DxeIplCreatePageTables(); /*0xffc15c9f*/\n DxeIplDebugPrintGuid(v0, \"PeiEnd\"); /*0xffc15ca5*/\n DxeIplReportStatus(&unk_FFC18A70); /*0xffc15cb2*/\n DxeIplGetBootModeFromHob(v1, \"PeiEnd\"); /*0xffc15cbc*/\n DxeIplGetBootModeFromHob(v2, \"DxeIpl\"); /*0xffc15cc6*/\n __writecr3(v5); /*0xffc15cd1*/\n DxeIplFvProcessSections(v4, SHIDWORD(v4)); /*0xffc15cdc*/\n return DxeIplZeroMem(); /*0xffc15cf9*/\n}","refs":[{"addr":"0xffc162a8","name":"DxeIplFvGetFileSize"},{"addr":"0xffc15d00","name":"DxeIplCreatePageTables"},{"addr":"0xffc1708f","name":"DxeIplDebugPrintGuid"},{"addr":"0xffc16201","name":"DxeIplReportStatus"},{"addr":"0xffc18a70","name":"unk_FFC18A70"},{"addr":"0xffc17107","name":"DxeIplGetBootModeFromHob"},{"addr":"0xffc157f3","name":"DxeIplFvProcessSections"},{"addr":"0xffc15298","name":"DxeIplZeroMem"}]} + n8 = n8_1; /*0xffc16574*/ + v10 = *(_DWORD *)(a1 + 20); /*0xffc16582*/ + n8_2 = n8_1; /*0xffc16585*/ + LODWORD(v5) = 0; /*0xffc16588*/ + HIDWORD(v5) = v10; /*0xffc1658a*/ + if ( (n8_2 & 0x20) == 0 ) /*0xffc16590*/ + v5 = v10; /*0xffc16592*/ + *(_DWORD *)(a1 + 20) = v5 << (n8_2 & 0x1F); /*0xffc1659f*/ + if ( n8 > *(_WORD *)(a1 + 16) ) /*0xffc165a6*/ + { + do /*0xffc1660a*/ + { + n8 -= *(_WORD *)(a1 + 16); /*0xffc165ab*/ + v6 = 0; /*0xffc165c2*/ + if ( (n8 & 0x20) == 0 ) /*0xffc165ca*/ + v6 = *(_DWORD *)(a1 + 24); /*0xffc165cc*/ + *(_DWORD *)(a1 + 20) |= v6 << n8; /*0xffc165d6*/ + v7 = *(_DWORD *)(a1 + 32); /*0xffc165d9*/ + if ( v7 ) /*0xffc165e1*/ + { + v8 = *(_DWORD *)(a1 + 12); /*0xffc165e3*/ + *(_DWORD *)(a1 + 24) = 0; /*0xffc165e7*/ + *(_DWORD *)(a1 + 32) = v7 - 1; /*0xffc165eb*/ + *(_DWORD *)(a1 + 24) = *(unsigned __int8 *)(*(_DWORD *)a1 + v8); /*0xffc165f4*/ + *(_DWORD *)(a1 + 12) = v8 + 1; /*0xffc165fa*/ + } + else + { + *(_DWORD *)(a1 + 24) = 0; /*0xffc165ff*/ + } + *(_WORD *)(a1 + 16) = 8; /*0xffc16603*/ + } + while ( n8 > 8u ); /*0xffc1660a*/ + } + *(_WORD *)(a1 + 16) -= n8; /*0xffc1660c*/ + result = *(_DWORD *)(a1 + 24) >> *(_BYTE *)(a1 + 16); /*0xffc16616*/ + *(_DWORD *)(a1 + 20) |= result; /*0xffc16618*/ + return result; /*0xffc1661b*/ +} -{"addr":"0xffc15d00","code":"int __thiscall DxeIplCreatePageTables(void *this)\n{\n unsigned __int8 ( **PeiServices)(int); // eax\n _WORD *i; // eax\n _WORD *Ppi; // eax\n int PhysAddrBits; // ecx\n unsigned __int8 MaxPhysAddr; // bl\n int result; // eax\n int NumPml4Entries; // esi\n __int64 v8; // rax\n __int64 NumPdptEntries; // rax\n int NumPml4Entries_2; // edx\n int Pml4Table; // eax\n unsigned int Index; // edx\n _DWORD *Pml4Table_1; // edi\n int *PdptTable_1; // eax\n int NumPml4Entries_5; // ecx\n int *PdptTable; // esi\n bool v17; // zf\n int v18; // eax\n int PageAttr_1; // edi\n int n512_5; // ecx\n unsigned int Index_2; // kr00_4\n _DWORD *Pml4Table_4; // edi\n unsigned int n512_4; // edx\n _DWORD *PdptTable_4; // edi\n _DWORD *PdptTable_5; // edx\n int v26; // eax\n unsigned int Index_3; // ecx\n int n512_3; // edi\n unsigned __int64 Index_4; // kr08_8\n unsigned int v30; // edi\n int v31; // ebx\n int PhysAddrBits_1; // [esp-4h] [ebp-54h]\n int PhysAddrBits_2; // [esp-4h] [ebp-54h]\n int Pml4Table_2; // [esp+14h] [ebp-3Ch]\n int NumPml4Entries_4; // [esp+18h] [ebp-38h]\n unsigned int n512_2; // [esp+1Ch] [ebp-34h]\n int v37; // [esp+20h] [ebp-30h] BYREF\n unsigned int NumPml4Entries_1; // [esp+24h] [ebp-2Ch]\n int NumPml4Entries_3; // [esp+28h] [ebp-28h]\n unsigned int n512_1; // [esp+2Ch] [ebp-24h]\n int *PdptTable_2; // [esp+30h] [ebp-20h]\n unsigned int n512; // [esp+34h] [ebp-1Ch]\n _DWORD *PdptTable_3; // [esp+38h] [ebp-18h]\n _DWORD *Pml4Table_3; // [esp+3Ch] [ebp-14h]\n int PageAttr; // [esp+40h] [ebp-10h]\n int Enable1GPages; // [esp+44h] [ebp-Ch]\n unsigned int Index_1; // [esp+48h] [ebp-8h]\n unsigned int p_n36; // [esp+4Ch] [ebp-4h] BYREF\n\n LOBYTE(Enable1GPages) = 0; /*0xffc15d0b*/\n PeiServices = (unsigned __int8 ( **)(int))DxeIplGetPeiBootMode(this); /*0xffc15d0e*/\n if ( PeiServices[6](4) ) /*0xffc15d15*/\n {\n DxeIplGetBootMode(0x80000000, &p_n36, PhysAddrBits_1, PhysAddrBits_1, 0); /*0xffc15d2a*/\n if ( p_n36 >= 0x80000001 ) /*0xffc15d38*/\n {\n DxeIplGetBootMode(-2147483647, 0, -2147483647, -2147483647, &v37); /*0xffc15d42*/\n if ( (v37 & 0x4000000) != 0 ) /*0xffc15d51*/\n LOBYTE(Enable1GPages) = 1; /*0xffc15d53*/\n }\n }\n i = (_WORD *)DxeIplGetPeiServices(); /*0xffc15d57*/\n Ppi = DxeIplLocatePpi(6, i); /*0xffc15d61*/\n if ( Ppi ) /*0xffc15d68*/\n {\n MaxPhysAddr = *((_BYTE *)Ppi + 8); /*0xffc15d6a*/\n }\n else\n {\n DxeIplGetBootMode(0x80000000, &p_n36, PhysAddrBits, PhysAddrBits, 0); /*0xffc15d77*/\n PhysAddrBits = -2147483640; /*0xffc15d7c*/\n if ( p_n36 < 0x80000008 ) /*0xffc15d87*/\n {\n MaxPhysAddr = 36; /*0xffc15d9c*/\n }\n else\n {\n DxeIplGetBootMode(-2147483640, &p_n36, -2147483640, -2147483640, 0); /*0xffc15d8f*/\n MaxPhysAddr = p_n36; /*0xffc15d94*/\n }\n }\n LOBYTE(Index_1) = MaxPhysAddr; /*0xffc15d9e*/\n if ( MaxPhysAddr > 0x30u ) /*0xffc15da4*/\n {\n MaxPhysAddr = 48; /*0xffc15da6*/\n LOBYTE(Index_1) = 48; /*0xffc15da8*/\n }\n if ( dword_FFC18E48 ) /*0xffc15db2*/\n {\n result = dword_FFC18E48(Index_1, Enable1GPages); /*0xffc15dba*/\n PhysAddrBits = PhysAddrBits_2; /*0xffc15dbd*/\n if ( result ) /*0xffc15dc0*/\n return result; /*0xffc15dc0*/\n }\n if ( MaxPhysAddr > 0x27u ) /*0xffc15dcc*/\n {\n NumPml4Entries_1 = MaxPhysAddr - 39; /*0xffc15e12*/\n LOBYTE(PhysAddrBits) = MaxPhysAddr - 39; /*0xffc15e15*/\n NumPdptEntries = 0x100000000LL; /*0xffc15e18*/\n if ( ((MaxPhysAddr - 39) & 0x20) == 0 ) /*0xffc15e20*/\n NumPdptEntries = 1; /*0xffc15e22*/\n NumPml4Entries = NumPdptEntries << (PhysAddrBits & 0x1F); /*0xffc15e2c*/\n NumPml4Entries_1 = NumPml4Entries; /*0xffc15e33*/\n LODWORD(NumPdptEntries) = 512; /*0xffc15e36*/\n n512 = 512; /*0xffc15e38*/\n }\n else\n {\n PhysAddrBits = 1; /*0xffc15dd3*/\n NumPml4Entries_3 = MaxPhysAddr - 30; /*0xffc15dd4*/\n NumPml4Entries = 1; /*0xffc15ddb*/\n NumPml4Entries_1 = 1; /*0xffc15ddd*/\n LOBYTE(PhysAddrBits) = MaxPhysAddr - 30; /*0xffc15de3*/\n v8 = 0x100000000LL; /*0xffc15de6*/\n if ( ((MaxPhysAddr - 30) & 0x20) == 0 ) /*0xffc15dee*/\n v8 = 1; /*0xffc15df0*/\n NumPdptEntries = v8 << (PhysAddrBits & 0x1F); /*0xffc15df8*/\n n512 = NumPdptEntries; /*0xffc15dfa*/\n }\n if ( (_BYTE)Enable1GPages ) /*0xffc15e42*/\n NumPml4Entries_2 = NumPml4Entries; /*0xffc15e4c*/\n else\n NumPml4Entries_2 = NumPml4Entries * (NumPdptEntries + 1); /*0xffc15e47*/\n Pml4Table = DxeIplAllocatePages(PhysAddrBits, NumPml4Entries_2 + 1); /*0xffc15e4f*/\n Index = 0; /*0xffc15e56*/\n PageAttr = 0; /*0xffc15e58*/\n Pml4Table_1 = (_DWORD *)Pml4Table; /*0xffc15e5b*/\n Pml4Table_2 = Pml4Table; /*0xffc15e5d*/\n PdptTable_1 = (int *)(Pml4Table + 4096); /*0xffc15e60*/\n NumPml4Entries_5 = 0; /*0xffc15e65*/\n Pml4Table_3 = (_DWORD *)Pml4Table_2; /*0xffc15e67*/\n Index_1 = 0; /*0xffc15e6a*/\n if ( !NumPml4Entries ) /*0xffc15e6f*/\n {\nLABEL_44:\n v31 = 512 - NumPml4Entries_5; /*0xffc15f95*/\n do /*0xffc15fa7*/\n {\n DxeIplSetMem32(Pml4Table_1, 8u); /*0xffc15f9a*/\n Pml4Table_1 += 2; /*0xffc15fa0*/\n --v31; /*0xffc15fa4*/\n }\n while ( v31 ); /*0xffc15fa7*/\n return Pml4Table_2; /*0xffc15fa7*/\n }\n NumPml4Entries_3 = NumPml4Entries; /*0xffc15e75*/\n NumPml4Entries_4 = NumPml4Entries; /*0xffc15e78*/\n do /*0xffc15f87*/\n {\n Pml4Table_1[1] = 0; /*0xffc15e7b*/\n PdptTable = PdptTable_1; /*0xffc15e7f*/\n *Pml4Table_1 = PdptTable_1; /*0xffc15e86*/\n *Pml4Table_1 |= 2u; /*0xffc15e88*/\n *Pml4Table_1 |= 1u; /*0xffc15e8b*/\n v17 = (_BYTE)Enable1GPages == 0; /*0xffc15e8e*/\n PdptTable_3 = PdptTable_1 + 1024; /*0xffc15e92*/\n v18 = Pml4Table_1[1]; /*0xffc15e95*/\n PdptTable_2 = PdptTable; /*0xffc15e98*/\n Pml4Table_1[1] = v18; /*0xffc15e9b*/\n if ( v17 ) /*0xffc15e9e*/\n {\n n512_4 = 0; /*0xffc15edc*/\n if ( n512 ) /*0xffc15ee0*/\n {\n PdptTable_4 = PdptTable_3; /*0xffc15ee2*/\n n512_1 = n512; /*0xffc15ee5*/\n n512_2 = n512; /*0xffc15ee8*/\n do /*0xffc15f4c*/\n {\n PdptTable[1] = 0; /*0xffc15eeb*/\n PdptTable_5 = PdptTable_4; /*0xffc15eef*/\n v26 = PdptTable[1]; /*0xffc15ef1*/\n Index_3 = Index_1; /*0xffc15efa*/\n *PdptTable = (int)PdptTable_4; /*0xffc15efd*/\n *PdptTable |= 2u; /*0xffc15eff*/\n *PdptTable |= 1u; /*0xffc15f02*/\n PdptTable_3 = PdptTable_4 + 1024; /*0xffc15f05*/\n n512_3 = 512; /*0xffc15f08*/\n PdptTable[1] = v26; /*0xffc15f0a*/\n Index_4 = __PAIR64__(PageAttr, Index_3); /*0xffc15f0d*/\n do /*0xffc15f34*/\n {\n *PdptTable_5 = Index_4 | 2; /*0xffc15f15*/\n *PdptTable_5 |= 1u; /*0xffc15f19*/\n *PdptTable_5 |= 0x80u; /*0xffc15f1c*/\n PdptTable_5[1] = HIDWORD(Index_4); /*0xffc15f28*/\n PdptTable_5 += 2; /*0xffc15f2b*/\n Index_4 += 0x200000LL; /*0xffc15f2e*/\n --n512_3; /*0xffc15f31*/\n }\n while ( n512_3 ); /*0xffc15f34*/\n PdptTable_4 = PdptTable_3; /*0xffc15f36*/\n PageAttr = HIDWORD(Index_4); /*0xffc15f39*/\n PdptTable = PdptTable_2 + 2; /*0xffc15f3f*/\n Index_1 = Index_4; /*0xffc15f42*/\n v17 = n512_1-- == 1; /*0xffc15f45*/\n PdptTable_2 += 2; /*0xffc15f49*/\n }\n while ( !v17 ); /*0xffc15f4c*/\n Pml4Table_4 = Pml4Table_3; /*0xffc15f4e*/\n if ( n512 >= 0x200 ) /*0xffc15f54*/\n goto LABEL_40; /*0xffc15f54*/\n n512_4 = n512_2; /*0xffc15f56*/\n }\n v30 = 512 - n512_4; /*0xffc15f60*/\n do /*0xffc15f72*/\n {\n DxeIplSetMem32(PdptTable, 8u); /*0xffc15f65*/\n PdptTable += 2; /*0xffc15f6b*/\n --v30; /*0xffc15f6f*/\n }\n while ( v30 ); /*0xffc15f72*/\n Pml4Table_4 = Pml4Table_3; /*0xffc15f74*/\nLABEL_40:\n Index = Index_1; /*0xffc15f77*/\n goto LABEL_41; /*0xffc15f77*/\n }\n PageAttr_1 = PageAttr; /*0xffc15ea0*/\n n512_5 = 512; /*0xffc15ea3*/\n do /*0xffc15ec9*/\n {\n *PdptTable = Index | 2; /*0xffc15eaa*/\n *PdptTable |= 1u; /*0xffc15eae*/\n *PdptTable |= 0x80u; /*0xffc15eb1*/\n PdptTable[1] = PageAttr_1; /*0xffc15ebd*/\n PdptTable += 2; /*0xffc15ec0*/\n Index_2 = Index + 0x40000000; /*0xffc15ec3*/\n PageAttr_1 = (__PAIR64__(PageAttr_1, Index) + 0x40000000) >> 32; /*0xffc15ec3*/\n Index += 0x40000000; /*0xffc15ec3*/\n --n512_5; /*0xffc15ec6*/\n }\n while ( n512_5 ); /*0xffc15ec9*/\n PageAttr = PageAttr_1; /*0xffc15ecb*/\n Pml4Table_4 = Pml4Table_3; /*0xffc15ece*/\n Index_1 = Index_2; /*0xffc15ed1*/\nLABEL_41:\n PdptTable_1 = PdptTable_3; /*0xffc15f7a*/\n Pml4Table_1 = Pml4Table_4 + 2; /*0xffc15f7d*/\n v17 = NumPml4Entries_3-- == 1; /*0xffc15f80*/\n Pml4Table_3 = Pml4Table_1; /*0xffc15f84*/\n }\n while ( !v17 ); /*0xffc15f87*/\n if ( NumPml4Entries_1 < 0x200 ) /*0xffc15f90*/\n {\n NumPml4Entries_5 = NumPml4Entries_4; /*0xffc15f92*/\n goto LABEL_44; /*0xffc15f92*/\n }\n return Pml4Table_2; /*0xffc15fac*/\n}","refs":[{"addr":"0xffc16386","name":"DxeIplGetPeiBootMode"},{"addr":"0xffc15fc8","name":"DxeIplGetBootMode"},{"addr":"0xffc16008","name":"DxeIplGetPeiServices"},{"addr":"0xffc16033","name":"DxeIplLocatePpi"},{"addr":"0xffc18e48","name":"CreatePageTableHook"},{"addr":"0xffc1632d","name":"DxeIplAllocatePages"},{"addr":"0xffc15328","name":"DxeIplSetMem32"}]} +int DxeIplGetDecompressAlgo(int a1, unsigned __int16 n8) +{ + int v2; // esi -{"addr":"0xffc15fb3","code":"void DxeIplNullStall()\n{\n while ( 1 ) /*0xffc15fbe*/\n ; /*0xffc15fbe*/\n}"} + v2 = *(_DWORD *)(a1 + 20) >> (32 - n8); /*0xffc1662d*/ + DxeIplDecompressLzma(a1, n8); /*0xffc16631*/ + return v2; /*0xffc16638*/ +} -{"addr":"0xffc15fc8","code":"int DxeIplGetBootMode(int _EAX, unsigned int *p_n36, int PhysAddrBits, int a4, _DWORD *a5)\n{\n _EAX = _EAX; /*0xffc15fdd*/\n __asm { cpuid } /*0xffc15fe0*/\n if ( p_n36 ) /*0xffc15fe6*/\n *p_n36 = _EAX; /*0xffc15fe8*/\n if ( a5 ) /*0xffc15ffc*/\n *a5 = _EDX; /*0xffc15ffe*/\n return _EAX; /*0xffc16003*/\n}"} +int DxeIplHuffmanBuildTable( + int HuffCtx, + unsigned __int16 NumSymbols, + int CodeLen, + unsigned __int16 MaxBits, + int InitBits) +{ + unsigned __int16 v5; // si + unsigned __int8 n0x10; // al + int n15; // ecx + int v8; // edx + int n16; // esi + __int16 v10; // ax + __int16 v11; // ax + unsigned __int16 MaxBits_1; // bp + int MaxBits_3; // esi + char v14; // bl + char MaxBits_2; // al + int MaxBits_6; // edx + __int16 v17; // ax + int MaxBits_4; // edx + __int16 v19; // ax + unsigned __int16 v20; // ax + int v21; // edx + int v22; // eax + unsigned int v23; // eax + int NumSymbols_3; // esi + int InitBits_1; // edi + int CodeLen_1; // ecx + unsigned int MaxBits_5; // edx + unsigned int v28; // ecx + unsigned __int16 v29; // bx + unsigned __int16 v30; // di + unsigned __int16 v31; // dx + int v32; // ebx + _WORD *v33; // ecx + int NumSymbols_2; // ebp + unsigned __int16 v35; // si + int n0x3FB; // edx + int v37; // ecx + int v39; // eax + unsigned __int16 v42; // [esp+14h] [ebp-64h] + int NumSymbols_1; // [esp+18h] [ebp-60h] + int NumSymbols_4; // [esp+1Ch] [ebp-5Ch] + unsigned __int16 v45; // [esp+20h] [ebp-58h] + unsigned __int16 v46; // [esp+28h] [ebp-50h] + int v47; // [esp+2Ch] [ebp-4Ch] + _WORD buf[18]; // [esp+30h] [ebp-48h] BYREF + _DWORD v49[8]; // [esp+54h] [ebp-24h] + __int16 v50; // [esp+76h] [ebp-2h] -{"addr":"0xffc16008","code":"int DxeIplGetPeiServices()\n{\n _BYTE v1[2]; // [esp+0h] [ebp-10h] BYREF\n int v2; // [esp+2h] [ebp-Eh]\n _DWORD v3[2]; // [esp+8h] [ebp-8h] BYREF\n\n v3[1] = v1; /*0xffc16011*/\n __sidt(v1); /*0xffc16017*/\n (*(void ( **)(_DWORD, _DWORD *))(**(_DWORD **)(v2 - 4) + 48))(*(_DWORD *)(v2 - 4), v3); /*0xffc16027*/\n return v3[0]; /*0xffc1602f*/\n}"} + memset(buf, 0, 34); /*0xffc16652*/ + v5 = 0; /*0xffc16656*/ + if ( NumSymbols ) /*0xffc1665f*/ + { + do /*0xffc16668*/ + { + n0x10 = *(_BYTE *)(v5 + CodeLen); /*0xffc16668*/ + if ( n0x10 > 0x10u ) /*0xffc1666d*/ + return 0xFFFF; /*0xffc1666d*/ + ++buf[n0x10]; /*0xffc16676*/ + } + while ( ++v5 < NumSymbols ); /*0xffc16668*/ + } + n15 = 15; /*0xffc16681*/ + v8 = 0; /*0xffc16686*/ + v49[0] = 0; /*0xffc1668b*/ + n16 = 16; /*0xffc1668f*/ + do /*0xffc166aa*/ + { + v10 = buf[++v8]; /*0xffc16691*/ + v11 = *(_WORD *)((char *)v49 + v8 *2) + (v10 << n15--); /*0xffc1669c*/ + *(_WORD *)((char *)v49 + v8 *2 + 2) = v11; /*0xffc166a2*/ + --n16; /*0xffc166a7*/ + } + while ( n16 ); /*0xffc166aa*/ + if ( v50 ) /*0xffc166b1*/ + return 0xFFFF; /*0xffc1687f*/ + MaxBits_1 = MaxBits; /*0xffc166bc*/ + MaxBits_3 = 1; /*0xffc166c6*/ + v14 = 16 - MaxBits; /*0xffc166c8*/ + buf[0] = 0; /*0xffc166cd*/ + if ( !MaxBits ) /*0xffc166d5*/ + goto LABEL_45; /*0xffc166d5*/ + MaxBits_2 = MaxBits; /*0xffc166d7*/ + do /*0xffc166ff*/ + { + MaxBits_6 = (unsigned __int16)MaxBits_3; /*0xffc166de*/ + *((_WORD *)v49 + (unsigned __int16)MaxBits_3) >>= v14; /*0xffc166e4*/ + v17 = 1 << (MaxBits_2 - MaxBits_3++); /*0xffc166ef*/ + buf[MaxBits_6] = v17; /*0xffc166f3*/ + MaxBits_2 = MaxBits; /*0xffc166f8*/ + } + while ( (unsigned __int16)MaxBits_3 <= MaxBits ); /*0xffc166ff*/ + if ( (unsigned __int16)MaxBits_3 <= 0x10u ) /*0xffc16707*/ + { +LABEL_45: + do /*0xffc16721*/ + { + MaxBits_4 = (unsigned __int16)MaxBits_3; /*0xffc1670c*/ + v19 = 1 << (16 - MaxBits_3++); /*0xffc16715*/ + buf[MaxBits_4] = v19; /*0xffc16719*/ + } + while ( (unsigned __int16)MaxBits_3 <= 0x10u ); /*0xffc16721*/ + MaxBits_1 = MaxBits; /*0xffc16723*/ + } + v20 = *((_WORD *)v49 + MaxBits_1 + 1) >> v14; /*0xffc16735*/ + v21 = v20; /*0xffc16738*/ + if ( v20 ) /*0xffc1673e*/ + { + v22 = (unsigned __int16)(1 << MaxBits_1); /*0xffc16747*/ + if ( (unsigned __int16)v21 < (unsigned __int16)v22 ) /*0xffc1674d*/ + { + v23 = 2 * (v22 - v21); /*0xffc16753*/ + if ( v23 ) /*0xffc16755*/ + DxeIplSetMem16((_WORD *)(InitBits + 2 *v21), v23 >> 1, 0); /*0xffc16767*/ + } + } + NumSymbols_1 = NumSymbols; /*0xffc16774*/ + NumSymbols_3 = 0; /*0xffc16787*/ + v42 = 1 << (15 - MaxBits_1); /*0xffc1678c*/ + v45 = 1 << MaxBits_1; /*0xffc16793*/ + NumSymbols_4 = 0; /*0xffc16799*/ + if ( NumSymbols ) /*0xffc167a2*/ + { + InitBits_1 = InitBits; /*0xffc167a8*/ + CodeLen_1 = CodeLen; /*0xffc167b1*/ + do /*0xffc168e2*/ + { + MaxBits_5 = *(unsigned __int8 *)((unsigned __int16)NumSymbols_3 + CodeLen_1); /*0xffc167bf*/ + if ( *(_BYTE *)((unsigned __int16)NumSymbols_3 + CodeLen_1) && MaxBits_5 < 0x11 ) /*0xffc167cf*/ + { + v47 = 2 *MaxBits_5; /*0xffc167d9*/ + v28 = *((unsigned __int16 *)v49 + MaxBits_5); /*0xffc167dd*/ + v29 = v28 + buf[MaxBits_5]; /*0xffc167ea*/ + v46 = v29; /*0xffc167ed*/ + if ( (unsigned __int16)MaxBits_5 <= MaxBits_1 ) /*0xffc167f4*/ + { + while ( (unsigned __int16)v28 < v29 ) /*0xffc16893*/ + { + if ( (unsigned __int16)v28 >= v45 ) /*0xffc16886*/ + return 0xFFFF; /*0xffc168f2*/ + v39 = (unsigned __int16)v28; /*0xffc16888*/ + LOWORD(v28) = v28 + 1; /*0xffc1688b*/ + *(_WORD *)(InitBits_1 + 2 *v39) = NumSymbols_3; /*0xffc1688c*/ + } + } + else + { + v30 = *((_WORD *)v49 + MaxBits_5); /*0xffc167fa*/ + v31 = MaxBits_5 - MaxBits_1; /*0xffc167fc*/ + v32 = v31; /*0xffc1680d*/ + v33 = (_WORD *)(InitBits + 2 * (v28 >> (16 - MaxBits))); /*0xffc16810*/ + if ( v31 ) /*0xffc16816*/ + { + NumSymbols_2 = NumSymbols_1; /*0xffc1681c*/ + v35 = v42; /*0xffc16820*/ + do /*0xffc168a5*/ + { + if ( !*v33 && (unsigned __int16)NumSymbols_2 < 0x3FBu ) /*0xffc16833*/ + { + *(_WORD *)(HuffCtx + 2 * (unsigned __int16)NumSymbols_2 + 42) = 0; /*0xffc1683e*/ + *(_WORD *)(HuffCtx + 2 * (unsigned __int16)NumSymbols_2 + 2080) = 0; /*0xffc16843*/ + v35 = v42; /*0xffc1684b*/ + *v33 = NumSymbols_2++; /*0xffc1684f*/ + } + n0x3FB = (unsigned __int16)*v33; /*0xffc16853*/ + if ( (unsigned __int16)n0x3FB < 0x3FBu ) /*0xffc1685e*/ + { + v37 = HuffCtx + 2 *n0x3FB; /*0xffc1686d*/ + if ( (v30 & v35) != 0 ) /*0xffc16870*/ + v33 = (_WORD *)(v37 + 2080); /*0xffc16872*/ + else + v33 = (_WORD *)(v37 + 42); /*0xffc16897*/ + } + v32 += 0xFFFF; /*0xffc1689a*/ + v30 *= 2; /*0xffc168a0*/ + } + while ( (_WORD)v32 ); /*0xffc168a5*/ + NumSymbols_3 = NumSymbols_4; /*0xffc168ab*/ + NumSymbols_1 = NumSymbols_2; /*0xffc168af*/ + MaxBits_1 = MaxBits; /*0xffc168b3*/ + } + v29 = v46; /*0xffc168ba*/ + InitBits_1 = InitBits; /*0xffc168be*/ + *v33 = NumSymbols_3; /*0xffc168c5*/ + } + CodeLen_1 = CodeLen; /*0xffc168cc*/ + *(_WORD *)((char *)v49 + v47) = v29; /*0xffc168d3*/ + } + NumSymbols_4 = ++NumSymbols_3; /*0xffc168d9*/ + } + while ( (unsigned __int16)NumSymbols_3 < NumSymbols ); /*0xffc168e2*/ + } + return 0; /*0xffc168eb*/ +} -{"addr":"0xffc16033","code":"_WORD *DxeIplLocatePpi(__int16 n6, _WORD *i)\n{\n while ( 1 ) /*0xffc16046*/\n {\n if ( *i == 0xFFFF ) /*0xffc1604c*/\n return 0; /*0xffc16051*/\n if ( *i == n6 ) /*0xffc1603e*/\n break; /*0xffc1603e*/\n i = (_WORD *)((char *)i + (unsigned __int16)i[1]); /*0xffc16044*/\n }\n return i; /*0xffc16050*/\n}"} +int DxeIplLzmaDecodeCore1( + _DWORD *LzmaCtx, + unsigned __int16 count, + unsigned __int16 NumBits, + __int16 ShiftBits) +{ + unsigned __int16 DecompressAlgo; // di + unsigned __int16 v7; // ax + int n0x1F; // esi + int n7; // eax + bool v11; // cf + unsigned int n0x10000000; // ecx + unsigned __int16 n3; // dx + int v14; // eax + __int16 i; // cx + int v16; // eax + int n0x1F_1; // eax + char n7_1; // [esp+14h] [ebp-8h] -{"addr":"0xffc16056","code":"_WORD *DxeIplGetBootModeGuid(int a1, _WORD *i)\n{\n _WORD *v3; // esi\n\n while ( 1 ) /*0xffc16079*/\n {\n v3 = DxeIplLocatePpi(4, i); /*0xffc16079*/\n if ( !v3 || (unsigned __int8)DxeIplFvIsAddrValid(a1) ) /*0xffc16062*/\n break; /*0xffc16062*/\n i = (_WORD *)((char *)v3 + (unsigned __int16)v3[1]); /*0xffc1606f*/\n }\n return v3; /*0xffc1607f*/\n}","refs":[{"addr":"0xffc16033","name":"DxeIplLocatePpi"},{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"}]} + DecompressAlgo = DxeIplGetDecompressAlgo((int)LzmaCtx, NumBits); /*0xffc16911*/ + if ( !DecompressAlgo ) /*0xffc16917*/ + { + v7 = DxeIplGetDecompressAlgo((int)LzmaCtx, NumBits); /*0xffc1691f*/ + memset32(LzmaCtx + 3213, (v7 << 16) | v7, 0x80u); /*0xffc16939*/ + DxeIplSetMem64(LzmaCtx + 1157, count, 0); /*0xffc16948*/ + return 0; /*0xffc16952*/ + } + n0x1F = 0; /*0xffc16959*/ + while ( (unsigned __int16)n0x1F < 0x1Fu ) /*0xffc1696f*/ + { + n7 = LzmaCtx[5] >> 29; /*0xffc16978*/ + n7_1 = n7; /*0xffc1697b*/ + v11 = (unsigned __int16)n7 < 7u; /*0xffc1697f*/ + if ( (_WORD)n7 == 7 ) /*0xffc16982*/ + { + n0x10000000 = 0x10000000; /*0xffc16984*/ + if ( (LzmaCtx[5] & 0x10000000) == 0 ) /*0xffc1698c*/ + goto LABEL_11; /*0xffc1698c*/ + do /*0xffc16994*/ + { + n0x10000000 >>= 1; /*0xffc1698e*/ + LOWORD(n7) = n7 + 1; /*0xffc16990*/ + } + while ( (n0x10000000 & LzmaCtx[5]) != 0 ); /*0xffc16994*/ + n7_1 = n7; /*0xffc16996*/ + v11 = (unsigned __int16)n7 < 7u; /*0xffc1699a*/ + } + if ( !v11 ) /*0xffc1699d*/ + { +LABEL_11: + n3 = n7 - 3; /*0xffc169a4*/ + goto LABEL_12; /*0xffc169a7*/ + } + n3 = 3; /*0xffc169a1*/ +LABEL_12: + DxeIplDecompressLzma((int)LzmaCtx, n3); /*0xffc169aa*/ + v14 = (unsigned __int16)n0x1F++; /*0xffc169b5*/ + *((_BYTE *)LzmaCtx + v14 + 4628) = n7_1; /*0xffc169b9*/ + if ( (_WORD)n0x1F == ShiftBits ) /*0xffc169c5*/ + { + for ( i = DxeIplGetDecompressAlgo((int)LzmaCtx, 2u) - 1; i >= 0 && (unsigned __int16)n0x1F < 0x1Fu; --i ) /*0xffc169d2*/ + { + v16 = (unsigned __int16)n0x1F++; /*0xffc169dc*/ + *((_BYTE *)LzmaCtx + v16 + 4628) = 0; /*0xffc169e6*/ + } + } + if ( (unsigned __int16)n0x1F >= DecompressAlgo ) /*0xffc169f9*/ + break; /*0xffc169f9*/ + } + while ( (unsigned __int16)n0x1F < count && (unsigned __int16)n0x1F < 0x1Fu ) /*0xffc16a0b*/ + { + n0x1F_1 = (unsigned __int16)n0x1F; /*0xffc16a0d*/ + LOWORD(n0x1F) = n0x1F + 1; /*0xffc16a10*/ + *((_BYTE *)LzmaCtx + n0x1F_1 + 4628) = 0; /*0xffc16a11*/ + } + return DxeIplHuffmanBuildTable((int)LzmaCtx, count, (int)(LzmaCtx + 1157), 8u, (int)(LzmaCtx + 3213)); /*0xffc16a3a*/ +} -{"addr":"0xffc16085","code":"int DxeIplGetPlatformBootMode()\n{\n _BYTE v1[2]; // [esp+0h] [ebp-10h] BYREF\n int v2; // [esp+2h] [ebp-Eh]\n _DWORD v3[2]; // [esp+8h] [ebp-8h] BYREF\n\n v3[1] = v1; /*0xffc1608e*/\n __sidt(v1); /*0xffc16094*/\n (*(void ( **)(_DWORD, _DWORD *))(**(_DWORD **)(v2 - 4) + 40))(*(_DWORD *)(v2 - 4), v3); /*0xffc160a4*/\n return v3[0]; /*0xffc160ac*/\n}"} +int __thiscall DxeIplLzmaDecodeCore2(_DWORD *LzmaCtx) +{ + unsigned __int16 DecompressAlgo; // bp + unsigned __int16 v3; // si + int value; // eax + int n0x1FE; // esi + unsigned __int16 n0x13; // bx + unsigned int n0x800000; // ecx + int v8; // ebx + unsigned __int16 v9; // ax + int i; // ebx + int n0x1FE_1; // eax + int v12; // eax -{"addr":"0xffc160b0","code":"int DxeIplSetBootMode(int n2, int n72)\n{\n _BYTE v3[2]; // [esp+8h] [ebp-10h] BYREF\n int v4; // [esp+Ah] [ebp-Eh]\n _DWORD v5[2]; // [esp+10h] [ebp-8h] BYREF\n\n v5[1] = v3; /*0xffc160bb*/\n __sidt(v3); /*0xffc160c1*/\n if ( (*(int ( **)(_DWORD, int, int, _DWORD *))(**(_DWORD **)(v4 - 4) + 52))(*(_DWORD *)(v4 - 4), n2, n72, v5) >= 0 ) /*0xffc160dd*/\n return v5[0]; /*0xffc160e3*/\n else\n return 0; /*0xffc160df*/\n}"} + DecompressAlgo = DxeIplGetDecompressAlgo((int)LzmaCtx, 9u); /*0xffc16a51*/ + if ( DecompressAlgo ) + { + n0x1FE = 0; /*0xffc16a9c*/ + do + { + if ( (unsigned __int16)n0x1FE >= 0x1FEu ) /*0xffc16ab2*/ + break; /*0xffc16ab2*/ + n0x13 = *((_WORD *)LzmaCtx + HIBYTE(*(LzmaCtx + 5)) + 6426); /*0xffc16abe*/ + if ( n0x13 >= 0x13u ) /*0xffc16ac9*/ + { + n0x800000 = 0x800000; /*0xffc16acb*/ + do /*0xffc16aec*/ + { + if ( (n0x800000 & *(LzmaCtx + 5)) != 0 ) /*0xffc16ad6*/ + n0x13 = *((_WORD *)LzmaCtx + n0x13 + 1040); /*0xffc16ad8*/ + else + n0x13 = *((_WORD *)LzmaCtx + n0x13 + 21); /*0xffc16ae2*/ + n0x800000 >>= 1; /*0xffc16ae7*/ + } + while ( n0x13 >= 0x13u ); /*0xffc16aec*/ + } + DxeIplDecompressLzma((int)LzmaCtx, *((unsigned __int8 *)LzmaCtx + n0x13 + 4628)); /*0xffc16afb*/ + if ( n0x13 > 2u ) + { + v12 = (unsigned __int16)n0x1FE++; /*0xffc16b6c*/ + *((_BYTE *)LzmaCtx + v12 + 4118) = n0x13 - 2; /*0xffc16b73*/ + } + else + { + if ( n0x13 ) + { + v9 = n0x13 == 1 + ? DxeIplGetDecompressAlgo((int)LzmaCtx, 4u) + 3 + : DxeIplGetDecompressAlgo((int)LzmaCtx, 9u) + 20; + v8 = v9; /*0xffc16b3b*/ + } + else + { + v8 = 1; /*0xffc16b0f*/ + } + for ( i = v8 + 0xFFFF; (i & 0x8000u) == 0; *((_BYTE *)LzmaCtx + n0x1FE_1 + 4118) = 0 ) /*0xffc16b47*/ + { + if ( (unsigned __int16)n0x1FE >= 0x1FEu ) /*0xffc16b51*/ + break; /*0xffc16b51*/ + n0x1FE_1 = (unsigned __int16)n0x1FE; /*0xffc16b53*/ + i += 0xFFFF; /*0xffc16b56*/ + ++n0x1FE; /*0xffc16b5c*/ + } + } + } + while ( (unsigned __int16)n0x1FE < DecompressAlgo ); + if ( (unsigned __int16)n0x1FE != 510 ) /*0xffc16b92*/ + DxeIplSetMem64((char *)LzmaCtx + (unsigned __int16)n0x1FE + 4118, 510 - (unsigned __int16)n0x1FE, 0); /*0xffc16ba0*/ + return DxeIplHuffmanBuildTable((int)LzmaCtx, 0x1FEu, (int)LzmaCtx + 4118, 0xCu, (int)(LzmaCtx + 1165)); /*0xffc16bbc*/ + } + else + { + v3 = DxeIplGetDecompressAlgo((int)LzmaCtx, 9u); /*0xffc16a6b*/ + DxeIplSetMem64((char *)LzmaCtx + 4118, 0x1FEu, 0); /*0xffc16a74*/ + value = (v3 << 16) | v3; /*0xffc16a91*/ + memset32(LzmaCtx + 1165, value, 0x800u); /*0xffc16a93*/ + } + return value; /*0xffc16bc4*/ +} -{"addr":"0xffc160ea","code":"_DWORD *DxeIplDecompressPages(int a1, int a2, int a3, int a4, int a5, int a6)\n{\n int v6; // ecx\n int v7; // edi\n _DWORD *result; // eax\n _DWORD *v9; // esi\n\n v7 = v6; /*0xffc160f2*/\n result = (_DWORD *)DxeIplSetBootMode(2, 72); /*0xffc160f7*/\n v9 = result; /*0xffc160fc*/\n if ( result ) /*0xffc16100*/\n {\n result[2] = dword_FFC18D28; /*0xffc16108*/\n result[3] = dword_FFC18D2C; /*0xffc16111*/\n result[4] = dword_FFC18D30; /*0xffc16119*/\n result[5] = dword_FFC18D34; /*0xffc16121*/\n result[6] = a1; /*0xffc16127*/\n result[7] = a2; /*0xffc1612d*/\n result[8] = a3; /*0xffc16133*/\n result[9] = a4; /*0xffc16139*/\n result[10] = 3; /*0xffc16142*/\n DxeIplSetMem32(result + 11, 4u); /*0xffc16149*/\n DxeIplFvSetError(v9 + 12, v7); /*0xffc16155*/\n v9[16] = a5; /*0xffc1615d*/\n v9[17] = a6; /*0xffc16163*/\n return (_DWORD *)a6; /*0xffc16160*/\n }\n return result; /*0xffc16166*/\n}","refs":[{"addr":"0xffc160b0","name":"DxeIplSetBootMode"},{"addr":"0xffc18d28","name":"dword_FFC18D28"},{"addr":"0xffc18d2c","name":"dword_FFC18D2C"},{"addr":"0xffc18d30","name":"dword_FFC18D30"},{"addr":"0xffc18d34","name":"dword_FFC18D34"},{"addr":"0xffc15328","name":"DxeIplSetMem32"},{"addr":"0xffc162f0","name":"DxeIplFvSetError"}]} +unsigned __int16 __thiscall DxeIplLzmaRangeDecode(int this) +{ + __int16 v2; // ax + __int16 v4; // ax + unsigned int v5; // eax + unsigned __int16 n0x1FE; // di + unsigned int n0x80000; // ecx -{"addr":"0xffc1616a","code":"int DxeIplAllocPages(_DWORD *DxeIplPpi, int BufferSize)\n{\n int Status; // eax\n int FvEntry; // esi\n\n Status = DxeIplSetBootMode(4, BufferSize + 24); /*0xffc16175*/\n FvEntry = Status; /*0xffc1617a*/\n if ( Status ) /*0xffc1617e*/\n {\n DxeIplFvSetError((_DWORD *)(Status + 8), DxeIplPpi); /*0xffc16185*/\n return FvEntry + 24; /*0xffc1618a*/\n }\n return Status; /*0xffc1618d*/\n}","refs":[{"addr":"0xffc160b0","name":"DxeIplSetBootMode"},{"addr":"0xffc162f0","name":"DxeIplFvSetError"}]} + if ( !*(_WORD *)(this + 28) ) /*0xffc16bd4*/ + { + *(_WORD *)(this + 28) = DxeIplGetDecompressAlgo(this, 0x10u); /*0xffc16bec*/ + v2 = DxeIplLzmaDecodeCore1((_DWORD *)this, 0x13u, 5u, 3); /*0xffc16bf0*/ + *(_WORD *)(this + 40) = v2; /*0xffc16bf5*/ + if ( v2 ) /*0xffc16bfe*/ + return 0; /*0xffc16bfe*/ + DxeIplLzmaDecodeCore2((_DWORD *)this); /*0xffc16c06*/ + v4 = DxeIplLzmaDecodeCore1((_DWORD *)this, 0x1Fu, *(unsigned __int8 *)(this + 13364), 0xFFFF); /*0xffc16c19*/ + *(_WORD *)(this + 40) = v4; /*0xffc16c1e*/ + if ( v4 ) /*0xffc16c27*/ + return 0; /*0xffc16c00*/ + } + v5 = *(_DWORD *)(this + 20); /*0xffc16c29*/ + --*(_WORD *)(this + 28); /*0xffc16c31*/ + n0x1FE = *(_WORD *)(this + 2 * (v5 >> 20) + 4660); /*0xffc16c38*/ + if ( n0x1FE >= 0x1FEu ) /*0xffc16c43*/ + { + n0x80000 = 0x80000; /*0xffc16c45*/ + do /*0xffc16c66*/ + { + if ( (n0x80000 & *(_DWORD *)(this + 20)) != 0 ) /*0xffc16c50*/ + n0x1FE = *(_WORD *)(this + 2 *n0x1FE + 2080); /*0xffc16c52*/ + else + n0x1FE = *(_WORD *)(this + 2 *n0x1FE + 42); /*0xffc16c5c*/ + n0x80000 >>= 1; /*0xffc16c61*/ + } + while ( n0x1FE >= 0x1FEu ); /*0xffc16c66*/ + } + DxeIplDecompressLzma(this, *(unsigned __int8 *)(n0x1FE + this + 4118)); /*0xffc16c75*/ + return n0x1FE; /*0xffc16c7d*/ +} -{"addr":"0xffc16191","code":"char *DxeIplAllocPagesBelow4G(_DWORD *DxeIplPpi, char *SourceData, int BufferSize)\n{\n char *Destination; // eax\n\n Destination = (char *)DxeIplAllocPages(DxeIplPpi, BufferSize); /*0xffc16198*/\n if ( Destination ) /*0xffc1619f*/\n return DxeIplFvFreePages(Destination, SourceData, BufferSize); /*0xffc161ab*/\n return Destination; /*0xffc161a1*/\n}","refs":[{"addr":"0xffc1616a","name":"DxeIplAllocPages"},{"addr":"0xffc162d3","name":"DxeIplFvFreePages"}]} +char DxeIplLzmaBitDecode(int i) +{ + int j; // esi + unsigned __int16 n0x100; // cx + unsigned int DecompressAlgo; // eax + unsigned int v4; // edx + int v5; // ebx + unsigned __int16 n0x1F; // di + unsigned int n0x800000; // ecx + unsigned int n0x1F_1; // ebp + unsigned int k; // edx + unsigned int v10; // edi + int v11; // ecx -{"addr":"0xffc161b3","code":"_DWORD *DxeIplFreePages(int a1, int a2, int a3, int a4)\n{\n _DWORD *result; // eax\n _DWORD *v5; // esi\n\n result = (_DWORD *)DxeIplSetBootMode(2, 48); /*0xffc161ba*/\n v5 = result; /*0xffc161bf*/\n if ( result ) /*0xffc161c3*/\n {\n DxeIplSetMem32(result + 2, 0x10u); /*0xffc161cb*/\n v5[7] = a2; /*0xffc161d8*/\n v5[8] = a3; /*0xffc161df*/\n v5[9] = a4; /*0xffc161e8*/\n v5[10] = 4; /*0xffc161ed*/\n v5[6] = a1; /*0xffc161f4*/\n return DxeIplSetMem32(v5 + 11, 4u); /*0xffc161f7*/\n }\n return result; /*0xffc161ff*/\n}","refs":[{"addr":"0xffc160b0","name":"DxeIplSetBootMode"},{"addr":"0xffc15328","name":"DxeIplSetMem32"}]} + for ( j = i; ; i = j ) /*0xffc16c8b*/ + { + n0x100 = DxeIplLzmaRangeDecode(i); /*0xffc16c92*/ + LOBYTE(DecompressAlgo) = 0; /*0xffc16c95*/ + if ( *(_WORD *)(j + 40) ) /*0xffc16c97*/ + break; /*0xffc16c97*/ + LOBYTE(DecompressAlgo) = 0; /*0xffc16ca1*/ + if ( n0x100 >= 0x100u ) /*0xffc16cac*/ + { + v5 = (unsigned __int16)(n0x100 - 253); /*0xffc16cce*/ + n0x1F = *(_WORD *)(j + 2 *HIBYTE(*(_DWORD *)(j + 20)) + 12852); /*0xffc16cd7*/ + if ( n0x1F >= 0x1Fu ) /*0xffc16ce2*/ + { + n0x800000 = 0x800000; /*0xffc16ce4*/ + do /*0xffc16d05*/ + { + if ( (n0x800000 & *(_DWORD *)(j + 20)) != 0 ) /*0xffc16cef*/ + n0x1F = *(_WORD *)(j + 2 *n0x1F + 2080); /*0xffc16cf1*/ + else + n0x1F = *(_WORD *)(j + 2 *n0x1F + 42); /*0xffc16cfb*/ + n0x800000 >>= 1; /*0xffc16d00*/ + } + while ( n0x1F >= 0x1Fu ); /*0xffc16d05*/ + } + n0x1F_1 = n0x1F; /*0xffc16d07*/ + DxeIplDecompressLzma(j, *(unsigned __int8 *)(j + n0x1F + 4628)); /*0xffc16d14*/ + LOBYTE(DecompressAlgo) = 1; /*0xffc16d1b*/ + if ( n0x1F > 1u ) /*0xffc16d1f*/ + { + DecompressAlgo = DxeIplGetDecompressAlgo(j, n0x1F - 1); /*0xffc16d26*/ + n0x1F_1 = DecompressAlgo + (1 << (n0x1F - 1)); /*0xffc16d35*/ + } + for ( k = *(_DWORD *)(j + 8) - n0x1F_1 - 1; ; ++k ) /*0xffc16d41*/ + { + v5 += 0xFFFF; /*0xffc16d5e*/ + if ( (v5 & 0x8000u) != 0 ) /*0xffc16d63*/ + break; /*0xffc16d63*/ + v10 = *(_DWORD *)(j + 8); /*0xffc16d44*/ + if ( v10 >= *(_DWORD *)(j + 36) ) /*0xffc16d4a*/ + return DecompressAlgo; /*0xffc16d4a*/ + if ( k >= *(_DWORD *)(j + 36) ) /*0xffc16d4f*/ + { + *(_WORD *)(j + 40) = -1; /*0xffc16d74*/ + return DecompressAlgo; /*0xffc16d74*/ + } + v11 = *(_DWORD *)(j + 4); /*0xffc16d51*/ + LOBYTE(DecompressAlgo) = *(_BYTE *)(v11 + k); /*0xffc16d54*/ + *(_BYTE *)(v11 + v10) = DecompressAlgo; /*0xffc16d57*/ + ++*(_DWORD *)(j + 8); /*0xffc16d5a*/ + } + DecompressAlgo = *(_DWORD *)(j + 8); /*0xffc16d65*/ + if ( DecompressAlgo >= *(_DWORD *)(j + 36) ) /*0xffc16d6b*/ + return DecompressAlgo; /*0xffc16d6b*/ + } + else + { + v4 = *(_DWORD *)(j + 8); /*0xffc16cae*/ + if ( v4 >= *(_DWORD *)(j + 36) ) /*0xffc16cb4*/ + return DecompressAlgo; /*0xffc16cb4*/ + *(_BYTE *)(v4 + *(_DWORD *)(j + 4)) = n0x100; /*0xffc16cbd*/ + ++*(_DWORD *)(j + 8); /*0xffc16cc0*/ + } + } + return DecompressAlgo; /*0xffc16d78*/ +} -{"addr":"0xffc16201","code":"int __thiscall DxeIplReportStatus(void *this)\n{\n _BYTE v2[2]; // [esp+0h] [ebp-Ch] BYREF\n int v3; // [esp+2h] [ebp-Ah]\n _BYTE *v4; // [esp+8h] [ebp-4h]\n\n v4 = v2; /*0xffc1620a*/\n __sidt(v2); /*0xffc16210*/\n return (*(int ( **)(_DWORD, void *))(**(_DWORD **)(v3 - 4) + 24))(*(_DWORD *)(v3 - 4), this); /*0xffc16222*/\n}"} +int DxeIplLzmaGetProp(_DWORD *src, unsigned int n8, _DWORD *DestSize, _DWORD *SrcSize) +{ + unsigned int n8_1; // eax -{"addr":"0xffc16226","code":"int DxeIplLocatePpiByGuid(int a1, int a2, int a3, int a4)\n{\n _BYTE v5[2]; // [esp+4h] [ebp-Ch] BYREF\n int v6; // [esp+6h] [ebp-Ah]\n _BYTE *v7; // [esp+Ch] [ebp-4h]\n\n v7 = v5; /*0xffc16230*/\n __sidt(v5); /*0xffc16236*/\n return (*(int ( **)(_DWORD, int, int, _DWORD, int))(**(_DWORD **)(v6 - 4) + 32))( /*0xffc1624f*/\n *(_DWORD *)(v6 - 4),\n a1,\n a2,\n 0,\n a4);\n}"} + if ( n8 < 8 ) /*0xffc16d83*/ + return -2147483646; /*0xffc16d83*/ + n8_1 = *src + 8; /*0xffc16d87*/ + if ( n8 < n8_1 || n8_1 < 8 ) /*0xffc16d91*/ + return -2147483646; /*0xffc16da9*/ + *SrcSize = 13368; /*0xffc16d97*/ + *DestSize = src[1]; /*0xffc16da4*/ + return 0; /*0xffc16da8*/ +} -{"addr":"0xffc16254","code":"int DxeIplOpenFv(int i, int a2)\n{\n _BYTE v3[2]; // [esp+4h] [ebp-Ch] BYREF\n int v4; // [esp+6h] [ebp-Ah]\n _BYTE *v5; // [esp+Ch] [ebp-4h]\n\n v5 = v3; /*0xffc1625e*/\n __sidt(v3); /*0xffc16264*/\n return (*(int ( **)(_DWORD, int, int))(**(_DWORD **)(v4 - 4) + 56))(*(_DWORD *)(v4 - 4), i, a2); /*0xffc16278*/\n}"} +unsigned int DxeIplLzmaDecodeProp(unsigned __int8 *src, unsigned __int8 *a2, unsigned __int8 **buf, int n2) +{ + unsigned __int8 *v4; // edi + unsigned __int8 *v5; // ebx + unsigned __int8 *v7; // ebp -{"addr":"0xffc1627d","code":"int __usercall DxeIplReadFvSection@(int a1@, int p_DxeHandle)\n{\n _BYTE v3[2]; // [esp+0h] [ebp-Ch] BYREF\n int v4; // [esp+2h] [ebp-Ah]\n _BYTE *v5; // [esp+8h] [ebp-4h]\n\n v5 = v3; /*0xffc16286*/\n __sidt(v3); /*0xffc1628c*/\n return (*(int ( **)(_DWORD, int, int, int))(**(_DWORD **)(v4 - 4) + 60))( /*0xffc162a4*/\n *(_DWORD *)(v4 - 4),\n 5,\n a1,\n p_DxeHandle);\n}"} + v4 = (unsigned __int8 *)(*src + ((src[1] + ((src[2] + (src[3] << 8)) << 8)) << 8)); /*0xffc16ddb*/ + v5 = (unsigned __int8 *)(src[4] + ((src[5] + ((src[6] + (src[7] << 8)) << 8)) << 8)); /*0xffc16df3*/ + if ( !v5 ) /*0xffc16df5*/ + return 0; /*0xffc16df7*/ + v7 = src + 8; /*0xffc16dff*/ + DxeIplSetMem64(buf, 0x3438u, 0); /*0xffc16e0a*/ + if ( n2 == 1 ) /*0xffc16e19*/ + { + *((_BYTE *)buf + 13364) = 4; /*0xffc16e29*/ + } + else if ( n2 == 2 ) /*0xffc16e1e*/ + { + *((_BYTE *)buf + 13364) = 5; /*0xffc16e20*/ + } + *buf = v7; /*0xffc16e39*/ + buf[1] = a2; /*0xffc16e3b*/ + buf[8] = v4; /*0xffc16e3e*/ + buf[9] = v5; /*0xffc16e41*/ + DxeIplDecompressLzma((int)buf, 0x20u); /*0xffc16e44*/ + DxeIplLzmaBitDecode((int)buf); /*0xffc16e4b*/ + return *((_WORD *)buf + 20) != 0 ? 0x80000002 : 0; +} -{"addr":"0xffc162a8","code":"int __usercall DxeIplFvGetFileSize@(int FfsHeader@, int p_FileSize)\n{\n _BYTE v3[2]; // [esp+0h] [ebp-Ch] BYREF\n int v4; // [esp+2h] [ebp-Ah]\n _BYTE *v5; // [esp+8h] [ebp-4h]\n\n v5 = v3; /*0xffc162b1*/\n __sidt(v3); /*0xffc162b7*/\n return (*(int ( **)(_DWORD, int, int, int))(**(_DWORD **)(v4 - 4) + 72))( /*0xffc162cf*/\n *(_DWORD *)(v4 - 4),\n 4,\n FfsHeader,\n p_FileSize);\n}"} +int DxeIplPpiNotifyCallback(int FfsHeader, _DWORD *DestSize, _DWORD *SrcSize, _WORD *PropFlags) +{ + int DataOffset; // eax + int DataSize; // edx -{"addr":"0xffc162d3","code":"char *DxeIplFvFreePages(char *dst, char *src, unsigned int n0x14)\n{\n if ( !n0x14 || dst == src ) /*0xffc162df*/\n return dst; /*0xffc162da*/\n else\n return DxeIplCopyMem(dst, src, n0x14); /*0xffc162e7*/\n}","refs":[{"addr":"0xffc152e8","name":"DxeIplCopyMem"}]} + if ( !FfsHeader ) /*0xffc16e70*/ + return -2147483646; /*0xffc16e70*/ + if ( (*(_DWORD *)FfsHeader & 0xFFFFFF) != 0xFFFFFF ) /*0xffc16e89*/ + { + if ( DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 4)) ) /*0xffc16ead*/ + { + *PropFlags = *(_WORD *)(FfsHeader + 22); /*0xffc16ebd*/ + DataOffset = *(unsigned __int16 *)(FfsHeader + 20); /*0xffc16ec2*/ + DataSize = *(_DWORD *)FfsHeader & 0xFFFFFF; /*0xffc16ec6*/ + return DxeIplLzmaGetProp((_DWORD *)(DataOffset + FfsHeader), DataSize - DataOffset, DestSize, SrcSize); /*0xffc16ec6*/ + } + return -2147483646; /*0xffc16e77*/ + } + if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 8)) ) /*0xffc16e95*/ + return -2147483646; /*0xffc16e95*/ + *PropFlags = *(_WORD *)(FfsHeader + 26); /*0xffc16e9e*/ + DataOffset = *(unsigned __int16 *)(FfsHeader + 24); /*0xffc16ea1*/ + DataSize = *(_DWORD *)(FfsHeader + 4); /*0xffc16ea5*/ + return DxeIplLzmaGetProp((_DWORD *)(DataOffset + FfsHeader), DataSize - DataOffset, DestSize, SrcSize); /*0xffc16eda*/ +} -{"addr":"0xffc162f0","code":"_DWORD *DxeIplFvSetError(_DWORD *a1, _DWORD *DxeIplPpi)\n{\n *a1 = *DxeIplPpi; /*0xffc162f2*/\n a1[1] = DxeIplPpi[1]; /*0xffc162f7*/\n a1[2] = DxeIplPpi[2]; /*0xffc162fd*/\n a1[3] = DxeIplPpi[3]; /*0xffc16303*/\n return a1; /*0xffc16308*/\n}"} +unsigned int DxeIplPeiEndCallback( + int FfsHeader, + unsigned __int8 **SrcData, + unsigned __int8 **DestData, + _DWORD *DestSize) +{ + int DataOffset; // ecx -{"addr":"0xffc16309","code":"bool DxeIplFvIsAddrValid(_DWORD *a1, _DWORD *a2)\n{\n return *a1 == *a2 && a1[1] == a2[1] && a1[2] == a2[2] && a1[3] == a2[3]; /*0xffc16329*/\n}"} + if ( (*(_DWORD *)FfsHeader & 0xFFFFFF) == 0xFFFFFF ) /*0xffc16efb*/ + { + if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 8)) ) /*0xffc16f00*/ + return -2147483646; /*0xffc16f0e*/ + *DestSize = 0; /*0xffc16f13*/ + DataOffset = *(unsigned __int16 *)(FfsHeader + 24); /*0xffc16f16*/ + } + else + { + if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 4)) ) /*0xffc16f26*/ + return -2147483646; /*0xffc16f26*/ + *DestSize = 0; /*0xffc16f2b*/ + DataOffset = *(unsigned __int16 *)(FfsHeader + 20); /*0xffc16f2e*/ + } + return DxeIplLzmaDecodeProp((unsigned __int8 *)(FfsHeader + DataOffset), *SrcData, DestData, 2); /*0xffc16f45*/ +} -{"addr":"0xffc1632d","code":"int DxeIplAllocatePages(int Buffer, int FfsHeader)\n{\n int FileSize; // [esp+0h] [ebp-8h] BYREF\n\n if ( FfsHeader && DxeIplFvGetFileSize(FfsHeader, (int)&FileSize) >= 0 ) /*0xffc16346*/\n return FileSize; /*0xffc16348*/\n else\n return 0; /*0xffc16336*/\n}","refs":[{"addr":"0xffc162a8","name":"DxeIplFvGetFileSize"}]} +int DxeIplReportStatusCode(char n2, int n50532357) +{ + int v3; // eax + _BYTE v4[2]; // [esp+4h] [ebp-Ch] BYREF + int v5; // [esp+6h] [ebp-Ah] + _BYTE *v6; // [esp+Ch] [ebp-4h] -{"addr":"0xffc1634f","code":"int __thiscall DxeIplAllocateZeroPages(void *PeiServices)\n{\n _BYTE Idtr[2]; // [esp+4h] [ebp-10h] BYREF\n int GdtBase; // [esp+6h] [ebp-Eh]\n _DWORD Memory[2]; // [esp+Ch] [ebp-8h] BYREF\n\n Memory[1] = Idtr; /*0xffc16359*/\n __sidt(Idtr); /*0xffc1635f*/\n if ( (*(int ( **)(_DWORD, void *, _DWORD *))(**(_DWORD **)(GdtBase - 4) + 76))( /*0xffc16379*/\n *(_DWORD *)(GdtBase - 4),\n PeiServices,\n Memory) >= 0 )\n return Memory[0]; /*0xffc1637f*/\n else\n return 0; /*0xffc1637b*/\n}"} + if ( n2 != 2 && n2 != 3 ) /*0xffc16f60*/ + return -2147483645; /*0xffc16f62*/ + v6 = v4; /*0xffc16f6c*/ + __sidt(v4); /*0xffc16f72*/ + v3 = (*(int ( **)(_DWORD, char, int, _DWORD, _DWORD *, _DWORD))(**(_DWORD **)(v5 - 4) + 88))( /*0xffc16f89*/ + *(_DWORD *)(v5 - 4), + n2, + n50532357, + 0, + dword_FFC18DB8, + 0); + return v3 != -1610612734 ? v3 : 0; +} -{"addr":"0xffc16386","code":"void *__thiscall DxeIplGetPeiBootMode(void *this)\n{\n void *this_1; // [esp+0h] [ebp-4h] BYREF\n\n this_1 = this; /*0xffc16389*/\n DxeIplLocatePpiByGuid((int)&unk_FFC18DE8, 0, (int)this, (int)&this_1); /*0xffc16396*/\n return this_1; /*0xffc163a2*/\n}","refs":[{"addr":"0xffc16226","name":"DxeIplLocatePpiByGuid"},{"addr":"0xffc18de8","name":"unk_FFC18DE8"}]} +_WORD *DxeIplGetFvFromHob(_DWORD *a1, _DWORD *a2) +{ + _WORD *i; // eax + _WORD *v5; // eax + _WORD *i_1; // eax + _WORD *result; // eax + void *buf; // eax + void *buf_1; // eax -{"addr":"0xffc163a4","code":"int __thiscall DxeIplFvOpenDevice(_DWORD **p_this)\n{\n _WORD *i_1; // eax\n _WORD *i; // eax\n _DWORD *v4; // ecx\n _WORD *i_2; // esi\n int v6; // eax\n int v8; // eax\n int v9; // eax\n\n i_1 = (_WORD *)DxeIplGetPeiServices(); /*0xffc163b0*/\n for ( i = DxeIplLocatePpi(4, i_1); ; i = DxeIplLocatePpi(4, (_WORD *)((char *)i_2 + (unsigned __int16)i_2[1])) ) /*0xffc163ba*/\n {\n i_2 = i; /*0xffc163ee*/\n if ( !i ) /*0xffc163f2*/\n {\n v6 = DxeIplAllocPages((int)dword_FFC18DB8, 404); /*0xffc163fb*/\n v4 = (_DWORD *)v6; /*0xffc16400*/\n if ( !v6 ) /*0xffc16404*/\n {\n *p_this = 0; /*0xffc16406*/\n return -2147483639; /*0xffc1640d*/\n }\n *(_DWORD *)(v6 + 4) = 0; /*0xffc16419*/\n v8 = v6 + 20; /*0xffc1641d*/\n *v4 = 1229473104; /*0xffc16420*/\n goto LABEL_11; /*0xffc16420*/\n }\n if ( DxeIplFvIsAddrValid((_DWORD *)i + 2, dword_FFC18DB8) ) /*0xffc163d0*/\n {\n v4 = i_2 + 12; /*0xffc163d9*/\n if ( *((_DWORD *)i_2 + 6) == 1229473104 ) /*0xffc163de*/\n break; /*0xffc163de*/\n }\n }\n v8 = (int)(i_2 + 22); /*0xffc1640f*/\n if ( *((_WORD **)i_2 + 8) == i_2 + 22 ) /*0xffc16415*/\n goto LABEL_12; /*0xffc16415*/\nLABEL_11:\n v4[2] = v8; /*0xffc16422*/\n v9 = v8 + 256; /*0xffc16425*/\n v4[3] = v9; /*0xffc1642a*/\n v4[4] = v9 + 64; /*0xffc16430*/\nLABEL_12:\n *p_this = v4; /*0xffc16433*/\n return 0; /*0xffc16437*/\n}","refs":[{"addr":"0xffc16008","name":"DxeIplGetPeiServices"},{"addr":"0xffc16033","name":"DxeIplLocatePpi"},{"addr":"0xffc1616a","name":"DxeIplAllocPages"},{"addr":"0xffc18db8","name":"dword_FFC18DB8"},{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"}]} + i = (_WORD *)DxeIplGetPeiServices(); /*0xffc16fab*/ + v5 = DxeIplGetBootModeGuid((int)&unk_FFC18DA8, i); /*0xffc16fb9*/ + if ( v5 ) /*0xffc16fc0*/ + { + *a1 = v5 + 12; /*0xffc16fc5*/ + i_1 = (_WORD *)DxeIplGetPeiServices(); /*0xffc16fc7*/ + result = DxeIplGetBootModeGuid((int)&unk_FFC18CF8, i_1) + 12; /*0xffc16fd8*/ + } + else + { + buf = (void *)DxeIplAllocPages((int)&unk_FFC18DA8, 40008); /*0xffc16fe6*/ + *a1 = buf; /*0xffc16fed*/ + *a1 = DxeIplSetMem32(buf, 0x9C48u); /*0xffc16ff4*/ + buf_1 = (void *)DxeIplAllocPages((int)&unk_FFC18CF8, 4000); /*0xffc17002*/ + *a2 = buf_1; /*0xffc17009*/ + result = DxeIplSetMem32(buf_1, 0xFA0u); /*0xffc1700b*/ + } + *a2 = result; /*0xffc17014*/ + return result; /*0xffc17013*/ +} -{"addr":"0xffc1643f","code":"int DxeIplInstallPpi(char *DxeIplPpi, int (*DxeIplPeiEndCallback)(), int (*DxeIplPpiNotifyCallback)())\n{\n int Status; // eax\n _DWORD *FvDevice; // esi\n unsigned int Index; // edi\n unsigned int NumEntries; // ebx\n _DWORD *FvEntry; // ecx\n char *PpiData; // edx\n int v9; // ecx\n _DWORD *DeviceHandle; // [esp+14h] [ebp-4h] BYREF\n\n Status = DxeIplFvOpenDevice(&DeviceHandle); /*0xffc16457*/\n if ( Status >= 0 ) /*0xffc1645e*/\n {\n FvDevice = DeviceHandle; /*0xffc16464*/\n Index = 0; /*0xffc16468*/\n NumEntries = DeviceHandle[1]; /*0xffc1646a*/\n if ( NumEntries ) /*0xffc1646f*/\n {\n FvEntry = (_DWORD *)DeviceHandle[2]; /*0xffc16471*/\n PpiData = DxeIplPpi; /*0xffc16474*/\n while ( !DxeIplFvIsAddrValid(FvEntry, PpiData) ) /*0xffc1647f*/\n {\n ++Index; /*0xffc16481*/\n FvEntry = (_DWORD *)(v9 + 16); /*0xffc16482*/\n if ( Index >= NumEntries ) /*0xffc16487*/\n goto LABEL_6; /*0xffc16487*/\n }\n *(_DWORD *)(FvDevice[3] + 4 *Index) = DxeIplPpiNotifyCallback; /*0xffc1649f*/\n *(_DWORD *)(FvDevice[4] + 4 *Index) = DxeIplPeiEndCallback; /*0xffc164a5*/\n }\n else\n {\nLABEL_6:\n if ( NumEntries >= 0x10 ) /*0xffc1648c*/\n return -2147483639; /*0xffc16493*/\n DxeIplFvSetError((_DWORD *)(FvDevice[2] + 16 *NumEntries), DxeIplPpi); /*0xffc164b8*/\n *(_DWORD *)(FvDevice[3] + 4 *FvDevice[1]) = DxeIplPpiNotifyCallback; /*0xffc164c8*/\n *(_DWORD *)(FvDevice[4] + 4 *FvDevice[1]++) = DxeIplPeiEndCallback; /*0xffc164d5*/\n DxeIplAllocPagesBelow4G(DxeIplPpi, DxeIplPpi, 16); /*0xffc164df*/\n }\n return 0; /*0xffc164e5*/\n }\n return Status; /*0xffc164e7*/\n}","refs":[{"addr":"0xffc163a4","name":"DxeIplFvOpenDevice"},{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc162f0","name":"DxeIplFvSetError"},{"addr":"0xffc16191","name":"DxeIplAllocPagesBelow4G"}]} +int __thiscall DxeIplGetPeiProtocol(_DWORD *this) +{ + int v2; // esi + int v3; // ebx -{"addr":"0xffc164ee","code":"int DxeIplDecompress(_DWORD *a1, int a2, int a3, int a4)\n{\n int result; // eax\n _DWORD *this_1; // ebx\n unsigned int v7; // esi\n _DWORD *v8; // edx\n _DWORD *v9; // ecx\n int v10; // ecx\n _DWORD *this; // [esp+10h] [ebp-8h] BYREF\n int v12; // [esp+14h] [ebp-4h]\n\n v12 = a2; /*0xffc164fc*/\n result = DxeIplFvOpenDevice(&this); /*0xffc16504*/\n if ( result >= 0 )\n {\n this_1 = this; /*0xffc16512*/\n v7 = 0; /*0xffc16523*/\n v8 = (_DWORD *)((char *)a1 + ((*a1 & 0xFFFFFF) != 0xFFFFFF ? 0xFFFFFFFC : 0) + 8);\n if ( this[1] ) /*0xffc1652b*/\n {\n v9 = (_DWORD *)this[2]; /*0xffc16530*/\n while ( !DxeIplFvIsAddrValid(v9, v8) ) /*0xffc1653a*/\n {\n ++v7; /*0xffc1653c*/\n v9 = (_DWORD *)(v10 + 16); /*0xffc1653d*/\n if ( v7 >= this_1[1] ) /*0xffc16543*/\n return -2147483645; /*0xffc16543*/\n }\n return (*(int ( **)(_DWORD *, int, int, int))(this_1[3] + 4 *v7))(a1, v12, a3, a4); /*0xffc1655f*/\n }\n else\n {\n return -2147483645; /*0xffc16545*/\n }\n }\n return result; /*0xffc1654a*/\n}","refs":[{"addr":"0xffc163a4","name":"DxeIplFvOpenDevice"},{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"}]} + v2 = 0; /*0xffc17030*/ + if ( *this ) /*0xffc17032*/ + { + while ( 1 ) /*0xffc1703c*/ + { + v3 = *this - v2 - 1; /*0xffc1703c*/ + if ( !*((_QWORD *)this + 5 *v3 + 5) && !*((_QWORD *)this + 5 *v3 + 1) && !DxeIplLzmaGetBit(7) && !DxeIplLzmaGetBit(7) ) /*0xffc17071*/ + break; /*0xffc17071*/ + if ( (unsigned int)++v2 >= *this ) /*0xffc1707e*/ + return v2; /*0xffc1707e*/ + } + return v3; /*0xffc17086*/ + } + return v2; /*0xffc1708a*/ +} -{"addr":"0xffc16567","code":"int DxeIplDecompressLzma(int a1, unsigned __int16 n8_1)\n{\n unsigned __int16 n8; // di\n char n8_2; // cl\n __int64 v5; // rax\n int v6; // eax\n int v7; // eax\n int v8; // ecx\n int result; // eax\n unsigned int v10; // [esp+Ch] [ebp-10h]\n\n n8 = n8_1; /*0xffc16574*/\n v10 = *(_DWORD *)(a1 + 20); /*0xffc16582*/\n n8_2 = n8_1; /*0xffc16585*/\n LODWORD(v5) = 0; /*0xffc16588*/\n HIDWORD(v5) = v10; /*0xffc1658a*/\n if ( (n8_2 & 0x20) == 0 ) /*0xffc16590*/\n v5 = v10; /*0xffc16592*/\n *(_DWORD *)(a1 + 20) = v5 << (n8_2 & 0x1F); /*0xffc1659f*/\n if ( n8 > *(_WORD *)(a1 + 16) ) /*0xffc165a6*/\n {\n do /*0xffc1660a*/\n {\n n8 -= *(_WORD *)(a1 + 16); /*0xffc165ab*/\n v6 = 0; /*0xffc165c2*/\n if ( (n8 & 0x20) == 0 ) /*0xffc165ca*/\n v6 = *(_DWORD *)(a1 + 24); /*0xffc165cc*/\n *(_DWORD *)(a1 + 20) |= v6 << n8; /*0xffc165d6*/\n v7 = *(_DWORD *)(a1 + 32); /*0xffc165d9*/\n if ( v7 ) /*0xffc165e1*/\n {\n v8 = *(_DWORD *)(a1 + 12); /*0xffc165e3*/\n *(_DWORD *)(a1 + 24) = 0; /*0xffc165e7*/\n *(_DWORD *)(a1 + 32) = v7 - 1; /*0xffc165eb*/\n *(_DWORD *)(a1 + 24) = *(unsigned __int8 *)(*(_DWORD *)a1 + v8); /*0xffc165f4*/\n *(_DWORD *)(a1 + 12) = v8 + 1; /*0xffc165fa*/\n }\n else\n {\n *(_DWORD *)(a1 + 24) = 0; /*0xffc165ff*/\n }\n *(_WORD *)(a1 + 16) = 8; /*0xffc16603*/\n }\n while ( n8 > 8u ); /*0xffc1660a*/\n }\n *(_WORD *)(a1 + 16) -= n8; /*0xffc1660c*/\n result = *(_DWORD *)(a1 + 24) >> *(_BYTE *)(a1 + 16); /*0xffc16616*/\n *(_DWORD *)(a1 + 20) |= result; /*0xffc16618*/\n return result; /*0xffc1661b*/\n}"} +int DxeIplDebugPrintGuid(int Guid, char *DxeIpl) +{ + _DWORD *v2; // esi + int v3; // ebp + int v4; // edi + int v5; // ebx + char *DxeIpl_2; // eax + int v7; // eax + _DWORD *v9; // [esp+14h] [ebp-Ch] BYREF + char *DxeIpl_1; // [esp+18h] [ebp-8h] + int v11; // [esp+1Ch] [ebp-4h] BYREF -{"addr":"0xffc16622","code":"int DxeIplGetDecompressAlgo(int a1, unsigned __int16 n8)\n{\n int v2; // esi\n\n v2 = *(_DWORD *)(a1 + 20) >> (32 - n8); /*0xffc1662d*/\n DxeIplDecompressLzma(a1, n8); /*0xffc16631*/\n return v2; /*0xffc16638*/\n}","refs":[{"addr":"0xffc16567","name":"DxeIplDecompressLzma"}]} + DxeIpl_1 = DxeIpl; /*0xffc17095*/ + DxeIplGetFvFromHob(&v9, &v11); /*0xffc170a2*/ + v2 = v9; /*0xffc170a7*/ + v3 = *v9; /*0xffc170ab*/ + if ( *v9 >= 0x3E8u ) /*0xffc170b3*/ + return -2147483639; /*0xffc170b5*/ + v5 = 10 *v3; /*0xffc170bc*/ + *v9 = v3 + 1; /*0xffc170c2*/ + v4 = 0; /*0xffc170c4*/ + DxeIpl_2 = DxeIpl_1; /*0xffc170c6*/ + v2[v5 + 2] = 0; /*0xffc170ca*/ + v2[v5 + 3] = 0; /*0xffc170ce*/ + if ( DxeIpl_2 ) /*0xffc170d4*/ + DxeIplLzmaDecodeSymbol(DxeIpl_2); /*0xffc170dd*/ + v7 = v11; /*0xffc170e4*/ + v2[v5 + 10] = 0; /*0xffc170e8*/ + v2[v5 + 11] = 0; /*0xffc170ec*/ + *(_DWORD *)(v7 + 4 *v3) = 0; /*0xffc170f0*/ + *(_QWORD *)&v2[v5 + 8] = __rdtsc(); /*0xffc170f5*/ + return v4; /*0xffc170ff*/ +} -{"addr":"0xffc1663a","code":"int DxeIplHuffmanBuildTable(\n int HuffCtx,\n unsigned __int16 NumSymbols,\n int CodeLen,\n unsigned __int16 MaxBits,\n int InitBits)\n{\n unsigned __int16 v5; // si\n unsigned __int8 n0x10; // al\n int n15; // ecx\n int v8; // edx\n int n16; // esi\n __int16 v10; // ax\n __int16 v11; // ax\n unsigned __int16 MaxBits_1; // bp\n int MaxBits_3; // esi\n char v14; // bl\n char MaxBits_2; // al\n int MaxBits_6; // edx\n __int16 v17; // ax\n int MaxBits_4; // edx\n __int16 v19; // ax\n unsigned __int16 v20; // ax\n int v21; // edx\n int v22; // eax\n unsigned int v23; // eax\n int NumSymbols_3; // esi\n int InitBits_1; // edi\n int CodeLen_1; // ecx\n unsigned int MaxBits_5; // edx\n unsigned int v28; // ecx\n unsigned __int16 v29; // bx\n unsigned __int16 v30; // di\n unsigned __int16 v31; // dx\n int v32; // ebx\n _WORD *v33; // ecx\n int NumSymbols_2; // ebp\n unsigned __int16 v35; // si\n int n0x3FB; // edx\n int v37; // ecx\n int v39; // eax\n unsigned __int16 v42; // [esp+14h] [ebp-64h]\n int NumSymbols_1; // [esp+18h] [ebp-60h]\n int NumSymbols_4; // [esp+1Ch] [ebp-5Ch]\n unsigned __int16 v45; // [esp+20h] [ebp-58h]\n unsigned __int16 v46; // [esp+28h] [ebp-50h]\n int v47; // [esp+2Ch] [ebp-4Ch]\n _WORD buf[18]; // [esp+30h] [ebp-48h] BYREF\n _DWORD v49[8]; // [esp+54h] [ebp-24h]\n __int16 v50; // [esp+76h] [ebp-2h]\n\n memset(buf, 0, 34); /*0xffc16652*/\n v5 = 0; /*0xffc16656*/\n if ( NumSymbols ) /*0xffc1665f*/\n {\n do /*0xffc16668*/\n {\n n0x10 = *(_BYTE *)(v5 + CodeLen); /*0xffc16668*/\n if ( n0x10 > 0x10u ) /*0xffc1666d*/\n return 0xFFFF; /*0xffc1666d*/\n ++buf[n0x10]; /*0xffc16676*/\n }\n while ( ++v5 < NumSymbols ); /*0xffc16668*/\n }\n n15 = 15; /*0xffc16681*/\n v8 = 0; /*0xffc16686*/\n v49[0] = 0; /*0xffc1668b*/\n n16 = 16; /*0xffc1668f*/\n do /*0xffc166aa*/\n {\n v10 = buf[++v8]; /*0xffc16691*/\n v11 = *(_WORD *)((char *)v49 + v8 *2) + (v10 << n15--); /*0xffc1669c*/\n *(_WORD *)((char *)v49 + v8 *2 + 2) = v11; /*0xffc166a2*/\n --n16; /*0xffc166a7*/\n }\n while ( n16 ); /*0xffc166aa*/\n if ( v50 ) /*0xffc166b1*/\n return 0xFFFF; /*0xffc1687f*/\n MaxBits_1 = MaxBits; /*0xffc166bc*/\n MaxBits_3 = 1; /*0xffc166c6*/\n v14 = 16 - MaxBits; /*0xffc166c8*/\n buf[0] = 0; /*0xffc166cd*/\n if ( !MaxBits ) /*0xffc166d5*/\n goto LABEL_45; /*0xffc166d5*/\n MaxBits_2 = MaxBits; /*0xffc166d7*/\n do /*0xffc166ff*/\n {\n MaxBits_6 = (unsigned __int16)MaxBits_3; /*0xffc166de*/\n *((_WORD *)v49 + (unsigned __int16)MaxBits_3) >>= v14; /*0xffc166e4*/\n v17 = 1 << (MaxBits_2 - MaxBits_3++); /*0xffc166ef*/\n buf[MaxBits_6] = v17; /*0xffc166f3*/\n MaxBits_2 = MaxBits; /*0xffc166f8*/\n }\n while ( (unsigned __int16)MaxBits_3 <= MaxBits ); /*0xffc166ff*/\n if ( (unsigned __int16)MaxBits_3 <= 0x10u ) /*0xffc16707*/\n {\nLABEL_45:\n do /*0xffc16721*/\n {\n MaxBits_4 = (unsigned __int16)MaxBits_3; /*0xffc1670c*/\n v19 = 1 << (16 - MaxBits_3++); /*0xffc16715*/\n buf[MaxBits_4] = v19; /*0xffc16719*/\n }\n while ( (unsigned __int16)MaxBits_3 <= 0x10u ); /*0xffc16721*/\n MaxBits_1 = MaxBits; /*0xffc16723*/\n }\n v20 = *((_WORD *)v49 + MaxBits_1 + 1) >> v14; /*0xffc16735*/\n v21 = v20; /*0xffc16738*/\n if ( v20 ) /*0xffc1673e*/\n {\n v22 = (unsigned __int16)(1 << MaxBits_1); /*0xffc16747*/\n if ( (unsigned __int16)v21 < (unsigned __int16)v22 ) /*0xffc1674d*/\n {\n v23 = 2 * (v22 - v21); /*0xffc16753*/\n if ( v23 ) /*0xffc16755*/\n DxeIplSetMem16((_WORD *)(InitBits + 2 *v21), v23 >> 1, 0); /*0xffc16767*/\n }\n }\n NumSymbols_1 = NumSymbols; /*0xffc16774*/\n NumSymbols_3 = 0; /*0xffc16787*/\n v42 = 1 << (15 - MaxBits_1); /*0xffc1678c*/\n v45 = 1 << MaxBits_1; /*0xffc16793*/\n NumSymbols_4 = 0; /*0xffc16799*/\n if ( NumSymbols ) /*0xffc167a2*/\n {\n InitBits_1 = InitBits; /*0xffc167a8*/\n CodeLen_1 = CodeLen; /*0xffc167b1*/\n do /*0xffc168e2*/\n {\n MaxBits_5 = *(unsigned __int8 *)((unsigned __int16)NumSymbols_3 + CodeLen_1); /*0xffc167bf*/\n if ( *(_BYTE *)((unsigned __int16)NumSymbols_3 + CodeLen_1) && MaxBits_5 < 0x11 ) /*0xffc167cf*/\n {\n v47 = 2 *MaxBits_5; /*0xffc167d9*/\n v28 = *((unsigned __int16 *)v49 + MaxBits_5); /*0xffc167dd*/\n v29 = v28 + buf[MaxBits_5]; /*0xffc167ea*/\n v46 = v29; /*0xffc167ed*/\n if ( (unsigned __int16)MaxBits_5 <= MaxBits_1 ) /*0xffc167f4*/\n {\n while ( (unsigned __int16)v28 < v29 ) /*0xffc16893*/\n {\n if ( (unsigned __int16)v28 >= v45 ) /*0xffc16886*/\n return 0xFFFF; /*0xffc168f2*/\n v39 = (unsigned __int16)v28; /*0xffc16888*/\n LOWORD(v28) = v28 + 1; /*0xffc1688b*/\n *(_WORD *)(InitBits_1 + 2 *v39) = NumSymbols_3; /*0xffc1688c*/\n }\n }\n else\n {\n v30 = *((_WORD *)v49 + MaxBits_5); /*0xffc167fa*/\n v31 = MaxBits_5 - MaxBits_1; /*0xffc167fc*/\n v32 = v31; /*0xffc1680d*/\n v33 = (_WORD *)(InitBits + 2 * (v28 >> (16 - MaxBits))); /*0xffc16810*/\n if ( v31 ) /*0xffc16816*/\n {\n NumSymbols_2 = NumSymbols_1; /*0xffc1681c*/\n v35 = v42; /*0xffc16820*/\n do /*0xffc168a5*/\n {\n if ( !*v33 && (unsigned __int16)NumSymbols_2 < 0x3FBu ) /*0xffc16833*/\n {\n *(_WORD *)(HuffCtx + 2 * (unsigned __int16)NumSymbols_2 + 42) = 0; /*0xffc1683e*/\n *(_WORD *)(HuffCtx + 2 * (unsigned __int16)NumSymbols_2 + 2080) = 0; /*0xffc16843*/\n v35 = v42; /*0xffc1684b*/\n *v33 = NumSymbols_2++; /*0xffc1684f*/\n }\n n0x3FB = (unsigned __int16)*v33; /*0xffc16853*/\n if ( (unsigned __int16)n0x3FB < 0x3FBu ) /*0xffc1685e*/\n {\n v37 = HuffCtx + 2 *n0x3FB; /*0xffc1686d*/\n if ( (v30 & v35) != 0 ) /*0xffc16870*/\n v33 = (_WORD *)(v37 + 2080); /*0xffc16872*/\n else\n v33 = (_WORD *)(v37 + 42); /*0xffc16897*/\n }\n v32 += 0xFFFF; /*0xffc1689a*/\n v30 *= 2; /*0xffc168a0*/\n }\n while ( (_WORD)v32 ); /*0xffc168a5*/\n NumSymbols_3 = NumSymbols_4; /*0xffc168ab*/\n NumSymbols_1 = NumSymbols_2; /*0xffc168af*/\n MaxBits_1 = MaxBits; /*0xffc168b3*/\n }\n v29 = v46; /*0xffc168ba*/\n InitBits_1 = InitBits; /*0xffc168be*/\n *v33 = NumSymbols_3; /*0xffc168c5*/\n }\n CodeLen_1 = CodeLen; /*0xffc168cc*/\n *(_WORD *)((char *)v49 + v47) = v29; /*0xffc168d3*/\n }\n NumSymbols_4 = ++NumSymbols_3; /*0xffc168d9*/\n }\n while ( (unsigned __int16)NumSymbols_3 < NumSymbols ); /*0xffc168e2*/\n }\n return 0; /*0xffc168eb*/\n}","refs":[{"addr":"0xffc15428","name":"DxeIplSetMem16"}]} +int DxeIplGetBootModeFromHob() +{ + unsigned __int64 v2; // rax + unsigned int v3; // ebx + unsigned int v4; // edi + unsigned int *v5; // esi + unsigned int v6; // eax + int v8; // eax + int v9; // [esp+Ch] [ebp-8h] BYREF + unsigned int *v10; // [esp+10h] [ebp-4h] BYREF -{"addr":"0xffc168f9","code":"int DxeIplLzmaDecodeCore1(\n _DWORD *LzmaCtx,\n unsigned __int16 count,\n unsigned __int16 NumBits,\n __int16 ShiftBits)\n{\n unsigned __int16 DecompressAlgo; // di\n unsigned __int16 v7; // ax\n int n0x1F; // esi\n int n7; // eax\n bool v11; // cf\n unsigned int n0x10000000; // ecx\n unsigned __int16 n3; // dx\n int v14; // eax\n __int16 i; // cx\n int v16; // eax\n int n0x1F_1; // eax\n char n7_1; // [esp+14h] [ebp-8h]\n\n DecompressAlgo = DxeIplGetDecompressAlgo((int)LzmaCtx, NumBits); /*0xffc16911*/\n if ( !DecompressAlgo ) /*0xffc16917*/\n {\n v7 = DxeIplGetDecompressAlgo((int)LzmaCtx, NumBits); /*0xffc1691f*/\n memset32(LzmaCtx + 3213, (v7 << 16) | v7, 0x80u); /*0xffc16939*/\n DxeIplSetMem64(LzmaCtx + 1157, count, 0); /*0xffc16948*/\n return 0; /*0xffc16952*/\n }\n n0x1F = 0; /*0xffc16959*/\n while ( (unsigned __int16)n0x1F < 0x1Fu ) /*0xffc1696f*/\n {\n n7 = LzmaCtx[5] >> 29; /*0xffc16978*/\n n7_1 = n7; /*0xffc1697b*/\n v11 = (unsigned __int16)n7 < 7u; /*0xffc1697f*/\n if ( (_WORD)n7 == 7 ) /*0xffc16982*/\n {\n n0x10000000 = 0x10000000; /*0xffc16984*/\n if ( (LzmaCtx[5] & 0x10000000) == 0 ) /*0xffc1698c*/\n goto LABEL_11; /*0xffc1698c*/\n do /*0xffc16994*/\n {\n n0x10000000 >>= 1; /*0xffc1698e*/\n LOWORD(n7) = n7 + 1; /*0xffc16990*/\n }\n while ( (n0x10000000 & LzmaCtx[5]) != 0 ); /*0xffc16994*/\n n7_1 = n7; /*0xffc16996*/\n v11 = (unsigned __int16)n7 < 7u; /*0xffc1699a*/\n }\n if ( !v11 ) /*0xffc1699d*/\n {\nLABEL_11:\n n3 = n7 - 3; /*0xffc169a4*/\n goto LABEL_12; /*0xffc169a7*/\n }\n n3 = 3; /*0xffc169a1*/\nLABEL_12:\n DxeIplDecompressLzma((int)LzmaCtx, n3); /*0xffc169aa*/\n v14 = (unsigned __int16)n0x1F++; /*0xffc169b5*/\n *((_BYTE *)LzmaCtx + v14 + 4628) = n7_1; /*0xffc169b9*/\n if ( (_WORD)n0x1F == ShiftBits ) /*0xffc169c5*/\n {\n for ( i = DxeIplGetDecompressAlgo((int)LzmaCtx, 2u) - 1; i >= 0 && (unsigned __int16)n0x1F < 0x1Fu; --i ) /*0xffc169d2*/\n {\n v16 = (unsigned __int16)n0x1F++; /*0xffc169dc*/\n *((_BYTE *)LzmaCtx + v16 + 4628) = 0; /*0xffc169e6*/\n }\n }\n if ( (unsigned __int16)n0x1F >= DecompressAlgo ) /*0xffc169f9*/\n break; /*0xffc169f9*/\n }\n while ( (unsigned __int16)n0x1F < count && (unsigned __int16)n0x1F < 0x1Fu ) /*0xffc16a0b*/\n {\n n0x1F_1 = (unsigned __int16)n0x1F; /*0xffc16a0d*/\n LOWORD(n0x1F) = n0x1F + 1; /*0xffc16a10*/\n *((_BYTE *)LzmaCtx + n0x1F_1 + 4628) = 0; /*0xffc16a11*/\n }\n return DxeIplHuffmanBuildTable((int)LzmaCtx, count, (int)(LzmaCtx + 1157), 8u, (int)(LzmaCtx + 3213)); /*0xffc16a3a*/\n}","refs":[{"addr":"0xffc16622","name":"DxeIplGetDecompressAlgo"},{"addr":"0xffc15348","name":"DxeIplSetMem64"},{"addr":"0xffc16567","name":"DxeIplDecompressLzma"},{"addr":"0xffc1663a","name":"DxeIplHuffmanBuildTable"}]} + v2 = __rdtsc(); /*0xffc17111*/ + v3 = HIDWORD(v2); /*0xffc17113*/ + v4 = v2; /*0xffc1711b*/ + DxeIplGetFvFromHob(&v10, &v9); /*0xffc1711d*/ + v5 = v10; /*0xffc17125*/ + v6 = DxeIplGetPeiProtocol(v10); /*0xffc1712b*/ + if ( v6 >= *v5 ) /*0xffc17135*/ + return -2147483634; /*0xffc17137*/ + v8 = 10 * (v6 + 1); /*0xffc1713f*/ + v5[v8] = v4; /*0xffc17142*/ + v5[v8 + 1] = v3; /*0xffc17145*/ + return 0; /*0xffc1714b*/ +} -{"addr":"0xffc16a42","code":"int __thiscall DxeIplLzmaDecodeCore2(_DWORD *LzmaCtx)\n{\n unsigned __int16 DecompressAlgo; // bp\n unsigned __int16 v3; // si\n int value; // eax\n int n0x1FE; // esi\n unsigned __int16 n0x13; // bx\n unsigned int n0x800000; // ecx\n int v8; // ebx\n unsigned __int16 v9; // ax\n int i; // ebx\n int n0x1FE_1; // eax\n int v12; // eax\n\n DecompressAlgo = DxeIplGetDecompressAlgo((int)LzmaCtx, 9u); /*0xffc16a51*/\n if ( DecompressAlgo )\n {\n n0x1FE = 0; /*0xffc16a9c*/\n do\n {\n if ( (unsigned __int16)n0x1FE >= 0x1FEu ) /*0xffc16ab2*/\n break; /*0xffc16ab2*/\n n0x13 = *((_WORD *)LzmaCtx + HIBYTE(*(LzmaCtx + 5)) + 6426); /*0xffc16abe*/\n if ( n0x13 >= 0x13u ) /*0xffc16ac9*/\n {\n n0x800000 = 0x800000; /*0xffc16acb*/\n do /*0xffc16aec*/\n {\n if ( (n0x800000 & *(LzmaCtx + 5)) != 0 ) /*0xffc16ad6*/\n n0x13 = *((_WORD *)LzmaCtx + n0x13 + 1040); /*0xffc16ad8*/\n else\n n0x13 = *((_WORD *)LzmaCtx + n0x13 + 21); /*0xffc16ae2*/\n n0x800000 >>= 1; /*0xffc16ae7*/\n }\n while ( n0x13 >= 0x13u ); /*0xffc16aec*/\n }\n DxeIplDecompressLzma((int)LzmaCtx, *((unsigned __int8 *)LzmaCtx + n0x13 + 4628)); /*0xffc16afb*/\n if ( n0x13 > 2u )\n {\n v12 = (unsigned __int16)n0x1FE++; /*0xffc16b6c*/\n *((_BYTE *)LzmaCtx + v12 + 4118) = n0x13 - 2; /*0xffc16b73*/\n }\n else\n {\n if ( n0x13 )\n {\n v9 = n0x13 == 1\n ? DxeIplGetDecompressAlgo((int)LzmaCtx, 4u) + 3\n : DxeIplGetDecompressAlgo((int)LzmaCtx, 9u) + 20;\n v8 = v9; /*0xffc16b3b*/\n }\n else\n {\n v8 = 1; /*0xffc16b0f*/\n }\n for ( i = v8 + 0xFFFF; (i & 0x8000u) == 0; *((_BYTE *)LzmaCtx + n0x1FE_1 + 4118) = 0 ) /*0xffc16b47*/\n {\n if ( (unsigned __int16)n0x1FE >= 0x1FEu ) /*0xffc16b51*/\n break; /*0xffc16b51*/\n n0x1FE_1 = (unsigned __int16)n0x1FE; /*0xffc16b53*/\n i += 0xFFFF; /*0xffc16b56*/\n ++n0x1FE; /*0xffc16b5c*/\n }\n }\n }\n while ( (unsigned __int16)n0x1FE < DecompressAlgo );\n if ( (unsigned __int16)n0x1FE != 510 ) /*0xffc16b92*/\n DxeIplSetMem64((char *)LzmaCtx + (unsigned __int16)n0x1FE + 4118, 510 - (unsigned __int16)n0x1FE, 0); /*0xffc16ba0*/\n return DxeIplHuffmanBuildTable((int)LzmaCtx, 0x1FEu, (int)LzmaCtx + 4118, 0xCu, (int)(LzmaCtx + 1165)); /*0xffc16bbc*/\n }\n else\n {\n v3 = DxeIplGetDecompressAlgo((int)LzmaCtx, 9u); /*0xffc16a6b*/\n DxeIplSetMem64((char *)LzmaCtx + 4118, 0x1FEu, 0); /*0xffc16a74*/\n value = (v3 << 16) | v3; /*0xffc16a91*/\n memset32(LzmaCtx + 1165, value, 0x800u); /*0xffc16a93*/\n }\n return value; /*0xffc16bc4*/\n}","refs":[{"addr":"0xffc16622","name":"DxeIplGetDecompressAlgo"},{"addr":"0xffc16567","name":"DxeIplDecompressLzma"},{"addr":"0xffc15348","name":"DxeIplSetMem64"},{"addr":"0xffc1663a","name":"DxeIplHuffmanBuildTable"}]} +int DxeIplDxeIplPpiNotify(int a1, _DWORD *a2, _DWORD *a3, _WORD *a4) +{ + int v5; // ecx -{"addr":"0xffc16bca","code":"unsigned __int16 __thiscall DxeIplLzmaRangeDecode(int this)\n{\n __int16 v2; // ax\n __int16 v4; // ax\n unsigned int v5; // eax\n unsigned __int16 n0x1FE; // di\n unsigned int n0x80000; // ecx\n\n if ( !*(_WORD *)(this + 28) ) /*0xffc16bd4*/\n {\n *(_WORD *)(this + 28) = DxeIplGetDecompressAlgo(this, 0x10u); /*0xffc16bec*/\n v2 = DxeIplLzmaDecodeCore1((_DWORD *)this, 0x13u, 5u, 3); /*0xffc16bf0*/\n *(_WORD *)(this + 40) = v2; /*0xffc16bf5*/\n if ( v2 ) /*0xffc16bfe*/\n return 0; /*0xffc16bfe*/\n DxeIplLzmaDecodeCore2((_DWORD *)this); /*0xffc16c06*/\n v4 = DxeIplLzmaDecodeCore1((_DWORD *)this, 0x1Fu, *(unsigned __int8 *)(this + 13364), 0xFFFF); /*0xffc16c19*/\n *(_WORD *)(this + 40) = v4; /*0xffc16c1e*/\n if ( v4 ) /*0xffc16c27*/\n return 0; /*0xffc16c00*/\n }\n v5 = *(_DWORD *)(this + 20); /*0xffc16c29*/\n --*(_WORD *)(this + 28); /*0xffc16c31*/\n n0x1FE = *(_WORD *)(this + 2 * (v5 >> 20) + 4660); /*0xffc16c38*/\n if ( n0x1FE >= 0x1FEu ) /*0xffc16c43*/\n {\n n0x80000 = 0x80000; /*0xffc16c45*/\n do /*0xffc16c66*/\n {\n if ( (n0x80000 & *(_DWORD *)(this + 20)) != 0 ) /*0xffc16c50*/\n n0x1FE = *(_WORD *)(this + 2 *n0x1FE + 2080); /*0xffc16c52*/\n else\n n0x1FE = *(_WORD *)(this + 2 *n0x1FE + 42); /*0xffc16c5c*/\n n0x80000 >>= 1; /*0xffc16c61*/\n }\n while ( n0x1FE >= 0x1FEu ); /*0xffc16c66*/\n }\n DxeIplDecompressLzma(this, *(unsigned __int8 *)(n0x1FE + this + 4118)); /*0xffc16c75*/\n return n0x1FE; /*0xffc16c7d*/\n}","refs":[{"addr":"0xffc16622","name":"DxeIplGetDecompressAlgo"},{"addr":"0xffc168f9","name":"DxeIplLzmaDecodeCore1"},{"addr":"0xffc16a42","name":"DxeIplLzmaDecodeCore2"},{"addr":"0xffc16567","name":"DxeIplDecompressLzma"}]} + if ( (*(_DWORD *)a1 & 0xFFFFFF) == 0xFFFFFF ) /*0xffc1716d*/ + { + if ( !DxeIplFvIsAddrValid(dword_FFC18D58, (_DWORD *)(a1 + 8)) ) /*0xffc17172*/ + return -2147483646; /*0xffc17180*/ + *a4 = *(_WORD *)(a1 + 26); /*0xffc17189*/ + v5 = *(unsigned __int16 *)(a1 + 24); /*0xffc1718c*/ + } + else + { + if ( !DxeIplFvIsAddrValid(dword_FFC18D58, (_DWORD *)(a1 + 4)) ) /*0xffc1719c*/ + return -2147483646; /*0xffc1719c*/ + *a4 = *(_WORD *)(a1 + 22); /*0xffc171a5*/ + v5 = *(unsigned __int16 *)(a1 + 20); /*0xffc171a8*/ + } + *a2 = DxeIplLzmaInitState(a1 + v5); /*0xffc171b6*/ + *a3 = 0x10000; /*0xffc171bb*/ + return 0; /*0xffc171c3*/ +} -{"addr":"0xffc16c81","code":"char DxeIplLzmaBitDecode(int i)\n{\n int j; // esi\n unsigned __int16 n0x100; // cx\n unsigned int DecompressAlgo; // eax\n unsigned int v4; // edx\n int v5; // ebx\n unsigned __int16 n0x1F; // di\n unsigned int n0x800000; // ecx\n unsigned int n0x1F_1; // ebp\n unsigned int k; // edx\n unsigned int v10; // edi\n int v11; // ecx\n\n for ( j = i; ; i = j ) /*0xffc16c8b*/\n {\n n0x100 = DxeIplLzmaRangeDecode(i); /*0xffc16c92*/\n LOBYTE(DecompressAlgo) = 0; /*0xffc16c95*/\n if ( *(_WORD *)(j + 40) ) /*0xffc16c97*/\n break; /*0xffc16c97*/\n LOBYTE(DecompressAlgo) = 0; /*0xffc16ca1*/\n if ( n0x100 >= 0x100u ) /*0xffc16cac*/\n {\n v5 = (unsigned __int16)(n0x100 - 253); /*0xffc16cce*/\n n0x1F = *(_WORD *)(j + 2 *HIBYTE(*(_DWORD *)(j + 20)) + 12852); /*0xffc16cd7*/\n if ( n0x1F >= 0x1Fu ) /*0xffc16ce2*/\n {\n n0x800000 = 0x800000; /*0xffc16ce4*/\n do /*0xffc16d05*/\n {\n if ( (n0x800000 & *(_DWORD *)(j + 20)) != 0 ) /*0xffc16cef*/\n n0x1F = *(_WORD *)(j + 2 *n0x1F + 2080); /*0xffc16cf1*/\n else\n n0x1F = *(_WORD *)(j + 2 *n0x1F + 42); /*0xffc16cfb*/\n n0x800000 >>= 1; /*0xffc16d00*/\n }\n while ( n0x1F >= 0x1Fu ); /*0xffc16d05*/\n }\n n0x1F_1 = n0x1F; /*0xffc16d07*/\n DxeIplDecompressLzma(j, *(unsigned __int8 *)(j + n0x1F + 4628)); /*0xffc16d14*/\n LOBYTE(DecompressAlgo) = 1; /*0xffc16d1b*/\n if ( n0x1F > 1u ) /*0xffc16d1f*/\n {\n DecompressAlgo = DxeIplGetDecompressAlgo(j, n0x1F - 1); /*0xffc16d26*/\n n0x1F_1 = DecompressAlgo + (1 << (n0x1F - 1)); /*0xffc16d35*/\n }\n for ( k = *(_DWORD *)(j + 8) - n0x1F_1 - 1; ; ++k ) /*0xffc16d41*/\n {\n v5 += 0xFFFF; /*0xffc16d5e*/\n if ( (v5 & 0x8000u) != 0 ) /*0xffc16d63*/\n break; /*0xffc16d63*/\n v10 = *(_DWORD *)(j + 8); /*0xffc16d44*/\n if ( v10 >= *(_DWORD *)(j + 36) ) /*0xffc16d4a*/\n return DecompressAlgo; /*0xffc16d4a*/\n if ( k >= *(_DWORD *)(j + 36) ) /*0xffc16d4f*/\n {\n *(_WORD *)(j + 40) = -1; /*0xffc16d74*/\n return DecompressAlgo; /*0xffc16d74*/\n }\n v11 = *(_DWORD *)(j + 4); /*0xffc16d51*/\n LOBYTE(DecompressAlgo) = *(_BYTE *)(v11 + k); /*0xffc16d54*/\n *(_BYTE *)(v11 + v10) = DecompressAlgo; /*0xffc16d57*/\n ++*(_DWORD *)(j + 8); /*0xffc16d5a*/\n }\n DecompressAlgo = *(_DWORD *)(j + 8); /*0xffc16d65*/\n if ( DecompressAlgo >= *(_DWORD *)(j + 36) ) /*0xffc16d6b*/\n return DecompressAlgo; /*0xffc16d6b*/\n }\n else\n {\n v4 = *(_DWORD *)(j + 8); /*0xffc16cae*/\n if ( v4 >= *(_DWORD *)(j + 36) ) /*0xffc16cb4*/\n return DecompressAlgo; /*0xffc16cb4*/\n *(_BYTE *)(v4 + *(_DWORD *)(j + 4)) = n0x100; /*0xffc16cbd*/\n ++*(_DWORD *)(j + 8); /*0xffc16cc0*/\n }\n }\n return DecompressAlgo; /*0xffc16d78*/\n}","refs":[{"addr":"0xffc16bca","name":"DxeIplLzmaRangeDecode"},{"addr":"0xffc16567","name":"DxeIplDecompressLzma"},{"addr":"0xffc16622","name":"DxeIplGetDecompressAlgo"}]} +int DxeIplEndOfPeiNotify(_DWORD *a1, _DWORD *a2, int a3, _DWORD *a4) +{ + if ( (*a1 & 0xFFFFFF) == 0xFFFFFF ) /*0xffc171e3*/ + { + if ( !DxeIplFvIsAddrValid(dword_FFC18D58, a1 + 2) ) /*0xffc171e8*/ + return -2147483646; /*0xffc171f6*/ + *a4 = 0; /*0xffc171fb*/ + } + else + { + if ( !DxeIplFvIsAddrValid(dword_FFC18D58, a1 + 1) ) /*0xffc17211*/ + return -2147483646; /*0xffc17211*/ + *a4 = 0; /*0xffc17216*/ + } + return DxeIplLzmaInitRange(*a2, a3); /*0xffc17234*/ +} -{"addr":"0xffc16d80","code":"int DxeIplLzmaGetProp(_DWORD *src, unsigned int n8, _DWORD *DestSize, _DWORD *SrcSize)\n{\n unsigned int n8_1; // eax\n\n if ( n8 < 8 ) /*0xffc16d83*/\n return -2147483646; /*0xffc16d83*/\n n8_1 = *src + 8; /*0xffc16d87*/\n if ( n8 < n8_1 || n8_1 < 8 ) /*0xffc16d91*/\n return -2147483646; /*0xffc16da9*/\n *SrcSize = 13368; /*0xffc16d97*/\n *DestSize = src[1]; /*0xffc16da4*/\n return 0; /*0xffc16da8*/\n}"} +int DxeIplGetPpiPtr(int a1, unsigned int a2) +{ + unsigned int v2; // esi + int result; // eax -{"addr":"0xffc16daf","code":"unsigned int DxeIplLzmaDecodeProp(unsigned __int8 *src, unsigned __int8 *a2, unsigned __int8 **buf, int n2)\n{\n unsigned __int8 *v4; // edi\n unsigned __int8 *v5; // ebx\n unsigned __int8 *v7; // ebp\n\n v4 = (unsigned __int8 *)(*src + ((src[1] + ((src[2] + (src[3] << 8)) << 8)) << 8)); /*0xffc16ddb*/\n v5 = (unsigned __int8 *)(src[4] + ((src[5] + ((src[6] + (src[7] << 8)) << 8)) << 8)); /*0xffc16df3*/\n if ( !v5 ) /*0xffc16df5*/\n return 0; /*0xffc16df7*/\n v7 = src + 8; /*0xffc16dff*/\n DxeIplSetMem64(buf, 0x3438u, 0); /*0xffc16e0a*/\n if ( n2 == 1 ) /*0xffc16e19*/\n {\n *((_BYTE *)buf + 13364) = 4; /*0xffc16e29*/\n }\n else if ( n2 == 2 ) /*0xffc16e1e*/\n {\n *((_BYTE *)buf + 13364) = 5; /*0xffc16e20*/\n }\n *buf = v7; /*0xffc16e39*/\n buf[1] = a2; /*0xffc16e3b*/\n buf[8] = v4; /*0xffc16e3e*/\n buf[9] = v5; /*0xffc16e41*/\n DxeIplDecompressLzma((int)buf, 0x20u); /*0xffc16e44*/\n DxeIplLzmaBitDecode((int)buf); /*0xffc16e4b*/\n return *((_WORD *)buf + 20) != 0 ? 0x80000002 : 0;\n}","refs":[{"addr":"0xffc15348","name":"DxeIplSetMem64"},{"addr":"0xffc16567","name":"DxeIplDecompressLzma"},{"addr":"0xffc16c81","name":"DxeIplLzmaBitDecode"}]} + v2 = *(_DWORD *)(a1 + 12); /*0xffc17244*/ + if ( v2 < a2 ) /*0xffc17249*/ + return 0; /*0xffc1725b*/ + result = *(_DWORD *)(a1 + 8); /*0xffc1724b*/ + *(_DWORD *)(a1 + 12) = v2 - a2; /*0xffc17250*/ + *(_DWORD *)(a1 + 8) = result + a2; /*0xffc17256*/ + return result; /*0xffc1725d*/ +} -{"addr":"0xffc16e63","code":"int DxeIplPpiNotifyCallback(int FfsHeader, _DWORD *DestSize, _DWORD *SrcSize, _WORD *PropFlags)\n{\n int DataOffset; // eax\n int DataSize; // edx\n\n if ( !FfsHeader ) /*0xffc16e70*/\n return -2147483646; /*0xffc16e70*/\n if ( (*(_DWORD *)FfsHeader & 0xFFFFFF) != 0xFFFFFF ) /*0xffc16e89*/\n {\n if ( DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 4)) ) /*0xffc16ead*/\n {\n *PropFlags = *(_WORD *)(FfsHeader + 22); /*0xffc16ebd*/\n DataOffset = *(unsigned __int16 *)(FfsHeader + 20); /*0xffc16ec2*/\n DataSize = *(_DWORD *)FfsHeader & 0xFFFFFF; /*0xffc16ec6*/\n return DxeIplLzmaGetProp((_DWORD *)(DataOffset + FfsHeader), DataSize - DataOffset, DestSize, SrcSize); /*0xffc16ec6*/\n }\n return -2147483646; /*0xffc16e77*/\n }\n if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 8)) ) /*0xffc16e95*/\n return -2147483646; /*0xffc16e95*/\n *PropFlags = *(_WORD *)(FfsHeader + 26); /*0xffc16e9e*/\n DataOffset = *(unsigned __int16 *)(FfsHeader + 24); /*0xffc16ea1*/\n DataSize = *(_DWORD *)(FfsHeader + 4); /*0xffc16ea5*/\n return DxeIplLzmaGetProp((_DWORD *)(DataOffset + FfsHeader), DataSize - DataOffset, DestSize, SrcSize); /*0xffc16eda*/\n}","refs":[{"addr":"0xffc16d80","name":"DxeIplLzmaGetProp"},{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc18d18","name":"FvDeviceHandle"}]} +void nullsub_2() +{ + ; /*0xffc17260*/ +} -{"addr":"0xffc16ee0","code":"unsigned int DxeIplPeiEndCallback(\n int FfsHeader,\n unsigned __int8 **SrcData,\n unsigned __int8 **DestData,\n _DWORD *DestSize)\n{\n int DataOffset; // ecx\n\n if ( (*(_DWORD *)FfsHeader & 0xFFFFFF) == 0xFFFFFF ) /*0xffc16efb*/\n {\n if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 8)) ) /*0xffc16f00*/\n return -2147483646; /*0xffc16f0e*/\n *DestSize = 0; /*0xffc16f13*/\n DataOffset = *(unsigned __int16 *)(FfsHeader + 24); /*0xffc16f16*/\n }\n else\n {\n if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 4)) ) /*0xffc16f26*/\n return -2147483646; /*0xffc16f26*/\n *DestSize = 0; /*0xffc16f2b*/\n DataOffset = *(unsigned __int16 *)(FfsHeader + 20); /*0xffc16f2e*/\n }\n return DxeIplLzmaDecodeProp((unsigned __int8 *)(FfsHeader + DataOffset), *SrcData, DestData, 2); /*0xffc16f45*/\n}","refs":[{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc18d18","name":"FvDeviceHandle"},{"addr":"0xffc16daf","name":"DxeIplLzmaDecodeProp"}]} +int __thiscall DxeIplLzmaInitState(unsigned __int8 *this) +{ + int i; // edi + __int64 v2; // rax + __int64 v4; // [esp+Ch] [ebp-8h] -{"addr":"0xffc16f4a","code":"int DxeIplReportStatusCode(char n2, int n50532357)\n{\n int v3; // eax\n _BYTE v4[2]; // [esp+4h] [ebp-Ch] BYREF\n int v5; // [esp+6h] [ebp-Ah]\n _BYTE *v6; // [esp+Ch] [ebp-4h]\n\n if ( n2 != 2 && n2 != 3 ) /*0xffc16f60*/\n return -2147483645; /*0xffc16f62*/\n v6 = v4; /*0xffc16f6c*/\n __sidt(v4); /*0xffc16f72*/\n v3 = (*(int ( **)(_DWORD, char, int, _DWORD, _DWORD *, _DWORD))(**(_DWORD **)(v5 - 4) + 88))( /*0xffc16f89*/\n *(_DWORD *)(v5 - 4),\n n2,\n n50532357,\n 0,\n dword_FFC18DB8,\n 0);\n return v3 != -1610612734 ? v3 : 0;\n}","refs":[{"addr":"0xffc18db8","name":"dword_FFC18DB8"}]} + v4 = 0; /*0xffc17266*/ + for ( i = 12; i >= 5; --i ) /*0xffc17275*/ + { + v2 = (v4 << 8) + *(this + i); /*0xffc17295*/ + v4 = v2; /*0xffc1729a*/ + } + return v2; /*0xffc172a5*/ +} -{"addr":"0xffc16fa2","code":"_WORD *DxeIplGetFvFromHob(_DWORD *a1, _DWORD *a2)\n{\n _WORD *i; // eax\n _WORD *v5; // eax\n _WORD *i_1; // eax\n _WORD *result; // eax\n void *buf; // eax\n void *buf_1; // eax\n\n i = (_WORD *)DxeIplGetPeiServices(); /*0xffc16fab*/\n v5 = DxeIplGetBootModeGuid((int)&unk_FFC18DA8, i); /*0xffc16fb9*/\n if ( v5 ) /*0xffc16fc0*/\n {\n *a1 = v5 + 12; /*0xffc16fc5*/\n i_1 = (_WORD *)DxeIplGetPeiServices(); /*0xffc16fc7*/\n result = DxeIplGetBootModeGuid((int)&unk_FFC18CF8, i_1) + 12; /*0xffc16fd8*/\n }\n else\n {\n buf = (void *)DxeIplAllocPages((int)&unk_FFC18DA8, 40008); /*0xffc16fe6*/\n *a1 = buf; /*0xffc16fed*/\n *a1 = DxeIplSetMem32(buf, 0x9C48u); /*0xffc16ff4*/\n buf_1 = (void *)DxeIplAllocPages((int)&unk_FFC18CF8, 4000); /*0xffc17002*/\n *a2 = buf_1; /*0xffc17009*/\n result = DxeIplSetMem32(buf_1, 0xFA0u); /*0xffc1700b*/\n }\n *a2 = result; /*0xffc17014*/\n return result; /*0xffc17013*/\n}","refs":[{"addr":"0xffc16008","name":"DxeIplGetPeiServices"},{"addr":"0xffc16056","name":"DxeIplGetBootModeGuid"},{"addr":"0xffc18da8","name":"unk_FFC18DA8"},{"addr":"0xffc18cf8","name":"unk_FFC18CF8"},{"addr":"0xffc1616a","name":"DxeIplAllocPages"},{"addr":"0xffc15328","name":"DxeIplSetMem32"}]} +unsigned int DxeIplLzmaInitRange(unsigned __int8 *a1, int a2, int a3, int a4) +{ + int v6; // ecx + _DWORD v8[4]; // [esp+8h] [ebp-18h] BYREF + int v9; // [esp+18h] [ebp-8h] BYREF + int v10; // [esp+1Ch] [ebp-4h] BYREF -{"addr":"0xffc1701b","code":"int __thiscall DxeIplGetPeiProtocol(_DWORD *this)\n{\n int v2; // esi\n int v3; // ebx\n\n v2 = 0; /*0xffc17030*/\n if ( *this ) /*0xffc17032*/\n {\n while ( 1 ) /*0xffc1703c*/\n {\n v3 = *this - v2 - 1; /*0xffc1703c*/\n if ( !*((_QWORD *)this + 5 *v3 + 5) && !*((_QWORD *)this + 5 *v3 + 1) && !DxeIplLzmaGetBit(7) && !DxeIplLzmaGetBit(7) ) /*0xffc17071*/\n break; /*0xffc17071*/\n if ( (unsigned int)++v2 >= *this ) /*0xffc1707e*/\n return v2; /*0xffc1707e*/\n }\n return v3; /*0xffc17086*/\n }\n return v2; /*0xffc1708a*/\n}","refs":[{"addr":"0xffc188f5","name":"DxeIplLzmaGetBit"}]} + v8[0] = DxeIplGetPpiPtr; /*0xffc172b9*/ + v8[1] = nullsub_2; /*0xffc172c2*/ + v8[2] = a4; /*0xffc172c9*/ + v8[3] = 0x10000; /*0xffc172cc*/ + v10 = DxeIplLzmaInitState(a1); /*0xffc172d8*/ + a4 = a2 - 13; /*0xffc172e1*/ + return DxeIplDecodeData(a3, (unsigned int *)&v10, a1 + 13, (unsigned int *)&a4, (int)a1, v6, v6, &v9, (int)v8) != 0 + ? 0x80000002 + : 0; +} -{"addr":"0xffc1708f","code":"int DxeIplDebugPrintGuid(int Guid, char *DxeIpl)\n{\n _DWORD *v2; // esi\n int v3; // ebp\n int v4; // edi\n int v5; // ebx\n char *DxeIpl_2; // eax\n int v7; // eax\n _DWORD *v9; // [esp+14h] [ebp-Ch] BYREF\n char *DxeIpl_1; // [esp+18h] [ebp-8h]\n int v11; // [esp+1Ch] [ebp-4h] BYREF\n\n DxeIpl_1 = DxeIpl; /*0xffc17095*/\n DxeIplGetFvFromHob(&v9, &v11); /*0xffc170a2*/\n v2 = v9; /*0xffc170a7*/\n v3 = *v9; /*0xffc170ab*/\n if ( *v9 >= 0x3E8u ) /*0xffc170b3*/\n return -2147483639; /*0xffc170b5*/\n v5 = 10 *v3; /*0xffc170bc*/\n *v9 = v3 + 1; /*0xffc170c2*/\n v4 = 0; /*0xffc170c4*/\n DxeIpl_2 = DxeIpl_1; /*0xffc170c6*/\n v2[v5 + 2] = 0; /*0xffc170ca*/\n v2[v5 + 3] = 0; /*0xffc170ce*/\n if ( DxeIpl_2 ) /*0xffc170d4*/\n DxeIplLzmaDecodeSymbol(DxeIpl_2); /*0xffc170dd*/\n v7 = v11; /*0xffc170e4*/\n v2[v5 + 10] = 0; /*0xffc170e8*/\n v2[v5 + 11] = 0; /*0xffc170ec*/\n *(_DWORD *)(v7 + 4 *v3) = 0; /*0xffc170f0*/\n *(_QWORD *)&v2[v5 + 8] = __rdtsc(); /*0xffc170f5*/\n return v4; /*0xffc170ff*/\n}","refs":[{"addr":"0xffc16fa2","name":"DxeIplGetFvFromHob"},{"addr":"0xffc18962","name":"DxeIplLzmaDecodeSymbol"}]} +char DxeIplLzmaDecodeLiteral(_DWORD *StreamCtx, unsigned int n0x112) +{ + unsigned int n0x112_2; // edi + unsigned int v4; // edx + int v5; // ebp + unsigned int n0x112_1; // esi + unsigned int v7; // ebx + int v9; // [esp+8h] [ebp-4h] -{"addr":"0xffc17107","code":"int DxeIplGetBootModeFromHob()\n{\n unsigned __int64 v2; // rax\n unsigned int v3; // ebx\n unsigned int v4; // edi\n unsigned int *v5; // esi\n unsigned int v6; // eax\n int v8; // eax\n int v9; // [esp+Ch] [ebp-8h] BYREF\n unsigned int *v10; // [esp+10h] [ebp-4h] BYREF\n\n v2 = __rdtsc(); /*0xffc17111*/\n v3 = HIDWORD(v2); /*0xffc17113*/\n v4 = v2; /*0xffc1711b*/\n DxeIplGetFvFromHob(&v10, &v9); /*0xffc1711d*/\n v5 = v10; /*0xffc17125*/\n v6 = DxeIplGetPeiProtocol(v10); /*0xffc1712b*/\n if ( v6 >= *v5 ) /*0xffc17135*/\n return -2147483634; /*0xffc17137*/\n v8 = 10 * (v6 + 1); /*0xffc1713f*/\n v5[v8] = v4; /*0xffc17142*/\n v5[v8 + 1] = v3; /*0xffc17145*/\n return 0; /*0xffc1714b*/\n}","refs":[{"addr":"0xffc16fa2","name":"DxeIplGetFvFromHob"},{"addr":"0xffc1701b","name":"DxeIplGetPeiProtocol"}]} + n0x112_2 = StreamCtx[18]; /*0xffc17e2c*/ + if ( n0x112_2 && n0x112_2 < 0x112 ) + { + v4 = StreamCtx[9]; /*0xffc17e3d*/ + n0x112 -= v4; /*0xffc17e40*/ + v5 = StreamCtx[5]; /*0xffc17e47*/ + n0x112_1 = StreamCtx[18]; /*0xffc17e4b*/ + v9 = StreamCtx[10]; /*0xffc17e4d*/ + v7 = StreamCtx[14]; /*0xffc17e51*/ + if ( n0x112 < n0x112_2 ) /*0xffc17e5a*/ + n0x112_1 = n0x112; /*0xffc17e5c*/ + if ( !StreamCtx[12] ) /*0xffc17e5e*/ + { + n0x112 = StreamCtx[3] - StreamCtx[11]; /*0xffc17e69*/ + if ( n0x112 <= n0x112_1 ) /*0xffc17e6e*/ + StreamCtx[12] = StreamCtx[3]; /*0xffc17e70*/ + } + StreamCtx[11] += n0x112_1; /*0xffc17e77*/ + for ( StreamCtx[18] = n0x112_2 - n0x112_1; n0x112_1; --n0x112_1 ) + { + LOBYTE(n0x112) = *(_BYTE *)(v4 + (v4 < v7 ? v9 : 0) - v7 + v5); + *(_BYTE *)(v4 + v5) = n0x112; /*0xffc17e94*/ + ++v4; /*0xffc17e97*/ + } + StreamCtx[9] = v4; /*0xffc17e9f*/ + } + return n0x112; /*0xffc17ea3*/ +} -{"addr":"0xffc17152","code":"int DxeIplDxeIplPpiNotify(int a1, _DWORD *a2, _DWORD *a3, _WORD *a4)\n{\n int v5; // ecx\n\n if ( (*(_DWORD *)a1 & 0xFFFFFF) == 0xFFFFFF ) /*0xffc1716d*/\n {\n if ( !DxeIplFvIsAddrValid(dword_FFC18D58, (_DWORD *)(a1 + 8)) ) /*0xffc17172*/\n return -2147483646; /*0xffc17180*/\n *a4 = *(_WORD *)(a1 + 26); /*0xffc17189*/\n v5 = *(unsigned __int16 *)(a1 + 24); /*0xffc1718c*/\n }\n else\n {\n if ( !DxeIplFvIsAddrValid(dword_FFC18D58, (_DWORD *)(a1 + 4)) ) /*0xffc1719c*/\n return -2147483646; /*0xffc1719c*/\n *a4 = *(_WORD *)(a1 + 22); /*0xffc171a5*/\n v5 = *(unsigned __int16 *)(a1 + 20); /*0xffc171a8*/\n }\n *a2 = DxeIplLzmaInitState(a1 + v5); /*0xffc171b6*/\n *a3 = 0x10000; /*0xffc171bb*/\n return 0; /*0xffc171c3*/\n}","refs":[{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc18d58","name":"DxeIplPpi"},{"addr":"0xffc17261","name":"DxeIplLzmaInitState"}]} +int DxeIplLzmaDecodeMatch(int *StreamCtx, unsigned int n0x112, unsigned int src) +{ + unsigned int n0x112_1; // edx + int v6; // ebx + unsigned int v7; // ecx + int result; // eax + unsigned int v9; // eax -{"addr":"0xffc171c8","code":"int DxeIplEndOfPeiNotify(_DWORD *a1, _DWORD *a2, int a3, _DWORD *a4)\n{\n if ( (*a1 & 0xFFFFFF) == 0xFFFFFF ) /*0xffc171e3*/\n {\n if ( !DxeIplFvIsAddrValid(dword_FFC18D58, a1 + 2) ) /*0xffc171e8*/\n return -2147483646; /*0xffc171f6*/\n *a4 = 0; /*0xffc171fb*/\n }\n else\n {\n if ( !DxeIplFvIsAddrValid(dword_FFC18D58, a1 + 1) ) /*0xffc17211*/\n return -2147483646; /*0xffc17211*/\n *a4 = 0; /*0xffc17216*/\n }\n return DxeIplLzmaInitRange(*a2, a3); /*0xffc17234*/\n}","refs":[{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc18d58","name":"DxeIplPpi"},{"addr":"0xffc172ac","name":"DxeIplLzmaInitRange"}]} + while ( 1 ) /*0xffc17eb7*/ + { + n0x112_1 = n0x112; /*0xffc17eb7*/ + if ( !StreamCtx[12] ) /*0xffc17eb3*/ + { + v6 = StreamCtx[9]; /*0xffc17ec0*/ + v7 = StreamCtx[3] - StreamCtx[11]; /*0xffc17ec5*/ + if ( n0x112 - v6 > v7 ) /*0xffc17eca*/ + n0x112_1 = v6 + v7; /*0xffc17ecc*/ + } + result = DxeIplLzmaDecodeRange(StreamCtx, n0x112_1, src); /*0xffc17ed2*/ + if ( result ) /*0xffc17ed9*/ + break; /*0xffc17ed9*/ + if ( !StreamCtx[12] ) /*0xffc17edb*/ + { + v9 = StreamCtx[3]; /*0xffc17ee0*/ + if ( StreamCtx[11] >= v9 ) /*0xffc17ee6*/ + StreamCtx[12] = v9; /*0xffc17ee8*/ + } + DxeIplLzmaDecodeLiteral(StreamCtx, n0x112); /*0xffc17eef*/ + if ( StreamCtx[9] >= n0x112 || StreamCtx[6] >= src || (unsigned int)StreamCtx[18] >= 0x112 ) /*0xffc17f05*/ + { + if ( (unsigned int)StreamCtx[18] > 0x112 ) /*0xffc17f0e*/ + StreamCtx[18] = 274; /*0xffc17f10*/ + return 0; /*0xffc17f17*/ + } + } + return result; /*0xffc17f19*/ +} -{"addr":"0xffc1723a","code":"int DxeIplGetPpiPtr(int a1, unsigned int a2)\n{\n unsigned int v2; // esi\n int result; // eax\n\n v2 = *(_DWORD *)(a1 + 12); /*0xffc17244*/\n if ( v2 < a2 ) /*0xffc17249*/\n return 0; /*0xffc1725b*/\n result = *(_DWORD *)(a1 + 8); /*0xffc1724b*/\n *(_DWORD *)(a1 + 12) = v2 - a2; /*0xffc17250*/\n *(_DWORD *)(a1 + 8) = result + a2; /*0xffc17256*/\n return result; /*0xffc1725d*/\n}"} +int DxeIplLzmaDecodeStream( + int StreamCtx, + unsigned int NumBits, + unsigned __int8 *src, + unsigned int *DstData, + int DstSize, + _DWORD *a6) +{ + unsigned int *DstData_1; // edi + unsigned int n0x14; // ebx + unsigned __int8 *src_1; // edx + unsigned int n5; // ecx + int v12; // ecx + int v13; // eax + unsigned int n0x14_2; // edi + unsigned __int8 *src_2; // edi + unsigned __int8 *src_3; // eax + int n2; // eax + int v18; // eax + unsigned int n0x14_1; // ecx + int n2_1; // eax + unsigned int n0x14_4; // eax + unsigned int n0x14_5; // edi + unsigned int v23; // eax + int v25; // ecx + unsigned int n0x14_3; // [esp+14h] [ebp-4h] + int v28; // [esp+28h] [ebp+10h] -{"addr":"0xffc17260","code":"void nullsub_2()\n{\n ; /*0xffc17260*/\n}"} + DstData_1 = DstData; /*0xffc1849c*/ + n0x14 = *DstData; /*0xffc184a8*/ + *DstData = 0; /*0xffc184aa*/ + DxeIplLzmaDecodeLiteral((_DWORD *)StreamCtx, NumBits); /*0xffc184ad*/ + *a6 = 0; /*0xffc184b9*/ + if ( *(_DWORD *)(StreamCtx + 72) == 274 ) /*0xffc184c4*/ + { +LABEL_52: + v25 = *(_DWORD *)(StreamCtx + 32); /*0xffc1870f*/ + if ( !v25 ) /*0xffc18714*/ + *a6 = 1; /*0xffc18716*/ + return v25 != 0; /*0xffc18721*/ + } + src_1 = src; /*0xffc184ca*/ + while ( 1 ) /*0xffc184ce*/ + { + if ( *(_DWORD *)(StreamCtx + 76) ) /*0xffc184ce*/ + { + if ( n0x14 ) /*0xffc184d6*/ + { + do /*0xffc184ef*/ + { + n5 = *(_DWORD *)(StreamCtx + 88); /*0xffc184d8*/ + if ( n5 >= 5 ) /*0xffc184de*/ + break; /*0xffc184de*/ + *(_BYTE *)(n5 + StreamCtx + 92) = *src_1; /*0xffc184e2*/ + ++*(_DWORD *)(StreamCtx + 88); /*0xffc184e6*/ + ++src_1; /*0xffc184e9*/ + ++*DstData_1; /*0xffc184ea*/ + --n0x14; /*0xffc184ec*/ + } + while ( n0x14 ); /*0xffc184ef*/ + src = src_1; /*0xffc184f3*/ + } + if ( *(_DWORD *)(StreamCtx + 88) < 5u ) /*0xffc184fc*/ + goto LABEL_42; /*0xffc184fc*/ + if ( *(_BYTE *)(StreamCtx + 92) ) /*0xffc18502*/ + return 1; /*0xffc18506*/ + v12 = *(unsigned __int8 *)(StreamCtx + 95) /*0xffc18522*/ + | ((*(unsigned __int8 *)(StreamCtx + 94) | (*(unsigned __int8 *)(StreamCtx + 93) << 8)) << 8); + v13 = *(unsigned __int8 *)(StreamCtx + 96); /*0xffc18524*/ + *(_DWORD *)(StreamCtx + 28) = -1; /*0xffc18528*/ + *(_DWORD *)(StreamCtx + 76) = 0; /*0xffc18531*/ + *(_DWORD *)(StreamCtx + 32) = v13 | (v12 << 8); /*0xffc18534*/ + *(_DWORD *)(StreamCtx + 88) = 0; /*0xffc18539*/ + } + v28 = 0; /*0xffc18545*/ + if ( *(_DWORD *)(StreamCtx + 36) >= NumBits ) /*0xffc1854c*/ + { + if ( *(_DWORD *)(StreamCtx + 72) ) /*0xffc1854e*/ + { + *a6 = 2; /*0xffc186d4*/ + return 1; /*0xffc186dd*/ + } + if ( !*(_DWORD *)(StreamCtx + 32) ) /*0xffc1855a*/ + { + *a6 = 4; /*0xffc186cb*/ + return 0; /*0xffc186d2*/ + } + v28 = 1; /*0xffc18560*/ + } + if ( *(_DWORD *)(StreamCtx + 80) ) /*0xffc18564*/ + { + memset32( /*0xffc18585*/ + *(void **)(StreamCtx + 16), + 67109888, + (unsigned int)((768 << (*(_BYTE *)StreamCtx + *(_BYTE *)(StreamCtx + 4))) + 1846) >> 1); + *(_DWORD *)(StreamCtx + 68) = 1; /*0xffc1858f*/ + *(_DWORD *)(StreamCtx + 64) = 1; /*0xffc18592*/ + *(_DWORD *)(StreamCtx + 60) = 1; /*0xffc18595*/ + *(_DWORD *)(StreamCtx + 56) = 1; /*0xffc18598*/ + *(_DWORD *)(StreamCtx + 52) = 0; /*0xffc1859b*/ + *(_DWORD *)(StreamCtx + 80) = 0; /*0xffc1859f*/ + } + n0x14_2 = *(_DWORD *)(StreamCtx + 88); /*0xffc185a3*/ + if ( !n0x14_2 ) /*0xffc185a8*/ + { + if ( n0x14 >= 0x14 && !v28 ) /*0xffc185b3*/ + { + src_2 = src; /*0xffc185b5*/ + src_3 = &src[n0x14 - 20]; /*0xffc185bc*/ +LABEL_25: + *(_DWORD *)(StreamCtx + 24) = src_2; /*0xffc185eb*/ + if ( DxeIplLzmaDecodeMatch((int *)StreamCtx, NumBits, (unsigned int)src_3) ) /*0xffc185f5*/ + return 1; /*0xffc185fc*/ + src_1 = *(unsigned __int8 **)(StreamCtx + 24); /*0xffc18605*/ + v18 = src_1 - src_2; /*0xffc18608*/ + DstData_1 = DstData; /*0xffc1860a*/ + src = src_1; /*0xffc1860e*/ + *DstData += v18; /*0xffc18612*/ + n0x14 -= v18; /*0xffc18614*/ + goto LABEL_40; /*0xffc18616*/ + } + src_2 = src; /*0xffc185c0*/ + n2 = DxeIplLzmaDecodeBitTree((_DWORD *)StreamCtx, src, n0x14); /*0xffc185c9*/ + if ( n2 ) /*0xffc185d1*/ + { + if ( v28 && n2 != 2 ) /*0xffc185e3*/ + break; /*0xffc185e3*/ + src_3 = src; /*0xffc185e9*/ + goto LABEL_25; /*0xffc185e9*/ + } + DxeIplFvFreePages((char *)(StreamCtx + 92), (char *)src, n0x14); /*0xffc186ed*/ + *(_DWORD *)(StreamCtx + 88) = n0x14; /*0xffc186f7*/ + *DstData += n0x14; /*0xffc186fa*/ +LABEL_42: + *a6 = 3; /*0xffc186c0*/ + return 0; /*0xffc186c9*/ + } + n0x14_1 = 0; /*0xffc1861b*/ + n0x14_3 = 0; /*0xffc1861d*/ + if ( n0x14_2 < 0x14 ) /*0xffc18624*/ + { + do /*0xffc18636*/ + { + if ( n0x14_1 >= n0x14 ) /*0xffc18628*/ + break; /*0xffc18628*/ + *(_BYTE *)(n0x14_2 + StreamCtx + 92) = src_1[n0x14_1]; /*0xffc1862d*/ + ++n0x14_2; /*0xffc18631*/ + ++n0x14_1; /*0xffc18632*/ + } + while ( n0x14_2 < 0x14 ); /*0xffc18636*/ + n0x14_3 = n0x14_1; /*0xffc18638*/ + } + *(_DWORD *)(StreamCtx + 88) = n0x14_2; /*0xffc1863c*/ + if ( n0x14_2 < 0x14 || v28 ) /*0xffc18649*/ + { + n2_1 = DxeIplLzmaDecodeBitTree((_DWORD *)StreamCtx, (unsigned __int8 *)(StreamCtx + 92), n0x14_2); /*0xffc18651*/ + if ( !n2_1 ) /*0xffc18659*/ + { + *DstData += n0x14_3; /*0xffc1870b*/ + goto LABEL_42; /*0xffc1870d*/ + } + if ( v28 && n2_1 != 2 ) /*0xffc1866b*/ + break; /*0xffc1866b*/ + } + *(_DWORD *)(StreamCtx + 24) = StreamCtx + 92; /*0xffc18677*/ + if ( DxeIplLzmaDecodeMatch((int *)StreamCtx, NumBits, StreamCtx + 92) ) /*0xffc1867a*/ + return 1; /*0xffc18681*/ + n0x14_4 = *(_DWORD *)(StreamCtx + 24) - StreamCtx - 92; /*0xffc18688*/ + if ( n0x14_2 < n0x14_4 ) /*0xffc1868d*/ + return 11; /*0xffc1868d*/ + n0x14_5 = n0x14_2 - n0x14_4; /*0xffc1868f*/ + if ( n0x14_3 < n0x14_5 ) /*0xffc18697*/ + return 11; /*0xffc18701*/ + v23 = n0x14_3 - n0x14_5; /*0xffc18699*/ + DstData_1 = DstData; /*0xffc1869b*/ + src += v23; /*0xffc1869f*/ + n0x14 -= v23; /*0xffc186a3*/ + src_1 = src; /*0xffc186a5*/ + *DstData += v23; /*0xffc186a9*/ + *(_DWORD *)(StreamCtx + 88) = 0; /*0xffc186ab*/ +LABEL_40: + if ( *(_DWORD *)(StreamCtx + 72) == 274 ) /*0xffc186b6*/ + goto LABEL_52; /*0xffc186b6*/ + } + *a6 = 2; /*0xffc186df*/ + return 1; /*0xffc18724*/ +} -{"addr":"0xffc17261","code":"int __thiscall DxeIplLzmaInitState(unsigned __int8 *this)\n{\n int i; // edi\n __int64 v2; // rax\n __int64 v4; // [esp+Ch] [ebp-8h]\n\n v4 = 0; /*0xffc17266*/\n for ( i = 12; i >= 5; --i ) /*0xffc17275*/\n {\n v2 = (v4 << 8) + *(this + i); /*0xffc17295*/\n v4 = v2; /*0xffc1729a*/\n }\n return v2; /*0xffc172a5*/\n}"} +int DxeIplDecodeSetup(int *a1, char *DstEnd) +{ + unsigned int n4096; // esi + unsigned __int8 n0xE1; // al + int v5; // edx -{"addr":"0xffc172ac","code":"unsigned int DxeIplLzmaInitRange(unsigned __int8 *a1, int a2, int a3, int a4)\n{\n int v6; // ecx\n _DWORD v8[4]; // [esp+8h] [ebp-18h] BYREF\n int v9; // [esp+18h] [ebp-8h] BYREF\n int v10; // [esp+1Ch] [ebp-4h] BYREF\n\n v8[0] = DxeIplGetPpiPtr; /*0xffc172b9*/\n v8[1] = nullsub_2; /*0xffc172c2*/\n v8[2] = a4; /*0xffc172c9*/\n v8[3] = 0x10000; /*0xffc172cc*/\n v10 = DxeIplLzmaInitState(a1); /*0xffc172d8*/\n a4 = a2 - 13; /*0xffc172e1*/\n return DxeIplDecodeData(a3, (unsigned int *)&v10, a1 + 13, (unsigned int *)&a4, (int)a1, v6, v6, &v9, (int)v8) != 0\n ? 0x80000002\n : 0;\n}","refs":[{"addr":"0xffc1723a","name":"DxeIplGetPpiPtr"},{"addr":"0xffc17260","name":"nullsub_2"},{"addr":"0xffc17261","name":"DxeIplLzmaInitState"},{"addr":"0xffc187d2","name":"DxeIplDecodeData"}]} + n4096 = (unsigned __int8)DstEnd[1] | (((unsigned __int8)DstEnd[2] | (*(unsigned __int16 *)(DstEnd + 3) << 8)) << 8); /*0xffc18749*/ + if ( n4096 < 0x1000 ) /*0xffc18752*/ + n4096 = 4096; /*0xffc18754*/ + n0xE1 = *DstEnd; /*0xffc18756*/ + a1[3] = n4096; /*0xffc18758*/ + if ( n0xE1 >= 0xE1u ) /*0xffc1875d*/ + return 4; /*0xffc18761*/ + *a1 = n0xE1 % 9; /*0xffc18772*/ + v5 = n0xE1 / 9 % 5; /*0xffc18776*/ + a1[2] = n0xE1 / 9 / 5; /*0xffc18779*/ + a1[1] = v5; /*0xffc1877e*/ + return 0; /*0xffc18762*/ +} -Output truncated. Run: curl -o .ida-mcp/ca7c2ba0-fc39-45f6-bc9c-fb9dfc0baa92.json http://127.0.0.1:13388/output/ca7c2ba0-fc39-45f6-bc9c-fb9dfc0baa92.json +int DxeIplDecodeCleanup(int a1, _BYTE *a2, int a3) +{ + int v4; // edi + int v5; // eax -{"addr":"0xffc17e29","code":"char DxeIplLzmaDecodeLiteral(_DWORD *StreamCtx, unsigned int n0x112)\n{\n unsigned int n0x112_2; // edi\n unsigned int v4; // edx\n int v5; // ebp\n unsigned int n0x112_1; // esi\n unsigned int v7; // ebx\n int v9; // [esp+8h] [ebp-4h]\n\n n0x112_2 = StreamCtx[18]; /*0xffc17e2c*/\n if ( n0x112_2 && n0x112_2 < 0x112 )\n {\n v4 = StreamCtx[9]; /*0xffc17e3d*/\n n0x112 -= v4; /*0xffc17e40*/\n v5 = StreamCtx[5]; /*0xffc17e47*/\n n0x112_1 = StreamCtx[18]; /*0xffc17e4b*/\n v9 = StreamCtx[10]; /*0xffc17e4d*/\n v7 = StreamCtx[14]; /*0xffc17e51*/\n if ( n0x112 < n0x112_2 ) /*0xffc17e5a*/\n n0x112_1 = n0x112; /*0xffc17e5c*/\n if ( !StreamCtx[12] ) /*0xffc17e5e*/\n {\n n0x112 = StreamCtx[3] - StreamCtx[11]; /*0xffc17e69*/\n if ( n0x112 <= n0x112_1 ) /*0xffc17e6e*/\n StreamCtx[12] = StreamCtx[3]; /*0xffc17e70*/\n }\n StreamCtx[11] += n0x112_1; /*0xffc17e77*/\n for ( StreamCtx[18] = n0x112_2 - n0x112_1; n0x112_1; --n0x112_1 )\n {\n LOBYTE(n0x112) = *(_BYTE *)(v4 + (v4 < v7 ? v9 : 0) - v7 + v5);\n *(_BYTE *)(v4 + v5) = n0x112; /*0xffc17e94*/\n ++v4; /*0xffc17e97*/\n }\n StreamCtx[9] = v4; /*0xffc17e9f*/\n }\n return n0x112; /*0xffc17ea3*/\n}"} + v4 = (768 << (*a2 + a2[4])) + 1846; /*0xffc18792*/ + if ( *(_DWORD *)(a1 + 16) && v4 == *(_DWORD *)(a1 + 84) ) /*0xffc187a1*/ + return 0; /*0xffc187a1*/ + (*(void ( **)(int, _DWORD))(a3 + 4))(a3, *(_DWORD *)(a1 + 16)); /*0xffc187ac*/ + *(_DWORD *)(a1 + 16) = 0; /*0xffc187af*/ + v5 = (*(int ( **)(int, int))a3)(a3, 2 *v4); /*0xffc187b8*/ + *(_DWORD *)(a1 + 16) = v5; /*0xffc187bd*/ + *(_DWORD *)(a1 + 84) = v4; /*0xffc187c0*/ + if ( v5 ) /*0xffc187c6*/ + return 0; /*0xffc187cd*/ + else + return 2; /*0xffc187ca*/ +} -{"addr":"0xffc17ea7","code":"int DxeIplLzmaDecodeMatch(int *StreamCtx, unsigned int n0x112, unsigned int src)\n{\n unsigned int n0x112_1; // edx\n int v6; // ebx\n unsigned int v7; // ecx\n int result; // eax\n unsigned int v9; // eax\n\n while ( 1 ) /*0xffc17eb7*/\n {\n n0x112_1 = n0x112; /*0xffc17eb7*/\n if ( !StreamCtx[12] ) /*0xffc17eb3*/\n {\n v6 = StreamCtx[9]; /*0xffc17ec0*/\n v7 = StreamCtx[3] - StreamCtx[11]; /*0xffc17ec5*/\n if ( n0x112 - v6 > v7 ) /*0xffc17eca*/\n n0x112_1 = v6 + v7; /*0xffc17ecc*/\n }\n result = DxeIplLzmaDecodeRange(StreamCtx, n0x112_1, src); /*0xffc17ed2*/\n if ( result ) /*0xffc17ed9*/\n break; /*0xffc17ed9*/\n if ( !StreamCtx[12] ) /*0xffc17edb*/\n {\n v9 = StreamCtx[3]; /*0xffc17ee0*/\n if ( StreamCtx[11] >= v9 ) /*0xffc17ee6*/\n StreamCtx[12] = v9; /*0xffc17ee8*/\n }\n DxeIplLzmaDecodeLiteral(StreamCtx, n0x112); /*0xffc17eef*/\n if ( StreamCtx[9] >= n0x112 || StreamCtx[6] >= src || (unsigned int)StreamCtx[18] >= 0x112 ) /*0xffc17f05*/\n {\n if ( (unsigned int)StreamCtx[18] > 0x112 ) /*0xffc17f0e*/\n StreamCtx[18] = 274; /*0xffc17f10*/\n return 0; /*0xffc17f17*/\n }\n }\n return result; /*0xffc17f19*/\n}","refs":[{"addr":"0xffc17311","name":"DxeIplLzmaDecodeRange"},{"addr":"0xffc17e29","name":"DxeIplLzmaDecodeLiteral"}]} +int DxeIplDecodeData( + int DecodeCtx, + unsigned int *SrcData, + unsigned __int8 *src, + unsigned int *DstData, + char *DstEnd, + int Status, + int a7, + _DWORD *a8, + int a9) +{ + int result; // eax + _BYTE *v10; // ecx + int n6; // esi + unsigned int n5; // [esp+10h] [ebp-90h] + unsigned int n0x112; // [esp+18h] [ebp-88h] + int v16[4]; // [esp+20h] [ebp-80h] BYREF + _DWORD v17[4]; // [esp+30h] [ebp-70h] BYREF + int v18; // [esp+40h] [ebp-60h] + int DecodeCtx_1; // [esp+44h] [ebp-5Ch] + unsigned int v20; // [esp+54h] [ebp-4Ch] + unsigned int n0x112_1; // [esp+58h] [ebp-48h] + int v22; // [esp+5Ch] [ebp-44h] + int v23; // [esp+60h] [ebp-40h] + int v24; // [esp+78h] [ebp-28h] + int v25; // [esp+7Ch] [ebp-24h] + int v26; // [esp+80h] [ebp-20h] + int v27; // [esp+88h] [ebp-18h] -Output truncated. Run: curl -o .ida-mcp/3df1557f-dc72-4021-8d91-f3b1906c50c9.json http://127.0.0.1:13388/output/3df1557f-dc72-4021-8d91-f3b1906c50c9.json + n0x112 = *SrcData; /*0xffc187fb*/ + n5 = *DstData; /*0xffc187ff*/ + *DstData = 0; /*0xffc18803*/ + *SrcData = 0; /*0xffc18806*/ + *a8 = 0; /*0xffc18808*/ + if ( n5 < 5 ) /*0xffc1880d*/ + return 6; /*0xffc18811*/ + DecodeCtx_1 = 0; /*0xffc1881e*/ + v18 = 0; /*0xffc18822*/ + result = DxeIplDecodeSetup(v16, DstEnd); /*0xffc1882a*/ + if ( !result ) /*0xffc18838*/ + { + result = DxeIplDecodeCleanup((int)v17, v10, a9); /*0xffc18845*/ + if ( !result ) /*0xffc1884d*/ + { + v17[0] = v16[0]; /*0xffc1885b*/ + v17[1] = v16[1]; /*0xffc1885c*/ + v17[2] = v16[2]; /*0xffc1885d*/ + v17[3] = v16[3]; /*0xffc1885e*/ + v20 = 0; /*0xffc18874*/ + v24 = 0; /*0xffc1887a*/ + v27 = 0; /*0xffc1887f*/ + v22 = 0; /*0xffc18887*/ + v23 = 0; /*0xffc1888c*/ + DecodeCtx_1 = DecodeCtx; /*0xffc18893*/ + v25 = 1; /*0xffc188a5*/ + v26 = 1; /*0xffc188ac*/ + n0x112_1 = n0x112; /*0xffc188b7*/ + *DstData = n5; /*0xffc188bb*/ + n6 = DxeIplLzmaDecodeStream((int)v17, n0x112, src, DstData, 1, a8); /*0xffc188c7*/ + *SrcData = v20; /*0xffc188d0*/ + if ( !n6 && *a8 == 3 ) /*0xffc188d9*/ + n6 = 6; /*0xffc188dd*/ + (*(void ( **)(int, int))(a9 + 4))(a9, v18); /*0xffc188e3*/ + return n6; /*0xffc188e8*/ + } + } + return result; /*0xffc188ea*/ +} -{"addr":"0xffc18496","code":"int DxeIplLzmaDecodeStream(\n int StreamCtx,\n unsigned int NumBits,\n unsigned __int8 *src,\n unsigned int *DstData,\n int DstSize,\n _DWORD *a6)\n{\n unsigned int *DstData_1; // edi\n unsigned int n0x14; // ebx\n unsigned __int8 *src_1; // edx\n unsigned int n5; // ecx\n int v12; // ecx\n int v13; // eax\n unsigned int n0x14_2; // edi\n unsigned __int8 *src_2; // edi\n unsigned __int8 *src_3; // eax\n int n2; // eax\n int v18; // eax\n unsigned int n0x14_1; // ecx\n int n2_1; // eax\n unsigned int n0x14_4; // eax\n unsigned int n0x14_5; // edi\n unsigned int v23; // eax\n int v25; // ecx\n unsigned int n0x14_3; // [esp+14h] [ebp-4h]\n int v28; // [esp+28h] [ebp+10h]\n\n DstData_1 = DstData; /*0xffc1849c*/\n n0x14 = *DstData; /*0xffc184a8*/\n *DstData = 0; /*0xffc184aa*/\n DxeIplLzmaDecodeLiteral((_DWORD *)StreamCtx, NumBits); /*0xffc184ad*/\n *a6 = 0; /*0xffc184b9*/\n if ( *(_DWORD *)(StreamCtx + 72) == 274 ) /*0xffc184c4*/\n {\nLABEL_52:\n v25 = *(_DWORD *)(StreamCtx + 32); /*0xffc1870f*/\n if ( !v25 ) /*0xffc18714*/\n *a6 = 1; /*0xffc18716*/\n return v25 != 0; /*0xffc18721*/\n }\n src_1 = src; /*0xffc184ca*/\n while ( 1 ) /*0xffc184ce*/\n {\n if ( *(_DWORD *)(StreamCtx + 76) ) /*0xffc184ce*/\n {\n if ( n0x14 ) /*0xffc184d6*/\n {\n do /*0xffc184ef*/\n {\n n5 = *(_DWORD *)(StreamCtx + 88); /*0xffc184d8*/\n if ( n5 >= 5 ) /*0xffc184de*/\n break; /*0xffc184de*/\n *(_BYTE *)(n5 + StreamCtx + 92) = *src_1; /*0xffc184e2*/\n ++*(_DWORD *)(StreamCtx + 88); /*0xffc184e6*/\n ++src_1; /*0xffc184e9*/\n ++*DstData_1; /*0xffc184ea*/\n --n0x14; /*0xffc184ec*/\n }\n while ( n0x14 ); /*0xffc184ef*/\n src = src_1; /*0xffc184f3*/\n }\n if ( *(_DWORD *)(StreamCtx + 88) < 5u ) /*0xffc184fc*/\n goto LABEL_42; /*0xffc184fc*/\n if ( *(_BYTE *)(StreamCtx + 92) ) /*0xffc18502*/\n return 1; /*0xffc18506*/\n v12 = *(unsigned __int8 *)(StreamCtx + 95) /*0xffc18522*/\n | ((*(unsigned __int8 *)(StreamCtx + 94) | (*(unsigned __int8 *)(StreamCtx + 93) << 8)) << 8);\n v13 = *(unsigned __int8 *)(StreamCtx + 96); /*0xffc18524*/\n *(_DWORD *)(StreamCtx + 28) = -1; /*0xffc18528*/\n *(_DWORD *)(StreamCtx + 76) = 0; /*0xffc18531*/\n *(_DWORD *)(StreamCtx + 32) = v13 | (v12 << 8); /*0xffc18534*/\n *(_DWORD *)(StreamCtx + 88) = 0; /*0xffc18539*/\n }\n v28 = 0; /*0xffc18545*/\n if ( *(_DWORD *)(StreamCtx + 36) >= NumBits ) /*0xffc1854c*/\n {\n if ( *(_DWORD *)(StreamCtx + 72) ) /*0xffc1854e*/\n {\n *a6 = 2; /*0xffc186d4*/\n return 1; /*0xffc186dd*/\n }\n if ( !*(_DWORD *)(StreamCtx + 32) ) /*0xffc1855a*/\n {\n *a6 = 4; /*0xffc186cb*/\n return 0; /*0xffc186d2*/\n }\n v28 = 1; /*0xffc18560*/\n }\n if ( *(_DWORD *)(StreamCtx + 80) ) /*0xffc18564*/\n {\n memset32( /*0xffc18585*/\n *(void **)(StreamCtx + 16),\n 67109888,\n (unsigned int)((768 << (*(_BYTE *)StreamCtx + *(_BYTE *)(StreamCtx + 4))) + 1846) >> 1);\n *(_DWORD *)(StreamCtx + 68) = 1; /*0xffc1858f*/\n *(_DWORD *)(StreamCtx + 64) = 1; /*0xffc18592*/\n *(_DWORD *)(StreamCtx + 60) = 1; /*0xffc18595*/\n *(_DWORD *)(StreamCtx + 56) = 1; /*0xffc18598*/\n *(_DWORD *)(StreamCtx + 52) = 0; /*0xffc1859b*/\n *(_DWORD *)(StreamCtx + 80) = 0; /*0xffc1859f*/\n }\n n0x14_2 = *(_DWORD *)(StreamCtx + 88); /*0xffc185a3*/\n if ( !n0x14_2 ) /*0xffc185a8*/\n {\n if ( n0x14 >= 0x14 && !v28 ) /*0xffc185b3*/\n {\n src_2 = src; /*0xffc185b5*/\n src_3 = &src[n0x14 - 20]; /*0xffc185bc*/\nLABEL_25:\n *(_DWORD *)(StreamCtx + 24) = src_2; /*0xffc185eb*/\n if ( DxeIplLzmaDecodeMatch((int *)StreamCtx, NumBits, (unsigned int)src_3) ) /*0xffc185f5*/\n return 1; /*0xffc185fc*/\n src_1 = *(unsigned __int8 **)(StreamCtx + 24); /*0xffc18605*/\n v18 = src_1 - src_2; /*0xffc18608*/\n DstData_1 = DstData; /*0xffc1860a*/\n src = src_1; /*0xffc1860e*/\n *DstData += v18; /*0xffc18612*/\n n0x14 -= v18; /*0xffc18614*/\n goto LABEL_40; /*0xffc18616*/\n }\n src_2 = src; /*0xffc185c0*/\n n2 = DxeIplLzmaDecodeBitTree((_DWORD *)StreamCtx, src, n0x14); /*0xffc185c9*/\n if ( n2 ) /*0xffc185d1*/\n {\n if ( v28 && n2 != 2 ) /*0xffc185e3*/\n break; /*0xffc185e3*/\n src_3 = src; /*0xffc185e9*/\n goto LABEL_25; /*0xffc185e9*/\n }\n DxeIplFvFreePages((char *)(StreamCtx + 92), (char *)src, n0x14); /*0xffc186ed*/\n *(_DWORD *)(StreamCtx + 88) = n0x14; /*0xffc186f7*/\n *DstData += n0x14; /*0xffc186fa*/\nLABEL_42:\n *a6 = 3; /*0xffc186c0*/\n return 0; /*0xffc186c9*/\n }\n n0x14_1 = 0; /*0xffc1861b*/\n n0x14_3 = 0; /*0xffc1861d*/\n if ( n0x14_2 < 0x14 ) /*0xffc18624*/\n {\n do /*0xffc18636*/\n {\n if ( n0x14_1 >= n0x14 ) /*0xffc18628*/\n break; /*0xffc18628*/\n *(_BYTE *)(n0x14_2 + StreamCtx + 92) = src_1[n0x14_1]; /*0xffc1862d*/\n ++n0x14_2; /*0xffc18631*/\n ++n0x14_1; /*0xffc18632*/\n }\n while ( n0x14_2 < 0x14 ); /*0xffc18636*/\n n0x14_3 = n0x14_1; /*0xffc18638*/\n }\n *(_DWORD *)(StreamCtx + 88) = n0x14_2; /*0xffc1863c*/\n if ( n0x14_2 < 0x14 || v28 ) /*0xffc18649*/\n {\n n2_1 = DxeIplLzmaDecodeBitTree((_DWORD *)StreamCtx, (unsigned __int8 *)(StreamCtx + 92), n0x14_2); /*0xffc18651*/\n if ( !n2_1 ) /*0xffc18659*/\n {\n *DstData += n0x14_3; /*0xffc1870b*/\n goto LABEL_42; /*0xffc1870d*/\n }\n if ( v28 && n2_1 != 2 ) /*0xffc1866b*/\n break; /*0xffc1866b*/\n }\n *(_DWORD *)(StreamCtx + 24) = StreamCtx + 92; /*0xffc18677*/\n if ( DxeIplLzmaDecodeMatch((int *)StreamCtx, NumBits, StreamCtx + 92) ) /*0xffc1867a*/\n return 1; /*0xffc18681*/\n n0x14_4 = *(_DWORD *)(StreamCtx + 24) - StreamCtx - 92; /*0xffc18688*/\n if ( n0x14_2 < n0x14_4 ) /*0xffc1868d*/\n return 11; /*0xffc1868d*/\n n0x14_5 = n0x14_2 - n0x14_4; /*0xffc1868f*/\n if ( n0x14_3 < n0x14_5 ) /*0xffc18697*/\n return 11; /*0xffc18701*/\n v23 = n0x14_3 - n0x14_5; /*0xffc18699*/\n DstData_1 = DstData; /*0xffc1869b*/\n src += v23; /*0xffc1869f*/\n n0x14 -= v23; /*0xffc186a3*/\n src_1 = src; /*0xffc186a5*/\n *DstData += v23; /*0xffc186a9*/\n *(_DWORD *)(StreamCtx + 88) = 0; /*0xffc186ab*/\nLABEL_40:\n if ( *(_DWORD *)(StreamCtx + 72) == 274 ) /*0xffc186b6*/\n goto LABEL_52; /*0xffc186b6*/\n }\n *a6 = 2; /*0xffc186df*/\n return 1; /*0xffc18724*/\n}","refs":[{"addr":"0xffc17e29","name":"DxeIplLzmaDecodeLiteral"},{"addr":"0xffc17ea7","name":"DxeIplLzmaDecodeMatch"},{"addr":"0xffc17f20","name":"DxeIplLzmaDecodeBitTree"},{"addr":"0xffc162d3","name":"DxeIplFvFreePages"}]} +int DxeIplLzmaGetBit(char *a1, _BYTE *a2, unsigned int n7) +{ + char i; // al -{"addr":"0xffc1872b","code":"int DxeIplDecodeSetup(int *a1, char *DstEnd)\n{\n unsigned int n4096; // esi\n unsigned __int8 n0xE1; // al\n int v5; // edx\n\n n4096 = (unsigned __int8)DstEnd[1] | (((unsigned __int8)DstEnd[2] | (*(unsigned __int16 *)(DstEnd + 3) << 8)) << 8); /*0xffc18749*/\n if ( n4096 < 0x1000 ) /*0xffc18752*/\n n4096 = 4096; /*0xffc18754*/\n n0xE1 = *DstEnd; /*0xffc18756*/\n a1[3] = n4096; /*0xffc18758*/\n if ( n0xE1 >= 0xE1u ) /*0xffc1875d*/\n return 4; /*0xffc18761*/\n *a1 = n0xE1 % 9; /*0xffc18772*/\n v5 = n0xE1 / 9 % 5; /*0xffc18776*/\n a1[2] = n0xE1 / 9 / 5; /*0xffc18779*/\n a1[1] = v5; /*0xffc1877e*/\n return 0; /*0xffc18762*/\n}"} + for ( i = *a1; *a1; i = *a1 ) /*0xffc188f5*/ + { + if ( !*a2 ) /*0xffc18901*/ + break; /*0xffc18905*/ + if ( i != *a2 ) /*0xffc18909*/ + break; /*0xffc18909*/ + if ( n7 <= 1 ) /*0xffc1890e*/ + break; /*0xffc1890e*/ + ++a1; /*0xffc18910*/ + ++a2; /*0xffc18911*/ + --n7; /*0xffc18912*/ + } + return *a1 - (char)*a2; /*0xffc18923*/ +} -{"addr":"0xffc18782","code":"int DxeIplDecodeCleanup(int a1, _BYTE *a2, int a3)\n{\n int v4; // edi\n int v5; // eax\n\n v4 = (768 << (*a2 + a2[4])) + 1846; /*0xffc18792*/\n if ( *(_DWORD *)(a1 + 16) && v4 == *(_DWORD *)(a1 + 84) ) /*0xffc187a1*/\n return 0; /*0xffc187a1*/\n (*(void ( **)(int, _DWORD))(a3 + 4))(a3, *(_DWORD *)(a1 + 16)); /*0xffc187ac*/\n *(_DWORD *)(a1 + 16) = 0; /*0xffc187af*/\n v5 = (*(int ( **)(int, int))a3)(a3, 2 *v4); /*0xffc187b8*/\n *(_DWORD *)(a1 + 16) = v5; /*0xffc187bd*/\n *(_DWORD *)(a1 + 84) = v4; /*0xffc187c0*/\n if ( v5 ) /*0xffc187c6*/\n return 0; /*0xffc187cd*/\n else\n return 2; /*0xffc187ca*/\n}"} +char DxeIplLzmaGetNumBits(unsigned int DxeIpl, int a2) +{ + unsigned int DxeIpl_1; // ecx -{"addr":"0xffc187d2","code":"int DxeIplDecodeData(\n int DecodeCtx,\n unsigned int *SrcData,\n unsigned __int8 *src,\n unsigned int *DstData,\n char *DstEnd,\n int Status,\n int a7,\n _DWORD *a8,\n int a9)\n{\n int result; // eax\n _BYTE *v10; // ecx\n int n6; // esi\n unsigned int n5; // [esp+10h] [ebp-90h]\n unsigned int n0x112; // [esp+18h] [ebp-88h]\n int v16[4]; // [esp+20h] [ebp-80h] BYREF\n _DWORD v17[4]; // [esp+30h] [ebp-70h] BYREF\n int v18; // [esp+40h] [ebp-60h]\n int DecodeCtx_1; // [esp+44h] [ebp-5Ch]\n unsigned int v20; // [esp+54h] [ebp-4Ch]\n unsigned int n0x112_1; // [esp+58h] [ebp-48h]\n int v22; // [esp+5Ch] [ebp-44h]\n int v23; // [esp+60h] [ebp-40h]\n int v24; // [esp+78h] [ebp-28h]\n int v25; // [esp+7Ch] [ebp-24h]\n int v26; // [esp+80h] [ebp-20h]\n int v27; // [esp+88h] [ebp-18h]\n\n n0x112 = *SrcData; /*0xffc187fb*/\n n5 = *DstData; /*0xffc187ff*/\n *DstData = 0; /*0xffc18803*/\n *SrcData = 0; /*0xffc18806*/\n *a8 = 0; /*0xffc18808*/\n if ( n5 < 5 ) /*0xffc1880d*/\n return 6; /*0xffc18811*/\n DecodeCtx_1 = 0; /*0xffc1881e*/\n v18 = 0; /*0xffc18822*/\n result = DxeIplDecodeSetup(v16, DstEnd); /*0xffc1882a*/\n if ( !result ) /*0xffc18838*/\n {\n result = DxeIplDecodeCleanup((int)v17, v10, a9); /*0xffc18845*/\n if ( !result ) /*0xffc1884d*/\n {\n v17[0] = v16[0]; /*0xffc1885b*/\n v17[1] = v16[1]; /*0xffc1885c*/\n v17[2] = v16[2]; /*0xffc1885d*/\n v17[3] = v16[3]; /*0xffc1885e*/\n v20 = 0; /*0xffc18874*/\n v24 = 0; /*0xffc1887a*/\n v27 = 0; /*0xffc1887f*/\n v22 = 0; /*0xffc18887*/\n v23 = 0; /*0xffc1888c*/\n DecodeCtx_1 = DecodeCtx; /*0xffc18893*/\n v25 = 1; /*0xffc188a5*/\n v26 = 1; /*0xffc188ac*/\n n0x112_1 = n0x112; /*0xffc188b7*/\n *DstData = n5; /*0xffc188bb*/\n n6 = DxeIplLzmaDecodeStream((int)v17, n0x112, src, DstData, 1, a8); /*0xffc188c7*/\n *SrcData = v20; /*0xffc188d0*/\n if ( !n6 && *a8 == 3 ) /*0xffc188d9*/\n n6 = 6; /*0xffc188dd*/\n (*(void ( **)(int, int))(a9 + 4))(a9, v18); /*0xffc188e3*/\n return n6; /*0xffc188e8*/\n }\n }\n return result; /*0xffc188ea*/\n}","refs":[{"addr":"0xffc1872b","name":"DxeIplDecodeSetup"},{"addr":"0xffc18782","name":"DxeIplDecodeCleanup"},{"addr":"0xffc18496","name":"DxeIplLzmaDecodeStream"}]} + if ( DxeIpl > DxeIpl_1 ) /*0xffc1892a*/ + goto LABEL_4; /*0xffc1892a*/ + if ( DxeIpl_1 < DxeIpl + a2 ) /*0xffc18934*/ + return 1; /*0xffc18943*/ + if ( DxeIpl >= DxeIpl_1 ) /*0xffc18938*/ + { +LABEL_4: + if ( DxeIpl < DxeIpl_1 + 8 ) /*0xffc1893f*/ + return 1; /*0xffc1893f*/ + } + return 0; /*0xffc18943*/ +} -{"addr":"0xffc188f5","code":"int DxeIplLzmaGetBit(char *a1, _BYTE *a2, unsigned int n7)\n{\n char i; // al\n\n for ( i = *a1; *a1; i = *a1 ) /*0xffc188f5*/\n {\n if ( !*a2 ) /*0xffc18901*/\n break; /*0xffc18905*/\n if ( i != *a2 ) /*0xffc18909*/\n break; /*0xffc18909*/\n if ( n7 <= 1 ) /*0xffc1890e*/\n break; /*0xffc1890e*/\n ++a1; /*0xffc18910*/\n ++a2; /*0xffc18911*/\n --n7; /*0xffc18912*/\n }\n return *a1 - (char)*a2; /*0xffc18923*/\n}"} +unsigned int __thiscall DxeIplLzmaNormalize(_BYTE *this) +{ + unsigned int n7; // eax -{"addr":"0xffc18924","code":"char DxeIplLzmaGetNumBits(unsigned int DxeIpl, int a2)\n{\n unsigned int DxeIpl_1; // ecx\n\n if ( DxeIpl > DxeIpl_1 ) /*0xffc1892a*/\n goto LABEL_4; /*0xffc1892a*/\n if ( DxeIpl_1 < DxeIpl + a2 ) /*0xffc18934*/\n return 1; /*0xffc18943*/\n if ( DxeIpl >= DxeIpl_1 ) /*0xffc18938*/\n {\nLABEL_4:\n if ( DxeIpl < DxeIpl_1 + 8 ) /*0xffc1893f*/\n return 1; /*0xffc1893f*/\n }\n return 0; /*0xffc18943*/\n}"} + n7 = 0; /*0xffc18947*/ + if ( this && *this ) /*0xffc1894d*/ + { + while ( n7 < 7 ) /*0xffc18954*/ + { + if ( !*(this + ++n7) ) /*0xffc18957*/ + return n7; /*0xffc1895b*/ + } + return 8; /*0xffc18960*/ + } + return n7; /*0xffc1895d*/ +} -{"addr":"0xffc18947","code":"unsigned int __thiscall DxeIplLzmaNormalize(_BYTE *this)\n{\n unsigned int n7; // eax\n\n n7 = 0; /*0xffc18947*/\n if ( this && *this ) /*0xffc1894d*/\n {\n while ( n7 < 7 ) /*0xffc18954*/\n {\n if ( !*(this + ++n7) ) /*0xffc18957*/\n return n7; /*0xffc1895b*/\n }\n return 8; /*0xffc18960*/\n }\n return n7; /*0xffc1895d*/\n}"} +int DxeIplLzmaDecodeSymbol(char *DxeIpl) +{ + _BYTE *v1; // ecx + _BYTE *v2; // esi + unsigned int n7; // ebx + char v5; // al + char *v6; // edi -{"addr":"0xffc18962","code":"int DxeIplLzmaDecodeSymbol(char *DxeIpl)\n{\n _BYTE *v1; // ecx\n _BYTE *v2; // esi\n unsigned int n7; // ebx\n char v5; // al\n char *v6; // edi\n\n v2 = v1; /*0xffc18963*/\n if ( !v1 ) /*0xffc18967*/\n return -2147483646; /*0xffc18969*/\n if ( !DxeIpl ) /*0xffc18977*/\n return -2147483646; /*0xffc18979*/\n n7 = DxeIplLzmaNormalize(DxeIpl); /*0xffc18988*/\n if ( n7 > 7 ) /*0xffc1898d*/\n n7 = 7; /*0xffc18991*/\n if ( DxeIplLzmaGetNumBits((unsigned int)DxeIpl, n7 + 1) ) /*0xffc18999*/\n return -2147483633; /*0xffc189a5*/\n v5 = *DxeIpl; /*0xffc189ac*/\n if ( *DxeIpl ) /*0xffc189ac*/\n {\n v6 = (char *)(DxeIpl - v2); /*0xffc189b2*/\n do /*0xffc189c1*/\n {\n if ( !n7 ) /*0xffc189b6*/\n break; /*0xffc189b6*/\n *v2++ = v5; /*0xffc189b8*/\n --n7; /*0xffc189bb*/\n v5 = v2[(_DWORD)v6]; /*0xffc189bc*/\n }\n while ( v5 ); /*0xffc189c1*/\n }\n *v2 = 0; /*0xffc189c3*/\n return 0; /*0xffc1896e*/\n}","refs":[{"addr":"0xffc18947","name":"DxeIplLzmaNormalize"},{"addr":"0xffc18924","name":"DxeIplLzmaGetNumBits"}]} + v2 = v1; /*0xffc18963*/ + if ( !v1 ) /*0xffc18967*/ + return -2147483646; /*0xffc18969*/ + if ( !DxeIpl ) /*0xffc18977*/ + return -2147483646; /*0xffc18979*/ + n7 = DxeIplLzmaNormalize(DxeIpl); /*0xffc18988*/ + if ( n7 > 7 ) /*0xffc1898d*/ + n7 = 7; /*0xffc18991*/ + if ( DxeIplLzmaGetNumBits((unsigned int)DxeIpl, n7 + 1) ) /*0xffc18999*/ + return -2147483633; /*0xffc189a5*/ + v5 = *DxeIpl; /*0xffc189ac*/ + if ( *DxeIpl ) /*0xffc189ac*/ + { + v6 = (char *)(DxeIpl - v2); /*0xffc189b2*/ + do /*0xffc189c1*/ + { + if ( !n7 ) /*0xffc189b6*/ + break; /*0xffc189b6*/ + *v2++ = v5; /*0xffc189b8*/ + --n7; /*0xffc189bb*/ + v5 = v2[(_DWORD)v6]; /*0xffc189bc*/ + } + while ( v5 ); /*0xffc189c1*/ + } + *v2 = 0; /*0xffc189c3*/ + return 0; /*0xffc1896e*/ +} -{"addr":"0xffc189e9","code":"int __thiscall DxeIplGetModuleBase(void *this)\n{\n int ( **v1)(int); // eax\n\n v1 = (int ( **)(int))DxeIplGetPeiBootMode(this); /*0xffc189e9*/\n return v1[4](5); /*0xffc189f4*/\n}","refs":[{"addr":"0xffc16386","name":"DxeIplGetPeiBootMode"}]} +int __thiscall DxeIplGetModuleBase(void *this) +{ + int ( **v1)(int); // eax -{"addr":"0xffc189f5","code":"__int16 __thiscall DxeIplInitGlobalFlags(void *this)\n{\n *(_WORD *)(DxeIplGetModuleBase(this) + 1024064) = 1280; /*0xffc189ff*/\n return 1280; /*0xffc18a09*/\n}","refs":[{"addr":"0xffc189e9","name":"DxeIplGetModuleBase"}]} + v1 = (int ( **)(int))DxeIplGetPeiBootMode(this); /*0xffc189e9*/ + return v1[4](5); /*0xffc189f4*/ +} +__int16 __thiscall DxeIplInitGlobalFlags(void *this) +{ + *(_WORD *)(DxeIplGetModuleBase(this) + 1024064) = 1280; /*0xffc189ff*/ + return 1280; /*0xffc18a09*/ +} diff --git a/MdeModulePkg/Universal/PCD/Pei/Service.c/PcdPeim/PcdPeim.c b/MdeModulePkg/Universal/PCD/Pei/Service.c/PcdPeim/PcdPeim.c index 37b32f2..4d8cb9e 100644 --- a/MdeModulePkg/Universal/PCD/Pei/Service.c/PcdPeim/PcdPeim.c +++ b/MdeModulePkg/Universal/PCD/Pei/Service.c/PcdPeim/PcdPeim.c @@ -1,171 +1,264 @@ -// -// PcdPeim.efi - Full Decompilation -// Source: IDA Pro MCP port 13394 -// Functions: 81 -// - #include #include -{"addr":"0xffe4a6b8","code":"char *BaseCopyMem(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe4a6c2*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe4a6d0*/\n {\n src_1 = &src[count - 1]; /*0xffe4a6e4*/\n dst_1 = &dst[count - 1]; /*0xffe4a6e6*/\n }\n else\n {\n count_1 = count & 3; /*0xffe4a6d4*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe4a6dd*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe4a6dd*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe4a6dd*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe4a6ed*/\n return dst; /*0xffe4a6f4*/\n}"} +char * +BaseCopyMem ( + char *dst, + char *src, + unsigned int count + ) +{ + unsigned int count_1; + char *dst_1; + char *src_1; -{"addr":"0xffe4a6f8","code":"void *BaseZeroMem(void *buf, unsigned int count)\n{\n memset(buf, 0, count); /*0xffe4a70f*/\n return buf; /*0xffe4a716*/\n}"} + count_1 = count; + if (src < dst && &src[count - 1] >= dst) { + src_1 = &src[count - 1]; + dst_1 = &dst[count - 1]; + } else { + count_1 = count & 3; + qmemcpy (dst, src, 4 * (count >> 2)); + src_1 = &src[4 * (count >> 2)]; + dst_1 = &dst[4 * (count >> 2)]; + } + qmemcpy (dst_1, src_1, count_1); + return dst; +} -{"addr":"0xffe4a718","code":"void *BaseSetMem8(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe4a725*/\n return buf; /*0xffe4a72b*/\n}"} +void * +BaseZeroMem ( + void *buf, + unsigned int count + ) +{ + memset (buf, 0, count); + return buf; +} -{"addr":"0xffe4a738","code":"int BaseSetMem32(int a1, int a2, int a3, int a4)\n{\n do /*0xffe4a751*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe4a749*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe4a74d*/\n }\n while ( a2 ); /*0xffe4a751*/\n return a1; /*0xffe4a755*/\n}"} +void * +BaseSetMem8 ( + void *buf, + unsigned int count, + char value + ) +{ + memset (buf, value, count); + return buf; +} -{"addr":"0xffe4a758","code":"void *BaseSetMem(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe4a765*/\n return buf; /*0xffe4a76b*/\n}"} +int +BaseSetMem32 ( + int a1, + int a2, + int a3, + int a4 + ) +{ + do { + *(_DWORD *)(a1 + 8 * a2 - 8) = a3; + *(_DWORD *)(a1 + 8 * a2-- - 4) = a4; + } while (a2); + return a1; +} -{"addr":"0xffe4a76d","code":"EFI_STATUS PcdPeimEntryPoint(EFI_HANDLE PeiServices, EFI_SYSTEM_TABLE *PeiServicesTbl)\n{\n int ServicesTbl; // eax\n int Status1; // eax\n int DebugLib; // eax\n int PeiServicesTable; // eax\n int Status2; // eax\n EFI_STATUS Status2_1; // esi\n int DebugLibPtr; // eax\n\n PeiPcdInit(PeiServices); /*0xffe4a77a*/\n ServicesTbl = GetPeiServicesTable(); /*0xffe4a77f*/\n Status1 = (*(int ( **)(int, void *))(*(_DWORD *)ServicesTbl + 24))(ServicesTbl, &unk_FFE4D230); /*0xffe4a78c*/\n if ( Status1 < 0 ) /*0xffe4a7a2*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status1); /*0xffe4a7ab*/\n DebugLib = DebugGetDebugLib(); /*0xffe4a7b3*/\n if ( DebugLib ) /*0xffe4a7ba*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4a7c3*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 158,\n \"!EFI_ERROR (Status)\");\n }\n PeiServicesTable = GetPeiServicesTable(); /*0xffe4a7c9*/\n Status2 = (*(int ( **)(int, void *))(*(_DWORD *)PeiServicesTable + 24))(PeiServicesTable, &unk_FFE4D218); /*0xffe4a7d6*/\n Status2_1 = Status2; /*0xffe4a7d9*/\n if ( Status2 < 0 ) /*0xffe4a7df*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status2); /*0xffe4a7e8*/\n DebugLibPtr = DebugGetDebugLib(); /*0xffe4a7f0*/\n if ( DebugLibPtr ) /*0xffe4a7f7*/\n (*(void ( **)(const char *, int, const char *))(DebugLibPtr + 4))( /*0xffe4a800*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 164,\n \"!EFI_ERROR (Status)\");\n }\n return Status2_1; /*0xffe4a80c*/\n}","refs":[{"addr":"0xffe4b49e","name":"PeiPcdInit"},{"addr":"0xffe4c4ef","name":"GetPeiServicesTable"},{"addr":"0xffe4d230","name":"unk_FFE4D230"},{"addr":"0xffe4be49","name":"DebugPrint"},{"addr":"0xffe4c598","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5d0","name":"aEHsMdemodulepk","string":"e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c"},{"addr":"0xffe4c5bc","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"},{"addr":"0xffe4d218","name":"unk_FFE4D218"}]} +void * +BaseSetMem ( + void *buf, + unsigned int count, + int value + ) +{ + memset32 (buf, value, count); + return buf; +} -{"addr":"0xffe4a80d","code":"int PeiPcdGet8Ppi(unsigned int a1, int *a2)\n{\n return PeiPcdGetInfo(0, a1, a2); /*0xffe4a81d*/\n}","refs":[{"addr":"0xffe4b206","name":"PeiPcdGetInfo"}]} +EFI_STATUS +PcdPeimEntryPoint ( + EFI_HANDLE PeiServices, + EFI_SYSTEM_TABLE *PeiServicesTbl + ) +{ + int ServicesTbl; + int Status1; + int DebugLib; + int PeiServicesTable; + int Status2; + EFI_STATUS Status2_1; + int DebugLibPtr; -{"addr":"0xffe4a81e","code":"int PeiPcdGet32Ppi(int a1, unsigned int a2, int *a3)\n{\n return PeiPcdGetInfo(a1, a2, a3); /*0xffe4a830*/\n}","refs":[{"addr":"0xffe4b206","name":"PeiPcdGetInfo"}]} + PeiPcdInit (PeiServices); + ServicesTbl = GetPeiServicesTable (); + Status1 = (*(int ( **)(int, void *))(*(_DWORD *)ServicesTbl + 24))(ServicesTbl, &unk_FFE4D230); + if (Status1 < 0) { + DebugPrint (0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status1); + DebugLib = DebugGetDebugLib (); + if (DebugLib) { + (*(void ( **)(const char *, int, const char *))(DebugLib + 4)) ( + "e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c", + 158, + "!EFI_ERROR (Status)" + ); + } + } -{"addr":"0xffe4a831","code":"int PeiPcdGetSkuId()\n{\n return *(_DWORD *)(sub_FFE4BCAC() + 24); /*0xffe4a839*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"}]} + PeiServicesTable = GetPeiServicesTable (); + Status2 = (*(int ( **)(int, void *))(*(_DWORD *)PeiServicesTable + 24))(PeiServicesTable, &unk_FFE4D218); + Status2_1 = Status2; + if (Status2 < 0) { + DebugPrint (0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status2); + DebugLibPtr = DebugGetDebugLib (); + if (DebugLibPtr) { + (*(void ( **)(const char *, int, const char *))(DebugLibPtr + 4)) ( + "e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c", + 164, + "!EFI_ERROR (Status)" + ); + } + } -{"addr":"0xffe4a83a","code":"int PeiPcdSetSku(int SkuId)\n{\n int SkuId_1; // edi\n _DWORD *PcdDatabase; // esi\n unsigned int SkuIndex; // ecx\n int SkuId_2; // eax\n unsigned int *SkuTable; // eax\n unsigned int TableFlag; // ebx\n unsigned int SkuIndex_1; // edx\n _DWORD *SkuEntry; // eax\n\n SkuId_1 = SkuId; /*0xffe4a849*/\n PcdDatabase = (_DWORD *)PeiPcdGetPcdDb(); /*0xffe4a84c*/\n SkuIndex = 0; /*0xffe4a84e*/\n SkuId_2 = PcdDatabase[6]; /*0xffe4a854*/\n if ( SkuId != SkuId_2 || PcdDatabase[7] ) /*0xffe4a85b*/\n {\n if ( *((_QWORD *)PcdDatabase + 3) ) /*0xffe4a854*/\n {\n DebugPrint(0x80000000, \"PcdPei - The SKU Id could be changed only once.\"); /*0xffe4a874*/\n DebugPrint( /*0xffe4a889*/\n 0x80000000,\n \"PcdPei - The SKU Id was set to 0x%lx already, it could not be set to 0x%lx any more.\",\n PcdDatabase[6],\n PcdDatabase[7]);\n SkuId_2 = DebugGetDebugLib(); /*0xffe4a891*/\n if ( SkuId_2 ) /*0xffe4a898*/\n return (*(int ( **)(const char *, int, const char *))(SkuId_2 + 4))( /*0xffe4a8a9*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 281,\n \"((BOOLEAN)(0==1))\");\n }\n else\n {\n SkuTable = (_DWORD *)((char *)PcdDatabase + PcdDatabase[14]); /*0xffe4a8b4*/\n TableFlag = SkuTable[1]; /*0xffe4a8b6*/\n SkuIndex_1 = *SkuTable; /*0xffe4a8b9*/\n if ( TableFlag || SkuIndex_1 ) /*0xffe4a8c3*/\n {\n for ( SkuEntry = SkuTable + 2; ; SkuEntry += 2 ) /*0xffe4a8c5*/\n {\n if ( SkuId_1 == *SkuEntry ) /*0xffe4a8ca*/\n {\n SkuId_1 = SkuId; /*0xffe4a8d1*/\n if ( !SkuEntry[1] ) /*0xffe4a8ce*/\n break; /*0xffe4a8ce*/\n }\n ++SkuIndex; /*0xffe4a8d6*/\n if ( !TableFlag && SkuIndex >= SkuIndex_1 ) /*0xffe4a8e4*/\n return DebugPrint(64, \"PcdPei - Invalid input SkuId, the default SKU Id will be still used.\\n\"); /*0xffe4a8e4*/\n }\n SkuId_2 = DebugPrint(64, \"PcdPei - Set current SKU Id to 0x%lx.\\n\", SkuId); /*0xffe4a906*/\n PcdDatabase[6] = SkuId; /*0xffe4a90e*/\n PcdDatabase[7] = 0; /*0xffe4a911*/\n }\n else\n {\n return DebugPrint(64, \"PcdPei - Invalid input SkuId, the default SKU Id will be still used.\\n\"); /*0xffe4a8e6*/\n }\n }\n }\n return SkuId_2; /*0xffe4a8f4*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4be49","name":"DebugPrint"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5d0","name":"aEHsMdemodulepk","string":"e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c"}]} + return Status2_1; +} -{"addr":"0xffe4a916","code":"char PeiPcdGet8(unsigned int a1)\n{\n return *(_BYTE *)sub_FFE4BA86(a1, 1u); /*0xffe4a924*/\n}","refs":[{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"}]} +int +PeiPcdGet8Ppi ( + unsigned int a1, + int *a2 + ) +{ + return PeiPcdGetInfo (0, a1, a2); +} -{"addr":"0xffe4a925","code":"__int16 PeiPcdGet16(unsigned int a1)\n{\n int TokenValue; // esi\n int DebugLib; // eax\n\n TokenValue = PeiPcdGetTokenValue(a1, 2u); /*0xffe4be92*/\n if ( !TokenValue ) /*0xffe4be96*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4be98*/\n if ( DebugLib ) /*0xffe4be9f*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bead*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 38,\n \"Buffer != ((void *) 0)\");\n }\n return *(_WORD *)TokenValue; /*0xffe4beb7*/\n}","refs":[{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} +int +PeiPcdGet32Ppi ( + int a1, + unsigned int a2, + int *a3 + ) +{ + return PeiPcdGetInfo (a1, a2, a3); +} -{"addr":"0xffe4a938","code":"int PeiPcdGet32(unsigned int a1)\n{\n int TokenValue; // esi\n int DebugLib; // eax\n\n TokenValue = PeiPcdGetTokenValue(a1, 4u); /*0xffe4beb9*/\n if ( !TokenValue ) /*0xffe4bebd*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bebf*/\n if ( DebugLib ) /*0xffe4bec6*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bed7*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 141,\n \"Buffer != ((void *) 0)\");\n }\n return *(_DWORD *)TokenValue; /*0xffe4bee0*/\n}","refs":[{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} +int +PeiPcdGetSkuId ( + VOID + ) +{ + return *(_DWORD *)(PeiPcdGetPcdDb () + 24); +} -{"addr":"0xffe4a94b","code":"__int64 PeiPcdGet64(unsigned int a1)\n{\n void *TokenValue; // eax\n\n TokenValue = (void *)PeiPcdGetTokenValue(a1, 8u); /*0xffe4a952*/\n return BaseReadUnaligned64(TokenValue);\n}","refs":[{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"},{"addr":"0xffe4bee1","name":"BaseReadUnaligned64"}]} +int +PeiPcdSetSku ( + int SkuId + ) +{ + int SkuId_1; + _DWORD *PcdDatabase; + unsigned int SkuIndex; + int SkuId_2; + unsigned int *SkuTable; + unsigned int TableFlag; + unsigned int SkuIndex_1; + _DWORD *SkuEntry; -{"addr":"0xffe4a95e","code":"int PeiPcdGetPtr(unsigned int a1)\n{\n return sub_FFE4BA86(a1, 0);\n}","refs":[{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"}]} - -{"addr":"0xffe4a969","code":"int PeiPcdGetSize(unsigned int SizeOut)\n{\n unsigned int TokenCopy; // edi\n unsigned int SizeOut_1; // esi\n int PcdDatabase; // ebx\n unsigned int TokenIndex; // edi\n int DebugLib; // eax\n int result; // eax\n\n TokenCopy = SizeOut; /*0xffe4a96f*/\n SizeOut_1 = SizeOut; /*0xffe4a972*/\n PcdDatabase = PeiPcdGetPcdDb(); /*0xffe4a979*/\n TokenIndex = TokenCopy - 1; /*0xffe4a97b*/\n if ( SizeOut_1 >= (unsigned int)*(unsigned __int16 *)(PcdDatabase + 64) + 1 ) /*0xffe4a983*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4a985*/\n if ( DebugLib ) /*0xffe4a98c*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4a99d*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 459,\n \"TokenNumber + 1 < (LocalTokenCount + 1)\");\n }\n result = *(_BYTE *)(*(_DWORD *)(PcdDatabase + 36) + 4 *TokenIndex + PcdDatabase + 3) & 0xF; /*0xffe4a9ae*/\n if ( (*(_BYTE *)(*(_DWORD *)(PcdDatabase + 36) + 4 *TokenIndex + PcdDatabase + 3) & 0xF) == 0 ) /*0xffe4a9b1*/\n return PeiPcdGetSkuSize(TokenIndex, &SizeOut, (_DWORD *)PcdDatabase); /*0xffe4a9b9*/\n return result; /*0xffe4a9bf*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5d0","name":"aEHsMdemodulepk","string":"e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c"},{"addr":"0xffe4adf5","name":"PeiPcdGetSkuSize"}]} - -{"addr":"0xffe4a9c4","code":"char PeiPcdGet8Ex(int a1, int a2)\n{\n unsigned int v2; // eax\n\n v2 = sub_FFE4BC27(a1, a2); /*0xffe4a9cc*/\n return *(_BYTE *)sub_FFE4BA86(v2, 1u); /*0xffe4a9dd*/\n}","refs":[{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"}]} - -{"addr":"0xffe4a9de","code":"__int16 PeiPcdGet16Ex(int a1, int a2)\n{\n unsigned int v2; // eax\n int TokenValue; // esi\n int DebugLib; // eax\n\n v2 = PeiPcdGetExTokenNumber(a1, a2); /*0xffe4a9e6*/\n TokenValue = PeiPcdGetTokenValue(v2, 2u); /*0xffe4be92*/\n if ( !TokenValue ) /*0xffe4be96*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4be98*/\n if ( DebugLib ) /*0xffe4be9f*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bead*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 38,\n \"Buffer != ((void *) 0)\");\n }\n return *(_WORD *)TokenValue; /*0xffe4beb7*/\n}","refs":[{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4a9fc","code":"int PeiPcdGet32Ex(int a1, int a2)\n{\n unsigned int v2; // eax\n int TokenValue; // esi\n int DebugLib; // eax\n\n v2 = PeiPcdGetExTokenNumber(a1, a2); /*0xffe4aa04*/\n TokenValue = PeiPcdGetTokenValue(v2, 4u); /*0xffe4beb9*/\n if ( !TokenValue ) /*0xffe4bebd*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bebf*/\n if ( DebugLib ) /*0xffe4bec6*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bed7*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 141,\n \"Buffer != ((void *) 0)\");\n }\n return *(_DWORD *)TokenValue; /*0xffe4bee0*/\n}","refs":[{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4aa1a","code":"__int64 PeiPcdGet64Ex(int a1, int a2)\n{\n unsigned int v2; // eax\n void *TokenValue; // eax\n\n v2 = PeiPcdGetExTokenNumber(a1, a2); /*0xffe4aa22*/\n TokenValue = (void *)PeiPcdGetTokenValue(v2, 8u); /*0xffe4aa2c*/\n return BaseReadUnaligned64(TokenValue);\n}","refs":[{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"},{"addr":"0xffe4bee1","name":"BaseReadUnaligned64"}]} - -{"addr":"0xffe4aa38","code":"int PeiPcdGetPtrEx(int a1, int a2)\n{\n unsigned int v2; // eax\n\n v2 = sub_FFE4BC27(a1, a2); /*0xffe4aa40*/\n return sub_FFE4BA86(v2, 0);\n}","refs":[{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4ba86","name":"PeiPcdGetTokenValue"}]} - -{"addr":"0xffe4aa4e","code":"int PeiPcdGetSizeEx(int a1, int a2)\n{\n unsigned int v2; // eax\n\n v2 = PeiPcdGetExTokenNumber(a1, a2); /*0xffe4aa56*/\n return PeiPcdGetSize(v2); /*0xffe4aa62*/\n}","refs":[{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4a969","name":"PeiPcdGetSize"}]} - -{"addr":"0xffe4aa63","code":"int PeiPcdSet8(unsigned int a1, ...)\n{\n unsigned int v2; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a1);\n v2 = 1; /*0xffe4aa73*/\n return PeiPcdSetTokenValue(a1, (int)va, &v2, 0); /*0xffe4aa83*/\n}","refs":[{"addr":"0xffe4b85f","name":"PeiPcdSetTokenValue"}]} - -{"addr":"0xffe4aa85","code":"int PeiPcdSet16(unsigned int a1, ...)\n{\n unsigned int n2; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a1);\n n2 = 2; /*0xffe4aa95*/\n return PeiPcdSetTokenValue(a1, (int)va, &n2, 0); /*0xffe4aaa5*/\n}","refs":[{"addr":"0xffe4b85f","name":"PeiPcdSetTokenValue"}]} - -{"addr":"0xffe4aaa7","code":"int PeiPcdSet32(unsigned int a1, ...)\n{\n unsigned int n4; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a1);\n n4 = 4; /*0xffe4aab7*/\n return PeiPcdSetTokenValue(a1, (int)va, &n4, 0); /*0xffe4aac7*/\n}","refs":[{"addr":"0xffe4b85f","name":"PeiPcdSetTokenValue"}]} - -{"addr":"0xffe4aac9","code":"int PeiPcdSet64(unsigned int a1, ...)\n{\n unsigned int n8; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a1);\n n8 = 8; /*0xffe4aad9*/\n return PeiPcdSetTokenValue(a1, (int)va, &n8, 0); /*0xffe4aae9*/\n}","refs":[{"addr":"0xffe4b85f","name":"PeiPcdSetTokenValue"}]} - -{"addr":"0xffe4aaeb","code":"int PeiPcdSetPtr(unsigned int a1, unsigned int *a2, int va)\n{\n return PeiPcdSetTokenValue(a1, va, a2, 1); /*0xffe4ab00*/\n}","refs":[{"addr":"0xffe4b85f","name":"PeiPcdSetTokenValue"}]} - -{"addr":"0xffe4ab01","code":"int PeiPcdSet8Ex(int a1, unsigned int a2, ...)\n{\n unsigned int n2; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+14h] [ebp+10h] BYREF\n\n va_start(va, a2);\n n2 = 1; /*0xffe4ab14*/\n return PeiPcdSetExTokenValue(a2, a1, (int)va, &n2, 0); /*0xffe4ab26*/\n}","refs":[{"addr":"0xffe4ba3c","name":"PeiPcdSetExTokenValue"}]} - -{"addr":"0xffe4ab28","code":"int PeiPcdSet16Ex(int a1, unsigned int a2, ...)\n{\n unsigned int n2; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+14h] [ebp+10h] BYREF\n\n va_start(va, a2);\n n2 = 2; /*0xffe4ab3b*/\n return PeiPcdSetExTokenValue(a2, a1, (int)va, &n2, 0); /*0xffe4ab4d*/\n}","refs":[{"addr":"0xffe4ba3c","name":"PeiPcdSetExTokenValue"}]} - -{"addr":"0xffe4ab4f","code":"int PeiPcdSet32Ex(int a1, unsigned int a2, ...)\n{\n unsigned int n4; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+14h] [ebp+10h] BYREF\n\n va_start(va, a2);\n n4 = 4; /*0xffe4ab62*/\n return PeiPcdSetExTokenValue(a2, a1, (int)va, &n4, 0); /*0xffe4ab74*/\n}","refs":[{"addr":"0xffe4ba3c","name":"PeiPcdSetExTokenValue"}]} - -{"addr":"0xffe4ab76","code":"int PeiPcdSet64Ex(int a1, unsigned int a2, ...)\n{\n unsigned int n8; // [esp+0h] [ebp-4h] BYREF\n va_list va; // [esp+14h] [ebp+10h] BYREF\n\n va_start(va, a2);\n n8 = 8; /*0xffe4ab89*/\n return PeiPcdSetExTokenValue(a2, a1, (int)va, &n8, 0); /*0xffe4ab9b*/\n}","refs":[{"addr":"0xffe4ba3c","name":"PeiPcdSetExTokenValue"}]} - -{"addr":"0xffe4ab9d","code":"int PeiPcdSetPtrEx(int a1, unsigned int a2, unsigned int *p_n2, int va)\n{\n return PeiPcdSetExTokenValue(a2, a1, va, p_n2, 1); /*0xffe4abb7*/\n}","refs":[{"addr":"0xffe4ba3c","name":"PeiPcdSetExTokenValue"}]} - -{"addr":"0xffe4abb8","code":"int PeiPcdSetCallback(int a1, unsigned int a2, int a3)\n{\n if ( a3 ) /*0xffe4abbd*/\n return PeiPcdSetCallbackWorker(a2, a1, a3, 1); /*0xffe4abd3*/\n else\n return -2147483646; /*0xffe4abbf*/\n}","refs":[{"addr":"0xffe4b2a6","name":"PeiPcdSetCallbackWorker"}]} - -{"addr":"0xffe4abdb","code":"int PeiPcdNotifySet(int a1, unsigned int a2, int a3)\n{\n if ( a3 ) /*0xffe4abe0*/\n return PeiPcdSetCallbackWorker(a2, a1, a3, 0); /*0xffe4abf6*/\n else\n return -2147483646; /*0xffe4abe2*/\n}","refs":[{"addr":"0xffe4b2a6","name":"PeiPcdSetCallbackWorker"}]} - -{"addr":"0xffe4abfe","code":"int PeiPcdGetNextTokenSpace(int TokenSpaceGuid, unsigned int *TokenNumber)\n{\n int PcdDatabase; // esi\n int ExTokenCount; // eax\n unsigned int LocalTokenCount; // edx\n int ExMapBase; // edi\n unsigned int LocalTokenCount_1; // eax\n unsigned int GuidEntry; // eax\n unsigned int EntryCount; // edx\n unsigned int EntryCount_1; // ecx\n int GuidIdx; // ebx\n int TokenSpaceTbl; // edi\n unsigned __int16 *TblEntry; // esi\n unsigned __int16 *NextEntry; // ebp\n\n PcdDatabase = PeiPcdGetPcdDb(); /*0xffe4ac05*/\n ExTokenCount = *(unsigned __int16 *)(PcdDatabase + 66); /*0xffe4ac07*/\n LocalTokenCount = *(unsigned __int16 *)(PcdDatabase + 64) - ExTokenCount; /*0xffe4ac12*/\n ExMapBase = PcdDatabase + *(_DWORD *)(PcdDatabase + 44); /*0xffe4ac14*/\n if ( TokenSpaceGuid ) /*0xffe4ac1b*/\n {\n if ( !(_WORD)ExTokenCount ) /*0xffe4ac47*/\n return -2147483634; /*0xffe4ac47*/\n GuidEntry = ScanGuid( /*0xffe4ac57*/\n PcdDatabase + *(_DWORD *)(PcdDatabase + 44),\n 16 * *(unsigned __int16 *)(PcdDatabase + 68),\n TokenSpaceGuid);\n if ( !GuidEntry ) /*0xffe4ac61*/\n return -2147483634; /*0xffe4ac68*/\n EntryCount = *(unsigned __int16 *)(PcdDatabase + 66); /*0xffe4ac6a*/\n EntryCount_1 = 0; /*0xffe4ac73*/\n GuidIdx = (int)(GuidEntry - ExMapBase) >> 4; /*0xffe4ac75*/\n TokenSpaceTbl = PcdDatabase + *(_DWORD *)(PcdDatabase + 40); /*0xffe4ac78*/\n if ( *(_WORD *)(PcdDatabase + 66) ) /*0xffe4ac6a*/\n {\n for ( TblEntry = (unsigned __int16 *)(TokenSpaceTbl + 6); *TblEntry != GuidIdx; TblEntry += 4 ) /*0xffe4ac7f*/\n {\n if ( ++EntryCount_1 >= EntryCount ) /*0xffe4ac8f*/\n return -2147483634; /*0xffe4ac8f*/\n }\n if ( !*TokenNumber ) /*0xffe4ac97*/\n {\nLABEL_16:\n *TokenNumber = *(_DWORD *)(TokenSpaceTbl + 8 *EntryCount_1); /*0xffe4ac9d*/\n return 0; /*0xffe4aca4*/\n }\n while ( EntryCount_1 < EntryCount /*0xffe4acb2*/\n && (*(_DWORD *)(TokenSpaceTbl + 8 *EntryCount_1) != *TokenNumber\n || *(unsigned __int16 *)(TokenSpaceTbl + 8 *EntryCount_1 + 6) != GuidIdx) )\n ++EntryCount_1; /*0xffe4acb4*/\n if ( EntryCount_1 < EntryCount ) /*0xffe4acbb*/\n {\n NextEntry = (unsigned __int16 *)(TokenSpaceTbl + 6 + 8 *EntryCount_1); /*0xffe4acc0*/\n while ( 1 ) /*0xffe4acc4*/\n {\n ++EntryCount_1; /*0xffe4acc4*/\n NextEntry += 4; /*0xffe4acc5*/\n if ( EntryCount_1 == EntryCount ) /*0xffe4acca*/\n break; /*0xffe4acca*/\n if ( *NextEntry == GuidIdx ) /*0xffe4acd2*/\n goto LABEL_16; /*0xffe4acd2*/\n if ( EntryCount_1 >= EntryCount ) /*0xffe4acd6*/\n return -2147483634; /*0xffe4acd6*/\n }\n *TokenNumber = 0; /*0xffe4acda*/\n }\n }\n return -2147483634; /*0xffe4acdd*/\n }\n else\n {\n if ( *TokenNumber > LocalTokenCount ) /*0xffe4ac25*/\n return -2147483634; /*0xffe4ac2c*/\n LocalTokenCount_1 = *TokenNumber + 1; /*0xffe4ac31*/\n *TokenNumber = LocalTokenCount_1; /*0xffe4ac32*/\n if ( LocalTokenCount_1 > LocalTokenCount ) /*0xffe4ac36*/\n {\n *TokenNumber = 0; /*0xffe4ac38*/\n return -2147483634; /*0xffe4ac3b*/\n }\n return 0; /*0xffe4ac3d*/\n }\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4c374","name":"ScanGuid"}]} - -{"addr":"0xffe4ace7","code":"int PeiPcdGetNextToken(int *TokenSpaceGuid)\n{\n int *TokenSpaceGuid_1; // edi\n int DebugLib; // eax\n int PcdDatabase; // esi\n unsigned int ExMapTable; // ebx\n int TokenSpaceTable; // ebp\n int NextTokenSpace; // eax\n unsigned int GuidEntry; // eax\n unsigned int Index; // ecx\n int TokenSpaceIdx; // ebx\n unsigned __int16 *TableEntry; // edx\n unsigned int Index_1; // eax\n _WORD *EntryCursor; // edx\n _WORD *PrevEntry; // eax\n int GuidIndex; // [esp+8h] [ebp-4h]\n unsigned int Index_2; // [esp+8h] [ebp-4h]\n\n TokenSpaceGuid_1 = TokenSpaceGuid; /*0xffe4acea*/\n if ( !TokenSpaceGuid ) /*0xffe4acf0*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4acf2*/\n if ( DebugLib ) /*0xffe4acf9*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4ad0a*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 1213,\n \"Guid != ((void *) 0)\");\n }\n PcdDatabase = PeiPcdGetPcdDb(); /*0xffe4ad15*/\n if ( !*(_WORD *)(PcdDatabase + 66) ) /*0xffe4ad19*/\n return -2147483634; /*0xffe4ad24*/\n ExMapTable = PcdDatabase + *(_DWORD *)(PcdDatabase + 44); /*0xffe4ad31*/\n TokenSpaceTable = PcdDatabase + *(_DWORD *)(PcdDatabase + 40); /*0xffe4ad33*/\n if ( !*TokenSpaceGuid ) /*0xffe4ad35*/\n {\n NextTokenSpace = ExMapTable + 16 * *(unsigned __int16 *)(TokenSpaceTable + 6); /*0xffe4ad40*/\n goto LABEL_22; /*0xffe4ad42*/\n }\n GuidEntry = ScanGuid(ExMapTable, 16 * *(unsigned __int16 *)(PcdDatabase + 68), *TokenSpaceGuid); /*0xffe4ad52*/\n if ( !GuidEntry ) /*0xffe4ad5a*/\n return -2147483634; /*0xffe4ad5a*/\n Index = 0; /*0xffe4ad62*/\n GuidIndex = (int)(GuidEntry - ExMapTable) >> 4; /*0xffe4ad67*/\n if ( !*(_WORD *)(PcdDatabase + 66) ) /*0xffe4ad6b*/\n return -2147483634; /*0xffe4ad71*/\n TokenSpaceIdx = (int)(GuidEntry - ExMapTable) >> 4; /*0xffe4ad73*/\n for ( TableEntry = (unsigned __int16 *)(TokenSpaceTable + 6); ; TableEntry += 4 ) /*0xffe4ad77*/\n {\n ++Index; /*0xffe4ad7d*/\n Index_1 = *(unsigned __int16 *)(PcdDatabase + 66); /*0xffe4ad80*/\n if ( *TableEntry == GuidIndex ) /*0xffe4ad84*/\n break; /*0xffe4ad84*/\n if ( Index >= Index_1 ) /*0xffe4ad8b*/\n return -2147483634; /*0xffe4ad8b*/\n }\n if ( Index >= Index_1 ) /*0xffe4ad91*/\n {\nLABEL_24:\n *TokenSpaceGuid_1 = 0; /*0xffe4ade7*/\n return -2147483634; /*0xffe4adea*/\n }\n EntryCursor = (_WORD *)(TokenSpaceTable + 8 *Index + 6); /*0xffe4ad9a*/\n while ( (unsigned __int16)*EntryCursor == TokenSpaceIdx ) /*0xffe4ada1*/\n {\nLABEL_23:\n ++Index; /*0xffe4addb*/\n EntryCursor += 4; /*0xffe4ade0*/\n if ( Index >= *(unsigned __int16 *)(PcdDatabase + 66) ) /*0xffe4ade5*/\n goto LABEL_24; /*0xffe4ade5*/\n }\n Index_2 = 0; /*0xffe4ada3*/\n if ( Index ) /*0xffe4adaa*/\n {\n PrevEntry = (_WORD *)(TokenSpaceTable + 6); /*0xffe4adac*/\n do /*0xffe4adb5*/\n {\n TokenSpaceGuid_1 = TokenSpaceGuid; /*0xffe4adb5*/\n if ( *PrevEntry == *EntryCursor ) /*0xffe4adb9*/\n goto LABEL_23; /*0xffe4adb9*/\n ++Index_2; /*0xffe4adbb*/\n PrevEntry += 4; /*0xffe4adbf*/\n }\n while ( Index_2 < Index ); /*0xffe4adb5*/\n }\n NextTokenSpace = PcdDatabase /*0xffe4adc8*/\n + *(_DWORD *)(PcdDatabase + 44)\n + 16 * *(unsigned __int16 *)(TokenSpaceTable + 8 *Index + 6);\nLABEL_22:\n *TokenSpaceGuid_1 = NextTokenSpace; /*0xffe4add5*/\n return 0; /*0xffe4adf1*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5d0","name":"aEHsMdemodulepk","string":"e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c"},{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4c374","name":"ScanGuid"}]} - -{"addr":"0xffe4adf5","code":"int PeiPcdGetSkuSize(unsigned int TokenIndex, _DWORD *SizeOut, _DWORD *PcdDatabase)\n{\n int DynIndex; // ebx\n int LocalTokenNum; // ebp\n int DebugLib; // eax\n char *SizeTable; // esi\n int result; // eax\n unsigned int *SkuTablePtr; // eax\n unsigned int SkuIndex; // ecx\n unsigned int SkuIndex_1; // edx\n int CurSkuId; // ebp\n _DWORD *SkuEntry; // eax\n int CurSkuSubId; // edi\n char *SizeTable_1; // [esp+18h] [ebp-4h]\n _DWORD *PcdDb; // [esp+20h] [ebp+4h]\n\n DynIndex = PeiPcdGetDynTokenCount(TokenIndex, (int)PcdDatabase); /*0xffe4ae14*/\n LocalTokenNum = *(_DWORD *)((char *)&PcdDatabase[TokenIndex] + PcdDatabase[9]); /*0xffe4ae19*/\n if ( (LocalTokenNum & 0xF000000) != 0 ) /*0xffe4ae22*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4ae24*/\n if ( DebugLib ) /*0xffe4ae2b*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4ae3c*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 1311,\n \"(LocalTokenNumber & ((0x0U << 24) | (0x1U << 24) | (0x2U << 24) | (0x4U << 24) | (0x8U << 24))) == (0x0U << 24)\");\n }\n SizeTable = (char *)PcdDatabase + PcdDatabase[13]; /*0xffe4ae49*/\n SizeTable_1 = SizeTable; /*0xffe4ae4b*/\n result = *(unsigned __int16 *)&SizeTable[2 *DynIndex]; /*0xffe4ae4f*/\n *SizeOut = result; /*0xffe4ae53*/\n if ( (LocalTokenNum & 0x40000000) == 0 ) /*0xffe4ae5b*/\n {\n if ( (LocalTokenNum & 0x20000000) != 0 /*0xffe4ae85*/\n && ((SkuTablePtr = (unsigned int *)PeiPcdGetSkuTable(TokenIndex, (int)PcdDatabase),\n SkuIndex = 0,\n SkuIndex_1 = *SkuTablePtr,\n (PcdDb = (_DWORD *)SkuTablePtr[1]) != 0)\n || SkuIndex_1) )\n {\n CurSkuId = PcdDatabase[6]; /*0xffe4ae87*/\n SkuEntry = SkuTablePtr + 2; /*0xffe4ae8a*/\n CurSkuSubId = PcdDatabase[7]; /*0xffe4ae8d*/\n while ( *SkuEntry != CurSkuId || SkuEntry[1] != CurSkuSubId ) /*0xffe4ae97*/\n {\n ++SkuIndex; /*0xffe4ae9b*/\n SkuEntry += 2; /*0xffe4ae9c*/\n SizeTable = SizeTable_1; /*0xffe4aea3*/\n if ( !PcdDb && SkuIndex >= SkuIndex_1 ) /*0xffe4aead*/\n return *(unsigned __int16 *)&SizeTable[2 *DynIndex + 2]; /*0xffe4aead*/\n }\n return *(unsigned __int16 *)&SizeTable[2 *SkuIndex + 2 + 2 *DynIndex]; /*0xffe4aebf*/\n }\n else\n {\n return *(unsigned __int16 *)&SizeTable[2 *DynIndex + 2]; /*0xffe4aeaf*/\n }\n }\n return result; /*0xffe4aeb4*/\n}","refs":[{"addr":"0xffe4bd22","name":"PeiPcdGetDynTokenCount"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5d0","name":"aEHsMdemodulepk","string":"e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c"},{"addr":"0xffe4bce0","name":"PeiPcdGetSkuTable"}]} - -{"addr":"0xffe4aec6","code":"char PeiPcdSetSkuSize(unsigned int i, unsigned int *p_count, _DWORD *PcdDb)\n{\n int DynTokenCount; // ebp\n int DebugLib; // eax\n char *PcdDba_1; // esi\n unsigned int v8; // eax\n int v9; // eax\n unsigned int *SkuTable; // eax\n unsigned int v12; // ecx\n unsigned int v13; // edx\n _DWORD *v14; // eax\n int v15; // ebx\n unsigned int ib; // [esp+10h] [ebp-Ch]\n int v18; // [esp+14h] [ebp-8h]\n unsigned int v19; // [esp+18h] [ebp-4h]\n char *PcdDba; // [esp+20h] [ebp+4h]\n\n DynTokenCount = PeiPcdGetDynTokenCount(i, (int)PcdDb); /*0xffe4aee3*/\n v18 = *(_DWORD *)((char *)&PcdDb[i] + PcdDb[9]); /*0xffe4aeef*/\n if ( (v18 & 0xF000000) != 0 ) /*0xffe4aef8*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4aefa*/\n if ( DebugLib ) /*0xffe4af01*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4af12*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 1385,\n \"(LocalTokenNumber & ((0x0U << 24) | (0x1U << 24) | (0x2U << 24) | (0x4U << 24) | (0x8U << 24))) == (0x0U << 24)\");\n }\n PcdDba_1 = (char *)PcdDb + PcdDb[13]; /*0xffe4af1f*/\n PcdDba = PcdDba_1; /*0xffe4af21*/\n v8 = *(unsigned __int16 *)&PcdDba_1[2 *DynTokenCount]; /*0xffe4af25*/\n if ( (v18 & 0x40000000) != 0 ) /*0xffe4af2f*/\n {\n v9 = DebugGetDebugLib(); /*0xffe4af31*/\n if ( v9 ) /*0xffe4af38*/\n (*(void ( **)(const char *, int, const char *))(v9 + 4))( /*0xffe4af4d*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Pcd.c\",\n 1398,\n \"((BOOLEAN)(0==1))\");\n return 0; /*0xffe4af53*/\n }\n if ( *p_count > v8 || *p_count == -1 ) /*0xffe4af63*/\n {\n *p_count = v8; /*0xffe4afe4*/\n return 0; /*0xffe4afe6*/\n }\n if ( (v18 & 0x20000000) != 0 /*0xffe4af9e*/\n && ((SkuTable = (unsigned int *)PeiPcdGetSkuTable(i, (int)PcdDb), v12 = 0, v13 = *SkuTable, (v19 = SkuTable[1]) != 0)\n || v13) )\n {\n v14 = SkuTable + 2; /*0xffe4afa3*/\n ib = PcdDb[7]; /*0xffe4afa9*/\n v15 = PcdDb[6]; /*0xffe4afad*/\n while ( *v14 != v15 || v14[1] != ib ) /*0xffe4afbe*/\n {\n ++v12; /*0xffe4afc2*/\n v14 += 2; /*0xffe4afc3*/\n PcdDba_1 = PcdDba; /*0xffe4afca*/\n if ( !v19 && v12 >= v13 ) /*0xffe4afd4*/\n goto LABEL_10; /*0xffe4afd4*/\n }\n *(_WORD *)&PcdDba[2 *DynTokenCount + 2 + 2 *v12] = *(_WORD *)p_count; /*0xffe4afdd*/\n }\n else\n {\nLABEL_10:\n *(_WORD *)&PcdDba_1[2 *DynTokenCount + 2] = *(_WORD *)p_count; /*0xffe4af6d*/\n }\n return 1; /*0xffe4afe8*/\n}","refs":[{"addr":"0xffe4bd22","name":"PeiPcdGetDynTokenCount"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5d0","name":"aEHsMdemodulepk","string":"e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c"},{"addr":"0xffe4bce0","name":"PeiPcdGetSkuTable"}]} - -{"addr":"0xffe4aff0","code":"unsigned int PeiPcdGetLocalTokenNumber(_DWORD *PcdDatabase, int SkuSizeOut)\n{\n unsigned int TokenIndex; // edi\n unsigned int LocalTokenNum; // esi\n int SkuSize_1; // edx\n int SkuSize; // [esp+8h] [ebp-4h] BYREF\n\n TokenIndex = SkuSizeOut - 1; /*0xffe4aff9*/\n LocalTokenNum = *(_DWORD *)((char *)&PcdDatabase[SkuSizeOut - 1] + PcdDatabase[9]); /*0xffe4afff*/\n SkuSize_1 = HIBYTE(LocalTokenNum) & 0xF; /*0xffe4b007*/\n if ( (LocalTokenNum & 0x20000000) != 0 ) /*0xffe4b010*/\n {\n if ( !SkuSize_1 ) /*0xffe4b014*/\n {\n PeiPcdGetSkuSize(TokenIndex, &SkuSize, PcdDatabase); /*0xffe4b01c*/\n SkuSize_1 = SkuSize; /*0xffe4b021*/\n }\n return PeiPcdResolveSkuData(LocalTokenNum & 0xDFFFFFFF, SkuSize_1); /*0xffe4b032*/\n }\n return LocalTokenNum; /*0xffe4b034*/\n}","refs":[{"addr":"0xffe4adf5","name":"PeiPcdGetSkuSize"},{"addr":"0xffe4b651","name":"PeiPcdResolveSkuData"}]} - -{"addr":"0xffe4b03c","code":"unsigned int PeiPcdGetTokenTypeFromTokenNumber(unsigned int LocalTokenNumber)\n{\n unsigned int v1; // eax\n int DebugLib; // eax\n\n v1 = LocalTokenNumber & 0xF000000; /*0xffe4b03e*/\n if ( (LocalTokenNumber & 0xF000000) == 0 ) /*0xffe4b043*/\n return 5; /*0xffe4b096*/\n switch ( v1 ) /*0xffe4b04a*/\n {\n case 0x1000000u: /*0xffe4b04a*/\n return (LocalTokenNumber >> 18) & 4; /*0xffe4b091*/\n case 0x2000000u: /*0xffe4b04a*/\n return 1; /*0xffe4b089*/\n case 0x4000000u: /*0xffe4b04a*/\n return 2; /*0xffe4b085*/\n case 0x8000000u: /*0xffe4b04a*/\n return 3; /*0xffe4b081*/\n }\n DebugLib = DebugGetDebugLib(); /*0xffe4b061*/\n if ( DebugLib ) /*0xffe4b068*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b076*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 87,\n \"((BOOLEAN)(0==1))\");\n return 0; /*0xffe4b07e*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4b098","code":"int PeiPcdGetTokenName(char a1, int PcdDb, int a3)\n{\n int v3; // esi\n int v5; // ecx\n int v6; // eax\n _BYTE *v7; // ebx\n _BYTE *v8; // edi\n unsigned int v9; // eax\n int CopyPool; // esi\n unsigned int v11; // ebp\n void *n0xF4240; // ebp\n int DebugLib; // eax\n\n v3 = *(_DWORD *)(PcdDb + 60); /*0xffe4b09a*/\n if ( !v3 ) /*0xffe4b0a3*/\n return 0; /*0xffe4b0a5*/\n v5 = PcdDb + *(_DWORD *)(PcdDb + 48); /*0xffe4b0b4*/\n v6 = v3 + 8 *a3; /*0xffe4b0b6*/\n v7 = (_BYTE *)(v5 + *(_DWORD *)(v6 + PcdDb - 4)); /*0xffe4b0c2*/\n v8 = (_BYTE *)(v5 + *(_DWORD *)(v6 + PcdDb - 8)); /*0xffe4b0c4*/\n if ( a1 ) /*0xffe4b0cd*/\n {\n v9 = BaseAsciiStrLen(v8); /*0xffe4b0cf*/\n return PeiAllocateAndCopyPool(v9 + 1, (int)v8); /*0xffe4b0de*/\n }\n else\n {\n v11 = BaseAsciiStrLen(v8) + 1; /*0xffe4b0ea*/\n n0xF4240 = (void *)(BaseAsciiStrLen(v7) + 1 + v11); /*0xffe4b0f3*/\n CopyPool = PeiAllocateCopyPool(n0xF4240); /*0xffe4b0fc*/\n if ( !CopyPool ) /*0xffe4b100*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b102*/\n if ( DebugLib ) /*0xffe4b109*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b11a*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 150,\n \"Name != ((void *) 0)\");\n }\n BaseAsciiStrCpyS(CopyPool, (unsigned int)n0xF4240, v8); /*0xffe4b125*/\n *(_BYTE *)(BaseAsciiStrLen(v8) + CopyPool) = 46; /*0xffe4b136*/\n BaseAsciiStrCpyS(CopyPool, (unsigned int)n0xF4240, v7); /*0xffe4b13a*/\n }\n return CopyPool; /*0xffe4b146*/\n}","refs":[{"addr":"0xffe4bf41","name":"BaseAsciiStrLen"},{"addr":"0xffe4bdb2","name":"PeiAllocateAndCopyPool"},{"addr":"0xffe4bd9a","name":"PeiAllocateCopyPool"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4bfe9","name":"BaseAsciiStrCpyS"}]} - -{"addr":"0xffe4b149","code":"int PeiPcdGetInfoEx(int PcdDb, int TokenSpaceGuid, int a3, unsigned int *a4)\n{\n unsigned int ExMapTable; // esi\n unsigned int v6; // eax\n int v8; // ebp\n int v9; // edi\n unsigned int *v10; // esi\n unsigned int LocalTokenNumber; // eax\n int TokenName; // eax\n\n ExMapTable = PcdDb + *(_DWORD *)(PcdDb + 44); /*0xffe4b155*/\n v6 = ScanGuid(ExMapTable, 16 * *(unsigned __int16 *)(PcdDb + 68), TokenSpaceGuid); /*0xffe4b15c*/\n if ( !v6 ) /*0xffe4b166*/\n return -2147483634; /*0xffe4b16d*/\n v8 = PcdDb + *(_DWORD *)(PcdDb + 40); /*0xffe4b179*/\n v9 = 0; /*0xffe4b17f*/\n if ( !*(_WORD *)(PcdDb + 66) ) /*0xffe4b183*/\n return -2147483634; /*0xffe4b1aa*/\n while ( 1 ) /*0xffe4b189*/\n {\n if ( *(unsigned __int16 *)(v8 + 8 *v9 + 6) != (int)(v6 - ExMapTable) >> 4 ) /*0xffe4b190*/\n goto LABEL_7; /*0xffe4b190*/\n if ( !a3 ) /*0xffe4b194*/\n break; /*0xffe4b194*/\n if ( *(_DWORD *)(v8 + 8 *v9) == a3 ) /*0xffe4b19a*/\n {\n v10 = a4; /*0xffe4b1b6*/\n a4[1] = PeiPcdGetSize(*(unsigned __int16 *)(v8 + 8 *v9 + 4)); /*0xffe4b1bc*/\n LocalTokenNumber = PeiPcdGetLocalTokenNumber((_DWORD *)PcdDb, *(unsigned __int16 *)(v8 + 8 *v9 + 4)); /*0xffe4b1c4*/\n *a4 = PeiPcdGetTokenTypeFromTokenNumber(LocalTokenNumber); /*0xffe4b1d0*/\n TokenName = PeiPcdGetTokenName(0, PcdDb, *(unsigned __int16 *)(v8 + 8 *v9 + 4)); /*0xffe4b1dc*/\n goto LABEL_11; /*0xffe4b1e2*/\n }\nLABEL_7:\n if ( ++v9 >= (unsigned int)*(unsigned __int16 *)(PcdDb + 66) ) /*0xffe4b19f*/\n return -2147483634; /*0xffe4b19f*/\n }\n v10 = a4; /*0xffe4b1e4*/\n *a4 = 0; /*0xffe4b1ec*/\n a4[1] = 0; /*0xffe4b1ef*/\n TokenName = PeiPcdGetTokenName(1, PcdDb, *(unsigned __int16 *)(v8 + 8 *v9 + 4)); /*0xffe4b1f9*/\nLABEL_11:\n v10[2] = TokenName; /*0xffe4b1fe*/\n return 0; /*0xffe4b1a8*/\n}","refs":[{"addr":"0xffe4c374","name":"ScanGuid"},{"addr":"0xffe4a969","name":"PeiPcdGetSize"},{"addr":"0xffe4aff0","name":"PeiPcdGetLocalTokenNumber"},{"addr":"0xffe4b03c","name":"PeiPcdGetTokenTypeFromTokenNumber"},{"addr":"0xffe4b098","name":"PeiPcdGetTokenName"}]} - -{"addr":"0xffe4b206","code":"int PeiPcdGetInfo(int TokenSpaceGuid, unsigned int TokenNumber, unsigned int *a3)\n{\n int DebugLib; // eax\n int PcdDb; // ebx\n int v7; // edx\n int TokenName; // eax\n unsigned int LocalTokenNumber; // eax\n\n if ( !a3 ) /*0xffe4b214*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b216*/\n if ( DebugLib ) /*0xffe4b21d*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b22e*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 260,\n \"PcdInfo != ((void *) 0)\");\n }\n PcdDb = PeiPcdGetPcdDb(); /*0xffe4b239*/\n v7 = *(unsigned __int16 *)(PcdDb + 66); /*0xffe4b23b*/\n if ( TokenSpaceGuid ) /*0xffe4b247*/\n {\n if ( !(_WORD)v7 ) /*0xffe4b292*/\n return -2147483634; /*0xffe4b292*/\n return PeiPcdGetInfoEx(PcdDb, TokenSpaceGuid, TokenNumber, a3); /*0xffe4b29a*/\n }\n else\n {\n if ( TokenNumber > (unsigned int)*(unsigned __int16 *)(PcdDb + 64) - v7 ) /*0xffe4b24b*/\n return -2147483634; /*0xffe4b252*/\n if ( TokenNumber ) /*0xffe4b256*/\n {\n a3[1] = PeiPcdGetSize(TokenNumber); /*0xffe4b269*/\n LocalTokenNumber = PeiPcdGetLocalTokenNumber((_DWORD *)PcdDb, TokenNumber); /*0xffe4b26e*/\n *a3 = PeiPcdGetTokenTypeFromTokenNumber(LocalTokenNumber); /*0xffe4b27d*/\n TokenName = PeiPcdGetTokenName(0, PcdDb, TokenNumber); /*0xffe4b281*/\n }\n else\n {\n TokenName = 0; /*0xffe4b258*/\n *a3 = 0; /*0xffe4b25a*/\n a3[1] = 0; /*0xffe4b25c*/\n }\n a3[2] = TokenName; /*0xffe4b288*/\n return 0; /*0xffe4b28b*/\n }\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4b149","name":"PeiPcdGetInfoEx"},{"addr":"0xffe4a969","name":"PeiPcdGetSize"},{"addr":"0xffe4aff0","name":"PeiPcdGetLocalTokenNumber"},{"addr":"0xffe4b03c","name":"PeiPcdGetTokenTypeFromTokenNumber"},{"addr":"0xffe4b098","name":"PeiPcdGetTokenName"}]} - -{"addr":"0xffe4b2a6","code":"int PeiPcdSetCallbackWorker(unsigned int a1, int a2, int a3, char a4)\n{\n int PcdDb; // eax\n int PcdDb_1; // ebx\n int v8; // edi\n int v9; // esi\n int v10; // eax\n int v11; // esi\n unsigned int v12; // ecx\n int DebugLib; // eax\n int v15; // edi\n int v16; // eax\n int v17; // eax\n int NextGuidHob; // edi\n int v19; // eax\n int v20; // esi\n int v21; // eax\n\n PcdDb = PeiPcdGetPcdDb(); /*0xffe4b2ae*/\n PcdDb_1 = PcdDb; /*0xffe4b2b3*/\n v8 = *(unsigned __int16 *)(PcdDb + 64); /*0xffe4b2b5*/\n if ( a2 ) /*0xffe4b2bb*/\n {\n v11 = PeiPcdGetExTokenNumber(a2, a1); /*0xffe4b2e9*/\n v12 = v11; /*0xffe4b2eb*/\n if ( !v11 ) /*0xffe4b2ef*/\n return -2147483634; /*0xffe4b2f6*/\n v9 = v11 - 1; /*0xffe4b2fe*/\n if ( v12 >= v8 + 1 ) /*0xffe4b301*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b303*/\n if ( DebugLib ) /*0xffe4b30a*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b31b*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 363,\n \"(TokenNumber + 1) < (LocalTokenCount + 1)\");\n }\n }\n else\n {\n v9 = a1 - 1; /*0xffe4b2c1*/\n if ( a1 >= v8 - (unsigned int)*(unsigned __int16 *)(PcdDb + 66) + 1 ) /*0xffe4b2c9*/\n {\n v10 = DebugGetDebugLib(); /*0xffe4b2cb*/\n if ( v10 ) /*0xffe4b2d2*/\n (*(void ( **)(const char *, int, const char *))(v10 + 4))( /*0xffe4b2de*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 348,\n \"TokenNumber + 1 < (PeiNexTokenNumber + 1)\");\n }\n }\n v15 = *(_DWORD *)(*(_DWORD *)(PcdDb_1 + 36) + 4 *v9 + PcdDb_1); /*0xffe4b327*/\n if ( v15 < 0 ) /*0xffe4b32c*/\n {\n v16 = DebugGetDebugLib(); /*0xffe4b32e*/\n if ( v16 ) /*0xffe4b335*/\n (*(void ( **)(const char *, int, const char *))(v16 + 4))( /*0xffe4b346*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 373,\n \"(LocalTokenNumber & (0x8U << 28)) == 0\");\n }\n if ( (v15 & 0x40000000) != 0 ) /*0xffe4b352*/\n {\n v17 = DebugGetDebugLib(); /*0xffe4b354*/\n if ( v17 ) /*0xffe4b35b*/\n (*(void ( **)(const char *, int, const char *))(v17 + 4))( /*0xffe4b36c*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 374,\n \"(LocalTokenNumber & (0x4U << 28)) == 0\");\n }\n NextGuidHob = HobGetNextGuidHob(&unk_FFE4D128); /*0xffe4b37c*/\n if ( !NextGuidHob ) /*0xffe4b380*/\n {\n v19 = DebugGetDebugLib(); /*0xffe4b382*/\n if ( v19 ) /*0xffe4b389*/\n (*(void ( **)(const char *, int, const char *))(v19 + 4))( /*0xffe4b39a*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 377,\n \"GuidHob != ((void *) 0)\");\n }\n v20 = NextGuidHob + 32 *v9; /*0xffe4b3a7*/\n v21 = 0; /*0xffe4b3c1*/\n while ( *(_DWORD *)(v20 + 4 *v21 + 24) != (a4 == 0 ? a3 : 0) )\n {\n if ( (unsigned int)++v21 >= 8 )\n return a4 == 0 ? -2147483646 : -2147483639;\n }\n *(_DWORD *)(v20 + 4 *v21 + 24) = a4 != 0 ? a3 : 0;\n return 0; /*0xffe4b3e7*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c1f0","name":"HobGetNextGuidHob"},{"addr":"0xffe4d128","name":"unk_FFE4D128"}]} - -{"addr":"0xffe4b3ec","code":"int __thiscall PeiPcdGetDbBinary(EFI_HANDLE ImageHandle)\n{\n int DebugLib; // eax\n int PeiServicesTable; // eax\n int v4; // eax\n int v5; // eax\n int result; // eax\n int v7; // eax\n int v8; // [esp+8h] [ebp-4h] BYREF\n\n v8 = 0; /*0xffe4b3f0*/\n if ( !ImageHandle ) /*0xffe4b3ff*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b401*/\n if ( DebugLib ) /*0xffe4b408*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b415*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 416,\n \"FileHandle != ((void *) 0)\");\n }\n PeiServicesTable = GetPeiServicesTable(); /*0xffe4b41b*/\n v4 = (*(int ( **)(int, int, EFI_HANDLE, int *))(*(_DWORD *)PeiServicesTable + 64))( /*0xffe4b42a*/\n PeiServicesTable,\n 25,\n ImageHandle,\n &v8);\n if ( v4 < 0 ) /*0xffe4b432*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v4); /*0xffe4b43f*/\n v5 = DebugGetDebugLib(); /*0xffe4b447*/\n if ( v5 ) /*0xffe4b44e*/\n (*(void ( **)(const char *, int, const char *))(v5 + 4))( /*0xffe4b45b*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 419,\n \"!EFI_ERROR (Status)\");\n }\n if ( !CompareGuid(v8, (int)&unk_FFE4D118) || (result = v8, *(_DWORD *)(v8 + 16) != 6) ) /*0xffe4b479*/\n {\n v7 = DebugGetDebugLib(); /*0xffe4b47b*/\n if ( v7 ) /*0xffe4b482*/\n (*(void ( **)(const char *, int, const char *))(v7 + 4))( /*0xffe4b48f*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 426,\n \"((BOOLEAN)(0==1))\");\n return v8; /*0xffe4b495*/\n }\n return result; /*0xffe4b498*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c4ef","name":"GetPeiServicesTable"},{"addr":"0xffe4be49","name":"DebugPrint"},{"addr":"0xffe4c598","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe4c5bc","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"},{"addr":"0xffe4c315","name":"CompareGuid"},{"addr":"0xffe4d118","name":"unk_FFE4D118"}]} - -{"addr":"0xffe4b49e","code":"int __thiscall PeiPcdInit(EFI_HANDLE ImageHandle)\n{\n int DbBinary; // esi\n int DebugLib; // eax\n int buf; // edi\n unsigned int n0xFFE0; // esi\n int buf_1; // eax\n\n DbBinary = PeiPcdGetDbBinary(ImageHandle); /*0xffe4b4a5*/\n if ( !DbBinary ) /*0xffe4b4a9*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b4ab*/\n if ( DebugLib ) /*0xffe4b4b2*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b4c3*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 454,\n \"PeiPcdDbBinary != ((void *) 0)\");\n }\n buf = HobBuildGuidHob((int)&unk_FFE4D108, *(_DWORD *)(DbBinary + 20) + *(_DWORD *)(DbBinary + 32)); /*0xffe4b4dc*/\n ZeroMemWrapper(buf, *(_DWORD *)(DbBinary + 20) + *(_DWORD *)(DbBinary + 32)); /*0xffe4b4e3*/\n CopyMemWrapper(buf, DbBinary, *(_DWORD *)(DbBinary + 20)); /*0xffe4b4ef*/\n n0xFFE0 = 32 * *(unsigned __int16 *)(buf + 64); /*0xffe4b4f9*/\n buf_1 = HobBuildGuidHob((int)&unk_FFE4D128, n0xFFE0); /*0xffe4b503*/\n ZeroMemWrapper(buf_1, n0xFFE0); /*0xffe4b50c*/\n return buf; /*0xffe4b513*/\n}","refs":[{"addr":"0xffe4b3ec","name":"PeiPcdGetDbBinary"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c27a","name":"HobBuildGuidHob"},{"addr":"0xffe4d108","name":"unk_FFE4D108"},{"addr":"0xffe4c494","name":"ZeroMemWrapper"},{"addr":"0xffe4c423","name":"CopyMemWrapper"},{"addr":"0xffe4d128","name":"unk_FFE4D128"}]} - -{"addr":"0xffe4b516","code":"int PeiPcdGetPeiServicesFv(int FvHandle, int FvBuffer, _DWORD *p_FvBufSize, _DWORD *p_TokenNumber)\n{\n int PeiServicesTable; // eax\n int v7; // eax\n int DebugLib; // eax\n int v9; // esi\n int v10; // eax\n int v11; // eax\n int v12; // eax\n int v13; // eax\n int v14; // eax\n int v16; // [esp+10h] [ebp-Ch] BYREF\n int ( **v17)(_DWORD, int, int, _DWORD, int *, int); // [esp+14h] [ebp-8h] BYREF\n int v18; // [esp+18h] [ebp-4h] BYREF\n\n PeiServicesTable = GetPeiServicesTable(); /*0xffe4b521*/\n v7 = (*(int ( **)(int, void *, _DWORD, _DWORD, int ( ***)(_DWORD, int, int, _DWORD, int *, int)))(*(_DWORD *)PeiServicesTable + 32))( /*0xffe4b537*/\n PeiServicesTable,\n &unk_FFE4D0C8,\n 0,\n 0,\n &v17);\n if ( v7 < 0 ) /*0xffe4b53f*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v7); /*0xffe4b54c*/\n DebugLib = DebugGetDebugLib(); /*0xffe4b554*/\n if ( DebugLib ) /*0xffe4b55b*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b56c*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 500,\n \"!EFI_ERROR (Status)\");\n }\n v16 = 0; /*0xffe4b577*/\n if ( (*v17)(v17, FvBuffer, FvHandle, 0, &v16, 0) != -2147483643 ) /*0xffe4b58e*/\n return -2147483634; /*0xffe4b644*/\n v9 = v16; /*0xffe4b594*/\n v10 = GetPeiServicesTable(); /*0xffe4b598*/\n v11 = (*(int ( **)(int, int, int *))(*(_DWORD *)v10 + 76))(v10, v9, &v18); /*0xffe4b5a6*/\n if ( v11 < 0 ) /*0xffe4b5ae*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v11); /*0xffe4b5bb*/\n v12 = DebugGetDebugLib(); /*0xffe4b5c3*/\n if ( v12 ) /*0xffe4b5ca*/\n (*(void ( **)(const char *, int, const char *))(v12 + 4))( /*0xffe4b5db*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 514,\n \"!EFI_ERROR (Status)\");\n }\n v13 = (*v17)(v17, FvBuffer, FvHandle, 0, &v16, v18); /*0xffe4b5f2*/\n if ( v13 < 0 ) /*0xffe4b5f9*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v13); /*0xffe4b606*/\n v14 = DebugGetDebugLib(); /*0xffe4b60e*/\n if ( v14 ) /*0xffe4b615*/\n (*(void ( **)(const char *, int, const char *))(v14 + 4))( /*0xffe4b626*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 524,\n \"!EFI_ERROR (Status)\");\n }\n *p_TokenNumber = v16; /*0xffe4b634*/\n *p_FvBufSize = v18; /*0xffe4b63e*/\n return 0; /*0xffe4b649*/\n}","refs":[{"addr":"0xffe4c4ef","name":"GetPeiServicesTable"},{"addr":"0xffe4d0c8","name":"unk_FFE4D0C8"},{"addr":"0xffe4be49","name":"DebugPrint"},{"addr":"0xffe4c598","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5bc","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"}]} - -{"addr":"0xffe4b651","code":"int PeiPcdResolveSkuData(int a1, int TokenNumber)\n{\n int PcdDb; // ebx\n int DebugLib; // eax\n unsigned int *v5; // edx\n int v6; // ebp\n unsigned int v7; // esi\n unsigned int v8; // ecx\n _DWORD *v9; // eax\n _DWORD *v10; // eax\n int v11; // eax\n unsigned int n0x10000000_1; // edi\n unsigned int n0x10000000; // ecx\n int v14; // eax\n int v15; // eax\n int v17; // eax\n\n PcdDb = PeiPcdGetPcdDb(); /*0xffe4b662*/\n if ( (a1 & 0x20000000) != 0 ) /*0xffe4b66a*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b66c*/\n if ( DebugLib ) /*0xffe4b673*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b684*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 559,\n \"(LocalTokenNumber & (0x2U << 28)) == 0\");\n }\n v5 = (unsigned int *)(PcdDb + *(_DWORD *)((a1 & 0xEFFFFF) + PcdDb + 4)); /*0xffe4b698*/\n v6 = PcdDb + *(_DWORD *)((a1 & 0xEFFFFF) + PcdDb); /*0xffe4b69c*/\n v7 = 0; /*0xffe4b6a2*/\n v8 = v5[1]; /*0xffe4b6a4*/\n if ( v8 || *v5 ) /*0xffe4b6ad*/\n {\n v9 = v5 + 2; /*0xffe4b6b1*/\n while ( 1 ) /*0xffe4b6b9*/\n {\n v8 = v5[1]; /*0xffe4b6b9*/\n if ( *(_DWORD *)(PcdDb + 24) == *v9 ) /*0xffe4b6bc*/\n {\n v8 = v5[1]; /*0xffe4b6c4*/\n if ( *(_DWORD *)(PcdDb + 28) == v9[1] ) /*0xffe4b6c7*/\n break; /*0xffe4b6c7*/\n }\n ++v7; /*0xffe4b6c9*/\n v9 += 2; /*0xffe4b6ca*/\n if ( !v8 && v7 >= *v5 ) /*0xffe4b6d7*/\n goto LABEL_11; /*0xffe4b6d7*/\n }\n }\n else\n {\nLABEL_11:\n v7 = 0; /*0xffe4b6db*/\n if ( *v5 ) /*0xffe4b6e3*/\n {\n v10 = v5 + 2; /*0xffe4b6e7*/\n do /*0xffe4b703*/\n {\n if ( !*v10 && !v10[1] ) /*0xffe4b6ef*/\n break; /*0xffe4b6f3*/\n ++v7; /*0xffe4b6f5*/\n v10 += 2; /*0xffe4b6f6*/\n }\n while ( v7 < *v5 ); /*0xffe4b703*/\n }\n }\n if ( !v8 && v7 >= *v5 ) /*0xffe4b70f*/\n {\n v11 = DebugGetDebugLib(); /*0xffe4b711*/\n if ( v11 ) /*0xffe4b718*/\n (*(void ( **)(const char *, int, const char *))(v11 + 4))( /*0xffe4b729*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 586,\n \"Index < SkuIdTable[0]\");\n }\n n0x10000000_1 = a1 & 0xF0000000; /*0xffe4b72f*/\n if ( !n0x10000000_1 ) /*0xffe4b735*/\n return TokenNumber *v7 - PcdDb + v6; /*0xffe4b7b1*/\n n0x10000000 = 0x10000000; /*0xffe4b737*/\n if ( n0x10000000_1 == 0x10000000 || (n0x10000000 = 0x40000000, n0x10000000_1 == 0x40000000) ) /*0xffe4b747*/\n {\n v17 = 4 *v7; /*0xffe4b79f*/\n return n0x10000000 | (v6 + v17 - PcdDb); /*0xffe4b79f*/\n }\n n0x10000000 = 0x80000000; /*0xffe4b749*/\n if ( n0x10000000_1 == 0x80000000 || (n0x10000000 = -1879048192, n0x10000000_1 == -1879048192) ) /*0xffe4b759*/\n {\n v17 = 20 *v7; /*0xffe4b798*/\n return n0x10000000 | (v6 + v17 - PcdDb); /*0xffe4b7a8*/\n }\n v14 = DebugGetDebugLib(); /*0xffe4b75b*/\n if ( v14 ) /*0xffe4b767*/\n (*(void ( **)(const char *, int, const char *))(v14 + 4))( /*0xffe4b774*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 610,\n \"((BOOLEAN)(0==1))\");\n v15 = DebugGetDebugLib(); /*0xffe4b77a*/\n if ( v15 ) /*0xffe4b781*/\n (*(void ( **)(const char *, int, const char *))(v15 + 4))( /*0xffe4b78e*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 613,\n \"((BOOLEAN)(0==1))\");\n return 0; /*0xffe4b7b4*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4b7bb","code":"_WORD *PeiPcdNotifySetCallbacks(\n unsigned int TokenNumber_2,\n int a2,\n unsigned int TokenNumber,\n int va,\n int n2)\n{\n int PcdDb; // eax\n int DebugLib; // eax\n _WORD *result; // eax\n _WORD *v10; // edi\n _WORD *v11; // edi\n unsigned int i; // esi\n int ( *v13)(int, unsigned int, int, int); // ecx\n unsigned int TokenNumber_1; // eax\n\n PcdDb = PeiPcdGetPcdDb(); /*0xffe4b7ce*/\n if ( !a2 && TokenNumber >= (unsigned int)*(unsigned __int16 *)(PcdDb + 64) + 1 ) /*0xffe4b7de*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b7e0*/\n if ( DebugLib ) /*0xffe4b7e7*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b7f8*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 660,\n \"TokenNumber + 1 < (LocalTokenCount + 1)\");\n }\n result = HobGetNextGuidHob(&unk_FFE4D128); /*0xffe4b803*/\n v10 = result; /*0xffe4b808*/\n if ( !result ) /*0xffe4b80c*/\n {\n result = (_WORD *)DebugGetDebugLib(); /*0xffe4b80e*/\n if ( result ) /*0xffe4b815*/\n result = (_WORD *)(*((int ( **)(const char *, int, const char *))result + 1))( /*0xffe4b826*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 664,\n \"GuidHob != ((void *) 0)\");\n }\n v11 = &v10[16 *TokenNumber - 16]; /*0xffe4b82f*/\n for ( i = 0; i < 8; ++i ) /*0xffe4b831*/\n {\n v13 = *(int ( **)(int, unsigned int, int, int))&v11[2 *i + 12]; /*0xffe4b833*/\n if ( v13 ) /*0xffe4b839*/\n {\n TokenNumber_1 = TokenNumber; /*0xffe4b83b*/\n if ( a2 ) /*0xffe4b841*/\n TokenNumber_1 = TokenNumber_2; /*0xffe4b843*/\n result = (_WORD *)v13(a2, TokenNumber_1, va, n2); /*0xffe4b84f*/\n }\n }\n return result; /*0xffe4b85a*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c1f0","name":"HobGetNextGuidHob"},{"addr":"0xffe4d128","name":"unk_FFE4D128"}]} - -{"addr":"0xffe4b85f","code":"int PeiPcdSetTokenValue(unsigned int TokenNumber, int Buffer, unsigned int *SizePtr, char IsDynamic)\n{\n unsigned int TokenIndex; // ebx\n int PcdDatabase; // ebp\n int DebugLib; // eax\n unsigned int *Size; // ebx\n int DataSize; // esi\n unsigned int LocalTokenNumber; // eax\n char *SettingData; // esi\n unsigned int TokenTypeFlag; // eax\n int DebugLibPtr2; // eax\n int DebugLibPtr1; // eax\n char *SettingData_1; // ecx\n int DebugLibPtr3; // eax\n unsigned int TokenIdx2; // [esp+10h] [ebp-10h]\n unsigned int TokenNumber_3; // [esp+14h] [ebp-Ch] BYREF\n unsigned int TokenNumber_2; // [esp+18h] [ebp-8h]\n unsigned int TokenNumber_1; // [esp+1Ch] [ebp-4h]\n\n TokenNumber_1 = TokenNumber; /*0xffe4b867*/\n TokenNumber_2 = TokenNumber; /*0xffe4b86d*/\n TokenNumber_3 = TokenNumber; /*0xffe4b871*/\n TokenIndex = TokenNumber - 1; /*0xffe4b875*/\n TokenIdx2 = TokenNumber - 1; /*0xffe4b879*/\n PcdDatabase = PeiPcdGetPcdDb(); /*0xffe4b882*/\n if ( TokenNumber >= (unsigned int)*(unsigned __int16 *)(PcdDatabase + 64) + 1 ) /*0xffe4b88b*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4b88d*/\n if ( DebugLib ) /*0xffe4b894*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4b8a5*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 750,\n \"TokenNumber + 1 < (LocalTokenCount + 1)\");\n }\n if ( IsDynamic ) /*0xffe4b8b0*/\n {\n PeiPcdGetSkuSize(TokenIndex, &TokenNumber_3, (_DWORD *)PcdDatabase); /*0xffe4b8b9*/\n Size = SizePtr; /*0xffe4b8be*/\n DataSize = *SizePtr; /*0xffe4b8c7*/\n if ( *SizePtr > TokenNumber_3 ) /*0xffe4b8cb*/\n {\n *SizePtr = TokenNumber_3; /*0xffe4b8cd*/\n return -2147483646; /*0xffe4b8d4*/\n }\n }\n else\n {\n Size = SizePtr; /*0xffe4b8d9*/\n DataSize = *SizePtr; /*0xffe4b8e1*/\n if ( DataSize != PeiPcdGetSize(TokenNumber_3) ) /*0xffe4b8eb*/\n return -2147483646; /*0xffe4b8eb*/\n }\n if ( TokenNumber_2 < *(unsigned __int16 *)(PcdDatabase + 64) /*0xffe4b8fc*/\n - (unsigned int)*(unsigned __int16 *)(PcdDatabase + 66)\n + 1 )\n PeiPcdNotifySetCallbacks(0, 0, TokenNumber_1, Buffer, DataSize); /*0xffe4b908*/\n LocalTokenNumber = PeiPcdGetLocalTokenNumber((_DWORD *)PcdDatabase, TokenIdx2 + 1); /*0xffe4b917*/\n SettingData = (char *)(PcdDatabase + (LocalTokenNumber & 0xEFFFFF)); /*0xffe4b924*/\n TokenTypeFlag = LocalTokenNumber & 0xF0000000; /*0xffe4b926*/\n if ( TokenTypeFlag ) /*0xffe4b92b*/\n {\n if ( TokenTypeFlag != 0x10000000 ) /*0xffe4b936*/\n {\n if ( TokenTypeFlag == 0x40000000 || TokenTypeFlag == 0x80000000 || TokenTypeFlag == -1879048192 ) /*0xffe4b94b*/\n {\n DebugLibPtr1 = DebugGetDebugLib(); /*0xffe4b969*/\n if ( DebugLibPtr1 ) /*0xffe4b970*/\n (*(void ( **)(const char *, int, const char *))(DebugLibPtr1 + 4))( /*0xffe4b985*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 787,\n \"((BOOLEAN)(0==1))\");\n return -2147483646; /*0xffe4b98b*/\n }\n DebugLibPtr2 = DebugGetDebugLib(); /*0xffe4b94d*/\n if ( DebugLibPtr2 ) /*0xffe4b954*/\n (*(void ( **)(const char *, int, const char *))(DebugLibPtr2 + 4))( /*0xffe4b964*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 836,\n \"((BOOLEAN)(0==1))\");\n return -2147483634; /*0xffe4b964*/\n }\n if ( !PeiPcdSetSkuSize(TokenIdx2, Size, (_DWORD *)PcdDatabase) ) /*0xffe4b99f*/\n return -2147483646; /*0xffe4b99f*/\n SettingData_1 = (char *)(PcdDatabase + *(_DWORD *)SettingData + *(_DWORD *)(PcdDatabase + 48)); /*0xffe4b9aa*/\n goto LABEL_22; /*0xffe4b9aa*/\n }\n if ( IsDynamic ) /*0xffe4b9bd*/\n {\n if ( !PeiPcdSetSkuSize(TokenIdx2, Size, (_DWORD *)PcdDatabase) ) /*0xffe4b9ce*/\n return -2147483646; /*0xffe4b9ce*/\n SettingData_1 = SettingData; /*0xffe4b9d4*/\nLABEL_22:\n CopyMemWrapper(SettingData_1, (char *)Buffer, *Size); /*0xffe4b9ac*/\n return 0; /*0xffe4b9b6*/\n }\n switch ( *Size ) /*0xffe4b9dd*/\n {\n case 1u: /*0xffe4b9dd*/\n *SettingData = *(_BYTE *)Buffer; /*0xffe4ba30*/\n break;\n case 2u: /*0xffe4b9dd*/\n *(_WORD *)SettingData = *(_WORD *)Buffer; /*0xffe4ba29*/\n break;\n case 4u: /*0xffe4b9dd*/\n *(_DWORD *)SettingData = *(_DWORD *)Buffer; /*0xffe4ba22*/\n break;\n case 8u: /*0xffe4b9dd*/\n *(_DWORD *)SettingData = *(_DWORD *)Buffer; /*0xffe4ba16*/\n *((_DWORD *)SettingData + 1) = *(_DWORD *)(Buffer + 4); /*0xffe4ba1b*/\n break;\n default:\n DebugLibPtr3 = DebugGetDebugLib(); /*0xffe4b9ef*/\n if ( DebugLibPtr3 ) /*0xffe4b9f6*/\n (*(void ( **)(const char *, int, const char *))(DebugLibPtr3 + 4))( /*0xffe4ba07*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 829,\n \"((BOOLEAN)(0==1))\");\n return -2147483634; /*0xffe4ba12*/\n }\n return 0; /*0xffe4ba34*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4adf5","name":"PeiPcdGetSkuSize"},{"addr":"0xffe4a969","name":"PeiPcdGetSize"},{"addr":"0xffe4b7bb","name":"PeiPcdNotifySetCallbacks"},{"addr":"0xffe4aff0","name":"PeiPcdGetLocalTokenNumber"},{"addr":"0xffe4aec6","name":"PeiPcdSetSkuSize"},{"addr":"0xffe4c423","name":"CopyMemWrapper"}]} - -{"addr":"0xffe4ba3c","code":"int PeiPcdSetExTokenValue(unsigned int TokenNumber, int a2, int va, unsigned int *p_n2, char a5)\n{\n unsigned int TokenNumber_1; // eax\n unsigned int TokenNumber_2; // edi\n\n TokenNumber_1 = PeiPcdGetExTokenNumber(a2, TokenNumber); /*0xffe4ba47*/\n TokenNumber_2 = TokenNumber_1; /*0xffe4ba4c*/\n if ( !TokenNumber_1 ) /*0xffe4ba50*/\n return -2147483634; /*0xffe4ba52*/\n PeiPcdNotifySetCallbacks(TokenNumber, a2, TokenNumber_1, va, *p_n2); /*0xffe4ba69*/\n return PeiPcdSetTokenValue(TokenNumber_2, va, p_n2, a5); /*0xffe4ba82*/\n}","refs":[{"addr":"0xffe4bc27","name":"PeiPcdGetExTokenNumber"},{"addr":"0xffe4b7bb","name":"PeiPcdNotifySetCallbacks"},{"addr":"0xffe4b85f","name":"PeiPcdSetTokenValue"}]} - -{"addr":"0xffe4ba86","code":"char *PeiPcdGetTokenValue(unsigned int SkuSize, unsigned int GetSize_1)\n{\n unsigned int GetSize; // ebp\n int PcdDatabase; // ebx\n int DebugLib; // eax\n int DebugLibPtr; // eax\n unsigned int LocalTokenNumber; // eax\n int Offset; // esi\n int DataStart; // edx\n unsigned int TokenTypeFlag; // eax\n int DebugLib1; // eax\n int DebugLib2; // eax\n int FvHandle; // ecx\n char *SettingData; // edi\n int OffsetInBlock; // edx\n unsigned int TokenIndex; // [esp+10h] [ebp-14h]\n unsigned int SkuSize_1; // [esp+14h] [ebp-10h] BYREF\n unsigned int GetSize_2; // [esp+18h] [ebp-Ch] BYREF\n int FvBuffer; // [esp+1Ch] [ebp-8h]\n int FvBufSize; // [esp+20h] [ebp-4h] BYREF\n\n GetSize = GetSize_1; /*0xffe4ba8d*/\n SkuSize_1 = SkuSize; /*0xffe4ba91*/\n GetSize_2 = GetSize_1; /*0xffe4ba98*/\n TokenIndex = SkuSize - 1; /*0xffe4ba9c*/\n PcdDatabase = PeiPcdGetPcdDb(); /*0xffe4baa5*/\n if ( SkuSize >= (unsigned int)*(unsigned __int16 *)(PcdDatabase + 64) + 1 ) /*0xffe4baae*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bab0*/\n if ( DebugLib ) /*0xffe4babc*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bac9*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 974,\n \"TokenNumber + 1 < (LocalTokenCount + 1)\");\n }\n if ( GetSize != PeiPcdGetSize(SkuSize_1) ) /*0xffe4bae2*/\n {\n if ( GetSize ) /*0xffe4bae6*/\n {\n DebugLibPtr = DebugGetDebugLib(); /*0xffe4bae8*/\n if ( DebugLibPtr ) /*0xffe4baef*/\n (*(void ( **)(const char *, int, const char *))(DebugLibPtr + 4))( /*0xffe4bafc*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 976,\n \"(GetSize == PeiPcdGetSize(TokenNumber + 1)) || (GetSize == 0)\");\n }\n }\n LocalTokenNumber = PeiPcdGetLocalTokenNumber((_DWORD *)PcdDatabase, TokenIndex + 1); /*0xffe4bb09*/\n Offset = LocalTokenNumber & 0xEFFFFF; /*0xffe4bb13*/\n DataStart = PcdDatabase + *(_DWORD *)(PcdDatabase + 48); /*0xffe4bb19*/\n TokenTypeFlag = LocalTokenNumber & 0xF0000000; /*0xffe4bb1b*/\n switch ( TokenTypeFlag ) /*0xffe4bb20*/\n {\n case 0u: /*0xffe4bb20*/\n return (char *)(Offset + PcdDatabase); /*0xffe4bc1c*/\n case 0x10000000u: /*0xffe4bb20*/\n return (char *)(DataStart + *(_DWORD *)(Offset + PcdDatabase)); /*0xffe4bc18*/\n case 0x40000000u: /*0xffe4bb20*/\n return *(char **)(Offset + PcdDatabase); /*0xffe4bc10*/\n case 0x80000000: /*0xffe4bb20*/\n case 0x90000000: /*0xffe4bb20*/\n FvHandle = PcdDatabase + *(_DWORD *)(PcdDatabase + 44) + 16 * *(unsigned __int16 *)(Offset + PcdDatabase + 8); /*0xffe4bb92*/\n FvBuffer = DataStart + *(_DWORD *)(Offset + PcdDatabase); /*0xffe4bb94*/\n if ( TokenTypeFlag == -1879048192 ) /*0xffe4bb9d*/\n SettingData = (char *)(DataStart + *(_DWORD *)(*(_DWORD *)(Offset + PcdDatabase + 4) + PcdDatabase)); /*0xffe4bba6*/\n else\n SettingData = (char *)(PcdDatabase + *(_DWORD *)(Offset + PcdDatabase + 4)); /*0xffe4bbae*/\n if ( !PeiPcdGetPeiServicesFv(FvHandle, FvBuffer, &FvBufSize, &SkuSize_1) ) /*0xffe4bbbe*/\n {\n OffsetInBlock = *(unsigned __int16 *)(Offset + PcdDatabase + 10); /*0xffe4bbc9*/\n if ( SkuSize_1 >= OffsetInBlock + GetSize ) /*0xffe4bbd5*/\n {\n if ( !GetSize ) /*0xffe4bbd9*/\n {\n PeiPcdGetSkuSize(TokenIndex, &GetSize_2, (_DWORD *)PcdDatabase); /*0xffe4bbe4*/\n OffsetInBlock = *(unsigned __int16 *)(Offset + PcdDatabase + 10); /*0xffe4bbe9*/\n GetSize = GetSize_2; /*0xffe4bbf2*/\n if ( GetSize_2 > SkuSize_1 - OffsetInBlock ) /*0xffe4bbfb*/\n GetSize = SkuSize_1 - OffsetInBlock; /*0xffe4bbfd*/\n }\n CopyMemWrapper(SettingData, (char *)(FvBufSize + OffsetInBlock), GetSize); /*0xffe4bc06*/\n }\n }\n return SettingData; /*0xffe4bc0c*/\n default:\n DebugLib1 = DebugGetDebugLib(); /*0xffe4bb4a*/\n if ( DebugLib1 ) /*0xffe4bb56*/\n (*(void ( **)(const char *, int, const char *))(DebugLib1 + 4))( /*0xffe4bb5f*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 1040,\n \"((BOOLEAN)(0==1))\");\n DebugLib2 = DebugGetDebugLib(); /*0xffe4bb65*/\n if ( DebugLib2 ) /*0xffe4bb6c*/\n (*(void ( **)(const char *, int, const char *))(DebugLib2 + 4))( /*0xffe4bb75*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 1045,\n \"((BOOLEAN)(0==1))\");\n return 0; /*0xffe4bb7b*/\n }\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4a969","name":"PeiPcdGetSize"},{"addr":"0xffe4aff0","name":"PeiPcdGetLocalTokenNumber"},{"addr":"0xffe4adf5","name":"PeiPcdGetSkuSize"},{"addr":"0xffe4c423","name":"CopyMemWrapper"},{"addr":"0xffe4b516","name":"PeiPcdGetPeiServicesFv"}]} - -{"addr":"0xffe4bc27","code":"int PeiPcdGetExTokenNumber(int TokenSpaceGuid, int TokenNumber)\n{\n int PcdDatabase; // ebx\n unsigned int ExMapTable; // ebp\n int ExTokenTbl; // edi\n unsigned int GuidEntry; // esi\n int DebugLib; // eax\n int GuidIndex; // esi\n int Index; // ecx\n\n PcdDatabase = PeiPcdGetPcdDb(); /*0xffe4bc37*/\n ExMapTable = PcdDatabase + *(_DWORD *)(PcdDatabase + 44); /*0xffe4bc41*/\n ExTokenTbl = PcdDatabase + *(_DWORD *)(PcdDatabase + 40); /*0xffe4bc4b*/\n GuidEntry = ScanGuid(ExMapTable, 16 * *(unsigned __int16 *)(PcdDatabase + 68), TokenSpaceGuid); /*0xffe4bc52*/\n if ( !GuidEntry ) /*0xffe4bc57*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bc59*/\n if ( DebugLib ) /*0xffe4bc60*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bc71*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 1087,\n \"MatchGuid != ((void *) 0)\");\n }\n GuidIndex = (int)(GuidEntry - ExMapTable) >> 4; /*0xffe4bc7d*/\n Index = 0; /*0xffe4bc80*/\n if ( !*(_WORD *)(PcdDatabase + 66) ) /*0xffe4bc77*/\n return 0; /*0xffe4bc9d*/\n while ( TokenNumber != *(_DWORD *)(ExTokenTbl + 8 *Index) /*0xffe4bc96*/\n || GuidIndex != *(unsigned __int16 *)(ExTokenTbl + 8 *Index + 6) )\n {\n if ( ++Index >= (unsigned int)*(unsigned __int16 *)(PcdDatabase + 66) ) /*0xffe4bc9b*/\n return 0; /*0xffe4bc9b*/\n }\n return *(unsigned __int16 *)(ExTokenTbl + 8 *Index + 4); /*0xffe4bc9f*/\n}","refs":[{"addr":"0xffe4bcac","name":"PeiPcdGetPcdDb"},{"addr":"0xffe4c374","name":"ScanGuid"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4bcac","code":"int PeiPcdGetPcdDb()\n{\n int NextGuidHob; // esi\n int DebugLib; // eax\n\n NextGuidHob = HobGetNextGuidHob(&unk_FFE4D108); /*0xffe4bcb7*/\n if ( !NextGuidHob ) /*0xffe4bcbb*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bcbd*/\n if ( DebugLib ) /*0xffe4bcc4*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bcd5*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 1115,\n \"GuidHob != ((void *) 0)\");\n }\n return NextGuidHob + 24; /*0xffe4bcde*/\n}","refs":[{"addr":"0xffe4c1f0","name":"HobGetNextGuidHob"},{"addr":"0xffe4d108","name":"unk_FFE4D108"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4bce0","code":"int PeiPcdGetSkuTable(unsigned int i, int PcdDb)\n{\n int v3; // esi\n int DebugLib; // eax\n\n v3 = *(_DWORD *)(*(_DWORD *)(PcdDb + 36) + 4 *i + PcdDb); /*0xffe4bcea*/\n if ( (v3 & 0x20000000) == 0 ) /*0xffe4bcf3*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bcf5*/\n if ( DebugLib ) /*0xffe4bcfc*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bd0d*/\n \"e:\\\\hs\\\\MdeModulePkg\\\\Universal\\\\PCD\\\\Pei\\\\Service.c\",\n 1140,\n \"(LocalTokenNumber & (0x2U << 28)) != 0\");\n }\n return PcdDb + *(_DWORD *)((v3 & 0xEFFFFF) + PcdDb + 4); /*0xffe4bd1f*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4bd22","code":"int PeiPcdGetDynTokenCount(unsigned int i, int PcdDb)\n{\n int v3; // esi\n unsigned int j; // edi\n int v6; // eax\n\n v3 = 0; /*0xffe4bd27*/\n for ( j = 0; j < i; ++j ) /*0xffe4bd30*/\n {\n v6 = *(_DWORD *)(PcdDb + 36) + 4 *j; /*0xffe4bd35*/\n if ( (*(_DWORD *)(v6 + PcdDb) & 0xF000000) == 0 ) /*0xffe4bd3f*/\n {\n if ( (*(_DWORD *)(v6 + PcdDb) & 0x40000000) == 0 && (*(_DWORD *)(v6 + PcdDb) & 0x20000000) != 0 ) /*0xffe4bd51*/\n v3 += *(_DWORD *)PeiPcdGetSkuTable(j, PcdDb) + 1; /*0xffe4bd62*/\n else\n v3 += 2; /*0xffe4bd53*/\n }\n }\n return v3; /*0xffe4bd69*/\n}","refs":[{"addr":"0xffe4bce0","name":"PeiPcdGetSkuTable"}]} - -{"addr":"0xffe4bd70","code":"int __thiscall PeiAllocatePool(void *this)\n{\n int PeiServicesTable; // eax\n int v4; // [esp+4h] [ebp-4h] BYREF\n\n PeiServicesTable = GetPeiServicesTable(); /*0xffe4bd77*/\n if ( (*(int ( **)(int, void *, int *))(*(_DWORD *)PeiServicesTable + 76))(PeiServicesTable, this, &v4) >= 0 ) /*0xffe4bd8d*/\n return v4; /*0xffe4bd93*/\n else\n return 0; /*0xffe4bd8f*/\n}","refs":[{"addr":"0xffe4c4ef","name":"GetPeiServicesTable"}]} - -{"addr":"0xffe4bd9a","code":"void *__thiscall PeiAllocateCopyPool(void *this)\n{\n void *buf; // eax\n\n buf = (void *)PeiAllocatePool(this); /*0xffe4bd9d*/\n if ( buf ) /*0xffe4bda4*/\n return ZeroMemWrapper((int)buf, (unsigned int)this); /*0xffe4bdab*/\n return buf; /*0xffe4bdaa*/\n}","refs":[{"addr":"0xffe4bd70","name":"PeiAllocatePool"},{"addr":"0xffe4c494","name":"ZeroMemWrapper"}]} - -{"addr":"0xffe4bdb2","code":"char *PeiAllocateAndCopyPool(unsigned int count, char *DbBinary)\n{\n int DebugLib; // eax\n int v5; // eax\n char *buf; // eax\n\n if ( !DbBinary ) /*0xffe4bdc0*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bdc2*/\n if ( DebugLib ) /*0xffe4bdc9*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bdd6*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiMemoryAllocationLib\\\\MemoryAllocationLib.c\",\n 623,\n \"Buffer != ((void *) 0)\");\n }\n if ( count > -(int)DbBinary ) /*0xffe4bde2*/\n {\n v5 = DebugGetDebugLib(); /*0xffe4bde4*/\n if ( v5 ) /*0xffe4bdeb*/\n (*(void ( **)(const char *, int, const char *))(v5 + 4))( /*0xffe4bdf8*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiMemoryAllocationLib\\\\MemoryAllocationLib.c\",\n 624,\n \"AllocationSize <= (0xFFFFFFFF - (UINTN) Buffer + 1)\");\n }\n buf = (char *)PeiAllocatePool((void *)count); /*0xffe4be00*/\n if ( buf ) /*0xffe4be07*/\n return CopyMemWrapper(buf, DbBinary, count); /*0xffe4be0e*/\n return buf; /*0xffe4be14*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4bd70","name":"PeiAllocatePool"},{"addr":"0xffe4c423","name":"CopyMemWrapper"}]} - -{"addr":"0xffe4be18","code":"int DebugGetDebugLib()\n{\n int PeiServicesTable; // eax\n _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF\n int v3; // [esp+4h] [ebp-4h] BYREF\n\n PeiServicesTable = GetPeiServicesTable(); /*0xffe4be1d*/\n if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)PeiServicesTable + 32))( /*0xffe4be3c*/\n PeiServicesTable,\n &unk_FFE4D0D8,\n 0,\n v2,\n &v3) >= 0 )\n return v3; /*0xffe4be42*/\n else\n return 0; /*0xffe4be3e*/\n}","refs":[{"addr":"0xffe4c4ef","name":"GetPeiServicesTable"},{"addr":"0xffe4d0d8","name":"unk_FFE4D0D8"}]} - -{"addr":"0xffe4be49","code":"int DebugPrint(int a1, const char *a2, ...)\n{\n int result; // eax\n int ( **v3)(int, const char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a2);\n result = DebugGetDebugLib(); /*0xffe4be4a*/\n v3 = (int ( **)(int, const char *, char *))result; /*0xffe4be4f*/\n if ( result ) /*0xffe4be53*/\n {\n result = DebugGetDebugLevel(); /*0xffe4be55*/\n if ( (result & a1) != 0 ) /*0xffe4be60*/\n return (*v3)(a1, a2, (char *)va); /*0xffe4be6c*/\n }\n return result; /*0xffe4be71*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c521","name":"DebugGetDebugLevel"}]} - -{"addr":"0xffe4be73","code":"int DebugAssert(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n const char *PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = DebugGetDebugLib(); /*0xffe4be79*/\n if ( result ) /*0xffe4be80*/\n return (*(int ( **)(int, int, const char *))(result + 4))( /*0xffe4be88*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe4be8e*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4bee1","code":"__int64 __thiscall BaseReadUnaligned64(void *this)\n{\n int DebugLib; // eax\n\n if ( !this ) /*0xffe4bee6*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bee8*/\n if ( DebugLib ) /*0xffe4beef*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bf00*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 192,\n \"Buffer != ((void *) 0)\");\n }\n return *(_QWORD *)this; /*0xffe4bf0b*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4bf0d","code":"int BaseWriteUnaligned64(int Unaligned64, int a2)\n{\n _DWORD *v2; // ecx\n _DWORD *v3; // esi\n int DebugLib; // eax\n\n v3 = v2; /*0xffe4bf0e*/\n if ( !v2 ) /*0xffe4bf12*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bf14*/\n if ( DebugLib ) /*0xffe4bf1b*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bf2c*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 219,\n \"Buffer != ((void *) 0)\");\n }\n *v3 = Unaligned64; /*0xffe4bf3a*/\n v3[1] = a2; /*0xffe4bf3c*/\n return Unaligned64; /*0xffe4bf3f*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4bf41","code":"unsigned int __thiscall BaseAsciiStrLen(_BYTE *this)\n{\n _BYTE *this_1; // esi\n int DebugLib; // eax\n unsigned int n0xF4240; // edi\n int v4; // eax\n\n this_1 = this; /*0xffe4bf43*/\n if ( !this ) /*0xffe4bf4d*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bf4f*/\n if ( DebugLib ) /*0xffe4bf56*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4bf63*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\String.c\",\n 1082,\n \"String != ((void *) 0)\");\n }\n n0xF4240 = 0; /*0xffe4bf69*/\n while ( *this_1 ) /*0xffe4bf94*/\n {\n if ( n0xF4240 >= 0xF4240 ) /*0xffe4bf73*/\n {\n v4 = DebugGetDebugLib(); /*0xffe4bf75*/\n if ( v4 ) /*0xffe4bf7c*/\n (*(void ( **)(const char *, int, const char *))(v4 + 4))( /*0xffe4bf89*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\String.c\",\n 1090,\n \"Length < _gPcd_FixedAtBuild_PcdMaximumAsciiStringLength\");\n }\n ++this_1; /*0xffe4bf8f*/\n ++n0xF4240; /*0xffe4bf90*/\n }\n return n0xF4240; /*0xffe4bf98*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4bf9c","code":"char InternalSafeStringNoOverlap(unsigned int CopyPool, int n0xF4240, unsigned int CopyPoola, int a4)\n{\n if ( CopyPoola > CopyPool ) /*0xffe4bfa3*/\n goto LABEL_4; /*0xffe4bfa3*/\n if ( CopyPool < CopyPoola + a4 ) /*0xffe4bfad*/\n return 1; /*0xffe4bfbd*/\n if ( CopyPoola >= CopyPool ) /*0xffe4bfb1*/\n {\nLABEL_4:\n if ( CopyPoola < CopyPool + n0xF4240 ) /*0xffe4bfb8*/\n return 1; /*0xffe4bfb8*/\n }\n return 0; /*0xffe4bfbc*/\n}"} - -{"addr":"0xffe4bfc2","code":"unsigned int BaseAsciiStrnLenS(_BYTE *CopyPool, int n0xF4240)\n{\n unsigned int result; // eax\n\n if ( !CopyPool || !n0xF4240 ) /*0xffe4bfc9*/\n return 0; /*0xffe4bfe5*/\n result = 0; /*0xffe4bfcb*/\n if ( *CopyPool ) /*0xffe4bfcd*/\n {\n while ( result < n0xF4240 - 1 ) /*0xffe4bfd6*/\n {\n if ( !CopyPool[++result] ) /*0xffe4bfd9*/\n return result; /*0xffe4bfdd*/\n }\n return n0xF4240; /*0xffe4bfe1*/\n }\n return result; /*0xffe4bfdf*/\n}"} - -{"addr":"0xffe4bfe9","code":"int BaseAsciiStrCpyS(_BYTE *CopyPool, unsigned int n0xF4240, _BYTE *CopyPoola)\n{\n unsigned int v5; // ebp\n int v6; // edx\n int n0xF4240_1; // edx\n int DebugLib; // eax\n _BYTE *CopyPoola_1; // edi\n int v11; // eax\n int v12; // eax\n int v13; // eax\n int v14; // eax\n unsigned int v15; // eax\n unsigned int v16; // edx\n int v17; // eax\n int v19; // eax\n _BYTE *v20; // esi\n\n v5 = BaseAsciiStrnLenS(CopyPool, n0xF4240); /*0xffe4bff5*/\n n0xF4240_1 = v6 - v5; /*0xffe4bff7*/\n if ( !CopyPool ) /*0xffe4bffb*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4bffd*/\n if ( DebugLib ) /*0xffe4c004*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c015*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 1996,\n \"(Destination != ((void *) 0))\");\n return -2147483646; /*0xffe4c020*/\n }\n CopyPoola_1 = CopyPoola; /*0xffe4c026*/\n if ( !CopyPoola ) /*0xffe4c02c*/\n {\n v11 = DebugGetDebugLib(); /*0xffe4c02e*/\n if ( v11 ) /*0xffe4c035*/\n (*(void ( **)(const char *, int, const char *))(v11 + 4))( /*0xffe4c041*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 1997,\n \"(Source != ((void *) 0))\");\n return -2147483646; /*0xffe4c087*/\n }\n if ( n0xF4240 > 0xF4240 ) /*0xffe4c049*/\n {\n v12 = DebugGetDebugLib(); /*0xffe4c04b*/\n if ( v12 ) /*0xffe4c052*/\n (*(void ( **)(const char *, int, const char *))(v12 + 4))( /*0xffe4c05e*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 2003,\n \"(DestMax <= (_gPcd_FixedAtBuild_PcdMaximumAsciiStringLength))\");\n return -2147483646; /*0xffe4c05e*/\n }\n if ( !n0xF4240 ) /*0xffe4c062*/\n {\n v13 = DebugGetDebugLib(); /*0xffe4c064*/\n if ( v13 ) /*0xffe4c06b*/\n (*(void ( **)(const char *, int, const char *))(v13 + 4))( /*0xffe4c07c*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 2009,\n \"(DestMax != 0)\");\n return -2147483646; /*0xffe4c07c*/\n }\n if ( n0xF4240_1 ) /*0xffe4c08e*/\n {\n v15 = BaseAsciiStrnLenS(CopyPoola, n0xF4240_1); /*0xffe4c0ba*/\n if ( v16 > v15 ) /*0xffe4c0c1*/\n {\n if ( InternalSafeStringNoOverlap((unsigned int)CopyPool, n0xF4240, (unsigned int)CopyPoola, v15 + 1) ) /*0xffe4c0ef*/\n {\n v19 = DebugGetDebugLib(); /*0xffe4c0fd*/\n if ( v19 ) /*0xffe4c104*/\n (*(void ( **)(const char *, int, const char *))(v19 + 4))( /*0xffe4c115*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 2025,\n \"InternalSafeStringNoAsciiStrOverlap (Destination, DestMax, (CHAR8 *)Source, SourceLen + 1)\");\n return -2147483633; /*0xffe4c11f*/\n }\n else\n {\n v20 = &CopyPool[v5]; /*0xffe4c126*/\n while ( *CopyPoola_1 ) /*0xffe4c132*/\n *v20++ = *CopyPoola_1++; /*0xffe4c12a*/\n *v20 = 0; /*0xffe4c134*/\n return 0; /*0xffe4c136*/\n }\n }\n else\n {\n v17 = DebugGetDebugLib(); /*0xffe4c0c3*/\n if ( v17 ) /*0xffe4c0ca*/\n (*(void ( **)(const char *, int, const char *))(v17 + 4))( /*0xffe4c0db*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 2020,\n \"(CopyLen > SourceLen)\");\n return -2147483643; /*0xffe4c0e1*/\n }\n }\n else\n {\n v14 = DebugGetDebugLib(); /*0xffe4c090*/\n if ( v14 ) /*0xffe4c097*/\n (*(void ( **)(const char *, int, const char *))(v14 + 4))( /*0xffe4c0a8*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\SafeString.c\",\n 2014,\n \"(CopyLen != 0)\");\n return -2147483644; /*0xffe4c0ae*/\n }\n}","refs":[{"addr":"0xffe4bfc2","name":"BaseAsciiStrnLenS"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4bf9c","name":"InternalSafeStringNoOverlap"}]} - -{"addr":"0xffe4c13d","code":"int HobGetHobList()\n{\n int PeiServicesTable; // eax\n int v1; // eax\n int DebugLib; // eax\n int v3; // eax\n int v5; // [esp+4h] [ebp-4h] BYREF\n\n PeiServicesTable = GetPeiServicesTable(); /*0xffe4c142*/\n v1 = (*(int ( **)(int, int *))(*(_DWORD *)PeiServicesTable + 48))(PeiServicesTable, &v5); /*0xffe4c14e*/\n if ( v1 < 0 ) /*0xffe4c15a*/\n {\n DebugPrint(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v1); /*0xffe4c167*/\n DebugLib = DebugGetDebugLib(); /*0xffe4c16f*/\n if ( DebugLib ) /*0xffe4c176*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c180*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 50,\n \"!EFI_ERROR (Status)\");\n }\n if ( !v5 ) /*0xffe4c18a*/\n {\n v3 = DebugGetDebugLib(); /*0xffe4c18c*/\n if ( v3 ) /*0xffe4c193*/\n (*(void ( **)(const char *, int, const char *))(v3 + 4))( /*0xffe4c19d*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 51,\n \"HobList != ((void *) 0)\");\n }\n return v5; /*0xffe4c1a6*/\n}","refs":[{"addr":"0xffe4c4ef","name":"GetPeiServicesTable"},{"addr":"0xffe4be49","name":"DebugPrint"},{"addr":"0xffe4c598","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c5bc","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"}]} - -{"addr":"0xffe4c1ab","code":"_WORD *HobGetNextHob(int a1, _WORD *i)\n{\n _WORD *i_1; // esi\n int DebugLib; // eax\n\n i_1 = i; /*0xffe4c1ac*/\n if ( !i ) /*0xffe4c1b0*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4c1b2*/\n if ( DebugLib ) /*0xffe4c1b9*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c1c7*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 82,\n \"HobStart != ((void *) 0)\");\n }\n while ( 1 ) /*0xffe4c1e0*/\n {\n if ( *i_1 == 0xFFFF ) /*0xffe4c1e6*/\n return 0; /*0xffe4c1eb*/\n if ( *i_1 == 4 ) /*0xffe4c1d8*/\n break; /*0xffe4c1d8*/\n i_1 = (_WORD *)((char *)i_1 + (unsigned __int16)i_1[1]); /*0xffe4c1de*/\n }\n return i_1; /*0xffe4c1ea*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4c1f0","code":"_WORD *__thiscall HobGetNextGuidHob(void *this)\n{\n _WORD *i; // edx\n int v3; // ecx\n _WORD *NextHob; // eax\n _WORD *NextHob_1; // esi\n\n for ( i = (_WORD *)HobGetHobList(); ; i = (_WORD *)((char *)NextHob_1 + (unsigned __int16)NextHob_1[1]) ) /*0xffe4c1ff*/\n {\n NextHob = HobGetNextHob(v3, i); /*0xffe4c217*/\n NextHob_1 = NextHob; /*0xffe4c21c*/\n if ( !NextHob || CompareGuid((int)this, (int)(NextHob + 4)) ) /*0xffe4c208*/\n break; /*0xffe4c208*/\n }\n return NextHob_1; /*0xffe4c222*/\n}","refs":[{"addr":"0xffe4c13d","name":"HobGetHobList"},{"addr":"0xffe4c1ab","name":"HobGetNextHob"},{"addr":"0xffe4c315","name":"CompareGuid"}]} - -{"addr":"0xffe4c22a","code":"int HobGetFirstGuidHob(int a1, int a2)\n{\n int PeiServicesTable; // eax\n int DebugLib; // eax\n int v6; // [esp+4h] [ebp-4h] BYREF\n\n PeiServicesTable = GetPeiServicesTable(); /*0xffe4c231*/\n if ( (*(int ( **)(int, int, int, int *))(*(_DWORD *)PeiServicesTable + 52))(PeiServicesTable, 4, a2, &v6) < 0 ) /*0xffe4c249*/\n v6 = 0; /*0xffe4c24b*/\n if ( !v6 ) /*0xffe4c253*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4c255*/\n if ( DebugLib ) /*0xffe4c25c*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c26d*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 250,\n \"Hob != ((void *) 0)\");\n }\n return v6; /*0xffe4c246*/\n}","refs":[{"addr":"0xffe4c4ef","name":"GetPeiServicesTable"},{"addr":"0xffe4be18","name":"DebugGetDebugLib"}]} - -{"addr":"0xffe4c27a","code":"int HobBuildGuidHob(int a1, unsigned int n0xFFE0)\n{\n int DebugLib; // eax\n int v5; // eax\n int result; // eax\n int v7; // esi\n\n if ( !a1 ) /*0xffe4c288*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4c28a*/\n if ( DebugLib ) /*0xffe4c291*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c29e*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 416,\n \"Guid != ((void *) 0)\");\n }\n if ( n0xFFE0 > 0xFFE0 ) /*0xffe4c2aa*/\n {\n v5 = DebugGetDebugLib(); /*0xffe4c2ac*/\n if ( v5 ) /*0xffe4c2b3*/\n (*(void ( **)(const char *, int, const char *))(v5 + 4))( /*0xffe4c2c0*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 421,\n \"DataLength <= (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE))\");\n }\n result = HobGetFirstGuidHob(a1, n0xFFE0 + 24); /*0xffe4c2c9*/\n v7 = result; /*0xffe4c2ce*/\n if ( result ) /*0xffe4c2d2*/\n {\n HobCopyGuid(result + 8, a1); /*0xffe4c2d9*/\n return v7 + 24; /*0xffe4c2de*/\n }\n return result; /*0xffe4c2e1*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c22a","name":"HobGetFirstGuidHob"},{"addr":"0xffe4c2e5","name":"HobCopyGuid"}]} - -{"addr":"0xffe4c2e5","code":"int HobCopyGuid(int a1, int a2)\n{\n __int64 Unaligned64; // rax\n __int64 Unaligned64_1; // rax\n\n Unaligned64 = BaseReadUnaligned64((void *)a2); /*0xffe4c2ed*/\n BaseWriteUnaligned64(Unaligned64, SHIDWORD(Unaligned64)); /*0xffe4c2f6*/\n Unaligned64_1 = BaseReadUnaligned64((void *)(a2 + 8)); /*0xffe4c2fe*/\n BaseWriteUnaligned64(Unaligned64_1, SHIDWORD(Unaligned64_1)); /*0xffe4c308*/\n return a1; /*0xffe4c312*/\n}","refs":[{"addr":"0xffe4bee1","name":"BaseReadUnaligned64"},{"addr":"0xffe4bf0d","name":"BaseWriteUnaligned64"}]} - -{"addr":"0xffe4c315","code":"bool CompareGuid(int this, int a2)\n{\n __int64 Unaligned64; // rax\n int Unaligned64_1; // ebp\n __int64 Unaligned64_3; // rax\n int Unaligned64_2; // edi\n __int64 v8; // kr00_8\n __int64 v9; // rax\n int v11; // [esp+10h] [ebp-Ch]\n int v12; // [esp+14h] [ebp-8h]\n\n Unaligned64 = BaseReadUnaligned64((void *)this); /*0xffe4c320*/\n v12 = HIDWORD(Unaligned64); /*0xffe4c327*/\n Unaligned64_1 = Unaligned64; /*0xffe4c32b*/\n Unaligned64_3 = BaseReadUnaligned64((void *)a2); /*0xffe4c32d*/\n v11 = HIDWORD(Unaligned64_3); /*0xffe4c335*/\n Unaligned64_2 = Unaligned64_3; /*0xffe4c339*/\n v8 = BaseReadUnaligned64((void *)(this + 8)); /*0xffe4c347*/\n v9 = BaseReadUnaligned64((void *)(a2 + 8)); /*0xffe4c349*/\n return Unaligned64_1 == Unaligned64_2 && v12 == v11 && v8 == v9; /*0xffe4c36c*/\n}","refs":[{"addr":"0xffe4bee1","name":"BaseReadUnaligned64"}]} - -{"addr":"0xffe4c374","code":"unsigned int ScanGuid(unsigned int ExMapTable, unsigned int a2, int TokenSpaceGuid)\n{\n unsigned int ExMapTable_1; // eax\n int DebugLib; // eax\n int v6; // eax\n int v7; // eax\n unsigned int ExMapTable_2; // esi\n\n ExMapTable_1 = ExMapTable; /*0xffe4c37c*/\n if ( (ExMapTable & 3) != 0 ) /*0xffe4c38d*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4c38f*/\n if ( DebugLib ) /*0xffe4c396*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c3a3*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\MemLibGuid.c\",\n 129,\n \"((UINTN)Buffer & (sizeof (Guid->Data1) - 1)) == 0\");\n ExMapTable_1 = ExMapTable; /*0xffe4c3a9*/\n }\n if ( a2 > -ExMapTable_1 ) /*0xffe4c3b1*/\n {\n v6 = DebugGetDebugLib(); /*0xffe4c3b3*/\n if ( v6 ) /*0xffe4c3ba*/\n (*(void ( **)(const char *, int, const char *))(v6 + 4))( /*0xffe4c3c7*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\MemLibGuid.c\",\n 130,\n \"Length <= (0xFFFFFFFF - (UINTN)Buffer + 1)\");\n }\n if ( (a2 & 0xF) != 0 ) /*0xffe4c3d0*/\n {\n v7 = DebugGetDebugLib(); /*0xffe4c3d2*/\n if ( v7 ) /*0xffe4c3d9*/\n (*(void ( **)(const char *, int, const char *))(v7 + 4))( /*0xffe4c3e6*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\MemLibGuid.c\",\n 131,\n \"(Length & (sizeof (*GuidPtr) - 1)) == 0\");\n }\n ExMapTable_2 = ExMapTable; /*0xffe4c3f3*/\n if ( ExMapTable >= (a2 & 0xFFFFFFF0) + ExMapTable ) /*0xffe4c3fd*/\n return 0; /*0xffe4c416*/\n while ( !CompareGuid(ExMapTable_2, TokenSpaceGuid) ) /*0xffe4c40d*/\n {\n ExMapTable_2 += 16; /*0xffe4c40f*/\n if ( ExMapTable_2 >= (a2 & 0xFFFFFFF0) + ExMapTable ) /*0xffe4c414*/\n return 0; /*0xffe4c414*/\n }\n return ExMapTable_2; /*0xffe4c418*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4c315","name":"CompareGuid"}]} + SkuId_1 = SkuId; + PcdDatabase = (_DWORD *)PeiPcdGetPcdDb (); + SkuIndex = 0; + SkuId_2 = PcdDatabase[6]; + if (SkuId != SkuId_2 || PcdDatabase[7]) { + if (*((_QWORD *)PcdDatabase + 3)) { + DebugPrint (0x80000000, "PcdPei - The SKU Id could be changed only once."); + DebugPrint ( + 0x80000000, + "PcdPei - The SKU Id was set to 0x%lx already, it could not be set to 0x%lx any more.", + PcdDatabase[6], + PcdDatabase[7] + ); + SkuId_2 = DebugGetDebugLib (); + if (SkuId_2) { + return (*(int ( **)(const char *, int, const char *))(SkuId_2 + 4)) ( + "e:\\hs\\MdeModulePkg\\Universal\\PCD\\Pei\\Pcd.c", + 281, + "((BOOLEAN)(0==1))" + ); + } + } else { + SkuTable = (_DWORD *)((char *)PcdDatabase + PcdDatabase[14]); + TableFlag = SkuTable[1]; + SkuIndex_1 = *SkuTable; + if (TableFlag || SkuIndex_1) { + for (SkuEntry = SkuTable + 2; ; SkuEntry += 2) { + if (SkuId_1 == *SkuEntry) { + SkuId_1 = SkuId; + if (!SkuEntry[1]) { + break; + } + } + ++SkuIndex; + if (!TableFlag && SkuIndex >= SkuIndex_1) { + return DebugPrint (64, "PcdPei - Invalid input SkuId, the default SKU Id will be still used.\n"); + } + } + SkuId_2 = DebugPrint (64, "PcdPei - Set current SKU Id to 0x%lx.\n", SkuId); + PcdDatabase[6] = SkuId; + PcdDatabase[7] = 0; + } else { + return DebugPrint (64, "PcdPei - Invalid input SkuId, the default SKU Id will be still used.\n"); + } + } + } + return SkuId_2; +} -{"addr":"0xffe4c423","code":"char *CopyMemWrapper(char *buf, char *DbBinary, unsigned int count)\n{\n char *buf_1; // eax\n int DebugLib; // eax\n int v7; // eax\n\n buf_1 = buf; /*0xffe4c42b*/\n if ( count ) /*0xffe4c432*/\n {\n if ( count - 1 > ~(unsigned int)buf ) /*0xffe4c43c*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4c43e*/\n if ( DebugLib ) /*0xffe4c445*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c453*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\CopyMemWrapper.c\",\n 56,\n \"(Length - 1) <= (0xFFFFFFFF - (UINTN)DestinationBuffer)\");\n }\n if ( count - 1 > ~(unsigned int)DbBinary ) /*0xffe4c460*/\n {\n v7 = DebugGetDebugLib(); /*0xffe4c462*/\n if ( v7 ) /*0xffe4c469*/\n (*(void ( **)(const char *, int, const char *))(v7 + 4))( /*0xffe4c477*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\CopyMemWrapper.c\",\n 57,\n \"(Length - 1) <= (0xFFFFFFFF - (UINTN)SourceBuffer)\");\n }\n if ( buf == DbBinary ) /*0xffe4c47f*/\n return buf; /*0xffe4c481*/\n else\n return BaseCopyMem(buf, DbBinary, count); /*0xffe4c488*/\n }\n return buf_1; /*0xffe4c490*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4a6b8","name":"BaseCopyMem"}]} +char +PeiPcdGet8 ( + unsigned int a1 + ) +{ + return *(_BYTE *)PeiPcdGetTokenValue (a1, 1u); +} -{"addr":"0xffe4c494","code":"void *ZeroMemWrapper(int buf, unsigned int this)\n{\n int DebugLib; // eax\n int v6; // eax\n\n if ( !this ) /*0xffe4c49c*/\n return (void *)buf; /*0xffe4c49e*/\n if ( !buf ) /*0xffe4c4aa*/\n {\n DebugLib = DebugGetDebugLib(); /*0xffe4c4ac*/\n if ( DebugLib ) /*0xffe4c4b3*/\n (*(void ( **)(const char *, int, const char *))(DebugLib + 4))( /*0xffe4c4bd*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\ZeroMemWrapper.c\",\n 53,\n \"Buffer != ((void *) 0)\");\n }\n if ( this > -buf ) /*0xffe4c4c9*/\n {\n v6 = DebugGetDebugLib(); /*0xffe4c4cb*/\n if ( v6 ) /*0xffe4c4d2*/\n (*(void ( **)(const char *, int, const char *))(v6 + 4))( /*0xffe4c4dc*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\ZeroMemWrapper.c\",\n 54,\n \"Length <= (0xFFFFFFFF - (UINTN)Buffer + 1)\");\n }\n return BaseZeroMem((void *)buf, this); /*0xffe4c4ec*/\n}","refs":[{"addr":"0xffe4be18","name":"DebugGetDebugLib"},{"addr":"0xffe4a6f8","name":"BaseZeroMem"}]} +__int16 +PeiPcdGet16 ( + unsigned int a1 + ) +{ + int TokenValue; + int DebugLib; -{"addr":"0xffe4c4ef","code":"int GetPeiServicesTable()\n{\n int v0; // esi\n _BYTE v2[8]; // [esp+4h] [ebp-8h] BYREF\n\n GetIdtr(v2); /*0xffe4c4f8*/\n v0 = *(_DWORD *)(*(_DWORD *)&v2[2] - 4); /*0xffe4c500*/\n if ( !v0 ) /*0xffe4c505*/\n DebugAssert( /*0xffe4c514*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n \"PeiServices != ((void *) 0)\");\n return v0; /*0xffe4c51c*/\n}","refs":[{"addr":"0xffe4c570","name":"GetIdtr"},{"addr":"0xffe4be73","name":"DebugAssert"},{"addr":"0xffe4ce9c","name":"PeiServices____((void__)_0)","string":"PeiServices != ((void *) 0)"}]} + TokenValue = PeiPcdGetTokenValue (a1, 2u); + if (!TokenValue) { + DebugLib = DebugGetDebugLib (); + if (DebugLib) { + (*(void ( **)(const char *, int, const char *))(DebugLib + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", + 38, + "Buffer != ((void *) 0)" + ); + } + } + return *(_WORD *)TokenValue; +} -{"addr":"0xffe4c521","code":"int DebugGetDebugLevel()\n{\n unsigned __int8 v0; // al\n char n3; // al\n char n3_1; // cl\n\n v0 = __inbyte(0x70u); /*0xffe4c527*/\n __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe4c52c*/\n n3 = __inbyte(0x71u); /*0xffe4c533*/\n n3_1 = n3; /*0xffe4c534*/\n if ( (unsigned __int8)n3 <= 3u ) /*0xffe4c539*/\n {\nLABEL_4:\n if ( !n3_1 ) /*0xffe4c554*/\n return 0; /*0xffe4c554*/\n goto LABEL_5; /*0xffe4c554*/\n }\n n3_1 = n3; /*0xffe4c53b*/\n if ( !n3 ) /*0xffe4c543*/\n {\n n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe4c54f*/\n goto LABEL_4; /*0xffe4c54f*/\n }\nLABEL_5:\n if ( n3_1 != -1 )\n return n3_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe4c56c*/\n}","refs":[{"addr":"0xffe4d254","name":"n3"}]} +int +PeiPcdGet32 ( + unsigned int a1 + ) +{ + int TokenValue; + int DebugLib; -{"addr":"0xffe4c570","code":"void *__thiscall GetIdtr(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe4c576*/\n DebugAssert((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, \"Idtr != ((void *) 0)\"); /*0xffe4c585*/\n this_1 = this; /*0xffe4c58b*/\n __sidt(this); /*0xffe4c58e*/\n return this_1; /*0xffe4c592*/\n}","refs":[{"addr":"0xffe4be73","name":"DebugAssert"}]} + TokenValue = PeiPcdGetTokenValue (a1, 4u); + if (!TokenValue) { + DebugLib = DebugGetDebugLib (); + if (DebugLib) { + (*(void ( **)(const char *, int, const char *))(DebugLib + 4)) ( + "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", + 141, + "Buffer != ((void *) 0)" + ); + } + } + return *(_DWORD *)TokenValue; +} diff --git a/PurleyRpPkg/Platform/Dxe/Setup/DxePlatform/Platform/Platform.h b/PurleyRpPkg/Platform/Dxe/Setup/DxePlatform/Platform/Platform.h index 01cf494..3e63cf4 100644 --- a/PurleyRpPkg/Platform/Dxe/Setup/DxePlatform/Platform/Platform.h +++ b/PurleyRpPkg/Platform/Dxe/Setup/DxePlatform/Platform/Platform.h @@ -81,7 +81,6 @@ EFI_SYSTEM_TABLE *SystemTable ); -{"addr":"0x490","code":"__int64 EFIAPI DriverInit( __int64 ImageHandle, @@ -101,7 +100,6 @@ VOID ); -{"addr":"0x9ec","code":"__int64 EFIAPI DriverEntryMain( __int64 ImageHandle, @@ -137,7 +135,7 @@ __int64 EFIAPI HiiExtractConfig( - __int64 *p_psub_1B18, + __int64 *ConfigData, CHAR16 *ZeroPool, CHAR16 **a3, __int64 a4 @@ -164,7 +162,6 @@ char **a3 ); -{"addr":"0x20c0","code":"unsigned __int64 EFIAPI SetupFormCallback( __int64 a1, @@ -186,7 +183,6 @@ VOID ); -{"addr":"0x2ba8","code":"char EFIAPI SetupRouteHandler( _BYTE *a1 @@ -217,7 +213,6 @@ __int64 DiskDataBuffer ); -{"addr":"0x36a0","code":"__int64 EFIAPI PopulateDiskInfoRecords( VOID @@ -229,11 +224,10 @@ VOID ); -{"addr":"0x3e14","code":"void EFIAPI MeInitSpsInfo( - \n __int64 (__fastcall **a1)(_QWORD, __int64 *, __int64, __int64 *, int, int, int, int), - \n __int64 n0x14 + __int64 (__fastcall **a1)(_QWORD, __int64 *, __int64, __int64 *, int, int, int, int), + __int64 n0x14 ); unsigned __int64 @@ -307,7 +301,7 @@ UINTN EFIAPI AsciiStrnLenS( - const CHAR8 *%02d_%02d_%04d__%02d:%02d, + const CHAR8 *SourceString, UINTN MaxSize ); @@ -531,14 +525,13 @@ VOID ); -{"addr":"0x665c","code":"unsigned __int64 EFIAPI PrintLibUnicodeVSPrint( - \n unsigned __int64 _r_n, - \n UINTN n0xF4240, - \n __int16 n320, - \n CHAR8 *%02d_%02d_%04d__%02d:%02d, - \n unsigned __int16 **va + unsigned __int64 _r_n, + UINTN n0xF4240, + __int16 n320, + CHAR8 *Format, + unsigned __int16 **va ); unsigned __int64 @@ -547,7 +540,7 @@ _BYTE *_r_n, UINTN n38, __int16 n320, - char *%02d_%02d_%04d__%02d:%02d, + char *Format, ... ); @@ -744,7 +737,6 @@ VOID ); -{"addr":"0x8760","code":"__int64 EFIAPI VariableServicesInit( VOID @@ -842,7 +834,6 @@ __int64 *a3 ); -{"addr":"0x9c04","code":"bool EFIAPI CheckActionFlag( __int64 a1 @@ -1004,4 +995,4 @@ unsigned int *a1 ); -#endif /* __PLATFORM_H__ */ \ No newline at end of file +#endif /* __PLATFORM_H__ */ diff --git a/UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei/PiSmmCommunicationPei.c b/UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei/PiSmmCommunicationPei.c index 0072a83..d5ead01 100644 --- a/UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei/PiSmmCommunicationPei.c +++ b/UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei/PiSmmCommunicationPei.c @@ -1,59 +1,263 @@ -// -// PiSmmCommunicationPei.efi - Full Decompilation -// Source: IDA Pro MCP port 13387 -// Functions: 25 -// - #include #include -{"addr":"0xffe32900","code":"char *internal_memcpy(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe3290a*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe32918*/\n {\n src_1 = &src[count - 1]; /*0xffe3292c*/\n dst_1 = &dst[count - 1]; /*0xffe3292e*/\n }\n else\n {\n count_1 = count & 3; /*0xffe3291c*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe32925*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe32925*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe32925*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe32935*/\n return dst; /*0xffe3293c*/\n}"} +void *internal_memcpy(char *dst, char *src, unsigned int count) +{ + unsigned int count_1; + char *dst_1; + char *src_1; -{"addr":"0xffe32940","code":"void *internal_memset(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe3294d*/\n return buf; /*0xffe32953*/\n}"} + count_1 = count; + if (src < dst && &src[count - 1] >= dst) { + src_1 = &src[count - 1]; + dst_1 = &dst[count - 1]; + } else { + count_1 = count & 3; + qmemcpy(dst, src, 4 * (count >> 2)); + src_1 = &src[4 * (count >> 2)]; + dst_1 = &dst[4 * (count >> 2)]; + } -{"addr":"0xffe32980","code":"int fn_addr(int a1, int a2, int a3, int a4)\n{\n do /*0xffe32999*/\n {\n *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe32991*/\n *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe32995*/\n }\n while ( a2 ); /*0xffe32999*/\n return a1; /*0xffe3299d*/\n}"} + qmemcpy(dst_1, src_1, count_1); + return dst; +} -{"addr":"0xffe329a0","code":"void *sub_FFE329A0(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe329ad*/\n return buf; /*0xffe329b3*/\n}"} +void *internal_memset(void *buf, unsigned int count, char value) +{ + memset(buf, value, count); + return buf; +} -{"addr":"0xffe329b5","code":"// attributes: thunk\nEFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n return ModuleEntryPoint_0(ImageHandle, SystemTable);\n}","refs":[{"addr":"0xffe32cca","name":"_ModuleEntryPoint_0"}]} +int fn_addr(int a1, int a2, int a3, int a4) +{ + do { + *(_DWORD *)(a1 + 8 * a2 - 8) = a3; + *(_DWORD *)(a1 + 8 * a2-- - 4) = a4; + } while (a2); -{"addr":"0xffe329ba","code":"int sub_FFE329BA(int n1397574995, int n875978547)\n{\n _DWORD *v2; // ecx\n _DWORD *v3; // esi\n unsigned int v4; // ebp\n int i_1; // ebx\n int v6; // esi\n int j; // edi\n int v9; // eax\n unsigned int v10; // ebp\n int v11; // esi\n int i; // edi\n\n v3 = v2; /*0xffe329c7*/\n if ( n1397574995 != 1397574995 || n875978547 != 875978547 )\n {\n sub_FFE32DD6(64, \"InitCommunicationContext - SmmConfigurationTable: %x\\n\", v2[23]);\n sub_FFE32DD6(64, \"InitCommunicationContext - NumberOfTableEntries: %x\\n\", v3[22]);\n v10 = v3[22]; /*0xffe32a62*/\n i_1 = v3[23]; /*0xffe32a68*/\n v11 = 0; /*0xffe32a6b*/\n if ( v10 ) /*0xffe32a6f*/\n {\n for ( i = i_1; !sub_FFE33012(i, (int)&unk_FFE337C0); i += 20 ) /*0xffe32a71*/\n {\n if ( ++v11 >= v10 ) /*0xffe32a89*/\n return 0; /*0xffe32a89*/\n }\n v9 = 20 *v11; /*0xffe32a8d*/\n return *(_DWORD *)(v9 + i_1 + 16); /*0xffe32a8d*/\n }\n return 0; /*0xffe32a3b*/\n }\n sub_FFE32DD6(64, \"InitCommunicationContext - SmmConfigurationTable: %x\\n\", v2[40]);\n sub_FFE32DD6(64, \"InitCommunicationContext - NumberOfTableEntries: %x\\n\", v3[38]);\n v4 = v3[38]; /*0xffe32a05*/\n i_1 = v3[40]; /*0xffe32a0e*/\n v6 = 0; /*0xffe32a14*/\n if ( !v4 ) /*0xffe32a18*/\n return 0; /*0xffe32a18*/\n for ( j = i_1; !sub_FFE33012(j, (int)&unk_FFE337C0); j += 24 ) /*0xffe32a1a*/\n {\n if ( ++v6 >= v4 ) /*0xffe32a32*/\n return 0; /*0xffe32a32*/\n }\n v9 = 24 *v6; /*0xffe32a3c*/\n return *(_DWORD *)(v9 + i_1 + 16); /*0xffe32a36*/\n}","refs":[{"addr":"0xffe32dd6","name":"sub_FFE32DD6"},{"addr":"0xffe331dc","name":"aInitcommunicat_1","string":"InitCommunicationContext - SmmConfigurationTable: %x\n"},{"addr":"0xffe33214","name":"aInitcommunicat_2","string":"InitCommunicationContext - NumberOfTableEntries: %x\n"},{"addr":"0xffe33012","name":"sub_FFE33012"},{"addr":"0xffe337c0","name":"unk_FFE337C0"}]} + return a1; +} -{"addr":"0xffe32a96","code":"char *sub_FFE32A96()\n{\n _WORD *v0; // esi\n int v1; // eax\n int *p_n1397574995; // esi\n void *v3; // ecx\n char *src; // edi\n int v5; // eax\n char *dst; // esi\n int v7; // eax\n\n v0 = sub_FFE32ED1(&unk_FFE337A0); /*0xffe32aaa*/\n if ( !v0 ) /*0xffe32ab3*/\n {\n v1 = sub_FFE32DA5(); /*0xffe32ab5*/\n if ( v1 ) /*0xffe32abc*/\n (*(void ( **)(const char *, int, const char *))(v1 + 4))( /*0xffe32ac9*/\n \"e:\\\\hs\\\\UefiCpuPkg\\\\PiSmmCommunication\\\\PiSmmCommunicationPei.c\",\n 250,\n \"GuidHob != ((void *) 0)\");\n }\n p_n1397574995 = (int *)*((_DWORD *)v0 + 8); /*0xffe32acf*/\n sub_FFE32DD6(64, \"InitCommunicationContext - SmmS3ResumeState: %x\\n\", p_n1397574995);\n sub_FFE32DD6(64, \"InitCommunicationContext - Smst: %x\\n\", *(int *)((char *)p_n1397574995 + 90));\n src = (char *)sub_FFE329BA(*p_n1397574995, p_n1397574995[1]); /*0xffe32b01*/\n if ( !src ) /*0xffe32b08*/\n {\n v5 = sub_FFE32DA5(); /*0xffe32b0a*/\n if ( v5 ) /*0xffe32b11*/\n (*(void ( **)(const char *, int, const char *))(v5 + 4))( /*0xffe32b1e*/\n \"e:\\\\hs\\\\UefiCpuPkg\\\\PiSmmCommunication\\\\PiSmmCommunicationPei.c\",\n 262,\n \"SmmCommunicationContext != ((void *) 0)\");\n }\n dst = (char *)sub_FFE32F54(v3); /*0xffe32b29*/\n if ( !dst ) /*0xffe32b2d*/\n {\n v7 = sub_FFE32DA5(); /*0xffe32b2f*/\n if ( v7 ) /*0xffe32b36*/\n (*(void ( **)(const char *, int, const char *))(v7 + 4))( /*0xffe32b43*/\n \"e:\\\\hs\\\\UefiCpuPkg\\\\PiSmmCommunication\\\\PiSmmCommunicationPei.c\",\n 180,\n \"Hob.Raw\");\n }\n return sub_FFE32F72(dst, src, 0x10u); /*0xffe32b55*/\n}","refs":[{"addr":"0xffe32ed1","name":"sub_FFE32ED1"},{"addr":"0xffe337a0","name":"unk_FFE337A0"},{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33198","name":"aEHsUeficpupkgP","string":"e:\\hs\\UefiCpuPkg\\PiSmmCommunication\\PiSmmCommunicationPei.c"},{"addr":"0xffe33180","name":"aGuidhobVoid0","string":"GuidHob != ((void *) 0)"},{"addr":"0xffe32dd6","name":"sub_FFE32DD6"},{"addr":"0xffe3324c","name":"aInitcommunicat","string":"InitCommunicationContext - SmmS3ResumeState: %x\n"},{"addr":"0xffe33280","name":"aInitcommunicat_0","string":"InitCommunicationContext - Smst: %x\n"},{"addr":"0xffe329ba","name":"sub_FFE329BA"},{"addr":"0xffe332a8","name":"aSmmcommunicati","string":"SmmCommunicationContext != ((void *) 0)"},{"addr":"0xffe32f54","name":"sub_FFE32F54"},{"addr":"0xffe331d4","name":"aHobRaw","string":"Hob.Raw"},{"addr":"0xffe32f72","name":"sub_FFE32F72"}]} +void *sub_FFE329A0(void *buf, unsigned int count, int value) +{ + memset32(buf, value, count); + return buf; +} -{"addr":"0xffe32b5c","code":"int sub_FFE32B5C(int a1, int a2)\n{\n int v3; // eax\n int v4; // eax\n _WORD *v5; // esi\n int v6; // eax\n _DWORD *v7; // eax\n int v8; // eax\n int v9; // eax\n int v10; // eax\n _DWORD *v11; // eax\n int ( **v12)(int, _DWORD, _BYTE *, int *, _DWORD, _DWORD); // [esp-14h] [ebp-34h]\n char v13; // [esp+13h] [ebp-Dh] BYREF\n int ( **v14)(int, _DWORD, char *, int *, _DWORD, _DWORD); // [esp+14h] [ebp-Ch] BYREF\n int v15; // [esp+18h] [ebp-8h] BYREF\n int v16; // [esp+1Ch] [ebp-4h] BYREF\n\n sub_FFE32DD6(64, \"PiSmmCommunicationPei Communicate Enter\\n\"); /*0xffe32b6f*/\n if ( !a2 ) /*0xffe32b7b*/\n return -2147483646; /*0xffe32b82*/\n v3 = sub_FFE330D1(); /*0xffe32b87*/\n if ( (*(int ( **)(int, void *, _DWORD, _DWORD, int ( ***)(int, _DWORD, char *, int *, _DWORD, _DWORD)))(*(_DWORD *)v3 + 32))( /*0xffe32ba5*/\n v3,\n &unk_FFE337B0,\n 0,\n 0,\n &v14) < 0 )\n return -2147483629; /*0xffe32ba5*/\n v4 = sub_FFE330D1(); /*0xffe32bb1*/\n if ( (*(int ( **)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)v4 + 32))(v4, &unk_FFE33780, 0, 0, &v15) < 0 ) /*0xffe32bcd*/\n return -2147483629; /*0xffe32bcd*/\n if ( !*(_BYTE *)(v15 + 16) ) /*0xffe32bd3*/\n {\n sub_FFE32DD6(64, \"PiSmmCommunicationPei LockState - %x\\n\", 0); /*0xffe32be0*/\n return -2147483629; /*0xffe32bac*/\n }\n v5 = sub_FFE32ED1(&unk_FFE337C0); /*0xffe32bf4*/\n if ( !v5 ) /*0xffe32bf8*/\n {\n v6 = sub_FFE32DA5(); /*0xffe32bfa*/\n if ( v6 ) /*0xffe32c01*/\n (*(void ( **)(const char *, int, const char *))(v6 + 4))( /*0xffe32c12*/\n \"e:\\\\hs\\\\UefiCpuPkg\\\\PiSmmCommunication\\\\PiSmmCommunicationPei.c\",\n 155,\n \"GuidHob != ((void *) 0)\");\n }\n sub_FFE32DD6(\n 64,\n \"PiSmmCommunicationPei BufferPtrAddress - 0x%016lx, BufferPtr: 0x%016lx\\n\",\n *((_DWORD *)v5 + 8),\n *((_DWORD *)v5 + 9));\n v7 = (_DWORD *)*((_DWORD *)v5 + 8); /*0xffe32c30*/\n *v7 = a2; /*0xffe32c3b*/\n v7[1] = 0; /*0xffe32c3d*/\n sub_FFE32DD6(64, \"PiSmmCommunicationPei CommBuffer - %x\\n\", a2); /*0xffe32c40*/\n v13 = *((_BYTE *)v5 + 28); /*0xffe32c4b*/\n v16 = 1; /*0xffe32c53*/\n v12 = v14; /*0xffe32c63*/\n v8 = sub_FFE330D1(); /*0xffe32c67*/\n v9 = (*v14)(v8, v12, &v13, &v16, 0, 0); /*0xffe32c71*/\n if ( v9 < 0 ) /*0xffe32c78*/\n {\n sub_FFE32DD6(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v9); /*0xffe32c85*/\n v10 = sub_FFE32DA5(); /*0xffe32c8d*/\n if ( v10 ) /*0xffe32c94*/\n (*(void ( **)(const char *, int, const char *))(v10 + 4))( /*0xffe32ca5*/\n \"e:\\\\hs\\\\UefiCpuPkg\\\\PiSmmCommunication\\\\PiSmmCommunicationPei.c\",\n 357,\n \"!EFI_ERROR (Status)\");\n }\n v11 = (_DWORD *)*((_DWORD *)v5 + 8); /*0xffe32cab*/\n *v11 = 0; /*0xffe32cb5*/\n v11[1] = 0; /*0xffe32cb7*/\n sub_FFE32DD6(64, \"PiSmmCommunicationPei Communicate Exit\\n\"); /*0xffe32cba*/\n return 0; /*0xffe32cc3*/\n}","refs":[{"addr":"0xffe32dd6","name":"sub_FFE32DD6"},{"addr":"0xffe332d0","name":"aPismmcommunica","string":"PiSmmCommunicationPei Communicate Enter\n"},{"addr":"0xffe330d1","name":"sub_FFE330D1"},{"addr":"0xffe337b0","name":"unk_FFE337B0"},{"addr":"0xffe33780","name":"unk_FFE33780"},{"addr":"0xffe332fc","name":"aPismmcommunica_0","string":"PiSmmCommunicationPei LockState - %x\n"},{"addr":"0xffe32ed1","name":"sub_FFE32ED1"},{"addr":"0xffe337c0","name":"unk_FFE337C0"},{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33198","name":"aEHsUeficpupkgP","string":"e:\\hs\\UefiCpuPkg\\PiSmmCommunication\\PiSmmCommunicationPei.c"},{"addr":"0xffe33180","name":"aGuidhobVoid0","string":"GuidHob != ((void *) 0)"},{"addr":"0xffe33328","name":"aPismmcommunica_1","string":"PiSmmCommunicationPei BufferPtrAddress - 0x%016lx, BufferPtr: 0x%016lx\n"},{"addr":"0xffe33370","name":"aPismmcommunica_2","string":"PiSmmCommunicationPei CommBuffer - %x\n"},{"addr":"0xffe33398","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe333bc","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"},{"addr":"0xffe333d0","name":"aPismmcommunica_3","string":"PiSmmCommunicationPei Communicate Exit\n"}]} +EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + return PiSmmCommunicationPeiModuleEntryPoint(); +} -{"addr":"0xffe32cca","code":"int ModuleEntryPoint_0()\n{\n int v0; // eax\n int v1; // eax\n int v2; // eax\n int v4; // eax\n int v5; // esi\n int v6; // eax\n unsigned __int8 v7; // cl\n int v8; // eax\n int v9; // eax\n int v10; // eax\n int v11; // [esp-Ch] [ebp-14h]\n int n17; // [esp+0h] [ebp-8h] BYREF\n int v13; // [esp+4h] [ebp-4h] BYREF\n\n v0 = sub_FFE330D1(); /*0xffe32ccf*/\n v1 = (*(int ( **)(int, int *))(*(_DWORD *)v0 + 40))(v0, &n17); /*0xffe32cdb*/\n if ( v1 < 0 ) /*0xffe32ce2*/\n {\n sub_FFE32DD6(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v1); /*0xffe32cef*/\n v2 = sub_FFE32DA5(); /*0xffe32cf7*/\n if ( v2 ) /*0xffe32cfe*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe32d0f*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 216,\n \"!EFI_ERROR (Status)\");\n }\n if ( n17 != 17 ) /*0xffe32d19*/\n return -2147483645; /*0xffe32d1b*/\n v4 = sub_FFE330D1(); /*0xffe32d23*/\n v5 = 0; /*0xffe32d2b*/\n if ( (*(int ( **)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)v4 + 32))(v4, &unk_FFE33780, 0, 0, &v13) < 0 ) /*0xffe32d40*/\n return -2147483629; /*0xffe32d42*/\n v6 = v13; /*0xffe32d49*/\n v7 = *(_BYTE *)(v13 + 16); /*0xffe32d4c*/\n if ( v7 ) /*0xffe32d51*/\n {\n sub_FFE32DD6(64, \"PiSmmCommunicationPei LockState - %x\\n\", v7); /*0xffe32d5e*/\n return -2147483633; /*0xffe32d66*/\n }\n else\n {\n while ( 1 ) /*0xffe32d6e*/\n {\n v11 = v6; /*0xffe32d6e*/\n v8 = sub_FFE330D1(); /*0xffe32d6f*/\n v9 = (*(int ( **)(int, int, int))v13)(v8, v11, v5++); /*0xffe32d78*/\n if ( v9 < 0 ) /*0xffe32d80*/\n break; /*0xffe32d80*/\n v6 = v13; /*0xffe32d82*/\n }\n sub_FFE32A96(); /*0xffe32d87*/\n v10 = sub_FFE330D1(); /*0xffe32d8c*/\n (*(void ( **)(int, void *))(*(_DWORD *)v10 + 24))(v10, &unk_FFE337D0); /*0xffe32d99*/\n return 0; /*0xffe32d9e*/\n }\n}","refs":[{"addr":"0xffe330d1","name":"sub_FFE330D1"},{"addr":"0xffe32dd6","name":"sub_FFE32DD6"},{"addr":"0xffe33398","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33410","name":"aEHsMdepkgLibra","string":"e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c"},{"addr":"0xffe333bc","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"},{"addr":"0xffe33780","name":"unk_FFE33780"},{"addr":"0xffe332fc","name":"aPismmcommunica_0","string":"PiSmmCommunicationPei LockState - %x\n"},{"addr":"0xffe32a96","name":"sub_FFE32A96"},{"addr":"0xffe337d0","name":"unk_FFE337D0"}]} +int InitCommunicationContext(void) +{ + _DWORD *v2; + _DWORD *v3; + unsigned int v4; + int i_1; + int v6; + int j; + int v9; + unsigned int v10; + int v11; + int i; -{"addr":"0xffe32da5","code":"int sub_FFE32DA5()\n{\n int v0; // eax\n _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF\n int v3; // [esp+4h] [ebp-4h] BYREF\n\n v0 = sub_FFE330D1(); /*0xffe32daa*/\n if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)v0 + 32))(v0, &unk_FFE33790, 0, v2, &v3) >= 0 ) /*0xffe32dc9*/\n return v3; /*0xffe32dcf*/\n else\n return 0; /*0xffe32dcb*/\n}","refs":[{"addr":"0xffe330d1","name":"sub_FFE330D1"},{"addr":"0xffe33790","name":"unk_FFE33790"}]} + v3 = v2; + if (0) { + sub_FFE32DD6(64, "InitCommunicationContext - SmmConfigurationTable: %x\n", v2[23]); + sub_FFE32DD6(64, "InitCommunicationContext - NumberOfTableEntries: %x\n", v3[22]); + v10 = v3[22]; + i_1 = v3[23]; + v11 = 0; + if (v10) { + for (i = i_1; !sub_FFE33012(i, (int)&unk_FFE337C0); i += 20) { + if (++v11 >= v10) + return 0; + } + v9 = 20 * v11; + return *(_DWORD *)(v9 + i_1 + 16); + } + return 0; + } -{"addr":"0xffe32dd6","code":"int sub_FFE32DD6(int a1, const char *a2, ...)\n{\n int result; // eax\n int ( **v3)(int, const char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, a2);\n result = sub_FFE32DA5(); /*0xffe32dd7*/\n v3 = (int ( **)(int, const char *, char *))result; /*0xffe32ddc*/\n if ( result ) /*0xffe32de0*/\n {\n result = sub_FFE33103(); /*0xffe32de2*/\n if ( (result & a1) != 0 ) /*0xffe32ded*/\n return (*v3)(a1, a2, (char *)va); /*0xffe32df9*/\n }\n return result; /*0xffe32dfe*/\n}","refs":[{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33103","name":"sub_FFE33103"}]} + sub_FFE32DD6(64, "InitCommunicationContext - SmmConfigurationTable: %x\n", v2[40]); + sub_FFE32DD6(64, "InitCommunicationContext - NumberOfTableEntries: %x\n", v3[38]); + v4 = v3[38]; + i_1 = v3[40]; + v6 = 0; + if (!v4) + return 0; + for (j = i_1; !sub_FFE33012(j, (int)&unk_FFE337C0); j += 24) { + if (++v6 >= v4) + return 0; + } + v9 = 24 * v6; + return *(_DWORD *)(v9 + i_1 + 16); +} -{"addr":"0xffe32e00","code":"int sub_FFE32E00(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n int PeiServices____((void__)_0))\n{\n int result; // eax\n\n result = sub_FFE32DA5(); /*0xffe32e06*/\n if ( result ) /*0xffe32e0d*/\n return (*(int ( **)(int, int, int))(result + 4))( /*0xffe32e15*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return result; /*0xffe32e1b*/\n}","refs":[{"addr":"0xffe32da5","name":"sub_FFE32DA5"}]} +char *InitCommunicationContext_1(void) +{ + _WORD *v0; + int v1; + int *p_n1397574995; + void *v3; + char *src; + int v5; + char *dst; + int v7; -{"addr":"0xffe32e1e","code":"int sub_FFE32E1E()\n{\n int v0; // eax\n int v1; // eax\n int v2; // eax\n int v3; // eax\n int v5; // [esp+4h] [ebp-4h] BYREF\n\n v0 = sub_FFE330D1(); /*0xffe32e23*/\n v1 = (*(int ( **)(int, int *))(*(_DWORD *)v0 + 48))(v0, &v5); /*0xffe32e2f*/\n if ( v1 < 0 ) /*0xffe32e3b*/\n {\n sub_FFE32DD6(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", v1); /*0xffe32e48*/\n v2 = sub_FFE32DA5(); /*0xffe32e50*/\n if ( v2 ) /*0xffe32e57*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe32e61*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 50,\n \"!EFI_ERROR (Status)\");\n }\n if ( !v5 ) /*0xffe32e6b*/\n {\n v3 = sub_FFE32DA5(); /*0xffe32e6d*/\n if ( v3 ) /*0xffe32e74*/\n (*(void ( **)(const char *, int, const char *))(v3 + 4))( /*0xffe32e7e*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 51,\n \"HobList != ((void *) 0)\");\n }\n return v5; /*0xffe32e87*/\n}","refs":[{"addr":"0xffe330d1","name":"sub_FFE330D1"},{"addr":"0xffe32dd6","name":"sub_FFE32DD6"},{"addr":"0xffe33398","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33410","name":"aEHsMdepkgLibra","string":"e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c"},{"addr":"0xffe333bc","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"},{"addr":"0xffe33438","name":"aHoblistVoid0","string":"HobList != ((void *) 0)"}]} + v0 = sub_FFE32ED1(&unk_FFE337A0); + if (!v0) { + v1 = sub_FFE32DA5(); + if (v1) + (*(void (**)(const char *, int, const char *))(v1 + 4))( + "e:\\hs\\UefiCpuPkg\\PiSmmCommunication\\PiSmmCommunicationPei.c", + 250, + "GuidHob != ((void *) 0)"); + } + p_n1397574995 = (int *)*((_DWORD *)v0 + 8); + sub_FFE32DD6(64, "InitCommunicationContext - SmmS3ResumeState: %x\n", p_n1397574995); + sub_FFE32DD6(64, "InitCommunicationContext - Smst: %x\n", *(int *)((char *)p_n1397574995 + 90)); + src = (char *)sub_FFE329BA(*p_n1397574995, p_n1397574995[1]); + if (!src) { + v5 = sub_FFE32DA5(); + if (v5) + (*(void (**)(const char *, int, const char *))(v5 + 4))( + "e:\\hs\\UefiCpuPkg\\PiSmmCommunication\\PiSmmCommunicationPei.c", + 262, + "SmmCommunicationContext != ((void *) 0)"); + } + dst = (char *)sub_FFE32F54(v3); + if (!dst) { + v7 = sub_FFE32DA5(); + if (v7) + (*(void (**)(const char *, int, const char *))(v7 + 4))( + "e:\\hs\\UefiCpuPkg\\PiSmmCommunication\\PiSmmCommunicationPei.c", + 180, + "Hob.Raw"); + } + return sub_FFE32F72(dst, src, 0x10u); +} -{"addr":"0xffe32e8c","code":"_WORD *sub_FFE32E8C(int a1, _WORD *i)\n{\n _WORD *i_1; // esi\n int v3; // eax\n\n i_1 = i; /*0xffe32e8d*/\n if ( !i ) /*0xffe32e91*/\n {\n v3 = sub_FFE32DA5(); /*0xffe32e93*/\n if ( v3 ) /*0xffe32e9a*/\n (*(void ( **)(const char *, int, const char *))(v3 + 4))( /*0xffe32ea8*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 82,\n \"HobStart != ((void *) 0)\");\n }\n while ( 1 ) /*0xffe32ec1*/\n {\n if ( *i_1 == 0xFFFF ) /*0xffe32ec7*/\n return 0; /*0xffe32ecc*/\n if ( *i_1 == 4 ) /*0xffe32eb9*/\n break; /*0xffe32eb9*/\n i_1 = (_WORD *)((char *)i_1 + (unsigned __int16)i_1[1]); /*0xffe32ebf*/\n }\n return i_1; /*0xffe32ecb*/\n}","refs":[{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33410","name":"aEHsMdepkgLibra","string":"e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c"},{"addr":"0xffe33450","name":"aHobstartVoid0","string":"HobStart != ((void *) 0)"}]} +EFI_STATUS PiSmmCommunicationPeiCommunicate(int a1, int a2) +{ + int v3; + int v4; + _WORD *v5; + int v6; + _DWORD *v7; + int v8; + int v9; + int v10; + _DWORD *v11; + int (**v12)(int, _DWORD, _BYTE *, int *, _DWORD, _DWORD); + char v13; + int (**v14)(int, _DWORD, char *, int *, _DWORD, _DWORD); + int v15; + int v16; -{"addr":"0xffe32ed1","code":"_WORD *__thiscall sub_FFE32ED1(void *this)\n{\n _WORD *i; // edx\n int v3; // ecx\n _WORD *v4; // eax\n _WORD *v5; // esi\n\n for ( i = (_WORD *)sub_FFE32E1E(); ; i = (_WORD *)((char *)v5 + (unsigned __int16)v5[1]) ) /*0xffe32edb*/\n {\n v4 = sub_FFE32E8C(v3, i); /*0xffe32ef3*/\n v5 = v4; /*0xffe32ef8*/\n if ( !v4 || sub_FFE33012((int)this, (int)(v4 + 4)) ) /*0xffe32ee4*/\n break; /*0xffe32ee4*/\n }\n return v5; /*0xffe32efe*/\n}","refs":[{"addr":"0xffe32e1e","name":"sub_FFE32E1E"},{"addr":"0xffe32e8c","name":"sub_FFE32E8C"},{"addr":"0xffe33012","name":"sub_FFE33012"}]} + sub_FFE32DD6(64, "PiSmmCommunicationPei Communicate Enter\n"); + if (!a2) + return -2147483646; + v3 = sub_FFE330D1(); + if ((*(int (**)(int, void *, _DWORD, _DWORD, int (***)(int, _DWORD, char *, int *, _DWORD, _DWORD)))(*(_DWORD *)v3 + 32))( + v3, &unk_FFE337B0, 0, 0, &v14) < 0) + return -2147483629; + v4 = sub_FFE330D1(); + if ((*(int (**)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)v4 + 32))(v4, &unk_FFE33780, 0, 0, &v15) < 0) + return -2147483629; + if (!*(_BYTE *)(v15 + 16)) { + sub_FFE32DD6(64, "PiSmmCommunicationPei LockState - %x\n", 0); + return -2147483629; + } + v5 = sub_FFE32ED1(&unk_FFE337C0); + if (!v5) { + v6 = sub_FFE32DA5(); + if (v6) + (*(void (**)(const char *, int, const char *))(v6 + 4))( + "e:\\hs\\UefiCpuPkg\\PiSmmCommunication\\PiSmmCommunicationPei.c", + 155, + "GuidHob != ((void *) 0)"); + } + sub_FFE32DD6( + 64, + "PiSmmCommunicationPei BufferPtrAddress - 0x%016lx, BufferPtr: 0x%016lx\n", + *((_DWORD *)v5 + 8), + *((_DWORD *)v5 + 9)); + v7 = (_DWORD *)*((_DWORD *)v5 + 8); + *v7 = a2; + v7[1] = 0; + sub_FFE32DD6(64, "PiSmmCommunicationPei CommBuffer - %x\n", a2); + v13 = *((_BYTE *)v5 + 28); + v16 = 1; + v12 = v14; + v8 = sub_FFE330D1(); + v9 = (*v14)(v8, v12, &v13, &v16, 0, 0); + if (v9 < 0) { + sub_FFE32DD6(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v9); + v10 = sub_FFE32DA5(); + if (v10) + (*(void (**)(const char *, int, const char *))(v10 + 4))( + "e:\\hs\\UefiCpuPkg\\PiSmmCommunication\\PiSmmCommunicationPei.c", + 357, + "!EFI_ERROR (Status)"); + } + v11 = (_DWORD *)*((_DWORD *)v5 + 8); + *v11 = 0; + v11[1] = 0; + sub_FFE32DD6(64, "PiSmmCommunicationPei Communicate Exit\n"); + return 0; +} -{"addr":"0xffe32f04","code":"int sub_FFE32F04(void *this, int n40)\n{\n int v3; // eax\n int v4; // eax\n int v6; // [esp+4h] [ebp-4h] BYREF\n\n v3 = sub_FFE330D1(); /*0xffe32f0b*/\n if ( (*(int ( **)(int, int, int, int *))(*(_DWORD *)v3 + 52))(v3, 4, n40, &v6) < 0 ) /*0xffe32f23*/\n v6 = 0; /*0xffe32f25*/\n if ( !v6 ) /*0xffe32f2d*/\n {\n v4 = sub_FFE32DA5(); /*0xffe32f2f*/\n if ( v4 ) /*0xffe32f36*/\n (*(void ( **)(const char *, int, const char *))(v4 + 4))( /*0xffe32f47*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiHobLib\\\\HobLib.c\",\n 250,\n \"Hob != ((void *) 0)\");\n }\n return v6; /*0xffe32f20*/\n}","refs":[{"addr":"0xffe330d1","name":"sub_FFE330D1"},{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33410","name":"aEHsMdepkgLibra","string":"e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c"},{"addr":"0xffe3346c","name":"aHobVoid0","string":"Hob != ((void *) 0)"}]} +EFI_STATUS PiSmmCommunicationPeiModuleEntryPoint(void) +{ + int v0; + int v1; + int v2; + int v4; + int v5; + int v6; + unsigned __int8 v7; + int v8; + int v9; + int v10; + int v11; + int n17; + int v13; -{"addr":"0xffe32f54","code":"int __thiscall sub_FFE32F54(void *this)\n{\n int result; // eax\n int v2; // esi\n\n result = sub_FFE32F04(this, 40); /*0xffe32f58*/\n v2 = result; /*0xffe32f5d*/\n if ( result ) /*0xffe32f61*/\n {\n sub_FFE32FE1((void *)(result + 8)); /*0xffe32f68*/\n return v2 + 24; /*0xffe32f6d*/\n }\n return result; /*0xffe32f63*/\n}","refs":[{"addr":"0xffe32f04","name":"sub_FFE32F04"},{"addr":"0xffe32fe1","name":"sub_FFE32FE1"}]} - -{"addr":"0xffe32f72","code":"char *sub_FFE32F72(char *dst, char *src, unsigned int n16)\n{\n int v5; // eax\n int v6; // eax\n\n if ( n16 - 1 > -1 - (int)dst ) /*0xffe32f88*/\n {\n v5 = sub_FFE32DA5(); /*0xffe32f8a*/\n if ( v5 ) /*0xffe32f91*/\n (*(void ( **)(const char *, int, const char *))(v5 + 4))( /*0xffe32f9f*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\CopyMemWrapper.c\",\n 56,\n \"(Length - 1) <= (0xFFFFFFFF - (UINTN)DestinationBuffer)\");\n }\n if ( n16 - 1 > -1 - (int)src ) /*0xffe32fa9*/\n {\n v6 = sub_FFE32DA5(); /*0xffe32fab*/\n if ( v6 ) /*0xffe32fb2*/\n (*(void ( **)(const char *, int, const char *))(v6 + 4))( /*0xffe32fc0*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseMemoryLibRepStr\\\\CopyMemWrapper.c\",\n 57,\n \"(Length - 1) <= (0xFFFFFFFF - (UINTN)SourceBuffer)\");\n }\n if ( dst == src ) /*0xffe32fc8*/\n return dst; /*0xffe32fca*/\n else\n return internal_memcpy(dst, src, n16); /*0xffe32fd4*/\n}","refs":[{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe334b8","name":"aEHsMdepkgLibra_0","string":"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c"},{"addr":"0xffe33480","name":"aLength10xfffff","string":"(Length - 1) <= (0xFFFFFFFF - (UINTN)DestinationBuffer)"},{"addr":"0xffe334f4","name":"aLength10xfffff_0","string":"(Length - 1) <= (0xFFFFFFFF - (UINTN)SourceBuffer)"},{"addr":"0xffe32900","name":"internal_memcpy"}]} - -{"addr":"0xffe32fe1","code":"void *__thiscall sub_FFE32FE1(void *this)\n{\n __int64 v2; // rax\n __int64 v3; // rax\n\n v2 = sub_FFE33071(&unk_FFE337C0); /*0xffe32fe9*/\n sub_FFE3309D(v2, SHIDWORD(v2)); /*0xffe32ff2*/\n v3 = sub_FFE33071(&unk_FFE337C8); /*0xffe32ffc*/\n sub_FFE3309D(v3, SHIDWORD(v3)); /*0xffe33006*/\n return this; /*0xffe33010*/\n}","refs":[{"addr":"0xffe33071","name":"sub_FFE33071"},{"addr":"0xffe337c0","name":"unk_FFE337C0"},{"addr":"0xffe3309d","name":"sub_FFE3309D"},{"addr":"0xffe337c8","name":"unk_FFE337C8"}]} - -{"addr":"0xffe33012","code":"bool sub_FFE33012(int i, int a2)\n{\n __int64 v4; // rax\n int v5; // ebp\n __int64 v6; // rax\n int v7; // edi\n __int64 v8; // kr00_8\n __int64 v9; // rax\n int v11; // [esp+10h] [ebp-Ch]\n int v12; // [esp+14h] [ebp-8h]\n\n v4 = sub_FFE33071((void *)i); /*0xffe3301d*/\n v12 = HIDWORD(v4); /*0xffe33024*/\n v5 = v4; /*0xffe33028*/\n v6 = sub_FFE33071((void *)a2); /*0xffe3302a*/\n v11 = HIDWORD(v6); /*0xffe33032*/\n v7 = v6; /*0xffe33036*/\n v8 = sub_FFE33071((void *)(i + 8)); /*0xffe33044*/\n v9 = sub_FFE33071((void *)(a2 + 8)); /*0xffe33046*/\n return v5 == v7 && v12 == v11 && v8 == v9; /*0xffe33069*/\n}","refs":[{"addr":"0xffe33071","name":"sub_FFE33071"}]} - -{"addr":"0xffe33071","code":"__int64 __thiscall sub_FFE33071(void *this)\n{\n int v2; // eax\n\n if ( !this ) /*0xffe33076*/\n {\n v2 = sub_FFE32DA5(); /*0xffe33078*/\n if ( v2 ) /*0xffe3307f*/\n (*(void ( **)(const char *, int, const char *))(v2 + 4))( /*0xffe33090*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 192,\n \"Buffer != ((void *) 0)\");\n }\n return *(_QWORD *)this; /*0xffe3309b*/\n}","refs":[{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33528","name":"aEHsMdepkgLibra_1","string":"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c"},{"addr":"0xffe333f8","name":"aBufferVoid0","string":"Buffer != ((void *) 0)"}]} - -{"addr":"0xffe3309d","code":"int sub_FFE3309D(int a1, int a2)\n{\n _DWORD *v2; // ecx\n _DWORD *v3; // esi\n int v4; // eax\n\n v3 = v2; /*0xffe3309e*/\n if ( !v2 ) /*0xffe330a2*/\n {\n v4 = sub_FFE32DA5(); /*0xffe330a4*/\n if ( v4 ) /*0xffe330ab*/\n (*(void ( **)(const char *, int, const char *))(v4 + 4))( /*0xffe330bc*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\Unaligned.c\",\n 219,\n \"Buffer != ((void *) 0)\");\n }\n *v3 = a1; /*0xffe330ca*/\n v3[1] = a2; /*0xffe330cc*/\n return a1; /*0xffe330cf*/\n}","refs":[{"addr":"0xffe32da5","name":"sub_FFE32DA5"},{"addr":"0xffe33528","name":"aEHsMdepkgLibra_1","string":"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c"},{"addr":"0xffe333f8","name":"aBufferVoid0","string":"Buffer != ((void *) 0)"}]} - -{"addr":"0xffe330d1","code":"int sub_FFE330D1()\n{\n int v0; // esi\n _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF\n int v3; // [esp+6h] [ebp-6h]\n\n sub_FFE33152(v2); /*0xffe330da*/\n v0 = *(_DWORD *)(v3 - 4); /*0xffe330e2*/\n if ( !v0 ) /*0xffe330e7*/\n sub_FFE32E00( /*0xffe330f6*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n (int)\"PeiServices != ((void *) 0)\");\n return v0; /*0xffe330fe*/\n}","refs":[{"addr":"0xffe33152","name":"sub_FFE33152"},{"addr":"0xffe32e00","name":"sub_FFE32E00"},{"addr":"0xffe33570","name":"aEHsMdepkgLibra_2","string":"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c"},{"addr":"0xffe33554","name":"aPeiservicesVoi","string":"PeiServices != ((void *) 0)"}]} - -{"addr":"0xffe33103","code":"int sub_FFE33103()\n{\n unsigned __int8 v0; // al\n char n3; // al\n char n3_1; // cl\n\n v0 = __inbyte(0x70u); /*0xffe33109*/\n __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe3310e*/\n n3 = __inbyte(0x71u); /*0xffe33115*/\n n3_1 = n3; /*0xffe33116*/\n if ( (unsigned __int8)n3 <= 3u ) /*0xffe3311b*/\n {\nLABEL_4:\n if ( !n3_1 ) /*0xffe33136*/\n return 0; /*0xffe33136*/\n goto LABEL_5; /*0xffe33136*/\n }\n n3_1 = n3; /*0xffe3311d*/\n if ( !n3 ) /*0xffe33125*/\n {\n n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe33131*/\n goto LABEL_4; /*0xffe33131*/\n }\nLABEL_5:\n if ( n3_1 != -1 )\n return n3_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe3314e*/\n}","refs":[{"addr":"0xffe337e0","name":"n3"}]} - -{"addr":"0xffe33152","code":"void *__thiscall sub_FFE33152(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe33158*/\n sub_FFE32E00((int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\", 37, (int)\"Idtr != ((void *) 0)\"); /*0xffe33167*/\n this_1 = this; /*0xffe3316d*/\n __sidt(this); /*0xffe33170*/\n return this_1; /*0xffe33174*/\n}","refs":[{"addr":"0xffe32e00","name":"sub_FFE32E00"},{"addr":"0xffe335d8","name":"aEHsMdepkgLibra_3","string":"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c"},{"addr":"0xffe335c0","name":"aIdtrVoid0","string":"Idtr != ((void *) 0)"}]} - + v0 = sub_FFE330D1(); + v1 = (*(int (**)(int, int *))(*(_DWORD *)v0 + 40))(v0, &n17); + if (v1 < 0) { + sub_FFE32DD6(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); + v2 = sub_FFE32DA5(); + if (v2) + (*(void (**)(const char *, int, const char *))(v2 + 4))( + "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c", + 216, + "!EFI_ERROR (Status)"); + } + if (n17 != 17) + return -2147483645; + v4 = sub_FFE330D1(); + v5 = 0; + if ((*(int (**)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)v4 + 32))(v4, &unk_FFE33780, 0, 0, &v13) < 0) + return -2147483629; + v6 = v13; + v7 = *(_BYTE *)(v13 + 16); + if (v7) { + sub_FFE32DD6(64, "PiSmmCommunicationPei LockState - %x\n", v7); + return -2147483633; + } + while (1) { + v11 = v6; + v8 = sub_FFE330D1(); + v9 = (*(int (**)(int, int, int))v13)(v8, v11, v5++); + if (v9 < 0) + break; + v6 = v13; + } + InitCommunicationContext_1(); + v10 = sub_FFE330D1(); + (*(void (**)(int, void *))(*(_DWORD *)v10 + 24))(v10, &unk_FFE337D0); + return 0; +}