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