Newer
Older
AMI-Aptio-BIOS-Reversed / NvmeInt13 / NvmeInt13.c
@Ajax Dong Ajax Dong 2 days ago 13 KB Init
/*
 *NvmeInt13.c - Decompiled source for NvmeInt13.efi
 *
 *Copyright (c) HR650X BIOS Decompilation Project
 */

#include "NvmeInt13.h"

EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 __int64 v3; // rcx

 ::ImageHandle = (__int64)ImageHandle; /*0x356*/
 if ( !ImageHandle ) /*0x363*/
 AssertBreak( /*0x376*/
 (__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
 51,
 (__int64)"gImageHandle != ((void *) 0)");
 ::SystemTable = (__int64)SystemTable; /*0x37b*/
 if ( !SystemTable ) /*0x385*/
 AssertBreak( /*0x398*/
 (__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
 57,
 (__int64)"gST != ((void *) 0)");
 BootServices = (__int64)SystemTable->BootServices; /*0x3a1*/
 if ( !BootServices ) /*0x3ab*/
 AssertBreak( /*0x3be*/
 (__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
 63,
 (__int64)"gBS != ((void *) 0)");
 RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x3c7*/
 if ( !RuntimeServices ) /*0x3d1*/
 AssertBreak( /*0x3e4*/
 (__int64)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
 47,
 (__int64)"gRT != ((void *) 0)");
 GetHobList(); /*0x3e9*/
 return NvmeInt13DriverEntry(v3, SystemTable); /*0x3f6*/
}

__int64 NvmeInt13DriverEntry(__int64 StoredImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 __int64 result; // rax __int64 CtlrHwData; // rdx __int64 Int13MapSize; // rcx _DWORD SetupGuid[4]; // [rsp+30h] [rbp-D0h] BYREF __int64 n814; // [rsp+40h] [rbp-C0h] BYREF __int64 NotifyHandle; // [rsp+48h] [rbp-B8h] BYREF _BYTE SetupData[816]; // [rsp+50h] [rbp-B0h] BYREF __int64 StoredImageHandle_1; // [rsp+390h] [rbp+290h] BYREF __int64 NvmeCtlrHandle; // [rsp+3A0h] [rbp+2A0h] BYREF __int64 CtlrHwData_1; // [rsp+3A8h] [rbp+2A8h] BYREF StoredImageHandle_1 = StoredImageHandle; /*0x401*/
 NotifyHandle = 0; /*0x424*/
 NvmeCtlrHandle = 0; /*0x431*/
 n814 = 814; /*0x43e*/
 SetupGuid[0] = -326642109; /*0x447*/
 SetupGuid[1] = 1270213540; /*0x44f*/
 SetupGuid[2] = 1044374945; /*0x457*/
 SetupGuid[3] = -1458720202; /*0x45f*/
 result = (*(__int64 ( **)(void *, _QWORD, __int64 *))(BootServices + 320))( /*0x467*/
 &unk_1050,
 0,
 &gNvmeInt13Protocol);
 if ( result >= 0 )
 {
 result = (*(__int64 ( **)(__int64, _QWORD, __int64, __int64 *, __int64 *))gNvmeInt13Protocol)( /*0x499*/
 1,
 0,
 5,
 &CtlrHwData_1,
 &NvmeCtlrHandle);
 if ( result >= 0 )
 {
 CtlrHwData = CtlrHwData_1; /*0x4a4*/
 Int13MapSize = *(unsigned __int16 *)(CtlrHwData_1 + 1775); /*0x4c0*/
 *(_QWORD *)(Int13MapSize + CtlrHwData_1) = 0x42000000B2000001LL; /*0x4cb*/
 *(_WORD *)(Int13MapSize + CtlrHwData + 8) = 0; /*0x4d0*/
 *(_BYTE *)(Int13MapSize + CtlrHwData + 10) = 0; /*0x4db*/
 gNvmeInt13BinData = (*(__int64 ( **)(__int64, _QWORD, __int64))(gNvmeInt13Protocol + 64))( /*0x506*/
 CtlrHwData_1,
 (unsigned __int16)NvmeCtlrHandle,
 16);
 DebugPrint(0x1000u, "gNvmeInt13BinData : %lX\n", gNvmeInt13BinData);
 ((void ( *)(const __int16 *, _DWORD *, __int64 *, __int64 *, _BYTE *))SystemTable->RuntimeServices->GetVariable)( /*0x53f*/
 L"Setup",
 SetupGuid,
 &StoredImageHandle_1,
 &n814,
 SetupData);
 if ( SetupData[149] ) /*0x546*/
 {
 gNvmeInstallDeviceFn = (__int64)NvmeInt13InstallDevice; /*0x556*/
 return (*(__int64 ( **)(__int64 *, void *, _QWORD, __int64 *))(BootServices + 128))( /*0x577*/
 &NotifyHandle,
 &unk_1060,
 0,
 &gNvmeInstallDeviceFn);
 }
 else
 {
 return 0; /*0x548*/
 }
 }
 }
 return result; /*0x585*/
}

unsigned __int64 NvmeInt13InstallDevice(__int64 *a1)
{
 unsigned __int8 SlotIdx; // dl unsigned __int8 FreeIdx; // bl __int64 Status; // rax unsigned __int16 IdeDevId; // cx unsigned __int64 gNvmeInt13BinData; // r8 char *StrPtr; // rdx unsigned __int64 NameBase; // r10 _BYTE *NameDst; // r9 unsigned __int8 n0x1F; // cl char n32; // al unsigned __int8 DrvFlags; // dl bool IsHdd; // zf int n0x10000; // ecx __int64 InstallStatus; // rax __int64 BinDataCopy; // r8 __int64 SlotOff; // rdx __int64 CtlrData; // rcx __int64 Int13EntryBase; // r9 __int64 NotifyStatus; // rax _BYTE DevPathBuf[2]; // [rsp+20h] [rbp-50h] BYREF int DevIdHigh; // [rsp+22h] [rbp-4Eh]
 int DevHead; // [rsp+26h] [rbp-4Ah]
 int DevSector; // [rsp+2Ah] [rbp-46h]
 __int16 n2049; // [rsp+2Eh] [rbp-42h]
 __int16 Int13EntryAddr; // [rsp+30h] [rbp-40h]
 __int16 Int13EntrySeg; // [rsp+32h] [rbp-3Eh]
 __int16 n2; // [rsp+34h] [rbp-3Ch]
 __int16 n1280; // [rsp+36h] [rbp-3Ah]
 __int16 SlotDriveMap; // [rsp+38h] [rbp-38h]
 __int16 DataSegShift; // [rsp+3Ah] [rbp-36h]
 __int16 NameSegLow; // [rsp+3Ch] [rbp-34h]
 __int16 NameSegHigh; // [rsp+3Eh] [rbp-32h]
 int DriveParamPacked; // [rsp+40h] [rbp-30h]
 __int64 DeviceSpecific; // [rsp+5Dh] [rbp-13h]
 char ControllerIdx; // [rsp+98h] [rbp+28h] BYREF ControllerIdx = -1; /*0x5bc*/
 DebugPrint(0x40u, "Installing NVMe INT13 device %lx\n", (_DWORD)a1); /*0x5bf*/
 for ( SlotIdx = 0; SlotIdx < 0x20u; ++SlotIdx ) /*0x5c8*/
 {
 if ( *(_BYTE *)(55LL *SlotIdx + gNvmeInt13BinData) == *((_BYTE *)a1 + 8) ) /*0x5dc*/
 {
 AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 346, (__int64)"((BOOLEAN)(0==1))"); /*0x916*/
 return 0x8000000000000002uLL; /*0x91b*/
 }
 }
 for ( FreeIdx = 0; FreeIdx < 0x20u; ++FreeIdx ) /*0x5e9*/
 {
 if ( !*(_BYTE *)(55LL *FreeIdx + gNvmeInt13BinData) ) /*0x5f2*/
 break; /*0x5f7*/
 }
 if ( FreeIdx >= 0x20u ) /*0x60a*/
 {
 AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 359, (__int64)"Index<32"); /*0x61b*/
 if ( FreeIdx == 32 ) /*0x623*/
 return 0x8000000000000009uLL; /*0x625*/
 }
 Status = (*(__int64 ( **)(_QWORD, _QWORD, _QWORD, _QWORD))(gNvmeInt13Protocol + 40))(0, 0, 0, 0); /*0x645*/
 if ( Status < 0 ) /*0x651*/
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x660*/
 AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 366, (__int64)"!EFI_ERROR (Status)"); /*0x674*/
 }
 if ( FreeIdx >= 0x20u ) /*0x67c*/
 AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 250, (__int64)"DevIndex < 32"); /*0x68d*/
 if ( gNvmeInt13Protocol ) /*0x69a*/
 {
 (*(void ( **)(_BYTE *, __int64))(BootServices + 360))(DevPathBuf, 69); /*0x6b2*/
 IdeDevId = *((_WORD *)a1 + 9); /*0x6b8*/
 gNvmeInt13BinData = gNvmeInt13BinData; /*0x6bc*/
 StrPtr = *(char **)((char *)a1 + 20); /*0x6c5*/
 DevIdHigh = HIBYTE(IdeDevId); /*0x6cc*/
 n2049 = 2049; /*0x6db*/
 DevHead = (unsigned __int8)IdeDevId >> 3; /*0x6e4*/
 DevSector = IdeDevId & 7; /*0x6ec*/
 n1280 = 1280; /*0x6ef*/
 NameBase = 55LL *FreeIdx + gNvmeInt13BinData + 23; /*0x6fa*/
 NameDst = (_BYTE *)NameBase; /*0x6fd*/
 while ( *StrPtr == 32 ) /*0x708*/
 ++StrPtr; /*0x702*/
 n0x1F = 0; /*0x70a*/
 do /*0x729*/
 {
 n32 = *StrPtr; /*0x70c*/
 if ( !*StrPtr ) /*0x70c*/
 break; /*0x710*/
 if ( n32 != 32 || *(StrPtr - 1) != 32 ) /*0x719*/
 {
 *NameDst++ = n32; /*0x71b*/
 ++n0x1F; /*0x721*/
 }
 ++StrPtr; /*0x723*/
 }
 while ( n0x1F < 0x1Fu ); /*0x729*/
 *NameDst = 0; /*0x72b*/
 DrvFlags = *((_BYTE *)a1 + 8); /*0x734*/
 NameSegLow = NameBase; /*0x741*/
 NameSegHigh = (NameBase >> 4) & 0xF000; /*0x746*/
 Int13EntrySeg = ((gNvmeInt13BinData + 1760) >> 4) & 0xF000; /*0x758*/
 IsHdd = *((_BYTE *)a1 + 28) == 1; /*0x764*/
 Int13EntryAddr = gNvmeInt13BinData + 1760; /*0x768*/
 if ( IsHdd ) /*0x76c*/
 {
 DrvFlags |= 0x80u; /*0x780*/
 n2 = 2; /*0x783*/
 n0x10000 = 0x10000; /*0x787*/
 DataSegShift = gNvmeInt13BinData >> 4; /*0x793*/
 SlotDriveMap = *(_WORD *)(gNvmeInt13BinData + 1773) + 4 *FreeIdx; /*0x7a6*/
 }
 else
 {
 n0x10000 = 0; /*0x773*/
 n2 = 255; /*0x775*/
 }
 DriveParamPacked = ((n0x10000 + DrvFlags) << 8) + 1; /*0x7b4*/
 DeviceSpecific = *(__int64 *)((char *)a1 + 10); /*0x7bb*/
 }
 else
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x7d5*/
 AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 369, (__int64)"!EFI_ERROR (Status)"); /*0x7e9*/
 }
 InstallStatus = (*(__int64 ( **)(__int64, _BYTE *, char *))(gNvmeInt13Protocol + 16))( /*0x800*/
 gNvmeInt13Protocol,
 DevPathBuf,
 &ControllerIdx);
 if ( InstallStatus < 0 ) /*0x806*/
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", InstallStatus); /*0x815*/
 AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 374, (__int64)"!EFI_ERROR (Status)"); /*0x829*/
 }
 BinDataCopy = gNvmeInt13BinData; /*0x831*/
 SlotOff = 55LL *FreeIdx; /*0x83c*/
 *(_BYTE *)(SlotOff + gNvmeInt13BinData) = *((_BYTE *)a1 + 8); /*0x840*/
 *(_BYTE *)(SlotOff + BinDataCopy + 1) = ControllerIdx; /*0x847*/
 *(_BYTE *)(SlotOff + BinDataCopy + 2) = HIBYTE(DriveParamPacked); /*0x852*/
 CtlrData = *a1; /*0x857*/
 *(_BYTE *)(SlotOff + BinDataCopy + 3) = *(_BYTE *)(*a1 + 14); /*0x85d*/
 *(_BYTE *)(SlotOff + BinDataCopy + 4) = *(_BYTE *)(CtlrData + 10); /*0x865*/
 *(_WORD *)(SlotOff + BinDataCopy + 5) = *(_WORD *)(CtlrData + 16); /*0x86e*/
 *(_WORD *)(SlotOff + BinDataCopy + 7) = *(_WORD *)(CtlrData + 12); /*0x878*/
 *(_BYTE *)(SlotOff + BinDataCopy + 9) = *(_BYTE *)(CtlrData + 15); /*0x881*/
 *(_BYTE *)(SlotOff + BinDataCopy + 10) = *(_BYTE *)(CtlrData + 11); /*0x889*/
 *(_WORD *)(SlotOff + BinDataCopy + 11) = *(_WORD *)CtlrData; /*0x891*/
 *(_QWORD *)(SlotOff + BinDataCopy + 14) = *(_QWORD *)(CtlrData + 2); /*0x89d*/
 *(_BYTE *)(SlotOff + BinDataCopy + 22) = 0; /*0x8a2*/
 Int13EntryBase = BinDataCopy + *(unsigned __int16 *)(BinDataCopy + 1777) + 2LL *FreeIdx; /*0x8b5*/
 *(_BYTE *)(FreeIdx + Int13EntryBase) = *((_BYTE *)a1 + 8); /*0x8bc*/
 *(_WORD *)(FreeIdx + Int13EntryBase + 1) = *((_WORD *)a1 + 9); /*0x8c4*/
 NotifyStatus = (*(__int64 ( **)(_QWORD, _QWORD))(gNvmeInt13Protocol + 48))(0, 0); /*0x8d1*/
 if ( NotifyStatus < 0 ) /*0x8d7*/
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", NotifyStatus); /*0x8e6*/
 AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 403, (__int64)"!EFI_ERROR (Status)"); /*0x8fa*/
 }
 return 0; /*0x932*/
}

