//
// DxeIpl.efi - Full Decompilation
// Source: IDA Pro MCP port 13388
// Functions: 80
//
#include <Uefi.h>
#include <PiPei.h>
{"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 ( sub_FFC163A4(&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 *)sub_FFC1634F(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 sub_FFC16201(v3); /*0xffc1556f*/\n v3 += 3; /*0xffc15574*/\n --v1; /*0xffc15577*/\n }\n while ( v1 ); /*0xffc1557a*/\n }\n }\n return sub_FFC16201(&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 = sub_FFC163A4(&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)sub_FFC16309(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 = sub_FFC1632D(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 = sub_FFC1632D(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 = sub_FFC164EE(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 = sub_FFC16008(); ; i = v4 + *(unsigned __int16 *)(v4 + 2) ) /*0xffc157f9*/\n {\n result = sub_FFC16033(2, i); /*0xffc15817*/\n v4 = result; /*0xffc1581c*/\n if ( !result ) /*0xffc15820*/\n break; /*0xffc15820*/\n if ( (unsigned __int8)sub_FFC16309(&unk_FFC18CD8) ) /*0xffc15805*/\n {\n sub_FFC161B3(*(_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 = sub_FFC16226(this, &v4); /*0xffc1586b*/\n if ( v1 >= 0 ) /*0xffc15872*/\n {\n sub_FFC17107(v3, \"DxeIpl\"); /*0xffc1588f*/\n return (*v4)(v4); /*0xffc1589b*/\n }\n else\n {\n sub_FFC16F4A(-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 = sub_FFC16226(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 sub_FFC16F4A(-2147483646, 50532358); /*0xffc158d6*/\n }\n if ( v2 >= 0 /*0xffc1591d*/\n && (v3 = sub_FFC16008(), (v4 = sub_FFC16056(&unk_FFC18CB8, v3)) != 0)\n && !*(_BYTE *)(v4 + 32)\n && *(_QWORD *)(v4 + 24) )\n {\n sub_FFC16085(); /*0xffc15925*/\n for ( i = 0; sub_FFC16254(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 = sub_FFC16386(); /*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 sub_FFC15FB3(); /*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 *)sub_FFC16008(); ; *i = -2 ) /*0xffc159bf*/\n {\n i = (_WORD *)sub_FFC16056(&unk_FFC18CC8, i); /*0xffc159d7*/\n if ( !i ) /*0xffc159de*/\n break; /*0xffc159de*/\n }\n if ( sub_FFC16226(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 sub_FFC16191(n64); /*0xffc15a8c*/\n return sub_FFC16191(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"}]}
{"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 sub_FFC162A8(&v4); /*0xffc15c68*/\n v5 = (unsigned __int64)(v4 + 1048544) >> 32; /*0xffc15c83*/\n __lgdt(\"G\"); /*0xffc15c90*/\n v5 = sub_FFC15D00(); /*0xffc15c9f*/\n sub_FFC1708F(v0, \"PeiEnd\"); /*0xffc15ca5*/\n sub_FFC16201(&unk_FFC18A70); /*0xffc15cb2*/\n sub_FFC17107(v1, \"PeiEnd\"); /*0xffc15cbc*/\n sub_FFC17107(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"}]}
{"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"}]}
{"addr":"0xffc15fb3","code":"void DxeIplNullStall()\n{\n while ( 1 ) /*0xffc15fbe*/\n ; /*0xffc15fbe*/\n}"}
{"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}"}
{"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}"}
{"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}"}
{"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)sub_FFC16309(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"}]}
{"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}"}
{"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}"}
{"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 sub_FFC162F0(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"}]}
{"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"}]}
{"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"}]}
{"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"}]}
{"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}"}
{"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}"}
{"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}"}
{"addr":"0xffc1627d","code":"int __usercall DxeIplReadFvSection@<eax>(int a1@<edx>, 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}"}
{"addr":"0xffc162a8","code":"int __usercall DxeIplFvGetFileSize@<eax>(int FfsHeader@<edx>, 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}"}
{"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"}]}
{"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}"}
{"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}"}
{"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"}]}
{"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}"}
{"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"}]}
{"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"}]}
{"addr":"0xffc1643f","code":"int DxeIplInstallPpi(char *DxeIplPpi, int (*sub_FFC16E63)(), int (*sub_FFC16EE0)())\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) = sub_FFC16EE0; /*0xffc1649f*/\n *(_DWORD *)(FvDevice[4] + 4 *Index) = sub_FFC16E63; /*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]) = sub_FFC16EE0; /*0xffc164c8*/\n *(_DWORD *)(FvDevice[4] + 4 *FvDevice[1]++) = sub_FFC16E63; /*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"}]}
{"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"}]}
{"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}"}
{"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"}]}
{"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"}]}
{"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"}]}
{"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"}]}
{"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"}]}
{"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"}]}
{"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}"}
{"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"}]}
{"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"}]}
{"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"}]}
{"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"}]}
{"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"}]}
{"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) && !sub_FFC188F5(7) && !sub_FFC188F5(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"}]}
{"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"}]}
{"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"}]}
{"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 = sub_FFC17261(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"}]}
{"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 sub_FFC172AC(*a2, a3); /*0xffc17234*/\n}","refs":[{"addr":"0xffc16309","name":"DxeIplFvIsAddrValid"},{"addr":"0xffc18d58","name":"DxeIplPpi"},{"addr":"0xffc172ac","name":"DxeIplLzmaInitRange"}]}
{"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}"}
{"addr":"0xffc17260","code":"void nullsub_2()\n{\n ; /*0xffc17260*/\n}"}
{"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}"}
{"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 sub_FFC187D2(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"}]}
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
{"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}"}
{"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"}]}
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
{"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"}]}
{"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}"}
{"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}"}
{"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"}]}
{"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}"}
{"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}"}
{"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}"}
{"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"}]}
{"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"}]}
{"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"}]}