#include "UsbRtDxe.h"
//
// UsbRtDxe - UEFI Module
// Total functions: 265
//
// Function: MemMove @ 0x300 (0x42 bytes)
char *__fastcall MemMove(char *dst, char *src, unsigned __int64 count)
{
char *dst_1; // rax
unsigned __int64 count_1; // rcx
char *dst_2; // rdi
char *src_1; // rsi
dst_1 = dst; /*0x310*/
if ( src < dst && &src[count - 1] >= dst ) /*0x318*/
{
src_1 = &src[count - 1]; /*0x330*/
dst_2 = &dst[count - 1]; /*0x333*/
}
else
{
count_1 = count; /*0x31a*/
count &= 7u; /*0x31d*/
count_1 >>= 3; /*0x324*/
qmemcpy(dst, src, 8 * count_1); /*0x328*/
src_1 = &src[8 * count_1]; /*0x328*/
dst_2 = &dst[8 * count_1]; /*0x328*/
}
qmemcpy(dst_2, src_1, count); /*0x33c*/
return dst_1; /*0x33f*/
}
// Function: MemCompare @ 0x350 (0x1d bytes)
unsigned __int64 __fastcall MemCompare(_BYTE *a1, _BYTE *a2, __int64 a3)
{
bool v6; // zf
do /*0x35b*/
{
if ( !a3 ) /*0x35b*/
break; /*0x35b*/
v6 = *a1++ == *a2++; /*0x35b*/
--a3; /*0x35b*/
}
while ( v6 ); /*0x35b*/
return (unsigned __int8)*(a1 - 1) - (unsigned __int64)(unsigned __int8)*(a2 - 1); /*0x36a*/
}
// Function: ModuleEntryPoint @ 0x400 (0xa6 bytes)
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
signed __int64 Status; // rbx
__int64 *v5; // [rsp+40h] [rbp+18h] BYREF
UsbDriverEntryPoint((__int64)ImageHandle, SystemTable); /*0x409*/
if ( !::SystemTable ) /*0x416*/
{
::SystemTable = (__int64)SystemTable; /*0x418*/
RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x423*/
}
Status = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 **))(BootServices + 320))(&UsbRtProtocolHandle, 0, &v5); /*0x445*/
if ( Status >= 0 ) /*0x44b*/
{
UsbRtDispatchTable = *v5; /*0x45c*/
v5[15] = (__int64)UsbApiHandler; /*0x463*/
}
UsbIdleTimerProc(); /*0x467*/
if ( Status < 0 ) /*0x46f*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x480*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 191, (__int64)"!EFI_ERROR (Status)"); /*0x498*/
}
return Status; /*0x4a0*/
}
// Function: UsbDriverEntryPoint @ 0x4a8 (0x154 bytes)
__int64 __fastcall UsbDriverEntryPoint(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
__int64 PcdHandle; // rax
UINTN Port; // rax
UINT8 Value; // dl
_BYTE *PciReg; // rax
__int16 Features; // bx
bool IsXhci; // bl
UINT32 TimeoutCounter; // edi
::ImageHandle = ImageHandle; /*0x4b7*/
if ( !ImageHandle ) /*0x4cb*/
Assert( /*0x4da*/
(UINTN)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
51,
(__int64)"gImageHandle != ((void *) 0)");
SystemTable_0 = (__int64)SystemTable; /*0x4df*/
if ( !SystemTable ) /*0x4e9*/
Assert( /*0x4f8*/
(UINTN)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
57,
(__int64)"gST != ((void *) 0)");
BootServices = (__int64)SystemTable->BootServices; /*0x501*/
if ( !BootServices ) /*0x50b*/
Assert( /*0x51a*/
(UINTN)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
63,
(__int64)"gBS != ((void *) 0)");
RuntimeServices_0 = (__int64)SystemTable->RuntimeServices; /*0x523*/
if ( !RuntimeServices_0 ) /*0x52d*/
Assert( /*0x540*/
(UINTN)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
47,
(__int64)"gRT != ((void *) 0)");
HobLibGetHobList(ImageHandle); /*0x545*/
PcdHandle = PcdGet32(); /*0x54a*/
gXhciBase = (*(__int64 (__fastcall **)(__int64))(PcdHandle + 32))(5); /*0x55c*/
if ( *(char *)PciExpressRead(1024068) >= 0 ) /*0x56e*/
{
Port = PciExpressRead(1024064); /*0x573*/
IoWrite8(Port, Value); /*0x57b*/
PciReg = (_BYTE *)PciExpressRead(1024068); /*0x582*/
*PciReg |= 0x80u; /*0x58c*/
}
Features = sub_3F0(); /*0x593*/
sub_3E0(); /*0x596*/
IsXhci = (Features & 0x200) != 0; /*0x5a5*/
TimeoutCounter = IoRead32(0x508u) & 0xFFFFFF; /*0x5af*/
sub_3C0(); /*0x5b5*/
while ( ((TimeoutCounter + 357 - IoRead32(0x508u)) & 0x800000) == 0 ) /*0x5d5*/
sub_3B0(); /*0x5bc*/
sub_3C0(); /*0x5d7*/
if ( IsXhci ) /*0x5de*/
return sub_3D0(); /*0x5e0*/
else
return sub_3E0(); /*0x5e7*/
}
// Function: UsbApiInstallHandlers @ 0x5fc (0x5bd bytes)
_QWORD *UsbApiInstallHandlers()
{
_QWORD *DispatchTable; // rax
_QWORD *UsbRtDispatchTable; // rax
_QWORD *UsbRtDispatchTable_1; // rax
_QWORD *UsbRtDispatchTable_2; // rax
DispatchTable = (_QWORD *)UsbRtDispatchTable; /*0x615*/
*(_QWORD *)(UsbRtDispatchTable + 920) = UhciInitController; /*0x638*/
DispatchTable[126] = UsbNullFuncRet0; /*0x64d*/
DispatchTable[116] = UhciStartHc; /*0x654*/
DispatchTable[130] = UsbNullFunc; /*0x669*/
DispatchTable[117] = UhciStopHc; /*0x670*/
DispatchTable[118] = UhciResetHc; /*0x67e*/
DispatchTable[119] = UsbNullFunc; /*0x68c*/
DispatchTable[120] = UhciTransfer; /*0x69a*/
DispatchTable[121] = UhciPortStatus; /*0x6a8*/
DispatchTable[122] = UhciPortReset; /*0x6b6*/
DispatchTable[123] = UhciPortDisconnect; /*0x6c4*/
DispatchTable[124] = SysKbcDriverEntry; /*0x6d2*/
DispatchTable[125] = SysKbcDataHandler; /*0x6e0*/
DispatchTable[127] = SysKbcDecodeKey; /*0x6ee*/
DispatchTable[128] = SysKbcBuildKeyCode; /*0x6fc*/
Dis... [6295 chars total]
// Function: UsbIdleTimerProc @ 0xbbc (0x2a5 bytes)
__int64 UsbIdleTimerProc()
{
__int64 DriverIndex; // rsi
__int64 IsrLoopIndex; // rbp
__int64 DriverOffset; // rdi
__int64 IsrSlotOffset; // rbx
__int64 (__fastcall **IsrFuncTable)(); // r14
void (*IsrFunc)(void); // rcx
__int64 (__fastcall **DevCheckTable)(); // rbx
void (*DevCheckFunc)(void); // rcx
UINT8 FillData; // r8
__int64 AllocStatus; // rax
UINT8 FillData_0; // r8
__int64 AllocStatus2; // rax
void *Buffer; // [rsp+40h] [rbp+8h] BYREF
UsbApiInstallHandlers(); /*0xbd4*/
DriverIndex = 7; /*0xbd9*/
IsrLoopIndex = 7; /*0xbe5*/
DriverOffset = 336; /*0xbe7*/
if ( UsbMsIsrHandler ) /*0xbf3*/
{
IsrSlotOffset = 336; /*0xbf5*/
IsrFuncTable = &IsrCheckFuncTable; /*0xbf7*/
while ( IsrLoopIndex != 14 ) /*0xc02*/
{
((void (__fastcall *)(__int64))*IsrFuncTable)(IsrSlotOffset + UsbRtDispatchTable + 2384); /*0xc15*/
IsrFunc = *(void (**)(void))(IsrSlotOffset + UsbRtDispatchTable + 2392); /*0xc1f*/
if ( IsrFunc ) /*0xc2a*/
IsrFunc(); /*0xc2c*/
if ( *(_BYTE *)(IsrSlotOffset + UsbRtDispatchTable + 2384) ) /*0xc35*/
{
++IsrLoopIndex; /*0xc3f*/
++IsrFuncTable; /*0xc42*/
IsrSlotOffset += 48; /*0xc46*/
}
if ( !*IsrFuncTable ) /*0xc4a*/
{
if ( IsrLoopIndex != 14 ) /*0xc54*/
goto LABEL_11; /*0xc54*/
break; /*0xc54*/
}
}
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 247, (__int64)"DelayedIndex != MaxIndex"); /*0xc56*/
}
LABEL_11:
if ( ElibCheckDevReady ) /*0xc78*/
{
DevCheckTable = &DevReadyCheckFuncTable; /*0xc7a*/
while ( DriverIndex != 14 ) /*0xc85*/
{
((void (__fastcall *)(__int64))*DevCheckTable)(DriverOffset + UsbRtDispatchTable + 1712); /*0xc98*/
DevCheckFunc = *(void (**)(void))(DriverOffset + UsbRtDispatchTable + 1720); /*0xca1*/
if ( DevCheckFunc ) /*0xcac*/
DevCheckFunc(); /*0xcae*/
if ( *(_BYTE *)(DriverOffset + UsbRtDispatchTable + 1712) ) /*0xcb7*/
{
++DriverIndex; /*0xcc1*/
++DevCheckTable; /*0xcc4*/
DriverOffset += 48; /*0xcc8*/
}
if ( !*DevCheckTable ) /*0xccc*/
{
if ( DriverIndex != 14 ) /*0xcd6*/
goto LABEL_21; /*0xcd6*/
break; /*0xcd6*/
}
}
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 265, (__int64)"DriverIndex != MaxIndex"); /*0xcd8*/
}
LABEL_21:
if ( !*(_QWORD *)(UsbRtDispatchTable + 30352) ) /*0xd06*/
{
Buffer = (void *)0xFFFFFFFFLL; /*0xd23*/
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64, void **))(BootServices + 40))(1, 6, 1, &Buffer) < 0 ) /*0xd33*/
{
AllocStatus = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, void **))(BootServices + 40))(0, 6, 1, &Buffer); /*0xd48*/
if ( AllocStatus < 0 ) /*0xd4e*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", AllocStatus); /*0xd5c*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 283, (__int64)"!EFI_ERROR (Status)"); /*0xd74*/
}
}
*(_QWORD *)(UsbRtDispatchTable + 30352) = Buffer; /*0xd8a*/
SetMem(Buffer, 0x1000u, FillData); /*0xd96*/
}
if ( !*(_QWORD *)(UsbRtDispatchTable + 30344) ) /*0xda2*/
{
Buffer = (void *)0xFFFFFFFFLL; /*0xdbf*/
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64, void **))(BootServices + 40))(1, 6, 1, &Buffer) < 0 ) /*0xdcf*/
{
AllocStatus2 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, void **))(BootServices + 40))( /*0xde4*/
0,
6,
1,
&Buffer);
if ( AllocStatus2 < 0 ) /*0xdea*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", AllocStatus2); /*0xdf9*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 302, (__int64)"!EFI_ERROR (Status)"); /*0xe11*/
}
}
*(_QWORD *)(UsbRtDispatchTable + 30344) = Buffer; /*0xe27*/
SetMem(Buffer, 0x80u, FillData_0); /*0xe33*/
}
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0xe4e*/
return 0; /*0xe57*/
}
// Function: UsbApiHandler @ 0xe64 (0x49 bytes)
void __fastcall UsbApiHandler(unsigned __int8 *ApiPacket)
{
unsigned __int8 ApiCmd; // dl
if ( ApiPacket ) /*0xe67*/
{
ApiCmd = *ApiPacket; /*0xe6e*/
if ( *ApiPacket ) /*0xe6e*/
{
if ( (unsigned __int8)(ApiCmd - 32) > 0x17u ) /*0xe7c*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UsbApiHandler Invalid function#%x\n", ApiCmd); /*0xe8d*/
return; /*0xe92*/
}
ApiCmd -= 31; /*0xe94*/
}
((void (__fastcall *)(__int64))funcs_EA1[ApiCmd])((__int64)ApiPacket); /*0xea1*/
*ApiPacket = 0; /*0xea4*/
}
}
// Function: UsbFindActiveHc @ 0x25b8 (0x3c bytes)
__int64 UsbFindActiveHc()
{
unsigned __int8 DevIdx; // dl
unsigned __int8 DevCount; // r8
__int64 DevIdx_1; // rax
__int64 DevPtr; // r9
DevIdx = 0; /*0x25bf*/
DevCount = *(_BYTE *)(UsbRtDispatchTable + 27704); /*0x25c1*/
if ( DevCount ) /*0x25cb*/
{
while ( 1 ) /*0x25d4*/
{
DevIdx_1 = DevIdx; /*0x25d4*/
DevPtr = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * DevIdx); /*0x25d7*/
if ( DevPtr ) /*0x25de*/
{
if ( (*(_BYTE *)(DevPtr + 64) & 1) != 0 ) /*0x25e5*/
break; /*0x25e5*/
}
if ( ++DevIdx >= DevCount ) /*0x25ec*/
goto LABEL_5; /*0x25ec*/
}
}
else
{
LABEL_5:
*(_DWORD *)(UsbRtDispatchTable + 4) &= ~0x80u; /*0x25ee*/
}
return DevIdx_1; /*0x25f3*/
}
// Function: UsbGetInfo_12 @ 0x26a8 (0x40 bytes)
__int64 __fastcall UsbGetInfo_12(__int64 UsbHcPtr, __int64 EndpointAddr, __int64 CmdFlag, char FinalFlag)
{
char CmdFlag_1; // r11
CmdFlag_1 = CmdFlag; /*0x26ab*/
if ( (EndpointAddr & 0x80u) == 0LL ) /*0x26b0*/
JUMPOUT(0x11D00); /*0x11d00*/
LOBYTE(CmdFlag) = FinalFlag; /*0x26b6*/
LOBYTE(EndpointAddr) = CmdFlag_1; /*0x26bc*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(200LL
* (((*(unsigned __int8 *)(UsbHcPtr + 1) - 16) >> 4) + 4)
+ UsbRtDispatchTable
+ 168))(
UsbHcPtr,
EndpointAddr,
CmdFlag);
}
// Function: UsbConfig_13 @ 0x26e8 (0xc6 bytes)
char __fastcall UsbConfig_13(_BYTE *UsbHcPtr, __int64 TmpRdx, __int64 TmpR8)
{
unsigned __int8 TmpR8_1; // di
__int64 UsbRtDispatchTable; // rbp
__int64 v6; // rsi
char n4; // al
TmpR8_1 = TmpR8; /*0x26fc*/
if ( (TmpRdx & 0x80u) == 0LL ) /*0x2704*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x2730*/
v6 = FwVolDriverEntry(16, 0, TmpRdx, UsbHcPtr); /*0x2746*/
if ( (*(_WORD *)(v6 + 108) & 0x800) == 0 || TmpR8_1 != UsbHcPtr[69] ) /*0x2758*/
{
n4 = *(_BYTE *)(v6 + 14); /*0x275a*/
if ( n4 != 4 && n4 != 64 ) /*0x2763*/
{
HcMemoryRead((__int64)UsbHcPtr, v6, TmpR8_1, UsbRtDispatchTable + 29904); /*0x2775*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 29904) & 2) != 0 ) /*0x2781*/
HcMemoryWrite((__int64)UsbHcPtr, v6, TmpR8_1, 1); /*0x2792*/
}
}
}
else
{
LOBYTE(TmpRdx) = TmpR8; /*0x270a*/
(*(void (__fastcall **)(_BYTE *, __int64))(200LL * ((((unsigned __int8)UsbHcPtr[1] - 16) >> 4) + 4) /*0x2726*/
+ UsbRtDispatchTable
+ 176))(
UsbHcPtr,
TmpRdx);
}
return 0; /*0x27a8*/
}
// Function: UsbConfig_16 @ 0x27b0 (0x93 bytes)
char __fastcall UsbConfig_16(_BYTE *UsbHcPtr, __int64 TmpRdx, __int64 TmpR8)
{
char v3; // bl
char TmpR8_1; // si
__int64 dst; // rax
__int64 n256; // r8
v3 = 0; /*0x27bf*/
TmpR8_1 = TmpR8; /*0x27c1*/
if ( (TmpRdx & 0x80u) == 0LL ) /*0x27c9*/
{
dst = FwVolDriverEntry(16, 0, TmpRdx, UsbHcPtr); /*0x27ff*/
if ( !dst ) /*0x2807*/
return -1; /*0x2809*/
if ( (*(_WORD *)(dst + 108) & 0x800) == 0 || TmpR8_1 != UsbHcPtr[69] ) /*0x281c*/
{
LOBYTE(n256) = TmpR8_1; /*0x2821*/
return DebugLogPrint_2(UsbHcPtr, dst, n256, 0); /*0x282f*/
}
return v3; /*0x2831*/
}
else
{
LOBYTE(TmpRdx) = TmpR8; /*0x27cf*/
return (*(__int64 (__fastcall **)(_BYTE *, __int64))(200LL * ((((unsigned __int8)UsbHcPtr[1] - 16) >> 4) + 4) /*0x27eb*/
+ UsbRtDispatchTable
+ 280))(
UsbHcPtr,
TmpRdx);
}
}
// Function: UsbGetInfo @ 0x2844 (0x708 bytes)
__int64 __fastcall UsbGetInfo(_BYTE *UsbHcPtr, char PortNum, char EndpointAddr, unsigned int n255)
{
int v4; // eax
__int64 src; // rdi
__int64 n2_1; // rsi
unsigned __int8 n4; // al
unsigned __int64 v10; // r14
__int64 n2; // rbp
__int16 v13; // bx
__int64 v14; // rax
__int16 n64; // ax
bool v16; // cc
unsigned __int8 i; // bl
__int64 BootServices; // rax
char *src_3; // rax
char *src_1; // rbx
__int16 v21; // r8
unsigned __int8 v22; // r13
__int64 UsbRtDispatchTable_2; // rax
__int16 v24; // dx
_QWORD *v25; // rcx
bool v26; // zf
__int64 v27; // rax
__int64 p_n2047_1; // rax
unsigned __int8 *p_n2047; // rbx
unsigned __int16 n2047; // bp
unsigned __int16 n2047_1; // dx
unsigned __int8 *v32; // r8
unsigned __int16 n2047_2; // r15
int v34; // r13d
unsigned __int8 *v35; // r14
int v36; // r9d
int v37; // r8d
_BYTE *src_2; // rax
char v39; // dl
__int64 UsbRtDispatchTable; // rcx
__int64 TmpRdx; // rdx
__int64 TmpR8; ... [11607 chars total]
// Function: DebugLogPrint_4 @ 0x2f4c (0x192 bytes)
char __fastcall DebugLogPrint_4(__int64 i, __int64 HcType, char PortFlag)
{
char HcType_1; // r13
char Result; // bp
unsigned __int8 DevIdx; // si
__int64 DevOffset; // r14
__int64 DevEntry; // rdi
__int64 CallStatus; // rax
void (__fastcall *NotifyFunc)(__int64); // rax
char Result_1; // al
unsigned __int8 SlotFlags; // al
__int64 UsbRtDispatchTable; // rbx
HcType_1 = HcType; /*0x2f6b*/
Result = -1; /*0x2f71*/
DevIdx = 1; /*0x2f74*/
DevOffset = 448; /*0x2f77*/
do
{
DevEntry = DevOffset + UsbRtDispatchTable + 3056; /*0x2f8b*/
if ( (*(_DWORD *)DevEntry & 0x21) == 1
&& *(_BYTE *)(DevEntry + 12) == HcType_1
&& *(_BYTE *)(DevEntry + 13) == PortFlag )
{
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 /*0x2fbf*/
&& (*(_DWORD *)DevEntry & 0x100) == 0
&& (*(_BYTE *)DevEntry & 0x40) != 0 )
{
UsbCleanupDeviceEntry((_DWORD *)(DevOffset + UsbRtDispatchTable + 3056)); /*0x2fc4*/
*(_DWORD *)DevEntry |= 0x100u; /*0x2fc9*/
}
CallStatus = UsbFindDeviceByHcPtr(*(_QWORD *)(DevEntry + 120)); /*0x2fd1*/
if ( CallStatus && (NotifyFunc = *(void (__fastcall **)(__int64))(CallStatus + 32)) != 0 ) /*0x2fe2*/
{
NotifyFunc(DevEntry); /*0x2fe7*/
*(_QWORD *)(DevEntry + 120) = 0; /*0x2fe9*/
}
else if ( *(_BYTE *)(DevEntry + 64) ) /*0x2ff0*/
{
(*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(i + 1) - 16) >> 4) + 4) /*0x301a*/
+ UsbRtDispatchTable
+ 224))(
i,
DevEntry);
*(_BYTE *)(DevEntry + 64) = 0; /*0x3022*/
}
Result_1 = (*(__int64 (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(i + 1) - 16) >> 4) + 4) /*0x304a*/
+ UsbRtDispatchTable
+ 272))(
i,
DevEntry);
*(_DWORD *)DevEntry &= ~0x80u; /*0x3052*/
Result = Result_1; /*0x3056*/
SlotFlags = *(_BYTE *)(DevEntry + 10); /*0x3059*/
if ( SlotFlags ) /*0x305e*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x3060*/
*(_QWORD *)(UsbRtDispatchTable + 29864) |= Assert_0(1, SlotFlags); /*0x3074*/
*(_BYTE *)(DevEntry + 10) = 0; /*0x307b*/
}
*(_DWORD *)DevEntry &= ~2u; /*0x307f*/
if ( (*(_DWORD *)DevEntry & 0x44) == 0 ) /*0x3086*/
*(_DWORD *)DevEntry &= ~1u; /*0x308b*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Release Dev[%d]: %x, flag %x\n", DevIdx, DevEntry, *(_DWORD *)DevEntry);
}
++DevIdx; /*0x30aa*/
DevOffset += 448; /*0x30ad*/
}
while ( DevIdx < 0x37u );
return Result; /*0x30d0*/
}
// Function: UsbGetInfo_13 @ 0x30e0 (0x3d bytes)
char __fastcall UsbGetInfo_13(_BYTE *UsbHcPtr, __int64 TmpRdx, __int64 TmpR8)
{
char TmpR8_1; // bl
char TmpRdx_1; // di
__int64 HcType; // rdx
TmpR8_1 = TmpR8; /*0x30ef*/
TmpRdx_1 = TmpRdx; /*0x30f2*/
UsbConfig_13(UsbHcPtr, TmpRdx, TmpR8); /*0x30f8*/
LOBYTE(HcType) = TmpRdx_1; /*0x3100*/
DebugLogPrint_4((__int64)UsbHcPtr, HcType, TmpR8_1); /*0x3106*/
return 0; /*0x3117*/
}
// Function: DebugLogPrint_3 @ 0x3120 (0x1ed bytes)
char __fastcall DebugLogPrint_3(__int64 UsbHcPtr, __int64 PortNum, __int64 EndpointAddr)
{
char EndpointAddr_1; // si
char PortNum_1; // di
unsigned __int8 RetryCnt; // bp
int Status; // eax
__int64 TmpRdx; // rdx
__int64 TmpRcx; // rcx
char Status_1; // r14
__int64 TmpRdx_0; // rdx
__int64 TmpR8; // r8
__int64 TmpRdx_1; // rdx
__int64 TmpR8_0; // r8
unsigned int Info_12; // eax
unsigned __int64 EnumResult; // rax
__int64 TmpRdx_2; // rdx
__int64 TmpR8_1; // r8
__int64 TmpR8_2; // r8
__int64 TmpRdx_3; // rdx
__int64 TmpR8_3; // r8
__int64 TmpRdx_4; // rdx
EndpointAddr_1 = EndpointAddr; /*0x3138*/
PortNum_1 = PortNum; /*0x313b*/
for ( RetryCnt = 0; RetryCnt < 6u; ++RetryCnt ) /*0x3141*/
{
LOBYTE(EndpointAddr) = EndpointAddr_1; /*0x314d*/
LOBYTE(PortNum) = PortNum_1; /*0x3150*/
Status = UsbGetInfo_12(UsbHcPtr, PortNum, EndpointAddr, 1); /*0x3156*/
Status_1 = Status; /*0x315b*/
if ( Status == 255 ) /*0x3163*/
return -1; /*0x3163*/
if ( (Status & 0x40) == 0 ) /*0x316d*/
return 0; /*0x316d*/
LOBYTE(TmpRdx) = EndpointAddr_1; /*0x317b*/
LOBYTE(TmpRcx) = PortNum_1; /*0x3183*/
if ( UsbHidMatchDeviceTopology(TmpRcx, TmpRdx, *(_WORD *)(UsbHcPtr + 34), 0, 0) ) /*0x3186*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Match the skip table ; skipping this device.\n"); /*0x3304*/
return 0; /*0x3304*/
}
if ( !RetryCnt && (Status_1 & 0x10) == 0 ) /*0x319c*/
return 0; /*0x319c*/
LOBYTE(TmpR8) = EndpointAddr_1; /*0x31a2*/
LOBYTE(TmpRdx_0) = PortNum_1; /*0x31a5*/
if ( (Status_1 & 1) == 0 ) /*0x31af*/
{
UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx_0, TmpR8); /*0x32e6*/
DebugBeep(8u, 0x1000u); /*0x32f2*/
return 0; /*0x32f7*/
}
if ( *(_BYTE *)(UsbRtDispatchTable + 30482) ) /*0x31bc*/
{
UsbConfig_13((_BYTE *)UsbHcPtr, TmpRdx_0, TmpR8); /*0x32df*/
return 0; /*0x32e4*/
}
UsbConfig_16((_BYTE *)UsbHcPtr, TmpRdx_0, TmpR8); /*0x31c9*/
if ( PortNum_1 < 0 ) /*0x31d1*/
{
LOBYTE(TmpRdx_1) = EndpointAddr_1; /*0x31d7*/
(*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(UsbHcPtr + 1) - 16) >> 4) + 4) /*0x31f6*/
+ UsbRtDispatchTable
+ 184))(
UsbHcPtr,
TmpRdx_1);
}
LOBYTE(TmpR8_0) = EndpointAddr_1; /*0x3201*/
LOBYTE(TmpRdx_1) = PortNum_1; /*0x3204*/
Info_12 = UsbGetInfo_12(UsbHcPtr, TmpRdx_1, TmpR8_0, 1); /*0x320a*/
if ( Info_12 == 255 ) /*0x3214*/
return -1; /*0x3214*/
if ( (Info_12 & 0x40) == 0 ) /*0x321c*/
return 0; /*0x321c*/
if ( (Info_12 & 1) != 0 && (Info_12 & 0x20) != 0 ) /*0x3228*/
{
EnumResult = UsbGetInfo((_BYTE *)UsbHcPtr, PortNum_1, EndpointAddr_1, Info_12); /*0x3236*/
if ( EnumResult != 2 ) /*0x323f*/
{
if ( !EnumResult ) /*0x32c9*/
return -1; /*0x32c9*/
if ( EnumResult <= 5 ) /*0x32cf*/
{
DebugBeep(0x10u, 0x4000u); /*0x32d8*/
return -1; /*0x32dd*/
}
return 0; /*0x32cf*/
}
if ( RetryCnt >= 3u ) /*0x3249*/
{
LOBYTE(TmpR8_1) = EndpointAddr_1; /*0x324b*/
LOBYTE(TmpRdx_2) = PortNum_1; /*0x324e*/
UsbConfig_13((_BYTE *)UsbHcPtr, TmpRdx_2, TmpR8_1); /*0x3254*/
}
}
(*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x3263*/
}
if ( RetryCnt == 6 ) /*0x3276*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Usb Device enumeration is failed.\n"); /*0x3287*/
LOBYTE(TmpR8_2) = EndpointAddr_1; /*0x328c*/
LOBYTE(TmpRdx_3) = PortNum_1; /*0x328f*/
UsbConfig_13((_BYTE *)UsbHcPtr, TmpRdx_3, TmpR8_2); /*0x3295*/
LOBYTE(TmpR8_3) = EndpointAddr_1; /*0x329d*/
LOBYTE(TmpRdx_4) = PortNum_1; /*0x32a0*/
UsbGetInfo_12(UsbHcPtr, TmpRdx_4, TmpR8_3, 1); /*0x32a6*/
return -1; /*0x32ab*/
}
return 0; /*0x32bc*/
}
// Function: UsbConfig_1 @ 0x3310 (0x1d3 bytes)
__int64 __fastcall UsbConfig_1(unsigned __int16 RequestedBits)
{
char Found; // bl
unsigned __int8 BitIdx; // r8
__int16 ConsecutiveCnt; // r10
unsigned __int16 Position; // r11
__int64 UsbRtDispatchTable; // rdi
unsigned __int16 RequestedBits_1; // r9
unsigned __int16 SegIdx; // r15
unsigned int SegBits; // r14d
unsigned __int16 CurSeg; // si
unsigned __int16 CurSeg_3; // bp
unsigned __int16 SegBits_1; // dx
unsigned __int16 CurSeg_2; // cx
int BitTestVal; // r12d
unsigned __int16 RequestedBits_2; // r10
int Mask; // edx
unsigned __int16 CurSeg_1; // [rsp+50h] [rbp+8h]
Found = 0; /*0x332f*/
BitIdx = 0; /*0x3332*/
ConsecutiveCnt = 0; /*0x3335*/
Position = 0; /*0x3339*/
if ( !RequestedBits ) /*0x3340*/
return 0; /*0x34c4*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x3346*/
RequestedBits_1 = RequestedBits + 1; /*0x3354*/
SegIdx = 0; /*0x335b*/
if ( (RequestedBits & 1) == 0 ) /*0x3365*/
RequestedBits_1 = RequestedBits; /*0x3365*/
SegBits = (*(_DWORD *)(UsbRtDispatchTable + 29888) >> 2) / *(_DWORD *)(UsbRtDispatchTable + 29876); /*0x3377*/
CurSeg = CurSeg_1; /*0x3382*/
CurSeg_3 = 0; /*0x3387*/
while ( !Found ) /*0x338c*/
{
if ( RequestedBits_1 <= 0x80u ) /*0x339b*/
ConsecutiveCnt = 0; /*0x339d*/
SegBits_1 = 0; /*0x33a0*/
if ( SegBits ) /*0x33a7*/
{
CurSeg_2 = CurSeg_3; /*0x33b0*/
do /*0x340f*/
{
CurSeg = CurSeg_2; /*0x33b6*/
for ( BitIdx = 0; BitIdx < 0x20u; ++BitIdx ) /*0x33b9*/
{
++Position; /*0x33c6*/
BitTestVal = *(_DWORD *)(*(_QWORD *)(UsbRtDispatchTable + 29896) + 4LL * CurSeg_2); /*0x33bc*/
if ( _bittest(&BitTestVal, BitIdx) ) /*0x33ce*/
{
if ( ++ConsecutiveCnt == RequestedBits_1 ) /*0x33e1*/
{
Position -= ConsecutiveCnt; /*0x33e6*/
Found = 1; /*0x33ea*/
goto LABEL_17; /*0x33ed*/
}
}
else
{
ConsecutiveCnt = 0; /*0x33f1*/
}
}
++SegBits_1; /*0x3403*/
++CurSeg_2; /*0x3406*/
}
while ( SegBits_1 < SegBits ); /*0x340f*/
}
LABEL_17:
++SegIdx; /*0x341a*/
CurSeg_3 += SegBits; /*0x341e*/
if ( (unsigned int)SegIdx >= *(_DWORD *)(UsbRtDispatchTable + 29876) ) /*0x342c*/
{
if ( !Found ) /*0x3434*/
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Usb.c", 1415, (__int64)"((BOOLEAN)(0==1))"); /*0x34bf*/
return 0; /*0x34bf*/
}
goto LABEL_19; /*0x3434*/
}
}
do
{
LABEL_19:
RequestedBits_2 = BitIdx + 1; /*0x3439*/
if ( BitIdx >= RequestedBits_1 - 1 ) /*0x3450*/
RequestedBits_2 = RequestedBits_1; /*0x3450*/
Mask = (unsigned __int8)(BitIdx - RequestedBits_2 + 1) + (unsigned int)RequestedBits_2 < 0x20
? -1 << (BitIdx + 1)
: 0;
if ( BitIdx - (_BYTE)RequestedBits_2 != 0xFF ) /*0x3471*/
Mask |= ~(-1 << (BitIdx - RequestedBits_2 + 1)); /*0x347b*/
BitIdx = 31; /*0x3484*/
*(_DWORD *)(*(_QWORD *)(UsbRtDispatchTable + 29896) + 4LL * CurSeg--) &= Mask; /*0x348a*/
RequestedBits_1 -= RequestedBits_2; /*0x3495*/
}
while ( RequestedBits_1 );
return *(_QWORD *)(UsbRtDispatchTable + 29880) + 32LL * Position; /*0x34d5*/
}
// Function: FwVolConfig @ 0x34e4 (0x107 bytes)
char __fastcall FwVolConfig(unsigned __int64 BufferAddr, unsigned __int16 Size)
{
unsigned __int16 Size_1; // bx
unsigned __int16 Size_2; // r14
__int64 UsbRtDispatchTable; // rsi
unsigned __int64 BufferAddr_1; // rax
unsigned __int16 BitOffset; // r10
unsigned __int8 SubBitIdx; // bp
unsigned __int16 SegIdx; // di
unsigned __int8 SubBitStart; // r10
char LoopSubIdx; // cl
int SegAdvance; // ecx
unsigned __int64 CleanSize; // rdx
Size_1 = Size + 1; /*0x34ff*/
if ( (Size & 1) == 0 ) /*0x3509*/
Size_1 = Size; /*0x3509*/
Size_2 = Size_1; /*0x350d*/
if ( !BufferAddr ) /*0x3514*/
return -1; /*0x3514*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x351a*/
BufferAddr_1 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x3521*/
if ( BufferAddr < BufferAddr_1 ) /*0x352b*/
return -1; /*0x352b*/
if ( BufferAddr > BufferAddr_1 + 32800 ) /*0x353a*/
return -1; /*0x353a*/
BitOffset = (unsigned __int16)(BufferAddr - *(_WORD *)(UsbRtDispatchTable + 29880)) >> 5; /*0x3551*/
if ( BitOffset >= 0x400u ) /*0x355a*/
return -1; /*0x35d0*/
SubBitIdx = 0; /*0x3560*/
SegIdx = (unsigned __int16)(BufferAddr - *(_WORD *)(UsbRtDispatchTable + 29880)) >> 10; /*0x3563*/
SubBitStart = BitOffset & 0x1F; /*0x3567*/
do /*0x35b6*/
{
LoopSubIdx = SubBitIdx++; /*0x357a*/
*(_DWORD *)(*(_QWORD *)(UsbRtDispatchTable + 29896) + 4LL * SegIdx) |= 1 << (SubBitStart + LoopSubIdx); /*0x358b*/
--Size_2; /*0x3594*/
SegAdvance = SubBitIdx + SubBitStart; /*0x359c*/
if ( SegAdvance && (SegAdvance & 0x1F) == 0 ) /*0x35a7*/
{
++SegIdx; /*0x35a9*/
SubBitStart = 0; /*0x35ac*/
SubBitIdx = 0; /*0x35af*/
}
}
while ( Size_2 ); /*0x35b6*/
CleanSize = 32LL * Size_1; /*0x35bb*/
if ( CleanSize ) /*0x35c2*/
MemGetInfo(BufferAddr, CleanSize); /*0x35c7*/
return 0; /*0x35e1*/
}
// Function: UsbRegisterNotifyFunc @ 0x35ec (0x71 bytes)
__int64 __fastcall UsbRegisterNotifyFunc(__int64 NotifyFunc)
{
int SlotIdx; // ebx
__int64 NotifyFunc_1; // r8
LOBYTE(SlotIdx) = 50; /*0x35f9*/
do /*0x3615*/
{
NotifyFunc_1 = *(_QWORD *)(UsbRtDispatchTable + 8LL * (unsigned __int8)SlotIdx + 29064); /*0x35fe*/
if ( !NotifyFunc_1 ) /*0x3609*/
break; /*0x3609*/
if ( NotifyFunc_1 == NotifyFunc ) /*0x360e*/
return (unsigned int)(SlotIdx - 49); /*0x360e*/
LOBYTE(SlotIdx) = SlotIdx + 1; /*0x3610*/
}
while ( (unsigned __int8)SlotIdx < 0x64u ); /*0x3615*/
if ( (_BYTE)SlotIdx == 100 ) /*0x361a*/
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Usb.c", 1609, (__int64)"Index != MaxIndex"); /*0x362f*/
while ( 1 ) /*0x363d*/
; /*0x363d*/
}
*(_QWORD *)(UsbRtDispatchTable + 8LL * (unsigned __int8)SlotIdx + 29064) = NotifyFunc; /*0x364c*/
return (unsigned int)(SlotIdx - 49); /*0x3657*/
}
// Function: UsbFindDeviceByHcPtr @ 0x3660 (0x75 bytes)
__int64 __fastcall UsbFindDeviceByHcPtr(__int64 i)
{
unsigned __int64 n7; // rdx
__int64 j; // rcx
unsigned __int64 n7_2; // rax
__int64 v6; // rax
unsigned __int64 n7_1; // rax
n7 = 0; /*0x3660*/
if ( !i ) /*0x3668*/
return 0; /*0x366a*/
for ( j = UsbRtDispatchTable + 2384; i != j - 672; j += 48 ) /*0x3674*/
{
if ( i == j ) /*0x368a*/
{
n7_2 = n7 + 7; /*0x369f*/
if ( n7 >= 7 ) /*0x36a3*/
n7_2 = n7; /*0x36a3*/
v6 = 48 * n7_2 + 2384; /*0x36af*/
return UsbRtDispatchTable + v6; /*0x36b5*/
}
if ( ++n7 >= 0xE ) /*0x3697*/
return 0; /*0x3697*/
}
n7_1 = n7 + 7; /*0x36bb*/
if ( n7 >= 7 ) /*0x36bf*/
n7_1 = n7; /*0x36bf*/
v6 = 48 * n7_1 + 1712; /*0x36cb*/
return UsbRtDispatchTable + v6; /*0x366c*/
}
// Function: DxeInit @ 0x36d8 (0x107 bytes)
__int64 __fastcall sub_36D8(__int64 a1, __int64 a2, __int64 a3, __int16 a4, unsigned __int8 a5, unsigned __int8 a6)
{
char v11; // bl
int v12; // [rsp+20h] [rbp-38h]
int v13; // [rsp+30h] [rbp-28h]
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x3721*/
return 0; /*0x370f*/
v11 = 0; /*0x3738*/
while ( 1 ) /*0x374c*/
{
LOWORD(v13) = a4; /*0x374c*/
LOWORD(v12) = a6 + (a5 << 8); /*0x3779*/
if ( (*(unsigned __int16 (__fastcall **)(__int64, __int64, __int64, _QWORD, int, __int64, int))(200LL * (((*(unsigned __int8 *)(a1 + 1) - 16) >> 4) + 4) /*0x377e*/
+ UsbRtDispatchTable
+ 192))(
a1,
a2,
1664,
0,
v12,
a3,
v13) )
{
break; /*0x377e*/
}
if ( (*(_BYTE *)(UsbRtDispatchTable + 30476) & 0x40) == 0 ) /*0x3799*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x37ab*/
if ( (unsigned __int8)++v11 < 5u ) /*0x37b6*/
continue; /*0x37b6*/
}
return 0; /*0x37b6*/
}
return a3; /*0x37d4*/
}
// Function: UsbControlTransfer @ 0x37e0 (0xa6 bytes)
char __fastcall UsbControlTransfer(_BYTE *UsbHcPtr, __int64 src, unsigned __int8 i)
{
__int64 UsbRtDispatchTable; // r11
char v4; // bl
__int16 i_1; // bp
int v9; // [rsp+20h] [rbp-28h]
int v10; // [rsp+30h] [rbp-18h]
UsbRtDispatchTable = UsbRtDispatchTable; /*0x37f9*/
v4 = 0; /*0x3803*/
i_1 = i; /*0x3806*/
while ( 1 ) /*0x381a*/
{
LOWORD(v10) = 0; /*0x381a*/
LOWORD(v9) = i_1; /*0x3840*/
(*(void (__fastcall **)(_BYTE *, __int64, __int64, _QWORD, int, _QWORD, int))(200LL /*0x3845*/
* ((((unsigned __int8)UsbHcPtr[1] - 16) >> 4)
+ 4)
+ UsbRtDispatchTable
+ 192))(
UsbHcPtr,
src,
1280,
0,
v9,
0,
v10);
UsbRtDispatchTable = UsbRtDispatchTable; /*0x384d*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 30472) & 4) == 0 ) /*0x385c*/
break; /*0x385c*/
if ( (unsigned __int8)++v4 >= 5u ) /*0x3863*/
return -1; /*0x3867*/
}
return 0; /*0x387f*/
}
// Function: UsbControlTransferRead @ 0x3888 (0x50 bytes)
char __fastcall UsbControlTransferRead(unsigned __int8 *UsbHcPtr, _DWORD *dst, unsigned __int8 a3)
{
__int16 v4; // [rsp+20h] [rbp-28h]
__int16 v5; // [rsp+30h] [rbp-18h]
v5 = 0; /*0x3896*/
v4 = a3; /*0x38bd*/
(*(void (__fastcall **)(unsigned __int8 *, _DWORD *, __int64, _QWORD, __int16, _QWORD, __int16))(200LL /*0x38c9*/
* (((UsbHcPtr[1] - 16) >> 4)
+ 4)
+ UsbRtDispatchTable
+ 192))(
UsbHcPtr,
dst,
2304,
0,
v4,
0,
v5);
return 0; /*0x38d3*/
}
// Function: DebugLogPrint_12 @ 0x38d8 (0x83 bytes)
char __fastcall DebugLogPrint_12(unsigned __int8 *UsbHcPtr, _DWORD *DevEntry, unsigned __int8 InterfaceNum)
{
__int16 InterfaceNum_1; // bx
__int16 InterfaceNum_2; // [rsp+20h] [rbp-28h]
__int16 ZeroVal; // [rsp+30h] [rbp-18h]
InterfaceNum_1 = InterfaceNum; /*0x38e7*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UsbSetInterface %d\n", InterfaceNum); /*0x38ff*/
ZeroVal = 0; /*0x390d*/
InterfaceNum_2 = InterfaceNum_1; /*0x393c*/
(*(void (__fastcall **)(unsigned __int8 *, _DWORD *, __int64, _QWORD, __int16, _QWORD, __int16))(200LL /*0x3941*/
* (((UsbHcPtr[1] - 16) >> 4)
+ 4)
+ UsbRtDispatchTable
+ 192))(
UsbHcPtr,
DevEntry,
2817,
0,
InterfaceNum_2,
0,
ZeroVal);
return 0; /*0x3955*/
}
// Function: FwVolDriverEntry @ 0x395c (0x229 bytes)
__int64 __fastcall FwVolDriverEntry(char QueryType, __int64 DevEntry, unsigned __int8 MatchVal, _BYTE *MatchExtra)
{
char Found; // bp
unsigned int Count; // edi
__int64 DevEntry_1; // rbx
unsigned __int8 StartIdx; // r8
unsigned __int8 Idx; // si
__int64 Offset; // rcx
__int64 Offset2; // r9
bool v14; // zf
Found = 0; /*0x396f*/
Count = 0; /*0x3972*/
DevEntry_1 = DevEntry; /*0x3977*/
if ( QueryType == (char)0x80 ) /*0x397d*/
{
if ( DevEntry ) /*0x3989*/
{
StartIdx = 1; /*0x3992*/
while ( 448LL * StartIdx + UsbRtDispatchTable + 3056 != DevEntry ) /*0x39ad*/
{
if ( ++StartIdx >= 0x37u ) /*0x39b6*/
return 0; /*0x39b6*/
}
return StartIdx; /*0x39bf*/
}
else
{
switch ( MatchVal ) /*0x39cc*/
{
case '~': /*0x39cc*/
return UsbRtDispatchTable + 27712; /*0x39d5*/
case '}': /*0x39cc*/
return UsbRtDispatchTable + 28160; /*0x39ed*/
case '\x7F': /*0x39cc*/
return UsbRtDispatchTable + 28608; /*0x3a05*/
default:
if ( MatchVal ) /*0x3a13*/
return 448LL * MatchVal + UsbRtDispatchTable + 3056; /*0x3a2d*/
else
return 0; /*0x39b8*/
}
}
}
for ( Idx = 1; Idx < 0x37u; ++Idx ) /*0x3a3c*/
{
if ( DevEntry_1 ) /*0x3a46*/
{
if ( 448LL * Idx + UsbRtDispatchTable + 3056 == DevEntry_1 ) /*0x3a5c*/
DevEntry_1 = 0; /*0x3a62*/
continue; /*0x3a64*/
}
if ( QueryType == 49 ) /*0x3a6d*/
{
Offset = 448LL * Idx; /*0x3a6f*/
if ( *(_BYTE *)(Offset + UsbRtDispatchTable + 3127) == MatchVal /*0x3aa1*/
&& (!MatchExtra || *(_BYTE *)(Offset + UsbRtDispatchTable + 3067) == *MatchExtra)
&& (*(_BYTE *)(Offset + UsbRtDispatchTable + 3056) & 2) != 0 )
{
++Count; /*0x3aa7*/
}
continue; /*0x3aa9*/
}
Offset2 = 448LL * Idx; /*0x3aae*/
if ( (*(_BYTE *)(Offset2 + UsbRtDispatchTable + 3056) & 3) == 3 ) /*0x3ac2*/
{
if ( QueryType == 16 ) /*0x3ac8*/
{
if ( *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3066) != MatchVal ) /*0x3b1d*/
goto LABEL_43; /*0x3b1d*/
if ( !MatchExtra ) /*0x3b22*/
{
LABEL_42:
Found = 1; /*0x3b3f*/
goto LABEL_43; /*0x3b3f*/
}
goto LABEL_40; /*0x3b22*/
}
if ( QueryType == 32 ) /*0x3ace*/
{
v14 = *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3060) == MatchVal; /*0x3b0b*/
goto LABEL_41; /*0x3b13*/
}
if ( QueryType != 48 ) /*0x3ad4*/
{
if ( QueryType != 64 || !MatchExtra ) /*0x3ae3*/
return 0; /*0x3ae3*/
LABEL_40:
v14 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) /*0x3b24*/
+ 8LL * (*(unsigned __int8 *)(Offset2 + UsbRtDispatchTable + 3067) - 1)) == (_QWORD)MatchExtra;
LABEL_41:
if ( !v14 ) /*0x3b3d*/
goto LABEL_43; /*0x3b3d*/
goto LABEL_42; /*0x3b3d*/
}
if ( *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3060) == MatchVal /*0x3b05*/
&& (!MatchExtra || *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3067) == *MatchExtra) )
{
++Count; /*0x3b07*/
}
}
LABEL_43:
if ( Found ) /*0x3b45*/
return Offset2 + UsbRtDispatchTable + 3056; /*0x3b6d*/
}
if ( (unsigned __int8)(QueryType - 48) > 1u ) /*0x3b5c*/
return 0; /*0x3b5c*/
return Count; /*0x3b84*/
}
// Function: UsbFindDeviceEntry @ 0x3bb8 (0xc3 bytes)
__int64 __fastcall UsbFindDeviceEntry(__int64 src, char a2)
{
__int64 v4; // r9
unsigned __int8 v5; // r10
__int64 v6; // rcx
__int64 v7; // rdx
__int16 v8; // ax
bool v9; // zf
v4 = 0; /*0x3bca*/
v5 = 1; /*0x3bcd*/
while ( 1 ) /*0x3bdb*/
{
v6 = 448LL * v5; /*0x3bdb*/
v7 = v6 + UsbRtDispatchTable + 3056; /*0x3be2*/
if ( (*(_BYTE *)v7 & 0x20) == 0 ) /*0x3be8*/
{
if ( (*(_BYTE *)v7 & 1) == 0 ) /*0x3bed*/
{
if ( v4 ) /*0x3bf2*/
v7 = v4; /*0x3bf2*/
v4 = v7; /*0x3bf6*/
goto LABEL_20; /*0x3bf9*/
}
if ( (*(_BYTE *)v7 & 2) == 0 /*0x3c10*/
|| *(_BYTE *)(v7 + 12) == *(_BYTE *)(src + 12) && *(_BYTE *)(v7 + 13) == *(_BYTE *)(src + 13) )
{
v8 = *(_WORD *)(src + 6); /*0x3c16*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x3c1b*/
{
if ( *(_WORD *)(v7 + 6) != v8 /*0x3c35*/
|| *(_WORD *)(v7 + 8) != *(_WORD *)(src + 8)
|| *(_BYTE *)(v7 + 19) != *(_BYTE *)(src + 19) )
{
goto LABEL_20; /*0x3c35*/
}
v9 = *(_BYTE *)(v7 + 14) == *(_BYTE *)(src + 14); /*0x3c3b*/
}
else
{
if ( *(_WORD *)(v7 + 6) != v8 || *(_WORD *)(v7 + 8) != *(_WORD *)(src + 8) ) /*0x3c4f*/
goto LABEL_20; /*0x3c4f*/
v9 = *(_BYTE *)(v7 + 19) == *(_BYTE *)(src + 19); /*0x3c55*/
}
if ( v9 && *(_BYTE *)(v7 + 15) == a2 ) /*0x3c5e*/
return v6 + UsbRtDispatchTable + 3056; /*0x3c75*/
}
}
LABEL_20:
if ( ++v5 >= 0x37u ) /*0x3c67*/
return v4; /*0x3c6d*/
}
}
// Function: DebugLogPrint_24 @ 0x3c7c (0x23d bytes)
_DWORD *__fastcall DebugLogPrint_24(unsigned __int8 *UsbHcPtr, __int64 src)
{
_BYTE *dst_1; // rax
_DWORD *dst; // rbx
__int64 UsbRtDispatchTable; // rsi
int v8; // eax
__int64 v9; // r14
__int64 v10; // rax
__int64 v11; // r10
int v12; // r9d
__int64 v13; // rax
unsigned __int8 i; // al
dst_1 = (_BYTE *)UsbFindDeviceEntry(src, 0); /*0x3c9f*/
dst = dst_1; /*0x3ca7*/
if ( !dst_1 ) /*0x3cad*/
return 0; /*0x3cad*/
if ( (*dst_1 & 1) != 0 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USB_ConfigureDevice: Existing device.\n");
*(_DWORD *)src |= *dst; /*0x3cd1*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x3cda*/
*(_QWORD *)(src + 312) = *((_QWORD *)dst + 39); /*0x3ce1*/
v8 = *((unsigned __int8 *)dst + 11) - 1; /*0x3cec*/
dst[14] = 0; /*0x3cee*/
v9 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * v8); /*0x3cfc*/
v10 = UsbFindDeviceByHcPtr(*((_QWORD *)dst + 15)); /*0x3d04*/
v11 = v10; /*0x3d09*/
if ( v10 && *(_QWORD *)(v10 + 32) ) /*0x3d11*/
{
if ( *((_BYTE *)dst + 4) == 3 && (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 && (*dst & 0x100) == 0 ) /*0x3d2c*/
{
UsbCleanupDeviceEntry(dst); /*0x3d31*/
*(_DWORD *)src |= v12; /*0x3d36*/
}
(*(void (__fastcall **)(_DWORD *))(v11 + 32))(dst); /*0x3d3c*/
*((_QWORD *)dst + 15) = 0; /*0x3d40*/
}
else
{
if ( !*((_BYTE *)dst + 64) ) /*0x3d4a*/
goto LABEL_14; /*0x3d4a*/
(*(void (__fastcall **)(__int64, _DWORD *))(200LL * (((*(unsigned __int8 *)(v9 + 1) - 16) >> 4) + 4) /*0x3d69*/
+ UsbRtDispatchTable
+ 224))(
v9,
dst);
*((_BYTE *)dst + 64) = 0; /*0x3d71*/
}
UsbRtDispatchTable = UsbRtDispatchTable; /*0x3d75*/
LABEL_14:
v13 = *((_QWORD *)dst + 27); /*0x3d7c*/
if ( v13 && v13 != *(_QWORD *)(src + 216) ) /*0x3d8f*/
{
(*(void (__fastcall **)(__int64, _DWORD *))(200LL * (((*(unsigned __int8 *)(v9 + 1) - 16) >> 4) + 4) /*0x3dae*/
+ UsbRtDispatchTable
+ 272))(
v9,
dst);
UsbRtDispatchTable = UsbRtDispatchTable; /*0x3db6*/
}
if ( (*(_BYTE *)dst & 2) != 0 ) /*0x3dc0*/
{
i = *((_BYTE *)dst + 10); /*0x3dc2*/
if ( i ) /*0x3dc7*/
{
*(_QWORD *)(UsbRtDispatchTable + 29864) |= Assert_0(1, i); /*0x3dd6*/
*((_BYTE *)dst + 10) = 0; /*0x3ddd*/
}
}
goto LABEL_21; /*0x3de1*/
}
if ( DebugLogPrint_26(*(_BYTE *)(src + 71)) == 1 ) /*0x3ded*/
return 0; /*0x3cb1*/
LABEL_21:
if ( (*(_BYTE *)dst & 4) != 0 ) /*0x3df6*/
{
*((_BYTE *)dst + 11) = *(_BYTE *)(src + 11); /*0x3e20*/
*((_BYTE *)dst + 12) = *(_BYTE *)(src + 12); /*0x3e26*/
*((_BYTE *)dst + 13) = *(_BYTE *)(src + 13); /*0x3e2c*/
*((_BYTE *)dst + 14) = *(_BYTE *)(src + 14); /*0x3e32*/
*((_WORD *)dst + 8) = *(_WORD *)(src + 16); /*0x3e39*/
*((_QWORD *)dst + 27) = *(_QWORD *)(src + 216); /*0x3e44*/
*((_BYTE *)dst + 10) = *(_BYTE *)(src + 10); /*0x3e4e*/
}
else
{
*(_BYTE *)(src + 288) = *((_BYTE *)dst + 288); /*0x3e07*/
MemConfig((char *)dst, (char *)src, 0x1C0u); /*0x3e10*/
*dst &= 0x347u; /*0x3e15*/
}
*dst |= 3u; /*0x3e51*/
if ( (*(_BYTE *)src & 8) == 0 ) /*0x3e57*/
{
UsbControlTransferRead(UsbHcPtr, dst, *((_BYTE *)dst + 18)); /*0x3e63*/
if ( (*(_DWORD *)src & 0x200) != 0 ) /*0x3e6e*/
DebugLogPrint_12(UsbHcPtr, dst, *((_BYTE *)dst + 20)); /*0x3e7a*/
}
DebugPrint(
0xFFFFFFFFFFFFFFFFuLL,
"new dev: %x, flag: %x, addr %d\n",
(_DWORD)dst,
*dst,
*((unsigned __int8 *)dst + 10));
return dst; /*0x3eaf*/
}
// Function: DebugLogPrint_25 @ 0x3ebc (0x9e bytes)
char __fastcall DebugLogPrint_25(_BYTE *UsbHcPtr, _WORD *src, unsigned __int8 *p_n2047, unsigned __int16 n2047)
{
__int16 v4; // ax
__int16 *v5; // rbx
__int16 v6; // cx
unsigned __int8 *v8; // rdi
__int16 v9; // ax
unsigned __int8 v10; // al
unsigned __int8 v11; // al
v4 = word_1C160; /*0x3ecb*/
v5 = &word_1C160; /*0x3ed2*/
v6 = qword_1C162; /*0x3ed9*/
v8 = &p_n2047[n2047]; /*0x3ee7*/
while ( 1 )
{
v9 = v6 | v4; /*0x3eea*/
if ( !v9 ) /*0x3eed*/
break; /*0x3eed*/
if ( v6 == src[4] && *v5 == src[3] )
{
DebugPrint(
0xFFFFFFFFFFFFFFFFuLL,
"Found non-compatible device: DID=%x, VID=%x\n",
(unsigned __int16)v5[1],
(unsigned __int16)*v5);
src[54] = v5[4]; /*0x3f28*/
v10 = *((_BYTE *)v5 + 4); /*0x3f2c*/
if ( v10 ) /*0x3f31*/
v8[5] = v10; /*0x3f33*/
v11 = *((_BYTE *)v5 + 5); /*0x3f36*/
if ( v11 ) /*0x3f3b*/
v8[6] = v11; /*0x3f3d*/
LOBYTE(v9) = *((_BYTE *)v5 + 6); /*0x3f40*/
if ( (_BYTE)v9 ) /*0x3f45*/
v8[7] = v9; /*0x3f47*/
return v9; /*0x3f47*/
}
v6 = v5[6]; /*0x3efe*/
v5 += 5; /*0x3f02*/
v4 = *v5; /*0x3f06*/
}
return v9; /*0x3f54*/
}
// Function: DebugLogPrint_23 @ 0x3f5c (0x1ce bytes)
_BYTE *__fastcall DebugLogPrint_23(
_BYTE *UsbHcPtr,
__int64 src,
unsigned __int8 *p_n2047,
unsigned __int16 n2047,
__int16 n2047a)
{
__int64 TmpRdx; // rdx
__int64 TmpRcx; // rcx
const CHAR8 *not_compatible_device._n; // rdx
char *v13; // rdi
__int64 v14; // rdx
__int64 v15; // r8
__int64 v16; // r9
char v17; // r14
char v18; // si
char v19; // r15
unsigned __int8 n7; // bp
char v21; // r12
__int64 v22; // rdi
__int64 (__fastcall *v23)(__int64, __int64, __int64, __int64); // rax
_DWORD *dst; // rax
_BYTE *dst_1; // rbx
int v26; // r9d
_BYTE *dst_2; // rax
int v28; // [rsp+20h] [rbp-48h]
DebugLogPrint_25(UsbHcPtr, (_WORD *)src, p_n2047, n2047); /*0x3f88*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USBIdentifyAndConfigureDevice..."); /*0x3f9b*/
if ( (*(_BYTE *)(src + 108) & 4) != 0 ) /*0x3fa4*/
{
not_compatible_device._n = "not compatible device.\n"; /*0x3fa6*/
goto LABEL_3; /*0x3fa6*/
}
LOBYTE(TmpRdx) = *(_BYTE *)(src + 13); /*0x3fc1*/
LOBYTE(TmpRcx) = *(_BYTE *)(src + 12); /*0x3fc4*/
v13 = (char *)&p_n2047[n2047]; /*0x3fca*/
if ( UsbHidMatchDeviceTopology(TmpRcx, TmpRdx, *((_WORD *)UsbHcPtr + 17), v13[5], 1) ) /*0x3fd6*/
{
not_compatible_device._n = "Match the skip table ; skipping this device.\n"; /*0x3fdf*/
goto LABEL_3; /*0x3fe6*/
}
v17 = v13[5]; /*0x3fe8*/
v18 = -1; /*0x3fec*/
v19 = v13[6]; /*0x3fef*/
n7 = 7; /*0x3ff3*/
v21 = v13[7]; /*0x3ff6*/
while ( 1 ) /*0x4014*/
{
v22 = 48LL * n7 + UsbRtDispatchTable + 1712; /*0x4014*/
if ( !*(_BYTE *)v22 ) /*0x401a*/
goto LABEL_14; /*0x401a*/
v23 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int64))(v22 + 16); /*0x401c*/
if ( !v23 ) /*0x4023*/
break; /*0x4023*/
LOBYTE(v16) = v21; /*0x4025*/
LOBYTE(v15) = v19; /*0x4028*/
LOBYTE(v14) = v17; /*0x402b*/
v18 = v23(src, v14, v15, v16); /*0x4033*/
if ( v18 != -1 ) /*0x4038*/
goto LABEL_17; /*0x4038*/
LABEL_14:
if ( ++n7 >= 0xEu ) /*0x4055*/
goto LABEL_18; /*0x4055*/
}
if ( *(_BYTE *)(v22 + 1) != v17 && *(_BYTE *)(v22 + 2) != v19 && *(_BYTE *)(v22 + 3) != v21 ) /*0x404c*/
goto LABEL_14; /*0x404c*/
v18 = *(_BYTE *)v22; /*0x4059*/
if ( *(_BYTE *)v22 == 0xFF ) /*0x4060*/
goto LABEL_18; /*0x4060*/
LABEL_17:
*(_BYTE *)(src + 4) = v18; /*0x4062*/
LABEL_18:
*(_BYTE *)(src + 71) = v17; /*0x4066*/
*(_BYTE *)(src + 73) = v21; /*0x4070*/
*(_BYTE *)(src + 72) = v19; /*0x4074*/
dst = DebugLogPrint_24(UsbHcPtr, src); /*0x4078*/
dst_1 = dst; /*0x407d*/
if ( v18 == -1 ) /*0x4084*/
goto LABEL_27; /*0x4084*/
if ( !dst )
{
not_compatible_device._n = "USB: Common configure failed.\n";
goto LABEL_3; /*0x4096*/
}
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 && (*dst & 0x100) == 0 ) /*0x40b1*/
{
UsbCleanupDeviceEntry(dst); /*0x40b6*/
*(_DWORD *)dst_1 |= v26; /*0x40bb*/
}
LOWORD(v28) = n2047a; /*0x40dd*/
*((_QWORD *)dst_1 + 15) = v22; /*0x40e2*/
dst_2 = (_BYTE *)(*(__int64 (__fastcall **)(_BYTE *, _BYTE *, unsigned __int8 *, _QWORD, int))(v22 + 24))( /*0x40e6*/
UsbHcPtr,
dst_1,
p_n2047,
n2047,
v28);
dst_1 = dst_2; /*0x40e9*/
if ( dst_2 && (*dst_2 & 1) != 0 )
{
LABEL_27:
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "%x\n", (_DWORD)dst_1); /*0x410d*/
return dst_1; /*0x4112*/
}
else
{
not_compatible_device._n = "USB: Device specific configure failed.\n";
LABEL_3:
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, not_compatible_device._n); /*0x3fb0*/
return 0; /*0x3fb5*/
}
}
// Function: UsbServiceHcPolling @ 0x412c (0x137 bytes)
void __fastcall UsbServiceHcPolling(__int64 CtxPtr, unsigned __int8 OpCode)
{
__int64 UsbRtDispatchTable; // r8
char IsSet; // r9
int OpMinus1; // edx
int OpMinus2; // edx
unsigned __int8 Idx; // cl
__int64 CallersArray; // r11
__int64 CallerEntry; // rax
__int64 ActiveEntry; // rcx
__int64 ResetEntry; // rcx
UsbRtDispatchTable = UsbRtDispatchTable; /*0x4130*/
IsSet = ::IsSet; /*0x413a*/
LABEL_2:
if ( OpCode ) /*0x4146*/
{
OpMinus1 = OpCode - 1; /*0x414c*/
if ( OpMinus1 ) /*0x414f*/
{
OpMinus2 = OpMinus1 - 1; /*0x4155*/
if ( OpMinus2 ) /*0x4158*/
{
if ( OpMinus2 == 1 && *(_QWORD *)(UsbRtDispatchTable + 30152) == CtxPtr ) /*0x416e*/
{
*(_QWORD *)(UsbRtDispatchTable + 30152) = 0; /*0x4174*/
for ( Idx = 0; Idx < *(_BYTE *)(UsbRtDispatchTable + 27704); ++Idx ) /*0x417c*/
{
CallersArray = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0x418b*/
if ( *(_QWORD *)(CallersArray + 8LL * Idx) ) /*0x4195*/
{
if ( *(_QWORD *)(CallersArray + 8LL * Idx) != CtxPtr ) /*0x41a0*/
{
CallerEntry = *(_QWORD *)(CallersArray + 8LL * Idx); /*0x41a2*/
if ( *(_QWORD *)(CallerEntry + 120) ) /*0x41a6*/
{
if ( (*(_BYTE *)(CallerEntry + 64) & 1) != 0 ) /*0x41b1*/
{
*(_QWORD *)(UsbRtDispatchTable + 30152) = *(_QWORD *)(CallersArray + 8LL * Idx); /*0x41be*/
if ( !IsSet ) /*0x41c8*/
return; /*0x41c8*/
IsSet = 0; /*0x41ce*/
OpCode = 2; /*0x41d1*/
::IsSet = 0; /*0x41d3*/
CtxPtr = 0; /*0x41da*/
goto LABEL_2; /*0x41dd*/
}
}
}
}
}
}
}
else if ( !IsSet ) /*0x41e5*/
{
ActiveEntry = *(_QWORD *)(UsbRtDispatchTable + 30152); /*0x41e7*/
if ( ActiveEntry ) /*0x41f1*/
(*(void (**)(void))(200LL * (((*(unsigned __int8 *)(ActiveEntry + 1) - 16) >> 4) + 4) /*0x4209*/
+ UsbRtDispatchTable
+ 256))();
::IsSet = 1; /*0x4211*/
}
}
else if ( IsSet ) /*0x421d*/
{
ResetEntry = *(_QWORD *)(UsbRtDispatchTable + 30152); /*0x421f*/
if ( ResetEntry ) /*0x4229*/
(*(void (**)(void))(200LL * (((*(unsigned __int8 *)(ResetEntry + 1) - 16) >> 4) + 4) + UsbRtDispatchTable + 248))(); /*0x4241*/
::IsSet = 0; /*0x4249*/
}
}
else if ( !IsSet ) /*0x4255*/
{
*(_QWORD *)(UsbRtDispatchTable + 30152) = CtxPtr; /*0x4257*/
}
}
// Function: UsbCleanupDeviceEntry @ 0x4c9c (0x8b bytes)
__int64 __fastcall UsbCleanupDeviceEntry(_DWORD *dst)
{
__int64 i; // rdx
__int64 result; // rax
for ( i = UsbRtDispatchTable; /*0x4c9c*/
*(_DWORD *)(i + 30540) >= *(_DWORD *)(i + 30536);
*(_DWORD *)(i + 30540) -= *(_DWORD *)(i + 30536) )
{
; /*0x4cae*/
}
*(_QWORD *)(*(_QWORD *)(i + 30528) + 8LL * (int)(*(_DWORD *)(i + 30540))++) = dst; /*0x4cd0*/
if ( *(_DWORD *)(i + 30540) == *(_DWORD *)(i + 30536) ) /*0x4ce6*/
*(_DWORD *)(i + 30540) -= *(_DWORD *)(i + 30536); /*0x4cee*/
result = *(unsigned int *)(i + 30544); /*0x4cfa*/
if ( *(_DWORD *)(i + 30540) == (_DWORD)result ) /*0x4d02*/
{
++*(_DWORD *)(i + 30544); /*0x4d04*/
while ( 1 ) /*0x4d18*/
{
result = *(unsigned int *)(i + 30544); /*0x4d18*/
if ( (int)result < *(_DWORD *)(i + 30536) ) /*0x4d24*/
break; /*0x4d24*/
*(_DWORD *)(i + 30544) -= *(_DWORD *)(i + 30536); /*0x4d12*/
}
}
return result; /*0x4d26*/
}
// Function: DebugLogPrint_26 @ 0x4d28 (0x9c bytes)
char __fastcall DebugLogPrint_26(unsigned __int8 n11)
{
char n15; // al
n15 = FwVolDriverEntry(49, 0, n11, 0); /*0x4d3a*/
if ( n15 ) /*0x4d4d*/
{
switch ( n11 ) /*0x4d52*/
{
case 3u: /*0x4d52*/
if ( n15 == 15 ) /*0x4d5d*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Reached the limit of supported HIDs (%d); skipping this device.\n"); /*0x4d6a*/
return 1; /*0x4d71*/
}
break;
case 9u: /*0x4d52*/
if ( n15 == 12 ) /*0x4d81*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Reached the limit of supported HUBs (%d); skipping this device.\n"); /*0x4d8a*/
return 1; /*0x4d8a*/
}
break;
case 8u: /*0x4d52*/
if ( n15 == 6 ) /*0x4d93*/
{
DebugPrint( /*0x4da2*/
0xFFFFFFFFFFFFFFFFuLL,
"Reached the limit of supported Mass Storage Devices (%d); skipping this device.\n");
return 1; /*0x4da2*/
}
break;
default:
if ( n11 == 11 && n15 == 7 ) /*0x4dab*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Reached the limit of supported CCID Devices (%d); skipping this device.\n"); /*0x4dba*/
return 1; /*0x4dba*/
}
break;
}
}
return 0; /*0x4dbe*/
}
// Function: SataDriverEntry @ 0x4dc4 (0xac bytes)
__int64 __fastcall SataDriverEntry(
__int64 UsbHcPtr,
__int64 DevEntry,
unsigned __int64 ReqData,
__int16 InterfaceNum,
__int64 ExtraArg)
{
__int64 UsbRtDispatchTable; // r11
__int16 SavedInterfaceNum; // si
__int16 SubStatus; // dx
__int64 result; // rax
__int16 OrigHiWord; // [rsp+66h] [rbp+1Eh]
OrigHiWord = HIWORD(ReqData); /*0x4dce*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x4dd8*/
SavedInterfaceNum = *(_WORD *)(UsbRtDispatchTable + 30470); /*0x4de9*/
*(_WORD *)(UsbRtDispatchTable + 30470) = InterfaceNum; /*0x4df1*/
SubStatus = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int64, unsigned __int64, _WORD, __int64, _WORD))(200LL * (((*(unsigned __int8 *)(UsbHcPtr + 1) - 16) >> 4) + 4) + UsbRtDispatchTable + 192))( /*0x4e43*/
UsbHcPtr,
DevEntry,
ReqData,
HIDWORD(ReqData),
WORD1(ReqData),
ExtraArg,
HIWORD(ReqData));
result = 0; /*0x4e46*/
*(_WORD *)(UsbRtDispatchTable + 30470) = SavedInterfaceNum; /*0x4e48*/
if ( OrigHiWord ) /*0x4e54*/
{
if ( !SubStatus ) /*0x4e59*/
return 255; /*0x4e5b*/
}
return result; /*0x4e6a*/
}
// Function: FwVolDriverEntry_2 @ 0x4e74 (0x4f bytes)
char __fastcall FwVolDriverEntry_2(__int64 DevEntry, char BitField)
{
char BitShift; // r11
__int64 DevEntry_1; // r10
__int64 DescOffset; // rax
BitShift = (BitField & 0xF) - 1; /*0x4e87*/
if ( *(_QWORD *)(DevEntry + 48) ) /*0x4e7a*/
{
if ( (UsbValidateDeviceEntry(*(_QWORD *)(DevEntry + 48)) & 0x8000000000000000uLL) != 0LL ) /*0x4e9a*/
return 0; /*0x4e9e*/
}
else
{
DevEntry_1 = DevEntry; /*0x4ea0*/
}
DescOffset = 58; /*0x4ea3*/
if ( BitField < 0 ) /*0x4ead*/
DescOffset = 56; /*0x4ead*/
return (*(_WORD *)(DescOffset + DevEntry_1) >> BitShift) & 1; /*0x4ebd*/
}
// Function: FwVolDriverEntry_1 @ 0x4ec4 (0x6d bytes)
__int64 __fastcall FwVolDriverEntry_1(__int64 DevEntry, char BitField, unsigned __int8 BitValue)
{
unsigned __int8 BitShift; // r11
__int64 result; // rax
__int64 DevEntry_1; // r10
__int64 DescOffset; // r8
BitShift = (BitField & 0xF) - 1; /*0x4edc*/
if ( *(_QWORD *)(DevEntry + 48) ) /*0x4ece*/
{
result = UsbValidateDeviceEntry(*(_QWORD *)(DevEntry + 48)); /*0x4ee9*/
if ( result < 0 ) /*0x4ef1*/
return result; /*0x4ef1*/
}
else
{
DevEntry_1 = DevEntry; /*0x4ef5*/
}
DescOffset = 58; /*0x4f06*/
if ( BitField < 0 ) /*0x4f0a*/
DescOffset = 56; /*0x4f0a*/
*(_WORD *)(DescOffset + DevEntry_1) = *(_WORD *)(DescOffset + DevEntry_1) & ~(1 << (BitShift & 0xF)) /*0x4f21*/
| (BitValue << BitShift);
return BitShift; /*0x4f2b*/
}
// Function: UsbPointOutputData @ 0x4fdc (0x36 bytes)
__int64 __fastcall UsbPointOutputData(char n0x80)
{
__int64 UsbRtDispatchTable; // rdx
__int64 result; // rax
UsbRtDispatchTable = UsbRtDispatchTable; /*0x4fdc*/
**(_BYTE **)(UsbRtDispatchTable + 30320) = n0x80; /*0x4fea*/
result = UsbRtDispatchTable + 30316; /*0x4fec*/
if ( ++*(_QWORD *)(UsbRtDispatchTable + 30320) == UsbRtDispatchTable + 30316 ) /*0x5001*/
{
*(_QWORD *)(UsbRtDispatchTable + 30320) = UsbRtDispatchTable + 30304; /*0x500a*/
return UsbRtDispatchTable + 30304; /*0x5003*/
}
return result; /*0x5011*/
}
// Function: UsbKbParseHidReport @ 0x539c (0x2b9 bytes)
void __fastcall UsbKbParseHidReport(__int64 a1, unsigned __int8 *n44)
{
__int64 UsbRtDispatchTable; // rbx
char n0xE7; // al
unsigned __int8 *v4; // rdi
unsigned __int8 v5; // cl
char *v6; // r8
unsigned __int8 *v7; // rcx
__int16 n6; // dx
unsigned __int8 v9; // al
__int64 v10; // rax
char v11; // dl
__int64 v12; // r8
__int64 v13; // rbx
__int64 v14; // r9
__int16 v15; // r8
_BYTE *v16; // rax
unsigned __int8 n0x10; // si
__int16 v18; // cx
unsigned __int64 v19; // rax
unsigned __int8 v20; // bp
unsigned __int8 *v21; // rsi
__int16 v22; // di
unsigned __int8 v23; // dl
_BYTE *v24; // rax
__int16 v25; // cx
unsigned __int8 v26; // al
unsigned __int16 v27; // r8
__int64 v28; // rbp
bool v29; // zf
char v30; // cl
char *v31; // rcx
char v32; // dl
UsbRtDispatchTable = UsbRtDispatchTable; /*0x53c2*/
n0xE7 = -32; /*0x53cc*/
*(_BYTE *)(UsbRtDispatchTable + 30093) = 1 << (*(_BYTE *)(a1 + 10) - 1); /*0x53d1*/
v4 = (unsigned __int8 *)(UsbRtDispatchTable + 30130); /*0x53d7*/
v5 = *n44; /*0x53de*/
v6 = (char *)(UsbRtDispatchTable + 30130); /*0x53e0*/
do /*0x53f7*/
{
if ( (v5 & 1) != 0 ) /*0x53e8*/
*v6++ = n0xE7; /*0x53ea*/
v5 >>= 1; /*0x53f0*/
++n0xE7; /*0x53f2*/
}
while ( (unsigned __int8)n0xE7 <= 0xE7u ); /*0x53f7*/
v7 = n44 + 2; /*0x53f9*/
n6 = 6; /*0x5400*/
while ( 1 ) /*0x540b*/
{
v9 = *v7; /*0x540b*/
if ( !*v7 ) /*0x540f*/
goto LABEL_9; /*0x540f*/
if ( v9 == 1 ) /*0x5414*/
break; /*0x5414*/
*v6++ = v9; /*0x5416*/
LABEL_9:
if ( !--n6 ) /*0x5420*/
{
*v6 = 0; /*0x5469*/
v15 = (_WORD)v6 - UsbRtDispatchTable - 30129; /*0x5475*/
v16 = (_BYTE *)(UsbRtDispatchTable + 30130); /*0x5479*/
if ( !v15 ) /*0x547c*/
goto LABEL_21; /*0x547c*/
do /*0x548a*/
{
if ( *v16 ) /*0x547e*/
break; /*0x5481*/
++v16; /*0x5483*/
--v15; /*0x5486*/
}
while ( v15 ); /*0x548a*/
if ( !v15 ) /*0x5490*/
LABEL_21:
*(_BYTE *)(UsbRtDispatchTable + 30092) |= *(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5498*/
LABEL_27:
while ( 1 ) /*0x5546*/
{
v20 = *v4++; /*0x5546*/
if ( !v20 ) /*0x554f*/
break; /*0x554f*/
n0x10 = 0; /*0x54b0*/
v18 = *(_WORD *)(UsbRtDispatchTable + 30120) - UsbRtDispatchTable - 29940; /*0x54b6*/
if ( *(_WORD *)(UsbRtDispatchTable + 30120) - (_WORD)UsbRtDispatchTable != 29940 ) /*0x54ba*/
{
do /*0x54d5*/
{
if ( v20 == *(_BYTE *)(n0x10 + UsbRtDispatchTable + 29940) ) /*0x54c8*/
{
*(_BYTE *)(n0x10 + UsbRtDispatchTable + 29924) |= *(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5576*/
goto LABEL_27; /*0x557d*/
}
++n0x10; /*0x54ce*/
--v18; /*0x54d1*/
}
while ( v18 ); /*0x54d5*/
if ( n0x10 >= 0x10u ) /*0x54db*/
break; /*0x54db*/
}
UsbKbAppendScancode(32, v20, 0); /*0x54e5*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x54ea*/
*(_BYTE *)(n0x10 + UsbRtDispatchTable + 29940) = v20; /*0x54f5*/
*(_BYTE *)(n0x10 + UsbRtDispatchTable + 29924) = *(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5503*/
*(_BYTE *)(n0x10 + UsbRtDispatchTable + 29908) = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5510*/
v19 = *(unsigned __int16 *)(UsbRtDispatchTable + 30094); /*0x551e*/
++*(_QWORD *)(UsbRtDispatchTable + 30120); /*0x5525*/
*(_WORD *)(UsbRtDispatchTable + 30096) = 0; /*0x5533*/
*(_WORD *)(UsbRtDispatchTable + 30098) = (unsigned __int8)byte_1A678[(v19 >> 6) & 7]; /*0x553f*/
}
v21 = (unsigned __int8 *)(UsbRtDispatchTable + 29940); /*0x5555*/
v22 = (_WORD)v4 - UsbRtDispatchTable - 30131; /*0x5564*/
while ( (unsigned __int64)v21 < *(_QWORD *)(UsbRtDispatchTable + 30120) ) /*0x5624*/
{
v23 = *v21; /*0x557f*/
v24 = (_BYTE *)(UsbRtDispatchTable + 30130); /*0x5581*/
++v21; /*0x5588*/
v25 = v22; /*0x558b*/
if ( v22 ) /*0x5591*/
{
while ( v23 != *v24 ) /*0x5595*/
{
++v24; /*0x559b*/
if ( !--v25 ) /*0x55a2*/
goto LABEL_33; /*0x55a2*/
}
}
else
{
LABEL_33:
--v21; /*0x55a4*/
v26 = ~*(_BYTE *)(UsbRtDispatchTable + 30093); /*0x55b1*/
v27 = (_WORD)v21 - UsbRtDispatchTable - 29940; /*0x55b7*/
v28 = v27; /*0x55bb*/
v29 = (v26 & *(_BYTE *)(UsbRtDispatchTable + v27 + 29924)) == 0; /*0x55bf*/
*(_BYTE *)(UsbRtDispatchTable + v27 + 29924) &= v26; /*0x55bf*/
if ( v29 ) /*0x55c6*/
{
v30 = *(_BYTE *)(UsbRtDispatchTable + v27 + 29908); /*0x55cd*/
*(_BYTE *)(UsbRtDispatchTable + v27 + 29908) = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x55da*/
*(_BYTE *)(UsbRtDispatchTable + 30085) = v30; /*0x55e1*/
UsbKbAppendScancode(48, *v21, v27); /*0x55eb*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x55f0*/
v31 = (char *)(v28 + UsbRtDispatchTable + 29908); /*0x5604*/
v32 = *v31; /*0x5607*/
*v31 = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5609*/
*(_BYTE *)(UsbRtDispatchTable + 30085) = v32; /*0x560b*/
UsbKbLookupScancode((__int64)v31); /*0x5611*/
--*(_QWORD *)(UsbRtDispatchTable + 30120); /*0x5616*/
}
else
{
++v21; /*0x55c8*/
}
}
}
*(_BYTE *)(UsbRtDispatchTable + 30092) &= ~*(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5632*/
return; /*0x5632*/
}
++v7; /*0x5422*/
}
v10 = *(_QWORD *)(UsbRtDispatchTable + 30104); /*0x5427*/
v11 = 1; /*0x542e*/
v12 = *(_QWORD *)(UsbRtDispatchTable + 30112); /*0x5431*/
v13 = UsbRtDispatchTable + 29956; /*0x543a*/
v14 = v10 + 128; /*0x5441*/
while ( 1 ) /*0x5448*/
{
if ( ++v10 == v14 ) /*0x544e*/
v10 = v13; /*0x544e*/
if ( v10 == v12 ) /*0x5455*/
break; /*0x5455*/
if ( !--v11 ) /*0x545d*/
{
UsbKbOutputScancode(255); /*0x545f*/
return; /*0x5464*/
}
}
}
// Function: UsbKbAppendScancode @ 0x5658 (0x68a bytes)
void __fastcall UsbKbAppendScancode(char n32, unsigned __int8 a2, unsigned __int16 a3)
{
__int64 UsbRtDispatchTable; // r9
__int16 v5; // di
char n18; // dl
__int16 n2; // ax
__int16 n2_1; // cx
__int16 n148; // r8
__int16 n4; // ax
__int16 n148_1; // r10
__int16 n8; // cx
unsigned __int16 v13; // r8
__int64 v14; // rcx
char v15; // r11
unsigned __int16 v16; // cx
bool v17; // zf
_BYTE *v18; // rax
_BYTE *v19; // r10
char v20; // al
unsigned __int8 v21; // cl
unsigned __int8 v22; // cl
char v23; // dl
unsigned __int16 v24; // cx
__int16 v25; // r14
__int64 v26; // rdi
__int16 v27; // bx
__int64 v28; // rbp
unsigned __int64 n6; // rcx
_BYTE *v30; // rcx
_BYTE *v31; // rcx
_BYTE *v32; // rcx
char v33; // al
unsigned __int8 v34; // cl
char v35; // bl
char v36; // dl
unsigned __int16 v37; // cx
char v38; // bl
_BYTE *v39; // rcx
__int64 UsbRtDispatchTable_1; // rax
_BYTE *v41; // rcx
UsbRtDispatchTable = UsbRtDispatchTable... [12098 chars total]
// Function: UsbHidConfigureProtocol @ 0x5ce4 (0xb8 bytes)
char __fastcall UsbHidConfigureProtocol(__int64 a1, __int64 n2047)
{
__int64 UsbRtDispatchTable; // r8
__int64 n1047; // rcx
char n4; // al
char n2047_1; // al
unsigned __int8 n2047_2; // cl
char n2047_3; // r9
char v8; // cl
UsbRtDispatchTable = UsbRtDispatchTable; /*0x5ce8*/
n1047 = 1047; /*0x5cef*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 30086) & 1) != 0 ) /*0x5cff*/
n4 = 4; /*0x5d01*/
else
n4 = (unsigned __int8)(*(_BYTE *)(UsbRtDispatchTable + 30086) & 7) >> 1; /*0x5d05*/
*(_BYTE *)(UsbRtDispatchTable + 30086) &= 0xF8u; /*0x5d07*/
*(_BYTE *)(UsbRtDispatchTable + 30086) |= n4; /*0x5d0f*/
if ( (*(_WORD *)(UsbRtDispatchTable + 30094) & 0x400) != 0 ) /*0x5d2a*/
{
LOBYTE(n2047) = 16 * (*(_BYTE *)(UsbRtDispatchTable + 30086) & 7); /*0x5d2f*/
LABEL_6:
n2047_1 = *(_BYTE *)(UsbRtDispatchTable + 30085) & 0x70; /*0x5d32*/
if ( n2047_1 == (_BYTE)n2047 ) /*0x5d3f*/
return n2047_1; /*0x5d3f*/
LOBYTE(n1047) = n2047 | *(_BYTE *)(UsbRtDispatchTable + 30085) & 0x8F; /*0x5d44*/
goto LABEL_14; /*0x5d46*/
}
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 0x10) != 0 ) /*0x5d4d*/
{
LOBYTE(n2047) = *(_BYTE *)(UsbRtDispatchTable + 30087) & 0x70; /*0x5d56*/
goto LABEL_6; /*0x5d59*/
}
n2047_2 = (*(&loc_416 + 1) >> 1) & 0x38; /*0x5d66*/
n2047 = n2047_2; /*0x5d61*/
n2047_3 = n2047_2 ^ 0x48; /*0x5d6d*/
v8 = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5d71*/
if ( ((*(&loc_416 + 1) >> 1) & 8) == 0 ) /*0x5d78*/
n2047_3 = n2047; /*0x5d78*/
n2047_1 = v8 & 0x70; /*0x5d7e*/
if ( n2047_3 != (v8 & 0x70) ) /*0x5d83*/
{
LOBYTE(n1047) = n2047_3 | v8 & 0x8F; /*0x5d88*/
LABEL_14:
*(_BYTE *)(UsbRtDispatchTable + 30085) = n1047; /*0x5d8b*/
return FwVolDriverEntry_0(n1047, n2047); /*0x5d92*/
}
return n2047_1; /*0x5d97*/
}
// Function: FwVolDriverEntry_0 @ 0x5d9c (0x6f bytes)
__int64 __fastcall FwVolDriverEntry_0(__int64 n1047, __int64 HcType)
{
__int64 UsbRtDispatchTable; // rax
__int64 EntryOffset; // rbx
__int64 EntryCount; // rsi
unsigned __int8 PortStatusFlags; // di
char HcTypeVal; // di
__int64 DevEntry; // rcx
UsbRtDispatchTable = UsbRtDispatchTable; /*0x5dab*/
EntryOffset = 30168; /*0x5db2*/
EntryCount = 15; /*0x5db7*/
PortStatusFlags = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5dbc*/
*(_BYTE *)(UsbRtDispatchTable + 30088) |= 1u; /*0x5dc3*/
HcTypeVal = (PortStatusFlags >> 4) & 7; /*0x5dce*/
do /*0x5df2*/
{
DevEntry = *(_QWORD *)(EntryOffset + UsbRtDispatchTable); /*0x5dd2*/
if ( DevEntry ) /*0x5dd9*/
{
LOBYTE(HcType) = HcTypeVal; /*0x5ddb*/
EhciCtrlAsync(DevEntry, HcType); /*0x5dde*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x5de3*/
}
EntryOffset += 8; /*0x5dea*/
--EntryCount; /*0x5dee*/
}
while ( EntryCount ); /*0x5df2*/
*(_BYTE *)(UsbRtDispatchTable + 30088) &= ~1u; /*0x5df4*/
return UsbRtDispatchTable; /*0x5e05*/
}
// Function: UsbKbSendModifiers @ 0x5e0c (0x35 bytes)
void __fastcall UsbKbSendModifiers(_BYTE *a1)
{
if ( (*(_BYTE *)(UsbRtDispatchTable + 30146) & 0x40) != 0 ) /*0x5e1a*/
UsbKbOutputScancode(~__ROL1__(__ROL1__(byte_1C0D0[*(unsigned __int8 *)(UsbRtDispatchTable + 30090)], 4), 1)); /*0x5e3c*/
else
UsbKbOutputScancode(*(_BYTE *)(UsbRtDispatchTable + 30090)); /*0x5e22*/
}
// Function: UsbKbSendExtendedModifiers @ 0x5e44 (0x4e bytes)
void __fastcall UsbKbSendExtendedModifiers()
{
if ( (*(_BYTE *)(UsbRtDispatchTable + 30146) & 0x40) != 0 ) /*0x5e56*/
{
UsbKbOutputScancode(~__ROL1__(__ROL1__(byte_1C0D0[*(unsigned __int8 *)(UsbRtDispatchTable + 30090)], 4), 1) | 0x80); /*0x5e8d*/
}
else
{
UsbKbOutputScancode(240); /*0x5e5a*/
UsbKbOutputScancode(*(_BYTE *)(UsbRtDispatchTable + 30090)); /*0x5e6c*/
}
}
// Function: UsbKbLookupScancode @ 0x5e94 (0x8b bytes)
char __fastcall UsbKbLookupScancode(__int64 a1)
{
__int64 UsbRtDispatchTable; // r10
__int64 v3; // rcx
char v4; // r8
char v5; // r11
char v6; // bl
__int64 v7; // rdx
unsigned int v8; // r9d
__int64 v9; // r11
char v10; // al
__int64 v11; // rcx
__int64 v12; // r9
char result; // al
UsbRtDispatchTable = UsbRtDispatchTable; /*0x5e99*/
v3 = 0; /*0x5ea3*/
v4 = UsbRtDispatchTable - 28 - a1 - 1; /*0x5eaf*/
v5 = v4; /*0x5eb2*/
do /*0x5ec6*/
{
*(_BYTE *)(v3 + a1) = *(_BYTE *)((unsigned int)(v3 + 1) + a1); /*0x5ebc*/
v3 = (unsigned int)(v3 + 1); /*0x5ec0*/
--v5; /*0x5ec2*/
}
while ( v5 ); /*0x5ec6*/
v6 = v4; /*0x5ecb*/
v7 = (unsigned int)(a1 - UsbRtDispatchTable - 29908); /*0x5ece*/
v8 = v7; /*0x5ed5*/
v9 = (unsigned int)(v7 + 1); /*0x5ed8*/
do /*0x5ef8*/
{
v10 = *(_BYTE *)(v9 + UsbRtDispatchTable + 29924); /*0x5edc*/
v9 = (unsigned int)(v9 + 1); /*0x5ee4*/
v11 = v8++; /*0x5ee7*/
*(_BYTE *)(v11 + UsbRtDispatchTable + 29924) = v10; /*0x5eed*/
--v6; /*0x5ef5*/
}
while ( v6 ); /*0x5ef8*/
v12 = (unsigned int)(v7 + 1); /*0x5efa*/
do /*0x5f17*/
{
result = *(_BYTE *)(v12 + UsbRtDispatchTable + 29940); /*0x5efe*/
v12 = (unsigned int)(v12 + 1); /*0x5f06*/
*(_BYTE *)(v7 + UsbRtDispatchTable + 29940) = result; /*0x5f09*/
v7 = (unsigned int)(v7 + 1); /*0x5f11*/
--v4; /*0x5f13*/
}
while ( v4 ); /*0x5f17*/
return result; /*0x5f1e*/
}
// Function: UsbKbOutputScancode @ 0x5f20 (0x36 bytes)
void __fastcall UsbKbOutputScancode(char a1)
{
__int64 UsbRtDispatchTable; // r8
_BYTE *v2; // rdx
__int64 v3; // rax
_BYTE *v4; // rdx
UsbRtDispatchTable = UsbRtDispatchTable; /*0x5f20*/
v2 = *(_BYTE **)(UsbRtDispatchTable + 30104); /*0x5f27*/
v3 = UsbRtDispatchTable + 30084; /*0x5f2e*/
*v2 = a1; /*0x5f35*/
v4 = v2 + 1; /*0x5f37*/
if ( v4 == (_BYTE *)v3 ) /*0x5f3d*/
v4 = (_BYTE *)(UsbRtDispatchTable + 29956); /*0x5f3f*/
*(_QWORD *)(UsbRtDispatchTable + 30104) = v4; /*0x5f46*/
UsbServiceHcPolling(0, 2u); /*0x5f51*/
}
// Function: SataConfig @ 0x61d0 (0x95 bytes)
char __fastcall SataConfig(__int64 QueuePtr, __int64 a2, int MaxTransferSize)
{
char *Buffer; // rax
UINT8 Value; // r8
char *Buffer_1; // rsi
unsigned int TotalBufferSize; // edi
__int64 EndpointCount; // rax
__int64 TdIdx; // rdx
char *TdDataPtr; // r8
Buffer = (char *)UsbConfig_1(((unsigned __int64)(unsigned __int16)(32 * (MaxTransferSize + 8)) + 31) >> 5); /*0x61f8*/
Buffer_1 = Buffer; /*0x61fd*/
if ( !Buffer ) /*0x6203*/
return -1; /*0x6205*/
*(_DWORD *)(QueuePtr + 12) = MaxTransferSize; /*0x6209*/
TotalBufferSize = 32 * MaxTransferSize; /*0x620c*/
*(_QWORD *)QueuePtr = Buffer; /*0x6211*/
*(_BYTE *)(QueuePtr + 10) = 32; /*0x6214*/
if ( TotalBufferSize != -256 ) /*0x621f*/
SetMem(Buffer, TotalBufferSize + 256LL, Value); /*0x6224*/
EndpointCount = *(unsigned __int8 *)(QueuePtr + 10); /*0x6229*/
TdIdx = 0; /*0x622d*/
TdDataPtr = &Buffer_1[8 * EndpointCount]; /*0x622f*/
if ( (_BYTE)EndpointCount ) /*0x6235*/
{
do /*0x624c*/
{
*(_QWORD *)(*(_QWORD *)QueuePtr + 8 * TdIdx) = TdDataPtr; /*0x623a*/
TdIdx = (unsigned int)(TdIdx + 1); /*0x623e*/
TdDataPtr += *(unsigned int *)(QueuePtr + 12); /*0x6243*/
}
while ( (unsigned int)TdIdx < *(unsigned __int8 *)(QueuePtr + 10) ); /*0x624c*/
}
*(_WORD *)(QueuePtr + 8) = 0; /*0x624e*/
return 0; /*0x625f*/
}
// Function: DebugLogPrint_16 @ 0x6268 (0x4c bytes)
__int64 __fastcall sub_6268(_BYTE *DevEntry)
{
unsigned __int16 Idx; // dx
for ( Idx = 0; Idx < 0xFu; ++Idx ) /*0x6276*/
{
if ( *(_BYTE **)(UsbRtDispatchTable + 8LL * Idx + 30168) == DevEntry ) /*0x6285*/
return Idx; /*0x62ac*/
}
if ( !DevEntry ) /*0x6293*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "No Free KBD DevInfo Entry\n", UsbRtDispatchTable); /*0x62a0*/
return 0xFFFF; /*0x62af*/
}
// Function: DebugLogPrint_17 @ 0x62b4 (0x16a bytes)
char __fastcall DebugLogPrint_17(_BYTE *DevEntry)
{
unsigned __int8 WalkIdx; // si
unsigned __int8 WalkIdx_1; // di
unsigned __int16 DevInfoIdx; // r15
__int64 UsbRtDispatchTable; // rcx
__int64 UsbRtDispatchTable_1; // rbx
unsigned __int8 BitMask; // r14
bool v9; // zf
unsigned __int64 *TransferBufPtr; // rdi
UINT8 Value; // r8
unsigned __int64 *IntrBufPtr; // rdi
UINT8 Value_1; // r8
WalkIdx = 0; /*0x62d6*/
WalkIdx_1 = *(_BYTE *)(UsbRtDispatchTable + 30120) - UsbRtDispatchTable + 12; /*0x62e3*/
DevInfoIdx = DebugLogPrint_16(DevEntry); /*0x62ec*/
if ( DevInfoIdx == 0xFFFF ) /*0x62f9*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x62fb*/
if ( *(_BYTE *)(UsbRtDispatchTable + 104) < 0x30u ) /*0x6306*/
{
*(_WORD *)(UsbRtDispatchTable + 2LL * *(unsigned __int8 *)(UsbRtDispatchTable + 104) + 8) = 35; /*0x6311*/
++*(_BYTE *)(UsbRtDispatchTable + 104); /*0x6316*/
}
return -1; /*0x6319*/
}
else
{
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x632a*/
BitMask = 1 << (DevEntry[10] - 1); /*0x6333*/
if ( WalkIdx_1 ) /*0x6339*/
{
do /*0x6392*/
{
if ( !WalkIdx_1 ) /*0x633e*/
break; /*0x633e*/
if ( (BitMask & *(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29924)) != 0 /*0x635a*/
&& (v9 = ((unsigned __int8)~BitMask & *(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29924)) == 0,
*(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29924) &= ~BitMask,
v9) )
{
if ( ((*(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29940) + 31) & 0xFB) == 0 ) /*0x6367*/
*(_BYTE *)(UsbRtDispatchTable_1 + 30085) &= 0xFCu; /*0x6369*/
UsbKbLookupScancode(UsbRtDispatchTable_1 + WalkIdx + 29908LL); /*0x637a*/
--*(_QWORD *)(UsbRtDispatchTable_1 + 30120); /*0x637f*/
--WalkIdx_1; /*0x6386*/
}
else
{
++WalkIdx; /*0x638c*/
}
}
while ( WalkIdx < WalkIdx_1 ); /*0x6392*/
}
TransferBufPtr = (unsigned __int64 *)(DevEntry + 328); /*0x6394*/
if ( DevEntry != (_BYTE *)-328LL && *TransferBufPtr ) /*0x63a5*/
{
FwVolConfig(*TransferBufPtr, 9u); /*0x63b0*/
SetMem(DevEntry + 328, 0x10u, Value); /*0x63ba*/
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x63bf*/
}
IntrBufPtr = (unsigned __int64 *)(DevEntry + 344); /*0x63c6*/
if ( DevEntry != (_BYTE *)-344LL && *IntrBufPtr ) /*0x63d2*/
{
FwVolConfig(*IntrBufPtr, 0xAu); /*0x63df*/
SetMem(DevEntry + 344, 0x10u, Value_1); /*0x63ea*/
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x63ef*/
}
*(_QWORD *)(UsbRtDispatchTable_1 + 8LL * DevInfoIdx + 30168) = 0; /*0x63fa*/
return 0; /*0x6403*/
}
}
// Function: UsbHidProcessReport @ 0x6420 (0x401 bytes)
char __fastcall UsbHidProcessReport(__int64 a1, __int64 a2, __int64 a3, unsigned __int8 *n44, int a5)
{
unsigned __int8 *n44_1; // rbx
__int64 v6; // rsi
unsigned __int8 *v7; // r8
__int64 n6; // rbp
char v9; // r13
unsigned __int16 n0x20; // di
unsigned __int8 v11; // al
_BYTE **v12; // r14
__int64 v13; // r12
_BYTE *v14; // rdx
char v15; // r9
unsigned __int16 v16; // r11
__int16 v17; // r15
unsigned __int16 v18; // bp
unsigned __int8 v19; // r10
__int64 v20; // rcx
char v21; // r10
__int64 v22; // rax
unsigned __int8 n6_1; // dl
__int64 n0x20_1; // r10
unsigned __int8 v25; // r9
__int64 v26; // rax
__int64 v27; // rdi
__int64 *v28; // rax
__int64 UsbRtDispatchTable; // rdx
unsigned __int8 n8; // cl
int v31; // r10d
__int64 n2047; // rdx
__int64 v33; // rcx
__int64 UsbRtDispatchTable_1; // rax
_BYTE *v35; // rbx
char v37; // [rsp+20h] [rbp-48h] BYREF
__int64 v38; // [rsp+21h] [rbp-47h]
__int64 v39; // [rsp+29h] [rbp-3Fh]
__int64 v40; // [rsp+31h] [rbp-37h]
int v41; // [rsp+39h] [rbp-2Fh]
__int16 v42; // [rsp+3Dh] [rbp-2Bh]
char v43; // [rsp+3Fh] [rbp-29h]
v37 = 0; /*0x6445*/
n44_1 = n44; /*0x6449*/
v38 = 0; /*0x644c*/
v6 = a2; /*0x6450*/
v39 = 0; /*0x6453*/
v7 = 0; /*0x6457*/
v40 = 0; /*0x645a*/
n6 = 6; /*0x6462*/
v9 = 0; /*0x6465*/
n0x20 = 0; /*0x6468*/
v41 = 0; /*0x646c*/
v42 = 0; /*0x6470*/
v43 = 0; /*0x6475*/
if ( (*(_BYTE *)(a2 + 288) & 1) != 0 ) /*0x6480*/
{
v11 = *(_BYTE *)(a2 + 296); /*0x6486*/
if ( !v11 ) /*0x648e*/
return 0; /*0x648e*/
v12 = *(_BYTE ***)(a2 + 304); /*0x6494*/
v13 = v11; /*0x649f*/
do /*0x65a3*/
{
v14 = *v12; /*0x64a6*/
if ( (**v12 & 0x10) != 0 ) /*0x64ac*/
{
v15 = v14[1]; /*0x64b2*/
if ( !v15 || v15 == *n44_1 ) /*0x64be*/
{
if ( (*v14 & 1) == 0 && *((_WORD *)v14 + 1) == 7 ) /*0x64d0*/
{
v9 = 1; /*0x64d6*/
if ( v15 ) /*0x64dc*/
LODWORD(v7) = (_DWORD)v7 + 8; /*0x64de*/
v16 = 0; /*0x64e2*/
if ( *((_DWORD *)v14 + 1) ) /*0x64e6*/
{
v17 = (unsigned __int8)v14[8]; /*0x64f0*/
v18 = (unsigned __int16)v7; /*0x64fa*/
while ( 1 ) /*0x6523*/
{
v19 = ((1 << v17) - 1) & (*(_DWORD *)&n44_1[(unsigned __int64)v18 >> 3] >> (v18 & 7)); /*0x6523*/
if ( (unsigned int)v19 >= *((_DWORD *)v14 + 3) && (unsigned int)v19 <= *((_DWORD *)v14 + 4) ) /*0x6532*/
{
if ( (*v14 & 2) == 0 ) /*0x6537*/
{
v20 = (unsigned int)v19 - *((_DWORD *)v14 + 3); /*0x6547*/
goto LABEL_19; /*0x6547*/
}
if ( v19 ) /*0x653c*/
{
v20 = v16; /*0x653e*/
LABEL_19:
v21 = *(_BYTE *)(*((_QWORD *)v14 + 4) + 2 * v20); /*0x6549*/
if ( v21 && n0x20 < 0x20u ) /*0x655a*/
{
v22 = n0x20++; /*0x655c*/
*(&v37 + v22) = v21; /*0x6562*/
}
}
}
++v16; /*0x6567*/
v18 += v17; /*0x656b*/
if ( (unsigned int)v16 >= *((_DWORD *)v14 + 1) ) /*0x6576*/
{
v15 = v14[1]; /*0x6578*/
break; /*0x6578*/
}
}
}
if ( v15 ) /*0x6586*/
LODWORD(v7) = (_DWORD)v7 - 8; /*0x6588*/
}
LODWORD(v7) = *((_DWORD *)v14 + 1) * (unsigned __int8)v14[8] + (_DWORD)v7; /*0x6594*/
}
}
++v12; /*0x659c*/
--v13; /*0x65a0*/
}
while ( v13 ); /*0x65a3*/
v6 = a2; /*0x65a9*/
if ( !v9 ) /*0x65b1*/
return 0; /*0x65b1*/
MemGetInfo((__int64)n44_1, 8u); /*0x65bf*/
n6_1 = 0; /*0x65c9*/
if ( n0x20 ) /*0x65d0*/
{
v7 = (unsigned __int8 *)&v37; /*0x65d2*/
n0x20_1 = n0x20; /*0x65d7*/
do /*0x6610*/
{
v25 = *v7; /*0x65db*/
if ( (unsigned __int8)(*v7 + 32) > 7u ) /*0x65e5*/
{
if ( n6_1 < 6u ) /*0x65fd*/
{
v26 = n6_1++; /*0x65ff*/
n44_1[v26 + 2] = v25; /*0x6605*/
}
}
else
{
*n44_1 |= 1 << (v25 + 32); /*0x65f6*/
}
++v7; /*0x660a*/
--n0x20_1; /*0x660d*/
}
while ( n0x20_1 ); /*0x6610*/
v6 = a2; /*0x6612*/
}
n6 = 6; /*0x6617*/
}
v27 = 0; /*0x6623*/
if ( qword_1C3C8[0] )
{
v28 = qword_1C3C8; /*0x662f*/
while ( !((unsigned __int8 (__fastcall *)(__int64, unsigned __int8 *, unsigned __int8 *))*v28)(v6, n44_1, v7) ) /*0x663c*/
{
v28 = &qword_1C3C8[++v27]; /*0x6645*/
if ( !*v28 ) /*0x6649*/
goto LABEL_42; /*0x664c*/
}
}
else
{
LABEL_42:
UsbRtDispatchTable = UsbRtDispatchTable; /*0x664e*/
if ( *(_BYTE *)(UsbRtDispatchTable + 31458) ) /*0x6655*/
{
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) == 0 || !*(_BYTE *)(UsbRtDispatchTable + 31456) ) /*0x6668*/
return 0; /*0x666f*/
MemGetInfo((__int64)n44_1, 8u); /*0x667d*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x6682*/
}
*(_QWORD *)(UsbRtDispatchTable + 30160) = v6; /*0x6689*/
n8 = 0; /*0x6690*/
LOBYTE(v7) = 8; /*0x6693*/
do /*0x66a9*/
{
if ( n44_1[n8] ) /*0x6699*/
break; /*0x669d*/
++n8; /*0x669f*/
LOBYTE(v7) = (_BYTE)v7 - 1; /*0x66a2*/
}
while ( n8 < 8u ); /*0x66a9*/
v31 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0x66ab*/
if ( (v31 & 2) != 0 ) /*0x66b6*/
{
if ( (_BYTE)v7 ) /*0x66bb*/
*(_WORD *)(UsbRtDispatchTable + 31456) = 1; /*0x66c6*/
else
*(_BYTE *)(UsbRtDispatchTable + 31456) = 0; /*0x66bd*/
}
else if ( (_BYTE)v7 ) /*0x66d4*/
{
*(_WORD *)(UsbRtDispatchTable + 31456) = 256; /*0x66df*/
}
else
{
*(_BYTE *)(UsbRtDispatchTable + 31457) = 0; /*0x66d6*/
}
LOBYTE(n44) = 0; /*0x66e8*/
do /*0x6705*/
{
if ( n44_1[(unsigned __int8)n44] != *((_BYTE *)&qword_1C3C0 + (unsigned __int8)n44) ) /*0x66fc*/
break; /*0x66fc*/
LOBYTE(n44) = (_BYTE)n44 + 1; /*0x66fe*/
}
while ( (unsigned __int8)n44 < 8u ); /*0x6705*/
qword_1C3C0 = *(_QWORD *)n44_1; /*0x670a*/
if ( (v31 & 2) != 0 && !*(_BYTE *)(UsbRtDispatchTable + 31457) || *(_BYTE *)(UsbRtDispatchTable + 31456) )
{
if ( !(_BYTE)v7 ) /*0x67ed*/
*(_BYTE *)(UsbRtDispatchTable + 31456) = 0; /*0x67ef*/
UsbHidParseReportDescriptorItem(v6, n44_1, (__int64)v7, n44); /*0x67fc*/
}
else
{
if ( !(_BYTE)v7 ) /*0x6733*/
*(_BYTE *)(UsbRtDispatchTable + 31457) = 0; /*0x6735*/
if ( *(_BYTE *)(UsbRtDispatchTable + 30496) || (v31 & 0x108) == 0x108 )
{
if ( qword_1C3A0 )
{
(*(void (__fastcall **)(__int64, int *))(qword_1C3A0 + 8))(qword_1C3A0, &a5); /*0x6776*/
*(_BYTE *)(UsbRtDispatchTable + 30146) = a5 != 1 ? 0 : 0x40;
}
UsbKbParseHidReport(v6, n44_1); /*0x679d*/
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x67a2*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 0x10) != 0 ) /*0x67ad*/
{
v35 = n44_1 + 2; /*0x67af*/
do /*0x67e1*/
{
switch ( *v35 ) /*0x67b6*/
{
case '9': /*0x67b6*/
*(_BYTE *)(UsbRtDispatchTable_1 + 30087) ^= 0x20u; /*0x67d4*/
break;
case 'G': /*0x67b6*/
*(_BYTE *)(UsbRtDispatchTable_1 + 30087) ^= 0x40u; /*0x67cb*/
break;
case 'S': /*0x67b6*/
*(_BYTE *)(UsbRtDispatchTable_1 + 30087) ^= 0x10u; /*0x67c2*/
break;
}
++v35; /*0x67db*/
--n6; /*0x67de*/
}
while ( n6 ); /*0x67e1*/
}
UsbHidConfigureProtocol(v33, n2047); /*0x67e3*/
}
else
{
UsbPointProcessHidReport((__int64)n44_1); /*0x6755*/
}
}
}
return 0; /*0x6814*/
}
// Function: UsbGetInfo_15 @ 0x6824 (0x34 bytes)
void __fastcall UsbGetInfo_15(_BYTE *UsbHcPtr)
{
if ( (*(_DWORD *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x6830*/
{
UsbServiceHcPolling(0, 1u); /*0x6853*/
}
else
{
if ( *(_BYTE *)(UsbRtDispatchTable + 30496) || (*(_DWORD *)(UsbRtDispatchTable + 4) & 0x108) == 0x108 ) /*0x6844*/
JUMPOUT(0x600C); /*0x600c*/
UsbPointProcessAxis((__int64)UsbHcPtr, 264); /*0x6844*/
}
}
// Function: EhciCtrlAsync @ 0x6858 (0x1c3 bytes)
char __fastcall EhciCtrlAsync(__int64 DevEntry, __int64 n2047)
{
char n2047_1; // bl
unsigned __int8 v4; // bp
__int64 v5; // r14
_BYTE *v7; // rax
_BYTE *v8; // rsi
__int64 v9; // r8
char v10; // bl
unsigned __int8 i; // dl
__int64 v12; // rax
char v13; // cl
__int64 UsbRtDispatchTable; // r11
__int64 v15; // r9
__int16 v16; // bx
__int16 v17; // ax
__int16 v18; // [rsp+28h] [rbp-30h]
unsigned __int64 v19; // [rsp+60h] [rbp+8h]
n2047_1 = n2047; /*0x6884*/
v4 = 0; /*0x6893*/
v5 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * (*(unsigned __int8 *)(DevEntry + 11) - 1)); /*0x68ae*/
if ( (*(_BYTE *)(DevEntry + 288) & 9) == 1 ) /*0x68b7*/
return -1; /*0x68b7*/
v7 = (_BYTE *)UsbConfig_1(1u); /*0x68c3*/
v8 = v7; /*0x68c8*/
if ( !v7 ) /*0x68ce*/
return -1; /*0x68bb*/
v9 = 1; /*0x68d3*/
*v7 = n2047_1 & 7; /*0x68d7*/
if ( (*(_BYTE *)(DevEntry + 288) & 1) == 0 ) /*0x68e0*/
goto LABEL_13; /*0x68e0*/
if ( *(_QWORD *)(DevEntry + 304) ) /*0x68e2*/
{
for ( i = 0; i < *(_BYTE *)(DevEntry + 296); ++i ) /*0x68f5*/
{
v12 = *(_QWORD *)(*(_QWORD *)(DevEntry + 304) + 8LL * i); /*0x6908*/
if ( *(_WORD *)(v12 + 2) == 8 ) /*0x6911*/
{
v13 = *(_BYTE *)(v12 + 1); /*0x6913*/
if ( v13 ) /*0x6918*/
{
if ( **(_WORD **)(v12 + 32) == 1 ) /*0x6922*/
{
v4 = *(_BYTE *)(v12 + 1); /*0x6926*/
v8[1] = *v8; /*0x6929*/
LOWORD(v9) = v9 + 1; /*0x692c*/
*v8 = v13; /*0x6930*/
}
}
}
}
LABEL_13:
if ( *(_BYTE *)(DevEntry + 68) ) /*0x693d*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x698d*/
v15 = *(unsigned __int16 *)(DevEntry + 66); /*0x6999*/
v18 = v9; /*0x699e*/
LOBYTE(v9) = *(_BYTE *)(DevEntry + 68); /*0x69a4*/
v16 = *(_WORD *)(UsbRtDispatchTable + 30470); /*0x69af*/
*(_WORD *)(UsbRtDispatchTable + 30470) = 100; /*0x69b7*/
v17 = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64, _BYTE *, __int16))(200LL /*0x69d6*/
* (((*(unsigned __int8 *)(v5 + 1)
- 16) >> 4)
+ 4)
+ UsbRtDispatchTable
+ 216))(
v5,
DevEntry,
v9,
v15,
v8,
v18);
*(_WORD *)(UsbRtDispatchTable + 30470) = v16; /*0x69e8*/
v10 = -(v17 == 0); /*0x69f5*/
}
else
{
HIWORD(v19) = v9; /*0x694c*/
LOWORD(v19) = 2337; /*0x6952*/
WORD1(v19) = v4 | 0x200; /*0x696e*/
WORD2(v19) = *(unsigned __int8 *)(DevEntry + 19); /*0x697a*/
v10 = SataDriverEntry(v5, DevEntry, v19, 100, (__int64)v8); /*0x6989*/
}
goto LABEL_16; /*0x698b*/
}
v10 = -1; /*0x68eb*/
LABEL_16:
FwVolConfig((unsigned __int64)v8, 1u); /*0x69f7*/
return v10; /*0x6a0e*/
}
// Function: UsbRingBufferAdvance @ 0x6a1c (0x53 bytes)
__int64 __fastcall UsbRingBufferAdvance(__int64 *a1, __int64 a2)
{
__int64 result; // rax
int v4; // ecx
int v5; // edx
result = *a1; /*0x6a22*/
if ( *a1 && a2 ) /*0x6a30*/
{
if ( *((_DWORD *)a1 + 3) ) /*0x6a32*/
MemConfig(*(_QWORD *)(result + 8LL * *((unsigned __int8 *)a1 + 8)), a2, *((unsigned int *)a1 + 3)); /*0x6a43*/
v4 = *((unsigned __int8 *)a1 + 10); /*0x6a4c*/
v5 = (*((unsigned __int8 *)a1 + 8) + 1) % v4; /*0x6a53*/
result = (unsigned int)((*((unsigned __int8 *)a1 + 8) + 1) / v4); /*0x6a53*/
*((_BYTE *)a1 + 8) = v5; /*0x6a55*/
if ( (_BYTE)v5 == *((_BYTE *)a1 + 9) ) /*0x6a5b*/
{
result = (unsigned int)((*((unsigned __int8 *)a1 + 9) + 1) / v4); /*0x6a64*/
*((_BYTE *)a1 + 9) = (*((unsigned __int8 *)a1 + 9) + 1) % v4; /*0x6a66*/
}
}
return result; /*0x6a69*/
}
// Function: UsbHidParseReportDescriptorItem @ 0x6a70 (0x3fe bytes)
char __fastcall UsbHidParseReportDescriptorItem(__int64 a1, unsigned __int8 *n44, __int64 a3, unsigned __int8 *a4)
{
unsigned __int8 j_1; // si
unsigned __int8 *v6; // r14
__int64 *v7; // r13
unsigned __int64 v8; // rdx
unsigned __int64 v9; // rax
__int64 v10; // rbx
unsigned __int8 v11; // dl
char i; // cl
__int64 v13; // rax
unsigned __int8 n2; // cl
unsigned __int8 v15; // dl
__int64 j_2; // rax
bool v17; // r9
__int64 v18; // r8
unsigned int v19; // edx
char v20; // r10
__int64 v21; // rax
unsigned __int8 v23; // r15
unsigned __int8 j; // cl
unsigned __int8 v25; // di
unsigned __int8 v26; // r15
unsigned __int64 v27; // rdi
unsigned __int8 v28; // r14
__int64 v29; // rdx
__int64 v30; // rax
_BYTE *v31; // r12
unsigned __int64 v32; // rcx
unsigned __int64 v33; // rax
__int64 v34; // rdx
char v35; // [rsp+20h] [rbp-10h] BYREF
__int64 v36; // [rsp+21h] [rbp-Fh]
int v37; // [rsp+29h] [rbp-7h]
__int16 v38; // [rsp+2Dh] [rbp-3h]
char v39; // [... [9589 chars total]
// Function: UsbHidValidateReportSize @ 0x6ec4 (0x29 bytes)
char __fastcall UsbHidValidateReportSize(__int64 a1, char n8, __int64 a3, unsigned __int8 n80)
{
char result; // al
if ( n8 != 8 || !*(_BYTE *)(UsbRtDispatchTable + 31445) ) /*0x6ed3*/
return -1; /*0x6ec9*/
if ( n80 <= 1u ) /*0x6ee0*/
return 4; /*0x6ee0*/
result = -1; /*0x6ee2*/
if ( n80 == 80 ) /*0x6ee8*/
return 4; /*0x6eea*/
return result; /*0x6ecb*/
}
// Function: UhciInitController @ 0x98e8 (0x284 bytes)
char __fastcall UhciInitController(__int64 UsbHcPtr)
{
unsigned int n787200; // eax
__int16 Config; // ax
__int64 v5; // r8
__int64 v6; // r8
__int64 v7; // r8
__int64 v8; // r8
__int64 v9; // r8
__int64 v10; // r8
__int64 v11; // r8
unsigned __int16 i; // di
__int64 v13; // r8
__int64 v14; // r8
__int64 v15; // r8
__int64 v16; // rdx
unsigned __int16 j; // cx
__int64 v18; // rax
__int64 v19; // rax
int v20; // eax
int v21; // [rsp+58h] [rbp+10h] BYREF
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x9907*/
return -1; /*0x9907*/
n787200 = (unsigned int)HcPciReadConfig(UsbHcPtr, 8u) >> 8; /*0x991d*/
if ( n787200 != 787200 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UHCI HC Class Code is wrong: %x\n", n787200);
return -1; /*0x990b*/
}
*(_BYTE *)(UsbHcPtr + 32) = 2; /*0x9945*/
*(_QWORD *)(UsbHcPtr + 16) = HcPciReadConfig(UsbHcPtr, 0x20u) & 0xFFFC; /*0x995c*/
*(_WORD *)(UsbHcPtr + 48) = 1024; /*0x996a*/
Config = HcPciReadConfig(UsbHcPtr, 0xC0u); /*0x996e*/
HcPciWriteConfig16(UsbHcPtr, 0xC0u, Config & 0xFFEF); /*0x9982*/
UhciResetHc(UsbHcPtr); /*0x998a*/
LOBYTE(v6) = ElibRead32(UsbHcPtr, 0x10u, v5) & 0xFB; /*0x99a1*/
ElibWrite8(UsbHcPtr, 0x10u, v6); /*0x99a7*/
LOBYTE(v8) = ElibRead32(UsbHcPtr, 0x12u, v7) & 0xFB; /*0x99be*/
ElibWrite8(UsbHcPtr, 0x12u, v8); /*0x99c4*/
if ( (ElibRead32(UsbHcPtr, 2u, v9) & 0x20) == 0 ) /*0x99d9*/
{
LOBYTE(v11) = ElibRead32(UsbHcPtr, 0, v10) & 0xFE; /*0x99e9*/
ElibWrite8(UsbHcPtr, 0, v11); /*0x99ef*/
for ( i = 0; i < 0x1F4u; ++i ) /*0x99f4*/
{
if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) != 0 ) /*0x9a04*/
break; /*0x9a04*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x9a12*/
}
}
if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) == 0 ) /*0x9a32*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 302, (__int64)"(HcByteReadHcIo(HcStruc, 0x02)) & 0x00000020"); /*0x9a47*/
if ( (ElibRead32(UsbHcPtr, 2u, v13) & 0x20) == 0 ) /*0x9a59*/
return -1; /*0x9a59*/
LOBYTE(v14) = 4; /*0x9a66*/
ElibWrite8(UsbHcPtr, 0, v14); /*0x9a6c*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x9a7d*/
ElibWrite8(UsbHcPtr, 0, 0); /*0x9a8b*/
v16 = *(_QWORD *)(UsbHcPtr + 8); /*0x9a90*/
if ( !v16 ) /*0x9a97*/
return -1; /*0x9a97*/
for ( j = 0; j < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(v16 + 4 * v18) = 1 ) /*0x9aa0*/
v18 = j++; /*0x9aa6*/
v21 = *(_DWORD *)(UsbHcPtr + 8); /*0x9ac8*/
LOBYTE(v15) = 4; /*0x9acc*/
v19 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, __int64, __int64, int *))(*(_QWORD *)(UsbHcPtr + 104) + 40LL))( /*0x9ade*/
*(_QWORD *)(UsbHcPtr + 104),
2,
v15,
8,
1,
&v21);
if ( v19 < 0 ) /*0x9ae4*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v19); /*0x9af5*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 952, (__int64)"!EFI_ERROR (Status)"); /*0x9b0d*/
}
if ( UhciCreateRootHubQh(UsbHcPtr) ) /*0x9b15*/
return -1; /*0x9b1c*/
ElibWrite16Direct(UsbHcPtr, 0, 193); /*0x9b2d*/
ElibWrite16Direct(UsbHcPtr, 4u, 4); /*0x9b3a*/
*(_DWORD *)(UsbHcPtr + 64) |= 1u; /*0x9b3f*/
v20 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0x9b49*/
if ( (v20 & 0x80u) == 0 ) /*0x9b4e*/
*(_DWORD *)(UsbRtDispatchTable + 4) = v20 | 0x80; /*0x9b54*/
return 0; /*0x9b63*/
}
// Function: UhciStartHc @ 0x9b6c (0x175 bytes)
char __fastcall UhciStartHc(__int64 UsbHcPtr)
{
unsigned __int16 v2; // di
__int16 Config; // ax
__int64 TmpR8; // r8
__int64 TmpRdx; // rdx
__int64 TmpR8_1; // r8
__int64 TmpRdx_1; // rdx
__int64 v9; // r8
__int64 v10; // r8
__int64 v11; // r8
unsigned __int16 i; // si
__int64 v13; // r8
__int64 v14; // rcx
__int64 v15; // rax
v2 = 0; /*0x9b88*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x9b9f*/
return -1; /*0x9b8f*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x10) == 0 ) /*0x9ba5*/
{
Config = HcPciReadConfig(UsbHcPtr, 0xC0u); /*0x9bb1*/
HcPciWriteConfig16(UsbHcPtr, 0xC0u, Config & 0xFFEF); /*0x9bc5*/
}
UhciResetHc(UsbHcPtr); /*0x9bcd*/
LOBYTE(TmpR8) = 1; /*0x9bd4*/
LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0x9bd7*/
UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0x9bdd*/
LOBYTE(TmpR8_1) = 2; /*0x9be4*/
LOBYTE(TmpRdx_1) = *(_BYTE *)UsbHcPtr | 0x80; /*0x9be7*/
UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx_1, TmpR8_1); /*0x9bed*/
if ( (ElibRead32(UsbHcPtr, 2u, v9) & 0x20) == 0 ) /*0x9c01*/
{
LOBYTE(v11) = ElibRead32(UsbHcPtr, 0, v10) & 0xFE; /*0x9c11*/
ElibWrite8(UsbHcPtr, 0, v11); /*0x9c17*/
for ( i = 0; i < 0x1F4u; ++i ) /*0x9c1c*/
{
if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) != 0 ) /*0x9c2e*/
break; /*0x9c2e*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x9c3c*/
}
}
if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) == 0 ) /*0x9c5e*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 449, (__int64)"(HcByteReadHcIo(HcStruc, 0x02)) & 0x00000020"); /*0x9c73*/
LOBYTE(v13) = 4; /*0x9c78*/
ElibWrite8(UsbHcPtr, 0, v13); /*0x9c80*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x9c91*/
ElibWrite8(UsbHcPtr, 0, 0); /*0x9c9f*/
v14 = *(_QWORD *)(UsbHcPtr + 8); /*0x9ca4*/
while ( v2 < *(_WORD *)(UsbHcPtr + 48) ) /*0x9cb7*/
{
v15 = v2++; /*0x9caa*/
*(_DWORD *)(v14 + 4 * v15) = 1; /*0x9cb0*/
}
UsbConfig_0(UsbHcPtr); /*0x9cbc*/
*(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0x9cc1*/
UsbFindActiveHc(); /*0x9cc5*/
return 0; /*0x9cdb*/
}
// Function: UhciStopHc @ 0x9ce4 (0x11c bytes)
char __fastcall UhciStopHc(_BYTE *a1)
{
__int64 v2; // r8
__int64 v4; // r8
__int64 v5; // r8
char v6; // di
__int64 v7; // rdx
__int64 v8; // r8
__int64 v9; // r9
__int64 v10; // r8
unsigned __int16 v11; // ax
__int64 v12; // r8
__int64 v13; // rdx
__int64 v14; // r8
__int64 v15; // r9
__int64 v16; // r8
unsigned __int16 v17; // ax
if ( (HcCheckInit((__int64)a1) & 0x8000000000000000uLL) != 0LL /*0x9d2a*/
|| (a1[64] & 1) == 0
|| (ElibRead32((__int64)a1, 2u, v2) & 0x20) != 0
|| ElibRead32((__int64)a1, 0, v4) == -1 )
{
return -1; /*0x9d00*/
}
if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x9d3a*/
{
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x9d40*/
v6 = *a1 | 0x80; /*0x9d54*/
if ( (AssertCpuDeadLoop_1((__int64)a1, 0x10u, v5) & 3) == 2 ) /*0x9d61*/
ElibWrite16Direct((__int64)a1, 0x10u, 2); /*0x9d6c*/
LOBYTE(v8) = 1; /*0x9d71*/
LOBYTE(v7) = v6; /*0x9d74*/
DebugLogPrint_3((__int64)a1, v7, v8, v9); /*0x9d7a*/
v11 = AssertCpuDeadLoop_1((__int64)a1, 0x10u, v10); /*0x9d84*/
ElibWrite16Direct((__int64)a1, 0x10u, v11); /*0x9d92*/
if ( (AssertCpuDeadLoop_1((__int64)a1, 0x12u, v12) & 3) == 2 ) /*0x9daa*/
ElibWrite16Direct((__int64)a1, 0x12u, 2); /*0x9db5*/
LOBYTE(v14) = 2; /*0x9dba*/
LOBYTE(v13) = v6; /*0x9dbd*/
DebugLogPrint_3((__int64)a1, v13, v14, v15); /*0x9dc3*/
v17 = AssertCpuDeadLoop_1((__int64)a1, 0x12u, v16); /*0x9dcd*/
ElibWrite16Direct((__int64)a1, 0x12u, v17); /*0x9ddb*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x9de7*/
}
return 0; /*0x9dfa*/
}
// Function: UhciResetHc @ 0x9e00 (0x3e bytes)
char __fastcall UhciResetHc(__int64 UsbHcPtr)
{
__int64 v2; // r8
__int64 v4; // r8
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x9e11*/
return -1; /*0x9e13*/
LOBYTE(v4) = ElibRead32(UsbHcPtr, 4u, v2) & 0xFB; /*0x9e2b*/
ElibWrite8(UsbHcPtr, 4u, v4); /*0x9e31*/
return 0; /*0x9e38*/
}
// Function: UhciTransfer @ 0x9e40 (0x8f bytes)
char __fastcall UhciTransfer(__int64 a1)
{
__int64 n2047; // rdx
__int64 v3; // r8
__int64 v5; // r8
unsigned __int16 v6; // ax
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x9e57*/
return -1; /*0x9e57*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x9e61*/
return -1; /*0x9e61*/
if ( (AssertCpuDeadLoop_0(a1, n2047, v3) & 0xFFFFF000LL) != *(_QWORD *)(a1 + 8) ) /*0x9e77*/
return -1; /*0x9e77*/
v6 = AssertCpuDeadLoop_1(a1, 2u, v5); /*0x9e81*/
if ( (v6 & 0x20) != 0 ) /*0x9e88*/
return -1; /*0x9e59*/
if ( (v6 & 1) != 0 ) /*0x9e8c*/
{
ElibWrite16Direct(a1, 2u, v6); /*0x9e9a*/
UhciWalkTransferList((_BYTE *)a1); /*0x9ea2*/
}
if ( (*(_BYTE *)(a1 + 64) & 0x10) != 0 ) /*0x9eab*/
UhciCreateFrameList(a1, 0, 0); /*0x9ebd*/
return 0; /*0x9ec9*/
}
// Function: UhciPortStatus @ 0x9ed0 (0x106 bytes)
__int64 __fastcall UhciPortStatus(__int64 a1, unsigned __int8 a2, char a3)
{
int v3; // ebp
__int64 v6; // r8
unsigned __int16 v7; // r9
__int64 result; // rax
unsigned int v9; // r14d
int n64; // ebx
int v11; // edi
int n64_1; // edx
unsigned int n64_2; // ecx
v3 = a2; /*0x9eed*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x9f06*/
return 255; /*0x9f08*/
v9 = v7; /*0x9f12*/
n64 = 64; /*0x9f1c*/
v11 = (unsigned __int16)AssertCpuDeadLoop_1(a1, v7, v6); /*0x9f26*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UHCI port[%d] status: %04x\n", v3, v11);
if ( (v11 & 1) != 0 )
{
n64 = (v11 & 0x100) != 0 ? 67 : 69;
if ( (v11 & 4) != 0 ) /*0x9f5f*/
n64 |= 0x20u; /*0x9f61*/
}
if ( (v11 & 2) != 0 ) /*0x9f6d*/
{
n64 |= 0x10u; /*0x9f6f*/
if ( a3 == 1 ) /*0x9f76*/
ElibWrite16Direct(a1, v9, 2); /*0x9f7e*/
}
n64_1 = n64 | 0x400; /*0x9f93*/
if ( (v11 & 0x200) == 0 ) /*0x9f9d*/
n64_1 = n64; /*0x9f9d*/
n64_2 = n64_1 | 0x100; /*0x9fa2*/
if ( (v11 & 0x1000) == 0 ) /*0x9fa8*/
n64_2 = n64_1; /*0x9fa8*/
result = n64_2 | 0x1000; /*0x9fad*/
if ( (v11 & 8) == 0 ) /*0x9fb4*/
return n64_2; /*0x9fb4*/
return result; /*0x9fcb*/
}
// Function: UhciPortReset @ 0x9fd8 (0x56 bytes)
char __fastcall UhciPortReset(__int64 a1)
{
__int64 v2; // r8
unsigned __int8 v3; // r9
unsigned int v5; // ebx
__int16 v6; // ax
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x9ff0*/
return -1; /*0x9ff2*/
v5 = 2 * v3 + 14; /*0x9ffd*/
v6 = AssertCpuDeadLoop_1(a1, v5, v2); /*0xa006*/
ElibWrite16Direct(a1, v5, v6 & 0xFFFB); /*0xa01c*/
return 0; /*0xa028*/
}
// Function: UhciPortDisconnect @ 0xa030 (0xe5 bytes)
char __fastcall UhciPortDisconnect(__int64 a1)
{
__int64 v2; // r8
unsigned __int8 v3; // r9
unsigned int v5; // ebx
__int16 v6; // ax
__int64 v7; // r8
__int16 v8; // ax
__int64 v9; // r8
unsigned __int16 v10; // ax
__int64 v11; // r8
__int16 v12; // ax
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xa04d*/
return -1; /*0xa04f*/
v5 = 2 * v3 + 14; /*0xa05d*/
v6 = AssertCpuDeadLoop_1(a1, v5, v2); /*0xa066*/
ElibWrite16Direct(a1, v5, v6 & 0xFDF5 | 0x200u); /*0xa082*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0xa093*/
v8 = AssertCpuDeadLoop_1(a1, v5, v7); /*0xa09e*/
ElibWrite16Direct(a1, v5, v8 & 0xFDF5); /*0xa0b5*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0xa0c6*/
v10 = AssertCpuDeadLoop_1(a1, v5, v9); /*0xa0d1*/
ElibWrite16Direct(a1, v5, v10); /*0xa0df*/
v12 = AssertCpuDeadLoop_1(a1, v5, v11); /*0xa0e9*/
ElibWrite16Direct(a1, v5, v12 & 0xFFF1 | 4u); /*0xa0fe*/
return 0; /*0xa10f*/
}
// Function: UhciBulkTransfer @ 0xa118 (0xfd bytes)
char __fastcall UhciBulkTransfer(__int64 a1)
{
__int64 v2; // r8
unsigned int n0x400; // edi
__int64 v5; // r8
__int16 v6; // ax
__int64 v7; // r8
__int64 v8; // r8
unsigned __int16 v9; // ax
__int64 v10; // r8
unsigned __int16 v11; // ax
n0x400 = 0; /*0xa12f*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0xa154*/
|| (*(_BYTE *)(a1 + 64) & 1) == 0
|| (ElibRead32(a1, 2u, v2) & 0x20) != 0 )
{
return -1; /*0xa136*/
}
v6 = AssertCpuDeadLoop_1(a1, 0, v5); /*0xa15b*/
ElibWrite16Direct(a1, 0, v6 & 0xFFFE); /*0xa16f*/
do /*0xa19c*/
{
if ( (AssertCpuDeadLoop_1(a1, 2u, v7) & 0x20) != 0 ) /*0xa180*/
break; /*0xa180*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0xa18e*/
++n0x400; /*0xa194*/
}
while ( n0x400 < 0x400 ); /*0xa19c*/
ElibWrite16Direct(a1, 4u, 2); /*0xa1a9*/
v9 = AssertCpuDeadLoop_1(a1, 2u, v8); /*0xa1b3*/
ElibWrite16Direct(a1, 2u, v9 | 0x1Fu); /*0xa1c5*/
v11 = AssertCpuDeadLoop_1(a1, 0, v10); /*0xa1cf*/
ElibWrite16Direct(a1, 0, v11 | 8u); /*0xa1e1*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(50000); /*0xa1f2*/
*(_DWORD *)(a1 + 64) = *(_DWORD *)(a1 + 64) & 0xFFFFFFFC | 2; /*0xa200*/
return 0; /*0xa20f*/
}
// Function: UhciInterruptTransfer @ 0xa218 (0x72 bytes)
char __fastcall UhciInterruptTransfer(__int64 UsbHcPtr, char a2)
{
__int16 Config; // ax
__int16 n6; // ax
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xa23a*/
return -1; /*0xa232*/
if ( *(_QWORD *)(UsbHcPtr + 120) ) /*0xa23c*/
{
Config = HcPciReadConfig(UsbHcPtr, 0xC0u); /*0xa24b*/
if ( a2 == 1 ) /*0xa259*/
n6 = Config & 0xDFEF | 0x10; /*0xa263*/
else
n6 = Config & 0xFFEF; /*0xa26e*/
HcPciWriteConfig16(UsbHcPtr, 0xC0u, n6); /*0xa278*/
}
return 0; /*0xa284*/
}
// Function: DebugLogPrint_11 @ 0xa28c (0xad bytes)
__int64 __fastcall sub_A28C(__int64 a1, __int64 a2)
{
int v4; // ebp
int v5; // esi
v4 = 100 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0xa2b5*/
*(_BYTE *)(a2 + 36) = 1; /*0xa2b9*/
v5 = v4; /*0xa2bd*/
UsbConfig_8(a1, a2); /*0xa2bf*/
while ( 1 ) /*0xa2c6*/
{
if ( v4 ) /*0xa2c6*/
{
if ( !v5-- ) /*0xa2c8*/
break; /*0xa2ce*/
}
UhciWalkQueueHead(a1, a2); /*0xa2d6*/
if ( !*(_BYTE *)(a2 + 36) ) /*0xa2db*/
break; /*0xa2db*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xa2ed*/
}
UsbConfig_12(a1, a2); /*0xa2fb*/
UhciWalkQueueHead(a1, a2); /*0xa306*/
if ( *(_BYTE *)(a2 + 36) ) /*0xa30b*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UHCI Time-Out\n"); /*0xa31c*/
return *(unsigned int *)(a2 + 17); /*0xa333*/
}
// Function: SysKbcDriverEntry @ 0xa33c (0x3de bytes)
__int64 __fastcall SysKbcDriverEntry(
__int64 a1,
__int64 a2,
__int16 a3,
__int16 a4,
__int16 a5,
__int64 a6,
unsigned __int16 a7)
{
unsigned __int64 v8; // r15
unsigned __int16 v9; // r12
__int64 v12; // r14
__int64 result; // rax
__int64 v14; // r8
__int64 UsbRtDispatchTable; // rax
__int64 v16; // rax
unsigned __int64 v17; // rdi
int v18; // ebx
__int64 v19; // r15
int v20; // r11d
__int64 v21; // r8
char v22; // r9
__int16 v23; // si
unsigned __int16 v24; // r10
int v25; // ecx
int v26; // ecx
int v27; // eax
unsigned __int16 v28; // cx
unsigned int v29; // edx
int v30; // ecx
_DWORD *v31; // rcx
int v32; // eax
unsigned __int64 v33; // rsi
unsigned int v34; // ebx
unsigned __int16 v35; // bp
__int64 v36; // rbx
__int64 UsbRtDispatchTable_1; // rcx
_DWORD *v38; // [rsp+38h] [rbp-60h]
__int64 v39; // [rsp+40h] [rbp-58h] BYREF
__int64 v40; // [rsp+48h] [rbp-50h] BYREF
unsigned __int64 v41; // [rsp+50h] [rbp-48h]
__int64 v42; // [rsp+58h] [rbp-40h]
char v44; // [rsp+B0h] [rbp+18h]
v44 = a3; /*0xa343*/
v8 = 0; /*0xa362*/
v39 = 0; /*0xa365*/
v9 = 0; /*0xa369*/
v40 = 0; /*0xa36d*/
v12 = a1; /*0xa378*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xa383*/
return 0; /*0xa383*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0xa399*/
return 0; /*0xa399*/
if ( (*(_BYTE *)(v12 + 64) & 1) == 0 ) /*0xa3a4*/
return 0; /*0xa3a4*/
if ( (ElibRead32(v12, 2u, v14) & 0x20) != 0 ) /*0xa3b3*/
return 0; /*0xa3b3*/
if ( (*(_BYTE *)a2 & 3) == 0 ) /*0xa3b9*/
return 0; /*0xa3b9*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xa3bb*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0xa3c4*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xa3cb*/
v16 = UsbConfig_1(1u); /*0xa3d2*/
v41 = v16; /*0xa3d7*/
v17 = v16; /*0xa3dc*/
if ( !v16 ) /*0xa3e2*/
return 0; /*0xa389*/
*(_WORD *)(v16 + 24) = a3; /*0xa3f3*/
*(_WORD *)(v16 + 26) = a5; /*0xa402*/
*(_WORD *)(v16 + 28) = a4; /*0xa406*/
*(_WORD *)(v16 + 30) = a7; /*0xa40a*/
v18 = *(unsigned __int8 *)(a2 + 10) << 8; /*0xa422*/
*(_DWORD *)(v16 + 4) = ((*(_BYTE *)(a2 + 14) & 1) << 26) | 0x18800000; /*0xa425*/
*(_DWORD *)(v16 + 16) = 0; /*0xa42f*/
*(_DWORD *)(v16 + 8) = v18 | 0xE0002D; /*0xa433*/
*(_DWORD *)(v16 + 12) = v16 + 24; /*0xa439*/
*(_BYTE *)(v16 + 21) = 1; /*0xa43c*/
v38 = (_DWORD *)v16; /*0xa440*/
if ( a7 ) /*0xa449*/
{
v9 = a7 / *(_WORD *)(a2 + 16); /*0xa45b*/
if ( a7 % (unsigned int)*(unsigned __int16 *)(a2 + 16) ) /*0xa459*/
++v9; /*0xa462*/
v42 = UsbConfig_1((32 * (unsigned __int64)v9 + 31) >> 5); /*0xa47b*/
v19 = v42; /*0xa480*/
if ( !v42 ) /*0xa486*/
{
FwVolConfig(v17, 1u); /*0xa48e*/
return 0; /*0xa495*/
}
ElibReadNvStore(v12, a3 & 0x80, a6, a7, &v39, (__int64)&v40); /*0xa4cd*/
v20 = v39; /*0xa4d2*/
v21 = v19 + 12; /*0xa4d7*/
v22 = 1; /*0xa4db*/
v23 = a3 & 0x80; /*0xa4e0*/
v24 = a7; /*0xa4eb*/
do /*0xa582*/
{
v25 = *(_BYTE *)(a2 + 14) & 1; /*0xa4f7*/
*(_DWORD *)v21 = v20; /*0xa4fa*/
v26 = (v25 << 26) | 0x18800000; /*0xa500*/
v27 = v26 | 0x20000000; /*0xa508*/
if ( !v23 ) /*0xa50f*/
v27 = v26; /*0xa50f*/
v28 = v24; /*0xa512*/
*(_DWORD *)(v21 - 8) = v27; /*0xa516*/
if ( v24 > *(_WORD *)(a2 + 16) ) /*0xa51f*/
v28 = *(_WORD *)(a2 + 16); /*0xa51f*/
v24 -= v28; /*0xa524*/
v20 += v28; /*0xa52f*/
v29 = v18 | ((unsigned __int16)(v28 - 1) << 21) | 0xE1; /*0xa53a*/
if ( v23 ) /*0xa543*/
v29 = v18 & 0xFFFFFF00 | ((unsigned __int16)(v28 - 1) << 21) | 0x69; /*0xa54b*/
*(_DWORD *)(v21 + 4) = 0; /*0xa551*/
*(_BYTE *)(v21 + 9) = 1; /*0xa557*/
v30 = v29 | 0x80000; /*0xa55b*/
if ( (v22 & 1) == 0 ) /*0xa562*/
v30 = v29; /*0xa562*/
v22 ^= 1u; /*0xa565*/
*(_DWORD *)(v21 - 4) = v30; /*0xa568*/
v31 = (_DWORD *)(v21 - 12); /*0xa56c*/
v32 = v21 - 12; /*0xa570*/
v21 += 32; /*0xa572*/
*(_DWORD *)v17 = v32 | 4; /*0xa579*/
v17 = (unsigned __int64)v31; /*0xa57b*/
}
while ( v24 ); /*0xa582*/
v17 = v41; /*0xa588*/
v12 = a1; /*0xa593*/
v8 = v42; /*0xa59b*/
v38 = v31; /*0xa5a0*/
}
v33 = UsbConfig_1(1u); /*0xa5ad*/
result = 0; /*0xa5b0*/
if ( v33 ) /*0xa5b5*/
{
v34 = v18 | 0xE1; /*0xa5c5*/
*v38 = v33 | 4; /*0xa5cb*/
*(_DWORD *)v33 = 1; /*0xa5d2*/
*(_DWORD *)(v33 + 4) = ((*(_BYTE *)(a2 + 14) & 1) << 26) | 0x18800000; /*0xa5ea*/
if ( v44 >= 0 ) /*0xa5ed*/
v34 = v34 & 0xFFFFFF00 | 0x69; /*0xa5f5*/
v35 = 0; /*0xa5f8*/
*(_BYTE *)(v33 + 21) = 1; /*0xa5fa*/
*(_DWORD *)(v33 + 16) = 0; /*0xa600*/
*(_DWORD *)(v33 + 12) = v33 + 24; /*0xa609*/
*(_DWORD *)(v33 + 8) = v34 | 0xFFE80000; /*0xa60c*/
v36 = UsbConfig_1(2u); /*0xa617*/
if ( v36 ) /*0xa61d*/
{
*(_BYTE *)(v36 + 16) = 0; /*0xa626*/
*(_DWORD *)v36 = 1; /*0xa62d*/
*(_DWORD *)(v36 + 22) = 1; /*0xa632*/
*(_DWORD *)(v36 + 17) = 0; /*0xa635*/
*(_BYTE *)(v36 + 21) = 0; /*0xa638*/
*(_WORD *)(v36 + 34) = 0; /*0xa63c*/
*(_BYTE *)(v36 + 36) = 0; /*0xa640*/
*(_QWORD *)(v36 + 37) = 0; /*0xa644*/
*(_DWORD *)(v36 + 4) = v17; /*0xa648*/
*(_QWORD *)(v36 + 8) = v17; /*0xa64b*/
*(_QWORD *)(v36 + 26) = v17; /*0xa64f*/
v35 = DebugLogPrint_11(v12, v36) - ((*(_WORD *)(v17 + 4) + 1) & 0x7FF); /*0xa669*/
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xa673*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = (*(_DWORD *)(*(_QWORD *)(v36 + 8) + 4LL) >> 17) & 0x7F; /*0xa680*/
if ( (*(_DWORD *)(*(_QWORD *)(v36 + 8) + 4LL) & 0x400000) != 0 ) /*0xa691*/
{
*(_BYTE *)(UsbRtDispatchTable_1 + 30472) |= 4u; /*0xa693*/
v35 = 0; /*0xa69c*/
}
if ( a7 ) /*0xa6a3*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(v12 + 104) + 80LL))(*(_QWORD *)(v12 + 104), v40); /*0xa6b1*/
FwVolConfig(v17, 1u); /*0xa6c0*/
if ( v8 ) /*0xa6ca*/
FwVolConfig(v8, (32 * (unsigned __int64)v9 + 31) >> 5); /*0xa6e2*/
FwVolConfig(v33, 1u); /*0xa6ed*/
FwVolConfig(v36, 2u); /*0xa6fa*/
}
return v35; /*0xa6ff*/
}
return result; /*0xa70a*/
}
// Function: XhciBuildTrbSgList @ 0xa71c (0xf2 bytes)
_DWORD *__fastcall XhciBuildTrbSgList(
_DWORD *a1,
unsigned __int16 a2,
int a3,
int *a4,
char *a5,
unsigned int *a6,
unsigned __int16 a7)
{
int v7; // r10d
char v9; // r12
unsigned __int16 v10; // si
char v11; // r11
int v12; // ebx
unsigned int v13; // edi
unsigned int v14; // r8d
unsigned int v15; // r9d
int v16; // edx
bool v17; // zf
v7 = *a4; /*0xa73d*/
v9 = 0; /*0xa746*/
v10 = 0; /*0xa749*/
v11 = *a5; /*0xa74d*/
if ( a7 ) /*0xa75b*/
{
v12 = a3 | 0x18800000; /*0xa766*/
v13 = a2; /*0xa76c*/
do /*0xa7e3*/
{
v14 = *a6; /*0xa76f*/
v15 = *a6; /*0xa772*/
if ( *a6 <= v13 ) /*0xa778*/
v9 = 1; /*0xa77f*/
else
v15 = v13; /*0xa77a*/
v16 = a1[2] & 0x17FFFF | ((v15 - 1) << 21); /*0xa798*/
a1[2] = v16; /*0xa79c*/
if ( v11 == 1 ) /*0xa7a2*/
a1[2] = v16 | 0x80000; /*0xa7a8*/
v17 = *((_BYTE *)a1 + 8) == 105; /*0xa7ab*/
a1[1] = v12; /*0xa7af*/
if ( v17 ) /*0xa7b2*/
a1[1] = v12 | 0x20000000; /*0xa7ba*/
a1[3] = v7; /*0xa7c2*/
v7 += v13; /*0xa7c9*/
*a6 = v14 - v15; /*0xa7cc*/
a1 += 8; /*0xa7cf*/
v11 ^= 1u; /*0xa7d3*/
if ( v9 ) /*0xa7d9*/
break; /*0xa7d9*/
++v10; /*0xa7db*/
}
while ( v10 < a7 ); /*0xa7e3*/
}
*(a1 - 8) = 1; /*0xa7f4*/
*a5 = v11; /*0xa7fb*/
*a4 = v7; /*0xa804*/
return a1 - 8; /*0xa807*/
}
// Function: SysKbcDataHandler @ 0xa810 (0x362 bytes)
__int64 __fastcall SysKbcDataHandler(__int64 a1, __int64 a2, signed __int8 a3, __int64 a4, unsigned int a5)
{
__int64 v9; // r8
__int64 UsbRtDispatchTable; // rax
unsigned __int16 v11; // r14
unsigned __int8 v12; // si
int v13; // eax
int v14; // esi
int v15; // eax
__int64 v16; // rax
unsigned __int64 v17; // rbx
unsigned int v18; // r14d
unsigned __int16 v19; // r15
unsigned __int64 n0x80; // r14
unsigned int *v21; // r12
unsigned int *v22; // rdx
__int64 v23; // r8
unsigned int *v24; // rcx
unsigned int *v25; // r15
int v26; // eax
unsigned __int16 v27; // si
int v28; // eax
__int64 v29; // rcx
int v30; // edx
unsigned __int8 v31; // r8
unsigned int *v32; // rax
unsigned int v33; // ecx
__int64 UsbRtDispatchTable_1; // rcx
char v35; // [rsp+40h] [rbp-40h] BYREF
char v36; // [rsp+41h] [rbp-3Fh]
int v37; // [rsp+44h] [rbp-3Ch]
unsigned int v38; // [rsp+48h] [rbp-38h] BYREF
unsigned int v39; // [rsp+4Ch] [rbp-34h]
unsigned int v40; // [rsp+50h] [rbp-30h]
int v41; // [rsp+54h] [rbp-2Ch] BYREF
__int64 v42; // [rsp+58h] [rbp-28h] BYREF
unsigned int *v43; // [rsp+60h] [rbp-20h]
__int64 v44; // [rsp+68h] [rbp-18h] BYREF
unsigned int *v45; // [rsp+70h] [rbp-10h]
v42 = 0; /*0xa83a*/
v44 = 0; /*0xa841*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0xa887*/
|| (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(a1 + 64) & 1) == 0
|| (ElibRead32(a1, 2u, v9) & 0x20) != 0
|| (*(_BYTE *)a2 & 3) == 0
|| !a5 )
{
return 0; /*0xa887*/
}
UsbRtDispatchTable = UsbRtDispatchTable; /*0xa889*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= 0xFCu; /*0xa890*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xa897*/
v11 = a3 >= 0 ? *(_WORD *)(a2 + 106) : *(_WORD *)(a2 + 104);
LOWORD(v37) = v11; /*0xa8af*/
if ( !v11 ) /*0xa8b8*/
return 0; /*0xa8b8*/
if ( a3 >= 0 ) /*0xa8c0*/
v12 = *(_BYTE *)(a2 + 70); /*0xa8c8*/
else
v12 = *(_BYTE *)(a2 + 69); /*0xa8c2*/
v36 = a3 | v12; /*0xa8d7*/
v35 = FwVolDriverEntry_2(a2, a3 | v12); /*0xa8eb*/
v13 = (*(unsigned __int8 *)(a2 + 10) | (v12 << 7)) << 8; /*0xa8f7*/
v14 = v13 | 0xE1; /*0xa8f9*/
v15 = v13 | 0x69; /*0xa8ff*/
if ( a3 < 0 ) /*0xa904*/
v14 = v15; /*0xa904*/
v16 = UsbConfig_1(2u); /*0xa907*/
v17 = v16; /*0xa90c*/
if ( !v16 ) /*0xa912*/
return 0; /*0xa852*/
*(_DWORD *)(v16 + 22) = 0; /*0xa918*/
v18 = 0x380u / v11; /*0xa92c*/
v40 = v18; /*0xa929*/
if ( !(_WORD)v18 ) /*0xa932*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 1631, (__int64)"NumBulkTDs != 0"); /*0xa947*/
v19 = 2 * v18; /*0xa950*/
n0x80 = (32 * (unsigned __int64)(unsigned __int16)(2 * v18) + 31) >> 5; /*0xa960*/
v21 = (unsigned int *)UsbConfig_1(n0x80); /*0xa96d*/
if ( !v21 ) /*0xa975*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 1636, (__int64)"BulkDataTd0 != ((void *) 0)"); /*0xa98a*/
v22 = v21; /*0xa991*/
if ( v19 ) /*0xa998*/
{
v23 = v19; /*0xa99a*/
do /*0xa9b3*/
{
v24 = v22; /*0xa99e*/
v22[2] = v14; /*0xa9a1*/
v22 += 8; /*0xa9a4*/
*v24 = (unsigned int)v22 | 4; /*0xa9ad*/
--v23; /*0xa9af*/
}
while ( v23 ); /*0xa9b3*/
}
ElibReadNvStore(a1, a3, a4, a5, &v42, (__int64)&v44); /*0xa9d7*/
v25 = v21; /*0xa9e8*/
v45 = &v21[8 * (unsigned __int16)v40]; /*0xa9fe*/
v43 = v45; /*0xaa06*/
v39 = 0; /*0xaa0c*/
v41 = v42; /*0xaa12*/
v26 = *(_BYTE *)(a2 + 14) & 1; /*0xaa19*/
v38 = a5; /*0xaa1c*/
v27 = v37; /*0xaa1f*/
LODWORD(v42) = v26 << 26; /*0xaa34*/
XhciBuildTrbSgList(v21, v37, v26 << 26, &v41, &v35, &v38, v40); /*0xaa37*/
do /*0xaae3*/
{
*(_WORD *)(v17 + 34) = 0; /*0xaa3e*/
*(_DWORD *)v17 = 1; /*0xaa43*/
*(_BYTE *)(v17 + 16) = 0; /*0xaa49*/
*(_DWORD *)(v17 + 17) = 0; /*0xaa4c*/
*(_BYTE *)(v17 + 21) = 0; /*0xaa4f*/
*(_BYTE *)(v17 + 36) = 0; /*0xaa52*/
*(_QWORD *)(v17 + 37) = 0; /*0xaa55*/
*(_DWORD *)(v17 + 4) = (_DWORD)v25; /*0xaa59*/
*(_QWORD *)(v17 + 8) = v25; /*0xaa5d*/
*(_QWORD *)(v17 + 26) = v25; /*0xaa61*/
if ( v38 ) /*0xaa68*/
XhciBuildTrbSgList(v43, v27, v42, &v41, &v35, &v38, v40); /*0xaa93*/
v28 = DebugLogPrint_11(a1, v17); /*0xaa9e*/
v29 = *(_QWORD *)(v17 + 8); /*0xaaa3*/
v30 = v28; /*0xaaa7*/
v31 = *(_BYTE *)(v17 + 16); /*0xaaa9*/
v35 = v31; /*0xaaad*/
v37 = (*(_DWORD *)(v29 + 4) >> 17) & 0x7F; /*0xaaba*/
if ( v37 ) /*0xaabd*/
break; /*0xaabd*/
v32 = v21; /*0xaac2*/
v33 = v30 + v39; /*0xaac5*/
v43 = v25; /*0xaac7*/
v39 += v30; /*0xaace*/
if ( v25 == v21 ) /*0xaad1*/
v32 = v45; /*0xaad1*/
v25 = v32; /*0xaad6*/
if ( v33 >= a5 ) /*0xaadc*/
break; /*0xaadc*/
}
while ( !*(_BYTE *)(v17 + 21) ); /*0xaae3*/
FwVolDriverEntry_1(a2, v36, v31); /*0xaaef*/
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xaaf7*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = v37; /*0xaafe*/
if ( (*(_DWORD *)(*(_QWORD *)(v17 + 8) + 4LL) & 0x400000) != 0 ) /*0xab0f*/
*(_BYTE *)(UsbRtDispatchTable_1 + 30472) |= 1u; /*0xab11*/
if ( (*(_DWORD *)(*(_QWORD *)(v17 + 8) + 4LL) & 0x800000) != 0 ) /*0xab23*/
*(_BYTE *)(UsbRtDispatchTable_1 + 30472) |= 2u; /*0xab25*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(a1 + 104) + 80LL))(*(_QWORD *)(a1 + 104), v44); /*0xab37*/
FwVolConfig((unsigned __int64)v21, n0x80); /*0xab42*/
FwVolConfig(v17, 2u); /*0xab4f*/
return v39; /*0xab5f*/
}
// Function: SysKbcDecodeKey @ 0xab74 (0x20a bytes)
__int64 __fastcall SysKbcDecodeKey(__int64 a1, _BYTE *a2, char a3, __int64 a4, __int64 a5, unsigned __int16 a6)
{
__int64 v10; // r8
_DWORD *v11; // rax
unsigned __int64 v12; // r15
char v13; // bp
int v14; // esi
unsigned __int16 v15; // bx
int v16; // eax
__int64 v17; // rax
unsigned __int64 v18; // rdi
__int64 v19; // [rsp+30h] [rbp-38h] BYREF
__int64 v20; // [rsp+38h] [rbp-30h] BYREF
v19 = 0; /*0xab95*/
v20 = 0; /*0xab9c*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xabab*/
return 0; /*0xabab*/
if ( (UsbValidateDeviceEntry((__int64)a2) & 0x8000000000000000uLL) != 0LL ) /*0xabc0*/
return 0; /*0xabc0*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xabcb*/
return 0; /*0xabcb*/
if ( (ElibRead32(a1, 2u, v10) & 0x20) != 0 ) /*0xabda*/
return 0; /*0xabda*/
if ( (*a2 & 3) == 0 ) /*0xabe1*/
return 0; /*0xabe1*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xabf2*/
if ( !a6 ) /*0xabfb*/
return 0; /*0xabfb*/
v11 = (_DWORD *)UsbConfig_1(1u); /*0xabff*/
v12 = (unsigned __int64)v11; /*0xac04*/
if ( !v11 ) /*0xac0a*/
return 0; /*0xabad*/
*v11 = 1; /*0xac0f*/
v13 = FwVolDriverEntry_2((__int64)a2, a3); /*0xac1e*/
v14 = ((unsigned __int8)a2[10] | ((a3 & 0xF) << 7)) << 8; /*0xac5f*/
*(_DWORD *)(v12 + 4) = ((a2[14] & 1) << 26) | 0x18800000; /*0xac6b*/
ElibReadNvStore(a1, a3 & 0x80, a5, a6, &v19, (__int64)&v20); /*0xac72*/
*(_DWORD *)(v12 + 12) = v19; /*0xac7d*/
v15 = 0; /*0xac8c*/
*(_DWORD *)(v12 + 16) = 0; /*0xac94*/
*(_BYTE *)(v12 + 21) = 1; /*0xaca3*/
v16 = v14 | ((a6 - 1) << 21) | (a3 < 0 ? 105 : 225) | 0x80000;
if ( (v13 & 1) == 0 )
v16 = v14 | ((a6 - 1) << 21) | (a3 < 0 ? 105 : 225);
*(_DWORD *)(v12 + 8) = v16; /*0xacb6*/
v17 = UsbConfig_1(2u); /*0xacba*/
v18 = v17; /*0xacbf*/
if ( v17 ) /*0xacc5*/
{
*(_DWORD *)v17 = 1; /*0xaccb*/
*(_BYTE *)(v17 + 16) = 0; /*0xaccd*/
*(_DWORD *)(v17 + 17) = 0; /*0xacd0*/
*(_BYTE *)(v17 + 21) = 0; /*0xacd3*/
*(_WORD *)(v17 + 34) = 0; /*0xacd6*/
*(_BYTE *)(v17 + 36) = 0; /*0xacda*/
*(_QWORD *)(v17 + 37) = 0; /*0xacdd*/
*(_DWORD *)(v17 + 4) = v12; /*0xace1*/
*(_QWORD *)(v17 + 8) = v12; /*0xace5*/
*(_DWORD *)(v17 + 22) = 2; /*0xace9*/
*(_QWORD *)(v17 + 26) = v12; /*0xacec*/
*(_BYTE *)(v17 + 34) = UsbGetInfo_9(a2[320]); /*0xacff*/
v15 = DebugLogPrint_11(a1, v18); /*0xad11*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = (*(_DWORD *)(*(_QWORD *)(v18 + 8) + 4LL) >> 17) & 0x7F; /*0xad26*/
FwVolDriverEntry_1((__int64)a2, a3, *(_BYTE *)(v18 + 16)); /*0xad34*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(a1 + 104) + 80LL))(*(_QWORD *)(a1 + 104), v20); /*0xad45*/
FwVolConfig(v12, 1u); /*0xad4e*/
FwVolConfig(v18, 2u); /*0xad58*/
}
return v15; /*0xad71*/
}
// Function: SysKbcBuildKeyCode @ 0xad80 (0x11a bytes)
char __fastcall SysKbcBuildKeyCode(__int64 a1, __int64 a2)
{
__int64 v5; // r8
unsigned __int64 v6; // rsi
__int64 v7; // rax
unsigned __int64 v8; // rcx
unsigned __int16 v9; // r8
int *v10; // rax
int v11; // eax
unsigned __int64 v12; // rcx
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xada4*/
return -1; /*0xada4*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0xadb8*/
return -1; /*0xadb8*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xadbe*/
return -1; /*0xadbe*/
if ( (ElibRead32(a1, 2u, v5) & 0x20) != 0 ) /*0xadcf*/
return -1; /*0xadcf*/
v6 = *(_QWORD *)(a2 + 24); /*0xadd1*/
if ( !v6 ) /*0xadd8*/
return -1; /*0xada6*/
UsbConfig_12(a1, *(_QWORD *)(a2 + 24)); /*0xade0*/
v7 = *(_QWORD *)(v6 + 26); /*0xade5*/
if ( (*(_DWORD *)(v7 + 4) & 0xFE0000) == 0 ) /*0xadf0*/
FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), (*(_DWORD *)(v7 + 8) & 0x80000) == 0); /*0xae07*/
v8 = *(_QWORD *)(v6 + 26); /*0xae0c*/
v9 = 0; /*0xae10*/
v10 = (int *)v8; /*0xae14*/
if ( v8 ) /*0xae1a*/
{
do /*0xae2e*/
{
v11 = *v10; /*0xae1c*/
++v9; /*0xae1e*/
if ( (v11 & 1) != 0 ) /*0xae24*/
break; /*0xae24*/
v10 = (int *)(v11 & 0xFFFFFFF0); /*0xae2b*/
}
while ( v10 ); /*0xae2e*/
FwVolConfig(v8, (32 * (unsigned __int64)v9 + 31) >> 5); /*0xae43*/
}
FwVolConfig(v6, 2u); /*0xae50*/
v12 = *(_QWORD *)(a2 + 232); /*0xae55*/
*(_QWORD *)(a2 + 24) = 0; /*0xae5c*/
if ( v12 ) /*0xae63*/
{
FwVolConfig(v12, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xae77*/
*(_QWORD *)(a2 + 232) = 0; /*0xae7c*/
}
return 0; /*0xae94*/
}
// Function: SysKbcCheckStatus @ 0xae9c (0x219 bytes)
char __fastcall SysKbcCheckStatus(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int16 v4; // di
__int64 v5; // r8
__int64 v6; // rax
__int64 v7; // rsi
char v8; // r14
unsigned int v9; // r12d
char v10; // r15
char v11; // al
unsigned __int16 v12; // dx
__int64 v13; // r14
__int64 v14; // rax
__int64 v15; // rsi
int *v16; // rax
int v17; // eax
unsigned __int64 v18; // rcx
__int64 v19; // rax
__int64 v21[9]; // [rsp+60h] [rbp-48h] BYREF
char v22; // [rsp+C0h] [rbp+18h] BYREF
unsigned int v23; // [rsp+C8h] [rbp+20h] BYREF
v4 = 0; /*0xaebb*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL /*0xaefb*/
&& (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) == 0LL
&& (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0
&& (ElibRead32(UsbHcPtr, 2u, v5) & 0x20) == 0
&& (*(_BYTE *)a2 & 3) != 0 )
{
v6 = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xaf10*/
*(_QWORD *)(a2 + 232) = v6; /*0xaf15*/
v7 = v6; /*0xaf1c*/
if ( v6 ) /*0xaf22*/
{
v8 = *(_BYTE *)(a2 + 64); /*0xaf28*/
v9 = *(unsigned __int16 *)(a2 + 322); /*0xaf36*/
v10 = *(_BYTE *)(a2 + 14) & 1; /*0xaf3e*/
v21[0] = v6; /*0xaf41*/
v23 = v9; /*0xaf46*/
v11 = FwVolDriverEntry_2(a2, v8); /*0xaf4e*/
v12 = *(_WORD *)(a2 + 62); /*0xaf53*/
v22 = v11; /*0xaf5e*/
if ( v9 /*0xafc2*/
&& (v13 = UhciBuildTransferDescriptors(
*(_BYTE *)(a2 + 10),
v10,
((v8 >> 7) & 0x88u) - 31,
v8 & 0xF,
v12,
v21,
&v23,
&v22,
v7,
v9,
v11)) != 0 )
{
v14 = UsbConfig_1(2u); /*0xafcf*/
v15 = v14; /*0xafd4*/
if ( v14 ) /*0xafda*/
{
*(_QWORD *)(a2 + 24) = v14; /*0xb01b*/
*(_DWORD *)v14 = 1; /*0xb01f*/
*(_BYTE *)(v14 + 16) = 0; /*0xb022*/
*(_DWORD *)(v14 + 17) = 0; /*0xb026*/
*(_BYTE *)(v14 + 21) = 0; /*0xb029*/
*(_WORD *)(v14 + 34) = 0; /*0xb02d*/
*(_BYTE *)(v14 + 36) = 0; /*0xb031*/
*(_QWORD *)(v14 + 37) = 0; /*0xb035*/
*(_DWORD *)(v14 + 4) = v13; /*0xb039*/
*(_QWORD *)(v14 + 8) = v13; /*0xb03d*/
*(_DWORD *)(v14 + 22) = 2; /*0xb041*/
*(_QWORD *)(v14 + 26) = v13; /*0xb045*/
*(_BYTE *)(v14 + 34) = UsbGetInfo_9(*(_BYTE *)(a2 + 320)); /*0xb05b*/
*(_BYTE *)(v15 + 35) = UsbRegisterNotifyFunc((__int64)UhciNullSub2); /*0xb066*/
*(_QWORD *)(v15 + 37) = a2; /*0xb06c*/
*(_BYTE *)(v15 + 36) = 1; /*0xb070*/
UsbConfig_8(UsbHcPtr, v15); /*0xb074*/
return 0; /*0xb07b*/
}
FwVolConfig(*(_QWORD *)(a2 + 232), ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xaff2*/
v16 = (int *)v13; /*0xaff7*/
do /*0xb00d*/
{
v17 = *v16; /*0xaffa*/
++v4; /*0xaffc*/
if ( (v17 & 1) != 0 ) /*0xb003*/
break; /*0xb003*/
v16 = (int *)(v17 & 0xFFFFFFF0); /*0xb00a*/
}
while ( v16 ); /*0xb00d*/
v18 = v13; /*0xb012*/
v19 = 32LL * v4; /*0xb015*/
}
else
{
v19 = *(unsigned __int16 *)(a2 + 322); /*0xb07d*/
v18 = *(_QWORD *)(a2 + 232); /*0xb084*/
}
FwVolConfig(v18, (unsigned __int64)(v19 + 31) >> 5); /*0xb096*/
}
}
return -1; /*0xb0a5*/
}
// Function: SysKbcReadData @ 0xb0b8 (0xcf bytes)
char __fastcall SysKbcReadData(__int64 a1)
{
unsigned __int64 v2; // rdi
__int64 v3; // r8
unsigned __int64 v4; // rcx
unsigned __int64 v5; // rdx
unsigned __int64 v6; // rcx
unsigned __int64 v7; // r8
v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xb0d5*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xb0e4*/
return -1; /*0xb0e4*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xb0ee*/
return -1; /*0xb0ee*/
if ( (ElibRead32(a1, 2u, v3) & 0x20) != 0 ) /*0xb103*/
return -1; /*0xb103*/
v4 = *(_QWORD *)(a1 + 40); /*0xb105*/
if ( !v4 ) /*0xb10c*/
return -1; /*0xb10c*/
v5 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb115*/
if ( v4 < v5 ) /*0xb11f*/
return -1; /*0xb11f*/
if ( v4 + 24 > v2 ) /*0xb128*/
return -1; /*0xb128*/
v6 = *(_QWORD *)(v4 + 16); /*0xb12a*/
if ( !v6 ) /*0xb131*/
return -1; /*0xb131*/
if ( v6 < v5 ) /*0xb136*/
return -1; /*0xb136*/
if ( v6 + 24 > v2 ) /*0xb13f*/
return -1; /*0xb13f*/
v7 = *(_QWORD *)(v6 + 26); /*0xb141*/
if ( v7 < v5 || v7 + 32 > v2 ) /*0xb151*/
return -1; /*0xb17a*/
*(_DWORD *)(v7 + 16) = 0x8000000; /*0xb158*/
*(_DWORD *)(*(_QWORD *)(v6 + 26) + 4LL) = 0x8000000; /*0xb160*/
*(_BYTE *)(*(_QWORD *)(v6 + 26) + 21LL) = 0; /*0xb167*/
*(_BYTE *)(v6 + 36) = 0; /*0xb16d*/
*(_DWORD *)(v6 + 4) = 1; /*0xb171*/
return 0; /*0xb181*/
}
// Function: SysKbcSendData @ 0xb188 (0xd3 bytes)
char __fastcall SysKbcSendData(__int64 a1)
{
unsigned __int64 v2; // rbx
__int64 v3; // r8
unsigned __int64 v4; // rdx
unsigned __int64 v5; // rcx
unsigned __int64 v6; // rdx
unsigned __int64 v7; // r8
v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xb1a5*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xb1b4*/
return -1; /*0xb1b4*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xb1be*/
return -1; /*0xb1be*/
if ( (ElibRead32(a1, 2u, v3) & 0x20) != 0 ) /*0xb1d3*/
return -1; /*0xb1d3*/
v4 = *(_QWORD *)(a1 + 40); /*0xb1d5*/
if ( !v4 ) /*0xb1dc*/
return -1; /*0xb1dc*/
v5 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb1e5*/
if ( v4 < v5 ) /*0xb1ef*/
return -1; /*0xb1ef*/
if ( v4 + 24 > v2 ) /*0xb1f8*/
return -1; /*0xb1f8*/
v6 = *(_QWORD *)(v4 + 16); /*0xb1fa*/
if ( v6 < v5 ) /*0xb201*/
return -1; /*0xb201*/
if ( v6 + 24 > v2 ) /*0xb20a*/
return -1; /*0xb20a*/
v7 = *(_QWORD *)(v6 + 26); /*0xb20c*/
if ( v7 < v5 || v7 + 32 > v2 ) /*0xb21c*/
return -1; /*0xb24e*/
*(_DWORD *)(v7 + 16) = 159383552; /*0xb21e*/
*(_DWORD *)(*(_QWORD *)(v6 + 26) + 4LL) = *(_DWORD *)(*(_QWORD *)(v6 + 26) + 16LL); /*0xb22d*/
*(_BYTE *)(*(_QWORD *)(v6 + 26) + 21LL) = 1; /*0xb234*/
*(_DWORD *)(v6 + 4) = *(_DWORD *)(v6 + 26); /*0xb23b*/
*(_QWORD *)(v6 + 8) = *(_QWORD *)(v6 + 26); /*0xb242*/
*(_BYTE *)(v6 + 36) = 1; /*0xb248*/
return 0; /*0xb255*/
}
// Function: UsbConfig_8 @ 0xb25c (0xdf bytes)
char __fastcall UsbConfig_8(__int64 UsbHcPtr, __int64 a2)
{
int n3; // eax
char v4; // r9
unsigned __int16 v5; // r11
int *v6; // r8
int *v7; // r10
int v8; // eax
__int16 v9; // ax
int *v10; // [rsp+38h] [rbp+10h]
if ( !a2 ) /*0xb26e*/
return -1; /*0xb26e*/
n3 = *(_DWORD *)(a2 + 22); /*0xb270*/
if ( n3 < 0 ) /*0xb275*/
return -1; /*0xb275*/
if ( n3 <= 1 ) /*0xb27a*/
{
v4 = 0; /*0xb2b6*/
}
else
{
if ( n3 != 2 ) /*0xb27f*/
{
if ( n3 == 3 ) /*0xb284*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 2254, (__int64)"((BOOLEAN)(0==1))"); /*0xb299*/
return -1; /*0xb299*/
}
v4 = 1; /*0xb2ab*/
if ( !*(_BYTE *)(a2 + 34) ) /*0xb2ae*/
return -1; /*0xb2aa*/
}
v5 = 0; /*0xb2b9*/
if ( *(_WORD *)(UsbHcPtr + 48) ) /*0xb2bd*/
{
v6 = v10; /*0xb2c3*/
do /*0xb332*/
{
v7 = (int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * v5); /*0xb2d0*/
v8 = *v7; /*0xb2d4*/
if ( (*v7 & 1) == 0 ) /*0xb2d9*/
{
do /*0xb305*/
{
v6 = (int *)(v8 & 0xFFFFFFF0); /*0xb2e6*/
if ( *(_DWORD *)((char *)&word_16 + (_QWORD)v6) <= *(_DWORD *)(a2 + 22) /*0xb2fb*/
&& (!v4 || *((_BYTE *)&word_1C[3] + (v8 & 0xFFFFFFF0)) <= *(_BYTE *)(a2 + 34)) )
{
break; /*0xb2fb*/
}
v8 = *v6; /*0xb2fd*/
v7 = v6; /*0xb300*/
}
while ( (*v6 & 1) == 0 ); /*0xb305*/
}
if ( v6 != (int *)a2 ) /*0xb30a*/
{
*(_DWORD *)a2 = *v7; /*0xb30f*/
*v7 = a2 | 2; /*0xb316*/
}
if ( v4 ) /*0xb31c*/
v9 = *(unsigned __int8 *)(a2 + 34); /*0xb31e*/
else
v9 = 1; /*0xb324*/
v5 += v9; /*0xb329*/
}
while ( v5 < *(_WORD *)(UsbHcPtr + 48) ); /*0xb332*/
}
return 0; /*0xb2a5*/
}
// Function: UsbConfig_12 @ 0xb33c (0xca bytes)
char __fastcall UsbConfig_12(__int64 a1, __int64 a2)
{
int n3; // eax
char v5; // r9
unsigned __int16 i; // r8
int *v7; // r10
int v8; // ecx
int *v9; // rax
__int16 v10; // ax
if ( !a2 ) /*0xb34e*/
return -1; /*0xb34e*/
n3 = *(_DWORD *)(a2 + 22); /*0xb350*/
if ( n3 < 0 ) /*0xb355*/
return -1; /*0xb355*/
if ( n3 <= 1 ) /*0xb35a*/
{
v5 = 0; /*0xb396*/
}
else
{
if ( n3 != 2 ) /*0xb35f*/
{
if ( n3 == 3 ) /*0xb364*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 2339, (__int64)"((BOOLEAN)(0==1))"); /*0xb379*/
return -1; /*0xb379*/
}
v5 = 1; /*0xb38b*/
if ( !*(_BYTE *)(a2 + 34) ) /*0xb38e*/
return -1; /*0xb37e*/
}
*(_DWORD *)(a2 + 4) = 1; /*0xb399*/
for ( i = 0; i < *(_WORD *)(a1 + 48); i += v10 ) /*0xb3a4*/
{
v7 = (int *)(*(_QWORD *)(a1 + 8) + 4LL * i); /*0xb3b2*/
v8 = *v7; /*0xb3b6*/
while ( (v8 & 1) == 0 ) /*0xb3cf*/
{
v9 = (int *)(v8 & 0xFFFFFFF0); /*0xb3c2*/
if ( v9 == (int *)a2 ) /*0xb3c8*/
break; /*0xb3c8*/
v8 = *v9; /*0xb3ca*/
v7 = v9; /*0xb3cc*/
}
if ( (v8 & 1) == 0 ) /*0xb3d7*/
*v7 = *(_DWORD *)a2; /*0xb3db*/
if ( v5 ) /*0xb3e1*/
v10 = *(unsigned __int8 *)(a2 + 34); /*0xb3e3*/
else
v10 = 1; /*0xb3e9*/
}
*(_DWORD *)a2 = 1; /*0xb3f9*/
return 0; /*0xb385*/
}
// Function: UhciCreateRootHubQh @ 0xb408 (0x261 bytes)
char __fastcall UhciCreateRootHubQh(__int64 UsbHcPtr)
{
__int64 v2; // rax
__int64 *v3; // rbx
__int64 v5; // rax
__int64 v6; // rax
__int64 v7; // rcx
__int64 v8; // rax
__int64 v9; // rax
__int64 v10; // rdi
__int64 v11; // rdi
__int64 v12; // rax
__int64 UsbRtDispatchTable; // rcx
v2 = UsbConfig_1(1u); /*0xb42d*/
v3 = (__int64 *)v2; /*0xb434*/
if ( !v2 ) /*0xb43a*/
return -1; /*0xb43a*/
*(_QWORD *)(UsbHcPtr + 40) = v2; /*0xb448*/
v5 = UsbConfig_1(2u); /*0xb44c*/
*v3 = v5; /*0xb451*/
if ( !v5 ) /*0xb457*/
return -1; /*0xb457*/
*(_DWORD *)v5 = 1; /*0xb459*/
*(_DWORD *)(v5 + 4) = 1; /*0xb45f*/
*(_QWORD *)(v5 + 8) = 0; /*0xb463*/
*(_BYTE *)(v5 + 16) = 0; /*0xb467*/
*(_DWORD *)(v5 + 17) = 0; /*0xb46b*/
*(_BYTE *)(v5 + 21) = 0; /*0xb46e*/
*(_QWORD *)(v5 + 26) = 0; /*0xb472*/
*(_WORD *)(v5 + 34) = 0; /*0xb476*/
*(_BYTE *)(v5 + 36) = 0; /*0xb47a*/
*(_QWORD *)(v5 + 37) = 0; /*0xb47e*/
*(_DWORD *)(*v3 + 22) = 2; /*0xb485*/
*(_BYTE *)(*v3 + 34) = 1; /*0xb48f*/
UsbConfig_8(UsbHcPtr, *v3); /*0xb496*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x10) == 0 ) /*0xb49f*/
{
v6 = UsbConfig_1(3u); /*0xb4ac*/
v3[2] = v6; /*0xb4b1*/
if ( v6 ) /*0xb4b8*/
{
v7 = v6 + 64; /*0xb4ba*/
*(_DWORD *)(v6 + 64) = 1; /*0xb4c3*/
*(_DWORD *)(v6 + 76) = v6 + 88; /*0xb4c9*/
*(_DWORD *)(v6 + 68) = 0x8000000; /*0xb4cc*/
*(_DWORD *)(v6 + 72) = 14694505; /*0xb4cf*/
*(_DWORD *)(v6 + 80) = 0x8000000; /*0xb4d6*/
*(_BYTE *)(v6 + 85) = 0; /*0xb4d9*/
v8 = v3[2]; /*0xb4dd*/
*(_DWORD *)v8 = 1; /*0xb4e1*/
*(_DWORD *)(v8 + 4) = 1; /*0xb4e4*/
*(_QWORD *)(v8 + 8) = 0; /*0xb4e8*/
*(_BYTE *)(v8 + 16) = 0; /*0xb4ec*/
*(_DWORD *)(v8 + 17) = 0; /*0xb4f0*/
*(_BYTE *)(v8 + 21) = 0; /*0xb4f3*/
*(_QWORD *)(v8 + 26) = 0; /*0xb4f7*/
*(_WORD *)(v8 + 34) = 0; /*0xb4fb*/
*(_BYTE *)(v8 + 36) = 0; /*0xb4ff*/
*(_QWORD *)(v8 + 37) = 0; /*0xb503*/
*(_DWORD *)(v3[2] + 22) = 2; /*0xb50b*/
*(_QWORD *)(v3[2] + 26) = v7; /*0xb516*/
*(_BYTE *)(v3[2] + 34) = 8; /*0xb525*/
*(_BYTE *)(v3[2] + 35) = UsbRegisterNotifyFunc((__int64)UhciNullSub1); /*0xb535*/
*(_BYTE *)(v3[2] + 36) = 0; /*0xb53c*/
UsbConfig_8(UsbHcPtr, v3[2]); /*0xb544*/
UsbServiceHcPolling(UsbHcPtr, 0); /*0xb54e*/
v9 = UsbConfig_1(3u); /*0xb555*/
v3[1] = v9; /*0xb55a*/
if ( !v9 ) /*0xb561*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 2487, (__int64)"DescPtr->RootHubQh != ((void *) 0)"); /*0xb576*/
v10 = v3[1]; /*0xb57b*/
if ( v10 ) /*0xb582*/
{
*(_DWORD *)(v10 + 72) = 14694505; /*0xb588*/
*(_DWORD *)(v10 + 80) = 0; /*0xb596*/
v11 = v10 + 64; /*0xb599*/
*(_QWORD *)v11 = 1; /*0xb59d*/
*(_DWORD *)(v11 + 12) = v11 + 24; /*0xb5a3*/
*(_BYTE *)(v11 + 21) = 0; /*0xb5a6*/
v12 = v3[1]; /*0xb5aa*/
*(_DWORD *)v12 = 1; /*0xb5ae*/
*(_DWORD *)(v12 + 4) = 1; /*0xb5b1*/
*(_QWORD *)(v12 + 8) = 0; /*0xb5b5*/
*(_BYTE *)(v12 + 16) = 0; /*0xb5b9*/
*(_DWORD *)(v12 + 17) = 0; /*0xb5bd*/
*(_BYTE *)(v12 + 21) = 0; /*0xb5c0*/
*(_QWORD *)(v12 + 26) = 0; /*0xb5c4*/
*(_WORD *)(v12 + 34) = 0; /*0xb5c8*/
*(_BYTE *)(v12 + 36) = 0; /*0xb5cc*/
*(_QWORD *)(v12 + 37) = 0; /*0xb5d0*/
*(_DWORD *)(v3[1] + 22) = 2; /*0xb5d8*/
*(_QWORD *)(v3[1] + 26) = v11; /*0xb5e3*/
*(_BYTE *)(v3[1] + 34) = 0x80; /*0xb5eb*/
*(_BYTE *)(v3[1] + 35) = UsbRegisterNotifyFunc((__int64)UhciCreateFrameList); /*0xb5f8*/
*(_BYTE *)(v3[1] + 36) = 0; /*0xb602*/
UsbConfig_8(UsbHcPtr, v3[1]); /*0xb60a*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xb60f*/
if ( !*(_QWORD *)(UsbRtDispatchTable + 30488) ) /*0xb616*/
{
*(_BYTE *)(v11 + 21) = 1; /*0xb61f*/
*(_DWORD *)(v11 + 16) = 159383552; /*0xb628*/
*(_DWORD *)(v11 + 4) = 159383552; /*0xb62b*/
*(_DWORD *)(v3[1] + 4) = v11; /*0xb632*/
*(_QWORD *)(v3[1] + 8) = v11; /*0xb639*/
*(_BYTE *)(v3[1] + 36) = 1; /*0xb641*/
*(_QWORD *)(UsbRtDispatchTable + 30488) = UsbHcPtr; /*0xb645*/
}
return 0; /*0xb645*/
}
}
return -1; /*0xb43e*/
}
return 0; /*0xb662*/
}
// Function: UsbConfig_0 @ 0xb66c (0x228 bytes)
char __fastcall UsbConfig_0(__int64 UsbHcPtr)
{
unsigned __int64 *v2; // rbx
unsigned __int64 v3; // r8
unsigned __int64 v4; // rdi
unsigned __int64 v5; // rcx
unsigned __int64 v6; // rax
unsigned __int64 v7; // rax
unsigned __int64 v8; // rcx
unsigned __int64 v9; // rcx
__int64 UsbRtDispatchTable; // rdx
unsigned __int8 v11; // r10
__int64 v12; // rcx
__int64 UsbHcPtr_1; // rax
unsigned __int64 v14; // r8
unsigned __int64 v15; // r9
unsigned __int64 v16; // rcx
unsigned __int64 v17; // r11
unsigned __int64 v18; // rax
v2 = *(unsigned __int64 **)(UsbHcPtr + 40); /*0xb685*/
v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb68f*/
v4 = v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xb699*/
if ( !v2 ) /*0xb69f*/
return -1; /*0xb69f*/
if ( (unsigned __int64)v2 < v3 ) /*0xb6a8*/
return -1; /*0xb6a8*/
if ( (unsigned __int64)(v2 + 3) > v4 ) /*0xb6b5*/
return -1; /*0xb6b5*/
v5 = *v2; /*0xb6bb*/
if ( *v2 < v3 ) /*0xb6c1*/
return -1; /*0xb6c1*/
if ( v5 + 64 > v4 ) /*0xb6ce*/
return -1; /*0xb6ce*/
v6 = v2[1]; /*0xb6d4*/
if ( v6 < v3 ) /*0xb6db*/
return -1; /*0xb6db*/
if ( v6 + 64 > v4 ) /*0xb6e8*/
return -1; /*0xb6e8*/
v7 = v2[2]; /*0xb6ee*/
if ( v7 < v3 || v7 + 64 > v4 ) /*0xb702*/
return -1; /*0xb882*/
FwVolConfig(v5, 2u); /*0xb70d*/
v8 = v2[1]; /*0xb712*/
if ( v8 ) /*0xb719*/
FwVolConfig(v8, 3u); /*0xb720*/
v9 = v2[2]; /*0xb725*/
if ( v9 ) /*0xb72c*/
FwVolConfig(v9, 3u); /*0xb733*/
FwVolConfig((unsigned __int64)v2, 1u); /*0xb740*/
UsbServiceHcPolling(UsbHcPtr, 3u); /*0xb74a*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xb74f*/
if ( *(_QWORD *)(UsbRtDispatchTable + 30488) == UsbHcPtr ) /*0xb75d*/
{
*(_QWORD *)(UsbRtDispatchTable + 30488) = 0; /*0xb763*/
v11 = 0; /*0xb76b*/
if ( *(_BYTE *)(UsbRtDispatchTable + 27704) ) /*0xb76e*/
{
v12 = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0xb77b*/
do /*0xb786*/
{
UsbHcPtr_1 = *(_QWORD *)(v12 + 8LL * v11); /*0xb786*/
if ( UsbHcPtr_1 /*0xb7b3*/
&& *(_BYTE *)UsbHcPtr_1
&& *(_BYTE *)(UsbHcPtr_1 + 1) == 16
&& (*(_BYTE *)(UsbHcPtr_1 + 64) & 1) != 0
&& UsbHcPtr != UsbHcPtr_1 )
{
v14 = *(_QWORD *)(UsbHcPtr_1 + 40); /*0xb7b9*/
v15 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb7bd*/
if ( v14 < v15 ) /*0xb7c7*/
return -1; /*0xb7c7*/
if ( v14 + 24 > v4 ) /*0xb7d4*/
return -1; /*0xb7d4*/
v16 = *(_QWORD *)(v14 + 8); /*0xb7da*/
if ( v16 < v15 ) /*0xb7e1*/
return -1; /*0xb7e1*/
if ( v16 + 64 > v4 ) /*0xb7ee*/
return -1; /*0xb7ee*/
v17 = *(_QWORD *)(v16 + 26); /*0xb7f4*/
if ( v17 < v15 ) /*0xb7fb*/
return -1; /*0xb7fb*/
if ( v17 + 32 > v4 ) /*0xb808*/
return -1; /*0xb808*/
v18 = *(_QWORD *)(v16 + 8); /*0xb80a*/
if ( v18 < v15 || v18 + 32 > v4 ) /*0xb81a*/
return -1; /*0xb81a*/
*(_DWORD *)(v17 + 16) = 159383552; /*0xb81c*/
*(_BYTE *)(*(_QWORD *)(*(_QWORD *)(v14 + 8) + 26LL) + 21LL) = 1; /*0xb82c*/
*(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v14 + 8) + 26LL) + 4LL) = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v14 + 8) /*0xb83b*/
+ 26LL)
+ 16LL);
*(_DWORD *)(*(_QWORD *)(v14 + 8) + 4LL) = *(_DWORD *)(*(_QWORD *)(v14 + 8) + 26LL); /*0xb845*/
*(_QWORD *)(*(_QWORD *)(v14 + 8) + 8LL) = *(_QWORD *)(*(_QWORD *)(v14 + 8) + 26LL); /*0xb850*/
*(_BYTE *)(*(_QWORD *)(v14 + 8) + 36LL) = 1; /*0xb858*/
v12 = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0xb85c*/
*(_QWORD *)(UsbRtDispatchTable + 30488) = *(_QWORD *)(v12 + 8LL * v11); /*0xb867*/
}
++v11; /*0xb86e*/
}
while ( v11 < *(_BYTE *)(UsbRtDispatchTable + 27704) ); /*0xb786*/
}
}
return 0; /*0xb88e*/
}
// Function: UhciWalkQueueHead @ 0xb894 (0x14e bytes)
char __fastcall UhciWalkQueueHead(__int64 a1, __int64 a2)
{
__int64 v2; // r10
__int64 v5; // rax
_DWORD *v6; // rcx
unsigned int v7; // edx
bool v8; // al
int v9; // ecx
unsigned __int8 n0x32; // al
char (__fastcall *UhciNullSub1_1)(_BYTE *, __int64, __int64); // r11
v2 = a2; /*0xb8a0*/
if ( !a2 ) /*0xb8a9*/
return -1; /*0xb8a9*/
if ( *(_BYTE *)(a2 + 36) ) /*0xb8b2*/
{
v5 = *(_QWORD *)(a2 + 26); /*0xb8bc*/
if ( v5 ) /*0xb8c3*/
{
if ( !*(_QWORD *)(a2 + 8) ) /*0xb8c9*/
*(_QWORD *)(a2 + 8) = v5; /*0xb8cf*/
v6 = *(_DWORD **)(a2 + 8); /*0xb8d3*/
while ( v6 ) /*0xb8da*/
{
*(_QWORD *)(v2 + 8) = v6; /*0xb8f2*/
*(_BYTE *)(v2 + 16) = (v6[2] & 0x80000) != 0; /*0xb8ff*/
if ( (v6[1] & 0x800000) != 0 ) /*0xb90a*/
return -1; /*0xb90a*/
v7 = (*((_WORD *)v6 + 2) + 1) & 0x7FF; /*0xb918*/
*(_DWORD *)(v2 + 17) += v7; /*0xb91b*/
if ( (v6[1] & 0xFE0000) != 0 ) /*0xb926*/
break; /*0xb926*/
*(_BYTE *)(v2 + 16) ^= 1u; /*0xb928*/
v8 = v7 < (((v6[2] >> 21) + 1) & 0x7FFu); /*0xb93a*/
*(_BYTE *)(v2 + 21) = v8; /*0xb93d*/
if ( v8 ) /*0xb943*/
{
if ( *(_DWORD *)(v2 + 22) != 1 ) /*0xb949*/
break; /*0xb949*/
while ( (*v6 & 1) == 0 ) /*0xb958*/
v6 = (_DWORD *)(*v6 & 0xFFFFFFF0); /*0xb950*/
*(_DWORD *)(v2 + 4) = (_DWORD)v6; /*0xb95a*/
}
else
{
v9 = *v6; /*0xb960*/
if ( (v9 & 1) != 0 ) /*0xb965*/
break; /*0xb965*/
v6 = (_DWORD *)(v9 & 0xFFFFFFF0); /*0xb967*/
}
}
n0x32 = *(_BYTE *)(v2 + 35); /*0xb96f*/
*(_BYTE *)(v2 + 36) = 0; /*0xb973*/
if ( n0x32 ) /*0xb979*/
{
if ( n0x32 <= 0x32u ) /*0xb97d*/
{
UhciNullSub1_1 = *(char (__fastcall **)(_BYTE *, __int64, __int64))(UsbRtDispatchTable + 8LL * n0x32 + 29456); /*0xb989*/
if ( UhciNullSub1_1 ) /*0xb994*/
{
if ( UhciNullSub1_1 != UhciNullSub1 /*0xb9ba*/
&& (char *)UhciNullSub1_1 != (char *)UhciCreateFrameList
&& (UsbValidateDeviceEntry(*(_QWORD *)(v2 + 37)) & 0x8000000000000000uLL) != 0LL )
{
return -1; /*0xb8ad*/
}
((void (__fastcall *)(__int64, _QWORD, __int64, _QWORD, _WORD))UhciNullSub1_1)( /*0xb9d2*/
a1,
*(_QWORD *)(v2 + 37),
v2,
0,
0);
}
}
}
}
}
return 0; /*0xb9dc*/
}
// Function: UhciWalkTransferList @ 0xb9e4 (0xd6 bytes)
char __fastcall UhciWalkTransferList(_BYTE *a1)
{
int v2; // edx
__int64 v3; // rbx
unsigned __int8 n0x31; // al
void (__fastcall *v5)(_BYTE *, __int64, __int64, _QWORD, int); // rsi
__int64 v6; // rax
int v8; // [rsp+20h] [rbp-18h]
v2 = **((_DWORD **)a1 + 1); /*0xba04*/
if ( (v2 & 1) == 0 ) /*0xba09*/
{
do /*0xba97*/
{
if ( (v2 & 2) != 0 ) /*0xba1c*/
{
v3 = v2 & 0xFFFFFFF0; /*0xba1e*/
UhciWalkQueueHead((__int64)a1, v3); /*0xba27*/
}
else
{
v3 = v2 & 0xFFFFFFF0; /*0xba2e*/
if ( (v2 & 0xFFFFFFF0) != 0 ) /*0xba31*/
{
if ( *((_BYTE *)&word_14 + (v2 & 0xFFFFFFF0) + 1) ) /*0xba33*/
{
if ( (*(_DWORD *)((_BYTE *)word_4 + (v2 & 0xFFFFFFF0)) & 0x800000) == 0 ) /*0xba40*/
{
n0x31 = *((_BYTE *)&word_14 + (v2 & 0xFFFFFFF0)) - 1; /*0xba45*/
*((_BYTE *)&word_14 + (v2 & 0xFFFFFFF0) + 1) = 0; /*0xba47*/
if ( n0x31 <= 0x31u ) /*0xba4d*/
{
v5 = *(void (__fastcall **)(_BYTE *, __int64, __int64, _QWORD, int))(UsbRtDispatchTable /*0xba5a*/
+ 8LL
* *((unsigned __int8 *)&word_14
+ (v2 & 0xFFFFFFF0))
+ 29456);
if ( v5 ) /*0xba65*/
{
v6 = FwVolDriverEntry(16, 0, BYTE1(*(_DWORD *)((char *)&word_8 + (v2 & 0xFFFFFFF0))) & 0x7F, a1); /*0xba7a*/
LOWORD(v8) = 0; /*0xba82*/
v5(a1, v6, v3, 0, v8); /*0xba90*/
}
}
}
}
}
}
v2 = *(_DWORD *)v3; /*0xba92*/
}
while ( (*(_DWORD *)v3 & 1) == 0 ); /*0xba97*/
}
return 0; /*0xbab3*/
}
// Function: UhciCreateFrameList @ 0xbabc (0x1ec bytes)
char __fastcall UhciCreateFrameList(__int64 a1, __int64 a2, __int64 a3)
{
__int64 v5; // rbx
__int64 UsbRtDispatchTable; // rdx
unsigned __int8 i; // bp
__int64 UsbHcPtr; // r14
__int64 v9; // r8
char v10; // al
__int64 PortNum; // rdx
__int64 EndpointAddr; // r8
__int64 v13; // r8
unsigned __int16 v14; // ax
char v15; // al
__int64 PortNum_1; // rdx
__int64 EndpointAddr_1; // r8
__int64 v18; // r8
unsigned __int16 v19; // ax
__int64 v21; // [rsp+50h] [rbp+18h]
if ( a3 ) /*0xbad7*/
{
v5 = a3; /*0xbadd*/
*(_BYTE *)(*(_QWORD *)(a3 + 26) + 21LL) = 0; /*0xbae0*/
}
else
{
v5 = v21; /*0xbae6*/
}
UsbRtDispatchTable = UsbRtDispatchTable; /*0xbaeb*/
for ( i = 0; i < *(_BYTE *)(UsbRtDispatchTable + 27704); ++i ) /*0xbaf5*/
{
UsbHcPtr = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * i); /*0xbb0d*/
if ( UsbHcPtr && *(_BYTE *)(UsbHcPtr + 1) == 16 && (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 ) /*0xbb2a*/
{
if ( (AssertCpuDeadLoop_0(a1, UsbRtDispatchTable, a3) & 0xFFFFF000) != *(_DWORD *)(UsbHcPtr + 8) /*0xbb53*/
|| ElibRead32(a1, 0, a3) == -1 )
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0xbc53*/
}
else
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0xbb59*/
if ( !*(_BYTE *)(UsbRtDispatchTable + 29872) ) /*0xbb60*/
{
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0xbb70*/
ElibWrite16Direct(a1, 4u, 0); /*0xbb7e*/
v10 = AssertCpuDeadLoop_1(a1, 0x10u, v9); /*0xbb8b*/
if ( (v10 & 2) != 0 ) /*0xbb92*/
{
if ( (v10 & 1) != 0 ) /*0xbb96*/
(*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0xbba4*/
LOBYTE(EndpointAddr) = 1; /*0xbbad*/
LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0xbbb0*/
DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0xbbb6*/
v14 = AssertCpuDeadLoop_1(a1, 0x10u, v13); /*0xbbc3*/
ElibWrite16Direct(a1, 0x10u, v14); /*0xbbd4*/
}
v15 = AssertCpuDeadLoop_1(a1, 0x12u, EndpointAddr); /*0xbbe1*/
if ( (v15 & 2) != 0 ) /*0xbbe8*/
{
if ( (v15 & 1) != 0 ) /*0xbbec*/
(*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0xbbfa*/
LOBYTE(EndpointAddr_1) = 2; /*0xbc03*/
LOBYTE(PortNum_1) = *(_BYTE *)UsbHcPtr | 0x80; /*0xbc06*/
DebugLogPrint_3(UsbHcPtr, PortNum_1, EndpointAddr_1); /*0xbc0c*/
v19 = AssertCpuDeadLoop_1(a1, 0x12u, v18); /*0xbc1d*/
ElibWrite16Direct(a1, 0x12u, v19); /*0xbc2c*/
}
ElibWrite16Direct(a1, 4u, 4); /*0xbc3e*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xbc43*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0xbc4a*/
}
}
}
}
if ( a3 ) /*0xbc6d*/
{
*(_DWORD *)(*(_QWORD *)(v5 + 26) + 4LL) = *(_DWORD *)(*(_QWORD *)(v5 + 26) + 16LL); /*0xbc76*/
*(_BYTE *)(*(_QWORD *)(v5 + 26) + 21LL) = 1; /*0xbc7d*/
*(_DWORD *)(v5 + 4) = *(_DWORD *)(v5 + 26); /*0xbc84*/
*(_QWORD *)(v5 + 8) = *(_QWORD *)(v5 + 26); /*0xbc8b*/
*(_BYTE *)(v5 + 36) = 1; /*0xbc8f*/
}
return 0; /*0xbc9f*/
}
// Function: UhciNullSub1 @ 0xbca8 (0x48 bytes)
char __fastcall UhciNullSub1(_BYTE *a1, __int64 a2, __int64 a3)
{
__int64 v4; // rax
int v5; // ecx
*(_BYTE *)(*(_QWORD *)(a3 + 26) + 21LL) = 0; /*0xbcb5*/
UsbGetInfo_15(a1); /*0xbcb9*/
v4 = *(_QWORD *)(a3 + 26); /*0xbcbe*/
v5 = *(_DWORD *)(v4 + 16); /*0xbcc2*/
if ( (v5 & 0x800000) != 0 ) /*0xbcc9*/
{
*(_DWORD *)(v4 + 4) = v5; /*0xbccb*/
*(_BYTE *)(*(_QWORD *)(a3 + 26) + 21LL) = 1; /*0xbcd2*/
*(_DWORD *)(a3 + 4) = *(_DWORD *)(a3 + 26); /*0xbcd9*/
*(_QWORD *)(a3 + 8) = *(_QWORD *)(a3 + 26); /*0xbce0*/
*(_BYTE *)(a3 + 36) = 1; /*0xbce4*/
}
return 0; /*0xbcea*/
}
// Function: UhciNullSub2 @ 0xbcf0 (0xd1 bytes)
char __fastcall UhciNullSub2(__int64 a1, __int64 a2, __int64 a3)
{
void (__fastcall *v6)(__int64, __int64, __int64, _QWORD, _WORD); // r10
__int64 v7; // rcx
char i; // dl
int v9; // ecx
int v10; // eax
FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), *(_BYTE *)(a3 + 16)); /*0xbd12*/
if ( (*(_DWORD *)(*(_QWORD *)(a3 + 8) + 4LL) & 0xFE0000) == 0 && (unsigned __int8)(*(_BYTE *)(a2 + 21) - 1) <= 0x31u ) /*0xbd2b*/
{
v6 = *(void (__fastcall **)(__int64, __int64, __int64, _QWORD, _WORD))(UsbRtDispatchTable /*0xbd38*/
+ 8LL * *(unsigned __int8 *)(a2 + 21)
+ 29456);
if ( v6 ) /*0xbd43*/
v6(a1, a2, a3, *(_QWORD *)(a2 + 232), *(_WORD *)(a3 + 17)); /*0xbd5e*/
}
v7 = *(_QWORD *)(a3 + 26); /*0xbd61*/
for ( i = *(_BYTE *)(a3 + 16); v7; v7 = v9 & 0xFFFFFFF0 ) /*0xbd6b*/
{
*(_DWORD *)(v7 + 8) &= ~0x80000u; /*0xbd6d*/
if ( i ) /*0xbd74*/
*(_DWORD *)(v7 + 8) |= 0x80000u; /*0xbd76*/
i ^= 1u; /*0xbd7e*/
*(_DWORD *)(v7 + 4) = *(_DWORD *)(v7 + 16); /*0xbd81*/
*(_BYTE *)(v7 + 21) = 1; /*0xbd84*/
v9 = *(_DWORD *)v7; /*0xbd88*/
if ( (v9 & 1) != 0 ) /*0xbd8d*/
break; /*0xbd8d*/
}
v10 = *(_DWORD *)(a3 + 26); /*0xbd99*/
*(_DWORD *)(a3 + 17) = 0; /*0xbd9c*/
*(_DWORD *)(a3 + 4) = v10; /*0xbda5*/
*(_QWORD *)(a3 + 8) = *(_QWORD *)(a3 + 26); /*0xbdac*/
*(_BYTE *)(a3 + 36) = 1; /*0xbdb2*/
return 0; /*0xbdbb*/
}
// Function: UsbGetInfo_9 @ 0xbdc4 (0x50 bytes)
char __fastcall sub_BDC4(unsigned __int8 a1)
{
unsigned __int8 v1; // di
char i; // al
v1 = a1; /*0xbdd3*/
if ( !a1 ) /*0xbdd8*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 3156, (__int64)"Interval >= 1 && Interval <= 255"); /*0xbded*/
for ( i = 0; v1; v1 >>= 1 ) /*0xbdf7*/
++i; /*0xbdf9*/
return 1 << (i - 1); /*0xbe0e*/
}
// Function: UhciBuildTransferDescriptors @ 0xbe14 (0x155 bytes)
__int64 __fastcall UhciBuildTransferDescriptors(
unsigned __int8 a1,
char a2,
unsigned __int8 a3,
unsigned __int8 a4,
unsigned __int16 a5,
_QWORD *a6,
_DWORD *a7,
_BYTE *a8,
__int64 a9,
unsigned int a10,
char a11)
{
unsigned int v11; // ebx
unsigned int v14; // eax
__int64 result; // rax
__int64 v18; // r11
__int64 v20; // rdx
int v22; // r8d
unsigned __int16 v23; // di
int v24; // eax
int n478150656; // eax
int v26; // ecx
int v27; // ecx
v11 = a10; /*0xbe31*/
v14 = a10 / a5; /*0xbe48*/
if ( a10 % a5 ) /*0xbe48*/
LOWORD(v14) = v14 + 1; /*0xbe5b*/
result = UsbConfig_1((32 * (unsigned __int64)(unsigned __int16)v14 + 31) >> 5); /*0xbe6e*/
v18 = result; /*0xbe73*/
if ( result ) /*0xbe79*/
{
v20 = result; /*0xbe87*/
v22 = (a1 | (a4 << 7)) << 8; /*0xbea5*/
while ( 1 ) /*0xbeac*/
{
*(_DWORD *)v20 = 1; /*0xbeac*/
v23 = v11; /*0xbeaf*/
if ( v11 > a5 ) /*0xbeb2*/
v23 = a5; /*0xbeb2*/
v24 = v22 | a3 | ((v23 << 21) - 0x200000); /*0xbec7*/
*(_DWORD *)(v20 + 8) = v24; /*0xbeca*/
if ( a11 ) /*0xbed0*/
*(_DWORD *)(v20 + 8) = v24 | 0x80000; /*0xbed6*/
*(_DWORD *)(v20 + 16) = 411041792; /*0xbed9*/
n478150656 = *(_DWORD *)(v20 + 16); /*0xbee3*/
if ( a2 ) /*0xbeeb*/
n478150656 = 478150656; /*0xbeeb*/
*(_DWORD *)(v20 + 12) = a9; /*0xbeee*/
*(_DWORD *)(v20 + 16) = n478150656; /*0xbef2*/
a11 ^= 1u; /*0xbef5*/
*(_DWORD *)(v20 + 16) |= 0x20000000u; /*0xbef8*/
v26 = *(_DWORD *)(v20 + 16); /*0xbefd*/
a9 += v23; /*0xbf03*/
*(_DWORD *)(v20 + 4) = v26; /*0xbf06*/
*(_BYTE *)(v20 + 21) = 1; /*0xbf09*/
v11 -= v23; /*0xbf0d*/
if ( !v11 ) /*0xbf0f*/
break; /*0xbf0f*/
*(_DWORD *)v20 = (v20 + 32) | 4; /*0xbf1c*/
v20 = ((_DWORD)v20 + 32) & 0xFFFFFFF0; /*0xbf20*/
}
v27 = v26 | 0x1000000; /*0xbf2a*/
*(_DWORD *)(v20 + 16) = v27; /*0xbf2e*/
*(_DWORD *)(v20 + 4) = v27; /*0xbf31*/
*a7 = 0; /*0xbf34*/
*a6 = a9; /*0xbf3c*/
*a8 = a11; /*0xbf44*/
return v18; /*0xbf47*/
}
return result; /*0xbf5e*/
}
// Function: DebugLogPrint_5 @ 0xbf6c (0x149 bytes)
void __fastcall DebugLogPrint_5(__int64 UsbHcPtr)
{
unsigned int v1; // esi
unsigned __int8 v3; // bl
unsigned int i; // eax
__int64 n0x1FFF; // r8
unsigned __int8 n5; // dl
unsigned __int16 v7; // ax
unsigned int v8; // esi
__int64 v9; // rax
int v10; // eax
int v11; // [rsp+40h] [rbp+8h] BYREF
v1 = *(_DWORD *)(UsbHcPtr + 56); /*0xbf7b*/
*(_BYTE *)(UsbHcPtr + 69) = 0; /*0xbf83*/
v3 = (v1 >> 20) & 0xF; /*0xbf8a*/
if ( v3 )
{
if ( v3 <= (unsigned __int8)(v1 & 0xF) )
{
if ( (HcPciReadConfig(UsbHcPtr, 4u) & 0x100000) != 0 )
{
for ( i = HcPciReadConfig(UsbHcPtr, 0x34u); (_BYTE)i; i >>= 8 ) /*0xbfdc*/
{
i = HcPciReadConfig(UsbHcPtr, (unsigned __int8)i); /*0xbfe9*/
if ( (_BYTE)i == 10 ) /*0xbff0*/
break; /*0xbff0*/
}
if ( (_BYTE)i )
{
n0x1FFF = 0x1FFF; /*0xc003*/
n5 = (i >> 29) - 1; /*0xc00f*/
v7 = HIWORD(i) & 0x1FFF; /*0xc011*/
if ( n5 <= 5u )
{
v11 = 0; /*0xc034*/
v8 = v7; /*0xc03e*/
LOBYTE(n0x1FFF) = n5; /*0xc041*/
v9 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, _QWORD, __int64, int *))(*(_QWORD *)(UsbHcPtr + 104) /*0xc061*/
+ 16LL))(
*(_QWORD *)(UsbHcPtr + 104),
2,
n0x1FFF,
v7,
1,
&v11);
if ( v9 >= 0 )
{
v10 = v11; /*0xc084*/
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Ehci: Read Debug Reg error: %r at %x\n", v9, v8);
v10 = -1; /*0xc07f*/
}
if ( (v10 & 0x10000000) != 0 ) /*0xc08c*/
{
*(_BYTE *)(UsbHcPtr + 69) = v3; /*0xc09d*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Debug Port #%d enabled.\n", v3); /*0xc0a0*/
}
}
else
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 240, (__int64)"DebugPortBarIndex <= 5"); /*0xc02d*/
}
}
}
}
else
{
Assert( /*0xbfaf*/
(UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c",
212,
(__int64)"DebugPortNo <= (UINT8)(HcsParams & (0x00000001+0x00000002+0x00000004+0x00000008))");
}
}
}
// Function: EhciDriverEntry @ 0xc0b8 (0x36b bytes)
char __fastcall EhciDriverEntry(__int64 UsbHcPtr, __int64 n2047, __int64 n65528)
{
unsigned int n0x32; // edi
char v5; // r15
unsigned int n787232; // eax
__int64 v8; // r8
int v9; // eax
unsigned __int8 v10; // al
int v11; // eax
unsigned int v12; // edx
unsigned int i; // esi
unsigned int v14; // eax
unsigned int v15; // eax
unsigned __int16 n256; // ax
unsigned __int16 v17; // cx
__int64 v18; // rdx
__int64 v19; // rax
unsigned int j; // esi
unsigned int v21; // esi
unsigned __int16 n68; // bp
int v23; // eax
n0x32 = 0; /*0xc0d4*/
v5 = 0; /*0xc0d9*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc0e4*/
return -1; /*0xc0e4*/
n787232 = (unsigned int)HcPciReadConfig(UsbHcPtr, 8u) >> 8; /*0xc0fc*/
if ( n787232 != 787232 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Class Code is wrong: %x\n", n787232);
return -1; /*0xc0e8*/
}
v8 = HcPciReadConfig(UsbHcPtr, 0x10u) & 0xFFFFFFF0LL; /*0xc13b*/
*(_QWORD *)(UsbHcPtr + 16) = v8; /*0xc141*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Mem Addr: %X\n", v8);
v9 = DebugLogPrint_13(UsbHcPtr, 4u); /*0xc154*/
*(_DWORD *)(UsbHcPtr + 56) = v9; /*0xc159*/
LOBYTE(v9) = v9 & 0xF; /*0xc163*/
*(_BYTE *)(UsbHcPtr + 32) = v9; /*0xc16c*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Number of ports: %d\n", (unsigned __int8)v9);
DebugLogPrint_5(UsbHcPtr); /*0xc178*/
v10 = DebugLogPrint_13(UsbHcPtr, 0); /*0xc182*/
*(_BYTE *)(UsbHcPtr + 50) = v10; /*0xc195*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Operational Registers Offset: %d\n", v10);
v11 = DebugLogPrint_13(UsbHcPtr, 8u); /*0xc1a2*/
v12 = *(unsigned __int8 *)(UsbHcPtr + 50) + 4; /*0xc1ae*/
*(_DWORD *)(UsbHcPtr + 60) = v11; /*0xc1b1*/
*(_BYTE *)(UsbHcPtr + 68) = 0; /*0xc1b4*/
if ( (DebugLogPrint_13(UsbHcPtr, v12) & 0x1000) == 0 ) /*0xc1ca*/
{
DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xc1d4*/
for ( i = 0; i < 0x10; ++i ) /*0xc1d9*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xc1ed*/
break; /*0xc1ed*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xc1fb*/
}
}
if ( UsbConfig_17(UsbHcPtr) == -1 ) /*0xc213*/
return -1; /*0xc213*/
v14 = ((unsigned int)DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)) >> 2) & 3; /*0xc228*/
if ( v14 ) /*0xc22b*/
{
v15 = v14 - 1; /*0xc22d*/
if ( v15 ) /*0xc230*/
{
if ( v15 != 1 ) /*0xc235*/
return -1; /*0xc235*/
n256 = 256; /*0xc23b*/
}
else
{
n256 = 512; /*0xc242*/
}
}
else
{
n256 = 1024; /*0xc249*/
}
*(_WORD *)(UsbHcPtr + 48) = n256; /*0xc25c*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI AsyncListSize: %d\n", n256);
v17 = 0; /*0xc265*/
v18 = *(_QWORD *)(UsbHcPtr + 8); /*0xc268*/
for ( *(_DWORD *)(UsbHcPtr + 52) = 0x4000; v17 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(v18 + 4 * v19) = 1 ) /*0xc273*/
v19 = v17++; /*0xc279*/
DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 20, *(_DWORD *)(UsbHcPtr + 8)); /*0xc298*/
DebugLogPrint_6(UsbHcPtr); /*0xc2a0*/
DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, 63); /*0xc2b5*/
if ( *(_BYTE *)(UsbHcPtr + 68) ) /*0xc2ba*/
{
UsbGetInfo_4(UsbHcPtr); /*0xc2c6*/
DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc2db*/
}
DebugLogPrint_21(UsbHcPtr, 0, 17); /*0xc2e9*/
for ( j = 0; j < 0x14; ++j ) /*0xc2ee*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) == 0 ) /*0xc302*/
break; /*0xc302*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xc310*/
}
if ( (*(_BYTE *)(UsbHcPtr + 56) & 0x10) != 0 ) /*0xc322*/
{
v21 = 1; /*0xc324*/
n68 = 68; /*0xc327*/
if ( *(_BYTE *)(UsbHcPtr + 32) ) /*0xc32c*/
{
do /*0xc37a*/
{
if ( (!*(_BYTE *)(UsbHcPtr + 69) || *(unsigned __int8 *)(UsbHcPtr + 69) != v21) /*0xc35a*/
&& (DebugLogPrint_13(UsbHcPtr, n68 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) & 0x1000) == 0 )
{
DebugLogPrint_21(UsbHcPtr, n68, 4096); /*0xc365*/
v5 = 1; /*0xc36a*/
}
++v21; /*0xc371*/
n68 += 4; /*0xc374*/
}
while ( v21 <= *(unsigned __int8 *)(UsbHcPtr + 32) ); /*0xc37a*/
if ( v5 ) /*0xc37f*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0xc38d*/
}
}
*(_DWORD *)(UsbHcPtr + 64) |= 1u; /*0xc393*/
v23 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0xc39e*/
if ( (v23 & 0x80u) == 0 ) /*0xc3a3*/
*(_DWORD *)(UsbRtDispatchTable + 4) = v23 | 0x80; /*0xc3a9*/
DebugLogPrint_21(UsbHcPtr, 64, 1); /*0xc3b7*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x40) != 0 ) /*0xc3c0*/
{
do /*0xc3ee*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 4) != 0 ) /*0xc3d4*/
break; /*0xc3d4*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xc3e2*/
++n0x32; /*0xc3e8*/
}
while ( n0x32 < 0x32 ); /*0xc3ee*/
}
else
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xc3fe*/
}
return 0; /*0xc415*/
}
// Function: UsbGetInfo_4 @ 0xc424 (0x77 bytes)
unsigned __int8 __fastcall UsbGetInfo_4(__int64 UsbHcPtr)
{
unsigned __int8 result; // al
result = *(_BYTE *)(UsbHcPtr + 68); /*0xc42e*/
if ( result ) /*0xc439*/
{
HcPciReadConfig(UsbHcPtr, result); /*0xc43e*/
DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68)); /*0xc473*/
DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc488*/
return *(_BYTE *)(UsbHcPtr + 68); /*0xc48d*/
}
return result; /*0xc495*/
}
// Function: EhciProcessPeriodicList @ 0xc49c (0xf4 bytes)
char __fastcall EhciProcessPeriodicList(_BYTE *UsbHcPtr)
{
__int64 UsbRtDispatchTable; // rax
char v4; // si
__int64 PortNum; // rdx
__int64 EndpointAddr; // r8
unsigned __int8 i; // di
char i_1; // al
__int64 UsbRtDispatchTable_1; // rax
if ( (HcCheckInit((__int64)UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xc4d9*/
|| (UsbHcPtr[64] & 1) == 0
|| (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 0x1000) != 0 )
{
return -1; /*0xc4b8*/
}
UsbRtDispatchTable = UsbRtDispatchTable; /*0xc4db*/
v4 = *UsbHcPtr | 0x80; /*0xc4e5*/
if ( !*(_BYTE *)(UsbRtDispatchTable + 29872) ) /*0xc4e9*/
{
*(_BYTE *)(UsbRtDispatchTable + 30480) = 1; /*0xc4f2*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0xc4f9*/
do /*0xc552*/
{
DebugLogPrint_14((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 4, 4); /*0xc510*/
for ( i = 1; i <= UsbHcPtr[32]; ++i ) /*0xc518*/
{
i_1 = UsbHcPtr[69]; /*0xc51e*/
if ( !i_1 || i_1 != i ) /*0xc528*/
{
LOBYTE(EndpointAddr) = i; /*0xc52a*/
LOBYTE(PortNum) = v4; /*0xc52d*/
DebugLogPrint_3((__int64)UsbHcPtr, PortNum, EndpointAddr); /*0xc533*/
}
}
}
while ( (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 4) != 0 ); /*0xc552*/
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xc554*/
*(_BYTE *)(UsbRtDispatchTable + 30480) = 0; /*0xc55b*/
*(_BYTE *)(UsbRtDispatchTable_1 + 29872) = 0; /*0xc562*/
}
DebugLogPrint_14((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 8, 5); /*0xc579*/
return 0; /*0xc58a*/
}
// Function: UsbGetInfo_7 @ 0xc590 (0x66 bytes)
char __fastcall UsbGetInfo_7(__int64 UsbHcPtr)
{
char v2; // bl
__int16 v3; // ax
v2 = DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)); /*0xc5b0*/
v3 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4); /*0xc5b2*/
if ( (v2 & 0x10) == 0 || (v3 & 0x4000) != 0 ) /*0xc5c0*/
return -((DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 20) & 0xFFFFF000LL) != *(_QWORD *)(UsbHcPtr + 8)); /*0xc5e9*/
else
return 0; /*0xc5c2*/
}
// Function: EhciStopHc @ 0xc5f8 (0x19e bytes)
char __fastcall EhciStopHc(__int64 UsbHcPtr)
{
unsigned __int64 *v2; // rsi
unsigned __int64 v3; // rdx
__int64 TmpRdx; // rdx
__int64 TmpR8; // r8
unsigned __int8 i; // di
unsigned __int8 j; // di
unsigned __int16 v8; // cx
__int64 k; // r8
__int64 v10; // rax
unsigned __int64 v11; // rcx
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc61f*/
return -1; /*0xc61f*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xc62d*/
return -1; /*0xc62d*/
v2 = *(unsigned __int64 **)(UsbHcPtr + 40); /*0xc63a*/
v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xc63e*/
if ( (unsigned __int64)v2 < v3 /*0xc661*/
|| (unsigned __int64)(v2 + 3) > v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12) )
{
return -1; /*0xc779*/
}
if ( UsbGetInfo_7(UsbHcPtr) ) /*0xc66a*/
{
UsbGetInfo_4(UsbHcPtr); /*0xc767*/
}
else
{
for ( i = 1; i <= *(_BYTE *)(UsbHcPtr + 32); ++i ) /*0xc67a*/
{
LOBYTE(TmpR8) = i; /*0xc682*/
LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0xc685*/
UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0xc68b*/
}
if ( !*(_BYTE *)(UsbHcPtr + 69) ) /*0xc699*/
{
DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xc6a7*/
for ( j = 0; j < 0x10u; ++j ) /*0xc6ac*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xc6c2*/
break; /*0xc6c2*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xc6d0*/
}
if ( UsbConfig_17(UsbHcPtr) ) /*0xc6e2*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 1155, (__int64)"Status == 0x000"); /*0xc6fe*/
}
UsbGetInfo_4(UsbHcPtr); /*0xc708*/
v8 = 0; /*0xc70d*/
for ( k = *(_QWORD *)(UsbHcPtr + 8); v8 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(k + 4 * v10) = 1 ) /*0xc715*/
v10 = v8++; /*0xc71c*/
v11 = v2[1]; /*0xc72c*/
if ( v11 ) /*0xc733*/
FwVolConfig(v11, 6u); /*0xc73a*/
FwVolConfig(*v2, 4u); /*0xc747*/
FwVolConfig((unsigned __int64)v2, 1u); /*0xc751*/
UsbServiceHcPolling(UsbHcPtr, 3u); /*0xc75b*/
}
*(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0xc76c*/
UsbFindActiveHc(); /*0xc770*/
return 0; /*0xc78f*/
}
// Function: EhciResetHc1 @ 0xc798 (0x40 bytes)
char __fastcall EhciResetHc1(__int64 UsbHcPtr)
{
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc7a9*/
return -1; /*0xc7ab*/
DebugLogPrint_19(UsbHcPtr, 8, 5); /*0xc7bb*/
UsbConfig_7(UsbHcPtr); /*0xc7c3*/
UsbGetInfo_6(UsbHcPtr); /*0xc7cb*/
return 0; /*0xc7d2*/
}
// Function: EhciResetHc2 @ 0xc7d8 (0x40 bytes)
char __fastcall EhciResetHc2(__int64 UsbHcPtr)
{
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc7e9*/
return -1; /*0xc7eb*/
UsbConfig_11(UsbHcPtr); /*0xc7f2*/
UsbGetInfo_5(UsbHcPtr); /*0xc7fa*/
DebugLogPrint_21(UsbHcPtr, 8, 5); /*0xc80b*/
return 0; /*0xc812*/
}
// Function: EhciResetHcFull @ 0xc818 (0x2df bytes)
char __fastcall EhciResetHcFull(__int64 UsbHcPtr)
{
unsigned __int8 v3; // al
int v4; // eax
unsigned __int8 v5; // al
unsigned __int8 v6; // al
int Config; // eax
unsigned __int8 v8; // al
__int64 n2047; // rdx
__int16 v10; // di
__int64 n65528; // r8
__int64 v12; // rsi
__int64 n8; // rbp
int *v14; // r15
int i; // eax
__int64 v16; // rdi
int v17; // r14d
__int64 PortNum; // rdx
__int64 EndpointAddr; // r8
__int64 UsbRtDispatchTable; // rax
unsigned __int8 v21; // di
char v22; // al
int v23; // eax
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc83b*/
return -1; /*0xc83d*/
v3 = *(_BYTE *)(UsbHcPtr + 68); /*0xc844*/
if ( v3 && (v4 = HcPciReadConfig(UsbHcPtr, (unsigned int)v3 + 4), ((unsigned __int16)v4 & HIWORD(v4) & 0x2000) != 0) ) /*0xc86d*/
{
v5 = *(_BYTE *)(UsbHcPtr + 68); /*0xc86f*/
if ( v5 ) /*0xc874*/
{
HcPciReadConfig(UsbHcPtr, v5 + 4); /*0xc87f*/
DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc89b*/
}
v6 = *(_BYTE *)(UsbHcPtr + 68); /*0xc8a0*/
if ( v6 ) /*0xc8a5*/
Config = HcPciReadConfig(UsbHcPtr, v6); /*0xc8b2*/
else
Config = -1; /*0xc8a7*/
*(_DWORD *)(UsbHcPtr + 64) |= 0x20u; /*0xc8b7*/
if ( (Config & 0x1000000) != 0 ) /*0xc8c9*/
{
*(_DWORD *)(UsbRtDispatchTable + 4) &= ~1u; /*0xc8cb*/
EhciStopHc(UsbHcPtr); /*0xc8cf*/
}
else
{
*(_DWORD *)(UsbRtDispatchTable + 4) |= 1u; /*0xc8d6*/
UsbDriverEntry(UsbHcPtr); /*0xc8da*/
}
*(_DWORD *)(UsbHcPtr + 64) &= ~0x20u; /*0xc8df*/
}
else if ( UsbGetInfo_7(UsbHcPtr) == -1 ) /*0xc8f2*/
{
v8 = *(_BYTE *)(UsbHcPtr + 68); /*0xc8f4*/
if ( v8 ) /*0xc8f9*/
{
HcPciReadConfig(UsbHcPtr, v8 + 4); /*0xc908*/
DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc91f*/
}
}
else if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 ) /*0xc92d*/
{
while ( 1 ) /*0xc946*/
{
while ( 1 ) /*0xc942*/
{
v10 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4); /*0xc942*/
if ( (v10 & 0x10) == 0 ) /*0xc946*/
break; /*0xc946*/
*(_DWORD *)(UsbRtDispatchTable + 4) &= ~1u; /*0xc952*/
EhciDriverEntry(UsbHcPtr, n2047, n65528); /*0xc956*/
EhciProcessPeriodicList((_BYTE *)UsbHcPtr); /*0xc95e*/
*(_DWORD *)(UsbRtDispatchTable + 4) |= 1u; /*0xc96a*/
}
if ( (v10 & 0x1000) != 0 ) /*0xc974*/
break; /*0xc974*/
if ( *(_BYTE *)(UsbRtDispatchTable + 30481) == 1 && (v10 & 1) != 0 ) /*0xc992*/
{
DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, 1); /*0xc9a8*/
if ( (v10 & 0x4000) != 0 && (DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)) & 0x10) != 0 ) /*0xc9c1*/
{
if ( *(_QWORD *)(UsbHcPtr + 136) ) /*0xc9c7*/
UsbConfig_2(UsbHcPtr); /*0xc9d4*/
v12 = 0; /*0xc9d9*/
n8 = 8; /*0xc9db*/
do /*0xca27*/
{
v14 = (int *)(v12 + *(_QWORD *)(UsbHcPtr + 8)); /*0xc9e2*/
for ( i = *v14; (i & 1) == 0; i = *(_DWORD *)v16 ) /*0xc9e5*/
{
v16 = i & 0xFFFFFFE0; /*0xc9f1*/
v17 = *(_DWORD *)v16; /*0xc9f4*/
if ( (*(_DWORD *)v16 & 6) == 2 && byte_40[(i & 0xFFFFFFE0) + 25] == 1 ) /*0xca04*/
{
UsbConfig_15(UsbHcPtr, v16); /*0xca0c*/
if ( *(_DWORD *)v16 != v17 ) /*0xca14*/
v16 = (__int64)v14; /*0xca16*/
}
}
v12 += 4; /*0xca1f*/
--n8; /*0xca23*/
}
while ( n8 ); /*0xca27*/
}
}
else
{
if ( (v10 & 4) == 0 || *(_BYTE *)(UsbRtDispatchTable + 29872) == 1 ) /*0xca3f*/
return 0; /*0xca3f*/
(*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0xca51*/
DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, 4); /*0xca67*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xca6c*/
v21 = 1; /*0xca73*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0xca76*/
if ( *(_BYTE *)(UsbHcPtr + 32) ) /*0xca7d*/
{
do /*0xcaa6*/
{
v22 = *(_BYTE *)(UsbHcPtr + 69); /*0xca83*/
if ( !v22 || v22 != v21 ) /*0xca8d*/
{
LOBYTE(EndpointAddr) = v21; /*0xca91*/
LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0xca94*/
DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0xca9a*/
}
++v21; /*0xca9f*/
}
while ( v21 <= *(_BYTE *)(UsbHcPtr + 32) ); /*0xcaa6*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xcaa8*/
}
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0xcaaf*/
}
}
v23 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4); /*0xcac5*/
DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, v23); /*0xcad7*/
}
return 0; /*0xcaed*/
}
// Function: UsbDriverEntry @ 0xcaf8 (0xac bytes)
char __fastcall UsbDriverEntry(__int64 UsbHcPtr)
{
__int64 UsbRtDispatchTable; // rdx
__int64 n448; // rbx
__int64 n54; // rdi
__int64 n65528; // r8
__int64 i; // rcx
char TmpR8; // r8
UsbRtDispatchTable = UsbRtDispatchTable; /*0xcb07*/
n448 = 448; /*0xcb11*/
n54 = 54; /*0xcb16*/
do /*0xcb8b*/
{
n65528 = *(unsigned int *)(n448 + UsbRtDispatchTable + 3056); /*0xcb1b*/
if ( (*(_BYTE *)(n448 + UsbRtDispatchTable + 3056) & 3) == 3 ) /*0xcb2b*/
{
i = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) /*0xcb41*/
+ 8LL * (*(unsigned __int8 *)(n448 + UsbRtDispatchTable + 3067) - 1));
if ( *(_BYTE *)(i + 1) == 16 && (n65528 & 1) != 0 ) /*0xcb4f*/
{
n65528 = 65528; /*0xcb55*/
if ( ((*(_WORD *)(UsbHcPtr + 34) ^ *(_WORD *)(i + 34)) & 0xFFF8) == 0 ) /*0xcb63*/
{
TmpR8 = *(_BYTE *)(n448 + UsbRtDispatchTable + 3069); /*0xcb65*/
LOBYTE(UsbRtDispatchTable) = *(_BYTE *)(n448 + UsbRtDispatchTable + 3068); /*0xcb6d*/
DebugLogPrint_4(i, UsbRtDispatchTable, TmpR8); /*0xcb74*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xcb79*/
}
}
}
n448 += 448; /*0xcb80*/
--n54; /*0xcb87*/
}
while ( n54 ); /*0xcb8b*/
return EhciDriverEntry(UsbHcPtr, UsbRtDispatchTable, n65528); /*0xcb9a*/
}
// Function: DebugLogPrint_10 @ 0xcba4 (0xb3 bytes)
char __fastcall sub_CBA4(__int64 a1, unsigned __int8 a2)
{
int v2; // esi
unsigned __int16 v4; // ax
int v5; // edi
unsigned __int16 i; // si
v2 = a2; /*0xcbb3*/
v4 = 4 * (a2 + 16); /*0xcbbc*/
if ( (*(_DWORD *)(a1 + 56) & 0xF000) != 0 ) /*0xcbc7*/
{
v5 = v4; /*0xcbcd*/
if ( (DebugLogPrint_13(a1, v4 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 1) == 0 ) /*0xcbd9*/
return -1; /*0xcbdd*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Release EHCI port %d\n", v2); /*0xcbed*/
DebugLogPrint_21(a1, v5, 0x2000); /*0xcbfd*/
for ( i = 0; i < 0xC8u; ++i ) /*0xcc02*/
{
if ( (DebugLogPrint_13(a1, v5 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 2) != 0 ) /*0xcc14*/
break; /*0xcc14*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcc22*/
}
DebugLogPrint_21(a1, v5, 2); /*0xcc40*/
}
return 0; /*0xcc51*/
}
// Function: EhciPortStatus @ 0xcc58 (0x1f4 bytes)
int __fastcall EhciPortStatus(__int64 a1, unsigned __int8 a2, char a3)
{
int v3; // ebp
int n64; // ebx
unsigned __int16 v7; // r9
int result; // eax
char v9; // al
int v10; // r15d
int v11; // eax
__int16 v12; // si
__int64 v13; // rdx
void (__fastcall *v14)(__int64, __int64, char *); // rax
char v15; // r14
unsigned __int8 n2; // cl
unsigned int n64_1; // edx
int n64_2; // ecx
int n64_3; // edx
int n64_4; // r8d
int n64_5; // ecx
int n64_6; // edx
char n2_1; // [rsp+58h] [rbp+10h] BYREF
v3 = a2; /*0xcc6e*/
n64 = 64; /*0xcc77*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xcc8d*/
return 255; /*0xcc8f*/
v9 = *(_BYTE *)(a1 + 69); /*0xcc99*/
if ( v9 && v9 == (_BYTE)v3 ) /*0xcca3*/
return 0; /*0xcca5*/
v10 = v7; /*0xccb3*/
v11 = DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0xccba*/
v12 = v11; /*0xccd0*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Ehci port[%d] status: %08x\n", v3, v11);
if ( (v12 & 1) != 0 && (v12 & 0xC00) == 0x400 ) /*0xcceb*/
{
DebugLogPrint_10(a1, v3); /*0xccf3*/
v12 = DebugLogPrint_13(a1, v10 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0xcd07*/
}
if ( (v12 & 2) != 0 ) /*0xcd10*/
{
n64 = 80; /*0xcd12*/
if ( a3 == 1 ) /*0xcd1b*/
DebugLogPrint_21(a1, v10, 2); /*0xcd27*/
}
if ( (v12 & 1) != 0 ) /*0xcd30*/
{
n64 |= 1u; /*0xcd36*/
if ( (v12 & 4) != 0 ) /*0xcd3d*/
{
v14 = (void (__fastcall *)(__int64, __int64, char *))qword_1C3D0[0]; /*0xcd3f*/
v15 = 0; /*0xcd46*/
n2 = 2; /*0xcd49*/
n2_1 = 2; /*0xcd4b*/
if ( qword_1C3D0[0] ) /*0xcd52*/
{
do /*0xcd76*/
{
LOBYTE(v13) = v3; /*0xcd59*/
v14(a1, v13, &n2_1); /*0xcd5f*/
v14 = (void (__fastcall *)(__int64, __int64, char *))qword_1C3D0[(unsigned __int8)++v15]; /*0xcd6f*/
}
while ( v14 ); /*0xcd76*/
n2 = n2_1; /*0xcd78*/
}
if ( n2 ) /*0xcd85*/
{
if ( n2 == 1 ) /*0xcd8a*/
{
n64 |= 4u; /*0xcda3*/
}
else if ( n2 != 2 ) /*0xcd8f*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Get the undefined speed of the root hub port %x\n", n2); /*0xcd9c*/
}
}
else
{
n64 |= 2u; /*0xcda8*/
}
n64 |= 0x20u; /*0xcdab*/
}
else if ( *(_BYTE *)(UsbRtDispatchTable + 30480) == 1 && (v12 & 2) == 0 ) /*0xcdc3*/
{
n64 |= 0x10u; /*0xcdc5*/
}
}
n64_1 = n64 & 0xFFFFFFBF; /*0xcdd2*/
if ( (v12 & 0x2000) == 0 ) /*0xcddc*/
n64_1 = n64; /*0xcddc*/
n64_2 = n64_1 | 0x800; /*0xcde1*/
if ( (v12 & 0x1000) == 0 ) /*0xcdea*/
n64_2 = n64_1; /*0xcdea*/
n64_3 = n64_2 | 0x200; /*0xcdef*/
if ( (v12 & 0x10) == 0 ) /*0xcdf7*/
n64_3 = n64_2; /*0xcdf7*/
n64_4 = n64_3 | 0x100; /*0xce02*/
if ( (v12 & 0x80u) == 0 ) /*0xce09*/
n64_4 = n64_3; /*0xce09*/
n64_5 = n64_4 | 0x400; /*0xce12*/
if ( (v12 & 0x100) == 0 ) /*0xce1a*/
n64_5 = n64_4; /*0xce1a*/
n64_6 = n64_5 | 0x1000; /*0xce20*/
if ( (v12 & 8) == 0 ) /*0xce25*/
n64_6 = n64_5; /*0xce25*/
result = n64_6 | 0x4000; /*0xce2a*/
if ( (v12 & 0x20) == 0 ) /*0xce32*/
return n64_6; /*0xce32*/
return result; /*0xce3f*/
}
// Function: EhciPortReset @ 0xce4c (0x9e bytes)
char __fastcall EhciPortReset(__int64 a1)
{
unsigned __int16 v2; // r9
char v3; // r10
unsigned int n0x64; // edi
int v6; // esi
n0x64 = 0; /*0xce70*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xce75*/
return -1; /*0xce77*/
if ( !*(_BYTE *)(a1 + 69) || *(_BYTE *)(a1 + 69) != v3 ) /*0xce85*/
{
v6 = v2; /*0xce8e*/
if ( (DebugLogPrint_13(a1, v2 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) != 0 ) /*0xce9b*/
{
DebugLogPrint_19(a1, v6, 4); /*0xcea8*/
do /*0xced6*/
{
if ( (DebugLogPrint_13(a1, v6 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) == 0 ) /*0xcebd*/
break; /*0xcebd*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcecb*/
++n0x64; /*0xced1*/
}
while ( n0x64 < 0x64 ); /*0xced6*/
}
}
return 0; /*0xcee4*/
}
// Function: EhciCtrlTransfer @ 0xceec (0x1b8 bytes)
char __fastcall EhciCtrlTransfer(__int64 a1, unsigned __int8 a2)
{
unsigned __int16 v4; // r9
unsigned int n0x14; // esi
int v7; // edi
unsigned int i; // ebp
__int64 n50000; // rcx
__int64 UsbRtDispatchTable; // rcx
n0x14 = 0; /*0xcf1a*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xcf1f*/
return -1; /*0xcf1f*/
v7 = v4; /*0xcf2f*/
if ( (DebugLogPrint_13(a1, v4 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) != 0 ) /*0xcf3c*/
{
DebugLogPrint_19(a1, v7, 4); /*0xcf49*/
for ( i = 0; i < 0x64; ++i ) /*0xcf4e*/
{
if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) == 0 ) /*0xcf60*/
break; /*0xcf60*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcf6e*/
}
}
DebugLogPrint_21(a1, v7, 256); /*0xcf88*/
if ( (*(_BYTE *)(a1 + 64) & 0x40) == 0 || (n50000 = 3000, a2 != 1) ) /*0xcf9c*/
n50000 = 50000; /*0xcf9e*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(n50000); /*0xcfaa*/
DebugLogPrint_19(a1, v7, 256); /*0xcfb8*/
if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 1) == 0 ) /*0xcfcd*/
return -1; /*0xcfcd*/
do /*0xd002*/
{
if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 0x104) == 4 ) /*0xcfe9*/
break; /*0xcfe9*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcff7*/
++n0x14; /*0xcffd*/
}
while ( n0x14 < 0x14 ); /*0xd002*/
if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 0x100) != 0 ) /*0xd014*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0xd016*/
if ( *(_BYTE *)(UsbRtDispatchTable + 104) < 0x30u ) /*0xd021*/
{
*(_WORD *)(UsbRtDispatchTable + 2LL * *(unsigned __int8 *)(UsbRtDispatchTable + 104) + 8) = 37; /*0xd030*/
++*(_BYTE *)(UsbRtDispatchTable + 104); /*0xd035*/
}
return -1; /*0xcf23*/
}
if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) == 0 ) /*0xd04d*/
{
if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 1) != 0 ) /*0xd05f*/
DebugLogPrint_10(a1, a2); /*0xd06b*/
return -1; /*0xd070*/
}
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0xd081*/
return 0; /*0xd09d*/
}
// Function: EhciCtrlIn @ 0xd0a4 (0x4f bytes)
char __fastcall EhciCtrlIn(__int64 a1)
{
__int64 v1; // r9
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(v1 + 64) & 1) == 0 ) /*0xd0c1*/
return -1; /*0xd0b8*/
if ( *(_QWORD *)(v1 + 120) ) /*0xd0c3*/
DebugLogPrint_15(v1, *(unsigned __int8 *)(v1 + 68) + 4); /*0xd0e7*/
return 0; /*0xd0ee*/
}
// Function: EhciPortChangeDetect @ 0xd0f4 (0x167 bytes)
char __fastcall EhciPortChangeDetect(_BYTE *UsbHcPtr)
{
unsigned __int8 n0x10; // si
unsigned __int8 i; // bp
int v5; // r14d
int v6; // eax
char v7; // bl
unsigned __int8 j; // bl
n0x10 = 0; /*0xd115*/
if ( (HcCheckInit((__int64)UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xd13d*/
|| (UsbHcPtr[64] & 1) == 0
|| (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 0x1000) != 0 )
{
return -1; /*0xd11c*/
}
for ( i = 1; i <= UsbHcPtr[32]; ++i ) /*0xd142*/
{
v5 = (unsigned __int16)(4 * (i + 16)); /*0xd15f*/
v6 = DebugLogPrint_13((__int64)UsbHcPtr, v5 + (unsigned int)(unsigned __int8)UsbHcPtr[50]); /*0xd166*/
v7 = v6; /*0xd17d*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI PortSts[%x] %x \n", i, v6); /*0xd17f*/
if ( (v7 & 0x84) == 4 ) /*0xd18a*/
{
DebugLogPrint_19((__int64)UsbHcPtr, v5, 7340032); /*0xd198*/
DebugLogPrint_21((__int64)UsbHcPtr, v5, 128); /*0xd1a9*/
for ( j = 0; j < 0x64u; ++j ) /*0xd1ae*/
{
if ( (DebugLogPrint_13((__int64)UsbHcPtr, v5 + (unsigned int)(unsigned __int8)UsbHcPtr[50]) & 0x80u) != 0LL ) /*0xd1c2*/
break; /*0xd1c2*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xd1d0*/
}
}
}
DebugLogPrint_19((__int64)UsbHcPtr, 0, 1); /*0xd1f3*/
do /*0xd226*/
{
if ( (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 0x1000) != 0 ) /*0xd20b*/
break; /*0xd20b*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xd219*/
++n0x10; /*0xd21f*/
}
while ( n0x10 < 0x10u ); /*0xd226*/
UsbGetInfo_4((__int64)UsbHcPtr); /*0xd22d*/
*((_DWORD *)UsbHcPtr + 16) = *((_DWORD *)UsbHcPtr + 16) & 0xFFFFFFFC | 2; /*0xd23b*/
return 0; /*0xd254*/
}
// Function: HubGetPortAddress @ 0xd25c (0x67 bytes)
__int16 __fastcall HubGetPortAddress(_BYTE *i)
{
_BYTE *i_1; // rbx
__int64 j; // rax
i_1 = i; /*0xd269*/
if ( (*i & 3) != 0 ) /*0xd26c*/
{
for ( j = FwVolDriverEntry(16, 0, i[12], 0); j; j = FwVolDriverEntry(16, 0, *(_BYTE *)(j + 12), 0) ) /*0xd289*/
{
if ( (*(_BYTE *)(j + 14) & 0x47) == 0 ) /*0xd296*/
return (unsigned __int8)i_1[12] | ((unsigned __int8)i_1[13] << 7); /*0xd2be*/
i_1 = (_BYTE *)j; /*0xd2a3*/
}
}
return 0; /*0xd278*/
}
// Function: DebugLogPrint_7 @ 0xd2c4 (0xe4 bytes)
__int64 __fastcall DebugLogPrint_7(__int64 UsbHcPtr, __int64 a2)
{
unsigned int i_1; // r14d
unsigned __int16 n255; // bp
unsigned int i; // esi
i_1 = 100 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0xd2f8*/
DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 24, a2); /*0xd2ff*/
*(_BYTE *)(a2 + 89) = 1; /*0xd306*/
*(_DWORD *)a2 = a2 | 2; /*0xd310*/
n255 = (unsigned __int8)UsbConfig_11(UsbHcPtr); /*0xd317*/
if ( n255 == 255 ) /*0xd324*/
return 255; /*0xd326*/
for ( i = 0; !i_1 || i < i_1; ++i ) /*0xd32c*/
{
UsbConfig_15(UsbHcPtr, a2); /*0xd33e*/
if ( !*(_BYTE *)(a2 + 89) ) /*0xd343*/
break; /*0xd343*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xd355*/
}
UsbConfig_7(UsbHcPtr); /*0xd362*/
if ( *(_BYTE *)(a2 + 89) == 1 ) /*0xd36b*/
{
*(_BYTE *)(a2 + 89) = 0; /*0xd374*/
n255 = 255; /*0xd37c*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI Time-Out\n"); /*0xd37f*/
}
EhciResetHcFull(UsbHcPtr); /*0xd387*/
return n255; /*0xd39e*/
}
// Function: EhciCtrlReset @ 0xd3a8 (0x326 bytes)
__int64 __fastcall EhciCtrlReset(
__int64 UsbHcPtr,
__int64 i,
__int16 a3,
__int16 a4,
__int16 a5,
__int64 a6,
unsigned __int16 n0x4000)
{
_WORD *v12; // rax
unsigned __int64 v13; // r15
unsigned __int16 n0x4000_1; // bp
__int64 v15; // rax
unsigned __int64 v16; // rdi
_DWORD *v17; // r13
__int64 v18; // r12
__int64 v19; // rsi
int n0x2000; // eax
int v21; // eax
int v22; // ecx
int v23; // r11d
int v24; // eax
int v25; // eax
__int16 v26; // bx
__int64 UsbRtDispatchTable; // rax
char v28; // cl
int n0x2000_1; // [rsp+30h] [rbp-48h]
int v30[2]; // [rsp+38h] [rbp-40h] BYREF
__int64 v31; // [rsp+40h] [rbp-38h] BYREF
char v32; // [rsp+90h] [rbp+18h]
v32 = a3; /*0xd3b7*/
*(_QWORD *)v30 = 0; /*0xd3d0*/
v31 = 0; /*0xd3d8*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xd423*/
|| (UsbValidateDeviceEntry(i) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0
|| (*(_BYTE *)i & 3) == 0 )
{
return 0; /*0xd423*/
}
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xd431*/
v12 = (_WORD *)UsbConfig_1(1u); /*0xd438*/
v13 = (unsigned __int64)v12; /*0xd43d*/
if ( !v12 ) /*0xd443*/
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 2364, (__int64)"DevRequest"); /*0xd458*/
return 0; /*0xd3f0*/
}
n0x4000_1 = n0x4000; /*0xd45f*/
*v12 = a3; /*0xd46c*/
v12[2] = a4; /*0xd46f*/
v12[1] = a5; /*0xd47b*/
v12[3] = n0x4000; /*0xd480*/
v15 = UsbConfig_1(0xAu); /*0xd485*/
v16 = v15; /*0xd48d*/
if ( !v15 ) /*0xd493*/
return 0; /*0xd495*/
v17 = (_DWORD *)(v15 + 128); /*0xd49e*/
*(_QWORD *)(v15 + 8) = 0x40000000; /*0xd4a5*/
*(_DWORD *)(v15 + 4) = 0; /*0xd4b2*/
*(_DWORD *)(v15 + 16) = 1; /*0xd4b6*/
v18 = v15 + 192; /*0xd4b9*/
*(_QWORD *)(v15 + 20) = 1; /*0xd4bd*/
v19 = v15 + 256; /*0xd4c1*/
*(_QWORD *)(v15 + 28) = 0; /*0xd4c6*/
*(_QWORD *)(v15 + 36) = 0; /*0xd4ca*/
*(_DWORD *)(v15 + 44) = 0; /*0xd4ce*/
*(_BYTE *)(v15 + 90) = 0; /*0xd4d2*/
n0x2000 = 0x2000; /*0xd4d6*/
if ( *(_BYTE *)(i + 14) ) /*0xd4db*/
{
n0x2000_1 = (*(_BYTE *)(i + 14) & 1 | 0x8000) << 12; /*0xd4f1*/
*(_DWORD *)(v16 + 8) = ((unsigned __int16)HubGetPortAddress((_BYTE *)i) | 0x4000) << 16; /*0xd504*/
n0x2000 = n0x2000_1; /*0xd50a*/
}
v21 = n0x2000 | 0x4000; /*0xd50e*/
v22 = v21 | 0x8000; /*0xd51f*/
if ( *(_WORD *)(UsbHcPtr + 112) == 4358 ) /*0xd52b*/
v22 = v21; /*0xd52b*/
*(_DWORD *)(v16 + 4) = *(unsigned __int8 *)(i + 10) | (*(unsigned __int16 *)(i + 16) << 16) | v22; /*0xd53d*/
v17[2] = 560768; /*0xd543*/
EhciBuildSgList((__int64)v17, v13, 8u); /*0xd54b*/
if ( n0x4000 ) /*0xd558*/
{
*(_DWORD *)(v18 + 8) = -2147447424; /*0xd56d*/
v24 = *(_DWORD *)(v18 + 8); /*0xd576*/
if ( v32 >= 0 ) /*0xd57b*/
v24 = -2147447680; /*0xd57b*/
*(_DWORD *)(v18 + 8) = v24; /*0xd581*/
*(_DWORD *)(v18 + 8) |= n0x4000 << 16; /*0xd593*/
ElibReadNvStore(UsbHcPtr, v32 & 0x80, a6, n0x4000, v30, (__int64)&v31); /*0xd5af*/
EhciBuildSgList(v18, v30[0], n0x4000); /*0xd5bf*/
v23 = 0; /*0xd5c4*/
}
*(_DWORD *)(v19 + 8) = -2147447424; /*0xd5d4*/
v25 = *(_DWORD *)(v19 + 8); /*0xd5db*/
if ( v32 < 0 ) /*0xd5de*/
v25 = -2147447680; /*0xd5de*/
*(_DWORD *)(v19 + 28) = v23; /*0xd5e1*/
*(_QWORD *)(v19 + 12) = 0; /*0xd5e5*/
*(_QWORD *)(v19 + 20) = 0; /*0xd5ea*/
*(_DWORD *)(v19 + 8) = v25; /*0xd5ef*/
*(_DWORD *)(v19 + 4) = 1; /*0xd5f7*/
*(_QWORD *)(v16 + 81) = v17; /*0xd5fa*/
*(_DWORD *)(v16 + 16) = (_DWORD)v17; /*0xd5fe*/
if ( n0x4000 ) /*0xd605*/
{
*v17 = v18; /*0xd607*/
*(_DWORD *)v18 = v19; /*0xd60b*/
}
else
{
*v17 = v19; /*0xd611*/
}
*(_DWORD *)v19 = 1; /*0xd618*/
v26 = DebugLogPrint_7(UsbHcPtr, v16); /*0xd625*/
*(_QWORD *)(v16 + 81) = 0; /*0xd628*/
*(_DWORD *)(v16 + 16) = 1; /*0xd630*/
if ( n0x4000 ) /*0xd636*/
{
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v31); /*0xd644*/
n0x4000_1 = n0x4000 - (*(_WORD *)(v18 + 10) & 0x7FFF); /*0xd656*/
}
UsbRtDispatchTable = UsbRtDispatchTable; /*0xd659*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0xd660*/
v28 = *(_BYTE *)(UsbRtDispatchTable + 30472); /*0xd667*/
if ( v26 ) /*0xd670*/
{
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xd672*/
n0x4000_1 = 0; /*0xd679*/
}
if ( (*(_BYTE *)(v16 + 90) & 0x40) != 0 ) /*0xd680*/
{
n0x4000_1 = 0; /*0xd685*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 4u; /*0xd689*/
*(_BYTE *)(UsbRtDispatchTable + 30472) = v28 | 4; /*0xd690*/
}
FwVolConfig(v16, 0xAu); /*0xd69e*/
FwVolConfig(v13, 1u); /*0xd6a8*/
return n0x4000_1; /*0xd6c1*/
}
// Function: EhciCtrlDispatch @ 0xd6d0 (0x415 bytes)
__int64 __fastcall EhciCtrlDispatch(__int64 UsbHcPtr, __int64 i, signed __int8 a3, __int64 a4, unsigned int n0x4000)
{
char *dst_1; // rdi
unsigned __int64 n0x80; // rcx
unsigned __int16 v12; // r15
unsigned __int8 v13; // dl
__int64 v14; // rax
unsigned __int64 v15; // rsi
__int64 v16; // r12
char v17; // cl
unsigned int n0x4000_2; // edx
int n0x4000_3; // eax
int v20; // r15d
unsigned int v21; // r15d
unsigned int n0x4000_5; // r15d
int dst_2; // edx
__int16 v24; // ax
__int64 UsbRtDispatchTable; // rax
__int64 UsbRtDispatchTable_1; // rax
unsigned __int64 v27; // rdx
unsigned __int8 v28; // [rsp+30h] [rbp-58h]
char v29; // [rsp+30h] [rbp-58h]
unsigned __int8 v30; // [rsp+31h] [rbp-57h]
unsigned int n0x4000_4; // [rsp+34h] [rbp-54h]
char *dst; // [rsp+38h] [rbp-50h] BYREF
unsigned int v33; // [rsp+40h] [rbp-48h]
unsigned int n0x4000_1; // [rsp+44h] [rbp-44h]
int v35; // [rsp+48h] [rbp-40h]
int v36; // [rsp+4Ch] [rbp-3Ch]
__int64 v37; // [rsp+50h] [rbp-38h] BYREF
dst = 0; /*0xd6f6*/
dst_1 = 0; /*0xd6fa*/
v37 = 0; /*0xd6fd*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xd748*/
|| (UsbValidateDeviceEntry(i) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0
|| (*(_BYTE *)i & 3) == 0 )
{
return 0; /*0xd748*/
}
if ( *(_WORD *)(UsbHcPtr + 112) == 4332 && *(_WORD *)(UsbHcPtr + 114) == 0x816D && (a4 & 3) != 0 ) /*0xd76c*/
{
if ( n0x4000 >= 0x4000 ) /*0xd775*/
LOWORD(n0x80) = 512; /*0xd785*/
else
n0x80 = ((unsigned __int64)(unsigned __int16)n0x4000 + 31) >> 5; /*0xd77f*/
dst_1 = (char *)UsbConfig_1(n0x80); /*0xd78f*/
}
n0x4000_1 = n0x4000; /*0xd799*/
v33 = 0; /*0xd79e*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xd7a3*/
if ( a3 >= 0 ) /*0xd7ad*/
{
v12 = *(_WORD *)(i + 106); /*0xd7b9*/
v13 = *(_BYTE *)(i + 70); /*0xd7be*/
}
else
{
v12 = *(_WORD *)(i + 104); /*0xd7af*/
v13 = *(_BYTE *)(i + 69); /*0xd7b4*/
}
v28 = v13; /*0xd7c1*/
if ( !v12 ) /*0xd7c9*/
return 0; /*0xd7c9*/
v14 = UsbConfig_1(6u); /*0xd7d4*/
v15 = v14; /*0xd7d9*/
if ( !v14 ) /*0xd7df*/
return 0; /*0xd716*/
v16 = v14 + 128; /*0xd7e5*/
ElibReadNvStore(UsbHcPtr, a3, a4, n0x4000, &dst, (__int64)&v37); /*0xd814*/
if ( !n0x4000 ) /*0xd81c*/
goto LABEL_47; /*0xd81c*/
v35 = v15 | 2; /*0xd831*/
v17 = a3 | v28; /*0xd846*/
v36 = (v12 << 16) | ((v28 | 0x40) << 8); /*0xd849*/
v29 = a3 | v28; /*0xd84d*/
n0x4000_2 = n0x4000; /*0xd851*/
while ( 1 ) /*0xd862*/
{
n0x4000_3 = 0x4000; /*0xd862*/
if ( n0x4000_2 < 0x4000 ) /*0xd865*/
n0x4000_3 = n0x4000_2; /*0xd865*/
n0x4000_4 = n0x4000_3; /*0xd86d*/
v30 = FwVolDriverEntry_2(i, v17); /*0xd879*/
*(_DWORD *)v15 = v35; /*0xd886*/
*(_DWORD *)(v15 + 4) = 0; /*0xd888*/
*(_QWORD *)(v15 + 28) = 0; /*0xd88c*/
*(_QWORD *)(v15 + 36) = 0; /*0xd890*/
*(_DWORD *)(v15 + 44) = 0; /*0xd894*/
*(_BYTE *)(v15 + 90) = 0; /*0xd898*/
*(_QWORD *)(v15 + 20) = 1; /*0xd89c*/
*(_QWORD *)(v15 + 8) = 0x40000000; /*0xd8a4*/
*(_QWORD *)(v15 + 81) = v16; /*0xd8ac*/
*(_DWORD *)(v15 + 16) = v16; /*0xd8b0*/
v20 = v36 | *(unsigned __int8 *)(i + 10) | 0x8000; /*0xd8c3*/
if ( *(_WORD *)(UsbHcPtr + 112) == 4358 ) /*0xd8cc*/
v20 = v36 | *(unsigned __int8 *)(i + 10); /*0xd8cc*/
v21 = v20 | 0x2000; /*0xd8d0*/
if ( *(_BYTE *)(i + 14) ) /*0xd8bc*/
{
v21 = v21 & 0xFFFFCFFF | ((*(_BYTE *)(i + 14) & 1) << 12); /*0xd8ed*/
*(_DWORD *)(v15 + 8) = ((unsigned __int16)HubGetPortAddress((_BYTE *)i) | 0x4000) << 16; /*0xd8ff*/
}
*(_DWORD *)(v15 + 4) = v21; /*0xd902*/
if ( a3 < 0 ) /*0xd909*/
{
*(_DWORD *)(v16 + 8) = 36224; /*0xd90f*/
LABEL_29:
n0x4000_5 = n0x4000_4; /*0xd918*/
goto LABEL_30; /*0xd918*/
}
*(_DWORD *)(v16 + 8) = 35968; /*0xda16*/
if ( !dst_1 ) /*0xda22*/
goto LABEL_29; /*0xda22*/
n0x4000_5 = n0x4000_4; /*0xda28*/
MemConfig(dst_1, dst, n0x4000_4); /*0xda41*/
LABEL_30:
dst_2 = (int)dst_1; /*0xd91d*/
*(_DWORD *)(v16 + 8) |= (n0x4000_5 | (v30 << 15)) << 16; /*0xd934*/
if ( !dst_1 ) /*0xd93c*/
dst_2 = (int)dst; /*0xd93e*/
EhciBuildSgList(v16, dst_2, n0x4000_5); /*0xd943*/
*(_DWORD *)v16 = 1; /*0xd950*/
*(_DWORD *)(v16 + 4) = 1; /*0xd957*/
*(_BYTE *)(v15 + 89) = 1; /*0xd95c*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= 0xFCu; /*0xd966*/
v24 = DebugLogPrint_7(UsbHcPtr, v15); /*0xd96d*/
*(_DWORD *)(v15 + 16) = 1; /*0xd974*/
*(_QWORD *)(v15 + 81) = 0; /*0xd97b*/
if ( v24 ) /*0xd982*/
break; /*0xd982*/
if ( (*(_BYTE *)(v15 + 90) & 0x40) != 0 ) /*0xd98c*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0xda4b*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= ~2u; /*0xda52*/
*(_BYTE *)(UsbRtDispatchTable + 30472) |= 1u; /*0xda59*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0xda60*/
goto LABEL_47; /*0xda67*/
}
FwVolDriverEntry_1(i, v29, *(int *)(v15 + 24) < 0); /*0xd9a5*/
if ( (*(_WORD *)(v16 + 10) & 0x7FFF) != 0 ) /*0xd9bd*/
n0x4000_5 -= *(_WORD *)(v16 + 10) & 0x7FFF; /*0xd9bd*/
if ( n0x4000_5 ) /*0xd9c4*/
{
if ( dst_1 && a3 < 0 ) /*0xd9d2*/
MemConfig(dst, dst_1, n0x4000_5); /*0xd9e4*/
v33 += n0x4000_5; /*0xd9ed*/
n0x4000_2 = n0x4000_1 - n0x4000_5; /*0xd9f2*/
n0x4000_1 -= n0x4000_5; /*0xd9f5*/
if ( n0x4000_5 >= n0x4000_4 ) /*0xd9fe*/
{
v17 = v29; /*0xda00*/
dst += n0x4000_5; /*0xda07*/
if ( n0x4000_2 ) /*0xda0e*/
continue; /*0xda0e*/
}
}
goto LABEL_47; /*0xda0e*/
}
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xda69*/
*(_BYTE *)(UsbRtDispatchTable + 30472) |= 2u; /*0xda70*/
*(_DWORD *)(UsbRtDispatchTable_1 + 30476) |= 0x40u; /*0xda77*/
LABEL_47:
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v37); /*0xda7e*/
FwVolConfig(v15, 6u); /*0xda95*/
if ( dst_1 ) /*0xda9d*/
{
if ( n0x4000 >= 0x4000 ) /*0xdaa9*/
LOWORD(v27) = 512; /*0xdab9*/
else
v27 = ((unsigned __int64)(unsigned __int16)n0x4000 + 31) >> 5; /*0xdab3*/
FwVolConfig((unsigned __int64)dst_1, v27); /*0xdabe*/
}
return v33; /*0xdad8*/
}
// Function: EhciBuildFrameListEntries @ 0xdae8 (0x4f bytes)
unsigned __int64 __fastcall EhciBuildFrameListEntries(int *a1, int *a2)
{
__int64 n8; // r10
int v3; // eax
unsigned int n0x400; // r8d
unsigned __int64 result; // rax
n8 = 8; /*0xdaeb*/
do /*0xdb1f*/
{
v3 = *a2; /*0xdaf7*/
n0x400 = *a2 & 0xFFF; /*0xdafd*/
*a1 = *a2; /*0xdb04*/
a1 += 2; /*0xdb09*/
*((_BYTE *)a1 - 4) = n0x400 >= 0x400; /*0xdb15*/
*a2 = v3 + 3072; /*0xdb18*/
--n8; /*0xdb1b*/
}
while ( n8 ); /*0xdb1f*/
result = 0; /*0xdb21*/
if ( n0x400 > 0x400 ) /*0xdb25*/
return 0x8000000000000002uLL; /*0xdb2c*/
return result; /*0xdb36*/
}
// Function: AssertCpuDeadLoop @ 0xdb38 (0x2a3 bytes)
__int64 __fastcall AssertCpuDeadLoop(
__int64 UsbHcPtr,
__int64 a2,
unsigned __int16 a3,
unsigned int a4,
unsigned int a5,
char a6,
__int64 a7)
{
__int64 v7; // rbp
char v9; // dl
__int64 UsbHcPtr_1; // rbx
unsigned __int8 v11; // dl
unsigned __int16 v12; // r15
unsigned int v13; // r12d
__int16 v14; // r13
signed __int64 v15; // rsi
signed __int64 v16; // rax
__int64 v17; // r14
__int64 UsbHcPtr_2; // rbx
int v19; // edx
unsigned __int8 i; // r8
int v21; // ecx
int v23; // [rsp+20h] [rbp-98h]
int v24[34]; // [rsp+30h] [rbp-88h] BYREF
unsigned int v26; // [rsp+C8h] [rbp+10h] BYREF
unsigned __int16 v27; // [rsp+D0h] [rbp+18h]
int v28; // [rsp+D8h] [rbp+20h]
v27 = a3; /*0xdb3b*/
v7 = a7; /*0xdb54*/
v9 = *(_BYTE *)(a2 + 376); /*0xdb5f*/
UsbHcPtr_1 = UsbHcPtr; /*0xdb65*/
v26 = a4; /*0xdb6b*/
v11 = v9 & 0xF; /*0xdb6f*/
LOWORD(v28) = a3; /*0xdb72*/
v12 = 1; /*0xdb82*/
v13 = 0; /*0xdb8f*/
v14 = 0; /*0xdb95*/
v23 = *(unsigned __int16 *)(a2 + 378) * *(unsigned __int8 *)(a2 + 380); /*0xdb99*/
if ( *(_WORD *)(UsbHcPtr + 48) ) /*0xdb9d*/
{
LODWORD(a7) = v11 << 8; /*0xdbb4*/
while ( 1 ) /*0xdbda*/
{
v15 = EhciBuildFrameListEntries(v24, (int *)&v26); /*0xdbda*/
if ( v15 < 0 ) /*0xdbe0*/
{
v26 = (v24[0] & 0xFFFFF000) + 4096; /*0xdbfd*/
v16 = EhciBuildFrameListEntries(v24, (int *)&v26); /*0xdc04*/
v15 = v16; /*0xdc0c*/
if ( v16 < 0 ) /*0xdc12*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v16); /*0xdc21*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3035, (__int64)"!EFI_ERROR (Status)"); /*0xdc39*/
}
}
LODWORD(v17) = 0; /*0xdc52*/
UsbHcPtr_2 = *(unsigned int *)(*(_QWORD *)(UsbHcPtr_1 + 8) + 4LL * (unsigned __int16)v28); /*0xdc60*/
v19 = 0; /*0xdc6c*/
if ( (_WORD)v28 + 1 != *(_WORD *)(UsbHcPtr + 48) ) /*0xdc6f*/
LOWORD(v19) = v28 + 1; /*0xdc6f*/
v28 = v19; /*0xdc73*/
if ( v15 < 0 ) /*0xdc7d*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v15); /*0xdc8e*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3043, (__int64)"!EFI_ERROR (Status)"); /*0xdca6*/
}
*(_DWORD *)(UsbHcPtr_2 + 36) = v24[0] & 0xFFFFF000; /*0xdcc2*/
for ( i = 0; i < 8u; ++i ) /*0xdcc5*/
{
v21 = v24[2 * i] & 0xFFF; /*0xdcd0*/
*(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) = 201326592; /*0xdcd6*/
*(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) |= v21; /*0xdce4*/
*(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) |= (_DWORD)v17 << 12; /*0xdcf4*/
if ( v7 ) /*0xdcfb*/
*(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) |= 0x8000u; /*0xdcfd*/
if ( LOBYTE(v24[2 * i + 1]) && i != 7 ) /*0xdd0e*/
{
v17 = (unsigned int)(v17 + 1); /*0xdd14*/
*(_DWORD *)(UsbHcPtr_2 + 4 * v17 + 36) = v24[2 * i + 2] & 0xFFFFF000; /*0xdd19*/
}
v13 += v23; /*0xdd1e*/
if ( v13 >= a5 ) /*0xdd29*/
break; /*0xdd29*/
++v12; /*0xdd2e*/
}
*(_DWORD *)(UsbHcPtr_2 + 36) |= a7 | *(unsigned __int8 *)(a2 + 10); /*0xdd50*/
*(_DWORD *)(UsbHcPtr_2 + 40) |= *(unsigned __int16 *)(a2 + 378); /*0xdd5a*/
*(_DWORD *)(UsbHcPtr_2 + 44) |= *(unsigned __int8 *)(a2 + 380); /*0xdd64*/
if ( a6 ) /*0xdd6f*/
*(_DWORD *)(UsbHcPtr_2 + 40) |= 0x800u; /*0xdd71*/
if ( v13 >= a5 ) /*0xdd7e*/
break; /*0xdd7e*/
if ( (unsigned __int16)++v14 >= *(_WORD *)(UsbHcPtr + 48) ) /*0xdd8f*/
break; /*0xdd8f*/
UsbHcPtr_1 = UsbHcPtr; /*0xdbbd*/
}
a3 = v27; /*0xdd95*/
}
else
{
UsbHcPtr_2 = UsbHcPtr; /*0xddd1*/
}
*(_QWORD *)(a2 + 392) = v7; /*0xdd9e*/
if ( v7 ) /*0xdda8*/
{
*(_QWORD *)(a2 + 400) = a3; /*0xddae*/
*(_QWORD *)(a2 + 416) = UsbHcPtr_2; /*0xddb5*/
}
return v12; /*0xddc0*/
}
// Function: UsbConfig_20 @ 0xdddc (0x85 bytes)
__int64 __fastcall UsbConfig_20(__int64 UsbHcPtr, unsigned __int16 a2, __int16 a3, unsigned __int8 *a4, char a5)
{
__int16 v5; // r10
unsigned __int8 v8; // cl
__int64 v9; // rdx
unsigned __int16 v10; // ax
bool v11; // zf
v5 = 0; /*0xddf1*/
LABEL_2:
v8 = 0; /*0xddfc*/
v9 = *(unsigned int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * a2); /*0xde07*/
v10 = a2 + 1; /*0xde0b*/
v11 = a2 + 1 == *(_WORD *)(UsbHcPtr + 48); /*0xde0f*/
a2 = 0; /*0xde13*/
if ( !v11 ) /*0xde16*/
a2 = v10; /*0xde16*/
while ( 1 ) /*0xde23*/
{
if ( a5 ) /*0xde23*/
*(_DWORD *)(v9 + 4LL * v8 + 4) |= 0x80000000; /*0xde25*/
else
*(_DWORD *)(v9 + 4LL * v8 + 4) &= ~0x80000000; /*0xde2d*/
if ( ++v5 == a3 ) /*0xde3b*/
break; /*0xde3b*/
if ( ++v8 >= 8u ) /*0xde42*/
goto LABEL_2; /*0xde42*/
}
if ( a4 ) /*0xde49*/
*a4 = v8; /*0xde4b*/
return v9; /*0xde60*/
}
// Function: UsbConfig_6 @ 0xde64 (0xee bytes)
__int64 __fastcall UsbConfig_6(__int64 UsbHcPtr, unsigned __int16 a2, __int16 a3, int *a4)
{
unsigned __int16 v4; // r10
__int16 v8; // si
unsigned int v9; // ebx
__int16 v10; // di
unsigned __int8 n8; // r8
__int64 v12; // r11
unsigned __int16 v13; // ax
bool v14; // zf
int v15; // ecx
v4 = *(_WORD *)(UsbHcPtr + 48); /*0xde81*/
v8 = 0; /*0xde93*/
v9 = 0; /*0xde97*/
v10 = 0; /*0xde9a*/
if ( v4 ) /*0xdea2*/
{
while ( 2 ) /*0xdea4*/
{
n8 = 0; /*0xdea4*/
v12 = *(unsigned int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * a2); /*0xdeae*/
v13 = a2 + 1; /*0xdeb2*/
v14 = a2 + 1 == v4; /*0xdeb5*/
a2 = 0; /*0xdeb9*/
if ( !v14 ) /*0xdebc*/
a2 = v13; /*0xdebc*/
do /*0xdf05*/
{
v15 = 0; /*0xdec4*/
if ( *(int *)(v12 + 4LL * n8 + 4) < 0 ) /*0xdece*/
{
*(_DWORD *)(v12 + 4LL * n8 + 4) &= ~0x80000000; /*0xdee2*/
}
else
{
v15 = HIWORD(*(_DWORD *)(v12 + 4LL * n8 + 4)) & 0xFFF; /*0xded8*/
v9 += v15; /*0xdede*/
}
++v8; /*0xdee9*/
if ( a4 ) /*0xdeef*/
*a4++ = v15; /*0xdef1*/
if ( v8 == a3 ) /*0xdefc*/
return v9; /*0xdf4e*/
++n8; /*0xdefe*/
}
while ( n8 < 8u ); /*0xdf05*/
v4 = *(_WORD *)(UsbHcPtr + 48); /*0xdf07*/
if ( (unsigned __int16)++v10 < v4 ) /*0xdf13*/
continue; /*0xdf13*/
break;
}
}
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3175, (__int64)"((BOOLEAN)(0==1))"); /*0xdf28*/
return 0; /*0xdf43*/
}
// Function: EhciInterruptTransfer @ 0xdf54 (0x1bf bytes)
__int64 __fastcall EhciInterruptTransfer(
__int64 UsbHcPtr,
__int64 a2,
char a3,
unsigned int a4,
unsigned int a5,
_BYTE *a6)
{
unsigned __int16 v10; // bx
__int64 result; // rax
unsigned __int16 v12; // r12
unsigned __int16 v13; // ax
__int16 v14; // r14
__int64 v15; // r13
__int64 v16; // r15
unsigned __int16 v17; // si
unsigned __int8 v18[16]; // [rsp+40h] [rbp-38h] BYREF
v10 = 0; /*0xdf81*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xdfbe*/
|| (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0
|| !*(_QWORD *)(UsbHcPtr + 136) )
{
return 0; /*0xdfc5*/
}
if ( a5 > 8 /*0xdfeb*/
* *(unsigned __int16 *)(UsbHcPtr + 48)
* *(unsigned __int16 *)(a2 + 378)
* (unsigned int)*(unsigned __int8 *)(a2 + 380) )
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3275, (__int64)"((BOOLEAN)(0==1))"); /*0xe000*/
return 0; /*0xdf8a*/
}
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xe011*/
v12 = 0; /*0xe027*/
v13 = ((*(_WORD *)(UsbHcPtr + 48) - 1) /*0xe037*/
& ((unsigned int)DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 12) >> 3))
+ 1;
if ( v13 != *(_WORD *)(UsbHcPtr + 48) ) /*0xe04d*/
v12 = v13; /*0xe04d*/
v14 = AssertCpuDeadLoop(UsbHcPtr, a2, v12, a4, a5, a3, (__int64)a6); /*0xe07e*/
v15 = UsbConfig_20(UsbHcPtr, v12, v14, v18, 1); /*0xe087*/
if ( a6 ) /*0xe08d*/
{
*a6 = 0; /*0xe08f*/
return 0; /*0xe092*/
}
v16 = v18[0]; /*0xe097*/
v17 = 8 * v14 + 1; /*0xe0a5*/
do /*0xe0c9*/
{
if ( *(int *)(v15 + 4 * v16 + 4) >= 0 ) /*0xe0af*/
break; /*0xe0af*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(15); /*0xe0bd*/
++v10; /*0xe0c3*/
}
while ( v10 < v17 ); /*0xe0c9*/
result = UsbConfig_6(UsbHcPtr, v12, v14, *(int **)(a2 + 384)); /*0xe0dd*/
if ( v10 == v17 ) /*0xe0e5*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xe0ee*/
return result; /*0xe106*/
}
// Function: EhciInterruptDispatch @ 0xe114 (0x2c8 bytes)
__int64 __fastcall EhciInterruptDispatch(
__int64 UsbHcPtr,
_BYTE *i,
char a3,
unsigned __int16 a4,
__int64 a5,
unsigned __int16 n0x4000)
{
unsigned __int16 v6; // di
__int64 v11; // rax
unsigned __int64 v12; // rsi
char *v13; // r15
unsigned int v14; // ebx
__int64 UsbRtDispatchTable; // rax
unsigned int v16; // ebx
unsigned int v17; // r13d
int v18; // eax
unsigned __int8 v20; // [rsp+30h] [rbp-48h]
int v21[2]; // [rsp+38h] [rbp-40h] BYREF
__int64 v22; // [rsp+40h] [rbp-38h] BYREF
v6 = 0; /*0xe130*/
*(_QWORD *)v21 = 0; /*0xe136*/
v22 = 0; /*0xe13d*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL
&& (UsbValidateDeviceEntry((__int64)i) & 0x8000000000000000uLL) == 0LL
&& (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0
&& (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) == 0 )
{
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xe199*/
v20 = FwVolDriverEntry_2((__int64)i, a3); /*0xe1a7*/
v11 = UsbConfig_1(6u); /*0xe1ab*/
v12 = v11; /*0xe1b0*/
if ( v11 )
{
*(_QWORD *)(v11 + 20) = 1; /*0xe1bc*/
v13 = (char *)(v11 + 128); /*0xe1c0*/
*(_QWORD *)v11 = 1; /*0xe1c7*/
*(_QWORD *)(v11 + 81) = v11 + 128; /*0xe1ca*/
*(_DWORD *)(v11 + 16) = v11 + 128; /*0xe1ce*/
*(_QWORD *)(v11 + 8) = 0x40000000; /*0xe1d2*/
*(_QWORD *)(v11 + 28) = 0; /*0xe1da*/
*(_QWORD *)(v11 + 36) = 0; /*0xe1de*/
*(_DWORD *)(v11 + 44) = 0; /*0xe1e2*/
*(_BYTE *)(v11 + 90) = 0; /*0xe1e5*/
v14 = (unsigned __int8)i[10] | (((a4 << 8) | a3 & 0xF | 0x20) << 8); /*0xe209*/
if ( i[14] ) /*0xe1e9*/
{
v14 = v14 & 0xFFFFCFFF | ((i[14] & 1) << 12); /*0xe221*/
*(_DWORD *)(v11 + 8) = ((unsigned __int16)HubGetPortAddress(i) << 16) | 0x40001C00; /*0xe233*/
}
*(_DWORD *)(v12 + 8) |= 0x40000001u; /*0xe236*/
*(_DWORD *)(v12 + 4) = v14; /*0xe23d*/
*(_WORD *)(v12 + 111) = UsbConfig_18(i[14], i[320]); /*0xe25c*/
*(_DWORD *)(v12 + 24) |= v20 << 31; /*0xe274*/
*((_DWORD *)v13 + 2) = a3 < 0 ? 36224 : 35968;
*((_DWORD *)v13 + 2) |= n0x4000 << 16; /*0xe29b*/
ElibReadNvStore(UsbHcPtr, a3 & 0x80, a5, n0x4000, v21, (__int64)&v22); /*0xe2b3*/
EhciBuildSgList((__int64)v13, v21[0], n0x4000); /*0xe2c3*/
*(_DWORD *)v13 = 1; /*0xe2d3*/
*((_DWORD *)v13 + 1) = 1; /*0xe2d6*/
UsbConfig_10(UsbHcPtr, v12); /*0xe2da*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xe2df*/
*(_BYTE *)(v12 + 89) = 1; /*0xe2e6*/
v16 = 0; /*0xe2e9*/
v17 = 100 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0xe2f2*/
while ( (!v17 || v16 < v17) && v13[8] < 0 ) /*0xe305*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xe313*/
++v16; /*0xe319*/
}
UsbConfig_19(UsbHcPtr, v12); /*0xe323*/
v18 = *((_DWORD *)v13 + 2); /*0xe328*/
if ( (v18 & 0x80u) == 0 ) /*0xe337*/
{
if ( (v18 & 0x40) != 0 ) /*0xe35b*/
{
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0xe364*/
}
else
{
v6 = n0x4000 - (HIWORD(v18) & 0x7FFF); /*0xe38e*/
FwVolDriverEntry_1((__int64)i, a3, *(int *)(v12 + 24) < 0); /*0xe392*/
}
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI Time-Out\n"); /*0xe344*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xe350*/
}
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v22); /*0xe3a3*/
FwVolConfig(v12, 6u); /*0xe3ae*/
EhciResetHcFull(UsbHcPtr); /*0xe3b6*/
}
}
return v6; /*0xe3cf*/
}
// Function: EhciIsochTransfer @ 0xe3dc (0xff bytes)
char __fastcall EhciIsochTransfer(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int64 v5; // rsi
__int64 v6; // rdx
unsigned __int64 v7; // rcx
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xe429*/
|| (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 )
{
return -1; /*0xe429*/
}
if ( *(_BYTE *)(a2 + 376) && *(_QWORD *)(UsbHcPtr + 136) ) /*0xe434*/
UsbConfig_20(UsbHcPtr, 0, 8 * *(_WORD *)(UsbHcPtr + 48), 0, 0); /*0xe454*/
v5 = *(_QWORD *)(a2 + 32); /*0xe459*/
if ( !v5 ) /*0xe460*/
return -1; /*0xe3fb*/
v6 = *(_QWORD *)(a2 + 32); /*0xe462*/
*(_BYTE *)(v5 + 89) = 0; /*0xe465*/
UsbConfig_19(UsbHcPtr, v6); /*0xe46c*/
FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), *(int *)(v5 + 24) < 0); /*0xe482*/
FwVolConfig(v5, 6u); /*0xe48f*/
v7 = *(_QWORD *)(a2 + 232); /*0xe494*/
*(_QWORD *)(a2 + 32) = 0; /*0xe49b*/
*(_QWORD *)(a2 + 24) = 0; /*0xe4a0*/
if ( v7 ) /*0xe4a8*/
{
FwVolConfig(v7, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xe4bc*/
*(_QWORD *)(a2 + 232) = 0; /*0xe4c1*/
}
return 0; /*0xe4d5*/
}
// Function: EhciAsyncPeriodic @ 0xe4dc (0x1f9 bytes)
char __fastcall EhciAsyncPeriodic(__int64 UsbHcPtr, __int64 i)
{
__int64 v5; // rax
__int64 v6; // rbx
_DWORD *v7; // r14
unsigned int v8; // esi
__int64 v9; // rax
DebugPrint( /*0xe536*/
0xFFFFFFFFFFFFFFFFuLL,
"EHCI_AP dev type %d, adr %d, ep %x, maxp %x, speed %x, interval %d\n",
*(unsigned __int8 *)(i + 4),
*(unsigned __int8 *)(i + 10),
*(unsigned __int8 *)(i + 64),
*(unsigned __int16 *)(i + 62),
*(unsigned __int8 *)(i + 14),
*(unsigned __int8 *)(i + 320));
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xe546*/
return -1; /*0xe546*/
if ( (UsbValidateDeviceEntry(i) & 0x8000000000000000uLL) != 0LL ) /*0xe55a*/
return -1; /*0xe55a*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xe566*/
return -1; /*0xe566*/
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xe57d*/
return -1; /*0xe57d*/
v5 = UsbConfig_1(6u); /*0xe583*/
v6 = v5; /*0xe588*/
if ( !v5 ) /*0xe58e*/
return -1; /*0xe548*/
*(_QWORD *)(i + 32) = v5; /*0xe590*/
v7 = (_DWORD *)(v5 + 128); /*0xe594*/
*(_QWORD *)(i + 24) = v5 + 128; /*0xe59b*/
*(_QWORD *)(v5 + 81) = v5 + 128; /*0xe59f*/
*(_DWORD *)(v5 + 16) = v5 + 128; /*0xe5a3*/
*(_DWORD *)(v5 + 20) = 1; /*0xe5a7*/
*(_DWORD *)v5 = 1; /*0xe5ab*/
*(_QWORD *)(v5 + 91) = i; /*0xe5ae*/
v8 = *(unsigned __int8 *)(i + 10) | (((*(unsigned __int16 *)(i + 62) << 8) | *(_BYTE *)(i + 64) & 0xF | 0x20) << 8); /*0xe5d0*/
if ( *(_BYTE *)(i + 14) ) /*0xe5bd*/
{
v8 = v8 & 0xFFFFCFFF | ((*(_BYTE *)(i + 14) & 1) << 12); /*0xe5e8*/
*(_DWORD *)(v5 + 8) |= ((unsigned __int16)HubGetPortAddress((_BYTE *)i) << 16) | 0x1C00; /*0xe5fa*/
}
*(_DWORD *)(v6 + 8) |= 0x40000001u; /*0xe5fd*/
*(_DWORD *)(v6 + 4) = v8; /*0xe604*/
*(_WORD *)(v6 + 111) = UsbConfig_18(*(_BYTE *)(i + 14), *(_BYTE *)(i + 320)); /*0xe615*/
*(_DWORD *)(v6 + 24) |= (unsigned __int8)FwVolDriverEntry_2(i, *(_BYTE *)(i + 64)) << 31; /*0xe62f*/
v7[2] = 36224; /*0xe632*/
v7[2] = (*(unsigned __int16 *)(i + 322) << 16) | 0x8D80; /*0xe642*/
v9 = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(i + 322) + 31) >> 5); /*0xe655*/
*(_QWORD *)(i + 232) = v9; /*0xe65a*/
if ( !v9 ) /*0xe664*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3815, (__int64)"DevInfo->fpPollDataBuffer"); /*0xe679*/
EhciBuildSgList((__int64)v7, *(_QWORD *)(i + 232), *(unsigned __int16 *)(i + 322)); /*0xe690*/
*v7 = 1; /*0xe698*/
v7[1] = 1; /*0xe69e*/
UsbConfig_10(UsbHcPtr, v6); /*0xe6a2*/
*(_BYTE *)(v6 + 80) = UsbRegisterNotifyFunc((__int64)EhciApAddIsocTds); /*0xe6b3*/
*(_BYTE *)(v6 + 89) = 1; /*0xe6b8*/
return 0; /*0xe6cb*/
}
// Function: EhciApCtrlIn @ 0xe6d8 (0xa5 bytes)
char __fastcall EhciApCtrlIn(__int64 a1)
{
unsigned __int64 v2; // rdi
unsigned __int64 v3; // rcx
unsigned __int64 v4; // rdx
unsigned __int64 v5; // rcx
v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xe6f5*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xe704*/
return -1; /*0xe704*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xe70a*/
return -1; /*0xe70a*/
if ( (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 0x1000) != 0 ) /*0xe720*/
return -1; /*0xe720*/
v3 = *(_QWORD *)(a1 + 40); /*0xe722*/
if ( !v3 ) /*0xe729*/
return -1; /*0xe729*/
v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xe732*/
if ( v3 < v4 ) /*0xe73c*/
return -1; /*0xe73c*/
if ( v3 + 24 > v2 ) /*0xe745*/
return -1; /*0xe745*/
v5 = *(_QWORD *)(v3 + 8); /*0xe747*/
if ( !v5 || v5 < v4 || v5 + 128 > v2 ) /*0xe75f*/
return -1; /*0xe770*/
*(_DWORD *)(v5 + 107) = 525568; /*0xe761*/
*(_BYTE *)(v5 + 89) = 0; /*0xe76a*/
return 0; /*0xe777*/
}
// Function: EhciApCtrlOut @ 0xe780 (0x108 bytes)
char __fastcall EhciApCtrlOut(__int64 a1)
{
unsigned __int64 v2; // rdi
unsigned __int64 v3; // rcx
unsigned __int64 v4; // rdx
unsigned __int64 v5; // r11
unsigned __int64 v6; // rbx
__int64 v7; // r11
int v8; // eax
v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xe79d*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) == 0LL /*0xe7d0*/
&& (*(_BYTE *)(a1 + 64) & 1) != 0
&& (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 0x1000) == 0 )
{
v3 = *(_QWORD *)(a1 + 40); /*0xe7d6*/
if ( v3 ) /*0xe7dd*/
{
v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xe7ea*/
if ( v3 >= v4 && v3 + 24 <= v2 ) /*0xe801*/
{
v5 = *(_QWORD *)(v3 + 8); /*0xe803*/
if ( v5 ) /*0xe80a*/
{
if ( v5 >= v4 && v5 + 128 <= v2 ) /*0xe81b*/
{
if ( *(char *)(v5 + 107) < 0 ) /*0xe822*/
return 0; /*0xe879*/
v6 = *(_QWORD *)(v3 + 16); /*0xe824*/
if ( v6 && v6 >= v4 && v6 + 64 <= v2 ) /*0xe839*/
{
*(_DWORD *)(v5 + 107) = 558464; /*0xe83f*/
EhciBuildSgList(v6, v5 + 99, 8u); /*0xe850*/
*(_DWORD *)(v7 + 12) = 0; /*0xe855*/
*(_DWORD *)(v7 + 24) = 0; /*0xe85a*/
v8 = *(_DWORD *)(v7 + 107); /*0xe85f*/
*(_DWORD *)(v7 + 20) = 1; /*0xe863*/
*(_DWORD *)(v7 + 16) = v6; /*0xe86b*/
*(_DWORD *)(v6 + 8) = v8; /*0xe86f*/
*(_BYTE *)(v7 + 89) = 1; /*0xe872*/
return 0; /*0xe872*/
}
}
}
}
}
}
return -1; /*0xe882*/
}
// Function: UsbConfig_17 @ 0xe888 (0x93 bytes)
char __fastcall UsbConfig_17(__int64 UsbHcPtr)
{
__int16 v1; // di
__int64 UsbRtDispatchTable; // rcx
v1 = 0; /*0xe892*/
if ( *(_BYTE *)(UsbHcPtr + 69) ) /*0xe897*/
return 0; /*0xe89f*/
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xe8b1*/
{
DebugLogPrint_21(UsbHcPtr, 0, 2); /*0xe8bc*/
while ( (DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)) & 2) != 0 ) /*0xe8cf*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xe8dd*/
if ( (unsigned __int16)++v1 >= 0x1F4u ) /*0xe8ee*/
goto LABEL_7; /*0xe8ee*/
}
return 0; /*0xe8cf*/
}
LABEL_7:
UsbRtDispatchTable = UsbRtDispatchTable; /*0xe8f0*/
if ( *(_BYTE *)(UsbRtDispatchTable + 104) < 0x30u ) /*0xe8fb*/
{
*(_WORD *)(UsbRtDispatchTable + 2LL * *(unsigned __int8 *)(UsbRtDispatchTable + 104) + 8) = 36; /*0xe906*/
++*(_BYTE *)(UsbRtDispatchTable + 104); /*0xe90b*/
}
return -1; /*0xe915*/
}
// Function: DebugLogPrint_6 @ 0xe91c (0x113 bytes)
char __fastcall DebugLogPrint_6(__int64 UsbHcPtr)
{
__int64 v2; // rax
__int64 *v3; // rbx
_DWORD *v5; // rsi
unsigned __int16 i; // r8
__int64 v7; // rcx
__int64 v8; // rdx
__int64 v9; // rax
v2 = UsbConfig_1(1u); /*0xe941*/
v3 = (__int64 *)v2; /*0xe948*/
if ( !v2 ) /*0xe94e*/
return -1; /*0xe94e*/
v5 = *(_DWORD **)(UsbHcPtr + 136); /*0xe957*/
*(_QWORD *)(UsbHcPtr + 40) = v2; /*0xe95e*/
if ( v5 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI add ISOC TDs: ITD %x\n", (_DWORD)v5);
for ( i = 0; i < *(_WORD *)(UsbHcPtr + 48); v5 += 32 ) /*0xe97e*/
{
v7 = *(_QWORD *)(UsbHcPtr + 8); /*0xe984*/
v8 = i++; /*0xe988*/
*v5 = *(_DWORD *)(v7 + 4 * v8); /*0xe993*/
*(_DWORD *)(v7 + 4 * v8) = (_DWORD)v5; /*0xe995*/
}
}
v9 = UsbConfig_1(4u); /*0xe9a8*/
if ( !v9 ) /*0xe9b0*/
return -1; /*0xe950*/
*v3 = v9; /*0xe9b2*/
*(_DWORD *)(v9 + 16) = 1; /*0xe9b8*/
*(_QWORD *)(v9 + 20) = 1; /*0xe9bc*/
*(_QWORD *)(v9 + 8) = 0x40000000; /*0xe9c0*/
*(_DWORD *)(v9 + 4) = 0; /*0xe9c8*/
*(_QWORD *)(v9 + 28) = 0; /*0xe9cb*/
*(_QWORD *)(v9 + 36) = 0; /*0xe9cf*/
*(_DWORD *)(v9 + 44) = 0; /*0xe9d3*/
*(_BYTE *)(v9 + 90) = 0; /*0xe9d6*/
*(_DWORD *)(*v3 + 16) = 1; /*0xe9dd*/
*(_DWORD *)(*v3 + 20) = 1; /*0xe9e4*/
*(_DWORD *)(*v3 + 4) = 4202496; /*0xe9eb*/
*(_DWORD *)*v3 = 1; /*0xe9f5*/
*(_DWORD *)(*v3 + 24) = 64; /*0xe9fb*/
*(_WORD *)(*v3 + 111) = 1; /*0xea05*/
UsbConfig_10(UsbHcPtr, *v3); /*0xea0d*/
return 0; /*0xea28*/
}
// Function: UsbGetInfo_5 @ 0xea30 (0x73 bytes)
char __fastcall UsbGetInfo_5(__int64 UsbHcPtr)
{
unsigned __int16 i; // di
DebugLogPrint_21(UsbHcPtr, 0, 16); /*0xea43*/
for ( i = 0; i < 0x3E8u; ++i ) /*0xea48*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) != 0 ) /*0xea5d*/
break; /*0xea5d*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xea6b*/
}
return -((DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) == 0); /*0xea9d*/
}
// Function: UsbGetInfo_6 @ 0xeaa4 (0x71 bytes)
char __fastcall UsbGetInfo_6(__int64 UsbHcPtr)
{
unsigned __int16 i; // di
DebugLogPrint_19(UsbHcPtr, 0, 16); /*0xeab7*/
for ( i = 0; i < 0x3E8u; ++i ) /*0xeabc*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) == 0 ) /*0xead1*/
break; /*0xead1*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xeadf*/
}
return -((DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) != 0); /*0xeb0f*/
}
// Function: UsbConfig_11 @ 0xeb18 (0xcb bytes)
char __fastcall UsbConfig_11(__int64 UsbHcPtr)
{
unsigned __int16 n0x10; // di
unsigned __int16 i; // si
DebugLogPrint_21(UsbHcPtr, 0, 32); /*0xeb35*/
n0x10 = 0; /*0xeb3a*/
for ( i = 0; i < 0x3E8u; ++i ) /*0xeb3c*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) != 0 ) /*0xeb55*/
break; /*0xeb55*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xeb63*/
}
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) != 0 ) /*0xeb89*/
return 0; /*0xebcc*/
DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xeb93*/
do /*0xebc6*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xebab*/
break; /*0xebab*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xebb9*/
++n0x10; /*0xebbf*/
}
while ( n0x10 < 0x10u ); /*0xebc6*/
return -1; /*0xebdd*/
}
// Function: UsbConfig_7 @ 0xebe4 (0xe4 bytes)
char __fastcall UsbConfig_7(__int64 UsbHcPtr)
{
unsigned __int16 n0x10; // di
unsigned __int16 i; // si
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) == 0 ) /*0xec0b*/
return 0; /*0xec0b*/
DebugLogPrint_19(UsbHcPtr, 0, 32); /*0xec1a*/
n0x10 = 0; /*0xec1f*/
for ( i = 0; i < 0x3E8u; ++i ) /*0xec21*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) == 0 ) /*0xec3a*/
break; /*0xec3a*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xec48*/
}
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) == 0 ) /*0xec6e*/
return 0; /*0xecb1*/
DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xec78*/
do /*0xecab*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xec90*/
break; /*0xec90*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xec9e*/
++n0x10; /*0xeca4*/
}
while ( n0x10 < 0x10u ); /*0xecab*/
return -1; /*0xecc2*/
}
// Function: UsbConfig_10 @ 0xecc8 (0xcc bytes)
char __fastcall UsbConfig_10(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int16 v2; // r9
unsigned __int16 v3; // r10
__int64 v4; // rbx
__int64 v5; // r11
int v6; // eax
__int16 n7; // ax
_DWORD *v9; // [rsp+10h] [rbp+10h]
if ( !a2 ) /*0xecda*/
return -1; /*0xecda*/
v2 = *(_WORD *)(a2 + 111); /*0xece0*/
if ( !v2 ) /*0xece9*/
return -1; /*0xed87*/
v3 = *(_WORD *)(UsbHcPtr + 128); /*0xecef*/
if ( v3 < *(_WORD *)(UsbHcPtr + 48) ) /*0xecfc*/
{
v4 = (__int64)v9; /*0xecfe*/
do /*0xed5e*/
{
v5 = *(_QWORD *)(UsbHcPtr + 8) + 4LL * v3; /*0xed0b*/
if ( *(_QWORD *)(UsbHcPtr + 136) ) /*0xed0f*/
v5 = *(unsigned int *)v5; /*0xed18*/
v6 = *(_DWORD *)v5; /*0xed1b*/
while ( (v6 & 1) == 0 ) /*0xed36*/
{
v4 = v6 & 0xFFFFFFE0; /*0xed27*/
if ( *(_WORD *)&byte_40[v4 + 47] <= v2 ) /*0xed2f*/
break; /*0xed2f*/
v6 = *(_DWORD *)v4; /*0xed31*/
v5 = v4; /*0xed33*/
}
if ( (v6 & 1) != 0 || v4 != a2 ) /*0xed41*/
{
*(_DWORD *)a2 = *(_DWORD *)v5; /*0xed46*/
*(_DWORD *)v5 = a2 | 2; /*0xed4d*/
}
v2 = *(_WORD *)(a2 + 111); /*0xed50*/
v3 += v2; /*0xed55*/
}
while ( v3 < *(_WORD *)(UsbHcPtr + 48) ); /*0xed5e*/
}
n7 = *(_WORD *)(UsbHcPtr + 128); /*0xed60*/
if ( n7 == 7 ) /*0xed6c*/
*(_WORD *)(UsbHcPtr + 128) = 0; /*0xed6e*/
else
*(_WORD *)(UsbHcPtr + 128) = n7 + 1; /*0xed7b*/
return 0; /*0xed93*/
}
// Function: UsbConfig_19 @ 0xed94 (0x8a bytes)
char __fastcall UsbConfig_19(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int16 v2; // bx
int *v5; // rdx
int v6; // eax
int *v7; // rcx
v2 = 0; /*0xeda3*/
if ( !a2 || !*(_WORD *)(a2 + 111) ) /*0xedb0*/
return -1; /*0xee0c*/
UsbGetInfo_6(UsbHcPtr); /*0xedb6*/
while ( v2 < *(_WORD *)(UsbHcPtr + 48) ) /*0xedfb*/
{
v5 = (int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * v2); /*0xedc8*/
v6 = *v5; /*0xedcc*/
while ( (v6 & 1) == 0 ) /*0xede5*/
{
v7 = (int *)(v6 & 0xFFFFFFE0); /*0xedd8*/
if ( v7 == (int *)a2 ) /*0xedde*/
break; /*0xedde*/
v6 = *v7; /*0xede0*/
v5 = v7; /*0xede2*/
}
if ( (v6 & 1) == 0 ) /*0xeded*/
*v5 = *(_DWORD *)a2; /*0xedf1*/
++v2; /*0xedf3*/
}
*(_DWORD *)a2 = 1; /*0xee00*/
UsbGetInfo_5(UsbHcPtr); /*0xee03*/
return 0; /*0xee18*/
}
// Function: EhciBuildSgList @ 0xee20 (0x59 bytes)
unsigned __int16 __fastcall EhciBuildSgList(__int64 a1, int a2, unsigned int n0x4000)
{
unsigned __int16 n0x4000_1; // ax
_DWORD *v4; // r9
n0x4000_1 = 0; /*0xee20*/
*(_DWORD *)(a1 + 4) = 1; /*0xee22*/
*(_QWORD *)(a1 + 16) = 0; /*0xee29*/
v4 = (_DWORD *)(a1 + 12); /*0xee2d*/
*(_DWORD *)(a1 + 12) = 0; /*0xee31*/
*(_QWORD *)(a1 + 24) = 0; /*0xee34*/
if ( n0x4000 ) /*0xee3b*/
{
if ( n0x4000 > 0x4000 ) /*0xee50*/
LOWORD(n0x4000) = 0x4000; /*0xee50*/
while ( 1 ) /*0xee68*/
{
*v4 = a2; /*0xee68*/
n0x4000_1 = ((a2 + 4096) & 0xF000) - a2; /*0xee6f*/
if ( n0x4000_1 >= (unsigned __int16)n0x4000 ) /*0xee76*/
break; /*0xee76*/
LOWORD(n0x4000) = n0x4000 - n0x4000_1; /*0xee57*/
++v4; /*0xee5b*/
a2 += n0x4000_1; /*0xee62*/
}
}
return n0x4000_1; /*0xee78*/
}
// Function: UsbConfig_15 @ 0xee7c (0xa1 bytes)
char __fastcall UsbConfig_15(__int64 UsbHcPtr, __int64 a2)
{
__int64 v2; // rax
__int64 v3; // r10
unsigned int v5; // ecx
char (__fastcall *EhciApSubFunc_1)(_BYTE *, __int64, __int64); // r11
v2 = *(_QWORD *)(a2 + 81); /*0xee86*/
v3 = a2; /*0xee8c*/
if ( v2 ) /*0xee95*/
{
while ( 1 ) /*0xee97*/
{
if ( *(char *)(v2 + 8) < 0 ) /*0xee9b*/
return -1; /*0xee9b*/
if ( (*(_BYTE *)(v2 + 8) & 0x40) != 0 ) /*0xeea1*/
break; /*0xeea1*/
v5 = *(_DWORD *)v2; /*0xeea3*/
if ( (*(_DWORD *)v2 & 1) != 0 ) /*0xeea8*/
{
*(_BYTE *)(a2 + 89) = 0; /*0xeebd*/
goto LABEL_9; /*0xeec1*/
}
v2 = v5; /*0xeeaa*/
if ( !v5 ) /*0xeeae*/
return -1; /*0xeeae*/
}
*(_WORD *)(a2 + 89) = 0x4000; /*0xeec3*/
LABEL_9:
if ( (unsigned __int8)(*(_BYTE *)(a2 + 80) - 1) > 0x31u ) /*0xeed0*/
return 0; /*0xeed0*/
EhciApSubFunc_1 = *(char (__fastcall **)(_BYTE *, __int64, __int64))(UsbRtDispatchTable /*0xeedd*/
+ 8LL * *(unsigned __int8 *)(a2 + 80)
+ 29456);
if ( !EhciApSubFunc_1 ) /*0xeee8*/
return 0; /*0xef19*/
if ( EhciApSubFunc_1 == EhciApSubFunc || (UsbValidateDeviceEntry(*(_QWORD *)(a2 + 91)) & 0x8000000000000000uLL) == 0LL ) /*0xef02*/
{
((void (__fastcall *)(__int64, _QWORD, __int64, _QWORD, _WORD))EhciApSubFunc_1)( /*0xef16*/
UsbHcPtr,
*(_QWORD *)(v3 + 91),
v3,
0,
0);
return 0; /*0xef16*/
}
}
return -1; /*0xeeb7*/
}
// Function: UsbConfig_2 @ 0xef20 (0x16f bytes)
unsigned __int64 __fastcall UsbConfig_2(__int64 UsbHcPtr)
{
unsigned int v2; // eax
__int64 v3; // r8
unsigned __int16 v4; // bx
__int64 v5; // rdx
unsigned __int8 i; // di
unsigned __int64 i_1; // rax
unsigned int n0x37; // r8d
__int64 v9; // rcx
__int64 v10; // rsi
unsigned __int16 v11; // ax
v2 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 12); /*0xef43*/
v3 = *(_QWORD *)(UsbHcPtr + 8); /*0xef4e*/
v4 = (*(_WORD *)(UsbHcPtr + 48) - 1) & (v2 >> 3); /*0xef5f*/
v5 = *(_DWORD *)(v3 + 4LL * v4) & 0xFFFFFFE0; /*0xef77*/
for ( i = 0; i < 8u; ++i ) /*0xef7a*/
{
if ( (*(_DWORD *)((_BYTE *)&word_4[2 * i] + (*(_DWORD *)(v3 + 4LL * v4) & 0xFFFFFFE0)) & 0x8000) != 0 ) /*0xef86*/
break; /*0xef86*/
}
if ( i != 8 ) /*0xef93*/
goto LABEL_11; /*0xef93*/
if ( !v4 ) /*0xef9d*/
v4 = *(_WORD *)(UsbHcPtr + 48); /*0xef9d*/
v5 = *(_DWORD *)(v3 + 4LL * --v4) & 0xFFFFFFE0; /*0xefac*/
for ( i = 0; i < 8u; ++i ) /*0xefaf*/
{
i_1 = i; /*0xefb2*/
if ( (*(_DWORD *)((_BYTE *)&word_4[2 * i] + (*(_DWORD *)(v3 + 4LL * v4) & 0xFFFFFFE0)) & 0x8000) != 0 ) /*0xefbb*/
break; /*0xefbb*/
}
if ( i != 8 ) /*0xefc8*/
{
LABEL_11:
n0x37 = 1; /*0xefd5*/
v9 = UsbRtDispatchTable + 3504; /*0xefd8*/
do /*0xf002*/
{
v10 = v9; /*0xefe1*/
i_1 = *(_DWORD *)v9 & 3; /*0xefe4*/
if ( (*(_BYTE *)v9 & 3) == 3 && *(_QWORD *)(v9 + 416) == v5 ) /*0xeff2*/
break; /*0xeff2*/
++n0x37; /*0xeff4*/
v9 += 448; /*0xeff7*/
}
while ( n0x37 < 0x37 ); /*0xf002*/
if ( n0x37 != 55 ) /*0xf008*/
{
*(_DWORD *)(v5 + 4LL * i + 4) &= ~0x8000u; /*0xf00e*/
v11 = *(_WORD *)(v10 + 400); /*0xf014*/
if ( v4 < v11 ) /*0xf01e*/
{
v4 += *(_WORD *)(UsbHcPtr + 48); /*0xf020*/
if ( v4 < v11 ) /*0xf027*/
Assert( /*0xf03c*/
(UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c",
4851,
(__int64)"CurrentFIndex >= (UINT16)DevInfo->IsocDetails.XferStart");
}
UsbConfig_6(UsbHcPtr, *(_WORD *)(v10 + 400), 8 * (v4 - *(_WORD *)(v10 + 400)) + i + 1, *(int **)(v10 + 384)); /*0xf065*/
i_1 = *(_QWORD *)(v10 + 392); /*0xf06a*/
*(_BYTE *)i_1 = 1; /*0xf071*/
}
}
return i_1; /*0xf088*/
}
// Function: EhciApAddIsocTds @ 0xf090 (0x138 bytes)
char __fastcall EhciApAddIsocTds(__int64 a1, __int64 a2, __int64 a3)
{
__int64 v3; // rdi
__int64 v7; // rdx
__int64 v8; // r8
void (__fastcall *v9)(__int64, __int64, __int64, _QWORD, __int16); // r10
int Info_12; // eax
__int16 v12; // [rsp+20h] [rbp-18h]
v3 = *(_QWORD *)(a3 + 81); /*0xf0a4*/
FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), *(int *)(a3 + 24) < 0); /*0xf0c3*/
if ( !*(_BYTE *)(a3 + 24) ) /*0xf0c8*/
{
if ( (unsigned __int8)(*(_BYTE *)(a2 + 21) - 1) <= 0x31u ) /*0xf0d5*/
{
v9 = *(void (__fastcall **)(__int64, __int64, __int64, _QWORD, __int16))(UsbRtDispatchTable /*0xf0e2*/
+ 8LL * *(unsigned __int8 *)(a2 + 21)
+ 29456);
if ( v9 ) /*0xf0ed*/
{
v12 = *(_WORD *)(a2 + 322) - (*(_WORD *)(v3 + 10) & 0x7FFF); /*0xf115*/
v9(a1, a2, v3, *(_QWORD *)(a2 + 232), v12); /*0xf11a*/
}
}
goto LABEL_8; /*0xf11d*/
}
if ( (*(_BYTE *)(a3 + 24) & 8) == 0 /*0xf140*/
|| (LOBYTE(v8) = *(_BYTE *)(a2 + 13),
LOBYTE(v7) = *(_BYTE *)(a2 + 12),
Info_12 = UsbGetInfo_12(a1, v7, v8, 0),
Info_12 != 255)
&& (Info_12 & 0x20) != 0 )
{
LABEL_8:
*(_DWORD *)(v3 + 8) &= 0x300u; /*0xf142*/
*(_DWORD *)(v3 + 8) |= *(unsigned __int16 *)(a2 + 322) << 16; /*0xf159*/
EhciBuildSgList(v3, *(_QWORD *)(a2 + 232), *(unsigned __int16 *)(a2 + 322)); /*0xf16b*/
*(_DWORD *)(a3 + 24) &= 0x80000000; /*0xf170*/
*(_DWORD *)(a3 + 12) = 0; /*0xf177*/
*(_DWORD *)(a3 + 28) = 0; /*0xf17b*/
*(_DWORD *)(a3 + 32) = 0; /*0xf17f*/
*(_DWORD *)(a3 + 36) = 0; /*0xf183*/
*(_DWORD *)(a3 + 40) = 0; /*0xf187*/
*(_DWORD *)(a3 + 44) = 0; /*0xf18b*/
*(_DWORD *)(a3 + 20) = 1; /*0xf18f*/
*(_DWORD *)v3 = 1; /*0xf196*/
*(_DWORD *)(v3 + 4) = 1; /*0xf19c*/
*(_DWORD *)(a3 + 16) = v3; /*0xf1a3*/
*(_DWORD *)(v3 + 8) |= 0x8C80u; /*0xf1a6*/
*(_BYTE *)(a3 + 89) = 1; /*0xf1ad*/
}
return 0; /*0xf1c2*/
}
// Function: EhciApSubFunc @ 0xf1c8 (0x63 bytes)
char __fastcall EhciApSubFunc(_BYTE *a1, __int64 a2, __int64 a3)
{
__int64 v3; // rdi
int v5; // eax
v3 = *(_QWORD *)(a3 + 81); /*0xf1d2*/
UsbGetInfo_15(a1); /*0xf1d9*/
if ( *(char *)(a3 + 107) < 0 ) /*0xf1e2*/
{
EhciBuildSgList(v3, a3 + 99, 8u); /*0xf1f1*/
v5 = *(_DWORD *)(a3 + 107); /*0xf1f6*/
*(_DWORD *)(a3 + 12) = 0; /*0xf1fc*/
*(_QWORD *)(a3 + 28) = 0; /*0xf200*/
*(_QWORD *)(a3 + 36) = 0; /*0xf204*/
*(_DWORD *)(a3 + 44) = 0; /*0xf208*/
*(_QWORD *)(a3 + 20) = 1; /*0xf20c*/
*(_DWORD *)(a3 + 16) = v3; /*0xf214*/
*(_DWORD *)(v3 + 8) = v5; /*0xf217*/
*(_BYTE *)(a3 + 89) = 1; /*0xf21a*/
}
return 0; /*0xf225*/
}
// Function: UsbConfig_18 @ 0xf22c (0x8e bytes)
__int64 __fastcall sub_F22C(char a1, unsigned __int8 a2)
{
unsigned __int8 v2; // di
int v3; // ebx
char i; // al
v2 = a2; /*0xf236*/
LOWORD(v3) = 1; /*0xf239*/
if ( a1 ) /*0xf240*/
{
if ( !a2 ) /*0xf27d*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 5194, (__int64)"Interval >= 1 && Interval <= 255"); /*0xf292*/
for ( i = 0; v2; v2 >>= 1 ) /*0xf29c*/
++i; /*0xf29e*/
return (unsigned __int16)(1 << (i - 1)); /*0xf2aa*/
}
else
{
if ( (unsigned __int8)(a2 - 1) > 0xFu ) /*0xf248*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 5186, (__int64)"Interval >= 1 && Interval <= 16"); /*0xf25d*/
if ( (unsigned __int16)(1 << (v2 - 1) >> 3) ) /*0xf26e*/
LOWORD(v3) = 1 << (v2 - 1) >> 3; /*0xf274*/
}
return (unsigned __int16)v3; /*0xf2b4*/
}
// Function: OhciDriverEntry @ 0xf2bc (0x202 bytes)
char __fastcall OhciDriverEntry(__int64 UsbHcPtr)
{
char v2; // di
unsigned int n787216; // eax
char v5; // al
unsigned __int16 v6; // cx
__int64 v7; // rdx
__int64 v8; // rax
__int16 v9; // ax
int n11999; // esi
unsigned int v11; // esi
int v12; // eax
v2 = 0; /*0xf2d8*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xf2dd*/
return -1; /*0xf2dd*/
n787216 = (unsigned int)HcPciReadConfig(UsbHcPtr, 8u) >> 8; /*0xf2f3*/
if ( n787216 != 787216 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI HC Class Code is wrong: %x\n", n787216);
return -1; /*0xf2e1*/
}
*(_DWORD *)(UsbHcPtr + 52) = 4096; /*0xf317*/
*(_WORD *)(UsbHcPtr + 48) = 32; /*0xf321*/
*(_QWORD *)(UsbHcPtr + 16) = HcPciReadConfig(UsbHcPtr, 0x10u) & 0xFFFFFFF0LL; /*0xf33d*/
v5 = DebugLogPrint_13(UsbHcPtr, 0x48u); /*0xf341*/
v6 = 0; /*0xf346*/
v7 = *(_QWORD *)(UsbHcPtr + 8); /*0xf349*/
for ( *(_BYTE *)(UsbHcPtr + 32) = v5; v6 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(v7 + 4 * v8) = 0 ) /*0xf355*/
v8 = v6++; /*0xf35b*/
if ( UsbRegister(UsbHcPtr) == -1 || OhciResetHc1(UsbHcPtr) == -1 ) /*0xf384*/
return -1; /*0xf384*/
v9 = DebugLogPrint_13(UsbHcPtr, 0x34u); /*0xf392*/
n11999 = v9 & 0x3FFF; /*0xf399*/
if ( n11999 != 11999 )
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI: HcFmInterval %x\n", v9 & 0x3FFF);
v11 = ((((6 * n11999 - 1260) / 7u) & 0x7FFF) << 16) | n11999; /*0xf3e5*/
DebugLogPrint_14(UsbHcPtr, 8u, 1); /*0xf3ea*/
while ( 1 ) /*0xf3f9*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(1); /*0xf3f9*/
if ( (DebugLogPrint_13(UsbHcPtr, 8u) & 1) == 0 ) /*0xf40f*/
break; /*0xf40f*/
if ( (unsigned __int8)++v2 >= 0x64u ) /*0xf418*/
return -1; /*0xf418*/
}
DebugLogPrint_14(UsbHcPtr, 0x34u, v11); /*0xf42a*/
DebugLogPrint_14(UsbHcPtr, 0x18u, *(_DWORD *)(UsbHcPtr + 8)); /*0xf43b*/
DebugLogPrint_14(UsbHcPtr, 0x40u, (9 * (v11 & 0x3FFF) / 0xA) & 0x3FFF); /*0xf464*/
DebugLogPrint_14(UsbHcPtr, 4u, 180); /*0xf477*/
DebugLogPrint_14(UsbHcPtr, 0x10u, -1073741758); /*0xf48a*/
*(_DWORD *)(UsbHcPtr + 64) |= 1u; /*0xf48f*/
v12 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0xf499*/
if ( (v12 & 0x80u) == 0 ) /*0xf49e*/
*(_DWORD *)(UsbRtDispatchTable + 4) = v12 | 0x80; /*0xf4a4*/
return 0; /*0xf4b8*/
}
// Function: OhciStartHc @ 0xf4c0 (0x138 bytes)
char __fastcall OhciStartHc(__int64 UsbHcPtr)
{
__int64 TmpRdx; // rdx
__int64 TmpR8; // r8
unsigned __int8 i; // di
unsigned __int16 v6; // cx
__int64 j; // rdx
__int64 v8; // rax
unsigned __int64 *v9; // rdi
unsigned __int64 v10; // rcx
unsigned __int64 v11; // rcx
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xf4f3*/
return -1; /*0xf4e3*/
for ( i = 1; i <= *(_BYTE *)(UsbHcPtr + 32); ++i ) /*0xf4f8*/
{
LOBYTE(TmpR8) = i; /*0xf500*/
LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0xf503*/
UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0xf509*/
}
DebugLogPrint_14(UsbHcPtr, 4u, 0); /*0xf521*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000LL * *(unsigned __int16 *)(UsbRtDispatchTable + 31396)); /*0xf542*/
DebugLogPrint_14(UsbHcPtr, 0x14u, -1); /*0xf554*/
DebugLogPrint_14(UsbHcPtr, 0x100u, 0); /*0xf564*/
v6 = 0; /*0xf569*/
for ( j = *(_QWORD *)(UsbHcPtr + 8); v6 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(j + 4 * v8) = 0 ) /*0xf570*/
v8 = v6++; /*0xf576*/
v9 = *(unsigned __int64 **)(UsbHcPtr + 40); /*0xf585*/
FwVolConfig(*v9, 1u); /*0xf58e*/
v10 = v9[1]; /*0xf593*/
if ( v10 ) /*0xf59a*/
FwVolConfig(v10, 1u); /*0xf59e*/
v11 = v9[2]; /*0xf5a3*/
if ( v11 ) /*0xf5aa*/
FwVolConfig(v11, 1u); /*0xf5ae*/
FwVolConfig(v9[3], 6u); /*0xf5bc*/
FwVolConfig((unsigned __int64)v9, 3u); /*0xf5c9*/
UsbServiceHcPolling(UsbHcPtr, 3u); /*0xf5d3*/
*(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0xf5d8*/
UsbFindActiveHc(); /*0xf5dc*/
return 0; /*0xf5f2*/
}
// Function: OhciStopHc @ 0xf5f8 (0xac bytes)
char __fastcall OhciStopHc(__int64 UsbHcPtr)
{
unsigned __int64 v2; // rbx
unsigned __int64 v3; // r8
unsigned __int64 v4; // rdi
unsigned __int64 v5; // rcx
_DWORD *v6; // rcx
v2 = *(_QWORD *)(UsbHcPtr + 40); /*0xf60c*/
v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xf616*/
v4 = v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xf620*/
if ( v2 < v3 ) /*0xf626*/
return -1; /*0xf626*/
if ( v2 + 88 > v4 ) /*0xf62f*/
return -1; /*0xf62f*/
v5 = *(_QWORD *)(v2 + 16); /*0xf631*/
if ( v5 < v3 ) /*0xf638*/
return -1; /*0xf638*/
if ( v5 + 32 > v4 ) /*0xf641*/
return -1; /*0xf641*/
*(_BYTE *)(v5 + 21) = 0; /*0xf643*/
UsbGetInfo_15((_BYTE *)UsbHcPtr); /*0xf64a*/
v6 = *(_DWORD **)(v2 + 8); /*0xf656*/
if ( (unsigned __int64)v6 < *(_QWORD *)(UsbRtDispatchTable + 29880) || (unsigned __int64)(v6 + 8) > v4 ) /*0xf66a*/
return -1; /*0xf697*/
if ( (*v6 & 0x4000) == 0 ) /*0xf672*/
{
v6[2] = *(_DWORD *)(v2 + 16); /*0xf677*/
*(_DWORD *)(*(_QWORD *)(v2 + 16) + 8LL) = 0; /*0xf67e*/
**(_DWORD **)(v2 + 16) = *(_DWORD *)(*(_QWORD *)(v2 + 16) + 16LL); /*0xf689*/
*(_BYTE *)(*(_QWORD *)(v2 + 16) + 21LL) = 1; /*0xf68f*/
}
return 0; /*0xf69e*/
}
// Function: OhciResetHc1 @ 0xf6a4 (0x43 bytes)
char __fastcall OhciResetHc1(__int64 UsbHcPtr)
{
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xf6b5*/
return -1; /*0xf6b7*/
DebugLogPrint_14(UsbHcPtr, 0x14u, 0x80000000); /*0xf6c9*/
DebugLogPrint_14(UsbHcPtr, 4u, 60); /*0xf6da*/
return 0; /*0xf6e1*/
}
// Function: OhciResetHc2 @ 0xf6e8 (0x43 bytes)
char __fastcall OhciResetHc2(__int64 a1)
{
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xf6f9*/
return -1; /*0xf6fb*/
DebugLogPrint_22(a1, 4u, 52); /*0xf70b*/
DebugLogPrint_14(a1, 0x10u, 0x80000000); /*0xf71e*/
return 0; /*0xf725*/
}
// Function: OhciResetHc @ 0xf72c (0x1e8 bytes)
char __fastcall OhciResetHc(__int64 UsbHcPtr)
{
bool v3; // zf
__int64 UsbRtDispatchTable; // rax
int v5; // eax
__int64 v6; // rdi
__int64 v7; // rsi
void (__fastcall *v8)(__int64, _QWORD, __int64, _QWORD, int); // r10
__int64 v9; // rdi
__int64 v10; // rax
int v11; // [rsp+20h] [rbp-18h]
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xf781*/
|| (HcPciReadConfig(UsbHcPtr, 4u) & 6) != 6
|| (HcPciReadConfig(UsbHcPtr, 0x10u) & 0xFFFFFF80) != *(_DWORD *)(UsbHcPtr + 16) )
{
return -1; /*0xf781*/
}
if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 0x40000000) == 0 ) /*0xf79b*/
{
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 ) /*0xf7f1*/
{
if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) == 0x80 ) /*0xf806*/
{
if ( (DebugLogPrint_13(UsbHcPtr, 0x18u) & 0xFFFFFF00) == *(_DWORD *)(UsbHcPtr + 8) ) /*0xf837*/
{
if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 0x40) != 0 ) /*0xf84a*/
{
DebugLogPrint_20(UsbHcPtr, 4u, 4); /*0xf854*/
UsbGetInfo_1((_BYTE *)UsbHcPtr); /*0xf85c*/
DebugLogPrint_22(UsbHcPtr, 4u, 4); /*0xf869*/
}
if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 2) != 0 ) /*0xf87b*/
{
while ( 1 ) /*0xf8d1*/
{
v10 = *(_QWORD *)(UsbHcPtr + 8); /*0xf8d1*/
v9 = *(unsigned int *)(v10 + 132); /*0xf8e1*/
*(_DWORD *)(v10 + 132) = 0; /*0xf8e7*/
DebugLogPrint_14(UsbHcPtr, 0xCu, 2); /*0xf8ed*/
if ( !v9 ) /*0xf8f5*/
break; /*0xf8f5*/
do /*0xf8cf*/
{
v6 = (unsigned int)v9 & 0xFFFFFFF0; /*0xf884*/
v7 = *(unsigned int *)(v6 + 8); /*0xf88b*/
if ( *(_BYTE *)(v6 + 21) == 1 && (unsigned __int8)(*(_BYTE *)(v6 + 20) - 1) <= 0x31u ) /*0xf897*/
{
v8 = *(void (__fastcall **)(__int64, _QWORD, __int64, _QWORD, int))(UsbRtDispatchTable /*0xf8a4*/
+ 8LL
* *(unsigned __int8 *)(v6 + 20)
+ 29456);
if ( v8 ) /*0xf8af*/
{
LOWORD(v11) = 0; /*0xf8b4*/
v8(UsbHcPtr, 0, v6, 0, v11); /*0xf8c1*/
}
}
if ( v6 == v7 ) /*0xf8c7*/
break; /*0xf8c7*/
LODWORD(v9) = v7; /*0xf8c9*/
}
while ( v7 ); /*0xf8cf*/
}
}
return 0; /*0xf8f5*/
}
}
else
{
v5 = DebugLogPrint_13(UsbHcPtr, 0xCu); /*0xf80d*/
DebugLogPrint_14(UsbHcPtr, 0xCu, v5); /*0xf81b*/
}
}
return -1; /*0xf756*/
}
DebugLogPrint_14(UsbHcPtr, 0xCu, 0x40000000); /*0xf7a3*/
v3 = (unsigned int)DebugLogPrint_13(UsbHcPtr, 0x18u) == *(_DWORD *)(UsbHcPtr + 8); /*0xf7b3*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xf7b9*/
if ( v3 ) /*0xf7c0*/
{
*(_DWORD *)(UsbRtDispatchTable + 4) &= ~1u; /*0xf7c2*/
UsbConfig_14(UsbHcPtr); /*0xf7c6*/
OhciStartHc(UsbHcPtr); /*0xf7ce*/
}
else
{
*(_DWORD *)(UsbRtDispatchTable + 4) |= 1u; /*0xf7d8*/
*(_BYTE *)(UsbRtDispatchTable + 30482) = 0; /*0xf7dc*/
OhciDriverEntry(UsbHcPtr); /*0xf7e3*/
}
return 0; /*0xf90d*/
}
// Function: OhciPortStatus @ 0xf914 (0x14d bytes)
int __fastcall OhciPortStatus(__int64 a1, unsigned __int8 a2, char a3)
{
int v3; // r14d
int n64; // ebx
unsigned __int16 v7; // r9
int result; // eax
unsigned int v9; // ebp
int v10; // edi
unsigned int v11; // ebx
int v12; // edx
int v13; // ecx
int v14; // edx
int v15; // ecx
int v16; // edx
int v17; // ecx
v3 = a2; /*0xf92c*/
n64 = 64; /*0xf936*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xf94c*/
return 255; /*0xf94e*/
v9 = v7; /*0xf958*/
v10 = DebugLogPrint_13(a1, v7); /*0xf977*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Ohci port[%d] status: %08x\n", v3, v10);
if ( (v10 & 1) != 0 ) /*0xf984*/
{
n64 = 65; /*0xf986*/
if ( (v10 & 2) != 0 ) /*0xf992*/
n64 = 97; /*0xf992*/
}
v11 = n64 | 4; /*0xf995*/
if ( (v10 & 0x200) != 0 ) /*0xf99c*/
v11 = v11 & 0xFFFFFFF9 | 2; /*0xf9a1*/
if ( (v10 & ((unsigned int)&loc_FFFD + 3)) != 0 ) /*0xf9ad*/
{
if ( a3 == 1 ) /*0xf9b2*/
DebugLogPrint_14(a1, v9, (int)&loc_FFFD + 3); /*0xf9b9*/
v11 |= 0x10u; /*0xf9be*/
}
if ( (v10 & 0x20000) != 0 ) /*0xf9ca*/
{
v11 |= 0x1000u; /*0xf9cc*/
if ( a3 == 1 ) /*0xf9d3*/
DebugLogPrint_14(a1, v9, 0x20000); /*0xf9da*/
}
v12 = v11 | 0x100; /*0xf9e9*/
if ( (v10 & 4) == 0 ) /*0xf9f0*/
v12 = v11; /*0xf9f0*/
v13 = v12 | 0x200; /*0xf9f5*/
if ( (v10 & 8) == 0 ) /*0xf9fd*/
v13 = v12; /*0xf9fd*/
v14 = v13 | 0x400; /*0xfa02*/
if ( (v10 & 0x10) == 0 ) /*0xfa0a*/
v14 = v13; /*0xfa0a*/
v15 = v14 | 0x800; /*0xfa0f*/
if ( (v10 & 0x100) == 0 ) /*0xfa18*/
v15 = v14; /*0xfa18*/
v16 = v15 | 0x2000; /*0xfa1d*/
if ( (v10 & 0x40000) == 0 ) /*0xfa28*/
v16 = v15; /*0xfa28*/
v17 = v16 | 0x4000; /*0xfa2d*/
if ( (v10 & 0x80000) == 0 ) /*0xfa36*/
v17 = v16; /*0xfa36*/
result = v17 | 0x8000; /*0xfa3b*/
if ( (v10 & 0x100000) == 0 ) /*0xfa45*/
return v17; /*0xfa45*/
return result; /*0xfa57*/
}
// Function: OhciPortReset @ 0xfa64 (0x38 bytes)
char __fastcall OhciPortReset(__int64 a1)
{
__int64 v1; // r9
unsigned __int8 v2; // r10
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xfa76*/
return -1; /*0xfa78*/
DebugLogPrint_14(v1, 4 * v2 + 80, 1); /*0xfa90*/
return 0; /*0xfa97*/
}
// Function: OhciPortChangeDetect @ 0xfa9c (0xe6 bytes)
char __fastcall OhciPortChangeDetect(__int64 a1)
{
unsigned __int16 v2; // r9
unsigned int n0x1F4; // esi
unsigned int v5; // edi
int v6; // eax
n0x1F4 = 0; /*0xfac1*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xfac6*/
return -1; /*0xfac6*/
v5 = v2; /*0xfacf*/
DebugLogPrint_14(a1, v2, 16); /*0xfade*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0xfaef*/
do /*0xfb1f*/
{
if ( (DebugLogPrint_13(a1, v5) & 0x100000) != 0 ) /*0xfb03*/
break; /*0xfb03*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xfb11*/
++n0x1F4; /*0xfb17*/
}
while ( n0x1F4 < 0x1F4 ); /*0xfb1f*/
if ( (DebugLogPrint_13(a1, v5) & 0x100000) == 0 )
{
v6 = DebugLogPrint_13(a1, v5); /*0xfb36*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI: port reset timeout, status: %08x\n", v6);
return -1; /*0xfaca*/
}
DebugLogPrint_14(a1, v5, 0x100000); /*0xfb59*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(3000); /*0xfb6a*/
return 0; /*0xfb7c*/
}
// Function: OhciCtrlIn @ 0xfb84 (0x8c bytes)
char __fastcall OhciCtrlIn(__int64 a1)
{
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0xfbb0*/
|| (*(_BYTE *)(a1 + 64) & 1) == 0
|| (DebugLogPrint_13(a1, 4u) & 0xC0) != 0x80 )
{
return -1; /*0xfb97*/
}
DebugLogPrint_14(a1, 0x10u, 8); /*0xfbc0*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(40000); /*0xfbd1*/
DebugLogPrint_14(a1, 4u, 1216); /*0xfbe5*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0xfbf6*/
*(_DWORD *)(a1 + 64) = *(_DWORD *)(a1 + 64) & 0xFFFFFFFC | 2; /*0xfc05*/
return 0; /*0xfc0a*/
}
// Function: OhciCtrlOut @ 0xfc10 (0x4d bytes)
char __fastcall OhciCtrlOut(__int64 a1)
{
__int64 v1; // r9
char v2; // r10
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(v1 + 64) & 1) == 0 ) /*0xfc2d*/
return -1; /*0xfc24*/
if ( *(_QWORD *)(v1 + 120) ) /*0xfc2f*/
{
if ( v2 == 1 ) /*0xfc48*/
DebugLogPrint_22(v1, 4u, 256); /*0xfc4a*/
else
DebugLogPrint_20(v1, 4u, 256); /*0xfc51*/
}
return 0; /*0xfc58*/
}
// Function: OhciCtrlTransfer @ 0xfc60 (0x358 bytes)
__int64 __fastcall OhciCtrlTransfer(
__int64 UsbHcPtr,
__int64 a2,
__int16 a3,
__int16 a4,
__int16 a5,
__int64 a6,
unsigned __int16 a7)
{
_QWORD *v7; // rsi
unsigned __int64 v12; // rbx
unsigned __int64 v13; // rcx
unsigned __int64 v14; // rax
unsigned __int64 v15; // rax
unsigned __int64 v16; // rax
unsigned __int64 v17; // rax
__int16 v18; // ax
unsigned __int16 v19; // r12
_WORD *v20; // rcx
unsigned int n64; // eax
int *v22; // r15
int v23; // ecx
int v24; // eax
_DWORD *v25; // rcx
_DWORD *v26; // rdi
int v27; // eax
__int64 v28; // rcx
__int64 v29; // rcx
__int64 v30; // rbx
__int64 UsbRtDispatchTable; // rcx
unsigned __int16 v32; // dx
unsigned int v33; // r8d
__int64 v34; // rax
__int64 v35; // r9
__int64 n15; // r8
unsigned __int16 v37; // bx
__int64 v39; // [rsp+30h] [rbp-38h] BYREF
__int64 v40; // [rsp+70h] [rbp+8h] BYREF
v7 = *(_QWORD **)(UsbHcPtr + 40); /*0xfc86*/
v40 = 0; /*0xfc92*/
v39 = 0; /*0xfc99*/
v12 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xfcaa*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xfcb9*/
return 0; /*0xfcb9*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0xfcca*/
return 0; /*0xfcca*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xfcd4*/
return 0; /*0xfcd4*/
if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 ) /*0xfce8*/
return 0; /*0xfce8*/
if ( (*(_BYTE *)a2 & 3) == 0 ) /*0xfcf5*/
return 0; /*0xfcf5*/
v13 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xfd02*/
if ( (unsigned __int64)v7 < v13 ) /*0xfd0c*/
return 0; /*0xfd0c*/
if ( (unsigned __int64)(v7 + 11) > v12 ) /*0xfd19*/
return 0; /*0xfd19*/
v14 = v7[3]; /*0xfd1f*/
if ( v14 < v13 ) /*0xfd26*/
return 0; /*0xfd26*/
if ( v14 + 32 > v12 ) /*0xfd33*/
return 0; /*0xfd33*/
v15 = v7[4]; /*0xfd39*/
if ( v15 < v13 ) /*0xfd40*/
return 0; /*0xfd40*/
if ( v15 + 32 > v12 ) /*0xfd4d*/
return 0; /*0xfd4d*/
v16 = v7[5]; /*0xfd53*/
if ( v16 < v13 ) /*0xfd5a*/
return 0; /*0xfd5a*/
if ( v16 + 32 > v12 ) /*0xfd67*/
return 0; /*0xfd67*/
v17 = v7[6]; /*0xfd6d*/
if ( v17 < v13 || v17 + 32 > v12 ) /*0xfd81*/
return 0; /*0xff96*/
v18 = a5; /*0xfd87*/
v19 = a7; /*0xfd8f*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xfd98*/
v20 = (_WORD *)v7[4]; /*0xfd9f*/
v20[12] = a3; /*0xfda3*/
v20[13] = v18; /*0xfda8*/
v20[14] = a4; /*0xfdac*/
v20[15] = v19; /*0xfdb0*/
n64 = *(unsigned __int16 *)(a2 + 16); /*0xfdba*/
v22 = (int *)v7[3]; /*0xfdbf*/
if ( n64 > 0x40 ) /*0xfdc5*/
n64 = 64; /*0xfdc5*/
v23 = (8 * n64) | *(_BYTE *)(a2 + 14) & 1; /*0xfdd3*/
v24 = *(unsigned __int8 *)(a2 + 10); /*0xfdd7*/
v22[1] = 0; /*0xfddf*/
v22[3] = 0; /*0xfde3*/
*v22 = v24 | ((v23 | 2) << 13); /*0xfdec*/
v25 = (_DWORD *)v7[4]; /*0xfdef*/
*v25 = -234618880; /*0xfdf3*/
v25[1] = (_DWORD)v25 + 24; /*0xfdfc*/
v25[3] = (_DWORD)v25 + 31; /*0xfe02*/
if ( v19 )
{
v26 = (_DWORD *)v7[5]; /*0xfe18*/
ElibReadNvStore(UsbHcPtr, a3 & 0x80, a6, v19, &v40, (__int64)&v39); /*0xfe3b*/
v26[1] = v40; /*0xfe4d*/
v27 = v19 + a6 - 1; /*0xfe66*/
*v26 = (a3 & 0x80u) != 0 ? -216793088 : -217317376;
v26[3] = v27; /*0xfe6a*/
}
v28 = v7[6]; /*0xfe6f*/
*(_QWORD *)(v28 + 4) = 0; /*0xfe7c*/
*(_DWORD *)(v28 + 12) = 0; /*0xfe8b*/
*(_DWORD *)v28 = (a3 & 0x80u) != 0 ? -217317376 : -216793088;
v29 = v7[4]; /*0xfe90*/
v22[2] = v29; /*0xfe94*/
if ( v19 ) /*0xfe9c*/
{
*(_DWORD *)(v29 + 8) = *((_DWORD *)v7 + 10); /*0xfea1*/
v29 = v7[5]; /*0xfea4*/
}
*(_DWORD *)(v29 + 8) = *((_DWORD *)v7 + 12); /*0xfeab*/
*(_DWORD *)(v7[6] + 8LL) = 0; /*0xfeb2*/
v30 = v7[4]; /*0xfeb5*/
do /*0xfed5*/
{
*(_DWORD *)(v30 + 16) = 0; /*0xfec0*/
*(_BYTE *)(v30 + 20) = UsbRegisterNotifyFunc((__int64)OhciApDispatchSub); /*0xfec8*/
*(_BYTE *)(v30 + 21) = 1; /*0xfecb*/
v30 = *(unsigned int *)(v30 + 8); /*0xfecf*/
}
while ( v30 ); /*0xfed5*/
*v22 &= ~0x4000u; /*0xfed7*/
DebugLogPrint_14(UsbHcPtr, 0x20u, (int)v22); /*0xfee5*/
DebugLogPrint_14(UsbHcPtr, 8u, 2); /*0xfef4*/
DebugLogPrint_9(UsbHcPtr, v22, v7[6], (_BYTE *)a2); /*0xff06*/
*v22 |= 0x4000u; /*0xff0b*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0xff14*/
v32 = v19; /*0xff1b*/
v33 = *(_DWORD *)v7[6]; /*0xff1f*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0xff22*/
v34 = v7[5]; /*0xff29*/
LOBYTE(v35) = *(_BYTE *)(UsbRtDispatchTable + 30472); /*0xff2d*/
n15 = v33 >> 28; /*0xff34*/
if ( *(_DWORD *)(v34 + 4) ) /*0xff38*/
v32 = *(_DWORD *)(v34 + 4) - a6; /*0xff40*/
v37 = 0; /*0xff47*/
if ( (_BYTE)n15 ) /*0xff4d*/
{
if ( (_BYTE)n15 == 4 ) /*0xff53*/
{
LOBYTE(v35) = v35 | 4; /*0xff64*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0xff68*/
*(_BYTE *)(UsbRtDispatchTable + 30472) = v35; /*0xff6f*/
}
else if ( (_BYTE)n15 == 15 ) /*0xff59*/
{
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xff5b*/
}
}
else
{
v37 = v32; /*0xff78*/
}
if ( v19 ) /*0xff7f*/
(*(void (__fastcall **)(_QWORD, __int64, __int64, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))( /*0xff8d*/
*(_QWORD *)(UsbHcPtr + 104),
v39,
n15,
v35);
return v37; /*0xffab*/
}
// Function: OhciBulkTransfer @ 0xffb8 (0x34c bytes)
__int64 __fastcall OhciBulkTransfer(__int64 UsbHcPtr, __int64 a2, signed __int8 a3, __int64 a4, unsigned int n896)
{
unsigned __int64 v8; // rbp
unsigned __int64 v9; // rcx
unsigned __int64 v10; // rdi
unsigned __int64 v11; // rax
unsigned __int64 v12; // rax
unsigned __int16 v13; // r13
unsigned __int8 v14; // r14
unsigned int n896_1; // r15d
unsigned int v16; // ebp
int n2048; // eax
int v18; // r14d
int v19; // r14d
int i; // edx
int n896_2; // r13d
int v22; // r8d
int n15; // ecx
__int64 UsbRtDispatchTable_1; // rax
__int64 UsbRtDispatchTable; // rax
int v26; // ecx
unsigned __int8 v28; // [rsp+30h] [rbp-48h]
char v29; // [rsp+31h] [rbp-47h]
__int64 v30; // [rsp+38h] [rbp-40h] BYREF
__int64 v31; // [rsp+40h] [rbp-38h] BYREF
v30 = 0; /*0xffe5*/
v31 = 0; /*0xffec*/
v8 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xfffd*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x1000c*/
return 0; /*0x1000c*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x1001d*/
return 0; /*0x1001d*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x10027*/
return 0; /*0x10027*/
if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 ) /*0x1003b*/
return 0; /*0x1003b*/
if ( (*(_BYTE *)a2 & 3) == 0 ) /*0x10046*/
return 0; /*0x10046*/
v9 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x10053*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x1005a*/
v10 = *(_QWORD *)(UsbHcPtr + 40); /*0x10061*/
if ( v10 < v9 ) /*0x10068*/
return 0; /*0x10068*/
if ( v10 + 88 > v8 ) /*0x10075*/
return 0; /*0x10075*/
v11 = *(_QWORD *)(v10 + 72); /*0x1007b*/
if ( v11 < v9 ) /*0x10082*/
return 0; /*0x10082*/
if ( v11 + 32 > v8 ) /*0x1008f*/
return 0; /*0x1008f*/
v12 = *(_QWORD *)(v10 + 80); /*0x10095*/
if ( v12 < v9 || v12 + 32 > v8 ) /*0x100a9*/
return 0; /*0x100a9*/
v13 = a3 >= 0 ? *(_WORD *)(a2 + 106) : *(_WORD *)(a2 + 104);
v14 = a3 < 0 ? *(_BYTE *)(a2 + 69) : *(_BYTE *)(a2 + 70);
v29 = a3 | v14; /*0x100db*/
v28 = FwVolDriverEntry_2(a2, a3 | v14); /*0x100e4*/
if ( !v13 ) /*0x100ec*/
return 0; /*0x102e4*/
n896_1 = n896; /*0x100f2*/
v16 = 0; /*0x1011f*/
ElibReadNvStore(UsbHcPtr, a3, a4, n896, &v30, (__int64)&v31); /*0x10121*/
if ( n896 ) /*0x10129*/
{
n2048 = 2048; /*0x10134*/
v18 = v14 << 7; /*0x10142*/
if ( a3 < 0 ) /*0x1014e*/
n2048 = 4096; /*0x1014e*/
v19 = (v13 << 16) | n2048 | v18; /*0x1015b*/
for ( i = v28 << 24; ; i = v28 << 24 ) /*0x1015e*/
{
n896_2 = 896; /*0x10169*/
if ( n896_1 < 0x380 ) /*0x10177*/
n896_2 = n896_1; /*0x10177*/
v22 = v16 + v30; /*0x1017b*/
**(_DWORD **)(v10 + 72) = 0x4000; /*0x1017e*/
*(_DWORD *)(*(_QWORD *)(v10 + 72) + 8LL) = *(_DWORD *)(v10 + 80); /*0x1018b*/
*(_DWORD *)(*(_QWORD *)(v10 + 72) + 4LL) = 0; /*0x10192*/
*(_DWORD *)(*(_QWORD *)(v10 + 72) + 12LL) = 0; /*0x1019a*/
**(_DWORD **)(v10 + 72) = v19 | *(unsigned __int8 *)(a2 + 10); /*0x101a9*/
**(_DWORD **)(v10 + 80) = -233570304; /*0x101b6*/
**(_DWORD **)(v10 + 80) |= i; /*0x101c0*/
*(_DWORD *)(*(_QWORD *)(v10 + 80) + 4LL) = v22; /*0x101c6*/
*(_DWORD *)(*(_QWORD *)(v10 + 80) + 12LL) = n896_2 + v22 - 1; /*0x101ce*/
*(_DWORD *)(*(_QWORD *)(v10 + 80) + 8LL) = 0; /*0x101dc*/
*(_DWORD *)(*(_QWORD *)(v10 + 80) + 16LL) = 0; /*0x101e4*/
*(_BYTE *)(*(_QWORD *)(v10 + 80) + 20LL) = UsbRegisterNotifyFunc((__int64)OhciApInterruptEnd); /*0x101f6*/
*(_BYTE *)(*(_QWORD *)(v10 + 80) + 21LL) = 1; /*0x10200*/
**(_DWORD **)(v10 + 72) &= ~0x4000u; /*0x10208*/
DebugLogPrint_14(UsbHcPtr, 0x28u, *(_DWORD *)(v10 + 72)); /*0x10210*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= 0xFCu; /*0x10224*/
DebugLogPrint_14(UsbHcPtr, 8u, 4); /*0x1022f*/
DebugLogPrint_9(UsbHcPtr, *(_DWORD **)(v10 + 72), *(_QWORD *)(v10 + 80), (_BYTE *)a2); /*0x10242*/
**(_DWORD **)(v10 + 72) |= 0x4000u; /*0x10251*/
FwVolDriverEntry_1(a2, v29, *(_BYTE *)(*(_QWORD *)(v10 + 80) + 3LL) & 1); /*0x10261*/
n15 = **(_DWORD **)(v10 + 80) >> 28; /*0x1026c*/
if ( (_BYTE)n15 == 4 ) /*0x10272*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x10290*/
*(_BYTE *)(UsbRtDispatchTable + 30472) |= 1u; /*0x10297*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0x1029e*/
}
else if ( (_BYTE)n15 == 15 ) /*0x10277*/
{
UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x10279*/
*(_BYTE *)(UsbRtDispatchTable + 30472) |= 2u; /*0x10280*/
*(_DWORD *)(UsbRtDispatchTable_1 + 30476) |= 0x40u; /*0x10287*/
goto LABEL_34; /*0x1028e*/
}
if ( (_BYTE)n15 ) /*0x102a7*/
goto LABEL_34; /*0x102a7*/
v26 = *(_DWORD *)(*(_QWORD *)(v10 + 80) + 4LL); /*0x102ad*/
if ( v26 ) /*0x102b2*/
break; /*0x102b2*/
v16 += n896_2; /*0x102b4*/
n896_1 -= n896_2; /*0x102b7*/
if ( !n896_1 ) /*0x102ba*/
goto LABEL_34; /*0x102ba*/
}
v16 = v26 - v30; /*0x102ce*/
}
LABEL_34:
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v31); /*0x102d0*/
return v16; /*0x102f7*/
}
// Function: OhciInterruptTransfer @ 0x10304 (0x224 bytes)
__int64 __fastcall OhciInterruptTransfer(
__int64 UsbHcPtr,
_BYTE *a2,
char a3,
unsigned __int16 a4,
__int64 a5,
unsigned __int16 a6)
{
__int64 v11; // rax
_DWORD *v12; // rsi
__int64 v13; // r14
int v14; // r9d
int v15; // ecx
int v16; // edi
int v17; // r15d
_DWORD *v18; // rdx
int n15; // eax
__int64 v20; // [rsp+30h] [rbp-38h] BYREF
__int64 v21; // [rsp+38h] [rbp-30h] BYREF
v20 = 0; /*0x10327*/
v21 = 0; /*0x1032e*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x10340*/
return 0; /*0x10340*/
if ( (UsbValidateDeviceEntry((__int64)a2) & 0x8000000000000000uLL) != 0LL ) /*0x10356*/
return 0; /*0x10356*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x1035c*/
return 0; /*0x1035c*/
if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 ) /*0x1036d*/
return 0; /*0x1036d*/
if ( (*a2 & 3) == 0 ) /*0x10375*/
return 0; /*0x10375*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x10383*/
v11 = UsbConfig_1(2u); /*0x1038a*/
v12 = (_DWORD *)v11; /*0x1038f*/
if ( !v11 ) /*0x10395*/
return 0; /*0x10342*/
v13 = v11 + 32; /*0x10397*/
*(_QWORD *)v11 = 0x4000; /*0x1039b*/
*(_DWORD *)(v11 + 8) = v11 + 32; /*0x103a2*/
*(_DWORD *)(v11 + 12) = 0; /*0x103a6*/
*(_BYTE *)(v11 + 16) = UsbGetInfo_10(a2[320]); /*0x103b8*/
v14 = (unsigned __int8)FwVolDriverEntry_2((__int64)a2, a3); /*0x103cb*/
v15 = a4; /*0x103d3*/
LOWORD(v16) = a6; /*0x103d9*/
*v12 = (unsigned __int8)a2[10]
| (a3 < 0 ? 4096 : 2048)
| ((unsigned __int8)a3 << 7)
| (((8 * v15) | a2[14] & 1) << 13);
*(_DWORD *)v13 = (v14 << 24) | 0xF2140000; /*0x1042a*/
ElibReadNvStore(UsbHcPtr, a3 & 0x80, a5, a6, &v20, (__int64)&v21); /*0x10441*/
v17 = v20; /*0x10446*/
*(_DWORD *)(v13 + 4) = v20; /*0x10452*/
*(_DWORD *)(v13 + 8) = 0; /*0x10456*/
*(_DWORD *)(v13 + 16) = 0; /*0x1045a*/
*(_DWORD *)(v13 + 12) = a6 + v17 - 1; /*0x10464*/
*(_BYTE *)(v13 + 20) = UsbRegisterNotifyFunc((__int64)OhciApInterruptEnd); /*0x10470*/
UhciInsertFrameListEntry(UsbHcPtr, (__int64)v12); /*0x10477*/
*(_BYTE *)(v13 + 21) = 1; /*0x1047c*/
*v12 &= ~0x4000u; /*0x10484*/
DebugLogPrint_9(UsbHcPtr, v18, v13, a2); /*0x1048e*/
UsbConfig_5(UsbHcPtr, (__int64)v12); /*0x10499*/
FwVolDriverEntry_1((__int64)a2, a3, *(_BYTE *)(v13 + 3) & 1); /*0x104ac*/
n15 = *(_DWORD *)v13 >> 28; /*0x104b4*/
if ( (_BYTE)n15 == 4 ) /*0x104b9*/
{
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0x104d6*/
}
else if ( (_BYTE)n15 == 15 ) /*0x104bd*/
{
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0x104c6*/
}
if ( *(_DWORD *)(v13 + 4) ) /*0x104dd*/
v16 = *(_DWORD *)(v13 + 4) - v17; /*0x104e7*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v21); /*0x104f6*/
FwVolConfig((unsigned __int64)v12, 2u); /*0x10502*/
return (unsigned __int16)v16; /*0x1051b*/
}
// Function: OhciIsochTransfer @ 0x10528 (0x1fa bytes)
char __fastcall OhciIsochTransfer(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int8 v5; // bp
__int64 v6; // rsi
__int64 v7; // rsi
char v8; // cl
int v9; // edx
int v10; // edx
int n2048; // eax
__int64 v12; // rax
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x1057c*/
|| (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80
|| (*(_BYTE *)a2 & 3) == 0 )
{
return -1; /*0x1054c*/
}
v5 = FwVolDriverEntry_2(a2, *(_BYTE *)(a2 + 64)); /*0x1058e*/
v6 = UsbConfig_1(1u); /*0x10596*/
if ( !v6 ) /*0x1059c*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 1770, (__int64)"Ptr"); /*0x105b1*/
*(_QWORD *)(a2 + 32) = v6; /*0x105bb*/
v7 = UsbConfig_1(1u); /*0x105c4*/
if ( !v7 ) /*0x105ca*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 1773, (__int64)"Ptr"); /*0x105df*/
v8 = *(_BYTE *)(a2 + 64); /*0x105e4*/
v9 = *(_BYTE *)(a2 + 14) & 1 | (8 * *(unsigned __int16 *)(a2 + 62)); /*0x105fc*/
*(_QWORD *)(a2 + 24) = v7; /*0x105fe*/
v10 = ((v8 & 0xF | 0x80) << 7) | (v9 << 13); /*0x10611*/
n2048 = 2048; /*0x10613*/
if ( v8 < 0 ) /*0x1061a*/
n2048 = 4096; /*0x1061a*/
**(_DWORD **)(a2 + 32) = *(unsigned __int8 *)(a2 + 10) | n2048 | v10; /*0x1062a*/
*(_DWORD *)(*(_QWORD *)(a2 + 32) + 8LL) = *(_DWORD *)(a2 + 24); /*0x10633*/
*(_DWORD *)(*(_QWORD *)(a2 + 32) + 8LL) |= 2 * v5; /*0x10640*/
*(_DWORD *)(*(_QWORD *)(a2 + 32) + 12LL) = 0; /*0x10647*/
*(_DWORD *)(*(_QWORD *)(a2 + 32) + 4LL) = 0; /*0x1064f*/
*(_BYTE *)(*(_QWORD *)(a2 + 32) + 16LL) = UsbGetInfo_10(*(_BYTE *)(a2 + 320)); /*0x10662*/
v12 = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x10674*/
*(_QWORD *)(a2 + 232) = v12; /*0x10679*/
if ( !v12 ) /*0x10683*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 1790, (__int64)"DevInfo->fpPollDataBuffer"); /*0x10698*/
**(_DWORD **)(a2 + 24) = -267124736; /*0x106a6*/
*(_DWORD *)(*(_QWORD *)(a2 + 24) + 16LL) = -267124736; /*0x106ac*/
*(_DWORD *)(*(_QWORD *)(a2 + 24) + 4LL) = *(_DWORD *)(a2 + 232); /*0x106b9*/
*(_DWORD *)(*(_QWORD *)(a2 + 24) + 12LL) = *(unsigned __int16 *)(a2 + 322) - 1 + *(_DWORD *)(a2 + 232); /*0x106d8*/
*(_DWORD *)(*(_QWORD *)(a2 + 24) + 8LL) = 0; /*0x106df*/
*(_BYTE *)(*(_QWORD *)(a2 + 24) + 20LL) = UsbRegisterNotifyFunc((__int64)OhciApSubFunc); /*0x106ec*/
UhciInsertFrameListEntry(UsbHcPtr, *(_QWORD *)(a2 + 32)); /*0x106f6*/
*(_BYTE *)(*(_QWORD *)(a2 + 24) + 21LL) = 1; /*0x106ff*/
**(_DWORD **)(a2 + 32) &= ~0x4000u; /*0x10707*/
return 0; /*0x1071c*/
}
// Function: OhciApTransfer @ 0x10724 (0xf4 bytes)
char __fastcall OhciApTransfer(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int64 v2; // rsi
unsigned __int64 v4; // r14
unsigned __int64 v7; // rcx
v2 = *(_QWORD *)(a2 + 32); /*0x10739*/
v4 = *(_QWORD *)(a2 + 24); /*0x10740*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x1077a*/
|| (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 )
{
return -1; /*0x10751*/
}
if ( v2 ) /*0x10781*/
{
*(_DWORD *)v4 = 0; /*0x10783*/
*(_DWORD *)(v4 + 16) = 0; /*0x1078a*/
*(_BYTE *)(v4 + 21) = 0; /*0x10792*/
UsbConfig_5(UsbHcPtr, v2); /*0x10797*/
FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), (*(_DWORD *)(v2 + 8) & 2) != 0); /*0x107ac*/
FwVolConfig(v4, 1u); /*0x107b9*/
*(_QWORD *)(a2 + 24) = 0; /*0x107be*/
FwVolConfig(v2, 1u); /*0x107cb*/
v7 = *(_QWORD *)(a2 + 232); /*0x107d0*/
*(_QWORD *)(a2 + 32) = 0; /*0x107d7*/
if ( v7 ) /*0x107df*/
{
FwVolConfig(v7, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x107f3*/
*(_QWORD *)(a2 + 232) = 0; /*0x107f8*/
}
}
return 0; /*0x10811*/
}
// Function: OhciApSubFunc @ 0x10818 (0x12c bytes)
char __fastcall OhciApSubFunc(__int64 a1, __int64 a2, __int64 a3)
{
__int64 UsbRtDispatchTable; // rbp
unsigned __int8 i; // dl
__int64 v7; // rcx
__int64 v8; // rdi
__int16 v10; // cx
void (__fastcall *v11)(__int64, __int64, __int64, _QWORD, __int16); // r10
int v12; // eax
if ( *(_BYTE *)(a3 + 21) ) /*0x1082c*/
{
*(_BYTE *)(a3 + 21) = 0; /*0x10842*/
DebugLogPrint_20(a1, 4u, 4); /*0x1084a*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x1084f*/
for ( i = 1; i < 0x37u; ++i ) /*0x10856*/
{
v7 = 448LL * i; /*0x10862*/
v8 = v7 + UsbRtDispatchTable + 3056; /*0x10869*/
if ( (*(_BYTE *)v8 & 2) != 0 && *(_QWORD *)(v8 + 24) == a3 ) /*0x10875*/
break; /*0x10875*/
}
if ( i == 55 ) /*0x10881*/
return -1; /*0x10885*/
FwVolDriverEntry_1( /*0x1089f*/
v7 + UsbRtDispatchTable + 3056,
*(_BYTE *)(v8 + 64),
(*(_DWORD *)(*(_QWORD *)(v8 + 32) + 8LL) & 2) != 0);
if ( (*(_DWORD *)a3 & 0xF0000000) == 0 ) /*0x108aa*/
{
if ( *(_DWORD *)(a3 + 4) ) /*0x108ac*/
v10 = *(_WORD *)(a3 + 4) - *(_WORD *)(v8 + 232); /*0x108b6*/
else
v10 = *(_WORD *)(v8 + 322); /*0x108bf*/
if ( (unsigned __int8)(*(_BYTE *)(v8 + 21) - 1) <= 0x31u ) /*0x108cd*/
{
v11 = *(void (__fastcall **)(__int64, __int64, __int64, _QWORD, __int16))(UsbRtDispatchTable /*0x108d3*/
+ 8LL * *(unsigned __int8 *)(v8 + 21)
+ 29456);
if ( v11 ) /*0x108de*/
v11(a1, v8, a3, *(_QWORD *)(v8 + 232), v10); /*0x108f5*/
}
}
DebugLogPrint_22(a1, 4u, 4); /*0x10903*/
v12 = *(_DWORD *)(a3 + 16); /*0x10908*/
*(_DWORD *)(a3 + 8) = 0; /*0x1090b*/
*(_DWORD *)a3 = v12; /*0x1090f*/
*(_DWORD *)(a3 + 4) = *(_DWORD *)(v8 + 232); /*0x10917*/
*(_DWORD *)(*(_QWORD *)(v8 + 32) + 8LL) &= 2u; /*0x1091e*/
*(_DWORD *)(*(_QWORD *)(v8 + 32) + 8LL) |= a3; /*0x10926*/
*(_BYTE *)(a3 + 21) = 1; /*0x10929*/
}
return 0; /*0x1093e*/
}
// Function: OhciApCtrlIn @ 0x10944 (0xa0 bytes)
char __fastcall OhciApCtrlIn(__int64 a1)
{
unsigned __int64 v2; // rdi
unsigned __int64 v3; // rdx
unsigned __int64 v4; // r8
_DWORD *v5; // rcx
v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x10961*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x10970*/
return -1; /*0x10970*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x10976*/
return -1; /*0x10976*/
if ( (DebugLogPrint_13(a1, 4u) & 0xC0) != 0x80 ) /*0x10987*/
return -1; /*0x10987*/
v3 = *(_QWORD *)(a1 + 40); /*0x1098b*/
if ( !v3 ) /*0x10992*/
return -1; /*0x10992*/
v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x1099b*/
if ( v3 < v4 ) /*0x109a5*/
return -1; /*0x109a5*/
if ( v3 + 88 > v2 ) /*0x109ae*/
return -1; /*0x109ae*/
v5 = *(_DWORD **)(v3 + 8); /*0x109b0*/
if ( !v5 || (unsigned __int64)v5 < v4 || (unsigned __int64)(v5 + 8) > v2 ) /*0x109c5*/
return -1; /*0x109d7*/
*v5 |= 0x4000u; /*0x109c7*/
*(_BYTE *)(*(_QWORD *)(v3 + 16) + 21LL) = 0; /*0x109cf*/
return 0; /*0x109de*/
}
// Function: OhciApCtrlOut @ 0x109e4 (0xc3 bytes)
char __fastcall OhciApCtrlOut(__int64 a1)
{
unsigned __int64 v2; // rdi
unsigned __int64 v3; // rdx
unsigned __int64 v4; // rcx
unsigned __int64 v5; // rax
v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x10a01*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x10a10*/
return -1; /*0x10a10*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x10a1a*/
return -1; /*0x10a1a*/
if ( (DebugLogPrint_13(a1, 4u) & 0xC0) != 0x80 ) /*0x10a2b*/
return -1; /*0x10a2b*/
v3 = *(_QWORD *)(a1 + 40); /*0x10a2f*/
if ( !v3 ) /*0x10a36*/
return -1; /*0x10a36*/
v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x10a3f*/
if ( v3 < v4 ) /*0x10a49*/
return -1; /*0x10a49*/
if ( v3 + 88 > v2 ) /*0x10a52*/
return -1; /*0x10a52*/
v5 = *(_QWORD *)(v3 + 8); /*0x10a54*/
if ( !v5 || v5 < v4 || v5 + 32 > v2 ) /*0x10a69*/
return -1; /*0x10a9a*/
*(_DWORD *)(*(_QWORD *)(v3 + 16) + 8LL) = 0; /*0x10a6f*/
*(_DWORD *)(*(_QWORD *)(v3 + 8) + 8LL) = *(_DWORD *)(v3 + 16); /*0x10a7a*/
**(_DWORD **)(v3 + 16) = *(_DWORD *)(*(_QWORD *)(v3 + 16) + 16LL); /*0x10a84*/
*(_BYTE *)(*(_QWORD *)(v3 + 16) + 21LL) = 1; /*0x10a8a*/
**(_DWORD **)(v3 + 8) &= ~0x4000u; /*0x10a92*/
return 0; /*0x10aa1*/
}
// Function: OhciApDispatch @ 0x10aa8 (0x103 bytes)
char __fastcall OhciApDispatch(_BYTE *UsbHcPtr)
{
unsigned __int16 n84; // bp
unsigned __int8 v3; // di
unsigned int v5; // eax
unsigned int v6; // esi
n84 = 84; /*0x10ac4*/
v3 = 0; /*0x10ace*/
if ( (HcCheckInit((__int64)UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x10af5*/
|| (UsbHcPtr[64] & 1) == 0
|| (DebugLogPrint_13((__int64)UsbHcPtr, 4u) & 0xC0) != 0x80 )
{
return -1; /*0x10ad5*/
}
v5 = DebugLogPrint_13((__int64)UsbHcPtr, 0x48u); /*0x10b00*/
v6 = v5; /*0x10b05*/
if ( (v5 & 0x200) == 0 ) /*0x10b0b*/
{
if ( (v5 & 0x100) != 0 ) /*0x10b11*/
{
if ( UsbHcPtr[32] ) /*0x10b27*/
{
do /*0x10b65*/
{
DebugLogPrint_22((__int64)UsbHcPtr, 0x4Cu, 0x10000 << (v3 + 1)); /*0x10b44*/
DebugLogPrint_14((__int64)UsbHcPtr, n84, 256); /*0x10b55*/
n84 += 4; /*0x10b5a*/
++v3; /*0x10b5e*/
}
while ( v3 < UsbHcPtr[32] ); /*0x10b65*/
}
}
else
{
DebugLogPrint_14((__int64)UsbHcPtr, 0x50u, 0x10000); /*0x10b20*/
}
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000LL * ((v6 >> 23) & 0xFE)); /*0x10b80*/
}
UsbGetInfo_1(UsbHcPtr); /*0x10b89*/
return 0; /*0x10ba4*/
}
// Function: UhciInsertFrameListEntry @ 0x10bac (0x69 bytes)
char __fastcall UhciInsertFrameListEntry(__int64 UsbHcPtr, __int64 a2)
{
__int16 v2; // r8
unsigned __int16 i; // r9
_DWORD *j; // r10
__int64 v5; // rax
if ( !a2 ) /*0x10bb9*/
return -1; /*0x10bb9*/
LOBYTE(v2) = *(_BYTE *)(a2 + 16); /*0x10bbb*/
if ( !(_BYTE)v2 ) /*0x10bc2*/
return -1; /*0x10c0d*/
for ( i = 0; i < *(_WORD *)(UsbHcPtr + 48); i += v2 ) /*0x10bc8*/
{
for ( j = (_DWORD *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * i); ; j = (_DWORD *)(v5 + 12) ) /*0x10bd6*/
{
v5 = (unsigned int)*j; /*0x10be6*/
if ( !*j || *((_BYTE *)&word_10 + (unsigned int)*j) <= (unsigned __int8)v2 ) /*0x10be0*/
break; /*0x10be0*/
}
if ( v5 != a2 ) /*0x10bf1*/
{
*(_DWORD *)(a2 + 12) = v5; /*0x10bf3*/
*j = a2; /*0x10bf6*/
}
v2 = *(unsigned __int8 *)(a2 + 16); /*0x10bf9*/
}
return 0; /*0x10c14*/
}
// Function: UsbConfig_5 @ 0x10c18 (0x125 bytes)
char __fastcall UsbConfig_5(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int16 n0x64; // bx
unsigned __int16 i; // r8
_DWORD *v5; // r9
__int64 v6; // rax
n0x64 = 0; /*0x10c22*/
if ( !a2 || !*(_BYTE *)(a2 + 16) ) /*0x10c30*/
return -1; /*0x10d30*/
*(_DWORD *)a2 |= 0x4000u; /*0x10c39*/
for ( i = 0; i < *(_WORD *)(UsbHcPtr + 48); i += *(unsigned __int8 *)(a2 + 16) ) /*0x10c41*/
{
v5 = (_DWORD *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * i); /*0x10c4f*/
v6 = (unsigned int)*v5; /*0x10c53*/
if ( *v5 ) /*0x10c53*/
{
do /*0x10c6a*/
{
if ( v6 == a2 ) /*0x10c5e*/
break; /*0x10c5e*/
v5 = (_DWORD *)(v6 + 12); /*0x10c60*/
v6 = *(unsigned int *)(v6 + 12); /*0x10c64*/
}
while ( v6 ); /*0x10c6a*/
if ( v6 ) /*0x10c6f*/
*v5 = *(_DWORD *)(a2 + 12); /*0x10c74*/
}
}
DebugLogPrint_14(UsbHcPtr, 0xCu, 4); /*0x10c92*/
DebugLogPrint_14(UsbHcPtr, 0x10u, 4); /*0x10ca3*/
do /*0x10cd2*/
{
if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 4) != 0 ) /*0x10cb7*/
break; /*0x10cb7*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0x10cc5*/
++n0x64; /*0x10ccb*/
}
while ( n0x64 < 0x64u ); /*0x10cd2*/
if ( n0x64 >= 0x64u ) /*0x10cd8*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2272, (__int64)"Index < 100"); /*0x10ced*/
if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 4) == 0 ) /*0x10d01*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2273, (__int64)"HcReadHcMem(HcStruc, 0x0c) & 0x00000004"); /*0x10d16*/
DebugLogPrint_14(UsbHcPtr, 0x14u, 4); /*0x10d27*/
return 0; /*0x10d37*/
}
// Function: UsbRegister @ 0x10d40 (0x1d0 bytes)
char __fastcall UsbRegister(__int64 UsbHcPtr)
{
__int64 v2; // rax
__int64 *v3; // rbx
const char *DescPtrs; // r8
__int64 n2303; // rdx
_DWORD *v7; // rax
__int64 v8; // rax
__int64 *v9; // rcx
__int64 n4; // rdx
__int64 v11; // rsi
__int64 v12; // rsi
_DWORD *v13; // rax
v2 = UsbConfig_1(3u); /*0x10d57*/
v3 = (__int64 *)v2; /*0x10d5c*/
if ( !v2 ) /*0x10d62*/
{
DescPtrs = "DescPtrs"; /*0x10d64*/
n2303 = 2303; /*0x10d6b*/
LABEL_3:
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", n2303, (__int64)DescPtrs); /*0x10d70*/
return -1; /*0x10d7e*/
}
*(_QWORD *)(UsbHcPtr + 40) = v2; /*0x10d88*/
v7 = (_DWORD *)UsbConfig_1(1u); /*0x10d8c*/
if ( !v7 ) /*0x10d94*/
{
DescPtrs = "Ptr"; /*0x10d96*/
n2303 = 2315; /*0x10d9d*/
goto LABEL_3; /*0x10da2*/
}
*v3 = (__int64)v7; /*0x10da4*/
*v7 = 0x4000; /*0x10daa*/
*(_DWORD *)(*v3 + 12) = 0; /*0x10db3*/
*(_BYTE *)(*v3 + 16) = 1; /*0x10dba*/
UhciInsertFrameListEntry(UsbHcPtr, *v3); /*0x10dc1*/
v8 = UsbConfig_1(6u); /*0x10dcb*/
if ( !v8 ) /*0x10dd3*/
{
DescPtrs = "Ptr"; /*0x10dd5*/
n2303 = 2331; /*0x10ddc*/
goto LABEL_3; /*0x10de1*/
}
v9 = v3 + 3; /*0x10de3*/
n4 = 4; /*0x10de7*/
do /*0x10dfb*/
{
*v9 = v8; /*0x10dec*/
v8 += 32; /*0x10def*/
++v9; /*0x10df3*/
--n4; /*0x10df7*/
}
while ( n4 ); /*0x10dfb*/
v3[9] = v8; /*0x10dfd*/
v3[10] = v8 + 32; /*0x10e05*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x10) == 0 ) /*0x10e0d*/
{
v11 = UsbConfig_1(1u); /*0x10e1b*/
if ( !v11 ) /*0x10e21*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2361, (__int64)"Ptr"); /*0x10e36*/
v3[1] = v11; /*0x10e40*/
v12 = UsbConfig_1(1u); /*0x10e49*/
if ( !v12 ) /*0x10e4f*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2365, (__int64)"Ptr"); /*0x10e64*/
v13 = (_DWORD *)v3[1]; /*0x10e69*/
v3[2] = v12; /*0x10e6d*/
*v13 = 544824; /*0x10e71*/
*(_DWORD *)(v3[1] + 8) = *((_DWORD *)v3 + 4); /*0x10e7e*/
*(_DWORD *)(v3[1] + 12) = 0; /*0x10e8a*/
*(_DWORD *)(v3[1] + 4) = 0; /*0x10e92*/
*(_BYTE *)(v3[1] + 16) = 8; /*0x10e9a*/
*(_DWORD *)v3[2] = -132907008; /*0x10ea2*/
*(_DWORD *)(v3[2] + 16) = -132907008; /*0x10ea8*/
*(_DWORD *)(v3[2] + 4) = *((_DWORD *)v3 + 4) + 24; /*0x10eb5*/
*(_DWORD *)(v3[2] + 12) = *((_DWORD *)v3 + 4) + 24; /*0x10ec2*/
*(_DWORD *)(v3[2] + 8) = 0; /*0x10ed0*/
*(_BYTE *)(v3[2] + 20) = UsbRegisterNotifyFunc((__int64)OhciStopHc); /*0x10edd*/
*(_BYTE *)(v3[2] + 21) = 0; /*0x10ee7*/
UhciInsertFrameListEntry(UsbHcPtr, v3[1]); /*0x10eef*/
UsbServiceHcPolling(UsbHcPtr, 0); /*0x10ef9*/
}
return 0; /*0x10f0a*/
}
// Function: UsbGetInfo_1 @ 0x10f10 (0xca bytes)
__int64 __fastcall sub_10F10(_BYTE *UsbHcPtr)
{
__int64 v3; // rdx
__int64 v4; // r8
__int64 v5; // r9
unsigned __int8 v6; // di
char i; // si
if ( *(_BYTE *)(UsbRtDispatchTable + 29872) == 1 ) /*0x10f30*/
return 255; /*0x10f32*/
(*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x10f48*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x10f63*/
DebugLogPrint_14((__int64)UsbHcPtr, 0x14u, 0x80000000); /*0x10f6a*/
v6 = 1; /*0x10f72*/
for ( i = *UsbHcPtr | 0x80; v6 <= UsbHcPtr[32]; ++v6 ) /*0x10f79*/
{
LOBYTE(v4) = v6; /*0x10f7f*/
LOBYTE(v3) = i; /*0x10f82*/
DebugLogPrint_3((__int64)UsbHcPtr, v3, v4, v5); /*0x10f88*/
}
DebugLogPrint_14((__int64)UsbHcPtr, 0xCu, 64); /*0x10fa2*/
DebugLogPrint_14((__int64)UsbHcPtr, 0x10u, 0x80000000); /*0x10fb5*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x10fc1*/
return 0; /*0x10fd4*/
}
// Function: DebugLogPrint_9 @ 0x10fdc (0xbf bytes)
char __fastcall DebugLogPrint_9(__int64 UsbHcPtr, _DWORD *a2, __int64 a3, _BYTE *a4)
{
unsigned int i_1; // ebx
unsigned int i; // edi
i_1 = 16 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0x1100e*/
for ( i = 0; !i_1 || i < i_1; ++i )
{
OhciResetHc(UsbHcPtr); /*0x1101e*/
if ( !*(_BYTE *)(a3 + 21) ) /*0x11027*/
return 0; /*0x11027*/
if ( (*a4 & 3) == 0 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI Abort: devinfo: %x\n", (_DWORD)a4);
return -1; /*0x1107e*/
}
(*(void (__fastcall **)(__int64))(BootServices + 248))(60); /*0x1103b*/
}
*a2 |= 0x4000u; /*0x11045*/
OhciResetHc(UsbHcPtr); /*0x1104c*/
if ( *(_BYTE *)(a3 + 21) ) /*0x11051*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI Time-Out\n"); /*0x11062*/
return -1; /*0x11069*/
}
return 0; /*0x11091*/
}
// Function: UsbConfig_14 @ 0x1109c (0xa7 bytes)
char __fastcall UsbConfig_14(__int64 UsbHcPtr)
{
__int64 UsbRtDispatchTable; // r8
unsigned __int8 v3; // bl
__int64 v4; // r9
__int64 v5; // rcx
UsbRtDispatchTable = UsbRtDispatchTable; /*0x110a6*/
if ( *(_BYTE *)(UsbRtDispatchTable + 30504) ) /*0x110b0*/
{
v3 = 0; /*0x110ba*/
if ( *(_BYTE *)(UsbRtDispatchTable + 27704) ) /*0x110bc*/
{
do /*0x11134*/
{
v4 = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0x110c5*/
v5 = *(_QWORD *)(v4 + 8LL * v3); /*0x110cf*/
if ( v5 /*0x110f8*/
&& (*(_BYTE *)(v5 + 64) & 5) == 5
&& *(_BYTE *)(v5 + 1) == 48
&& ((*(unsigned __int16 *)(UsbHcPtr + 34) ^ *(unsigned __int16 *)(v5 + 34)) & 0xFFFFFFF8) == 0 )
{
*(_BYTE *)(UsbRtDispatchTable + 30482) = 1; /*0x110fa*/
(*(void (**)(void))(200LL * (((*(unsigned __int8 *)(*(_QWORD *)(v4 + 8LL * v3) + 1LL) - 16) >> 4) + 4) /*0x1111c*/
+ UsbRtDispatchTable
+ 128))();
UsbRtDispatchTable = UsbRtDispatchTable; /*0x11124*/
}
++v3; /*0x1112b*/
}
while ( v3 < *(_BYTE *)(UsbRtDispatchTable + 27704) ); /*0x11134*/
}
}
return 0; /*0x1113d*/
}
// Function: OhciApDispatchSub @ 0x1114c (0x68 bytes)
char __fastcall OhciApDispatchSub(__int64 a1, __int64 a2, __int64 a3)
{
unsigned __int64 v3; // r10
unsigned __int64 v4; // r9
unsigned __int64 v5; // rdx
_DWORD *v6; // rcx
v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x1115d*/
v4 = v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x1116b*/
if ( !(*(_DWORD *)a3 >> 28) ) /*0x11173*/
goto LABEL_8; /*0x11173*/
v5 = *(_QWORD *)(a1 + 40); /*0x11175*/
if ( v5 >= v3 && v5 + 88 <= v4 ) /*0x11185*/
{
v6 = *(_DWORD **)(v5 + 48); /*0x11187*/
if ( (unsigned __int64)v6 >= v3 && (unsigned __int64)(v6 + 8) <= v4 ) /*0x11197*/
{
if ( v6 != (_DWORD *)a3 ) /*0x1119c*/
{
*v6 = *(_DWORD *)a3; /*0x1119e*/
*(_BYTE *)(*(_QWORD *)(v5 + 48) + 21LL) = 0; /*0x111a5*/
}
LABEL_8:
*(_BYTE *)(a3 + 21) = 0; /*0x111a9*/
return 0; /*0x111b0*/
}
}
return -1; /*0x111b0*/
}
// Function: UsbGetInfo_10 @ 0x111b4 (0x50 bytes)
char __fastcall sub_111B4(unsigned __int8 a1)
{
unsigned __int8 v1; // di
char i; // al
v1 = a1; /*0x111c3*/
if ( !a1 ) /*0x111c8*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2763, (__int64)"Interval >= 1 && Interval <= 255"); /*0x111dd*/
for ( i = 0; v1; v1 >>= 1 ) /*0x111e7*/
++i; /*0x111e9*/
return 1 << (i - 1); /*0x111fe*/
}
// Function: HcCheckInit @ 0x11204 (0x61 bytes)
unsigned __int64 __fastcall HcCheckInit(__int64 a1)
{
unsigned __int64 v1; // rax
unsigned __int64 v4; // rcx
_QWORD *v5; // r8
v1 = 0; /*0x11204*/
if ( !a1 ) /*0x1120c*/
return 0x800000000000000FuLL; /*0x1120c*/
v4 = *(unsigned __int8 *)(UsbRtDispatchTable + 27704); /*0x11220*/
if ( *(_BYTE *)(UsbRtDispatchTable + 27704) ) /*0x11220*/
{
v5 = *(_QWORD **)(UsbRtDispatchTable + 27696); /*0x1122d*/
do /*0x11243*/
{
if ( a1 == *v5 ) /*0x11237*/
break; /*0x11237*/
++v1; /*0x11239*/
++v5; /*0x1123c*/
}
while ( v1 < v4 ); /*0x11243*/
}
if ( v1 == v4 ) /*0x11248*/
return 0x800000000000000FuLL; /*0x1120e*/
else
return -(__int64)((*(_BYTE *)(a1 + 64) & 0xC) != 12) & 0x800000000000000FuLL; /*0x11261*/
}
// Function: UsbValidateDeviceEntry @ 0x11268 (0xa1 bytes)
unsigned __int64 __fastcall UsbValidateDeviceEntry(__int64 a1)
{
unsigned __int64 v1; // r9
unsigned __int64 v2; // r8
unsigned __int64 n0x37; // rax
__int64 v5; // rdx
unsigned __int64 v6; // rax
unsigned __int64 v7; // rax
unsigned __int64 v8; // rdx
v1 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x11276*/
v2 = v1 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x11281*/
if ( !a1 ) /*0x11287*/
return 0x800000000000000FuLL; /*0x11287*/
n0x37 = 0; /*0x11294*/
v5 = UsbRtDispatchTable + 3056; /*0x11296*/
do /*0x112b0*/
{
if ( a1 == v5 ) /*0x112a0*/
break; /*0x112a0*/
++n0x37; /*0x112a2*/
v5 += 448; /*0x112a5*/
}
while ( n0x37 < 0x37 ); /*0x112b0*/
if ( n0x37 == 55 ) /*0x112b6*/
return 0x800000000000000FuLL; /*0x112b6*/
v6 = *(_QWORD *)(a1 + 32); /*0x112b8*/
if ( v6 ) /*0x112bf*/
{
if ( v6 < v1 || v6 + 32 > v2 ) /*0x112cd*/
return 0x800000000000000FuLL; /*0x112cd*/
}
v7 = *(_QWORD *)(a1 + 24); /*0x112cf*/
if ( v7 ) /*0x112d6*/
{
if ( v7 < v1 || v7 + 32 > v2 ) /*0x112e4*/
return 0x800000000000000FuLL; /*0x112e4*/
}
v8 = *(_QWORD *)(a1 + 232); /*0x112e6*/
if ( v8 && (v8 < v1 || v8 + *(unsigned __int16 *)(a1 + 322) > v2) ) /*0x11304*/
return 0x800000000000000FuLL; /*0x11289*/
else
return 0; /*0x11306*/
}
// Function: HcPciReadConfig @ 0x1130c (0x58 bytes)
__int64 __fastcall HcPciReadConfig(__int64 a1, unsigned int a2)
{
__int64 v3; // rax
v3 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(*(_QWORD *)(a1 + 104) + 48LL))(*(_QWORD *)(a1 + 104), 2, a2); /*0x11337*/
if ( v3 >= 0 ) /*0x1133d*/
return 0; /*0x1135a*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io Read error: %r at %x\n", v3, a2);
return 0xFFFFFFFFLL; /*0x1135e*/
}
// Function: DebugLogPrint_15 @ 0x11364 (0x4e bytes)
void __fastcall sub_11364(__int64 a1, unsigned int a2)
{
__int64 v3; // rax
v3 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(*(_QWORD *)(a1 + 104) + 56LL))(*(_QWORD *)(a1 + 104), 2, a2); /*0x1138e*/
if ( v3 < 0 )
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io Write32 error: %r at %x\n", v3, a2);
}
// Function: HcPciWriteConfig16 @ 0x113b4 (0x4f bytes)
void __fastcall HcPciWriteConfig16(__int64 UsbHcPtr, unsigned int n192, __int16 n6)
{
__int64 v4; // rax
__int16 n6_1; // [rsp+50h] [rbp+18h] BYREF
n6_1 = n6; /*0x113b4*/
v4 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD, __int64, __int16 *))(*(_QWORD *)(UsbHcPtr + 104) + 56LL))( /*0x113df*/
*(_QWORD *)(UsbHcPtr + 104),
1,
n192,
1,
&n6_1);
if ( v4 < 0 )
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io Write16 error: %r at %x\n", v4, n192);
}
// Function: DebugLogPrint_13 @ 0x11404 (0x5e bytes)
__int64 __fastcall sub_11404(__int64 a1, unsigned int a2)
{
__int64 v2; // rax
__int64 v4; // rax
unsigned int v6; // [rsp+48h] [rbp+10h] BYREF
v2 = *(_QWORD *)(a1 + 104); /*0x1140a*/
v6 = 0; /*0x11411*/
v4 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, _QWORD, __int64, unsigned int *))(v2 + 16))( /*0x11435*/
v2,
2,
0,
a2,
1,
&v6);
if ( v4 >= 0 ) /*0x1143b*/
return v6; /*0x11458*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io MMIO Read error: %r at %x\n", v4, a2);
return 0xFFFFFFFFLL; /*0x1145c*/
}
// Function: DebugLogPrint_14 @ 0x11464 (0x53 bytes)
void __fastcall sub_11464(__int64 a1, unsigned int a2, int a3)
{
__int64 v4; // rax
int v5; // [rsp+50h] [rbp+18h] BYREF
v5 = a3; /*0x11467*/
v4 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD, _QWORD, __int64, int *))(*(_QWORD *)(a1 + 104) + 24LL))( /*0x11493*/
*(_QWORD *)(a1 + 104),
2,
0,
a2,
1,
&v5);
if ( v4 < 0 )
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io MMIO Write error: %r at %x\n", v4, a2);
}
// Function: DebugLogPrint_22 @ 0x114b8 (0x43 bytes)
void __fastcall sub_114B8(__int64 a1, unsigned int a2, int a3)
{
int v6; // eax
if ( (unsigned __int64)a2 <= *(_QWORD *)(a1 + 24) ) /*0x114d3*/
{
v6 = DebugLogPrint_13(a1, a2); /*0x114d7*/
DebugLogPrint_14(a1, a2, a3 | v6); /*0x114e6*/
}
}
// Function: DebugLogPrint_20 @ 0x114fc (0x45 bytes)
void __fastcall sub_114FC(__int64 a1, unsigned int a2, int a3)
{
int v6; // eax
if ( (unsigned __int64)a2 <= *(_QWORD *)(a1 + 24) ) /*0x11517*/
{
v6 = DebugLogPrint_13(a1, a2); /*0x1151b*/
DebugLogPrint_14(a1, a2, ~a3 & v6); /*0x1152c*/
}
}
// Function: DebugLogPrint_21 @ 0x11544 (0x44 bytes)
void __fastcall sub_11544(__int64 a1, int a2, int a3)
{
int v6; // eax
v6 = DebugLogPrint_13(a1, a2 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0x11561*/
DebugLogPrint_14(a1, a2 + *(unsigned __int8 *)(a1 + 50), a3 | v6); /*0x11583*/
}
// Function: DebugLogPrint_19 @ 0x11588 (0x46 bytes)
void __fastcall sub_11588(__int64 a1, int a2, int a3)
{
int v6; // eax
v6 = DebugLogPrint_13(a1, a2 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0x115a5*/
DebugLogPrint_14(a1, a2 + *(unsigned __int8 *)(a1 + 50), ~a3 & v6); /*0x115c9*/
}
// Function: ElibRead32 @ 0x115d0 (0x68 bytes)
char __fastcall ElibRead32(__int64 a1, unsigned int a2, __int64 a3)
{
__int64 v3; // rcx
__int64 v4; // rax
char v6; // [rsp+48h] [rbp+10h] BYREF
LOBYTE(a3) = 4; /*0x115d8*/
v3 = *(_QWORD *)(a1 + 104); /*0x115ea*/
v6 = 0; /*0x115ed*/
v4 = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, _QWORD, __int64, char *))(v3 + 32))(v3, 0, a3, a2, 1, &v6); /*0x115fb*/
if ( v4 < 0 ) /*0x11601*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v4); /*0x11612*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 801, (__int64)"!EFI_ERROR (Status)"); /*0x1162a*/
}
return v6; /*0x11633*/
}
// Function: ElibWrite8 @ 0x11638 (0x63 bytes)
__int64 __fastcall ElibWrite8(__int64 a1, unsigned int a2, __int64 a3)
{
__int64 result; // rax
char v4; // [rsp+50h] [rbp+18h] BYREF
v4 = a3; /*0x1163b*/
LOBYTE(a3) = 4; /*0x11647*/
result = (*(__int64 (__fastcall **)(_QWORD, _QWORD, __int64, _QWORD, __int64, char *))(*(_QWORD *)(a1 + 104) + 40LL))( /*0x11662*/
*(_QWORD *)(a1 + 104),
0,
a3,
a2,
1,
&v4);
if ( result < 0 ) /*0x11668*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x11679*/
return Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 832, (__int64)"!EFI_ERROR (Status)"); /*0x11691*/
}
return result; /*0x11696*/
}
// Function: AssertCpuDeadLoop_1 @ 0x1169c (0x6d bytes)
__int64 __fastcall sub_1169C(__int64 a1, unsigned int a2, __int64 a3)
{
__int64 v3; // rax
__int64 v4; // rax
unsigned __int16 v6; // [rsp+48h] [rbp+10h] BYREF
v3 = *(_QWORD *)(a1 + 104); /*0x116a2*/
LOBYTE(a3) = 4; /*0x116b5*/
v6 = 0; /*0x116b8*/
v4 = (*(__int64 (__fastcall **)(__int64, __int64, __int64, _QWORD, __int64, unsigned __int16 *))(v3 + 32))( /*0x116ca*/
v3,
1,
a3,
a2,
1,
&v6);
if ( v4 < 0 ) /*0x116d0*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v4); /*0x116e1*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 861, (__int64)"!EFI_ERROR (Status)"); /*0x116f9*/
}
return v6; /*0x11703*/
}
// Function: ElibWrite16Direct @ 0x1170c (0x65 bytes)
__int64 __fastcall ElibWrite16Direct(__int64 a1, unsigned int a2, __int64 a3)
{
__int64 result; // rax
__int16 v4; // [rsp+50h] [rbp+18h] BYREF
v4 = a3; /*0x1170f*/
LOBYTE(a3) = 4; /*0x1171c*/
result = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, _QWORD, __int64, __int16 *))(*(_QWORD *)(a1 + 104) + 40LL))( /*0x11738*/
*(_QWORD *)(a1 + 104),
1,
a3,
a2,
1,
&v4);
if ( result < 0 ) /*0x1173e*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x1174f*/
return Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 892, (__int64)"!EFI_ERROR (Status)"); /*0x11767*/
}
return result; /*0x1176c*/
}
// Function: AssertCpuDeadLoop_0 @ 0x11774 (0x71 bytes)
__int64 __fastcall sub_11774(__int64 a1, __int64 n2047, __int64 a3)
{
__int64 v3; // rax
LOBYTE(a3) = 4; /*0x11795*/
v3 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64))(*(_QWORD *)(a1 + 104) + 32LL))( /*0x117a8*/
*(_QWORD *)(a1 + 104),
2,
a3);
if ( v3 < 0 ) /*0x117ae*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v3); /*0x117bf*/
Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 921, (__int64)"!EFI_ERROR (Status)"); /*0x117d7*/
}
return 0; /*0x117e0*/
}
// Function: ElibReadNvStore @ 0x117e8 (0x6e bytes)
char __fastcall ElibReadNvStore(__int64 a1, unsigned __int8 a2, __int64 a3, unsigned int a4, _QWORD *a5, __int64 a6)
{
__int64 v7; // rcx
__int64 v8; // rbx
_QWORD v10[3]; // [rsp+30h] [rbp-18h] BYREF
__int64 v11; // [rsp+50h] [rbp+8h] BYREF
v7 = *(_QWORD *)(a1 + 104); /*0x11804*/
v8 = a4; /*0x11807*/
v11 = a4; /*0x1181c*/
if ( (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int64 *, _QWORD *, __int64))(v7 + 72))( /*0x1182e*/
v7,
a2 >> 7,
a3,
&v11,
v10,
a6) >= 0
&& v11 == v8 )
{
*a5 = v10[0]; /*0x1183a*/
return 0; /*0x1183d*/
}
else
{
*a5 = a3; /*0x11846*/
return -1; /*0x11849*/
}
}
// Function: DebugBeep @ 0x11858 (0x57 bytes)
unsigned __int8 __fastcall DebugBeep(unsigned __int8 a1, unsigned __int16 a2)
{
unsigned __int8 UsbRtDispatchTable; // al
unsigned __int8 v3; // al
unsigned __int8 v4; // bl
UsbRtDispatchTable = UsbRtDispatchTable; /*0x1185e*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 1) != 0 ) /*0x1186d*/
{
__outbyte(0x43u, 0xB6u); /*0x11876*/
__outbyte(0x42u, a1); /*0x1187e*/
__outbyte(0x42u, a1); /*0x1187f*/
v3 = __inbyte(0x61u); /*0x11885*/
v4 = v3; /*0x11886*/
__outbyte(0x61u, v3 | 3); /*0x1188a*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(15LL * a2); /*0x1189a*/
__outbyte(0x61u, v4); /*0x118a8*/
return v4; /*0x118a6*/
}
return UsbRtDispatchTable; /*0x118a9*/
}
// Function: ElibCheckDevReady @ 0x118b0 (0x34 bytes)
char (__fastcall *__fastcall ElibCheckDevReady(__int64 a1))(__int64)
{
*(_BYTE *)a1 = 3; /*0x118b7*/
*(_QWORD *)(a1 + 8) = HubNullFunc1; /*0x118ba*/
*(_QWORD *)(a1 + 16) = HubNullFunc2; /*0x118c5*/
*(_QWORD *)(a1 + 24) = HubGetDescriptor; /*0x118d0*/
*(_QWORD *)(a1 + 32) = HubResetPort; /*0x118db*/
*(_BYTE *)(a1 + 3) = 0; /*0x118df*/
return HubResetPort; /*0x118e3*/
}
// Function: HubGetDescriptor @ 0x118e4 (0x34d bytes)
__int64 __fastcall HubGetDescriptor(unsigned __int8 *UsbHcPtr, __int64 dst, __int64 a3, unsigned __int16 a4)
{
__int64 UsbRtDispatchTable; // r15
__int64 v6; // rdi
char v7; // r14
unsigned __int8 *v10; // r8
unsigned __int8 *v11; // rdx
unsigned __int8 v12; // r9
unsigned __int64 i_1; // rsi
unsigned __int8 *i; // rcx
unsigned __int8 n4; // al
unsigned __int8 v16; // r8
__int64 v17; // rax
char n4_1; // al
__int64 v19; // rax
unsigned __int64 v20; // rsi
__int64 n256; // r8
unsigned __int8 v23; // r8
unsigned __int8 v24; // di
char n4_2; // al
unsigned __int8 v26; // cl
__int64 v27; // rcx
__int64 PortNum; // rdx
__int64 EndpointAddr; // r8
unsigned __int8 v30; // di
unsigned __int64 v31; // [rsp+60h] [rbp+8h]
UsbRtDispatchTable = UsbRtDispatchTable; /*0x118fa*/
v6 = a4; /*0x11907*/
*(_BYTE *)(dst + 4) = 3; /*0x11912*/
v7 = 0; /*0x11916*/
*(_BYTE *)(dst + 21) = UsbRegisterNotifyFunc((__int64)DebugLogPrint_8); /*0x11924*/
v10 = (unsigned __int8 *)(a3 + v6); /*0x11927*/
if ( (*(_DWORD *)dst & 0x200) != 0 ) /*0x11932*/
{
while ( (unsigned __int16)v6 < *(_WORD *)(a3 + 2) ) /*0x11938*/
{
v11 = (unsigned __int8 *)(a3 + (unsigned __int16)v6); /*0x1193d*/
v12 = *v11; /*0x11940*/
if ( !*v11 || (unsigned __int16)v6 + (unsigned int)v12 > *(unsigned __int16 *)(a3 + 2) ) /*0x11957*/
break; /*0x11957*/
if ( v11[1] == 4 && v11[3] && v11[5] == 9 && !v11[6] && v11[7] == 2 ) /*0x11975*/
{
v10 = (unsigned __int8 *)(a3 + (unsigned __int16)v6); /*0x11983*/
*(_BYTE *)(dst + 73) = v11[7]; /*0x11986*/
*(_BYTE *)(dst + 20) = v11[3]; /*0x1198c*/
break; /*0x1198c*/
}
LOWORD(v6) = v12 + (_WORD)v6; /*0x1197b*/
}
}
i_1 = *(unsigned __int16 *)(a3 + 2) + a3; /*0x1198f*/
for ( i = &v10[*v10]; ; i += *i ) /*0x1199a*/
{
n4 = i[1]; /*0x1199d*/
if ( n4 == 4 || (unsigned __int64)i >= i_1 || !*i ) /*0x119a9*/
break; /*0x119a9*/
if ( n4 == 5 && (i[3] & 3) == 3 && (i[2] & 0x80u) != 0 ) /*0x119bf*/
{
*(_BYTE *)(dst + 64) = i[2]; /*0x119cc*/
*(_WORD *)(dst + 62) = *((_WORD *)i + 2); /*0x119d3*/
*(_BYTE *)(dst + 320) = i[6]; /*0x119da*/
break; /*0x119da*/
}
}
if ( (UsbHcPtr[64] & 0x40) != 0 && *(char *)(dst + 12) < 0 ) /*0x119ef*/
*(_WORD *)(dst + 108) |= 0x800u; /*0x119f1*/
v16 = *(_BYTE *)(dst + 12); /*0x119f5*/
*(_BYTE *)(dst + 224) = 0; /*0x119fe*/
v17 = FwVolDriverEntry(16, 0, v16, 0); /*0x11a07*/
if ( v17 ) /*0x11a0f*/
*(_BYTE *)(dst + 224) = *(_BYTE *)(v17 + 224) + 1; /*0x11a19*/
n4_1 = *(_BYTE *)(dst + 14); /*0x11a1f*/
if ( n4_1 == 4 || n4_1 == 64 ) /*0x11a28*/
{
HIWORD(v31) = 0; /*0x11a2f*/
LOWORD(v31) = 3104; /*0x11a34*/
*(_DWORD *)((char *)&v31 + 2) = *(unsigned __int8 *)(dst + 224); /*0x11a49*/
SataDriverEntry((__int64)UsbHcPtr, dst, v31, 50, 0); /*0x11a5b*/
}
v19 = UsbConfig_1(0x20u); /*0x11a67*/
v20 = v19; /*0x11a6c*/
if ( !v19 ) /*0x11a72*/
return 0; /*0x11a72*/
if ( (unsigned __int8)UsbGetInfo_11((__int64)UsbHcPtr, dst, v19) ) /*0x11a84*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Failed to get the hub descriptor\n"); /*0x11a98*/
FwVolConfig(v20, 0x20u); /*0x11aa2*/
return 0; /*0x11a76*/
}
*(_BYTE *)(dst + 40) = *(_BYTE *)(v20 + 2); /*0x11ab3*/
*(_BYTE *)(dst + 41) = *(_BYTE *)(v20 + 5); /*0x11ab9*/
DebugPrint(
0xFFFFFFFFFFFFFFFFuLL,
"Usb Hub:: number of downstream port: %d, PowerOnDelay %d\n",
*(unsigned __int8 *)(v20 + 2),
*(unsigned __int8 *)(v20 + 5));
if ( (*(_DWORD *)dst & 0x200) != 0 ) /*0x11ad1*/
{
v23 = *(_BYTE *)(dst + 20); /*0x11ad3*/
if ( v23 ) /*0x11ada*/
DebugLogPrint_12(UsbHcPtr, (_DWORD *)dst, v23); /*0x11ae2*/
}
v24 = 1; /*0x11ae7*/
if ( *(_BYTE *)(dst + 40) ) /*0x11aea*/
{
do /*0x11b5f*/
{
if ( (*(_WORD *)(dst + 108) & 0x800) == 0 || v24 != UsbHcPtr[69] ) /*0x11b09*/
{
if ( (n4_2 = *(_BYTE *)(dst + 14), n4_2 != 4) && n4_2 != 64 /*0x11b3a*/
|| (HcMemoryRead((__int64)UsbHcPtr, dst, v24, UsbRtDispatchTable + 29904),
(*(_WORD *)(UsbRtDispatchTable + 29904) & 0x200) == 0) )
{
LOBYTE(n256) = v24; /*0x11b42*/
UsbGetInfo_14(UsbHcPtr, dst, n256, 8); /*0x11b4b*/
v7 = 1; /*0x11b50*/
}
}
++v24; /*0x11b58*/
}
while ( v24 <= *(_BYTE *)(dst + 40) ); /*0x11b5f*/
if ( v7 && (*(_WORD *)(dst + 108) & 0x800) == 0 ) /*0x11b6d*/
{
v26 = *(_BYTE *)(UsbRtDispatchTable + 30501); /*0x11b76*/
if ( v26 ) /*0x11b7e*/
v27 = 1000000LL * v26; /*0x11b90*/
else
v27 = 2000LL * *(unsigned __int8 *)(dst + 41); /*0x11b84*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(v27); /*0x11b9e*/
}
}
*(_QWORD *)(dst + 24) = 0; /*0x11ba9*/
*(_QWORD *)(dst + 32) = 0; /*0x11bb0*/
FwVolConfig(v20, 0x20u); /*0x11bb4*/
v30 = 1; /*0x11bb9*/
for ( *(_WORD *)(dst + 324) = 0; v30 <= *(_BYTE *)(dst + 40); ++v30 ) /*0x11bc4*/
{
LOBYTE(PortNum) = *(_BYTE *)(dst + 10); /*0x11bca*/
LOBYTE(EndpointAddr) = v30; /*0x11bcd*/
DebugLogPrint_3((__int64)UsbHcPtr, PortNum, EndpointAddr); /*0x11bd3*/
}
*(_WORD *)(dst + 322) = *(_WORD *)(dst + 62); /*0x11be8*/
(*(void (__fastcall **)(unsigned __int8 *, __int64))(200LL * (((UsbHcPtr[1] - 16) >> 4) + 4) + UsbRtDispatchTable + 232))( /*0x11c0f*/
UsbHcPtr,
dst);
return dst; /*0x11c24*/
}
// Function: HubResetPort @ 0x11c34 (0xab bytes)
char __fastcall HubResetPort(__int64 a1)
{
__int64 v2; // rcx
unsigned __int8 TmpR8; // bl
int n2047_1; // eax
__int64 n2047; // rdx
__int64 i; // rsi
v2 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * (*(unsigned __int8 *)(a1 + 11) - 1)); /*0x11c5d*/
(*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(v2 + 1) - 16) >> 4) + 4) /*0x11c7a*/
+ UsbRtDispatchTable
+ 224))(
v2,
a1);
TmpR8 = 1; /*0x11c86*/
n2047_1 = *(unsigned __int8 *)(a1 + 11) - 1; /*0x11c88*/
*(_BYTE *)(a1 + 64) = 0; /*0x11c8a*/
n2047 = n2047_1; /*0x11c8e*/
for ( i = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * n2047_1); TmpR8 <= *(_BYTE *)(a1 + 40); ++TmpR8 ) /*0x11ca3*/
{
if ( (*(_WORD *)(a1 + 108) & 0x800) == 0 || TmpR8 != *(_BYTE *)(i + 69) ) /*0x11cb6*/
{
LOBYTE(n2047) = *(_BYTE *)(a1 + 10); /*0x11cb8*/
DebugLogPrint_4(i, n2047, TmpR8); /*0x11cc1*/
}
}
return 0; /*0x11cd9*/
}
// Function: HubNullFunc2 @ 0x11cec (0x11 bytes)
__int64 __fastcall HubNullFunc2(__int64 a1, char n9)
{
__int64 n255; // rax
n255 = 255; /*0x11cef*/
if ( n9 == 9 ) /*0x11cf9*/
return 3; /*0x11cf9*/
return n255; /*0x11cfc*/
}
// Function: DebugLogPrint_8 @ 0x12320 (0xe3 bytes)
char __fastcall DebugLogPrint_8(__int64 UsbHcPtr, __int64 a2, __int64 a3, _WORD *a4)
{
char v7; // si
__int64 EndpointAddr; // r8
__int64 UsbRtDispatchTable; // rdx
unsigned __int8 i; // bl
v7 = 0; /*0x12354*/
DebugPrint( /*0x1235f*/
0xFFFFFFFFFFFFFFFFuLL,
"USBHub_ProcessHubData, gUsbData->bEnumFlag = %d\n",
*(unsigned __int8 *)(UsbRtDispatchTable + 29872));
UsbRtDispatchTable = UsbRtDispatchTable; /*0x12364*/
if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x12372*/
{
for ( i = 1; i <= *(_BYTE *)(a2 + 40); ++i ) /*0x12376*/
{
if ( ((unsigned __int16)(1 << i) & *a4) != 0 ) /*0x12389*/
{
if ( !v7 && ((unsigned __int16)~*(_WORD *)(a2 + 324) & (unsigned __int16)(1 << i)) != 0 ) /*0x1239e*/
{
(*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x123ac*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x123b2*/
v7 = 1; /*0x123b9*/
}
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x123bc*/
LOBYTE(EndpointAddr) = i; /*0x123c3*/
LOBYTE(UsbRtDispatchTable) = *(_BYTE *)(a2 + 10); /*0x123c6*/
DebugLogPrint_3(UsbHcPtr, UsbRtDispatchTable, EndpointAddr); /*0x123cc*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x123d1*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x123d8*/
}
}
}
return 0; /*0x123fc*/
}
// Function: DebugLogPrint_2 @ 0x12404 (0x1f7 bytes)
char __fastcall DebugLogPrint_2(_BYTE *UsbHcPtr, __int64 dst, __int64 n256, char a4)
{
__int64 UsbRtDispatchTable; // rbp
unsigned __int8 n256_1; // di
char n4; // al
int v9; // esi
int v11; // esi
char n4_1; // al
__int64 n20000; // rcx
UsbRtDispatchTable = UsbRtDispatchTable; /*0x1241d*/
n256_1 = n256; /*0x12424*/
if ( a4 )
{
n4 = *(_BYTE *)(dst + 14); /*0x12436*/
if ( n4 == 4 || n4 == 64 )
{
if ( !(unsigned __int8)UsbGetInfo_14(UsbHcPtr, dst, n256, 28) )
{
v9 = 0; /*0x12457*/
while ( 1 )
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x12465*/
if ( (unsigned __int8)HcMemoryRead((__int64)UsbHcPtr, dst, n256_1, UsbRtDispatchTable + 29904) ) /*0x12482*/
break; /*0x12482*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 29906) & 0x20) != 0 ) /*0x12492*/
goto LABEL_12; /*0x12492*/
if ( (unsigned int)++v9 >= 0x32 )
{
if ( (*(_BYTE *)(UsbRtDispatchTable + 29906) & 0x20) == 0 )
{
DebugPrint(
0xFFFFFFFFFFFFFFFFuLL,
"Usb super speed hub port[%d] status: %08x: warm reset port is failed\n",
n256_1,
*(_DWORD *)(UsbRtDispatchTable + 29904));
return -1; /*0x124c1*/
}
LABEL_12:
if ( !(unsigned __int8)HcMemoryWrite((__int64)UsbHcPtr, dst, n256_1, 29) /*0x12511*/
&& !(unsigned __int8)HcMemoryWrite((__int64)UsbHcPtr, dst, n256_1, 20) )
{
return 0; /*0x12511*/
}
return -1; /*0x12511*/
}
}
}
return -1; /*0x12489*/
}
}
if ( !(unsigned __int8)UsbGetInfo_14(UsbHcPtr, dst, n256, 4) ) /*0x12522*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0x12537*/
v11 = 0; /*0x1253d*/
while ( 1 ) /*0x1253f*/
{
if ( (unsigned __int8)HcMemoryRead((__int64)UsbHcPtr, dst, n256_1, UsbRtDispatchTable + 29904) ) /*0x12556*/
return -1; /*0x1255d*/
if ( (*(_WORD *)(UsbRtDispatchTable + 29906) & 0x10) != 0 ) /*0x12573*/
break; /*0x12573*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(5000); /*0x12581*/
if ( (unsigned int)++v11 >= 0xA ) /*0x1258c*/
return -1; /*0x1258c*/
}
if ( (unsigned __int8)HcMemoryWrite((__int64)UsbHcPtr, dst, n256_1, 20) ) /*0x125aa*/
return -1; /*0x125b1*/
n4_1 = *(_BYTE *)(dst + 14); /*0x125b7*/
if ( n4_1 != 4 && n4_1 != 64 ) /*0x125c0*/
{
if ( (*(_WORD *)(dst + 108) & 0x800) == 0 ) /*0x125cb*/
{
n20000 = 20000; /*0x125cd*/
LABEL_28:
(*(void (__fastcall **)(__int64))(BootServices + 248))(n20000); /*0x125e7*/
return 0; /*0x125ee*/
}
if ( (*(_WORD *)(UsbRtDispatchTable + 29904) & 0x200) != 0 ) /*0x125e0*/
{
n20000 = 1000; /*0x125e2*/
goto LABEL_28; /*0x125e2*/
}
}
return 0; /*0x125f4*/
}
return -1; /*0x124dc*/
}
// Function: HcMemoryWrite @ 0x125fc (0x3c bytes)
__int64 __fastcall HcMemoryWrite(__int64 a1, __int64 a2, unsigned __int8 a3, __int16 a4)
{
unsigned __int64 v5; // [rsp+30h] [rbp-18h]
WORD1(v5) = a4; /*0x12605*/
LOWORD(v5) = 291; /*0x1260b*/
HIDWORD(v5) = a3; /*0x12614*/
return SataDriverEntry(a1, a2, v5, 50, 0); /*0x12633*/
}
// Function: UsbGetInfo_11 @ 0x12638 (0x4f bytes)
__int64 __fastcall UsbGetInfo_11(__int64 UsbHcPtr, __int64 dst, __int64 a3)
{
char n4; // al
bool v4; // zf
__int16 n10752; // ax
unsigned __int64 v7; // [rsp+48h] [rbp+10h]
HIDWORD(v7) = 0x200000; /*0x12641*/
LOWORD(v7) = 1696; /*0x12649*/
n4 = *(_BYTE *)(dst + 14); /*0x12653*/
if ( n4 == 4 || (v4 = n4 == 64, n10752 = 10496, v4) ) /*0x12661*/
n10752 = 10752; /*0x12663*/
WORD1(v7) = n10752; /*0x12668*/
return SataDriverEntry(UsbHcPtr, dst, v7, 150, a3); /*0x12682*/
}
// Function: HcMemoryRead @ 0x12688 (0x3c bytes)
__int64 __fastcall HcMemoryRead(__int64 a1, __int64 a2, unsigned __int8 a3, __int64 a4)
{
unsigned __int64 v5; // [rsp+30h] [rbp-18h]
HIDWORD(v5) = a3 | 0x40000; /*0x12693*/
LODWORD(v5) = 163; /*0x126a3*/
return SataDriverEntry(a1, a2, v5, 150, a4); /*0x126bf*/
}
// Function: UsbGetInfo_14 @ 0x126c4 (0x3c bytes)
__int64 __fastcall UsbGetInfo_14(_BYTE *UsbHcPtr, __int64 dst, __int64 n256, __int16 n8)
{
unsigned __int64 v5; // [rsp+30h] [rbp-18h]
WORD1(v5) = n8; /*0x126cd*/
LOWORD(v5) = 803; /*0x126d3*/
HIDWORD(v5) = (unsigned __int8)n256; /*0x126dc*/
return SataDriverEntry((__int64)UsbHcPtr, dst, v5, 100, 0); /*0x126fb*/
}
// Function: XhciDriverEntry @ 0x12700 (0x5b5 bytes)
char __fastcall XhciDriverEntry(__int64 UsbHcPtr)
{
__int64 v1; // rbp
unsigned int n0x64; // r14d
char v3; // r12
unsigned int n787248; // eax
unsigned int Config; // eax
unsigned __int64 Config_1; // rbx
unsigned __int64 v9; // rbx
unsigned __int64 v10; // rdx
unsigned int i; // ebx
unsigned int j; // ebx
unsigned __int8 k; // bl
__int64 v14; // rbx
char v15; // al
int v16; // edx
char v17; // di
unsigned int m; // ebx
__int64 v19; // rcx
__int64 v20; // r8
__int64 v21; // rdx
__int64 TmpRdx; // rdx
__int64 v23; // rbx
__int64 v24; // rdx
__int64 v25; // r8
__int64 v26; // rdx
__int64 v27; // rax
__int64 v28; // rdi
__int64 v29; // rbx
__int64 v30; // rdx
__int64 v31; // rdx
unsigned __int8 v32; // di
int v33; // ebx
unsigned int v34; // edx
int v35; // eax
v1 = *(_QWORD *)(UsbHcPtr + 72); /*0x1271c*/
n0x64 = 0; /*0x12720*/
v3 = 0; /*0x12723*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || !v1 ... [8386 chars total]
// Function: XhciReset @ 0x12cb8 (0x193 bytes)
char __fastcall XhciReset(__int64 UsbHcPtr)
{
__int64 v1; // rdi
__int64 TmpRdx; // rdx
__int64 TmpR8; // r8
unsigned __int8 v6; // si
__int64 v7; // rdx
unsigned int i; // esi
unsigned int v9; // edx
char n24; // [rsp+50h] [rbp+8h] BYREF
v1 = *(_QWORD *)(UsbHcPtr + 72); /*0x12cc7*/
n24 = 0; /*0x12cce*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x12ce8*/
return -1; /*0x12cdd*/
v6 = 1; /*0x12cf1*/
for ( *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; v6 <= *(_BYTE *)(v1 + 15); ++v6 ) /*0x12cfb*/
{
LOBYTE(TmpR8) = v6; /*0x12d03*/
LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12d06*/
UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0x12d0c*/
}
if ( (UsbGetInfo_8(UsbHcPtr, TmpRdx, (unsigned int)*(_QWORD *)(v1 + 40) + 24) & 8) != 0 ) /*0x12d31*/
{
DebugLogPrint_18(UsbHcPtr, v7, *(_QWORD *)(v1 + 40) + 24, 2); /*0x12d41*/
n24 = 24; /*0x12d5d*/
DebugLogPrint_1(UsbHcPtr, 0, 33, 0, 0, &n24, 0x32u, 0); /*0x12d74*/
}
XhciDriverInit(UsbHcPtr); /*0x12d7c*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x12d91*/
DebugLogPrint_19(UsbHcPtr, 0, 4); /*0x12d98*/
DebugLogPrint_20(UsbHcPtr, *(_DWORD *)(v1 + 48) - *(_DWORD *)(UsbHcPtr + 16) + 32, 2); /*0x12dac*/
DebugLogPrint_19(UsbHcPtr, 0, 1); /*0x12dba*/
for ( i = 0; i < 0x140; ++i ) /*0x12dbf*/
{
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 ) /*0x12dd2*/
break; /*0x12dd2*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x12de0*/
}
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) == 0 ) /*0x12e01*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 473, (__int64)"HcReadOpReg(HcStruc, 0x0004) & 0x00000001"); /*0x12e16*/
v9 = *(_DWORD *)(v1 + 56); /*0x12e1b*/
if ( v9 ) /*0x12e20*/
DebugLogPrint_20(UsbHcPtr, v9, 0x10000); /*0x12e2b*/
*(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0x12e30*/
UsbFindActiveHc(); /*0x12e34*/
return 0; /*0x12e45*/
}
// Function: XhciStart @ 0x12e4c (0x1a0 bytes)
char __fastcall XhciStart(__int64 UsbHcPtr)
{
__int64 v3; // rdi
__int64 PortNum; // rdx
__int64 EndpointAddr; // r8
__int64 UsbRtDispatchTable; // rax
unsigned __int8 v7; // si
unsigned __int8 v8; // bp
char v9; // si
unsigned __int8 v10; // si
__int64 v11; // r15
unsigned __int8 v12; // bp
if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x12e75*/
{
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x12ea3*/
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
{
return -1; /*0x12e87*/
}
v3 = *(_QWORD *)(UsbHcPtr + 72); /*0x12ea5*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI_EnumeratePorts..\n"); /*0x12eb4*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x12eb9*/
*(_BYTE *)(UsbRtDispatchTable + 30480) = 1; /*0x12ec0*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x12ec7*/
if ( *(_BYTE *)(v3 + 69) ) /*0x12ece*/
{
v7 = 0; /*0x12ed5*/
do /*0x12ef7*/
{
LOBYTE(EndpointAddr) = v7 + *(_BYTE *)(v3 + 68); /*0x12ee5*/
LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12ee8*/
DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0x12eeb*/
++v7; /*0x12ef0*/
}
while ( v7 < *(_BYTE *)(v3 + 69) ); /*0x12ef7*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x12ef9*/
}
if ( *(_BYTE *)(v3 + 81) ) /*0x12f00*/
{
v8 = 0; /*0x12f07*/
do /*0x12f53*/
{
v9 = v8 + *(_BYTE *)(v3 + 80); /*0x12f17*/
if ( *(_WORD *)(v3 + 100) == 4358 && *(_WORD *)(v3 + 102) == 13362 ) /*0x12f29*/
UsbConfig_3(UsbHcPtr, v3, v8 + *(_BYTE *)(v3 + 80), 1); /*0x12f37*/
LOBYTE(EndpointAddr) = v9; /*0x12f3e*/
LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12f41*/
DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0x12f47*/
++v8; /*0x12f4c*/
}
while ( v8 < *(_BYTE *)(v3 + 81) ); /*0x12f53*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x12f55*/
}
if ( *(_BYTE *)(v3 + 488) ) /*0x12f5c*/
{
v10 = 0; /*0x12f66*/
do /*0x12fb2*/
{
v11 = *(_QWORD *)(v3 + 88); /*0x12f6d*/
if ( *(_BYTE *)(v11 + 12LL * v10 + 9) ) /*0x12f79*/
{
v12 = 0; /*0x12f82*/
do /*0x12fa6*/
{
LOBYTE(EndpointAddr) = v12 + *(_BYTE *)(v11 + 12LL * v10 + 8); /*0x12f93*/
LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12f96*/
DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0x12f99*/
++v12; /*0x12f9e*/
}
while ( v12 < *(_BYTE *)(v11 + 12LL * v10 + 9) ); /*0x12fa6*/
}
++v10; /*0x12fa8*/
}
while ( v10 < *(_BYTE *)(v3 + 488) ); /*0x12fb2*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x12fb4*/
}
*(_BYTE *)(UsbRtDispatchTable + 30480) = 0; /*0x12fbe*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x12fc5*/
XhciDriverInit(UsbHcPtr); /*0x12fcc*/
}
return 0; /*0x12fe2*/
}
// Function: XhciAllocTrbRing @ 0x12fec (0x40 bytes)
__int64 __fastcall XhciAllocTrbRing(__int64 *a1)
{
__int64 v1; // rdx
v1 = *(__int64 *)((char *)a1 + 20); /*0x12fec*/
if ( (*(_DWORD *)(v1 + 12) & 0xFC00) == 0x1800 ) /*0x12ffd*/
{
*(_DWORD *)(v1 + 12) ^= (*(_DWORD *)(v1 + 12) ^ *((unsigned __int8 *)a1 + 28)) & 1; /*0x13009*/
v1 = *a1; /*0x1300c*/
*((_BYTE *)a1 + 28) ^= 1u; /*0x1300f*/
*(__int64 *)((char *)a1 + 20) = v1; /*0x13013*/
}
*(_DWORD *)(v1 + 12) &= 1u; /*0x13017*/
*(_QWORD *)v1 = 0; /*0x1301d*/
*(_DWORD *)(v1 + 8) = 0; /*0x13020*/
*(__int64 *)((char *)a1 + 20) += 16; /*0x13026*/
return v1; /*0x1302b*/
}
// Function: DebugLogPrint_1 @ 0x1302c (0x200 bytes)
char __fastcall DebugLogPrint_1(
__int64 UsbHcPtr,
__int64 *a2,
int n33,
__int64 a4,
char i,
_BYTE *a6,
unsigned __int16 a7,
_BYTE *a8)
{
char v8; // r11
__int64 v9; // rsi
unsigned int v12; // r15d
char v14; // bl
unsigned int v15; // ebp
__int64 v16; // r10
__int64 v17; // rdx
__int64 j; // r8
char v19; // al
__int64 *k; // rcx
int v21; // eax
char n13; // al
char v24; // [rsp+68h] [rbp+20h]
v24 = a4; /*0x1303b*/
v8 = a4; /*0x13054*/
v9 = *(_QWORD *)(UsbHcPtr + 72); /*0x13057*/
v12 = 100 * a7; /*0x13066*/
v14 = 0; /*0x1306d*/
v15 = 0; /*0x1306f*/
LABEL_2:
if ( v12 && v15 >= v12 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: execution time-out.\n");
v14 = -1; /*0x1319c*/
*a6 = -1; /*0x1319e*/
goto LABEL_38; /*0x131a0*/
}
v16 = *(_QWORD *)(v9 + 180); /*0x1307f*/
LOBYTE(a4) = *(_BYTE *)(v9 + 188); /*0x13086*/
v17 = v16; /*0x1308d*/
for ( j = *(unsigned int *)(v16 + 12); ; j = *(unsigned int *)(v17 + 12) )
{
if ( (j & 1) != (_BYTE)a4 ) /*0x1313b*/
goto LABEL_26; /*0x1313b*/
if ( (unsigned __int16)j >> 10 != n33 ) /*0x130a5*/
goto LABEL_18; /*0x130a5*/
if ( n33 != 33 ) /*0x130ab*/
break; /*0x130ab*/
if ( a2 ) /*0x130b0*/
{
if ( *(__int64 **)v17 == a2 ) /*0x130b5*/
{
if ( a8 ) /*0x130c2*/
*a8 = *(_BYTE *)(v17 + 15); /*0x130c7*/
v19 = *(_BYTE *)(v17 + 11); /*0x130c9*/
*a6 = v19; /*0x130ce*/
v14 = -(v19 != 1); /*0x130d6*/
goto LABEL_38; /*0x130d8*/
}
}
else if ( *a6 && *(_BYTE *)(v17 + 11) == *a6 ) /*0x130e6*/
{
goto LABEL_38; /*0x130e6*/
}
LABEL_18:
if ( v17 == *(_QWORD *)(v9 + 172) ) /*0x13116*/
{
v17 = *(_QWORD *)(v9 + 160); /*0x13118*/
LOBYTE(a4) = a4 ^ 1; /*0x1311f*/
}
else
{
v17 += 16; /*0x13125*/
}
if ( v17 == v16 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Event Ring is full...\n", j, a4);
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 785, (__int64)"0"); /*0x13166*/
*a6 = 21; /*0x1316b*/
LABEL_26:
(*(void (__fastcall **)(__int64, __int64))(BootServices + 248))(10, v17); /*0x1316e*/
v8 = v24; /*0x13180*/
++v15; /*0x13185*/
goto LABEL_2; /*0x13187*/
}
}
if ( n33 != 32 ) /*0x130f2*/
goto LABEL_18; /*0x130f2*/
if ( *(_BYTE *)(v17 + 15) != v8 ) /*0x130f8*/
goto LABEL_18; /*0x130f8*/
j = WORD1(j) & 0x1F; /*0x13102*/
if ( (_BYTE)j != i ) /*0x13109*/
goto LABEL_18; /*0x13109*/
if ( a8 ) /*0x131ad*/
{
*(_DWORD *)a8 = *(_DWORD *)(v17 + 8) & 0xFFFFFF; /*0x131b7*/
if ( *(_BYTE *)(v17 + 11) == 13 ) /*0x131be*/
{
for ( k = *(__int64 **)v17; ; *(_DWORD *)a8 += k[1] & 0x1FFFF ) /*0x131c0*/
{
*((_DWORD *)k + 3) &= 0xFFFFFFDB; /*0x131ec*/
if ( (*((_BYTE *)k + 12) & 0x10) == 0 ) /*0x131f4*/
break; /*0x131f4*/
v21 = *((_DWORD *)k + 7); /*0x131cb*/
k += 2; /*0x131ce*/
if ( (v21 & 0xFC00) == 0x1800 ) /*0x131dc*/
k = (__int64 *)*k; /*0x131de*/
}
}
}
n13 = *(_BYTE *)(v17 + 11); /*0x131f6*/
*a6 = n13; /*0x131f9*/
if ( n13 != 1 && n13 != 13 ) /*0x13201*/
v14 = -1; /*0x13203*/
LABEL_38:
XhciDriverInit(UsbHcPtr); /*0x13205*/
return v14; /*0x1321e*/
}
// Function: DebugLogPrint_0 @ 0x1322c (0x2b3 bytes)
char __fastcall DebugLogPrint_0(__int64 UsbHcPtr, int n11, unsigned __int8 *a3)
{
__int64 v3; // rbp
__int64 v7; // rax
char *v8; // r8
__int64 v9; // rdi
unsigned __int16 n50; // r15
int v12; // ecx
char v13; // al
int v14; // eax
__int64 v15; // rdx
int v16; // ebx
int v17; // ebx
int v18; // ebx
int v19; // ebx
int v20; // ebx
int v21; // ebx
unsigned __int8 v22; // bl
unsigned __int8 n25; // [rsp+70h] [rbp+8h] BYREF
unsigned __int8 v24; // [rsp+88h] [rbp+20h] BYREF
v3 = *(_QWORD *)(UsbHcPtr + 72); /*0x13242*/
n25 = 0; /*0x1324c*/
v7 = XhciAllocTrbRing((__int64 *)(v3 + 128)); /*0x1325a*/
v9 = v7; /*0x13265*/
n50 = 50; /*0x13268*/
if ( !v7 ) /*0x1326f*/
return -1; /*0x1326f*/
*(_DWORD *)(v7 + 12) &= 0xFFFF03FF; /*0x13278*/
*(_DWORD *)(v7 + 12) |= (n11 & 0x3F) << 10; /*0x13287*/
v12 = *(_DWORD *)(v7 + 12); /*0x1328a*/
if ( n11 != 10 ) /*0x13290*/
{
if ( n11 == 11 ) /*0x13299*/
{
n50 = 2000; /*0x13312*/
*(_QWORD *)v7 = *(_QWORD *)(v3 + 216); /*0x13318*/
*(_BYTE *)(v7 + 15) = *v8; /*0x1331e*/
v14 = (*(_DWORD *)(v7 + 12) ^ ((unsigned __int8)v8[1] << 9)) & 0x200; /*0x1332c*/
}
else
{
if ( n11 <= 11 ) /*0x1329b*/
goto LABEL_18; /*0x1329b*/
if ( n11 <= 13 ) /*0x132a4*/
{
*(_QWORD *)v7 = *(_QWORD *)(v3 + 216); /*0x132fb*/
*(_BYTE *)(v7 + 15) = *v8; /*0x13301*/
*(_DWORD *)(v7 + 12) &= ~0x200u; /*0x13304*/
goto LABEL_18; /*0x13309*/
}
switch ( n11 ) /*0x132a9*/
{
case 14: /*0x132a9*/
*(_DWORD *)(v7 + 12) = v12 & 0xFFFFFDFF; /*0x132d9*/
break;
case 15: /*0x132a9*/
break;
case 16: /*0x132a9*/
*(_QWORD *)v7 = *(_QWORD *)v8; /*0x132bc*/
*(_DWORD *)(v7 + 12) = v12 ^ (v12 ^ *((_DWORD *)v8 + 3)) & 0x1F0000; /*0x132cc*/
v13 = v8[15]; /*0x132cf*/
goto LABEL_17; /*0x132d3*/
default:
goto LABEL_18; /*0x132b3*/
}
*(_BYTE *)(v7 + 15) = *v8; /*0x132df*/
v14 = (*(_DWORD *)(v7 + 12) ^ ((unsigned __int8)v8[1] << 16)) & 0x1F0000; /*0x132ed*/
}
*(_DWORD *)(v9 + 12) ^= v14; /*0x13331*/
goto LABEL_18; /*0x13334*/
}
v13 = *v8; /*0x13336*/
LABEL_17:
*(_BYTE *)(v9 + 15) = v13; /*0x13339*/
LABEL_18:
*(_DWORD *)(v9 + 12) ^= (*(_DWORD *)(v9 + 12) ^ *(unsigned __int8 *)(v3 + 156)) & 1; /*0x1333c*/
DebugLogPrint_14(UsbHcPtr, *(_DWORD *)(v3 + 28), 0); /*0x13355*/
if ( DebugLogPrint_1(UsbHcPtr, (__int64 *)v9, 33, 0, 0, &n25, n50, &v24) == -1 )
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI command[%d] completion error code: %d\n", n11, n25);
if ( n25 == 0xFF ) /*0x133b3*/
{
DebugLogPrint_18(UsbHcPtr, v15, *(_QWORD *)(v3 + 40) + 24, 4); /*0x133c8*/
n25 = 25; /*0x133f4*/
DebugLogPrint_1(UsbHcPtr, (__int64 *)v9, 33, 0, 0, &n25, 0x32u, 0); /*0x133f9*/
}
return -1; /*0x13273*/
}
v16 = n11 - 9; /*0x13403*/
if ( v16 )
{
v17 = v16 - 1; /*0x1340c*/
if ( v17 )
{
v18 = v17 - 2; /*0x13415*/
if ( v18 )
{
v19 = v18 - 1; /*0x1341a*/
if ( v19 )
{
v20 = v19 - 1; /*0x1341f*/
if ( v20 )
{
v21 = v20 - 1; /*0x13424*/
if ( v21 )
{
if ( v21 == 1 )
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Set TR pointer command complete.\n");
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Stop Endpoint command complete (slot#%x dci#%x).\n", *a3, a3[1]);
}
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Reset Endpoint command complete (slot#%x dci#%x).\n", *a3, a3[1]);
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x1347b*/
}
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Evaluate Context command complete.\n");
}
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Configure Endpoint command complete.\n");
}
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: DisableSlot command complete.\n");
}
}
else
{
v22 = v24; /*0x134a7*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Enable Slot command complete, SlotID %d\n", v24);
*a3 = v22; /*0x134c2*/
}
return 0; /*0x134d3*/
}
// Function: UsbConfig_9 @ 0x134e0 (0xd3 bytes)
char __fastcall UsbConfig_9(_BYTE *UsbHcPtr, __int64 a2)
{
char v4; // si
unsigned __int8 k; // bl
__int64 PortNum; // rdx
__int64 EndpointAddr; // r8
if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x13508*/
{
*(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x1350e*/
(*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x13521*/
do /*0x13577*/
{
v4 = 0; /*0x13527*/
k = 1; /*0x1352a*/
if ( !*(_BYTE *)(a2 + 15) ) /*0x1352c*/
break; /*0x1352f*/
do /*0x13572*/
{
if ( (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 16 * ((unsigned int)k + 63)) & 0x20000) != 0 ) /*0x1354f*/
{
LOBYTE(EndpointAddr) = k; /*0x13553*/
LOBYTE(PortNum) = *UsbHcPtr | 0x80; /*0x13556*/
DebugLogPrint_3((__int64)UsbHcPtr, PortNum, EndpointAddr); /*0x13559*/
v4 = 1; /*0x1355e*/
}
else
{
XhciPortStatusChange((__int64)UsbHcPtr, k, 0); /*0x13568*/
}
++k; /*0x1356d*/
}
while ( k <= *(_BYTE *)(a2 + 15) ); /*0x13572*/
}
while ( v4 ); /*0x13577*/
DebugLogPrint_14((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 4, 16); /*0x13589*/
*(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x13595*/
}
return 0; /*0x135ad*/
}
// Function: UsbGetInfo_3 @ 0x135b4 (0x7d bytes)
char __fastcall UsbGetInfo_3(__int64 a1, __int64 UsbHcPtr, unsigned __int8 a3, unsigned __int8 i)
{
char v4; // bl
__int16 v6; // [rsp+40h] [rbp+18h] BYREF
v4 = 0; /*0x135c3*/
if ( (*(_BYTE *)(*(unsigned __int8 *)(a1 + 113) * (unsigned __int64)i /*0x135f6*/
+ 32 * *(unsigned __int8 *)(a1 + 113) * ((unsigned int)a3 - 1)
+ *(_QWORD *)(a1 + 208))
& 7) == 2 )
{
v6 = a3 + (i << 8); /*0x13613*/
return DebugLogPrint_0(UsbHcPtr, 14, (unsigned __int8 *)&v6); /*0x13622*/
}
return v4; /*0x1362b*/
}
// Function: UsbGetInfo_0 @ 0x13634 (0xf7 bytes)
char __fastcall UsbGetInfo_0(__int64 a1, __int64 UsbHcPtr, unsigned __int8 a3, unsigned __int8 i)
{
_BYTE *v8; // rbx
__int64 v9; // rcx
unsigned __int8 v11[12]; // [rsp+20h] [rbp-28h] BYREF
int v12; // [rsp+2Ch] [rbp-1Ch]
__int16 v13; // [rsp+60h] [rbp+18h] BYREF
v8 = (_BYTE *)(*(_QWORD *)(a1 + 208) /*0x13670*/
+ *(unsigned __int8 *)(a1 + 113) * (unsigned __int64)i
+ 32 * *(unsigned __int8 *)(a1 + 113) * ((unsigned int)a3 - 1));
if ( (*v8 & 7) == 2 ) /*0x1367d*/
{
v13 = a3 + (i << 8); /*0x1369a*/
DebugLogPrint_0(UsbHcPtr, 14, (unsigned __int8 *)&v13); /*0x136a4*/
}
if ( (*(_DWORD *)v8 & 7u) - 3 <= 1 ) /*0x136b4*/
{
v9 = *(_QWORD *)(a1 + 192) + 32 * ((unsigned __int8)(i - 1) + (__int64)(32 * a3 - 32)); /*0x136da*/
*(_QWORD *)v11 = *(_QWORD *)(v9 + 20) + *(unsigned __int8 *)(v9 + 28); /*0x136e9*/
v12 = v12 & 0xE0FFFF | (((a3 << 8) | i & 0x1F) << 16); /*0x1370a*/
DebugLogPrint_0(UsbHcPtr, 16, v11); /*0x13711*/
}
return 0; /*0x13722*/
}
// Function: UsbConfig_4 @ 0x1372c (0x13e bytes)
__int64 __fastcall UsbConfig_4(__int64 a1, __int64 i, __int64 *a3, char a4, char ia)
{
__int64 result; // rax
unsigned int v9; // edi
__int64 v10; // rbp
unsigned int v11; // ecx
unsigned int v12; // edx
_DWORD *v13; // r15
__int64 v14; // rax
__int64 j; // rbx
__int64 j_1; // rax
result = UsbFindDeviceByPointer(*a3, 416); /*0x1375a*/
v9 = 0; /*0x1375f*/
v10 = result; /*0x13761*/
if ( result ) /*0x13767*/
{
v11 = *(_DWORD *)(a1 + 168); /*0x1376d*/
v12 = 0; /*0x13773*/
v13 = *(_DWORD **)(result + 384); /*0x13775*/
v14 = *(_QWORD *)(result + 400); /*0x1377c*/
for ( j = *(_QWORD *)(a1 + 160); v12 < v11; j += 16 ) /*0x1378c*/
{
if ( *(_QWORD *)j == v14 ) /*0x13791*/
break; /*0x13791*/
++v12; /*0x13793*/
}
if ( v12 >= v11 ) /*0x1379f*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 1172, (__int64)"i < Usb3Hc->EvtRing.Size"); /*0x137b4*/
if ( *(_BYTE *)(j + 15) != a4 || (*(_BYTE *)(j + 14) & 0x1F) != ia ) /*0x137c9*/
Assert( /*0x137de*/
(UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c",
1173,
(__int64)"EvtTrb->SlotId == SlotId && EvtTrb->EndpointId == Dci");
if ( *(_DWORD *)(a1 + 168) ) /*0x137e3*/
{
do /*0x1383f*/
{
if ( *(_BYTE *)(j + 15) == a4 && (*(_BYTE *)(j + 14) & 0x1F) == ia ) /*0x137fb*/
{
*v13++ = (*(_DWORD *)(*(_QWORD *)j + 8LL) & 0x1FFFF) - (*(_DWORD *)(j + 8) & 0xFFFFFF); /*0x13814*/
if ( j == i ) /*0x1381e*/
break; /*0x1381e*/
j_1 = j; /*0x13820*/
j += 16; /*0x13823*/
if ( j_1 == *(_QWORD *)(a1 + 172) ) /*0x1382e*/
j = *(_QWORD *)(a1 + 160); /*0x13830*/
}
++v9; /*0x13837*/
}
while ( v9 < *(_DWORD *)(a1 + 168) ); /*0x1383f*/
}
result = *(_QWORD *)(v10 + 392); /*0x13841*/
*(_BYTE *)result = 1; /*0x13848*/
}
return result; /*0x1385f*/
}
// Function: UsbConfig @ 0x1386c (0x253 bytes)
void __fastcall UsbConfig(__int64 a1, __int64 UsbHcPtr, __int64 i)
{
int v3; // r15d
__int64 *v6; // r14
unsigned __int8 ia; // r12
char n32; // bp
__int64 v9; // r13
__int64 v10; // rax
__int64 v11; // rdx
__int64 v12; // r8
__int64 v13; // rbx
unsigned int n2; // eax
__int64 UsbHcPtr_1; // rsi
int Info_12; // eax
void (__fastcall *v17)(__int64, __int64, _QWORD); // r10
__int64 n0x10; // rax
_QWORD *v19; // rcx
__int64 v20; // rax
int v21; // r9d
int v22; // r8d
unsigned int v23; // ecx
unsigned int v24; // [rsp+70h] [rbp+8h]
v3 = *(unsigned __int8 *)(i + 15); /*0x13885*/
v6 = *(__int64 **)i; /*0x1389a*/
ia = *(_BYTE *)(i + 14) & 0x1F; /*0x1389d*/
n32 = 32; /*0x138a5*/
v24 = *(_DWORD *)(a1 + 28) + 4 * v3; /*0x138b2*/
v9 = *(_QWORD *)(a1 + 192) + 32 * ((unsigned __int8)(ia - 1) + (__int64)(32 * v3 - 32)); /*0x138d1*/
if ( (*(_DWORD *)(*(_QWORD *)i + 12LL) & 0xFC00) == 0x1400 ) /*0x138dd*/
{
UsbConfig_4(a1, i, v6, v3, ia); /*0x138ed*/
return; /*0x138f2*/
}
v10 = UsbFindDeviceByPointer(*v6, 24); /*0x138ff*/
v12 = 0; /*0x13904*/
v13 = v10; /*0x13907*/
if ( !v10 ) /*0x1390d*/
return; /*0x1390d*/
n2 = *(unsigned __int8 *)(i + 11); /*0x13913*/
if ( n2 == 1 ) /*0x1391a*/
goto LABEL_15; /*0x1391a*/
if ( n2 <= 2 ) /*0x1391f*/
goto LABEL_25; /*0x1391f*/
if ( n2 > 4 && n2 != 6 ) /*0x1392d*/
{
if ( n2 != 13 ) /*0x13932*/
{
if ( n2 == 36 ) /*0x13937*/
goto LABEL_10; /*0x13937*/
LABEL_25:
UsbHcPtr_1 = UsbHcPtr; /*0x13a2d*/
LABEL_26:
if ( (n32 & 0x20) != 0 && *(_QWORD *)(v13 + 24) ) /*0x13a38*/
{
v20 = XhciAllocTrbRing((__int64 *)v9); /*0x13a41*/
if ( v20 ) /*0x13a4c*/
{
*(_DWORD *)(v20 + 12) &= 0xFFFF07FF; /*0x13a4e*/
*(_DWORD *)(v20 + 12) |= 0x400u; /*0x13a55*/
v21 = *(_DWORD *)(v20 + 12) | 0x24; /*0x13a62*/
*(_QWORD *)v20 = *(_QWORD *)(v13 + 24); /*0x13a6a*/
v22 = *(unsigned __int16 *)(v13 + 322); /*0x13a70*/
v23 = *(_DWORD *)(v20 + 8) & 0xFFFE0000; /*0x13a78*/
*(_DWORD *)(v20 + 12) = v21; /*0x13a7e*/
*(_DWORD *)(v20 + 8) = v23 | v22; /*0x13a85*/
*(_DWORD *)(v20 + 12) = v21 ^ ((unsigned __int8)v21 ^ *(_BYTE *)(v9 + 28)) & 1; /*0x13a9e*/
DebugLogPrint_14(UsbHcPtr_1, v24, ia); /*0x13aa2*/
}
}
return; /*0x13aa2*/
}
LABEL_15:
if ( (unsigned __int8)(*(_BYTE *)(v13 + 21) - 1) <= 0x31u ) /*0x1398f*/
{
if ( *(_QWORD *)(v13 + 24) ) /*0x13995*/
{
v17 = *(void (__fastcall **)(__int64, __int64, _QWORD))(UsbRtDispatchTable /*0x139ad*/
+ 8LL * *(unsigned __int8 *)(v13 + 21)
+ 29456);
if ( v17 ) /*0x139b8*/
{
if ( !*(_BYTE *)(UsbRtDispatchTable + 30481) ) /*0x139ba*/
{
n0x10 = 0; /*0x139c3*/
v19 = (_QWORD *)(a1 + 232); /*0x139c6*/
do /*0x139db*/
{
if ( !*v19 ) /*0x139cd*/
break; /*0x139d0*/
n0x10 = (unsigned int)(n0x10 + 1); /*0x139d2*/
v19 += 2; /*0x139d4*/
}
while ( (unsigned int)n0x10 < 0x10 ); /*0x139db*/
if ( (_DWORD)n0x10 != 16 ) /*0x139e0*/
{
*(_QWORD *)(a1 + 16 * n0x10 + 232) = v6; /*0x139e7*/
*(_WORD *)(a1 + 16 * ((unsigned int)n0x10 + 15LL)) = *(_WORD *)(v13 + 322) - *(_WORD *)(i + 8); /*0x13a01*/
return; /*0x13a05*/
}
}
UsbHcPtr_1 = UsbHcPtr; /*0x13a18*/
v17(UsbHcPtr, v13, 0); /*0x13a25*/
goto LABEL_26; /*0x13a28*/
}
}
}
goto LABEL_25; /*0x139b8*/
}
LABEL_10:
UsbHcPtr_1 = UsbHcPtr; /*0x1393d*/
LOBYTE(v12) = *(_BYTE *)(v13 + 13); /*0x13945*/
LOBYTE(v11) = *(_BYTE *)(v13 + 12); /*0x1394c*/
Info_12 = UsbGetInfo_12(UsbHcPtr, v11, v12, 0); /*0x1394f*/
n32 = Info_12; /*0x13959*/
if ( Info_12 == 255 ) /*0x13961*/
n32 = 0; /*0x13961*/
if ( (n32 & 0x20) != 0 ) /*0x13969*/
{
UsbGetInfo_0(a1, UsbHcPtr, v3, ia); /*0x1397b*/
goto LABEL_26; /*0x1397b*/
}
}
// Function: XhciDriverInit @ 0x13ac0 (0x7de bytes)
char __fastcall XhciDriverInit(__int64 UsbHcPtr)
{
__int64 v3; // rdi
__int16 Config; // r14
unsigned int v5; // eax
unsigned __int64 v6; // rsi
unsigned int v7; // eax
unsigned __int64 v8; // rsi
unsigned __int64 v9; // rsi
__int64 TmpRdx; // rdx
__int64 **v11; // r14
__int64 n16; // r15
__int64 v13; // rax
__int64 v14; // rbp
void (__fastcall *v15)(__int64, __int64, _QWORD); // r10
char v16; // r8
unsigned __int64 v17; // rax
unsigned __int64 v18; // rdx
unsigned __int8 v19; // al
char v20; // r11
unsigned int v21; // r12d
__int64 v22; // rax
__int64 v23; // r10
unsigned __int8 v24; // r11
int v25; // r8d
int v26; // edx
unsigned int v27; // ecx
__int64 i; // r14
__int64 UsbHcPtr_1; // rcx
int v30; // edx
__int16 v31; // ax
unsigned int v32; // edx
__int64 v33; // rdx
__int64 n8; // r9
__int64 v35; // rax
__int64 v36; // rax
const CHAR8 *CmdCompleteEvt_n; // rdx
__int64 n54; // r8
__int64 v39; // rcx
__int64 ... [13244 chars total]
// Function: XhciPortStatusChange @ 0x142a0 (0x37d bytes)
__int64 __fastcall XhciPortStatusChange(__int64 UsbHcPtr, unsigned __int8 k, char a3)
{
int n64; // esi
int k_1; // r14d
int v8; // ebp
__int64 v10; // r12
unsigned int v11; // edi
unsigned int i; // r14d
char n10; // di
unsigned int n; // edi
unsigned int m; // edi
char n6; // al
unsigned int j; // edi
unsigned int v18; // eax
unsigned int v19; // r14d
int n64_1; // edi
unsigned __int8 n6_1; // r15
int n64_2; // edx
int n64_3; // ecx
int n64_4; // edx
int n0x100000; // r8d
int n64_5; // esi
unsigned int n64_6; // edi
int v28; // eax
n64 = 64; /*0x142c6*/
k_1 = k; /*0x142cb*/
v8 = 16 * (k + 63); /*0x142d2*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x142dd*/
return 255; /*0x142e4*/
v10 = *(_QWORD *)(UsbHcPtr + 72); /*0x142f0*/
v11 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x1430c*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI port[%d] status: %08x\n", k_1, v11);
for ( i = 0; i < 0xC8; ++i ) /*0x14313*/
{
if ( (v11 & 0x10) == 0 ) /*0x1431a*/
break; /*0x1431a*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x14328*/
v11 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x1433f*/
}
n10 = (v11 >> 5) & 0xF; /*0x14350*/
switch ( n10 ) /*0x14357*/
{
case 0: /*0x14357*/
goto LABEL_30; /*0x14357*/
case 3: /*0x14357*/
n64 = 320; /*0x1446d*/
goto LABEL_30; /*0x1446d*/
case 5: /*0x14357*/
goto LABEL_30; /*0x14369*/
case 6: /*0x14357*/
for ( j = 0; j < 0xC; ++j ) /*0x14438*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x14446*/
n6 = ((unsigned int)DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) >> 5) /*0x1445d*/
& 0xF;
if ( n6 != 6 ) /*0x14462*/
break; /*0x14462*/
}
goto LABEL_23; /*0x14469*/
case 7: /*0x14357*/
if ( !XhciCheckEndpointAddress(v10, k) ) /*0x143da*/
goto LABEL_30; /*0x143da*/
for ( m = 0; m < 0x1F4; ++m ) /*0x143e7*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x143f5*/
n6 = ((unsigned int)DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) >> 5) /*0x1440c*/
& 0xF;
if ( n6 != 7 ) /*0x14411*/
break; /*0x14411*/
}
if ( !n6 ) /*0x1441f*/
goto LABEL_30; /*0x1441f*/
LABEL_23:
if ( n6 == 5 ) /*0x14423*/
goto LABEL_30; /*0x14423*/
goto LABEL_24; /*0x14423*/
}
if ( n10 != 8 ) /*0x14380*/
{
if ( n10 != 10 ) /*0x14385*/
{
n64 = 65; /*0x1438b*/
goto LABEL_30; /*0x14390*/
}
LABEL_24:
UsbConfig_3(UsbHcPtr, v10, k, 1); /*0x14425*/
goto LABEL_30; /*0x14436*/
}
for ( n = 0; n < 0xC8; ++n ) /*0x14395*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x143a3*/
if ( (((unsigned int)DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) >> 5) & 0xF) != 8 ) /*0x143bf*/
break; /*0x143bf*/
}
LABEL_30:
v18 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x14472*/
v19 = v18; /*0x14480*/
if ( (v18 & 1) != 0 )
{
n64_1 = n64 | 1; /*0x14494*/
n6_1 = (v18 >> 10) & 0xF; /*0x14497*/
if ( n6_1 >= 6u ) /*0x1449f*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 4491, (__int64)"Speed < 6"); /*0x144b4*/
if ( n6_1 )
{
if ( n6_1 == 1 )
{
n64_1 = n64 | 5; /*0x14507*/
}
else if ( n6_1 == 2 )
{
n64_1 = n64 | 3; /*0x14500*/
}
else if ( n6_1 != 3 )
{
if ( n6_1 == 4 )
{
n64_1 = n64 | 9; /*0x144f9*/
}
else if ( n6_1 == 5 )
{
n64_1 = n64 | 0x81; /*0x144ef*/
}
else
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI ERROR: unknown device speed.\n");
}
}
}
n64 = n64_1 | 0x10; /*0x14513*/
if ( *(_BYTE *)(UsbRtDispatchTable + 30480) != 1 ) /*0x1451d*/
n64 = n64_1; /*0x1451d*/
if ( (v19 & 2) != 0 ) /*0x14524*/
n64 |= 0x20u; /*0x14526*/
}
n64_2 = n64 | 0x200; /*0x14531*/
if ( (v19 & 8) == 0 ) /*0x1453f*/
n64_2 = n64; /*0x1453f*/
n64_3 = n64_2 | 0x400; /*0x14544*/
if ( (v19 & 0x80000010) == 0 ) /*0x14550*/
n64_3 = n64_2; /*0x14550*/
n64_4 = n64_3 | 0x800; /*0x14555*/
n0x100000 = 0x100000; /*0x1455c*/
if ( (v19 & 0x200) == 0 ) /*0x14565*/
n64_4 = n64_3; /*0x14565*/
n64_5 = n64_4 | 0x1000; /*0x1456a*/
if ( (v19 & 0x40000) == 0 ) /*0x14573*/
n64_5 = n64_4; /*0x14573*/
if ( (v19 & 0x100000) != 0 ) /*0x14579*/
{
n64_5 |= 0x4000u; /*0x1457f*/
if ( (v19 & 0x208) == 0 ) /*0x1458f*/
n0x100000 = 1049088; /*0x14591*/
DebugLogPrint_14(UsbHcPtr, v8 + *(unsigned __int8 *)(UsbHcPtr + 50), n0x100000); /*0x14597*/
}
n64_6 = n64_5 | 0x8000; /*0x145a1*/
if ( (v19 & 0x280000) == 0 ) /*0x145aa*/
n64_6 = n64_5; /*0x145aa*/
if ( (v19 & 0x20000) != 0 ) /*0x145b2*/
{
n64_6 |= 0x10u; /*0x145b4*/
if ( a3 != 1 ) /*0x145bb*/
return n64_6; /*0x145bb*/
if ( (v19 & 0x100000) != 0 ) /*0x145c0*/
{
LABEL_67:
v28 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x145dc*/
DebugLogPrint_14(UsbHcPtr, v8 + *(unsigned __int8 *)(UsbHcPtr + 50), v28 & 0xFFFFFFFD); /*0x145f9*/
return n64_6; /*0x145f9*/
}
DebugLogPrint_14(UsbHcPtr, v8 + *(unsigned __int8 *)(UsbHcPtr + 50), 131584); /*0x145d1*/
}
if ( a3 == 1 ) /*0x145da*/
goto LABEL_67; /*0x145da*/
return n64_6; /*0x1460f*/
}
// Function: XhciPortDisable2 @ 0x14620 (0xde bytes)
char __fastcall XhciPortDisable2(__int64 UsbHcPtr, unsigned __int8 k)
{
int k_1; // ebp
int v4; // esi
unsigned __int8 n0xC8; // di
__int64 v6; // r14
k_1 = k; /*0x14639*/
v4 = 16 * (k + 63); /*0x14645*/
n0xC8 = 0; /*0x1464d*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL ) /*0x14652*/
{
v6 = *(_QWORD *)(UsbHcPtr + 72); /*0x14658*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Disable XHCI root port %d\n", k_1); /*0x1466a*/
if ( (DebugLogPrint_13(UsbHcPtr, v4 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) & 2) != 0 ) /*0x1467f*/
{
if ( XhciCheckEndpointAddress(v6, k_1) ) /*0x14687*/
{
UsbConfig_3(UsbHcPtr, v6, k_1, 0); /*0x1469c*/
}
else
{
DebugLogPrint_14(UsbHcPtr, v4 + *(unsigned __int8 *)(UsbHcPtr + 50), 514); /*0x146af*/
do /*0x146df*/
{
if ( (DebugLogPrint_13(UsbHcPtr, v4 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) & 2) == 0 ) /*0x146c4*/
break; /*0x146c4*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x146d2*/
++n0xC8; /*0x146d8*/
}
while ( n0xC8 < 0xC8u ); /*0x146df*/
}
}
}
return 0; /*0x146f7*/
}
// Function: UsbConfig_3 @ 0x14700 (0x160 bytes)
char __fastcall UsbConfig_3(__int64 UsbHcPtr, __int64 a2, unsigned __int8 k, char a4)
{
unsigned int n0x1770; // ebx
int v6; // esi
int v8; // r14d
int v10; // ebp
n0x1770 = 0; /*0x1471d*/
v6 = 16 * (k + 63); /*0x14725*/
if ( a4 && XhciCheckEndpointAddress(a2, k) ) /*0x1473a*/
{
DebugLogPrint_14(UsbHcPtr, v6 + *(unsigned __int8 *)(UsbHcPtr + 50), -2147483136); /*0x14756*/
do /*0x1478d*/
{
v8 = DebugLogPrint_13(UsbHcPtr, v6 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x14769*/
if ( (v8 & 0x280000) != 0 ) /*0x14771*/
break; /*0x14771*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x1477f*/
++n0x1770; /*0x14785*/
}
while ( n0x1770 < 0x1770 ); /*0x1478d*/
if ( (v8 & 0x280000) == 0 ) /*0x14796*/
return -1; /*0x1479a*/
if ( *(_WORD *)(a2 + 100) == 7023 && *(_WORD *)(a2 + 102) == 28707 ) /*0x147b3*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0x147c1*/
}
else
{
DebugLogPrint_14(UsbHcPtr, v6 + *(unsigned __int8 *)(UsbHcPtr + 50), 528); /*0x147d8*/
do /*0x14812*/
{
v10 = DebugLogPrint_13(UsbHcPtr, v6 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x147f1*/
if ( (v10 & 0x200000) != 0 ) /*0x147f6*/
break; /*0x147f6*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x14804*/
++n0x1770; /*0x1480a*/
}
while ( n0x1770 < 0xBB8 ); /*0x14812*/
if ( (v10 & 0x200000) == 0 ) /*0x14817*/
return -1; /*0x14817*/
}
DebugLogPrint_14(UsbHcPtr, v6 + *(unsigned __int8 *)(UsbHcPtr + 50), 2621952); /*0x1482c*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x1483d*/
return 0; /*0x14859*/
}
// Function: XhciEnableSlot @ 0x14860 (0x6f bytes)
char __fastcall XhciEnableSlot(__int64 a1, unsigned __int8 k)
{
__int64 UsbHcPtr; // r10
__int64 v5; // rbx
char v6; // di
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x1487d*/
return -1; /*0x1487f*/
v5 = *(_QWORD *)(UsbHcPtr + 72); /*0x14883*/
v6 = UsbConfig_3(UsbHcPtr, v5, k, 0); /*0x1489e*/
if ( !XhciCheckEndpointAddress(v5, k) ) /*0x148a1*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(5000); /*0x148b6*/
return v6; /*0x148c9*/
}
// Function: XhciPortStatus2 @ 0x148d0 (0x18b bytes)
char __fastcall XhciPortStatus2(__int64 a1)
{
__int64 v3; // rsi
unsigned int v4; // r14d
int n1024; // ebp
int v6; // edi
unsigned int i; // edi
unsigned int j; // edi
unsigned int v9; // edx
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0x14914*/
|| (*(_BYTE *)(a1 + 64) & 1) == 0
|| (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 )
{
return -1; /*0x148f6*/
}
v3 = *(_QWORD *)(a1 + 72); /*0x14916*/
v4 = 1; /*0x1491a*/
if ( *(_BYTE *)(v3 + 15) )
{
n1024 = 1024; /*0x1492a*/
do
{
v6 = DebugLogPrint_13(a1, n1024 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0x1494e*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI port[%d] status: %08x\n", v4, v6);
if ( (v6 & 2) != 0 && (v6 & 0x1E0u) < 0x60 ) /*0x14966*/
{
DebugLogPrint_14(a1, n1024 + *(unsigned __int8 *)(a1 + 50), v6 & 0xFFFEFF9D | 0x10060); /*0x1497d*/
for ( i = 0; i < 0xA; ++i ) /*0x14982*/
{
if ( (DebugLogPrint_13(a1, n1024 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 0x1E0) == 0x60 ) /*0x1499a*/
break; /*0x1499a*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x149a8*/
}
}
++v4; /*0x149b9*/
n1024 += 16; /*0x149bc*/
}
while ( v4 <= *(unsigned __int8 *)(v3 + 15) );
}
DebugLogPrint_19(a1, 0, 1); /*0x149d1*/
for ( j = 0; j < 0x140; ++j ) /*0x149d6*/
{
if ( (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 ) /*0x149e9*/
break; /*0x149e9*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x149f7*/
}
v9 = *(_DWORD *)(v3 + 56); /*0x14a07*/
if ( v9 ) /*0x14a0c*/
{
DebugLogPrint_20(a1, v9, 0x10000); /*0x14a17*/
if ( (*(_BYTE *)(a1 + 64) & 0x90) == 0 ) /*0x14a20*/
DebugLogPrint_14(a1, *(_DWORD *)(v3 + 56) + 4, -536870912); /*0x14a31*/
}
*(_DWORD *)(a1 + 64) &= ~1u; /*0x14a36*/
*(_DWORD *)(a1 + 64) |= 2u; /*0x14a3a*/
return 0; /*0x14a54*/
}
// Function: XhciDisableSlot @ 0x14a5c (0x5c bytes)
char __fastcall XhciDisableSlot(__int64 a1)
{
__int64 v1; // r9
char v2; // r10
int v4; // edx
unsigned int v5; // edx
int v6; // r8d
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(v1 + 64) & 1) == 0 ) /*0x14a7d*/
return -1; /*0x14a70*/
v4 = *(_DWORD *)(*(_QWORD *)(v1 + 72) + 56LL); /*0x14a7f*/
if ( v4 && (*(_BYTE *)(v1 + 64) & 0x10) == 0 && *(char *)(v1 + 64) >= 0 ) /*0x14a92*/
{
v5 = v4 + 4; /*0x14a94*/
v6 = -536862719; /*0x14a9a*/
if ( v2 != 1 ) /*0x14aa4*/
v6 = -536805376; /*0x14aa6*/
DebugLogPrint_14(v1, v5, v6); /*0x14aac*/
}
return 0; /*0x14ab3*/
}
// Function: XhciAddressDevice @ 0x14ab8 (0x4bc bytes)
__int64 __fastcall XhciAddressDevice(
__int64 UsbHcPtr,
__int64 a2,
unsigned __int16 n258,
__int16 a4,
__int16 a5,
__int64 a6,
unsigned __int16 n8)
{
unsigned __int16 n8_1; // si
__int64 v12; // r13
unsigned __int64 v13; // r8
unsigned __int64 v14; // rcx
unsigned __int8 v15; // bp
__int64 UsbRtDispatchTable; // rcx
bool v18; // cf
__int64 v19; // r15
__int64 v20; // rax
__int64 v21; // rcx
int v22; // eax
unsigned int v23; // eax
__int64 v24; // rax
unsigned __int16 v25; // r8
__int64 v26; // rcx
int v27; // eax
__int64 v28; // rax
__int64 v29; // rax
__int64 n0x80000; // r9
__int64 *v31; // rbx
__int64 v32; // r9
char v33; // bl
__int64 v34; // rbx
__int64 v35; // rdx
_DWORD *v36; // rcx
__int64 v37; // r15
__int16 v38; // bp
int v39; // ecx
unsigned __int64 v40; // rdx
unsigned __int8 v41[2]; // [rsp+40h] [rbp-48h] BYREF
__int64 v42; // [rsp+48h] [rbp-40h] BYREF
__int64 v43; // [rsp+50h] [rbp-38h] BYREF
__int64 v44; // [rsp+58h] [rbp-30h]
unsigned __int8 v45; // [rsp+A8h] [rbp+20h]
v45 = a4; /*0x14ac7*/
n8_1 = 0; /*0x14ad9*/
v42 = 0; /*0x14adf*/
v43 = 0; /*0x14ae7*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x14af9*/
return n8_1; /*0x14af9*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x14b0a*/
return n8_1; /*0x14b0a*/
v12 = *(_QWORD *)(UsbHcPtr + 72); /*0x14b14*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 /*0x14b2f*/
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
{
return n8_1; /*0x14b2f*/
}
if ( !a2 ) /*0x14b38*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 2397, (__int64)"DevInfo != ((void *) 0)"); /*0x14b4d*/
if ( *(char *)a2 < 0 ) /*0x14b56*/
return n8_1; /*0x14b56*/
v13 = *(_QWORD *)(a2 + 216); /*0x14b5c*/
v14 = *(_QWORD *)(v12 + 208); /*0x14b63*/
if ( v13 < v14 || v13 > v14 + 32 * *(unsigned __int8 *)(v12 + 113) * (unsigned int)*(unsigned __int8 *)(v12 + 12) ) /*0x14b89*/
return n8_1; /*0x14b89*/
v15 = (v13 - v14) / (32 * (unsigned __int64)*(unsigned __int8 *)(v12 + 113)) + 1; /*0x14ba8*/
if ( n258 != 1280 )
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x14bde*/
v18 = *(_WORD *)(UsbRtDispatchTable + 30470) != 0; /*0x14bec*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x14bef*/
*(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0x14bf8*/
*(_WORD *)v41 = v18 ? 0x7D0 : 0;
v19 = *(_QWORD *)(v12 + 192) + 32LL * (32 * v15 - 32); /*0x14c19*/
v20 = XhciAllocTrbRing((__int64 *)v19); /*0x14c23*/
v21 = v20; /*0x14c28*/
if ( v20 ) /*0x14c2e*/
{
*(_DWORD *)(v20 + 12) &= 0xFFFF0BFF; /*0x14c34*/
*(_DWORD *)(v20 + 8) &= 0xFFFE0008; /*0x14c46*/
*(_DWORD *)(v20 + 12) |= 0x840u; /*0x14c4d*/
n8_1 = n8; /*0x14c54*/
v22 = *(_DWORD *)(v20 + 12); /*0x14c5c*/
*(_WORD *)(v21 + 2) = a5; /*0x14c5f*/
*(_DWORD *)(v21 + 8) |= 8u; /*0x14c68*/
*(_WORD *)v21 = n258; /*0x14c70*/
*(_WORD *)(v21 + 4) = a4; /*0x14c74*/
*(_WORD *)(v21 + 6) = n8; /*0x14c78*/
if ( *(_WORD *)(v12 + 10) >= 0x100u ) /*0x14c81*/
{
if ( n8 ) /*0x14c86*/
{
if ( (n258 & 0x80u) == 0 ) /*0x14c8b*/
v23 = v22 & 0xFFFCFFFF | 0x20000; /*0x14c98*/
else
v23 = v22 | 0x30000; /*0x14c8d*/
}
else
{
v23 = v22 & 0xFFFCFFFF; /*0x14c9e*/
}
*(_DWORD *)(v21 + 12) = v23; /*0x14ca3*/
}
*(_DWORD *)(v21 + 12) ^= (*(_DWORD *)(v21 + 12) ^ *(unsigned __int8 *)(v19 + 28)) & 1; /*0x14cb1*/
if ( n8 ) /*0x14cb7*/
{
v24 = XhciAllocTrbRing((__int64 *)v19); /*0x14cc0*/
v44 = v24; /*0x14cc5*/
if ( !v24 ) /*0x14ccd*/
return v25; /*0x14cd3*/
*(_DWORD *)(v24 + 12) &= 0xFFFF0FFF; /*0x14cd8*/
*(_DWORD *)(v24 + 12) |= 0xC00u; /*0x14ce2*/
ElibReadNvStore(UsbHcPtr, n258 & 0x80, a6, n8, &v42, (__int64)&v43); /*0x14d11*/
v26 = v44; /*0x14d16*/
v27 = *(_DWORD *)(v44 + 12) ^ (n258 << 9); /*0x14d22*/
*(_DWORD *)(v44 + 8) &= 0xFFFE0000; /*0x14d25*/
*(_DWORD *)(v26 + 12) ^= v27 & 0x10000; /*0x14d31*/
v28 = v42; /*0x14d34*/
*(_DWORD *)(v26 + 8) |= n8; /*0x14d39*/
*(_QWORD *)v26 = v28; /*0x14d3c*/
*(_DWORD *)(v26 + 12) ^= (*(_DWORD *)(v26 + 12) ^ *(unsigned __int8 *)(v19 + 28)) & 1; /*0x14d4a*/
}
v29 = XhciAllocTrbRing((__int64 *)v19); /*0x14d53*/
v31 = (__int64 *)v29; /*0x14d58*/
if ( !v29 ) /*0x14d5e*/
return v25; /*0x14d5e*/
*(_DWORD *)(v29 + 12) &= 0xFFFF13FF; /*0x14d64*/
*(_DWORD *)(v29 + 12) |= 0x1020u; /*0x14d6b*/
if ( (n258 & 0x80u) == 0 ) /*0x14d75*/
*(_DWORD *)(v29 + 12) |= 0x10000u; /*0x14d77*/
LOBYTE(n0x80000) = 1; /*0x14d81*/
*(_DWORD *)(v29 + 12) ^= (*(_DWORD *)(v29 + 12) ^ *(unsigned __int8 *)(v19 + 28)) & 1; /*0x14d90*/
if ( UsbGetInfo_2(v12, UsbHcPtr, v15, n0x80000) ) /*0x14d96*/
return 0; /*0x14da6*/
LOBYTE(v32) = v15; /*0x14db0*/
v33 = DebugLogPrint_1(UsbHcPtr, v31, 32, v32, 1, v41, *(unsigned __int16 *)v41, 0); /*0x14ddd*/
if ( n8 ) /*0x14de2*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v43); /*0x14df0*/
if ( v33 ) /*0x14df6*/
{
if ( v41[0] >= 3u ) /*0x14dfe*/
{
if ( v41[0] <= 4u ) /*0x14e02*/
{
UsbGetInfo_0(v12, UsbHcPtr, v15, 1u); /*0x14e57*/
}
else if ( v41[0] == 6 ) /*0x14e06*/
{
UsbGetInfo_0(v12, UsbHcPtr, v15, 1u); /*0x14e36*/
*(_BYTE *)(UsbRtDispatchTable + 30472) |= 4u; /*0x14e42*/
}
else if ( v41[0] == 0xFF ) /*0x14e0a*/
{
XhciAddContextEntry(UsbHcPtr, a2, 0); /*0x14e15*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0x14e21*/
}
}
n8_1 = 0; /*0x14e5c*/
}
if ( n258 != 1664 ) /*0x14e68*/
{
v37 = a6; /*0x14f15*/
LABEL_50:
if ( n258 == 258 && !n8_1 && !a5 && !v37 ) /*0x14f3e*/
XhciAddContextEntry(UsbHcPtr, a2, v45); /*0x14f4e*/
return n8_1; /*0x14f4e*/
}
if ( n8_1 == 8 ) /*0x14e76*/
{
v34 = *(_QWORD *)(UsbHcPtr + 72); /*0x14e7c*/
v41[0] = v15; /*0x14e87*/
v35 = *(unsigned __int8 *)(v34 + 113); /*0x14e8c*/
v36 = (_DWORD *)(*(_QWORD *)(v34 + 208) + 32 * (unsigned int)v35 * (v15 - 1)); /*0x14e9a*/
if ( (*v36 & 0xF00000) == 0x100000 ) /*0x14ead*/
{
v37 = a6; /*0x14eb3*/
v38 = *(unsigned __int8 *)(a6 + 7); /*0x14ebb*/
if ( *(_WORD *)((char *)v36 + v35 + 6) != v38 ) /*0x14ec5*/
{
v39 = 33 * v35; /*0x14ecb*/
v40 = (unsigned int)(33 * v35); /*0x14ed1*/
if ( v39 ) /*0x14ed5*/
MemGetInfo(*(_QWORD *)(v34 + 216), v40); /*0x14ede*/
*(_DWORD *)(*(_QWORD *)(v34 + 216) + 4LL) = 2; /*0x14ef4*/
*(_WORD *)(*(_QWORD *)(v34 + 216) + 2LL * *(unsigned __int8 *)(v34 + 113) + 6) = v38; /*0x14f06*/
DebugLogPrint_0(UsbHcPtr, 13, v41); /*0x14f0e*/
goto LABEL_50; /*0x14f13*/
}
}
}
}
return n8_1; /*0x14f53*/
}
if ( (*(_DWORD *)(v13 + 12) & 0xF8000000) == 0x8000000 ) /*0x14bc1*/
DebugLogPrint(UsbHcPtr, a2, v15); /*0x14bcc*/
return n8; /*0x14f67*/
}
// Function: XhciConfigureEndpoint @ 0x14f74 (0x44c bytes)
__int64 __fastcall XhciConfigureEndpoint(
__int64 UsbHcPtr,
__int64 a2,
signed __int8 a3,
__int64 a4,
unsigned int n0x80000)
{
__int64 UsbRtDispatchTable; // rdx
__int64 v10; // rbp
unsigned __int64 v11; // r8
unsigned __int64 v12; // r9
__int16 v13; // ax
unsigned int v14; // edx
unsigned __int8 v15; // r12
char v16; // r14
unsigned __int16 v17; // ax
int v18; // edx
__int64 v19; // r13
unsigned int n0x80000_6; // ebx
unsigned int n0x80000_1; // eax
unsigned int n0x80000_3; // r15d
unsigned __int64 v23; // rbx
unsigned __int64 v24; // r8
__int64 n0x80000_4; // r9
__int64 v26; // rax
unsigned int n0x10000_1; // r9d
unsigned int n0x8000; // r10d
int v29; // r11d
unsigned __int16 v30; // dx
unsigned int n0x10000; // ecx
int v32; // eax
int v33; // eax
unsigned int n0x10000_2; // edx
unsigned int n0x80000_7; // r11d
unsigned int n31; // ecx
__int64 v37; // r9
char v38; // al
unsigned int ... [9403 chars total]
// Function: XhciSetupTrb @ 0x153c0 (0xa2 bytes)
__int64 __fastcall XhciSetupTrb(
__int64 a1,
__int64 a2,
unsigned __int16 a3,
char a4,
__int64 a5,
unsigned __int16 a6,
_DWORD *a7)
{
int v7; // r9d
unsigned int n31_1; // eax
__int64 result; // rax
unsigned int n31; // eax
*(_DWORD *)(a2 + 8) &= 0xFFFE0000; /*0x153c5*/
*(_DWORD *)(a2 + 12) &= ~1u; /*0x153cf*/
*(_DWORD *)(a2 + 12) |= a4 & 1; /*0x153de*/
*(_DWORD *)(a2 + 8) |= a3; /*0x153ec*/
v7 = *(_DWORD *)(a2 + 8); /*0x153f0*/
*(_QWORD *)a2 = a5; /*0x153f4*/
if ( *(_WORD *)(a1 + 10) < 0x100u ) /*0x15400*/
{
n31 = *a7 >> 10; /*0x1543b*/
if ( n31 > 0x1F ) /*0x15441*/
n31 = 31; /*0x15441*/
result = v7 ^ (v7 ^ (n31 << 17)) & 0x3E0000; /*0x15450*/
*a7 -= a3; /*0x15456*/
}
else
{
*a7 -= a3; /*0x1540e*/
n31_1 = *a7 / (unsigned int)a6; /*0x15413*/
if ( n31_1 > 0x1F ) /*0x15418*/
n31_1 = 31; /*0x15418*/
result = v7 ^ (v7 ^ (n31_1 << 17)) & 0x3E0000; /*0x15427*/
*(_DWORD *)(a2 + 12) |= 0x200u; /*0x1542a*/
}
*(_DWORD *)(a2 + 8) = result; /*0x1545d*/
return result; /*0x15461*/
}
// Function: XhciEvaluateContext @ 0x15464 (0x323 bytes)
__int64 __fastcall XhciEvaluateContext(
__int64 UsbHcPtr,
__int64 a2,
__int64 a3,
__int64 a4,
unsigned int a5,
_BYTE *a6)
{
__int64 v9; // r13
unsigned int v10; // esi
int v11; // ebp
unsigned __int64 v12; // rdx
unsigned __int64 v13; // r8
__int64 n0x80000; // r9
char v15; // r8
unsigned __int64 v16; // rax
unsigned __int64 v17; // r10
int v18; // eax
int v19; // ecx
__int64 v20; // r12
unsigned int n0x2000; // eax
__int64 v22; // r12
__int64 v23; // rbx
__int64 v24; // rax
__int64 v25; // r8
int v26; // edx
unsigned __int16 v27; // si
__int64 v28; // rax
__int64 v29; // rax
unsigned int v31; // [rsp+40h] [rbp-48h] BYREF
int v32; // [rsp+44h] [rbp-44h]
int v33; // [rsp+48h] [rbp-40h]
unsigned int v34; // [rsp+4Ch] [rbp-3Ch]
int v35; // [rsp+50h] [rbp-38h]
unsigned __int64 v36; // [rsp+58h] [rbp-30h]
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL /*0x154af*/
&& (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) == 0LL
&& (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 )
{
v9 = *(_QWORD *)(UsbHcPtr + 72); /*0x154b5*/
v10 = a5; /*0x154ce*/
v11 = *(unsigned __int16 *)(a2 + 378) * *(unsigned __int8 *)(a2 + 380); /*0x154d5*/
v31 = a5; /*0x154d8*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x154dc*/
v12 = *(_QWORD *)(a2 + 216); /*0x154e2*/
v13 = *(_QWORD *)(v9 + 208); /*0x154e9*/
v35 = v11; /*0x154f0*/
if ( v12 >= v13 /*0x15537*/
&& v12 <= v13 + 32 * *(unsigned __int8 *)(v9 + 12) * (unsigned int)*(unsigned __int8 *)(v9 + 113)
&& *(_BYTE *)(a2 + 376)
&& (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) == 0 )
{
if ( !a5 ) /*0x1553f*/
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 2954, (__int64)"Length > 0"); /*0x15554*/
v15 = *(_BYTE *)(a2 + 376); /*0x1556e*/
v16 = (*(_QWORD *)(a2 + 216) - *(_QWORD *)(v9 + 208)) / (32 * (unsigned __int64)*(unsigned __int8 *)(v9 + 113)); /*0x15579*/
v32 = 0; /*0x1557f*/
v17 = v16; /*0x15583*/
LOBYTE(v17) = v16 + 1; /*0x1558b*/
v18 = (unsigned __int8)(v16 + 1); /*0x15594*/
v36 = v17; /*0x15598*/
v19 = (unsigned __int8)(2 * (v15 & 0xF) + 1); /*0x155a0*/
if ( v15 >= 0 ) /*0x155a3*/
v19 = (unsigned __int8)(2 * (v15 & 0xF)); /*0x155a3*/
v33 = v19; /*0x155ac*/
v20 = (unsigned __int8)(v19 - 1) + (__int64)(32 * v18 - 32); /*0x155b9*/
n0x2000 = 0; /*0x155bc*/
v22 = *(_QWORD *)(v9 + 192) + 32 * v20; /*0x155c2*/
*(_QWORD *)(a2 + 400) = 0; /*0x155c9*/
v23 = v36; /*0x155d0*/
if ( a5 ) /*0x155d7*/
{
while ( 1 ) /*0x155e0*/
{
if ( n0x2000 >= 0x2000 ) /*0x155e5*/
{
LABEL_29:
LOBYTE(v19) = v33; /*0x15720*/
LOBYTE(v17) = v36; /*0x15724*/
goto LABEL_30; /*0x15724*/
}
v24 = XhciAllocTrbRing((__int64 *)v22); /*0x155ee*/
v23 = v24; /*0x155f3*/
if ( !v24 ) /*0x155f9*/
return 0; /*0x155f9*/
if ( *(_QWORD *)(a2 + 400) == v25 ) /*0x15606*/
*(_QWORD *)(a2 + 400) = v24; /*0x15608*/
*(_DWORD *)(v24 + 12) |= 0x20u; /*0x1560f*/
v26 = *(_DWORD *)(v24 + 12); /*0x15613*/
v34 = (unsigned __int16)v11; /*0x1561b*/
if ( v10 < (unsigned __int16)v11 ) /*0x15623*/
LOWORD(v11) = v10; /*0x15623*/
v27 = v25; /*0x15627*/
if ( (unsigned __int16)v11 + (unsigned int)(unsigned __int16)a4 > 0x10000 ) /*0x15636*/
{
v27 = a4 + v11; /*0x15638*/
LOWORD(v11) = -(__int16)a4; /*0x15640*/
}
*(_DWORD *)(v24 + 12) = v26 & 0x7FFF03FF | 0x80001400; /*0x15659*/
XhciSetupTrb(v9, v24, v11, *(_BYTE *)(v22 + 28), a4, *(_WORD *)(a2 + 378), &v31); /*0x1567c*/
if ( !v27 ) /*0x15687*/
goto LABEL_25; /*0x15687*/
if ( v31 - v27 > v34 ) /*0x15696*/
break; /*0x15696*/
v10 = 0; /*0x15716*/
v31 = 0; /*0x15719*/
LABEL_26:
a4 += 3072; /*0x156f8*/
n0x2000 = ++v32; /*0x15703*/
if ( !v10 ) /*0x1570b*/
goto LABEL_29; /*0x1570b*/
LOWORD(v11) = v35; /*0x1570d*/
}
*(_DWORD *)(v23 + 12) |= 0x10u; /*0x15698*/
v28 = XhciAllocTrbRing((__int64 *)v22); /*0x1569f*/
v23 = v28; /*0x156a4*/
if ( !v28 ) /*0x156aa*/
return 0; /*0x156aa*/
*(_DWORD *)(v28 + 12) &= 0xFFFF07FF; /*0x156b0*/
*(_DWORD *)(v28 + 12) |= 0x400u; /*0x156bb*/
XhciSetupTrb(v9, v28, v27, *(_BYTE *)(v22 + 28), a4 + (unsigned __int16)v11, *(_WORD *)(a2 + 378), &v31); /*0x156ec*/
LABEL_25:
v10 = v31; /*0x156f4*/
goto LABEL_26; /*0x156f4*/
}
LABEL_30:
v29 = *(_QWORD *)v23; /*0x15729*/
*(_DWORD *)(v23 + 12) &= ~0x200u; /*0x1572c*/
*(_DWORD *)(v23 + 8) &= 0xFFC1FFFF; /*0x15731*/
*(_QWORD *)(a2 + 416) = v29; /*0x15738*/
if ( a6 ) /*0x1574a*/
{
*(_QWORD *)(a2 + 392) = a6; /*0x1574c*/
*a6 = 0; /*0x15753*/
}
LOBYTE(n0x80000) = v19; /*0x15756*/
UsbGetInfo_2(v9, UsbHcPtr, v17, n0x80000); /*0x15762*/
}
}
return 0; /*0x1577a*/
}
// Function: XhciConfigureEndpoint2 @ 0x15788 (0x289 bytes)
__int64 __fastcall XhciConfigureEndpoint2(
__int64 UsbHcPtr,
__int64 a2,
signed __int8 a3,
__int64 a4,
__int64 a5,
unsigned __int16 a6)
{
__int64 UsbRtDispatchTable; // r9
__int64 v10; // rsi
unsigned __int64 v11; // rdx
unsigned __int64 v12; // r8
unsigned int v13; // edx
char i; // di
unsigned __int8 v15; // r14
__int64 v16; // rcx
__int64 n0x80000; // r9
__int64 v18; // r15
__int64 result; // rax
__int64 v20; // rax
__int64 v21; // r9
unsigned __int16 v22; // bp
unsigned __int16 v23[2]; // [rsp+40h] [rbp-48h] BYREF
int v24; // [rsp+44h] [rbp-44h] BYREF
__int64 v25; // [rsp+48h] [rbp-40h] BYREF
__int64 v26; // [rsp+50h] [rbp-38h] BYREF
v25 = 0; /*0x157a9*/
v26 = 0; /*0x157b0*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x157bf*/
return 0; /*0x157bf*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x157d0*/
return 0; /*0x157d0*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x157da*/
return 0; /*0x157da*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x157e0*/
*(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x157e7*/
v10 = *(_QWORD *)(UsbHcPtr + 72); /*0x157ee*/
v11 = *(_QWORD *)(a2 + 216); /*0x157f2*/
v12 = *(_QWORD *)(v10 + 208); /*0x157f9*/
if ( v11 < v12 ) /*0x15803*/
return 0; /*0x15803*/
if ( v11 > v12 + 32 * *(unsigned __int8 *)(v10 + 12) * (unsigned int)*(unsigned __int8 *)(v10 + 113) ) /*0x1581d*/
return 0; /*0x1581d*/
if ( !a3 ) /*0x15826*/
return 0; /*0x15826*/
v13 = *(unsigned __int8 *)(UsbHcPtr + 50) + 4; /*0x1583b*/
v23[0] = *(_WORD *)(UsbRtDispatchTable + 30470); /*0x1583e*/
if ( (DebugLogPrint_13(UsbHcPtr, v13) & 1) != 0 ) /*0x1584a*/
return 0; /*0x159f0*/
i = 2 * (a3 & 0xF); /*0x1586f*/
v15 = (*(_QWORD *)(a2 + 216) - *(_QWORD *)(v10 + 208)) / (32 * (unsigned __int64)*(unsigned __int8 *)(v10 + 113)) + 1; /*0x1587b*/
if ( a3 < 0 ) /*0x15881*/
++i; /*0x15883*/
v24 = a6; /*0x158b0*/
ElibReadNvStore(UsbHcPtr, a3 & 0x80, a5, a6, &v25, (__int64)&v26); /*0x158b4*/
v18 = XhciAllocTrbRing((__int64 *)(*(_QWORD *)(v10 + 192) + 32 * ((unsigned __int8)(i - 1) + (__int64)(32 * v15 - 32)))); /*0x158df*/
result = 0; /*0x158e2*/
if ( v18 ) /*0x158e7*/
{
*(_DWORD *)(v18 + 12) &= 0xFFFF07FF; /*0x158ed*/
LOBYTE(n0x80000) = i; /*0x158f5*/
*(_DWORD *)(v18 + 12) |= 0x424u; /*0x158f8*/
v20 = v25; /*0x15903*/
*(_DWORD *)(v18 + 8) &= 0xFFFE0000; /*0x1590b*/
*(_QWORD *)v18 = v20; /*0x15913*/
*(_DWORD *)(v18 + 8) |= a6; /*0x15918*/
*(_DWORD *)(v18 + 12) ^= (*(_DWORD *)(v18 + 12) ^ *(unsigned __int8 *)(v16 + 28)) & 1; /*0x1592a*/
if ( UsbGetInfo_2(v10, UsbHcPtr, v15, n0x80000) ) /*0x1592e*/
{
return 0; /*0x15939*/
}
else
{
LOBYTE(v21) = v15; /*0x15946*/
if ( DebugLogPrint_1(UsbHcPtr, (__int64 *)v18, 32, v21, i, v23, v23[0], &v24) ) /*0x15973*/
{
if ( LOBYTE(v23[0]) >= 3u ) /*0x15982*/
{
if ( LOBYTE(v23[0]) <= 4u ) /*0x15986*/
{
UsbGetInfo_0(v10, UsbHcPtr, v15, i); /*0x159cd*/
}
else if ( LOBYTE(v23[0]) == 6 ) /*0x1598a*/
{
UsbGetInfo_3(v10, UsbHcPtr, v15, i); /*0x159ba*/
}
else if ( LOBYTE(v23[0]) == 0xFF ) /*0x1598e*/
{
XhciAddContextEntry(UsbHcPtr, a2, a3); /*0x15999*/
*(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0x159a5*/
}
}
v22 = 0; /*0x159d2*/
}
else
{
v22 = a6 - v24; /*0x159d6*/
}
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v26); /*0x159e7*/
return v22; /*0x159eb*/
}
}
return result; /*0x15a04*/
}
// Function: XhciResetEndpoint @ 0x15a14 (0x1ba bytes)
char __fastcall XhciResetEndpoint(__int64 UsbHcPtr, __int64 a2)
{
unsigned __int64 v4; // rcx
char v5; // r9
unsigned __int64 v6; // r10
__int64 v7; // rbp
unsigned __int64 v8; // rdi
__int64 v9; // r11
unsigned __int8 v10; // r14
unsigned __int8 v11; // dl
unsigned __int8 v12; // si
_BYTE *v13; // rdi
__int64 v14; // rcx
unsigned __int8 v16[12]; // [rsp+20h] [rbp-28h] BYREF
int v17; // [rsp+2Ch] [rbp-1Ch]
__int16 v18; // [rsp+60h] [rbp+18h] BYREF
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x15a34*/
return -1; /*0x15a34*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x15a45*/
return -1; /*0x15a45*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x15a4f*/
return -1; /*0x15a4f*/
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 ) /*0x15a66*/
return -1; /*0x15a66*/
v4 = *(_QWORD *)(a2 + 24); /*0x15a6c*/
if ( !v4 ) /*0x15a73*/
return -1; /*0x15a73*/
FwVolConfig(v4, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x15a8b*/
v5 = *(_BYTE *)(a2 + 64); /*0x15a90*/
*(_QWORD *)(a2 + 24) = 0; /*0x15a94*/
if ( !v5 ) /*0x15a9c*/
return -1; /*0x15a9c*/
v6 = *(_QWORD *)(a2 + 216); /*0x15aa2*/
v7 = *(_QWORD *)(UsbHcPtr + 72); /*0x15aab*/
v8 = *(_QWORD *)(v7 + 208); /*0x15ab2*/
v9 = *(unsigned __int8 *)(v7 + 113); /*0x15ab9*/
v10 = (v6 - v8) / (32 * v9) + 1; /*0x15ad6*/
v11 = 2 * (v5 & 0xF) + 1; /*0x15ae9*/
if ( v5 >= 0 ) /*0x15aec*/
v11 = 2 * (v5 & 0xF); /*0x15aec*/
v12 = v11; /*0x15af0*/
v18 = v10 + (v11 << 8); /*0x15aff*/
if ( v6 < v8 || v6 > v8 + 32 * *(unsigned __int8 *)(v7 + 12) * (unsigned int)v9 ) /*0x15b20*/
return -1; /*0x15bb9*/
v13 = (_BYTE *)(v6 + v9 * v11); /*0x15b2e*/
if ( (*v13 & 7) == 1 ) /*0x15b37*/
DebugLogPrint_0(UsbHcPtr, 15, (unsigned __int8 *)&v18); /*0x15b46*/
if ( (*(_DWORD *)v13 & 7u) - 3 <= 1 ) /*0x15b56*/
{
v14 = *(_QWORD *)(v7 + 192) + 32 * ((unsigned __int8)(v12 - 1) + (__int64)(32 * v10 - 32)); /*0x15b7c*/
*(_QWORD *)v16 = *(_QWORD *)(v14 + 20) + *(unsigned __int8 *)(v14 + 28); /*0x15b8e*/
v17 = v17 & 0xE0FFFF | ((v12 | (v10 << 8)) << 16); /*0x15ba7*/
DebugLogPrint_0(UsbHcPtr, 16, v16); /*0x15bb0*/
}
return 0; /*0x15bc5*/
}
// Function: XhciStopEndpoint @ 0x15bd0 (0x195 bytes)
char __fastcall XhciStopEndpoint(__int64 a1, __int64 a2)
{
__int64 v2; // rbp
char v5; // r8
unsigned __int64 v6; // rax
unsigned __int64 v7; // rdx
unsigned __int8 v8; // bl
unsigned __int8 v9; // r14
__int64 v10; // rax
__int64 v11; // r9
int v12; // r10d
int v14; // edx
int v15; // ecx
unsigned int v16; // ecx
v2 = *(_QWORD *)(a1 + 72); /*0x15be9*/
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x15bfb*/
return -1; /*0x15bfb*/
if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x15c0c*/
return -1; /*0x15c0c*/
if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x15c16*/
return -1; /*0x15c16*/
if ( (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 ) /*0x15c2d*/
return -1; /*0x15c2d*/
v5 = *(_BYTE *)(a2 + 64); /*0x15c33*/
if ( !v5 ) /*0x15c3a*/
return -1; /*0x15c3a*/
v6 = *(_QWORD *)(a2 + 216); /*0x15c40*/
v7 = *(_QWORD *)(v2 + 208); /*0x15c47*/
if ( v6 < v7 || v6 > v7 + 32 * *(unsigned __int8 *)(v2 + 113) * (unsigned int)*(unsigned __int8 *)(v2 + 12) ) /*0x15c6d*/
return -1; /*0x15d48*/
v8 = (v6 - v7) / (32 * (unsigned __int64)*(unsigned __int8 *)(v2 + 113)) + 1; /*0x15c90*/
v9 = 2 * (v5 & 0xF) + 1; /*0x15c96*/
if ( v5 >= 0 ) /*0x15ca1*/
v9 = 2 * (v5 & 0xF); /*0x15ca1*/
*(_QWORD *)(a2 + 24) = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x15cb2*/
v10 = XhciAllocTrbRing((__int64 *)(*(_QWORD *)(v2 + 192) + 32 * ((unsigned __int8)(v9 - 1) + (__int64)(32 * v8 - 32)))); /*0x15cde*/
if ( v10 ) /*0x15ce9*/
{
*(_DWORD *)(v10 + 12) &= 0xFFFF07FF; /*0x15cef*/
*(_DWORD *)(v10 + 12) |= 0x400u; /*0x15cf6*/
v14 = *(_DWORD *)(v10 + 12) | 0x24; /*0x15d02*/
v15 = *(_DWORD *)(v10 + 8); /*0x15d05*/
*(_QWORD *)v10 = *(_QWORD *)(a2 + 24); /*0x15d09*/
v16 = *(unsigned __int16 *)(a2 + 322) | v15 & 0xFFFE0000; /*0x15d19*/
*(_DWORD *)(v10 + 12) = v14; /*0x15d1b*/
*(_DWORD *)(v10 + 8) = v16; /*0x15d1f*/
*(_DWORD *)(v10 + 12) = v14 ^ ((unsigned __int8)v14 ^ *(_BYTE *)(v11 + 28)) & 1; /*0x15d32*/
DebugLogPrint_14(a1, *(_DWORD *)(v2 + 28) + 4 * v12, v9); /*0x15d41*/
}
return 0; /*0x15d5e*/
}
// Function: XhciSetTrDequeuePtr @ 0x15d68 (0x77 bytes)
char __fastcall XhciSetTrDequeuePtr(__int64 a1)
{
__int64 v3; // rdx
__int64 v4; // rbx
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0x15d9a*/
|| (*(_BYTE *)(a1 + 64) & 1) == 0
|| (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 )
{
return -1; /*0x15d7f*/
}
v4 = *(_QWORD *)(a1 + 72); /*0x15d9c*/
DebugLogPrint_18(a1, v3, *(_QWORD *)(v4 + 48) + 56LL, *(_QWORD *)(v4 + 180) | 8LL); /*0x15db6*/
DebugLogPrint_14(a1, *(_DWORD *)(v4 + 48) - *(_DWORD *)(a1 + 16) + 36, 4000); /*0x15dcd*/
return 0; /*0x15dd9*/
}
// Function: XhciSetTrDequeuePtrSub @ 0x15de0 (0x72 bytes)
char __fastcall XhciSetTrDequeuePtrSub(__int64 a1)
{
__int64 v3; // rdx
__int64 v4; // rbx
if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0x15e12*/
|| (*(_BYTE *)(a1 + 64) & 1) == 0
|| (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 )
{
return -1; /*0x15df7*/
}
v4 = *(_QWORD *)(a1 + 72); /*0x15e14*/
DebugLogPrint_18(a1, v3, *(_QWORD *)(v4 + 48) + 56LL, 8); /*0x15e29*/
DebugLogPrint_14(a1, *(_DWORD *)(v4 + 48) - *(_DWORD *)(a1 + 16) + 36, 2097184000); /*0x15e40*/
return 0; /*0x15e4c*/
}
// Function: XhciAllocTrbFromRing @ 0x15e54 (0x5f bytes)
__int64 __fastcall XhciAllocTrbFromRing(__int64 a1, unsigned __int8 a2, unsigned __int8 a3)
{
__int64 v4; // r9
__int64 v5; // rbx
int v6; // ecx
v4 = 32 * (unsigned int)a2; /*0x15e61*/
v5 = *(_QWORD *)(a1 + 192) + 32 * (a3 + (__int64)((int)v4 - 32)); /*0x15e77*/
v6 = v4 + a3 - 32; /*0x15e8b*/
LOBYTE(v4) = 1; /*0x15e8e*/
XhciInitTrbRing(v5, *(_QWORD *)(a1 + 200) + 16LL * (v6 << 6), 64, v4); /*0x15ea5*/
return v5; /*0x15ead*/
}
// Function: XhciConfigureEndpointFull @ 0x15eb4 (0x539 bytes)
char __fastcall XhciConfigureEndpointFull(__int64 UsbHcPtr, __int64 dst, __int64 a3)
{
__int64 v3; // r15
__int64 dst_1; // rbx
__int64 UsbHcPtr_1; // rdi
unsigned __int64 v7; // rax
unsigned __int16 n2047; // r13
_DWORD *v9; // rcx
unsigned __int64 v10; // rdx
int v11; // r8d
int n3_1; // r14d
int *v13; // rsi
unsigned int n2047_1; // r14d
unsigned __int16 n2047_3; // r8
__int64 n2047_4; // r12
unsigned __int8 v17; // al
char n5; // al
unsigned __int8 n4; // dl
unsigned __int8 v20; // r14
int v21; // ecx
unsigned int v22; // eax
unsigned __int64 v23; // rdi
char n4_1; // al
unsigned __int64 v25; // rax
__int16 v26; // cx
__int16 v27; // r8
unsigned int v28; // ecx
unsigned int v29; // ecx
char v30; // bl
char v31; // bl
unsigned __int8 v32; // al
int v33; // eax
_QWORD *v34; // rbx
unsigned __int8 v35; // al
char v36; // bl
char v37; // cl
__int64 v38; // rbx
bool v39; // zf
bool v41; // [rsp+40h] [rbp-58h]
un... [10840 chars total]
// Function: UsbConfig_21 @ 0x163f0 (0x75 bytes)
char __fastcall UsbConfig_21(__int64 a1)
{
char v1; // dl
unsigned __int8 i; // cl
__int64 v3; // r9
v1 = *(_BYTE *)(a1 + 12); /*0x163f4*/
if ( v1 >= 0 ) /*0x163f9*/
{
while ( 2 ) /*0x16402*/
{
for ( i = 1; ; ++i ) /*0x16402*/
{
if ( i >= 0x37u ) /*0x16407*/
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 3931, (__int64)"((BOOLEAN)(0==1))"); /*0x1645c*/
return 0; /*0x16461*/
}
v3 = 448LL * i; /*0x1640c*/
if ( (*(_BYTE *)(v3 + UsbRtDispatchTable + 3056) & 3) == 3 && *(_BYTE *)(v3 + UsbRtDispatchTable + 3066) == v1 ) /*0x1642a*/
break; /*0x1642a*/
}
a1 = v3 + UsbRtDispatchTable + 3056; /*0x16437*/
v1 = *(_BYTE *)(a1 + 12); /*0x1643a*/
if ( v1 >= 0 ) /*0x1643f*/
continue; /*0x1643f*/
break;
}
}
return *(_BYTE *)(a1 + 13); /*0x16444*/
}
// Function: XhciEnableSlotDone @ 0x16468 (0xfd bytes)
char __fastcall XhciEnableSlotDone(__int64 UsbHcPtr, __int64 a2, __int64 a3, __int64 *a4)
{
char result; // al
__int64 v8; // rsi
int v9; // ecx
unsigned int v10; // edi
unsigned int v11; // ecx
__int64 v12; // rdi
int v13; // r8d
unsigned __int8 v14[24]; // [rsp+20h] [rbp-18h] BYREF
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x164bf*/
|| (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
{
return -1; /*0x16494*/
}
v8 = *(_QWORD *)(UsbHcPtr + 72); /*0x164c1*/
result = DebugLogPrint_0(UsbHcPtr, 9, v14); /*0x164d2*/
if ( !result )
{
v9 = *(unsigned __int8 *)(v8 + 113); /*0x164db*/
v10 = v9 * (32 * v14[0] - 32); /*0x164ec*/
v11 = 32 * v9; /*0x164f0*/
v12 = *(_QWORD *)(v8 + 208) + v10; /*0x164f5*/
if ( v11 ) /*0x16500*/
MemGetInfo(v12, v11); /*0x16505*/
v13 = v14[0]; /*0x1650a*/
*(_QWORD *)(*(_QWORD *)(v8 + 120) + 8LL * (v14[0] - 1) + 8) = v12; /*0x16525*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Slot[%d] enabled, device context at %x\n", v13, v12);
result = DebugLogPrint(UsbHcPtr, a2, v14[0]); /*0x1653e*/
if ( !result ) /*0x16545*/
*a4 = v12; /*0x16547*/
}
return result; /*0x1655e*/
}
// Function: XhciAddressDeviceDone @ 0x16568 (0x1a9 bytes)
char __fastcall XhciAddressDeviceDone(__int64 UsbHcPtr, __int64 a2)
{
__int64 v5; // rsi
_DWORD *v6; // r14
unsigned __int64 v7; // rdx
__int64 v8; // rcx
unsigned __int8 v9; // r15
unsigned __int8 v10; // bp
unsigned __int64 v11; // rcx
unsigned __int8 v12; // [rsp+60h] [rbp+18h] BYREF
__int16 v13; // [rsp+68h] [rbp+20h] BYREF
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x165b9*/
|| (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
|| (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
|| (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
{
return -1; /*0x1658e*/
}
v5 = *(_QWORD *)(UsbHcPtr + 72); /*0x165bb*/
v6 = *(_DWORD **)(a2 + 216); /*0x165bf*/
v7 = *(_QWORD *)(v5 + 208); /*0x165c6*/
if ( (unsigned __int64)v6 >= v7 ) /*0x165d0*/
{
v8 = *(unsigned __int8 *)(v5 + 113); /*0x165da*/
if ( (unsigned __int64)v6 <= v7 + 32 * (unsigned int)v8 * *(unsigned __int8 *)(v5 + 12) ) /*0x165ea*/
{
v9 = ((unsigned __int64)v6 - v7) / (32 * v8) + 1; /*0x16602*/
v12 = v9; /*0x16609*/
if ( *(_QWORD *)(*(_QWORD *)(v5 + 120) + 8LL * (v9 - 1) + 8) ) /*0x16619*/
{
v10 = 1; /*0x16628*/
if ( (*v6 & 0xF8000000) >= 0x8000000 ) /*0x16635*/
{
do /*0x166c4*/
{
v11 = *(_QWORD *)(a2 + 216) + *(unsigned __int8 *)(v5 + 113) * (unsigned __int64)v10; /*0x16647*/
if ( *(_QWORD *)(v11 + 8) ) /*0x1664e*/
{
if ( (*(_BYTE *)v11 & 7) == 1 ) /*0x1665b*/
{
v13 = v9 + (v10 << 8); /*0x16678*/
DebugLogPrint_0(UsbHcPtr, 15, (unsigned __int8 *)&v13); /*0x16682*/
}
MemGetInfo( /*0x166b0*/
*(_QWORD *)(32 * ((unsigned __int8)(v10 - 1) + (__int64)(32 * v9 - 32)) + *(_QWORD *)(v5 + 192)),
0x400u);
}
++v10; /*0x166b8*/
}
while ( (unsigned int)v10 <= *v6 >> 27 ); /*0x166c4*/
}
DebugLogPrint_0(UsbHcPtr, 10, &v12); /*0x166d7*/
*(_QWORD *)(*(_QWORD *)(v5 + 120) + 8LL * (v12 - 1) + 8) = 0; /*0x166ea*/
}
*(_QWORD *)(a2 + 216) = 0; /*0x166f0*/
}
}
return 0; /*0x16704*/
}
// Function: XhciAddContextEntry @ 0x16714 (0x186 bytes)
char __fastcall XhciAddContextEntry(__int64 UsbHcPtr, __int64 a2, unsigned __int8 a3)
{
char v6; // bp
__int64 v7; // r14
unsigned __int64 v8; // r8
unsigned __int64 v9; // rcx
unsigned __int8 v10; // r15
unsigned __int8 v11; // bl
_BYTE *v12; // rsi
__int64 v13; // rcx
unsigned __int8 v15[12]; // [rsp+20h] [rbp-28h] BYREF
int v16; // [rsp+2Ch] [rbp-1Ch]
__int16 v17; // [rsp+68h] [rbp+20h] BYREF
v6 = 0; /*0x16735*/
if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x1673f*/
return -1; /*0x1673f*/
if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x16749*/
return -1; /*0x16749*/
if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 ) /*0x16760*/
return -1; /*0x16760*/
v7 = *(_QWORD *)(UsbHcPtr + 72); /*0x16766*/
v8 = *(_QWORD *)(a2 + 216); /*0x1676a*/
v9 = *(_QWORD *)(v7 + 208); /*0x16771*/
if ( v8 < v9 || v8 > v9 + 32 * *(unsigned __int8 *)(v7 + 113) * (unsigned int)*(unsigned __int8 *)(v7 + 12) ) /*0x16797*/
return -1; /*0x1687f*/
v10 = (v8 - v9) / (32 * (unsigned __int64)*(unsigned __int8 *)(v7 + 113)) + 1; /*0x167b7*/
if ( a3 ) /*0x167bd*/
v11 = (a3 >> 7) + 2 * (a3 & 0xF); /*0x167ca*/
else
v11 = 1; /*0x167cf*/
v12 = (_BYTE *)(v8 + *(unsigned __int8 *)(v7 + 113) * (unsigned __int64)v11); /*0x167d8*/
if ( (*v12 & 7) == 1 ) /*0x167e1*/
{
v17 = v10 + (v11 << 8); /*0x167fb*/
v6 = DebugLogPrint_0(UsbHcPtr, 15, (unsigned __int8 *)&v17); /*0x1680b*/
}
if ( (*(_DWORD *)v12 & 7u) - 3 <= 1 ) /*0x16819*/
{
v13 = *(_QWORD *)(v7 + 192) + 32 * ((unsigned __int8)(v11 - 1) + (__int64)(32 * v10 - 32)); /*0x1683f*/
*(_QWORD *)v15 = *(_QWORD *)(v13 + 20) + *(unsigned __int8 *)(v13 + 28); /*0x16851*/
v16 = v16 & 0xE0FFFF | ((v11 | (v10 << 8)) << 16); /*0x16869*/
return DebugLogPrint_0(UsbHcPtr, 16, v15); /*0x16877*/
}
return v6; /*0x16890*/
}
// Function: DebugLogPrint @ 0x1689c (0x2f8 bytes)
char __fastcall DebugLogPrint(__int64 UsbHcPtr, __int64 a2, unsigned __int8 a3)
{
__int64 v3; // rdi
__int64 v4; // rbp
int v5; // r15d
int v8; // r8d
__int64 v9; // rsi
__int64 v10; // r14
__int64 v12; // rbx
__int64 v13; // rax
unsigned __int64 v14; // r8
unsigned __int64 v15; // r10
unsigned __int8 n15; // cl
int v17; // ecx
int n2; // ecx
__int64 v19; // rdx
__int64 v20; // rcx
bool v21; // bl
char v22; // si
__int16 v23; // [rsp+60h] [rbp+8h] BYREF
unsigned __int8 v24; // [rsp+70h] [rbp+18h] BYREF
v24 = a3; /*0x168a1*/
v3 = *(_QWORD *)(UsbHcPtr + 72); /*0x168b5*/
v4 = 0; /*0x168b9*/
v5 = a3; /*0x168bb*/
v8 = *(unsigned __int8 *)(v3 + 113); /*0x168c5*/
v9 = *(_QWORD *)(v3 + 216); /*0x168ca*/
v10 = *(_QWORD *)(v3 + 208) + (unsigned int)(32 * v8 * (v5 - 1)); /*0x168e0*/
if ( (*(_DWORD *)(v10 + 12) & 0xF8000000) >= 0x10000000 ) /*0x168f5*/
return -1; /*0x168f9*/
if ( 33 * v8 ) /*0x168fe*/
MemGetInfo(*(_QWORD *)(v3 + 216), (unsigned int)(33 * v8)); /*0x1690b*/
*(_DWORD *)(v9 + 4) = 3; /*0x16910*/
v12 = v9 + *(unsigned __int8 *)(v3 + 113); /*0x1691e*/
*(_DWORD *)v12 &= 0x7F00000u; /*0x16921*/
*(_DWORD *)v12 |= 0x8000000u; /*0x16927*/
*(_BYTE *)(v12 + 6) = UsbConfig_21(a2); /*0x16930*/
if ( *(_BYTE *)(a2 + 14) ) /*0x16933*/
{
switch ( *(_BYTE *)(a2 + 14) ) /*0x1693f*/
{
case 1: /*0x1693f*/
*(_DWORD *)v12 &= 0xFF2FFFFF; /*0x16976*/
*(_DWORD *)v12 |= 0x200000u; /*0x1697c*/
break;
case 2: /*0x1693f*/
*(_DWORD *)v12 &= 0xFF1FFFFF; /*0x1696a*/
*(_DWORD *)v12 |= 0x100000u; /*0x16970*/
break;
case 4: /*0x1693f*/
*(_DWORD *)v12 &= 0xFF4FFFFF; /*0x1695e*/
*(_DWORD *)v12 |= 0x400000u; /*0x16964*/
break;
case 0x40: /*0x1693f*/
*(_DWORD *)v12 &= 0xFF5FFFFF; /*0x16950*/
*(_DWORD *)v12 |= 0x500000u; /*0x16956*/
break;
}
}
else
{
*(_DWORD *)v12 &= 0xFF3FFFFF; /*0x16982*/
*(_DWORD *)v12 |= 0x300000u; /*0x16988*/
}
v13 = FwVolDriverEntry(16, 0, *(_BYTE *)(a2 + 12), 0); /*0x16999*/
if ( v13 ) /*0x169aa*/
{
v14 = *(_QWORD *)(v13 + 216); /*0x169b0*/
v15 = *(_QWORD *)(v3 + 208); /*0x169b7*/
if ( v14 < v15 || v14 > v15 + 32 * *(unsigned __int8 *)(v3 + 113) * (unsigned int)*(unsigned __int8 *)(v3 + 12) ) /*0x169db*/
return 0; /*0x169db*/
n15 = *(_BYTE *)(a2 + 13); /*0x169e1*/
if ( n15 > 0xFu ) /*0x169ed*/
n15 = 15; /*0x169ed*/
*(_DWORD *)v12 ^= (*(_DWORD *)v12 ^ (*(_DWORD *)v14 | (n15 << (4 * *(_BYTE *)(v13 + 224))))) & 0xFFFFF; /*0x16a0d*/
if ( (((*(_DWORD *)v12 & 0xF00000) - 0x100000) & 0xFFEFFFFF) == 0 ) /*0x16a1e*/
{
if ( (*(_DWORD *)v14 & 0xF00000) == 0x300000 ) /*0x16a2b*/
{
*(_BYTE *)(v12 + 8) = (*(_QWORD *)(v13 + 216) - *(_QWORD *)(v3 + 208)) /*0x16a4a*/
/ (32
* (unsigned __int64)*(unsigned __int8 *)(v3 + 113))
+ 1;
LOBYTE(v13) = *(_BYTE *)(a2 + 13); /*0x16a4d*/
}
else
{
*(_BYTE *)(v12 + 8) = *(_BYTE *)(v14 + 8); /*0x16a57*/
LODWORD(v13) = *(_DWORD *)(v14 + 8) >> 8; /*0x16a5e*/
}
*(_BYTE *)(v12 + 9) = v13; /*0x16a61*/
*(_DWORD *)v12 ^= (*(_DWORD *)v12 ^ *(_DWORD *)v14) & 0x2000000; /*0x16a6e*/
}
}
v17 = *(_DWORD *)(*(unsigned __int8 *)(v3 + 113) + v10) & 7; /*0x16a78*/
if ( v17 ) /*0x16a7b*/
{
n2 = v17 - 1; /*0x16a7d*/
if ( !n2 || n2 == 2 ) /*0x16a85*/
v4 = *(_QWORD *)(v3 + 192) + 32LL * (32 * (unsigned __int8)v5 - 32); /*0x16a98*/
}
else
{
v4 = XhciAllocTrbFromRing(v3, v5, 0); /*0x16aaf*/
}
v19 = *(unsigned __int8 *)(v3 + 113); /*0x16ab8*/
*(_DWORD *)(v9 + 2 * v19 + 4) &= 0xFFFFFFE7; /*0x16ac1*/
*(_DWORD *)(v9 + 2 * v19 + 4) |= 0x20u; /*0x16ac6*/
*(_WORD *)(v9 + 2 * v19 + 6) = *(_WORD *)(a2 + 16); /*0x16ad0*/
v20 = *(_QWORD *)(v4 + 20) | *(unsigned __int8 *)(v4 + 28); /*0x16ad9*/
*(_DWORD *)(v9 + 2 * v19 + 4) |= 6u; /*0x16add*/
*(_WORD *)(v9 + 2 * v19 + 16) = 8; /*0x16ae2*/
*(_QWORD *)(v9 + 2 * v19 + 8) = v20; /*0x16ae7*/
v21 = (((*(_DWORD *)v12 & 0xF00000) - 0x400000) & 0xFFEFFFFF) != 0 && *(_DWORD *)(v10 + 12) < 0x8000000u; /*0x16b07*/
v23 = (unsigned __int8)v5 | (v21 << 8); /*0x16b25*/
v22 = DebugLogPrint_0(UsbHcPtr, 11, (unsigned __int8 *)&v23); /*0x16b32*/
if ( v22 ) /*0x16b37*/
{
DebugLogPrint_0(UsbHcPtr, 10, &v24); /*0x16b46*/
*(_QWORD *)(*(_QWORD *)(v3 + 120) + 8LL * (v24 - 1) + 8) = 0; /*0x16b5c*/
return v22; /*0x16b62*/
}
if ( !v21 )
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: new device address %d\n", *(unsigned __int8 *)(v10 + 12));
return 0; /*0x16b84*/
}
// Function: UsbGetInfo_2 @ 0x16b94 (0xa9 bytes)
char __fastcall UsbGetInfo_2(__int64 a1, __int64 UsbHcPtr, unsigned __int8 a3, __int64 n0x80000)
{
unsigned __int8 n0x80000_1; // bp
unsigned int n0x2710; // ebx
_BYTE *v9; // rdi
n0x80000_1 = n0x80000; /*0x16bb5*/
DebugLogPrint_14(UsbHcPtr, *(_DWORD *)(a1 + 28) + 4 * a3, (unsigned __int8)n0x80000); /*0x16bc2*/
n0x2710 = 0; /*0x16bc7*/
if ( !a3 ) /*0x16bcc*/
return -1; /*0x16bce*/
v9 = (_BYTE *)(*(_QWORD *)(a1 + 208) /*0x16bf2*/
+ *(unsigned __int8 *)(a1 + 113) * (unsigned __int64)n0x80000_1
+ 32 * *(unsigned __int8 *)(a1 + 113) * ((unsigned int)a3 - 1));
do /*0x16c1b*/
{
if ( (*v9 & 7) == 1 ) /*0x16bff*/
break; /*0x16bff*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(1); /*0x16c0d*/
++n0x2710; /*0x16c13*/
}
while ( n0x2710 < 0x2710 ); /*0x16c1b*/
return -((*v9 & 7) != 1); /*0x16c37*/
}
// Function: UsbGetInfo_8 @ 0x16c40 (0x55 bytes)
unsigned __int64 __fastcall sub_16C40(__int64 UsbHcPtr, __int64 TmpRdx, int a3)
{
unsigned int v4; // edi
__int64 v6; // rbx
v4 = a3 - *(_DWORD *)(UsbHcPtr + 16); /*0x16c55*/
if ( (unsigned __int64)v4 + 8 > *(_QWORD *)(UsbHcPtr + 24) ) /*0x16c62*/
return 0; /*0x16c64*/
v6 = (unsigned int)DebugLogPrint_13(UsbHcPtr, v4); /*0x16c72*/
return v6 | ((unsigned __int64)(unsigned int)DebugLogPrint_13(UsbHcPtr, v4 + 4) << 32); /*0x16c8f*/
}
// Function: DebugLogPrint_18 @ 0x16c98 (0x53 bytes)
void __fastcall sub_16C98(__int64 a1, __int64 a2, int a3, __int64 a4)
{
int v4; // rdi^4
unsigned int v5; // ebx
v4 = HIDWORD(a4); /*0x16caa*/
v5 = a3 - *(_DWORD *)(a1 + 16); /*0x16cad*/
if ( (unsigned __int64)v5 + 8 <= *(_QWORD *)(a1 + 24) ) /*0x16cbd*/
{
DebugLogPrint_14(a1, v5, a4); /*0x16cc4*/
DebugLogPrint_14(a1, v5 + 4, v4); /*0x16cd6*/
}
}
// Function: XhciInitTrbRing @ 0x16cec (0x76 bytes)
__int64 __fastcall XhciInitTrbRing(__int64 a1, int *buf, unsigned int n64, char a4)
{
unsigned __int64 n4; // r8
__int64 v8; // rcx
unsigned int v9; // eax
*(_DWORD *)(a1 + 8) = n64; /*0x16cfb*/
n4 = 16LL * n64; /*0x16d09*/
*(_QWORD *)a1 = buf; /*0x16d13*/
*(_QWORD *)(a1 + 12) = &buf[n4 / 4 - 4]; /*0x16d16*/
*(_BYTE *)(a1 + 28) = 1; /*0x16d1d*/
*(_QWORD *)(a1 + 20) = buf; /*0x16d21*/
if ( n4 ) /*0x16d28*/
MemZero(buf, 0, n4); /*0x16d2f*/
if ( a4 ) /*0x16d37*/
{
v8 = *(_QWORD *)(a1 + 12); /*0x16d39*/
v9 = *(_DWORD *)(v8 + 12) & 0xFFFF1BFF; /*0x16d40*/
*(_QWORD *)v8 = buf; /*0x16d45*/
*(_DWORD *)(v8 + 12) = v9 | 0x1802; /*0x16d4d*/
}
return 0; /*0x16d5c*/
}
// Function: XhciCheckEndpointAddress @ 0x16d64 (0x75 bytes)
char __fastcall XhciCheckEndpointAddress(__int64 a1, unsigned __int8 k)
{
unsigned __int8 v2; // al
unsigned int k_1; // r8d
unsigned __int8 v6; // r8
unsigned __int8 v7; // dl
__int64 v8; // r9
unsigned __int8 v9; // al
unsigned int k_2; // ecx
v2 = *(_BYTE *)(a1 + 81); /*0x16d64*/
if ( v2 ) /*0x16d6c*/
{
k_1 = (unsigned __int8)*(_DWORD *)(a1 + 80); /*0x16d72*/
if ( k >= k_1 && k < k_1 + v2 ) /*0x16d88*/
return 1; /*0x16d8c*/
}
v6 = *(_BYTE *)(a1 + 488); /*0x16d8d*/
if ( v6 ) /*0x16d97*/
{
v7 = 0; /*0x16d99*/
v8 = *(_QWORD *)(a1 + 88); /*0x16da0*/
while ( 1 ) /*0x16dab*/
{
v9 = *(_BYTE *)(v8 + 12LL * v7 + 9); /*0x16dab*/
if ( v9 ) /*0x16db2*/
{
k_2 = (unsigned __int8)*(_DWORD *)(v8 + 12LL * v7 + 8); /*0x16db9*/
if ( k >= k_2 && k < k_2 + v9 ) /*0x16dcd*/
break; /*0x16dcd*/
}
if ( ++v7 >= v6 ) /*0x16dd4*/
return 0; /*0x16dd4*/
}
return 1; /*0x16dcd*/
}
return 0; /*0x16d8c*/
}
// Function: UsbFindDeviceByPointer @ 0x16ddc (0x53 bytes)
__int64 __fastcall UsbFindDeviceByPointer(__int64 a1, __int64 n24)
{
unsigned __int8 v3; // dl
__int64 v4; // r8
if ( !a1 ) /*0x16de2*/
return 0; /*0x16e24*/
v3 = 1; /*0x16deb*/
while ( 1 ) /*0x16df7*/
{
v4 = UsbRtDispatchTable + 448LL * v3; /*0x16df7*/
if ( (*(_BYTE *)(v4 + 3056) & 3) == 3 && *(_QWORD *)(v4 + n24 + 3056) && *(_QWORD *)(v4 + n24 + 3056) == a1 ) /*0x16e1b*/
break; /*0x16e1b*/
if ( ++v3 >= 0x37u ) /*0x16e22*/
return 0; /*0x16e22*/
}
return v4 + 3056; /*0x16e26*/
}
// Function: UsbMsIsrHandler @ 0x16e30 (0x33 bytes)
__int64 (__fastcall *__fastcall UsbMsIsrHandler(__int64 a1))()
{
*(_DWORD *)a1 = 769; /*0x16e37*/
*(_QWORD *)(a1 + 8) = UsbMsInitialize; /*0x16e3d*/
*(_QWORD *)(a1 + 16) = UsbMsEmptyFunc; /*0x16e48*/
*(_QWORD *)(a1 + 24) = UsbHidConfigureDevice; /*0x16e53*/
*(_QWORD *)(a1 + 32) = UsbHidGetReportDesc; /*0x16e5e*/
return UsbHidGetReportDesc; /*0x16e62*/
}
// Function: UsbMsInitialize @ 0x16e64 (0xa4 bytes)
__int64 UsbMsInitialize()
{
__int64 UsbRtDispatchTable; // rcx
UsbRtDispatchTable = UsbRtDispatchTable; /*0x16e68*/
*(_BYTE *)(UsbRtDispatchTable + 30091) = 0; /*0x16e71*/
*(_QWORD *)(UsbRtDispatchTable + 30120) = UsbRtDispatchTable + 29940; /*0x16e7e*/
*(_QWORD *)(UsbRtDispatchTable + 30160) = 0; /*0x16e8c*/
*(_QWORD *)(UsbRtDispatchTable + 30104) = UsbRtDispatchTable + 29956; /*0x16e9a*/
*(_QWORD *)(UsbRtDispatchTable + 30112) = UsbRtDispatchTable + 29956; /*0x16ea1*/
*(_WORD *)(UsbRtDispatchTable + 30094) |= 0x18Au; /*0x16ead*/
*(_BYTE *)(UsbRtDispatchTable + 30085) = 0; /*0x16eb4*/
*(_BYTE *)(UsbRtDispatchTable + 30146) = 64; /*0x16eba*/
dword_1C480 = 0; /*0x16ec1*/
word_1C484 = 0; /*0x16ec7*/
LOBYTE(byte_1C487) = 0; /*0x16ece*/
*(_DWORD *)(UsbRtDispatchTable + 31456) = 0; /*0x16ed4*/
*(_QWORD *)(UsbRtDispatchTable + 30320) = UsbRtDispatchTable + 30304; /*0x16ee1*/
*(_QWORD *)(UsbRtDispatchTable + 30328) = UsbRtDispatchTable + 30304; /*0x16ee8*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USBMSInitialize: Head and Tail are at %x\n", UsbRtDispatchTable + 30304);
return UsbRegisterNotifyFunc((__int64)UsbHidGetReportDescDispatch); /*0x16eff*/
}
// Function: UsbMsEmptyFunc @ 0x16f08 (0x1e bytes)
char __fastcall UsbMsEmptyFunc(__int64 a1, char n3, char a3, char a4)
{
char result; // al
if ( n3 != 3 ) /*0x16f0b*/
return -1; /*0x16f0b*/
result = 1; /*0x16f12*/
if ( *(__int16 *)(a1 + 108) < 0 && (a3 != 1 || (unsigned __int8)(a4 - 1) > 1u) ) /*0x16f21*/
return -1; /*0x16f23*/
return result; /*0x16f25*/
}
// Function: UsbHidConfigureDevice @ 0x16f28 (0x4ed bytes)
__int64 __fastcall UsbHidConfigureDevice(__int64 a1, __int64 DevEntry, __int64 a3, unsigned __int16 a4)
{
__int64 v5; // rbx
_BYTE *v6; // r13
unsigned __int8 *v8; // r14
unsigned __int8 *v10; // rbx
unsigned __int64 v11; // r15
unsigned __int8 n5; // al
unsigned __int8 v13; // dl
unsigned int v14; // ecx
__int64 v15; // r9
char v16; // di
unsigned __int8 *v18; // rbx
char v19; // r15
unsigned __int16 v20; // ax
int v21; // ecx
int v22; // ecx
__int64 v23; // rdx
unsigned __int16 v24; // bx
__int64 UsbRtDispatchTable; // r9
__int64 DevEntry_1; // rax
__int64 v27; // rdx
__int64 n2047; // rdx
__int64 n1047; // rcx
unsigned __int64 n0x37; // rcx
__int64 v31; // rdx
__int64 v32; // rax
__int64 v33; // rax
unsigned __int64 v34; // [rsp+68h] [rbp+38h]
unsigned __int64 v35; // [rsp+68h] [rbp+38h]
unsigned __int64 v36; // [rsp+68h] [rbp+38h]
*(_BYTE *)(DevEntry + 4) = 1; /*0x16f4a*/
v5 = a4; /*0x16f50*/
*(_QWORD *)(DevEntry + 312) = 0; /*0x16f54*/
v6 = (_BYTE *)(DevEntry + 288); /*0x16f5b*/
*(_BYTE *)(DevEntry + 64) = 0; /*0x16f62*/
*(_BYTE *)(DevEntry + 68) = 0; /*0x16f67*/
v8 = 0; /*0x16f74*/
MemGetInfo(DevEntry + 288, 0x18u); /*0x16f84*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USBHIDConfigureDevice... \n"); /*0x16f94*/
*(_BYTE *)(DevEntry + 21) = UsbRegisterNotifyFunc((__int64)UsbHidGetReportDescDispatch); /*0x16fa5*/
v10 = (unsigned __int8 *)(a3 + v5 + *(unsigned __int8 *)(a3 + v5)); /*0x16fb4*/
v11 = a3 + *(unsigned __int16 *)(a3 + 2); /*0x16fb7*/
n5 = v10[1]; /*0x16fba*/
if ( n5 != 4 )
{
do
{
if ( (unsigned __int64)v10 >= v11 || !*v10 ) /*0x16fd5*/
break; /*0x16fd8*/
if ( n5 == 33 )
{
v8 = v10; /*0x16fde*/
}
else if ( n5 == 5 && (v10[3] & 3) == 3 )
{
v13 = v10[2]; /*0x16ff0*/
if ( (v13 & 0x80u) == 0 )
{
if ( !*(_BYTE *)(DevEntry + 68) )
{
*(_BYTE *)(DevEntry + 68) = v13; /*0x17027*/
v15 = *((unsigned __int16 *)v10 + 2); /*0x17032*/
*(_WORD *)(DevEntry + 66) = *((_WORD *)v10 + 2); /*0x17035*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "interrupt out endpoint addr: %x, max packet size: %x\n", v13, v15);
}
}
else if ( !*(_BYTE *)(DevEntry + 64) )
{
*(_BYTE *)(DevEntry + 64) = v13; /*0x16ffd*/
v14 = *((unsigned __int16 *)v10 + 2); /*0x17000*/
*(_WORD *)(DevEntry + 62) = v14; /*0x17004*/
*(_BYTE *)(DevEntry + 320) = v10[6]; /*0x17019*/
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "interrupt in endpoint addr: %x, max packet size: %x\n", v13, v14);
}
}
v10 += *v10; /*0x1704b*/
n5 = v10[1]; /*0x1704e*/
}
while ( n5 != 4 );
v6 = (_BYTE *)(DevEntry + 288); /*0x17059*/
}
v16 = 0; /*0x17060*/
if ( !*(_BYTE *)(DevEntry + 64) ) /*0x17062*/
return 0; /*0x17066*/
if ( *(__int16 *)(DevEntry + 108) < 0 ) /*0x17078*/
{
HIDWORD(v34) = *(unsigned __int8 *)(DevEntry + 19); /*0x17081*/
LODWORD(v34) = 2849; /*0x17088*/
SataDriverEntry(a1, DevEntry, v34, 100, 0); /*0x1709f*/
}
HIDWORD(v35) = *(unsigned __int8 *)(DevEntry + 19); /*0x170ab*/
LODWORD(v35) = 2593; /*0x170b2*/
SataDriverEntry(a1, DevEntry, v35, 100, 0); /*0x170c9*/
if ( *(__int16 *)(DevEntry + 108) < 0 ) /*0x170d2*/
{
v21 = *(unsigned __int8 *)(DevEntry + 73); /*0x171d0*/
*(_WORD *)(DevEntry + 322) = *(_WORD *)(DevEntry + 62); /*0x171d8*/
v22 = v21 - 1; /*0x171df*/
if ( v22 ) /*0x171e2*/
{
if ( v22 == 1 ) /*0x171e7*/
*(_QWORD *)(DevEntry + 312) = 2; /*0x171e9*/
}
else
{
*(_QWORD *)(DevEntry + 312) = 1; /*0x171f6*/
}
}
else
{
if ( !v8 ) /*0x170e8*/
return 0; /*0x170e8*/
if ( *(_WORD *)(v8 + 7) ) /*0x170ee*/
{
v18 = (unsigned __int8 *)UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(v8 + 7) + 31) >> 5); /*0x1710b*/
if ( !v18 ) /*0x17111*/
return 0; /*0x17111*/
WORD2(v36) = *(unsigned __int8 *)(DevEntry + 19); /*0x1711b*/
HIWORD(v36) = *(_WORD *)(v8 + 7); /*0x17124*/
LODWORD(v36) = 570427009; /*0x17128*/
while ( 1 ) /*0x17149*/
{
v19 = SataDriverEntry(a1, DevEntry, v36, 500, (__int64)v18); /*0x17149*/
if ( !v19 ) /*0x1714e*/
break; /*0x1714e*/
if ( (unsigned __int8)++v16 >= 3u ) /*0x17157*/
{
DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Failed to get the report descriptor\n"); /*0x17164*/
goto LABEL_28; /*0x17169*/
}
}
*(_WORD *)(DevEntry + 294) = *(_WORD *)(v8 + 7); /*0x17176*/
UsbHidParseReportDescriptor(DevEntry, v18); /*0x1717d*/
*(_WORD *)(DevEntry + 322) = UsbCalculateEndpointBandwidth(DevEntry); /*0x1718a*/
LABEL_28:
FwVolConfig((unsigned __int64)v18, ((unsigned __int64)*(unsigned __int16 *)(v8 + 7) + 31) >> 5); /*0x171a4*/
if ( v19 == -1 ) /*0x171ad*/
return 0; /*0x171ad*/
}
*v6 |= 1u; /*0x171b5*/
v20 = *(_WORD *)(DevEntry + 62); /*0x171ba*/
if ( *(_WORD *)(DevEntry + 322) < v20 ) /*0x171c5*/
*(_WORD *)(DevEntry + 322) = v20; /*0x171c7*/
}
DebugPrint(
0xFFFFFFFFFFFFFFFFuLL,
"UsbHidDevType: %x, PollingLength: %x, PollInterval: %x\n",
*(_QWORD *)(DevEntry + 312),
*(unsigned __int16 *)(DevEntry + 322),
*(unsigned __int8 *)(DevEntry + 320));
if ( (*(_BYTE *)(DevEntry + 312) & 1) != 0 ) /*0x17232*/
{
*(_QWORD *)(DevEntry + 24) = 0; /*0x1723b*/
v24 = DebugLogPrint_16((_BYTE *)DevEntry); /*0x1724a*/
if ( v24 == 0xFFFF && (v24 = DebugLogPrint_16(0), v24 == 0xFFFF) ) /*0x17261*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x17263*/
DevEntry_1 = 0; /*0x1726a*/
}
else
{
if ( SataConfig(DevEntry + 328, v23, 1) == -1 || SataConfig(DevEntry + 344, v27, 2) == -1 ) /*0x1729d*/
return 0; /*0x1729d*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x172a3*/
*(_QWORD *)(UsbRtDispatchTable + 8LL * v24 + 30168) = DevEntry; /*0x172ad*/
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) == 0 && ((*v6 & 8) != 0 || *(__int16 *)(DevEntry + 108) < 0) ) /*0x172c7*/
{
FwVolDriverEntry_0(n1047, n2047); /*0x172c9*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x172ce*/
}
DevEntry_1 = DevEntry; /*0x172d5*/
}
if ( !DevEntry_1 ) /*0x172db*/
return 0; /*0x1706a*/
}
else
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x172e2*/
}
if ( *(_WORD *)(DevEntry + 6) != 1118 || *(_WORD *)(DevEntry + 8) != 1872 ) /*0x17310*/
goto LABEL_64; /*0x17310*/
if ( *(_BYTE *)(DevEntry + 64) != 0x81 ) /*0x1731a*/
{
n0x37 = 1; /*0x17320*/
v31 = UsbRtDispatchTable + 3504; /*0x17325*/
while ( (*(_BYTE *)v31 & 3) != 3 /*0x17341*/
|| *(_BYTE *)(v31 + 10) != *(_BYTE *)(DevEntry + 10)
|| *(_BYTE *)(v31 + 64) != 0x81 )
{
++n0x37; /*0x17343*/
v31 += 448; /*0x17346*/
if ( n0x37 >= 0x37 ) /*0x17351*/
goto LABEL_64; /*0x17351*/
}
v32 = *(_QWORD *)(v31 + 312); /*0x17355*/
if ( (v32 & 0x8000000000000017uLL) != 0 /*0x1737b*/
&& *(_WORD *)(v31 + 322)
&& *(_BYTE *)(v31 + 320)
&& ((v32 & 2) == 0 || (*(_DWORD *)(UsbRtDispatchTable + 4) & 0x8000) == 0) )
{
(*(void (__fastcall **)(__int64))(200LL * (((*(unsigned __int8 *)(a1 + 1) - 16) >> 4) + 4) /*0x17398*/
+ UsbRtDispatchTable
+ 232))(a1);
UsbRtDispatchTable = UsbRtDispatchTable; /*0x173a0*/
}
LABEL_64:
v33 = *(_QWORD *)(DevEntry + 312); /*0x173a7*/
if ( (v33 & 0x8000000000000017uLL) != 0 /*0x173cd*/
&& *(_WORD *)(DevEntry + 322)
&& *(_BYTE *)(DevEntry + 320)
&& ((v33 & 2) == 0 || (*(_DWORD *)(UsbRtDispatchTable + 4) & 0x8000) == 0) )
{
(*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(a1 + 1) - 16) >> 4) + 4) /*0x173ed*/
+ UsbRtDispatchTable
+ 232))(
a1,
DevEntry);
}
}
return DevEntry; /*0x17407*/
}
// Function: UsbHidGetReportDesc @ 0x17418 (0x144 bytes)
char __fastcall UsbHidGetReportDesc(__int64 a1)
{
__int64 v2; // rcx
unsigned __int16 i; // di
__int64 i_1; // rsi
__int64 v5; // rdx
unsigned __int64 v6; // rcx
v2 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * (*(unsigned __int8 *)(a1 + 11) - 1)); /*0x17452*/
(*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(v2 + 1) - 16) >> 4) + 4) /*0x1746f*/
+ UsbRtDispatchTable
+ 224))(
v2,
a1);
*(_BYTE *)(a1 + 64) = 0; /*0x17479*/
if ( (*(_BYTE *)(a1 + 312) & 1) != 0 ) /*0x17484*/
DebugLogPrint_17((_BYTE *)a1); /*0x17489*/
if ( *(_QWORD *)(a1 + 304) ) /*0x1748e*/
{
for ( i = 0; i < *(unsigned __int8 *)(a1 + 296); *(_QWORD *)(*(_QWORD *)(a1 + 304) + 8 * i_1) = 0 ) /*0x1749e*/
{
i_1 = i; /*0x174ae*/
v5 = *(_QWORD *)(*(_QWORD *)(a1 + 304) + 8LL * i); /*0x174b1*/
v6 = *(_QWORD *)(v5 + 32); /*0x174b5*/
if ( v6 ) /*0x174bc*/
{
FwVolConfig(v6, (2 * (unsigned __int64)*(unsigned __int16 *)(v5 + 30) + 31) >> 5); /*0x174ce*/
*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 304) + 8LL * i) + 32LL) = 0; /*0x174de*/
}
FwVolConfig(*(_QWORD *)(*(_QWORD *)(a1 + 304) + 8LL * i++), 2u); /*0x174f2*/
}
FwVolConfig(*(_QWORD *)(a1 + 304), (unsigned __int16)(8 * *(unsigned __int8 *)(a1 + 296) + 31) >> 5); /*0x1752c*/
*(_QWORD *)(a1 + 304) = 0; /*0x17531*/
*(_WORD *)(a1 + 294) = 0; /*0x17538*/
}
return 0; /*0x17555*/
}
// Function: UsbHidParseReportDescriptor @ 0x17b30 (0x125 bytes)
char __fastcall UsbHidParseReportDescriptor(__int64 DevEntry, unsigned __int8 *a2)
{
unsigned __int8 *v2; // rbx
unsigned __int8 *v3; // rdi
char result; // al
unsigned __int8 v5; // cl
char *src; // rbx
unsigned __int8 dst_1; // dl
__int64 count; // rcx
int buf_1[8]; // [rsp+20h] [rbp-E0h] BYREF
int *buf_2; // [rsp+40h] [rbp-C0h]
__int16 n768; // [rsp+48h] [rbp-B8h]
int buf[388]; // [rsp+50h] [rbp-B0h] BYREF
int n67240192; // [rsp+670h] [rbp+570h]
char count_1; // [rsp+678h] [rbp+578h]
int dst; // [rsp+679h] [rbp+579h] BYREF
__int16 v16; // [rsp+67Dh] [rbp+57Dh]
char v17; // [rsp+67Fh] [rbp+57Fh]
v2 = a2; /*0x17b4e*/
v3 = &a2[*(unsigned __int16 *)(DevEntry + 294)]; /*0x17b51*/
MemZero(buf, 0, 0x600u); /*0x17b64*/
MemZero(buf_1, 0, 0x30u); /*0x17b74*/
count_1 = 0; /*0x17b7b*/
dst = 0; /*0x17b82*/
v16 = 0; /*0x17b88*/
v17 = 0; /*0x17b8f*/
buf_2 = buf; /*0x17b9a*/
result = 0; /*0x17b9f*/
n768 = 768; /*0x17ba4*/
n67240192 = 67240192; /*0x17ba9*/
while ( v2 < v3 ) /*0x17c3c*/
{
v5 = *v2; /*0x17bb8*/
src = (char *)(v2 + 1); /*0x17bbb*/
BYTE1(dst) = v5 >> 4; /*0x17bc5*/
dst_1 = (v5 >> 2) & 3; /*0x17bd3*/
LOBYTE(dst) = dst_1; /*0x17bd6*/
count = *((unsigned __int8 *)&n67240192 + (v5 & 3)); /*0x17bdc*/
count_1 = count; /*0x17be4*/
result = count + (_BYTE)src; /*0x17bed*/
if ( &src[count] > (char *)v3 ) /*0x17bf4*/
break; /*0x17bf4*/
if ( count ) /*0x17bf9*/
{
MemConfig((char *)&dst + 3, src, (unsigned int)count); /*0x17c05*/
dst_1 = dst; /*0x17c0a*/
LOBYTE(count) = count_1; /*0x17c10*/
}
v2 = (unsigned __int8 *)&src[(unsigned __int8)count]; /*0x17c20*/
result = ((char (__fastcall *)())funcs_17C35[dst_1])(); /*0x17c35*/
}
return result; /*0x17c4a*/
}
// Function: UsbCalculateEndpointBandwidth @ 0x17c58 (0xbf bytes)
__int64 __fastcall UsbCalculateEndpointBandwidth(__int64 DevEntry)
{
unsigned __int8 v2; // al
unsigned __int16 v3; // r9
__int64 v4; // r10
__int64 v5; // r11
unsigned __int16 n0x100; // ax
int *buf_1; // rdx
unsigned int v8; // ecx
int buf[128]; // [rsp+20h] [rbp-208h] BYREF
MemZero(buf, 0, 0x200u); /*0x17c7a*/
v2 = *(_BYTE *)(DevEntry + 296); /*0x17c7f*/
v3 = 0; /*0x17c87*/
if ( v2 ) /*0x17c90*/
{
v4 = *(_QWORD *)(DevEntry + 304); /*0x17c92*/
v5 = v2; /*0x17c99*/
do /*0x17cc4*/
{
if ( (**(_BYTE **)v4 & 0x10) != 0 ) /*0x17ca3*/
*((_WORD *)buf + *(unsigned __int8 *)(*(_QWORD *)v4 + 1LL)) += *(_WORD *)(*(_QWORD *)v4 + 4LL) /*0x17cb7*/
* *(unsigned __int8 *)(*(_QWORD *)v4 + 8LL);
v4 += 8; /*0x17cbd*/
--v5; /*0x17cc1*/
}
while ( v5 ); /*0x17cc4*/
}
n0x100 = 0; /*0x17cc6*/
buf_1 = buf; /*0x17cc9*/
do /*0x17cfc*/
{
if ( *(_WORD *)buf_1 ) /*0x17cce*/
{
v8 = ((unsigned int)*(unsigned __int16 *)buf_1 + 7) >> 3; /*0x17cd9*/
if ( n0x100 ) /*0x17cdf*/
LOWORD(v8) = v8 + 1; /*0x17ce1*/
if ( v3 < (unsigned __int16)v8 ) /*0x17ce8*/
v3 = v8; /*0x17ce8*/
}
++n0x100; /*0x17ced*/
buf_1 = (int *)((char *)buf_1 + 2); /*0x17cf0*/
}
while ( n0x100 < 0x100u ); /*0x17cfc*/
return v3; /*0x17d12*/
}
// Function: UsbHidGetReportDescDispatch @ 0x17d18 (0x13b bytes)
char __fastcall UsbHidGetReportDescDispatch(__int64 a1, __int64 a2, _WORD *a3, unsigned __int8 *n44, unsigned __int16 a5)
{
__int16 v7; // si
__int64 *v8; // rax
unsigned __int8 v9; // cl
unsigned __int8 v10; // al
char **v11; // r9
__int64 v12; // r11
char *v13; // rax
char v14; // si
char v15; // dl
unsigned __int16 v16; // dx
__int64 v17; // r10
__int64 v18; // rcx
__int64 v19; // rcx
int v21; // [rsp+20h] [rbp-28h]
v7 = 0; /*0x17d3f*/
if ( qword_1C3D8[0] ) /*0x17d46*/
{
v8 = qword_1C3D8; /*0x17d4f*/
while ( !((unsigned __int8 (__fastcall *)(__int64, unsigned __int8 *, _QWORD))*v8)(a2, n44, a5) ) /*0x17d62*/
{
v8 = &qword_1C3D8[(unsigned __int16)++v7]; /*0x17d6f*/
if ( !*v8 ) /*0x17d73*/
goto LABEL_5; /*0x17d76*/
}
}
else
{
LABEL_5:
v9 = *(_BYTE *)(a2 + 73); /*0x17d78*/
if ( (*(_BYTE *)(a2 + 288) & 1) != 0 ) /*0x17d82*/
{
v10 = *(_BYTE *)(a2 + 296); /*0x17d84*/
if ( v10 ) /*0x17d8c*/
{
v11 = *(char ***)(a2 + 304); /*0x17d8e*/
v12 = v10; /*0x17d95*/
do /*0x17dff*/
{
v13 = *v11; /*0x17d99*/
v14 = **v11; /*0x17d9c*/
if ( (v14 & 0x10) != 0 ) /*0x17da3*/
{
v15 = v13[1]; /*0x17da5*/
if ( !v15 || v15 == *n44 ) /*0x17dae*/
{
if ( *((_WORD *)v13 + 1) == 7 ) /*0x17db8*/
v9 = 1; /*0x17db8*/
if ( *((_WORD *)v13 + 1) == 1 ) /*0x17dc1*/
{
v16 = *((_WORD *)v13 + 15); /*0x17dc3*/
if ( v16 ) /*0x17dca*/
{
a3 = (_WORD *)*((_QWORD *)v13 + 4); /*0x17dd1*/
v17 = v16; /*0x17dd5*/
do /*0x17df6*/
{
if ( *a3 == 48 ) /*0x17dde*/
v9 = ((v14 & 4) == 0) | 2; /*0x17ded*/
++a3; /*0x17def*/
--v17; /*0x17df3*/
}
while ( v17 ); /*0x17df6*/
}
}
}
}
++v11; /*0x17df8*/
--v12; /*0x17dfc*/
}
while ( v12 ); /*0x17dff*/
}
}
v18 = (unsigned int)v9 - 1; /*0x17e04*/
if ( (_DWORD)v18 ) /*0x17e07*/
{
v19 = (unsigned int)(v18 - 1); /*0x17e09*/
if ( (_DWORD)v19 ) /*0x17e0c*/
{
if ( (_DWORD)v19 == 1 ) /*0x17e11*/
UsbPointParseHidReportEx(v19, a2, (__int64)a3, n44); /*0x17e19*/
}
else
{
UsbPointParseHidReport(v19, a2, (__int64)a3, n44); /*0x17e26*/
}
}
else
{
UsbHidProcessReport(v18, a2, (__int64)a3, n44, v21); /*0x17e33*/
}
}
return 0; /*0x17e49*/
}
// Function: UsbHidMatchDeviceTopology @ 0x17f60 (0x1f9 bytes)
char __fastcall UsbHidMatchDeviceTopology(__int64 TmpRcx, __int64 TmpRdx, __int16 a3, char a4, char SkipMatch)
{
__int64 v6; // rbx
__int16 v7; // di
unsigned int v8; // r15d
unsigned __int16 n5; // si
unsigned int v10; // eax
signed __int8 TmpRcx_2; // r8
unsigned __int8 TmpRdx_2; // r13
__int16 n5_1; // bp
unsigned int v14; // r14d
__int64 v15; // rax
bool v16; // zf
char v17; // al
char v19; // al
unsigned __int16 i; // dx
char v21; // al
char v22; // al
char TmpRcx_1; // [rsp+60h] [rbp+8h]
char TmpRdx_1; // [rsp+68h] [rbp+10h]
TmpRdx_1 = TmpRdx; /*0x17f6c*/
TmpRcx_1 = TmpRcx; /*0x17f6f*/
v6 = *(_QWORD *)(UsbRtDispatchTable + 31376); /*0x17f8e*/
if ( v6 ) /*0x17f98*/
{
v7 = *(_WORD *)(v6 + 2); /*0x17f9e*/
if ( v7 ) /*0x17fa5*/
{
while ( 1 ) /*0x17faf*/
{
v8 = *(_DWORD *)(v6 + 8); /*0x17faf*/
n5 = 1; /*0x17fb3*/
v10 = v8; /*0x17fb7*/
do /*0x17fc9*/
{
if ( !v10 ) /*0x17fbc*/
break; /*0x17fbc*/
++n5; /*0x17fbe*/
v10 >>= 4; /*0x17fc2*/
}
while ( n5 < 5u ); /*0x17fc9*/
TmpRcx_2 = TmpRcx; /*0x17fcb*/
TmpRdx_2 = TmpRdx; /*0x17fce*/
n5_1 = 1; /*0x17fd1*/
v14 = 0; /*0x17fd5*/
do /*0x18010*/
{
if ( TmpRcx_2 < 0 ) /*0x17fdb*/
break; /*0x17fdb*/
v14 = TmpRdx_2 | (16 * v14); /*0x17fec*/
v15 = FwVolDriverEntry(16, 0, TmpRcx_2, 0); /*0x17fef*/
if ( !v15 ) /*0x17ffe*/
break; /*0x17ffe*/
TmpRcx_2 = *(_BYTE *)(v15 + 12); /*0x18000*/
++n5_1; /*0x18004*/
TmpRdx_2 = *(_BYTE *)(v15 + 13); /*0x18008*/
}
while ( (unsigned __int16)n5_1 < 5u ); /*0x18010*/
if ( *(_BYTE *)v6 == 1 ) /*0x18015*/
break; /*0x18015*/
if ( v7 != a3 ) /*0x18043*/
goto LABEL_43; /*0x18043*/
if ( !*(_BYTE *)(v6 + 4) ) /*0x1804d*/
goto LABEL_14; /*0x1804d*/
if ( *(_BYTE *)(v6 + 1) == 3 ) /*0x18053*/
{
if ( (v14 & (0xFFFFFFFF >> (4 * (8 - n5)) >> 4)) != v8 ) /*0x18070*/
goto LABEL_43; /*0x18070*/
v16 = TmpRdx_2 == *(_BYTE *)(v6 + 4); /*0x18076*/
LABEL_13:
if ( !v16 ) /*0x18020*/
goto LABEL_43; /*0x18020*/
LABEL_14:
v17 = *(_BYTE *)(v6 + 12); /*0x18026*/
if ( !v17 || v17 == a4 ) /*0x18030*/
return 1; /*0x18030*/
goto LABEL_43; /*0x18030*/
}
if ( n5 == n5_1 ) /*0x1807f*/
{
if ( *(_BYTE *)(v6 + 1) == 2 ) /*0x18089*/
{
v19 = *(_BYTE *)(v6 + 12); /*0x1808b*/
if ( !v19 || v19 == a4 ) /*0x18095*/
return 1; /*0x18039*/
}
for ( i = 0; i < n5; v8 >>= 4 ) /*0x1809f*/
{
if ( i == n5 - 1 ) /*0x180b2*/
{
if ( *(_BYTE *)(v6 + 1) ) /*0x180b4*/
{
if ( *(_BYTE *)(v6 + 1) == 1 && TmpRdx_2 == *(_BYTE *)(v6 + 4) ) /*0x180c5*/
{
if ( v14 != v8 ) /*0x180ca*/
return 1; /*0x180ca*/
v21 = *(_BYTE *)(v6 + 12); /*0x180d0*/
if ( v21 ) /*0x180d5*/
{
if ( SkipMatch == 1 && v21 != a4 ) /*0x180e4*/
return 1; /*0x180e4*/
}
}
}
else if ( v14 == v8 && TmpRdx_2 == *(_BYTE *)(v6 + 4) ) /*0x180f5*/
{
v22 = *(_BYTE *)(v6 + 12); /*0x180f7*/
if ( !v22 || v22 == a4 ) /*0x18105*/
return 1; /*0x18105*/
}
}
else if ( (((unsigned __int8)v8 ^ (unsigned __int8)v14) & 0xF) != 0 ) /*0x18115*/
{
break; /*0x18115*/
}
++i; /*0x18117*/
v14 >>= 4; /*0x1811b*/
}
}
LABEL_43:
v7 = *(_WORD *)(v6 + 18); /*0x18128*/
v6 += 16; /*0x1812c*/
if ( !v7 ) /*0x18133*/
return 0; /*0x18133*/
LOBYTE(TmpRdx) = TmpRdx_1; /*0x18135*/
LOBYTE(TmpRcx) = TmpRcx_1; /*0x18139*/
}
if ( *(_BYTE *)(v6 + 1) == 2 ) /*0x1801b*/
{
v16 = n5 == (unsigned __int16)n5_1; /*0x1801d*/
goto LABEL_13; /*0x1801d*/
}
goto LABEL_14; /*0x1801b*/
}
}
return 0; /*0x18149*/
}
// Function: UsbPointDecodeWheel @ 0x18360 (0x72 bytes)
__int16 __fastcall UsbPointDecodeWheel(unsigned __int8 a1)
{
unsigned __int8 v1; // r8
bool v2; // al
__int16 v3; // ax
v1 = 0; /*0x18370*/
if ( (n44 & 2) != 0 ) /*0x1837e*/
v2 = (n44 & 0x20) == 0; /*0x18393*/
else
v2 = (n44 & 0x20) != 0; /*0x18385*/
if ( v2 ) /*0x18399*/
v1 = byte_1C220[4 * a1 + 1]; /*0x1839b*/
if ( (n44 & 8) != 0 ) /*0x183a3*/
{
v3 = byte_1C220[4 * a1 + 2]; /*0x183a5*/
return v3 << 8; /*0x183af*/
}
if ( (n44 & 0x10) != 0 ) /*0x183b3*/
{
v3 = byte_1C220[4 * a1 + 3]; /*0x183b5*/
return v3 << 8; /*0x183bb*/
}
return v1 + (byte_1C220[4 * a1] << 8); /*0x183af*/
}
// Function: UsbPointProcessAxis @ 0x183e8 (0xdb bytes)
char __fastcall UsbPointProcessAxis(_BYTE *UsbHcPtr, __int64 n2047)
{
__int64 UsbRtDispatchTable; // rcx
unsigned __int64 v3; // rax
char v4; // al
__int64 n44; // rcx
char result; // al
char v7; // bl
UsbRtDispatchTable = UsbRtDispatchTable; /*0x183ee*/
++*(_WORD *)(UsbRtDispatchTable + 30096); /*0x18402*/
if ( *(_WORD *)(UsbRtDispatchTable + 30096) >= *(_WORD *)(UsbRtDispatchTable + 30098) ) /*0x18418*/
{
LOBYTE(n2047) = 6; /*0x1842c*/
v3 = ((unsigned __int64)*(unsigned __int16 *)(UsbRtDispatchTable + 30094) >> 2) & 7; /*0x1842e*/
*(_WORD *)(UsbRtDispatchTable + 30096) = 0; /*0x18434*/
*(_WORD *)(UsbRtDispatchTable + 30098) = (unsigned __int8)byte_1A678[(_QWORD)&_ImageBase + v3]; /*0x18445*/
do /*0x18462*/
{
UsbRtDispatchTable = (unsigned __int8)n2047 - 1; /*0x18452*/
if ( *((_BYTE *)&dword_1C480 + (_QWORD)&_ImageBase + UsbRtDispatchTable) ) /*0x18455*/
break; /*0x1845d*/
LOBYTE(n2047) = n2047 - 1; /*0x1845f*/
}
while ( (_BYTE)n2047 ); /*0x18462*/
if ( (_BYTE)n2047 ) /*0x18466*/
{
n44 = (unsigned __int8)n2047 - 1; /*0x1846e*/
v4 = *((_BYTE *)&dword_1C480 + (_QWORD)&_ImageBase + n44); /*0x18471*/
LOBYTE(n44) = byte_1C487; /*0x18479*/
if ( v4 == (_BYTE)byte_1C487 ) /*0x18481*/
UsbPointDecodeTouch(n44); /*0x18483*/
else
LOBYTE(byte_1C487) = v4; /*0x1848a*/
UsbServiceHcPolling(0, 2u); /*0x18494*/
}
}
result = n44 & 7; /*0x184a4*/
v7 = (*(&loc_416 + 1) >> 4) & 7; /*0x184a6*/
if ( v7 != (n44 & 7) ) /*0x184ab*/
{
n44 = v7 | n44 & 0xF8; /*0x184b2*/
LOBYTE(UsbRtDispatchTable) = n44; /*0x184b0*/
return UsbPointDecodeAxis3(UsbRtDispatchTable, n2047); /*0x184b8*/
}
return result; /*0x184bd*/
}
// Function: UsbPointDecodeAxis3 @ 0x184c4 (0x9e bytes)
// write access to const memory has been detected, the output may be wrong!
char __fastcall UsbPointDecodeAxis3(__int64 n44, __int64 n2047)
{
__int64 n30168; // rbx
__int64 n15; // rdi
char v4; // r8
char v5; // si
char UsbRtDispatchTable; // al
__int64 DevEntry; // rcx
n30168 = 30168; /*0x184da*/
n15 = 15; /*0x184e7*/
v4 = (::n44 & 2) != 0; /*0x184f1*/
if ( (::n44 & 4) != 0 ) /*0x184fd*/
v4 |= 2u; /*0x184fd*/
v5 = v4; /*0x18507*/
if ( (::n44 & 1) != 0 ) /*0x18513*/
v5 = v4 | 4; /*0x18513*/
*(&loc_491 + 6) ^= (::n44 ^ *(&loc_491 + 6)) & 7; /*0x18529*/
do /*0x18550*/
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x18530*/
DevEntry = *(_QWORD *)(n30168 + UsbRtDispatchTable); /*0x18537*/
if ( DevEntry ) /*0x1853e*/
{
LOBYTE(n2047) = v5; /*0x18540*/
UsbRtDispatchTable = EhciCtrlAsync(DevEntry, n2047); /*0x18543*/
}
n30168 += 8; /*0x18548*/
--n15; /*0x1854c*/
}
while ( n15 ); /*0x18550*/
return UsbRtDispatchTable; /*0x1855c*/
}
// Function: UsbPointDecodeTouch @ 0x18564 (0xaa bytes)
// write access to const memory has been detected, the output may be wrong!
__int16 __fastcall UsbPointDecodeTouch(__int64 n44)
{
__int16 n14624; // r8
_QWORD *n14624_1; // rax
bool i; // zf
__int16 v4; // r9
if ( (_BYTE)n44 == 44 ) /*0x1856d*/
{
n14624 = 14624; /*0x1856f*/
LABEL_13:
LOWORD(n14624_1) = *(&loc_480 + 1); /*0x185c2*/
*(_WORD *)((char *)ModuleEntryPoint + *(&loc_418 + 2)) = n14624; /*0x185e3*/
v4 = *(&loc_418 + 2) + 2; /*0x185eb*/
if ( (unsigned __int16)(*(&loc_418 + 2) + 2) >= *(&loc_480 + 1) ) /*0x185f4*/
v4 = loc_480; /*0x185f4*/
if ( v4 != *(&loc_418 + 1) ) /*0x185fd*/
*(&loc_418 + 2) = v4; /*0x185ff*/
return (__int16)n14624_1; /*0x185ff*/
}
n14624_1 = &unk_1C270; /*0x18579*/
for ( i = off_1C278 == 0; ; i = n14624_1[1] == 0 ) /*0x18580*/
{
if ( i ) /*0x18587*/
{
n14624 = 0; /*0x185b8*/
goto LABEL_12; /*0x185b8*/
}
if ( (unsigned __int8)n44 >= *(_BYTE *)n14624_1 && (unsigned __int8)n44 <= *((_BYTE *)n14624_1 + 1) ) /*0x18590*/
break; /*0x18590*/
n14624_1 += 2; /*0x18592*/
}
LOBYTE(n44) = n44 - *(_BYTE *)n14624_1; /*0x1859c*/
LOWORD(n14624_1) = ((__int64 (__fastcall *)(__int64))n14624_1[1])(n44); /*0x1859e*/
if ( (::n44 & 0x10) != 0 ) /*0x185a8*/
LOWORD(n14624_1) = (unsigned __int16)n14624_1 & 0xFF00; /*0x185af*/
n14624 = (__int16)n14624_1; /*0x185b2*/
LABEL_12:
if ( n14624 ) /*0x185c0*/
goto LABEL_13; /*0x185c0*/
return (__int16)n14624_1; /*0x18608*/
}
// Function: UsbPointProcessHidReport @ 0x18610 (0x20f bytes)
// write access to const memory has been detected, the output may be wrong!
void __fastcall UsbPointProcessHidReport(__int64 n44)
{
_BYTE *n44_2; // rsi
int v2; // r11d
int *n2047; // rdx
__int16 v4; // di
__int64 n6; // rbx
_BYTE *n44_1; // rbp
__int64 n6_1; // r10
__int64 n6_2; // r9
char v9; // al
char v10; // di
_BYTE *n44_3; // rdx
__int64 n6_3; // r8
char n44_4; // cl
char v14; // al
unsigned __int8 i; // cl
__int64 UsbRtDispatchTable; // rcx
unsigned __int8 n2; // dl
unsigned __int64 v18; // rax
n44_2 = (_BYTE *)(n44 + 2); /*0x18630*/
v2 = *(_DWORD *)(n44 + 2); /*0x18634*/
n2047 = &dword_1C480; /*0x18637*/
v4 = *(_WORD *)(n44 + 6); /*0x1863e*/
n6 = 6; /*0x18642*/
n44_1 = (_BYTE *)n44; /*0x1864a*/
n6_1 = 6; /*0x18650*/
do /*0x1867e*/
{
if ( *(_BYTE *)n2047 ) /*0x18653*/
{
n44 = (__int64)n44_2; /*0x18658*/
n6_2 = 6; /*0x1865b*/
do /*0x18675*/
{
if ( *(_BYTE *)n44 && *(_BYTE *)n44 == *(_BYTE *)n2047 ) /*0x18669*/
*(_BYTE *)n44 = 0; /*0x1866b*/
++n44; /*0x1866e*/
--n6_2; /*0x18671*/
}
while ( n6_2 ); /*0x18675*/
}
n2047 = (int *)((char *)n2047 + 1); /*0x18677*/
--n6_1; /*0x1867a*/
}
while ( n6_1 ); /*0x1867e*/
LOBYTE(n44) = ::n44; /*0x18680*/
v9 = (*(&loc_416 + 1) >> 4) & 7; /*0x18686*/
word_1C484 = v4; /*0x18688*/
v10 = ::n44 & 7; /*0x18692*/
dword_1C480 = v2; /*0x18696*/
if ( v9 != (::n44 & 7) ) /*0x186a0*/
{
::n44 = v9 | ::n44 & 0xF8; /*0x186a7*/
LOBYTE(n44) = ::n44; /*0x186a5*/
UsbPointDecodeAxis3(n44, (__int64)n2047); /*0x186ad*/
LOBYTE(n44) = ::n44; /*0x186b2*/
v10 = ::n44 & 7; /*0x186bb*/
}
n44_3 = n44_2; /*0x186c5*/
n6_3 = 6; /*0x186c8*/
do /*0x18723*/
{
switch ( *n44_3 ) /*0x186ce*/
{
case '9': /*0x186ce*/
*(&loc_416 + 1) ^= 0x40u; /*0x18702*/
n44_4 = ::n44; /*0x18706*/
v14 = (::n44 ^ ~::n44) & 4; /*0x18712*/
break;
case 'G': /*0x186ce*/
*(&loc_416 + 1) ^= 0x10u; /*0x186ee*/
n44_4 = ::n44; /*0x186f2*/
v14 = (::n44 ^ ~::n44) & 1; /*0x186fe*/
break;
case 'S': /*0x186ce*/
*(&loc_416 + 1) ^= 0x20u; /*0x186da*/
n44_4 = ::n44; /*0x186de*/
v14 = (::n44 ^ ~::n44) & 2; /*0x186ea*/
break;
default:
goto LABEL_19; /*0x186d8*/
}
LOBYTE(n44) = v14 ^ n44_4; /*0x18714*/
::n44 = n44; /*0x18716*/
LABEL_19:
++n44_3; /*0x1871c*/
--n6_3; /*0x1871f*/
}
while ( n6_3 ); /*0x18723*/
::n44 = n44 & 0xF7 | (8 * ((*n44_1 & 0x11) != 0)); /*0x18734*/
::n44 = ::n44 & 0xDF | (32 * ((*n44_1 & 0x22) != 0)); /*0x18748*/
::n44 = ::n44 & 0xEF | (16 * ((*n44_1 & 0x44) != 0)); /*0x1875d*/
if ( (::n44 & 0x18) == 0x18 ) /*0x18767*/
{
n44_3 = (_BYTE *)UsbRtDispatchTable; /*0x18769*/
for ( i = 2; i < 6u; ++i ) /*0x18770*/
{
if ( (n44_1[i] == 76 || n44_1[i] == 99) && (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) == 0 ) /*0x18785*/
{
__outbyte(0xCF9u, 6u); /*0x1881c*/
while ( 1 ) /*0x1881d*/
; /*0x1881d*/
}
}
}
do /*0x187a3*/
{
LOBYTE(n44) = *n44_2; /*0x18791*/
if ( *n44_2 ) /*0x18791*/
UsbPointDecodeTouch(n44); /*0x18797*/
++n44_2; /*0x1879c*/
--n6; /*0x1879f*/
}
while ( n6 ); /*0x187a3*/
if ( v10 != (::n44 & 7) ) /*0x187b0*/
UsbPointDecodeAxis3(n44, (__int64)n44_3); /*0x187b2*/
UsbRtDispatchTable = UsbRtDispatchTable; /*0x187b7*/
n2 = 1; /*0x187c5*/
v18 = ((unsigned __int64)*(unsigned __int16 *)(UsbRtDispatchTable + 30094) >> 6) & 7; /*0x187d2*/
*(_WORD *)(UsbRtDispatchTable + 30096) = 0; /*0x187d5*/
*(_WORD *)(UsbRtDispatchTable + 30098) = (unsigned __int8)byte_1A678[v18]; /*0x187e2*/
if ( (_BYTE)dword_1C480 ) /*0x187f2*/
n2 = 2; /*0x187f4*/
UsbServiceHcPolling(0, n2); /*0x18810*/
}
// Function: UsbPointParseHidReportEx @ 0x18820 (0x34f bytes)
char __fastcall UsbPointParseHidReportEx(__int64 a1, __int64 a2, __int64 a3, _BYTE *n44)
{
__int64 v4; // rdi
_BYTE *n44_1; // r10
char v6; // dl
char v7; // r14
char v8; // r13
unsigned __int8 v9; // r12
__int64 n0xFFFF; // r8
__int64 v11; // rbx
char v12; // al
unsigned __int16 v13; // si
char v14; // dl
char v15; // dl
unsigned __int16 v16; // si
char v17; // r13
char v18; // cl
char v19; // cl
__int16 v20; // cx
__int16 v21; // r8
char v23; // [rsp+30h] [rbp-28h]
__int16 v24; // [rsp+34h] [rbp-24h]
__int16 v25; // [rsp+38h] [rbp-20h]
__int16 v26; // [rsp+40h] [rbp-18h] BYREF
int v27; // [rsp+42h] [rbp-16h] BYREF
char v28; // [rsp+A0h] [rbp+48h]
char v30; // [rsp+B0h] [rbp+58h]
char v32; // [rsp+C0h] [rbp+68h]
v4 = a2; /*0x18846*/
n44_1 = n44; /*0x18849*/
v6 = 0; /*0x1884f*/
v32 = 0; /*0x18852*/
v7 = 0; /*0x18856*/
v28 = 0; /*0x18859*/
v8 = 0; /*0x1885d*/
v23 = 0; /*0x18860*/
v9 = 0; /*0x18864*/
v27 = 0; /*0x18867*/
LOBYTE(v26) = 0; /*0x1886b*/
v30 = 0; /*0x1886e*/
if ( *(_BYTE *)(v4 + 296) ) /*0x18872*/
{
n0xFFFF = 0xFFFF; /*0x1887f*/
do /*0x18afe*/
{
v11 = *(_QWORD *)(*(_QWORD *)(v4 + 304) + 8LL * v9); /*0x18890*/
if ( (*(_BYTE *)v11 & 0x10) != 0 ) /*0x18897*/
{
v12 = *(_BYTE *)(v11 + 1); /*0x1889d*/
if ( !v12 || v12 == *n44_1 ) /*0x188a7*/
{
if ( (*(_BYTE *)v11 & 1) == 0 ) /*0x188b0*/
{
if ( *(_WORD *)(v11 + 2) == 13 && *(_WORD *)(v11 + 30) ) /*0x188c1*/
{
v13 = 0; /*0x188ce*/
do /*0x18947*/
{
if ( *(_WORD *)(*(_QWORD *)(v11 + 32) + 2LL * v13) == 66 ) /*0x188ef*/
{
if ( v8 == 1 ) /*0x188f5*/
break; /*0x188f5*/
v14 = v7 + 8; /*0x18907*/
if ( !*(_BYTE *)(v11 + 1) ) /*0x188f7*/
v14 = v7; /*0x1890e*/
LOBYTE(n0xFFFF) = v14; /*0x1891b*/
UsbHidExtractBits(n44, &v26, n0xFFFF, v14 + *(_BYTE *)(v11 + 4) * *(_BYTE *)(v11 + 8), 0xFFFFu); /*0x18929*/
v8 = 1; /*0x18931*/
v6 = v26 & 3; /*0x18934*/
n0xFFFF = 0xFFFF; /*0x18937*/
LOBYTE(v26) = v26 & 3; /*0x1893d*/
}
++v13; /*0x18940*/
}
while ( v13 < *(_WORD *)(v11 + 30) ); /*0x18947*/
v4 = a2; /*0x18949*/
v9 = v30; /*0x18950*/
n44_1 = n44; /*0x18954*/
v32 = v8; /*0x18958*/
}
if ( *(_WORD *)(v11 + 2) == 9 && *(_WORD *)(v11 + 30) && **(_WORD **)(v11 + 32) == 1 ) /*0x18972*/
{
if ( v8 == 1 ) /*0x18978*/
break; /*0x18978*/
v15 = v7 + 8; /*0x1898e*/
if ( !*(_BYTE *)(v11 + 1) ) /*0x1897e*/
v15 = v7; /*0x18995*/
LOBYTE(n0xFFFF) = v15; /*0x189a2*/
UsbHidExtractBits(n44_1, &v26, n0xFFFF, v15 + *(_BYTE *)(v11 + 4) * *(_BYTE *)(v11 + 8), 0xFFFFu); /*0x189b0*/
v6 = v26; /*0x189b5*/
v8 = 1; /*0x189b8*/
v32 = 1; /*0x189bb*/
}
if ( *(_WORD *)(v11 + 2) == 1 && *(_WORD *)(v11 + 30) ) /*0x189cd*/
{
v16 = 0; /*0x189da*/
v17 = v23; /*0x189ec*/
do /*0x18ac0*/
{
if ( *(_WORD *)(*(_QWORD *)(v11 + 32) + 2LL * v16) == 48 ) /*0x189fe*/
{
if ( v28 == 1 ) /*0x18a04*/
break; /*0x18a04*/
v18 = v7 + v16 * *(_BYTE *)(v11 + 8) + 8; /*0x18a22*/
if ( !*(_BYTE *)(v11 + 1) ) /*0x18a18*/
v18 = v7 + v16 * *(_BYTE *)(v11 + 8); /*0x18a29*/
LOBYTE(n0xFFFF) = v18; /*0x18a3c*/
UsbHidExtractBits(n44, &v27, n0xFFFF, *(_BYTE *)(v11 + 8) + v18, *(_WORD *)(v11 + 16)); /*0x18a42*/
v24 = *(_WORD *)(v11 + 16); /*0x18a4e*/
v28 = 1; /*0x18a52*/
}
if ( *(_WORD *)(*(_QWORD *)(v11 + 32) + 2LL * v16) == 49 ) /*0x18a60*/
{
if ( v17 == 1 ) /*0x18a66*/
break; /*0x18a66*/
v25 = *(_WORD *)(v11 + 16); /*0x18a78*/
v19 = v7 + v16 * *(_BYTE *)(v11 + 8) + 8; /*0x18a90*/
if ( !*(_BYTE *)(v11 + 1) ) /*0x18a86*/
v19 = v7 + v16 * *(_BYTE *)(v11 + 8); /*0x18a93*/
LOBYTE(n0xFFFF) = v19; /*0x18a9d*/
UsbHidExtractBits(n44, (_WORD *)&v27 + 1, n0xFFFF, *(_BYTE *)(v11 + 8) + v19, *(_WORD *)(v11 + 16)); /*0x18aa7*/
v17 = 1; /*0x18aac*/
v23 = 1; /*0x18aaf*/
}
++v16; /*0x18ab3*/
}
while ( v16 < *(_WORD *)(v11 + 30) ); /*0x18ac0*/
v6 = v26; /*0x18ac6*/
v4 = a2; /*0x18acc*/
v9 = v30; /*0x18ad0*/
v8 = v32; /*0x18ad4*/
}
n44_1 = n44; /*0x18ad8*/
n0xFFFF = 0xFFFF; /*0x18adc*/
}
v7 += *(_BYTE *)(v11 + 4) * *(_BYTE *)(v11 + 8); /*0x18aed*/
}
}
v30 = ++v9; /*0x18af3*/
}
while ( v9 < *(_BYTE *)(v4 + 296) ); /*0x18afe*/
v20 = HIWORD(v27); /*0x18b04*/
v21 = v27; /*0x18b08*/
if ( (v6 || v27) && (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x18b27*/
{
*(_WORD *)(v4 + 368) = v24; /*0x18b2d*/
*(_WORD *)(v4 + 370) = v25; /*0x18b38*/
*(_BYTE *)(v4 + 361) = v6; /*0x18b3f*/
*(_WORD *)(v4 + 362) = v21; /*0x18b45*/
*(_WORD *)(v4 + 364) = v20; /*0x18b4d*/
*(_WORD *)(v4 + 366) = 0; /*0x18b54*/
}
}
return 0; /*0x18b5e*/
}
// Function: UsbHidExtractBits @ 0x18b70 (0xd3 bytes)
__int64 __fastcall UsbHidExtractBits(_BYTE *n44, _WORD *a2, __int64 n0xFFFF, char a4, unsigned __int16 n0xFFFFa)
{
unsigned int dst_1; // r11d
char v6; // r10
unsigned __int8 n0xFFFF_1; // bl
int count_1; // r8d
int count; // esi
__int64 n0xFFFFa_1; // rax
char v14; // di
char v15; // bl
unsigned int dst; // [rsp+50h] [rbp+18h] BYREF
dst_1 = 0; /*0x18b82*/
v6 = a4 - n0xFFFF; /*0x18b88*/
dst = 0; /*0x18b8b*/
n0xFFFF_1 = n0xFFFF; /*0x18b93*/
count_1 = (unsigned __int8)(a4 - n0xFFFF) >> 3; /*0x18b9c*/
count = (unsigned __int8)(count_1 + 1); /*0x18bae*/
if ( (v6 & 7) == 0 ) /*0x18bb1*/
count = count_1; /*0x18bb1*/
if ( (unsigned __int8)(count - 1) > 3u ) /*0x18bba*/
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\UsbPoint.c", 238, (__int64)"Size > 0 && Size <= sizeof(TempData)"); /*0x18bcf*/
dst_1 = dst; /*0x18bd4*/
}
n0xFFFFa_1 = (unsigned int)(count - 1); /*0x18bd9*/
if ( (unsigned __int8)(count - 1) <= 3u ) /*0x18bde*/
{
if ( (_BYTE)count ) /*0x18be7*/
{
MemConfig((char *)&dst, &n44[(unsigned __int64)n0xFFFF_1 >> 3], (unsigned __int8)count); /*0x18bf8*/
dst_1 = dst; /*0x18bfd*/
}
v14 = a4 & 7; /*0x18c02*/
v15 = n0xFFFF_1 & 7; /*0x18c06*/
if ( v15 ) /*0x18c09*/
dst_1 >>= v15; /*0x18c0d*/
if ( v14 ) /*0x18c13*/
dst_1 = dst_1 << v14 >> v14; /*0x18c1c*/
n0xFFFFa_1 = n0xFFFFa; /*0x18c1f*/
if ( dst_1 > n0xFFFFa ) /*0x18c27*/
LOWORD(dst_1) = n0xFFFFa & dst_1; /*0x18c29*/
*a2 = dst_1; /*0x18c2c*/
}
return n0xFFFFa_1; /*0x18c3a*/
}
// Function: UsbPointParseHidReport @ 0x18c44 (0x401 bytes)
char __fastcall UsbPointParseHidReport(__int64 a1, __int64 a2, __int64 a3, _BYTE *n44)
{
char v4; // r15
char v5; // di
char v6; // r13
char v7; // r12
unsigned __int8 v8; // r14
__int64 v10; // rsi
unsigned __int8 v11; // r13
__int64 v12; // rdi
char v13; // dl
unsigned __int8 v14; // cl
unsigned __int16 v15; // r15
unsigned __int8 v16; // cl
char v17; // r9
unsigned __int8 v18; // cl
char v19; // r9
unsigned int v20; // ecx
__int64 UsbRtDispatchTable; // r8
char v22; // al
char n0x80; // di
char n0x80_1; // cl
unsigned __int64 v25; // r9
unsigned __int64 v26; // r11
unsigned __int8 v27; // al
char n0x80_2; // r10
__int64 v29; // r8
char v31; // [rsp+30h] [rbp-20h]
char v32; // [rsp+31h] [rbp-1Fh]
_BYTE v33[3]; // [rsp+38h] [rbp-18h] BYREF
char v34; // [rsp+3Bh] [rbp-15h]
__int16 v35; // [rsp+3Ch] [rbp-14h]
__int16 v36; // [rsp+3Eh] [rbp-12h]
__int64 v37; // [rsp+40h] [rbp-10h]
char v38; // [rsp+90h] [rbp+40h]
char v40; // [rsp+A0h] [rbp+50h]
char v41; // [rsp+B0h] [rbp+60h]
v4 = 0; /*0x18c70*/
v5 = 0; /*0x18c73*/
v38 = 0; /*0x18c76*/
v6 = 0; /*0x18c7a*/
v31 = 0; /*0x18c7d*/
v7 = 0; /*0x18c81*/
v32 = 0; /*0x18c84*/
v8 = 0; /*0x18c88*/
v41 = 0; /*0x18c8b*/
v10 = a2; /*0x18c92*/
if ( !*(_BYTE *)(UsbRtDispatchTable + 31458) ) /*0x18c95*/
{
MemGetInfo((__int64)v33, 0xAu); /*0x18cab*/
if ( (*(_BYTE *)(v10 + 288) & 1) != 0 ) /*0x18cc0*/
{
v11 = 0; /*0x18cc6*/
v40 = 0; /*0x18cc9*/
if ( *(_BYTE *)(v10 + 296) ) /*0x18ccd*/
{
do /*0x18e86*/
{
v12 = *(_QWORD *)(*(_QWORD *)(v10 + 304) + 8LL * v11); /*0x18ce5*/
if ( (*(_BYTE *)v12 & 0x10) != 0 ) /*0x18cec*/
{
v13 = *(_BYTE *)(v12 + 1); /*0x18cf2*/
if ( !v13 || v13 == *n44 ) /*0x18cfb*/
{
if ( (*(_BYTE *)v12 & 1) == 0 ) /*0x18d04*/
{
if ( *(_WORD *)(v12 + 2) == 9 && *(_WORD *)(v12 + 30) && **(_WORD **)(v12 + 32) == 1 ) /*0x18d20*/
{
v38 = 1; /*0x18d26*/
v14 = v8 + 8; /*0x18d2a*/
if ( !v13 ) /*0x18d33*/
v14 = v8; /*0x18d33*/
v33[0] = n44[(unsigned __int64)v14 >> 3]; /*0x18d40*/
}
if ( *(_WORD *)(v12 + 2) == 1 && *(_WORD *)(v12 + 30) ) /*0x18d4e*/
{
v15 = 0; /*0x18d5b*/
do /*0x18e55*/
{
if ( *(_WORD *)(*(_QWORD *)(v12 + 32) + 2LL * v15) == 48 ) /*0x18d7d*/
{
v31 = 1; /*0x18d8a*/
v16 = v8 + v15 * *(_BYTE *)(v12 + 8) + 8; /*0x18da0*/
if ( !*(_BYTE *)(v12 + 1) ) /*0x18d96*/
v16 = v8 + v15 * *(_BYTE *)(v12 + 8); /*0x18da3*/
v17 = *(_BYTE *)(v12 + 8) + v16; /*0x18db0*/
LOBYTE(v37) = 48; /*0x18db7*/
UsbMsExtractFieldValue(n44, (__int64)v33, v16, v17, (_DWORD *)v12); /*0x18dbb*/
}
if ( *(_WORD *)(*(_QWORD *)(v12 + 32) + 2LL * v15) == 49 ) /*0x18dca*/
{
v32 = 1; /*0x18dd7*/
v18 = v8 + v15 * *(_BYTE *)(v12 + 8) + 8; /*0x18ded*/
if ( !*(_BYTE *)(v12 + 1) ) /*0x18de3*/
v18 = v8 + v15 * *(_BYTE *)(v12 + 8); /*0x18df0*/
v19 = *(_BYTE *)(v12 + 8) + v18; /*0x18dfd*/
LOBYTE(v37) = 49; /*0x18e04*/
UsbMsExtractFieldValue(n44, (__int64)v33, v18, v19, (_DWORD *)v12); /*0x18e08*/
}
if ( *(_WORD *)(*(_QWORD *)(v12 + 32) + 2LL * v15) == 56 ) /*0x18e17*/
{
v7 = 1; /*0x18e1d*/
v41 = 1; /*0x18e2b*/
v20 = (v8 + v15 * (unsigned int)*(unsigned __int8 *)(v12 + 8)) >> 3; /*0x18e31*/
if ( *(_BYTE *)(v12 + 1) ) /*0x18e34*/
LOBYTE(v20) = v20 + 1; /*0x18e3a*/
v34 = n44[(unsigned __int8)v20]; /*0x18e43*/
}
else
{
v7 = v41; /*0x18e48*/
}
++v15; /*0x18e4c*/
}
while ( v15 < *(_WORD *)(v12 + 30) ); /*0x18e55*/
v10 = a2; /*0x18e5b*/
v11 = v40; /*0x18e62*/
}
}
v8 += *(_BYTE *)(v12 + 4) * *(_BYTE *)(v12 + 8); /*0x18e75*/
}
}
v40 = ++v11; /*0x18e7b*/
}
while ( v11 < *(_BYTE *)(v10 + 296) ); /*0x18e86*/
v4 = v38; /*0x18e8c*/
v5 = v31; /*0x18e90*/
}
UsbRtDispatchTable = UsbRtDispatchTable; /*0x18e94*/
*(_QWORD *)n44 = 0; /*0x18e9b*/
if ( v4 ) /*0x18ea1*/
{
v22 = v33[0]; /*0x18ea3*/
*n44 = v33[0]; /*0x18ea6*/
*(_BYTE *)(UsbRtDispatchTable + 31459) = v22; /*0x18ea8*/
}
else
{
*n44 = *(_BYTE *)(UsbRtDispatchTable + 31459); /*0x18eb8*/
}
if ( v5 == 1 ) /*0x18ebd*/
n44[1] = v33[1]; /*0x18ec2*/
v6 = v32; /*0x18ec5*/
if ( v32 == 1 ) /*0x18ecc*/
n44[2] = v33[2]; /*0x18ed1*/
if ( v7 == 1 ) /*0x18ed7*/
n44[3] = v34; /*0x18edc*/
}
else
{
UsbRtDispatchTable = UsbRtDispatchTable; /*0x18ee5*/
v35 = (char)n44[1]; /*0x18eec*/
v36 = (char)n44[2]; /*0x18ef4*/
}
if ( (*(_BYTE *)(v10 + 288) & 1) == 0 && (*(_WORD *)(v10 + 108) & 0x2000) != 0 ) /*0x18f0a*/
++n44; /*0x18f0c*/
if ( *(__int16 *)(v10 + 108) < 0 || v4 || v5 || v6 || v7 ) /*0x18f28*/
{
if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x18f33*/
{
*(_BYTE *)(UsbRtDispatchTable + 30288) = *n44; /*0x18f37*/
*(_DWORD *)(UsbRtDispatchTable + 30292) += v35; /*0x18f42*/
*(_DWORD *)(UsbRtDispatchTable + 30296) += v36; /*0x18f4d*/
*(_DWORD *)(UsbRtDispatchTable + 30300) += (char)n44[3]; /*0x18f58*/
}
else if ( (*(&loc_40E + 2) & 4) != 0 && qword_1C3B0 ) /*0x18f79*/
{
n0x80 = n44[1]; /*0x18f88*/
n0x80_1 = *n44 & 7 | 8; /*0x18f8c*/
if ( (unsigned __int8)n0x80 >= 0x80u ) /*0x18f96*/
n0x80_1 = *n44 & 7 | 0x18; /*0x18f98*/
if ( (unsigned __int8)-n44[2] >= 0x80u ) /*0x18f9f*/
n0x80_1 |= 0x20u; /*0x18fa1*/
if ( *(_BYTE *)(UsbRtDispatchTable + 30496) || (*(_BYTE *)(UsbRtDispatchTable + 4) & 8) != 0 ) /*0x18fb2*/
{
v25 = *(_QWORD *)(UsbRtDispatchTable + 30320); /*0x18fbc*/
v26 = *(_QWORD *)(UsbRtDispatchTable + 30328); /*0x18fc3*/
v27 = ((*(_BYTE *)(UsbRtDispatchTable + 30336) & 0x10) != 0) + 3; /*0x18fcd*/
if ( v26 == v25 ) /*0x18fd2*/
goto LABEL_68; /*0x18fd2*/
if ( v27 + v25 > UsbRtDispatchTable + 30316 ) /*0x18fe5*/
v25 = UsbRtDispatchTable + 30304; /*0x18fe7*/
if ( v25 > v26 || v27 + v25 < v26 ) /*0x18ffa*/
{
LABEL_68:
UsbPointOutputData(n0x80_1); /*0x18ffc*/
UsbPointOutputData(n0x80); /*0x19004*/
UsbPointOutputData(n0x80_2); /*0x1900c*/
if ( (*(_BYTE *)(v29 + 30336) & 0x10) != 0 ) /*0x19019*/
UsbPointOutputData(0); /*0x1901d*/
}
UsbServiceHcPolling(0, 2u); /*0x19026*/
}
}
}
}
return 0; /*0x19035*/
}
// Function: UsbMsExtractFieldValue @ 0x19048 (0x145 bytes)
char __fastcall UsbMsExtractFieldValue(_BYTE *n44, __int64 a2, unsigned __int8 a3, char a4, _DWORD *a5)
{
_DWORD *v5; // rbx
unsigned __int16 dst_1; // r8
__int16 v11; // r15
unsigned __int8 count; // r14
char n48; // al
char v14; // si
char v15; // bp
unsigned __int16 dst; // [rsp+60h] [rbp+18h] BYREF
v5 = a5; /*0x19064*/
dst = 0; /*0x1906f*/
dst_1 = 0; /*0x1907d*/
if ( !*(_QWORD *)(a5 + 5) ) /*0x19081*/
{
a5[5] = a5[4]; /*0x19090*/
v5[6] = v5[3]; /*0x19096*/
}
v11 = (unsigned __int16)(-1 >> (a4 - a3)) << (a4 - a3); /*0x190b1*/
count = ((unsigned __int8)(a4 - a3) >> 3) + 1; /*0x190bf*/
if ( ((a4 - a3) & 7) == 0 ) /*0x190c3*/
count = (unsigned __int8)(a4 - a3) >> 3; /*0x190c3*/
if ( (unsigned __int8)(count - 1) > 1u ) /*0x190d0*/
{
Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\UsbMs.c", 380, (__int64)"Size > 0 && Size <= sizeof(TempData)"); /*0x190e5*/
dst_1 = dst; /*0x190ea*/
}
n48 = count - 1; /*0x190f6*/
if ( (unsigned __int8)(count - 1) <= 1u ) /*0x190fc*/
{
if ( count ) /*0x19105*/
{
MemConfig((char *)&dst, &n44[(unsigned __int64)a3 >> 3], count); /*0x1911a*/
dst_1 = dst; /*0x1911f*/
}
v14 = a4 & 7; /*0x19125*/
v15 = a3 & 7; /*0x19129*/
if ( v15 ) /*0x1912d*/
dst_1 >>= v15; /*0x19132*/
if ( v14 ) /*0x19139*/
dst_1 = (unsigned __int16)(dst_1 << v14) >> v14; /*0x19142*/
if ( (unsigned int)dst_1 > v5[4] ) /*0x1914d*/
dst_1 |= v11; /*0x1914f*/
n48 = *(_BYTE *)(a2 + 8); /*0x19153*/
if ( n48 == 48 ) /*0x19158*/
{
*(_WORD *)(a2 + 4) = dst_1; /*0x1915a*/
*(_BYTE *)(a2 + 1) = dst_1; /*0x1915f*/
}
if ( n48 == 49 ) /*0x19165*/
{
*(_WORD *)(a2 + 6) = dst_1; /*0x19167*/
*(_BYTE *)(a2 + 2) = dst_1; /*0x1916c*/
}
}
return n48; /*0x1917f*/
}
// Function: Assert_0 @ 0x19190 (0x42 bytes)
__int64 __fastcall Assert_0(__int64 a1, unsigned __int64 i)
{
char i_1; // di
i_1 = i; /*0x1919a*/
if ( i >= 0x40 ) /*0x191a4*/
Assert((UINTN)"e:\\hs\\MdePkg\\Library\\BaseLib\\LShiftU64.c", 39, (__int64)"Count < 64"); /*0x191b9*/
return a1 << i_1; /*0x191cc*/
}
// Function: IoRead32 @ 0x19214 (0x30 bytes)
UINT32 __cdecl IoRead32(UINTN Port)
{
unsigned __int16 Port_1; // bx
Port_1 = Port; /*0x1921a*/
if ( (Port & 3) != 0 ) /*0x19220*/
Assert((UINTN)"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", 193, (__int64)"(Port & 3) == 0"); /*0x19235*/
return __indword(Port_1); /*0x1923e*/
}
// Function: IoWrite8 @ 0x19244 (0x34 bytes)
UINT8 __cdecl IoWrite8(UINTN Port, UINT8 Value)
{
if ( (Port & 1) != 0 ) /*0x19250*/
Assert((__int64)"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", 183, (__int64)"(Address & 1) == 0"); /*0x19265*/
*(_WORD *)Port = 1280; /*0x1926f*/
return 0; /*0x19272*/
}
// Function: IoWrite16 @ 0x19278 (0x7f bytes)
UINT16 __cdecl IoWrite16(UINTN Port, UINT16 Value)
{
UINT16 result; // ax
unsigned __int64 n0x10; // rbx
__int64 v4; // rax
__int64 v5; // rcx
result = qword_1C408; /*0x19282*/
if ( !qword_1C408 ) /*0x1928e*/
{
n0x10 = (*(__int64 (__fastcall **)(__int64, UINT16))(BootServices + 24))(31, Value); /*0x192a7*/
(*(void (__fastcall **)(unsigned __int64))(BootServices + 32))(n0x10); /*0x192aa*/
if ( n0x10 <= 0x10 ) /*0x192b1*/
{
v4 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_1C080, 0, &qword_1C408); /*0x192ce*/
v5 = qword_1C408; /*0x192d4*/
if ( v4 < 0 ) /*0x192de*/
v5 = 0; /*0x192de*/
qword_1C408 = v5; /*0x192e2*/
return v5; /*0x192e9*/
}
else
{
return 0; /*0x192b3*/
}
}
return result; /*0x192f1*/
}
// Function: DebugPrint @ 0x192f8 (0x47 bytes)
void DebugPrint(UINTN ErrorLevel, const CHAR8 *Format, ...)
{
__int64 v3; // rax
void (__fastcall **v4)(UINTN, const CHAR8 *, __int64 *); // r10
va_list va; // [rsp+40h] [rbp+18h] BYREF
va_start(va, Format);
LOWORD(v3) = IoWrite16(ErrorLevel, (UINT16)Format); /*0x1930f*/
if ( v3 ) /*0x1931a*/
{
if ( ((unsigned int)PciExpressWrite() & (unsigned int)ErrorLevel) != 0 ) /*0x19327*/
(*v4)(ErrorLevel, Format, (__int64 *)va); /*0x19336*/
}
}
// Function: Assert @ 0x19340 (0x3e bytes)
__int16 __fastcall Assert(UINTN Port, __int64 Value, __int64 a3)
{
__int64 v6; // rax
LOWORD(v6) = IoWrite16(Port, Value); /*0x19358*/
if ( v6 ) /*0x19360*/
LOWORD(v6) = (*(__int64 (__fastcall **)(UINTN, __int64, __int64))(v6 + 8))(Port, Value, a3); /*0x1936b*/
return v6; /*0x19378*/
}
// Function: MemGetInfo @ 0x19380 (0x63 bytes)
void __fastcall sub_19380(__int64 a1, unsigned __int64 a2)
{
if ( !a1 ) /*0x19393*/
Assert( /*0x193a6*/
(UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
53,
(__int64)"Buffer != ((void *) 0)");
if ( a2 > -a1 ) /*0x193b4*/
Assert( /*0x193c9*/
(UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
54,
(__int64)"Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)");
JUMPOUT(0x2C0); /*0x2c0*/
}
// Function: SetMem @ 0x193e4 (0x50 bytes)
void *__cdecl SetMem(void *Buffer, UINTN Length, UINT8 Value)
{
if ( Length - 1 > -1 - (__int64)Buffer ) /*0x19402*/
Assert( /*0x19417*/
(UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMemWrapper.c",
54,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)");
JUMPOUT(0x2E0); /*0x2e0*/
}
// Function: MemConfig @ 0x19434 (0x9e bytes)
char *__fastcall MemConfig(char *dst, char *src, unsigned __int64 count)
{
unsigned __int64 v3; // rbp
v3 = count - 1; /*0x19451*/
if ( count - 1 > -1 - (__int64)dst ) /*0x19467*/
Assert( /*0x1947a*/
(UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
56,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
if ( v3 > -1 - (__int64)src ) /*0x19485*/
Assert( /*0x1949a*/
(UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
57,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
if ( dst == src ) /*0x194a2*/
return dst; /*0x194a4*/
else
return MemMove(dst, src, count); /*0x194b2*/
}
// Function: HobLibGetHobList @ 0x194d4 (0xd6 bytes)
__int64 __fastcall HobLibGetHobList(__int64 ImageHandle)
{
__int64 result; // rax
__int64 SystemTable; // rdi
unsigned __int64 v3; // rbx
__int64 v4; // rsi
result = qword_1C410; /*0x194e3*/
if ( !qword_1C410 ) /*0x194ed*/
{
SystemTable = SystemTable_0; /*0x194f3*/
v3 = 0; /*0x194fa*/
qword_1C410 = 0; /*0x194fc*/
if ( *(_QWORD *)(SystemTable_0 + 104) ) /*0x19503*/
{
v4 = 0; /*0x19509*/
while ( !UnalignedRead32(ImageHandle, v4 + *(_QWORD *)(SystemTable + 112)) ) /*0x19519*/
{
++v3; /*0x1951b*/
v4 += 24; /*0x1951e*/
if ( v3 >= *(_QWORD *)(SystemTable + 104) ) /*0x19526*/
goto LABEL_6; /*0x19526*/
}
result = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * v3 + 16); /*0x1959c*/
qword_1C410 = result; /*0x195a1*/
}
else
{
LABEL_6:
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x19528*/
Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x19556*/
result = qword_1C410; /*0x1955b*/
}
if ( !result ) /*0x19565*/
{
Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x19578*/
return qword_1C410; /*0x1957d*/
}
}
return result; /*0x1958e*/
}
// Function: PciExpressRead @ 0x195ac (0x3a bytes)
__int64 __fastcall PciExpressRead(__int64 n1024064)
{
if ( (n1024064 & 0xFFFFFFFFF0000000uLL) != 0 ) /*0x195bc*/
Assert( /*0x195d1*/
(UINTN)"e:\\hs\\MdePkg\\Library\\SmmPciExpressLib\\PciExpressLib.c",
118,
(__int64)"((Address) & ~0xfffffff) == 0");
return n1024064 + gXhciBase; /*0x195e0*/
}
// Function: PciExpressWrite @ 0x195e8 (0x4e bytes)
__int64 PciExpressWrite()
{
unsigned __int8 v0; // al
char n3_1; // al
char n3; // cl
__int64 result; // rax
v0 = __inbyte(0x70u); /*0x195ed*/
__outbyte(0x70u, v0 & 0x80 | 0x4B); /*0x195f2*/
n3_1 = __inbyte(0x71u); /*0x195f8*/
n3 = n3_1; /*0x195f9*/
if ( (unsigned __int8)n3_1 > 3u ) /*0x19600*/
{
n3 = n3; /*0x19602*/
if ( !n3 ) /*0x1960a*/
n3 = MEMORY[0xFDAF0490] & 2 | 1; /*0x19616*/
}
if ( (unsigned __int8)(n3 - 1) > 0xFDu ) /*0x19620*/
return 0; /*0x19633*/
result = 2147483718LL; /*0x19625*/
if ( n3 == 1 ) /*0x1962f*/
return 2147483652LL; /*0x1962f*/
return result; /*0x19632*/
}
// Function: PcdGet32 @ 0x19638 (0x8c bytes)
__int64 PcdGet32()
{
__int64 result; // rax
__int64 v1; // rax
result = qword_1C430; /*0x1963c*/
if ( !qword_1C430 ) /*0x19646*/
{
v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_1C090, 0, &qword_1C430); /*0x1965f*/
if ( v1 < 0 ) /*0x19668*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); /*0x19679*/
Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 78, (__int64)"!EFI_ERROR (Status)"); /*0x19691*/
}
result = qword_1C430; /*0x19696*/
if ( !qword_1C430 ) /*0x196a0*/
{
Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 79, (__int64)"mPcd != ((void *) 0)"); /*0x196b3*/
return qword_1C430; /*0x196b8*/
}
}
return result; /*0x196bf*/
}
// Function: Assert_1 @ 0x196c4 (0x2f bytes)
__int64 __fastcall sub_196C4(__int64 a1)
{
if ( !a1 ) /*0x196d0*/
Assert((UINTN)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0x196e5*/
return *(_QWORD *)a1; /*0x196ed*/
}
// Function: UnalignedRead32 @ 0x196f4 (0x6e bytes)
bool __fastcall UnalignedRead32(__int64 ImageHandle, __int64 a2)
{
__int64 v3; // rdi
__int64 v4; // rbx
__int64 v5; // rbp
__int64 v6; // rax
v3 = Assert_1((__int64)&unk_1C0B0); /*0x1971a*/
v4 = Assert_1(a2); /*0x19729*/
v5 = Assert_1((__int64)&unk_1C0B8); /*0x19735*/
v6 = Assert_1(a2 + 8); /*0x19738*/
return v3 == v4 && v5 == v6; /*0x1975c*/
}
// Function: MemZero @ 0x197c0 (0x5d bytes)
int *__fastcall MemZero(int *buf, int value, unsigned __int64 n4)
{
int *buf_1; // rdi
int value_1; // eax
unsigned __int64 n4_1; // rcx
__int16 value_2; // bx
int v7; // eax
__int64 v8; // rdx
char n4_2; // dl
unsigned __int64 i; // rcx
buf_1 = buf; /*0x197c3*/
value_1 = value; /*0x197c6*/
n4_1 = n4; /*0x197c9*/
BYTE1(value_1) = value; /*0x197da*/
value_2 = value_1; /*0x197dc*/
v7 = value_1 << 16; /*0x197df*/
LOWORD(v7) = value_2; /*0x197e3*/
if ( n4 >= 4 ) /*0x197ea*/
{
v8 = (unsigned __int8)buf_1 & 3; /*0x197ef*/
if ( ((unsigned __int8)buf_1 & 3) != 0 ) /*0x197f3*/
{
memset(buf_1, value_2, 4 - v8); /*0x19802*/
buf_1 = (int *)((char *)buf_1 + 4 - v8); /*0x19802*/
n4_1 = n4 - (4 - v8); /*0x19804*/
}
n4_2 = n4_1; /*0x19807*/
for ( i = n4_1 >> 2; i; --i ) /*0x1980a*/
*buf_1++ = v7; /*0x1980e*/
n4_1 = n4_2 & 3; /*0x19814*/
}
memset(buf_1, value_2, n4_1); /*0x19817*/
return buf; /*0x1981a*/
}