__int64 GetDebugOutputProtocol()
{
 __int64 gDebugOutputProtocol; // rax unsigned __int64 AllocPages; // rbx __int64 LocateStatus; // rax __int64 DbgProto; // rcx gDebugOutputProtocol = gDebugOutputProtocol; /*0x946*/
 if ( !gDebugOutputProtocol ) /*0x952*/
 {
 AllocPages = (*(__int64 ( **)(__int64))(BootServices + 24))(31); /*0x96b*/
 (*(void ( **)(unsigned __int64))(BootServices + 32))(AllocPages); /*0x96e*/
 if ( AllocPages <= 0x10 ) /*0x975*/
 {
 LocateStatus = (*(__int64 ( **)(void *, _QWORD, __int64 *))(BootServices + 320))( /*0x992*/
 &unk_1040,
 0,
 &gDebugOutputProtocol);
 DbgProto = gDebugOutputProtocol; /*0x998*/
 if ( LocateStatus < 0 ) /*0x9a2*/
 DbgProto = 0; /*0x9a2*/
 gDebugOutputProtocol = DbgProto; /*0x9a6*/
 return DbgProto; /*0x9ad*/
 }
 else
 {
 return 0; /*0x977*/
 }
 }
 return gDebugOutputProtocol; /*0x9b5*/
}

