PiDevCfgCheckDeviceNeedsUpdate

INT64 __fastcall PiDevCfgCheckDeviceNeedsUpdate(INT64 a1, UINT64 *a2){
  UINT64 *v2; 
  unsigned int v4; 
  int DeviceDriver; 
  __int64 v6; 
  const wchar_t *v7; 
  INT64 v8; 
  INT64 v9; 
  WCHAR v10; 
  union _LARGE_INTEGER v11; 
  INT64 v12; 
  INT64 v13; 
  wchar_t *Buffer; 
  __int64 v15; 
  INT64 v16; 
  wchar_t *v17; 
  wchar_t *v18; 
  _QWORD *v19; 
  __int128 **v20; 
  INT64 v21; 
  int v22; 
  INT64 v23; 
  __int64 *v24; 
  __int64 *v25; 
  __int64 *v26; 
  __int64 **v27; 
  __int64 **v28; 
  __int64 v29; 
  __int128 *v30; 
  INT64 v31; 
  __int128 *v32; 
  NTSTATUS v33; 
  INT64 v34; 
  INT64 v35; 
  _QWORD *v36; 
  UINT64 v38; 
  __int64 *v39; 
  INT64 v40; 
  __int64 v41; 
  __int128 v42; 
  int v43; 
  int v44; 
  union _LARGE_INTEGER v45; 
  int v46; 
  struct _UNICODE_STRING DestinationString; 
  struct _UNICODE_STRING UnicodeString; 
  struct _UNICODE_STRING v49; 
  struct _UNICODE_STRING v50; 
  HANDLE Handle; 
  UNICODE_STRING DriverPackageId; 
  UINT64 *v53; 
  INT64 result; 
  int v55; 
  struct _UNICODE_STRING *p_DestinationString; 
  int v57; 
  int v58; 
  const DEVPROPKEY *v59; 
  int v60; 
  union _LARGE_INTEGER *v61; 
  int v62; 
  int v63; 
  const DEVPROPKEY *v64; 
  int v65; 
  struct _UNICODE_STRING *p_UnicodeString; 
  int v67; 
  int v68; 
  const DEVPROPKEY *v69; 
  int v70; 
  struct _UNICODE_STRING *v71; 
  int v72; 
  int v73; 
  v53 = a2;
  v2 = a2;
  *(_DWORD *)a2 = 0;
  v44 = 0;
  *(_QWORD *)&DestinationString.Length = 0i64;
  DestinationString.Buffer = 0i64;
  v46 = 1;
  v45.QuadPart = 0i64;
  v4 = 0;
  *(_QWORD *)&UnicodeString.Length = 0i64;
  UnicodeString.Buffer = 0i64;
  v41 = 0i64;
  *(_QWORD *)&v49.Length = 0i64;
  v49.Buffer = 0i64;
  v42 = 0i64;
  *(_QWORD *)&v50.Length = 0i64;
  v50.Buffer = 0i64;
  Handle = 0i64;
  v40 = 0i64;
  v43 = 0;
  *(_QWORD *)&DriverPackageId.Length = 0i64;
  DriverPackageId.Buffer = 0i64;
  DeviceDriver = PiDevCfgFindDeviceDriver(a1, 0i64, &v40);
  if( (int)(DeviceDriver + 0x80000000) < 0 || DeviceDriver == -1073740656 )
  {
    v6 = *(_QWORD *)(a1 + 16);
    v7 = *(const wchar_t **)(a1 + 8);
    v43 = 4;
    if( (int)CmGetDeviceRegProp(PiPnpRtlCtx, v7, v6, 11, (__int64)&v46, (__int64)&v44, (__int64)&v43, 0) < 0
      || v46 != 4
      || v43 != 4 )
    {
      v44 = 0;
    }
    memset((INT64)&result, 0i64);
    v8 = *(_QWORD *)(a1 + 16);
    result = (INT64)&DEVPKEY_Device_DriverInfPath;
    LODWORD(v38) = 4;
    p_DestinationString = &DestinationString;
    v55 = 18;
    v59 = &DEVPKEY_Device_DriverDate;
    v57 = 6;
    v61 = &v45;
    v64 = &DEVPKEY_Device_DriverVersion;
    p_UnicodeString = &UnicodeString;
    v69 = &DEVPKEY_Device_ExtendedConfigurationIds;
    v71 = &v49;
    v67 = 6;
    v72 = 6;
    v9 = *(_QWORD *)(a1 + 8);
    v60 = 16;
    v62 = 8;
    v65 = 18;
    v70 = 8210;
    DeviceDriver = PiDevCfgQueryObjectProperties(18i64, v9, 1ui64, v8, (INT64)&result, v38);
    if( DeviceDriver >= 0 )
    {
      if( v58 < 0 )
        RtlInitUnicodeString(&DestinationString, 0i64, v10);
      v11 = v45;
      if( v63 < 0 )
        v11.QuadPart = 0i64;
      v45 = v11;
      if( v68 < 0 )
        RtlInitUnicodeString(&UnicodeString, 0i64, v10);
      if( v73 < 0 )
        RtlInitUnicodeString(&v49, 0i64, v10);
      if( !UnicodeString.Buffer || (v39 = &v41, swscanf_s(UnicodeString.Buffer, (PWCHAR)L"%hu.%hu.%hu.%hu") != 4) )
        v41 = 0i64;
      if( !CmIsRootEnumeratedDevice(*(PCWSTR *)(a1 + 8)) )
        goto LABEL_33;
      memset((INT64)&result, 0i64);
      v12 = *(_QWORD *)(a1 + 16);
      v13 = *(_QWORD *)(a1 + 8);
      result = (INT64)DEVPKEY_Device_Owners;
      LODWORD(v39) = 1;
      p_DestinationString = &v50;
      v55 = 8210;
      v57 = 6;
      DeviceDriver = PiDevCfgQueryObjectProperties(1i64, v13, 1ui64, v12, (INT64)&result, (UINT64)v39);
      if( DeviceDriver < 0 )
        goto LABEL_90;
      if( v58 < 0 )
        goto LABEL_33;
      Buffer = v50.Buffer;
      if( !v50.Buffer || v50.Length <= 2u )
        goto LABEL_33;
      if( !*v50.Buffer )
        goto LABEL_31;
      while( 1 )
      {
        DeviceDriver = PnpOpenObjectRegKey(PiPnpRtlCtx, (__int64)Buffer, 9u, 131097, 0, (__int64)&Handle);
        if( DeviceDriver >= 0 )
          break;
        DeviceDriver = 0;
        v15 = -1i64;
        do
          ++v15;
        while( Buffer[v15] );
        Buffer += v15 + 1;
        if( !*Buffer )
          goto LABEL_31;
      }
      ZwClose(Handle);
      if( *Buffer )
      {
LABEL_33:
        v16 = v40;
      }
      else
      {
LABEL_31:
        v16 = v40;
        if( !v40 )
          v4 = PnpBootMode != 0 ? 0x40000 : 2;
      }
      if( (v44 & 0x40) == 0 && (v17 = DestinationString.Buffer) != 0i64 )
      {
        if( v16 && RtlEqualUnicodeString((UNICODE_STRING *)(v16 + 40), &DestinationString, 1u) )
        {
          if( *(_QWORD *)(v16 + 112) != v45.QuadPart || *(_QWORD *)(v16 + 120) != v41 )
            goto LABEL_76;
          v18 = v49.Buffer;
          v19 = (_QWORD *)(v16 + 208);
          if( v49.Buffer )
          {
            if( (_QWORD *)*v19 != v19 )
            {
              v20 = (__int128 **)&v42;
              *((_QWORD *)&v42 + 1) = &v42;
              *(_QWORD *)&v42 = &v42;
              if( !*v49.Buffer )
                goto LABEL_61;
              while( *(_QWORD *)(v16 + 208) != v16 + 208 )
              {
                RtlFreeAnsiString(&DestinationString);
                v22 = PiDevCfgSplitDriverConfigurationId(v18, (PLARGE_INTEGER)&DestinationString, v21);
                v16 = v40;
                if( v22 < 0 )
                  break;
                v23 = v40 + 208;
                v24 = *(__int64 **)(v40 + 208);
                if( v24 == (__int64 *)(v40 + 208) )
                  break;
                do
                {
                  v25 = v24;
                  if( RtlEqualUnicodeString((UNICODE_STRING *)(v24 + 5), &DestinationString, 1u) )
                    break;
                  v24 = (__int64 *)*v24;
                  v25 = 0i64;
                }
                while( v24 != (__int64 *)v23 );
                if( !v25 || v25[14] != v45.QuadPart || v25[15] != v41 )
                  break;
                v26 = (__int64 *)*v25;
                if( *(__int64 **)(*v25 + 8) != v25
                  || (v27 = (__int64 **)v25[1], *v27 != v25)
                  || (*v27 = v26,
                      v26[1] = (__int64)v27,
                      v28 = (__int64 **)*((_QWORD *)&v42 + 1),
                      **((__int128 ***)&v42 + 1) != &v42) )
                {
LABEL_68:
                  __fastfail(3u);
                }
                v25[1] = *((_QWORD *)&v42 + 1);
                *v25 = (__int64)&v42;
                *v28 = v25;
                v29 = -1i64;
                *((_QWORD *)&v42 + 1) = v25;
                do
                  ++v29;
                while( v18[v29] );
                v16 = v40;
                v18 += v29 + 1;
                if( !*v18 )
                {
                  v20 = (__int128 **)v42;
                  goto LABEL_61;
                }
              }
              v20 = (__int128 **)v42;
              if( !*v18 )
              {
LABEL_61:
                if( *(_QWORD *)(v16 + 208) == v16 + 208 )
                  goto LABEL_63;
              }
              v4 |= 0x20u;
LABEL_63:
              while( v20 != (__int128 **)&v42 )
              {
                if( v20[1] != &v42 )
                  goto LABEL_68;
                v30 = *v20;
                if( *((__int128 ***)*v20 + 1) != v20 )
                  goto LABEL_68;
                *(_QWORD *)&v42 = *v20;
                *((_QWORD *)v30 + 1) = &v42;
                v31 = v40 + 208;
                v32 = *(__int128 **)(v40 + 216);
                if( *(_QWORD *)v32 != v40 + 208 )
                  goto LABEL_68;
                *v20 = (__int128 *)v31;
                v20[1] = v32;
                *(_QWORD *)v32 = v20;
                *(_QWORD *)(v31 + 8) = v20;
                v20 = (__int128 **)v42;
                v16 = v40;
              }
              v2 = v53;
              goto LABEL_78;
            }
          }
          else if( (_QWORD *)*v19 == v19 )
          {
            if( !PnpBootMode )
            {
LABEL_89:
              *(_DWORD *)v2 = v4;
              goto LABEL_90;
            }
            v4 |= 0x40000u;
            goto LABEL_78;
          }
LABEL_76:
          v4 |= 0x20u;
          goto LABEL_78;
        }
        if( !PnpBootMode )
          goto LABEL_76;
        if( (PiDevCfgFlags & 2) == 0 )
          goto LABEL_76;
        v4 |= 0x40000u;
        if( v16 )
        {
          v33 = PiDevCfgGetDriverPackageId(v17, &DriverPackageId);
          v16 = v40;
          if( v33 < 0 )
            goto LABEL_76;
        }
      }
      else if( v16 )
      {
        goto LABEL_76;
      }
LABEL_78:
      if( PnpBootMode && v16 && (v4 & 0x20) != 0 )
      {
        DeviceDriver = PiDevCfgQueryDriverConfiguration(v16);
        if( DeviceDriver >= 0 )
        {
          v34 = v40;
          v35 = v40 + 208;
          v36 = *(_QWORD **)(v40 + 208);
          while( v36 != (_QWORD *)v35 )
          {
            DeviceDriver = PiDevCfgQueryDriverConfiguration(v34);
            if( DeviceDriver < 0 )
              break;
            v34 = v40;
            v36 = (_QWORD *)*v36;
            v35 = v40 + 208;
          }
        }
        if( DeviceDriver == -1073740653 )
        {
          DeviceDriver = 0;
          v4 = v4 & 0xFFFBFFDF | 0x40000;
        }
        else if( DeviceDriver < 0 )
        {
          goto LABEL_90;
        }
      }
      goto LABEL_89;
    }
  }
LABEL_90:
  RtlFreeAnsiString(&DestinationString);
  RtlFreeAnsiString(&UnicodeString);
  RtlFreeAnsiString(&v49);
  RtlFreeAnsiString(&DriverPackageId);
  RtlFreeAnsiString(&v50);
  if( v40 )
    PiDevCfgFreeDriverNode(v40);
  return(unsigned int)DeviceDriver;
}

Referenced by:

PiDevCfgInitDeviceCallback
PiDevCfgProcessDeviceCallback
PpDevCfgCheckDeviceNeedsUpdate