PopFxRegisterDeviceWorker
__int64 __fastcall PopFxRegisterDeviceWorker(
_POP_FX_PLUGIN *a1,
_UNICODE_STRING *a2,
__int128 *a3,
__int64 a4,
_KNOWN_CONTROLLER_TYPE a5,
__int64 a6,
char a7,
__int64 a8,
__int64 a9){
_KNOWN_CONTROLLER_TYPE v9;
unsigned int v10;
_POP_FX_DEVICE *v12;
_EXCEPTION_DISPOSITION v13;
VOID **PoolWithTag;
unsigned int v15;
unsigned int i;
__int64 v17;
unsigned int v18;
unsigned int v19;
unsigned int v20;
unsigned int v21;
unsigned int v22;
__int64 v23;
__int64 v24;
__int64 v25;
__int64 v26;
__int64 v27;
__int64 v28;
UINT64 v29;
UINT64 v30;
NTSTATUS AcpiDeviceByUniqueId;
POP_FX_PLUGIN *v32;
POP_FX_PLUGIN *v33;
__int64 v34;
NTSTATUS DeviceCommon;
VOID **v37;
_PEP_DEVICE_REGISTER_V2 *v38;
__int128 v39;
__int128 v40;
__int128 v41;
__int128 v42;
__int128 v43;
size_t v44;
__int64 v45;
__int64 v46;
unsigned int v47;
_OWORD *v48;
__int64 v49;
__int64 v50;
unsigned int v51;
__int64 v52;
__int64 v53;
__int64 v54;
__int64 v55;
unsigned __int64 v56;
__int64 v57;
__int64 v58;
__int128 v59;
__int64 *v60;
__int64 v61;
int v62;
int v63;
_DWORD *v64;
unsigned int v65;
__int64 v66;
unsigned int *v67;
__int64 v68;
__int64 v69;
UINT64 v70;
unsigned int v71;
unsigned __int64 v72;
__int64 v73;
__int64 v74;
__int64 v75;
_QWORD *v76;
_QWORD *v77;
__int64 v78;
unsigned int *v79;
unsigned int v80;
_QWORD *v81;
__int64 v82;
unsigned int v83;
__int64 v84;
_QWORD *v85;
__int64 v86;
__int64 v87;
INT64 v88;
INT64 v89;
VOID **Irp;
ULONG_PTR v91;
__int64 v92;
__int64 v93;
__int64 v94;
_DWORD *v95;
_KNOWN_CONTROLLER_TYPE v96;
unsigned int v97;
__int64 v98;
unsigned int v99;
_KNOWN_CONTROLLER_TYPE v100[2];
__int64 v101;
unsigned int *v102;
__int64 v103;
__int64 v104;
POP_FX_DEVICE *OutputFxDevice;
_QWORD *v106;
_QWORD *v107;
_QWORD *v108;
_PEP_DEVICE_REGISTER_V2 *PepDeviceV2;
PVOID P;
__int64 v111;
__int64 v112;
int v113;
int v114;
size_t v115[2];
size_t Size[2];
_DWORD *v117;
__int64 v118;
unsigned __int64 v119;
__int64 v120;
unsigned __int64 v121;
__int64 v122;
__int64 v123;
__int64 v124;
__int64 v125;
v9 = a5;
v10 = 0;
OutputFxDevice = 0i64;
*(_QWORD *)v100 = 0i64;
v12 = 0i64;
if( a5 == InterruptControllerInvalid )
return(unsigned int)-1073741811;
v125 = (unsigned int)a5;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 12i64 * (unsigned int)a5, 1297630800i64);
P = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741670;
v97 = 0;
v15 = 0;
memset(PoolWithTag, 0i64, 12 * a5);
for( i = 0; i < a5; ++i )
{
v17 = a4 + 56i64 * i;
v18 = *(_DWORD *)(v17 + 28);
if( !v18
|| v18 > 1 && (!*(_QWORD *)a3 || !*((_QWORD *)a3 + 1) || !*((_QWORD *)a3 + 2) || *(_DWORD *)(v17 + 24) >= v18) )
{
goto LABEL_28;
}
v19 = v18 + v15;
if( v18 + v15 < v15 )
goto LABEL_28;
v20 = *(_DWORD *)(v17 + 40);
v15 = v19;
if( v20 )
{
if( v20 < a5 )
{
v21 = v20 + v10;
if( v20 + v10 >= v10 )
{
v10 += v20;
v97 = v21;
v22 = 0;
while( 1 )
{
v23 = *(unsigned int *)(*(_QWORD *)(v17 + 48) + 4i64 * v22);
if( (unsigned int)v23 >= a5 )
break;
++v22;
++*((_DWORD *)P + 3 * v23 + 2);
if( v22 >= *(_DWORD *)(v17 + 40) )
goto LABEL_19;
}
}
}
LABEL_28:
v13 = -1073741811;
goto LABEL_32;
}
LABEL_19:
;
}
v103 = 8i64 * (unsigned int)a5;
v24 = 448i64 * (unsigned int)a5;
v101 = 0i64;
v102 = 0i64;
v25 = 24i64 * v15;
v26 = v25 + v24;
v27 = v25 + v24 + 256;
if( a7 <= 0 )
v27 = v25 + v24;
if( a7 <= 0 )
v26 = 0i64;
v123 = v26;
if( v10 )
{
v101 = v27;
v28 = 8i64 * v10;
v102 = (unsigned int *)(v28 + v27);
v27 += v28 + v28;
}
v114 = a5 * PopFxRuntimeLogNumberEntries;
v29 = v27 + 24i64 * (unsigned int)(a5 * PopFxRuntimeLogNumberEntries);
*(_QWORD *)Size = v29;
v112 = 8 * a5 + 16i64;
v111 = v112 + 40i64 * (unsigned int)a5;
v30 = v25 + v111;
*(_QWORD *)v115 = v25 + v111;
AcpiDeviceByUniqueId = PopFxFindAcpiDeviceByUniqueId(a2, (VOID ***)&OutputFxDevice);
if( AcpiDeviceByUniqueId >= 0 )
{
*(_QWORD *)v100 = OutputFxDevice;
_InterlockedOr(OutputFxDevice + 58, 1u);
v34 = *(_QWORD *)v100;
goto LABEL_37;
}
if( AcpiDeviceByUniqueId == -1073741738 )
{
v13 = -1073741661;
LABEL_31:
v12 = (_POP_FX_DEVICE *)OutputFxDevice;
goto LABEL_32;
}
DeviceCommon = PopFxCreateDeviceCommon((const VOID **)a2, v32, v33, 0i64, (__m128 **)v100);
v34 = *(_QWORD *)v100;
v13 = DeviceCommon;
if( !*(_QWORD *)v100 )
goto LABEL_31;
v30 = *(_QWORD *)v115;
LABEL_37:
IoInitializeRemoveLockEx((PIO_REMOVE_LOCK)(v34 + 240), 0x4D584650u, 0, 0, 0x20u);
v37 = ExAllocatePoolWithTag(0x200ui64, v29, 1297630800i64);
if( !v37
|| (PepDeviceV2 = (_PEP_DEVICE_REGISTER_V2 *)ExAllocatePoolWithTag(0x200ui64, v30, 1297630800i64),
(v38 = PepDeviceV2) == 0i64) )
{
v13 = -1073741670;
goto LABEL_84;
}
memset(v37, 0i64, Size[0]);
v39 = *a3;
v40 = a3[1];
*(_DWORD *)(v34 + 828) = a5;
*(_QWORD *)(v34 + 832) = v37;
*(_OWORD *)(v34 + 112) = v39;
v108 = (_QWORD *)(v34 + 832);
v41 = a3[2];
*(_OWORD *)(v34 + 128) = v40;
v42 = a3[3];
*(_OWORD *)(v34 + 144) = v41;
v43 = a3[4];
*(_OWORD *)(v34 + 160) = v42;
*(_OWORD *)(v34 + 176) = v43;
*(_QWORD *)(v34 + 192) = a6;
*(_QWORD *)(v34 + 600) = 0i64;
v34 = *(_QWORD *)v100;
v44 = v115[0];
v113 = _InterlockedCompareExchange((_DWORD *)&stru_140C23628 + 1058, 0, 0);
*(_DWORD *)(*(_QWORD *)v100 + 616i64) = v113;
*(_DWORD *)(v34 + 612) = 5;
memset(v38, 0i64, v44);
v45 = (__int64)&v37[(unsigned __int64)v24 / 8];
v46 = (__int64)v37 + v103;
v47 = v97;
v48 = (_OWORD *)v46;
v107 = (_QWORD *)v45;
v49 = (__int64)v38 + v112;
*(_QWORD *)v38 = a8;
v50 = 0i64;
v124 = v49;
v103 = v49;
v51 = 0;
v52 = (__int64)v38 + v111;
v38[2] = a5;
v122 = v46;
v118 = v46;
v106 = (_QWORD *)v52;
LODWORD(v104) = 0;
v53 = v46 + 48;
v54 = (__int64)v102 + (_QWORD)v37;
if( !v97 )
v54 = 0i64;
v111 = v54;
v55 = (__int64)v37 + v101;
v101 = 0i64;
if( !v97 )
v55 = 0i64;
v56 = *(_QWORD *)Size - 440i64;
v117 = (_DWORD *)v55;
v57 = a4 + 32;
v58 = -48i64 - (_QWORD)v37;
v121 = *(_QWORD *)Size - 440i64;
v102 = (unsigned int *)((char *)P + 8);
v112 = -16i64 - (_QWORD)PepDeviceV2;
v98 = a4 + 32;
v120 = -48i64 - (_QWORD)v37;
while( 1 )
{
*(_QWORD *)(v50 + *v108) = v48;
if( v58 + v53 > v56 )
goto LABEL_62;
v59 = *(_OWORD *)(v57 - 32);
*(_DWORD *)(v53 - 32) = v51;
*(_QWORD *)(v53 + 32) = v34;
*v48 = v59;
*(_QWORD *)(v53 - 8) = PopFxComponentWork;
*(_QWORD *)v53 = v48;
*(_QWORD *)(v53 - 24) = 0i64;
KeInitializeEvent(v53 + 56, 0, 1u);
v60 = (__int64 *)v98;
v61 = (__int64)v107;
*(_QWORD *)(v53 + 80) = 0i64;
*(_DWORD *)(v53 + 108) = *(_DWORD *)(v98 - 4);
*(_QWORD *)(v53 + 112) = v61;
v62 = *(_DWORD *)(v98 - 8);
*(_DWORD *)(v53 + 164) = -1;
*(_DWORD *)(v53 + 120) = v62;
*(_DWORD *)(v53 + 168) = v113;
*(_QWORD *)(v53 + 152) = 0i64;
v63 = *(_DWORD *)(v98 + 8);
if( v63 )
{
v64 = v117;
v65 = 0;
*(_QWORD *)(v53 + 128) = v117;
*(_DWORD *)(v53 + 124) = v63;
do
{
v66 = v65++;
*v64 = *(_DWORD *)(*(_QWORD *)(v98 + 16) + 4 * v66);
v64 += 2;
}
while( v65 < *(_DWORD *)(v53 + 124) );
v117 = v64;
}
v67 = v102;
if( *v102 )
{
v68 = v111;
*(_QWORD *)(v53 + 144) = v111;
v111 = v68 + 8i64 * *v67;
}
v69 = v103;
v70 = *(_QWORD *)v115;
*(_QWORD *)((char *)PepDeviceV2 + v101 + 16) = v103;
if( v69 + v112 + 16 > v70 - 40 )
goto LABEL_62;
*(_OWORD *)v69 = *(_OWORD *)(v98 - 32);
*(_QWORD *)(v69 + 16) = *(_QWORD *)(v98 - 16);
*(_DWORD *)(v69 + 28) = *(_DWORD *)(v98 - 4);
*(_QWORD *)(v69 + 32) = v106;
*(_DWORD *)(v69 + 24) = *(_DWORD *)(v98 - 8);
v71 = 0;
v99 = 0;
if( *(_DWORD *)(v53 + 108) )
{
v72 = *(_QWORD *)Size - 24i64;
v73 = -16i64 - (_QWORD)v37;
v119 = *(_QWORD *)Size - 24i64;
v103 = -16i64 - (_QWORD)v37;
while( v61 + v73 + 16 <= v72 )
{
v74 = *v60;
v75 = v71;
v76 = v107;
*((_DWORD *)v107 + 4) = *(_DWORD *)(*v60 + 24 * v75 + 16);
*v76 = *(_QWORD *)(v74 + 24 * v75);
v76[1] = *(_QWORD *)(v74 + 24 * v75 + 8);
v107 = v76 + 3;
if( (unsigned __int64)v106 + v112 + 16 > v70 - 24 )
break;
v77 = v106;
*((_DWORD *)v106 + 4) = *(_DWORD *)(v74 + 24 * v75 + 16);
*v77 = *(_QWORD *)(v74 + 24 * v75);
v78 = *(_QWORD *)(v74 + 24 * v75 + 8);
v72 = v119;
v61 = (__int64)v107;
v77[1] = v78;
v73 = v103;
v106 = v77 + 3;
v71 = v99 + 1;
v99 = v71;
if( v71 >= *(_DWORD *)(v53 + 108) )
{
v67 = v102;
goto LABEL_60;
}
}
goto LABEL_62;
}
LABEL_60:
v48 = (_OWORD *)(v118 + 440);
v51 = v104 + 1;
v50 = v101 + 8;
v118 += 440i64;
LODWORD(v104) = v51;
v57 = (__int64)(v60 + 7);
v103 = v69 + 40;
v79 = v67 + 3;
v101 += 8i64;
v53 += 440i64;
v98 = v57;
v102 = v79;
if( v51 >= a5 )
break;
v58 = v120;
v56 = v121;
}
*(_DWORD *)(v34 + 840) = v114;
*(_QWORD *)(v34 + 848) = (char *)v37 + v27;
if( v47 )
{
v13 = PopFxVerifyDependencies(
(_KNOWN_CONTROLLER_TYPE)P,
(_KNOWN_CONTROLLER_TYPE)v34,
a5,
(_KNOWN_CONTROLLER_TYPE)v79,
v96);
if( v13 < ExceptionContinueExecution )
goto LABEL_83;
}
v80 = 0;
v81 = v108;
v82 = 0i64;
do
{
v83 = 0;
v84 = *(_QWORD *)(v82 + *v81);
if( *(_DWORD *)(v84 + 172) )
{
v85 = v108;
do
{
v86 = *(_QWORD *)(*v85 + 8i64 * *(unsigned int *)(*(_QWORD *)(v84 + 176) + 8i64 * v83));
v87 = *(unsigned int *)(v86 + 188);
*(_DWORD *)(*(_QWORD *)(v86 + 192) + 8 * v87) = v80;
*(_DWORD *)(*(_QWORD *)(v86 + 192) + 8 * v87 + 4) = v83++;
++*(_DWORD *)(v86 + 188);
}
while( v83 < *(_DWORD *)(v84 + 172) );
v9 = a5;
v81 = v108;
}
PopFxActivateComponent((_POP_FX_DEVICE *)v34, (_POP_FX_COMPONENT *)v84, 0i64, 1u);
++v80;
v82 += 8i64;
}
while( v80 < v9 );
v89 = v122;
if( a7 > 0 )
{
LOBYTE(v88) = a7 + 2;
*(_QWORD *)(v34 + 24) = (char *)v37 + v123;
Irp = IoAllocateIrp(v88, 0);
*(_QWORD *)(v34 + 16) = Irp;
if( !Irp )
{
LABEL_62:
v13 = -1073741670;
goto LABEL_83;
}
}
v91 = (unsigned int)PepDeviceV2;
if( !PopFxRegisterDeviceWithPep(a1, a2, (_POP_FX_DEVICE *)v34, PepDeviceV2) )
PopFxBugCheck(0x601u, v34, v91, 0);
PopPlRegisterDevice(v34, v92, v93);
if( v9 )
{
v94 = v125;
v95 = (_DWORD *)(v124 + 28);
do
{
if( (*(_BYTE *)(v95 - 3) & 2) != 0 )
*(_DWORD *)(v89 + 92) |= 2u;
*(_DWORD *)(v89 + 156) = *v95;
PopPlRegisterComponent(v89);
v89 += 440i64;
v95 += 10;
--v94;
}
while( v94 );
v34 = *(_QWORD *)v100;
}
v37 = 0i64;
v13 = ExceptionContinueExecution;
*(_QWORD *)a9 = v34;
v34 = 0i64;
LABEL_83:
ExFreePoolWithTag(PepDeviceV2, 0x4D584650u);
LABEL_84:
v12 = (_POP_FX_DEVICE *)OutputFxDevice;
if( v34 && !OutputFxDevice )
ExFreePoolWithTag((PVOID)v34, 0x4D584650u);
if( v37 )
ExFreePoolWithTag(v37, 0x4D584650u);
LABEL_32:
ExFreePoolWithTag(P, 0x4D584650u);
if( v12 )
PopFxReleaseAcpiRefDevice(v12);
return(unsigned int)v13;
}Referenced by:
PoFxRegisterCoreDevice
PopFxRegisterDevice