void DebugPrint(UINTN ErrorLevel, const CHAR8 *Format, ...)
{
 __int64 DebugOutputProtocol; // rax __int64 DbgLevelFilter; // r8 void ( **DbgProtoPtr)(UINTN, const CHAR8 *, __int64 *); // r9 unsigned __int8 CmosIndex; // al char CmosData; // al char CmosData_1; // cl va_list va; // [rsp+40h] [rbp+18h] BYREF va_start(va, Format);
 DebugOutputProtocol = GetDebugOutputProtocol(); /*0x9d3*/
 DbgLevelFilter = 0; /*0x9d8*/
 DbgProtoPtr = (void ( **)(UINTN, const CHAR8 *, __int64 *))DebugOutputProtocol; /*0x9db*/
 if ( DebugOutputProtocol ) /*0x9e1*/
 {
 CmosIndex = __inbyte(0x70u); /*0x9e7*/
 __outbyte(0x70u, CmosIndex & 0x80 | 0x4B); /*0x9ec*/
 CmosData = __inbyte(0x71u); /*0x9f1*/
 CmosData_1 = CmosData; /*0x9f2*/
 if ( (unsigned __int8)CmosData > 3u ) /*0x9f8*/
 {
 CmosData_1 = gDebugByte; /*0x9fa*/
 if ( !gDebugByte ) /*0xa02*/
 CmosData_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xa0e*/
 }
 if ( (unsigned __int8)(CmosData_1 - 1) <= 0xFDu ) /*0xa16*/
 {
 DbgLevelFilter = 2147483718LL; /*0xa1f*/
 if ( CmosData_1 == 1 ) /*0xa25*/
 DbgLevelFilter = 2147483652LL; /*0xa25*/
 }
 if ( (DbgLevelFilter & ErrorLevel) != 0 ) /*0xa2c*/
 (*DbgProtoPtr)(ErrorLevel, Format, (__int64 *)va); /*0xa3b*/
 }
}

__int64 AssertBreak(__int64 a1, __int64 a2, __int64 a3)
{
 __int64 DbgProto; // rax DbgProto = GetDebugOutputProtocol(); /*0xa5c*/
 if ( DbgProto ) /*0xa64*/
 return (*(__int64 ( **)(__int64, __int64, __int64))(DbgProto + 8))(a1, a2, a3); /*0xa6f*/
 return DbgProto; /*0xa7c*/
}

void *GetHobList()
{
 __int64 UnusedArg; // rcx void *gHobList; // rax __int64 SystemTable; // rdi unsigned __int64 HobIndex; // rbx __int64 HobEntryOff; // rsi gHobList = gHobList; /*0xa93*/
 if ( !gHobList ) /*0xa9d*/
 {
 SystemTable = SystemTable; /*0xaa3*/
 HobIndex = 0; /*0xaaa*/
 gHobList = 0; /*0xaac*/
 if ( *(_QWORD *)(SystemTable + 104) ) /*0xab3*/
 {
 HobEntryOff = 0; /*0xab9*/
 while ( !IsHobGuidMatch(UnusedArg, (const UINT64 *)(HobEntryOff + *(_QWORD *)(SystemTable + 112))) ) /*0xac9*/
 {
 ++HobIndex; /*0xacb*/
 HobEntryOff += 24; /*0xace*/
 if ( HobIndex >= *(_QWORD *)(SystemTable + 104) ) /*0xad6*/
 goto LABEL_6; /*0xad6*/
 }
 gHobList = *(void **)(*(_QWORD *)(SystemTable + 112) + 24 *HobIndex + 16); /*0xb4c*/
 gHobList = gHobList; /*0xb51*/
 }
 else
 {
LABEL_6:
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0xad8*/
 AssertBreak((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0xb06*/
 gHobList = gHobList; /*0xb0b*/
 }
 if ( !gHobList ) /*0xb15*/
 {
 AssertBreak((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0xb28*/
 return gHobList; /*0xb2d*/
 }
 }
 return gHobList; /*0xb3e*/
}

bool IsHobGuidMatch(__int64 UnusedArg, const UINT64 *Buffer)
{
 UINT64 GuidLow; // rdi UINT64 BufGuidLow; // rbx UINT64 GuidHigh; // rbp UINT64 Unaligned64; // rax GuidLow = ReadUnaligned64(&Buffer_); /*0xb82*/
 BufGuidLow = ReadUnaligned64(Buffer); /*0xb91*/
 GuidHigh = ReadUnaligned64(&Buffer__0); /*0xb9d*/
 Unaligned64 = ReadUnaligned64(Buffer + 1); /*0xba0*/
 return GuidLow == BufGuidLow && GuidHigh == Unaligned64; /*0xbc4*/
}

UINT64 ReadUnaligned64(const UINT64 *Buffer)
{
 if ( !Buffer ) /*0xbd8*/
 AssertBreak((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0xbed*/
 return *Buffer; /*0xbf5*/
}