PiDevCfgProcessDevice

__int64 __fastcall PiDevCfgProcessDevice(__int64 a1, __int64 a2, char a3){
  _UNICODE_STRING *v5; 
  int v6; 
  bool v7; 
  int v8; 
  int inited; 
  char v10; 
  int v11; 
  bool v12; 
  int v13; 
  int v14; 
  unsigned int v15; 
  const wchar_t *v16; 
  INT64 v17; 
  int v18; 
  int v19; 
  WCHAR *v20; 
  __int64 v21; 
  INT64 v22; 
  INT64 v24; 
  const wchar_t *v25; 
  char v26; 
  int v27; 
  char v28; 
  unsigned __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  __int64 v32; 
  int v33; 
  __int64 a5; 
  UINT64 a6; 
  INT64 a6a; 
  INT64 a6b; 
  INT64 a6c; 
  INT64 a8; 
  INT64 a8a; 
  INT64 a8b; 
  INT64 a10; 
  INT64 a10a; 
  INT64 a11; 
  INT64 a11a; 
  ULONG a7; 
  int v47; 
  int v48; 
  int v49; 
  INT64 v50; 
  INT64 v51; 
  __int64 v52; 
  struct _UNICODE_STRING UnicodeString; 
  WCHAR a9[4]; 
  struct _UNICODE_STRING DestinationString; 
  INT64 result[10]; 
  INT64 v57; 
  int v58; 
  struct _UNICODE_STRING *p_UnicodeString; 
  int v60; 
  int v61; 
  const INT64 *v62; 
  int v63; 
  struct _UNICODE_STRING *p_DestinationString; 
  int v65; 
  int v66; 
  char v67; 
  INT64 v69; 
  v5 = 0i64;
  memset((INT64)result, 0i64);
  *(_QWORD *)&UnicodeString.Length = 0i64;
  v6 = 0;
  v48 = 1;
  v7 = 0;
  UnicodeString.Buffer = 0i64;
  v8 = 0;
  *(_QWORD *)&DestinationString.Length = 0i64;
  DestinationString.Buffer = 0i64;
  v51 = 0i64;
  LODWORD(v69) = 0;
  LODWORD(v50) = 0;
  v67 = 0;
  v47 = 0;
  v52 = 0i64;
  a7 = 0;
  *(_QWORD *)a9 = 0i64;
  LOBYTE(v49) = 0;
  if( !*(_QWORD *)(a1 + 48) )
  {
    inited = -1073741808;
    goto LABEL_51;
  }
  v5 = (_UNICODE_STRING *)(a1 + 40);
  PnpDiagnosticTraceObject(&KMPnPEvt_DeviceConfig_Start, (_UNICODE_STRING *)(a1 + 40));
  inited = PiDevCfgInitDeviceContext(*(const wchar_t **)(a1 + 48), a2, result);
  if( inited >= 0 )
  {
    v10 = result[0];
    if( (a3 & 1) != 0 )
    {
      v10 = LOBYTE(result[0]) | 1;
      LODWORD(result[0]) |= 1u;
    }
    if( !a2 )
      a2 = result[2];
    if( (v10 & 1) != 0 || PnpBootMode )
      goto LABEL_8;
    memset((INT64)&v57, 0i64);
    LODWORD(a6) = 2;
    v58 = 8210;
    v63 = 8210;
    v24 = *(_QWORD *)(a1 + 48);
    v57 = (INT64)&DEVPKEY_Device_PendingConfigurationIds;
    v60 = 6;
    p_UnicodeString = &UnicodeString;
    v62 = &DEVPKEY_Device_RequestConfigurationIds;
    p_DestinationString = &DestinationString;
    v65 = 6;
    inited = PiDevCfgQueryObjectProperties(6i64, v24, 1ui64, a2, (INT64)&v57, a6);
    if( inited >= 0 )
    {
      if( v61 < 0 )
        RtlInitUnicodeString(&UnicodeString, 0i64, 0);
      if( v66 < 0 )
        RtlInitUnicodeString(&DestinationString, 0i64, 0);
      if( UnicodeString.Buffer && !*UnicodeString.Buffer )
      {
        v8 = -1073740656;
        v7 = 1;
        goto LABEL_15;
      }
LABEL_8:
      inited = PiDevCfgFindDeviceDriver((INT64)result, UnicodeString.Buffer, &v51);
      if( inited >= 0 )
      {
        if( DestinationString.Buffer )
        {
          inited = PiDevCfgRequestDriverConfigurations((__int64)result, v51);
        }
        else
        {
          v11 = PiDevCfgConfigureDevice(a1, (__int64)result, v51, (int *)&v69, &v50);
          inited = v11;
          if( v11 >= 0 )
          {
            v6 = v69;
            v67 = 1;
          }
          v12 = ((v11 + 1073740653) & 0xFFFFFFFD) == 0;
          v13 = (unsigned __int8)v49;
          if( !v12 )
            v13 = 1;
          v49 = v13;
        }
      }
LABEL_15:
      if( UnicodeString.Buffer && (v51 || v7) )
      {
        LODWORD(a11) = 0;
        LODWORD(a10) = 0;
        LODWORD(a8) = 0;
        PiDevCfgSetObjectProperty(
          PiPnpRtlCtx,
          result,
          *(WCHAR **)(a1 + 48),
          1ui64,
          a2,
          a6,
          (INT64)&DEVPKEY_Device_PendingConfigurationIds,
          a8,
          0i64,
          a10,
          a11);
      }
      if( DestinationString.Buffer )
        goto LABEL_45;
      if( !UnicodeString.Buffer )
      {
        if( v7 )
          goto LABEL_91;
        if( v51 )
        {
          if( *(int *)(v51 + 412) >= 0 )
          {
LABEL_21:
            if( v67 )
            {
              if( PnpBootMode || (a3 & 2) != 0 )
                v6 |= 0x40000u;
              v14 = *(_DWORD *)(a1 + 704);
              if( (v6 & 0x40) != 0 )
                v15 = v14 & 0xFFFFFFFE;
              else
                v15 = v14 | 1;
              *(_DWORD *)(a1 + 704) = v15;
            }
            v16 = *(const wchar_t **)(a1 + 48);
            a7 = 4;
            if( (int)CmGetDeviceRegProp(PiPnpRtlCtx, v16, a2, 11, (__int64)&v48, (__int64)&v69, (__int64)&a7, 0) < 0
              || v48 != 4
              || a7 != 4 )
            {
              LODWORD(v69) = 0;
            }
            v18 = *(_DWORD *)(a1 + 396) & 0x2000;
            if( inited < 0 )
            {
              if( v18 )
              {
                v33 = *(_DWORD *)(a1 + 404);
                if( v33 == 1 || v33 == 18 )
                  PipSetDevNodeProblem(a1, v33, inited);
              }
            }
            else
            {
              LODWORD(v69) = v69 & 0xFFF7FB9F;
              v6 &= ~0x20u;
              if( v18 )
              {
                v17 = 1i64;
                if( *(_DWORD *)(a1 + 404) == 1
                  || (v29 = *(unsigned int *)(a1 + 404), (unsigned int)v29 <= 0x38)
                  && (v30 = 0x100000010040000i64, _bittest64(&v30, v29)) )
                {
                  PipClearDevNodeProblem(a1, (const WCHAR *)1, 0i64);
                }
              }
              if( ((*(_DWORD *)(a1 + 300) - 770) & 0xFFFFFFEF) == 0 )
              {
                v19 = *(_DWORD *)(a1 + 396);
                if( (v19 & 0x6000) != 0 )
                {
                  if( (v19 & 0x2000) != 0 && *(_DWORD *)(a1 + 404) == 14 && (v50 & 0x70) == 0 )
                  {
                    PipClearDevNodeProblem(a1, (const WCHAR *)v17, 0i64);
                    PipClearDevNodeUserFlags(a1, 4);
                  }
                }
                else if( (v50 & 0x70) == 0 || PnpBootMode )
                {
                  if( (v6 & 0x40) != 0 )
                    PipSetDevNodeProblem(a1, 28, v8);
                }
                else
                {
                  v31 = 0i64;
                  if( (v50 & 0x10) != 0 )
                  {
                    v31 = 128i64;
                    v32 = 128i64;
                    v52 = 128i64;
                  }
                  else
                  {
                    v32 = v52;
                  }
                  if( (v50 & 0x20) != 0 )
                  {
                    v32 = v31 | 0x10;
                    v52 = v31 | 0x10;
                    v31 |= 0x10ui64;
                  }
                  if( (v50 & 0x40) != 0 )
                  {
                    v32 = v31 | 0x200;
                    v52 = v31 | 0x200;
                  }
                  PnpUpdateRebootRequiredReason(*(_QWORD *)(a1 + 48), v17, v32);
                  PipSetDevNodeProblem(a1, 14, -1073741102);
                  PipSetDevNodeUserFlags(a1, 4);
                }
              }
              if( v47 && (v6 & 0x40) != 0 )
              {
                LODWORD(a11) = 0;
                LODWORD(a10) = 4;
                LODWORD(a8a) = 23;
                PiDevCfgSetObjectProperty(
                  PiPnpRtlCtx,
                  result,
                  *(WCHAR **)(a1 + 48),
                  1ui64,
                  a2,
                  a6a,
                  (INT64)&DEVPKEY_Device_InstallError,
                  a8a,
                  (WCHAR *)&v47,
                  a10,
                  a11);
              }
              else if( (result[0] & 1) == 0 )
              {
                LODWORD(a11) = 0;
                LODWORD(a10) = 0;
                LODWORD(a8a) = 0;
                PiDevCfgSetObjectProperty(
                  PiPnpRtlCtx,
                  result,
                  *(WCHAR **)(a1 + 48),
                  1ui64,
                  a2,
                  a6a,
                  (INT64)&DEVPKEY_Device_InstallError,
                  a8a,
                  0i64,
                  a10,
                  a11);
              }
            }
            if( v67 || v6 )
            {
              LODWORD(v69) = v6 | v69;
              PiDevCfgSetDeviceRegProp(4i64, (__int64)result, 11, 4, (__int64)&v69, 4);
              if( v67 )
              {
                LODWORD(a11) = 0;
                LODWORD(a10) = 8;
                v20 = *(WCHAR **)(a1 + 48);
                *(_QWORD *)a9 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
                LODWORD(a8a) = 16;
                PiDevCfgSetObjectProperty(
                  PiPnpRtlCtx,
                  result,
                  v20,
                  1ui64,
                  a2,
                  a6b,
                  (INT64)&DEVPKEY_Device_InstallDate,
                  a8a,
                  a9,
                  a10,
                  a11);
                if( (unsigned int)PnpGetObjectProperty(
                                     PiPnpRtlCtx,
                                     *(_QWORD *)(a1 + 48),
                                     1i64,
                                     a2,
                                     0i64,
                                     (__int64)DEVPKEY_Device_FirstInstallDate,
                                     &v48,
                                     0i64,
                                     0,
                                     &a7,
                                     0) != -1073741789
                  || a7 != 8 )
                {
                  LODWORD(a11a) = 0;
                  LODWORD(a10a) = 8;
                  LODWORD(a8b) = 16;
                  PiDevCfgSetObjectProperty(
                    PiPnpRtlCtx,
                    result,
                    *(WCHAR **)(a1 + 48),
                    1ui64,
                    a2,
                    a6c,
                    (INT64)DEVPKEY_Device_FirstInstallDate,
                    a8b,
                    a9,
                    a10a,
                    a11a);
                }
              }
            }
LABEL_45:
            if( (_BYTE)v49 )
            {
              v21 = *(_QWORD *)(a1 + 48);
              a7 = 8;
              if( (int)PnpGetObjectProperty(
                          PiPnpRtlCtx,
                          v21,
                          1i64,
                          a2,
                          0i64,
                          (__int64)DEVPKEY_Device_RebootRequiredReason,
                          &v48,
                          (unsigned __int64)&v52,
                          8,
                          &a7,
                          0) >= 0
                && v48 == 9
                && a7 == 8 )
              {
                v22 = v52;
              }
              else
              {
                v22 = 0i64;
                v52 = 0i64;
              }
              LODWORD(a5) = inited;
              PiDevCfgLogDeviceConfigured(a1, (INT64)result, v51, (unsigned int)v50, a5, v22, (INT64)a9);
            }
            goto LABEL_49;
          }
          v7 = 1;
          v8 = *(_DWORD *)(v51 + 412);
        }
        else
        {
          if( inited != -1073740656 || (PiDevCfgMode & 2) == 0 )
            goto LABEL_21;
          if( !PnpBootMode || (*(_DWORD *)(a1 + 560) & 0x100) != 0 )
          {
            if( CmIsRootEnumeratedDevice(*(PCWSTR *)(a1 + 48)) )
            {
              v25 = *(const wchar_t **)(a1 + 48);
              a7 = 4;
              if( (int)CmGetDeviceRegProp(PiPnpRtlCtx, v25, a2, 11, (__int64)&v48, (__int64)&v69, (__int64)&a7, 0) >= 0
                && v48 == 4
                && a7 == 4 )
              {
                v26 = v69;
              }
              else
              {
                v26 = 0;
                LODWORD(v69) = 0;
              }
              v7 = (v26 & 0x20) != 0;
            }
            else
            {
              v7 = 1;
            }
          }
          else
          {
            v6 = 32;
          }
          if( CmIsRootEnumeratedDevice(*(PCWSTR *)(a1 + 48)) )
          {
            if( (int)PiDevCfgMigrateRootDevice(a1, (__int64)result, &v69) >= 0 )
            {
              v6 |= v69;
              if( (v69 & 1) != 0 )
              {
                v7 = 0;
                v6 &= ~0x20u;
              }
            }
          }
          v8 = -1073740656;
        }
      }
      if( !v7 )
        goto LABEL_21;
LABEL_91:
      v27 = PiDevCfgConfigureDevice(a1, (__int64)result, 0i64, (int *)&v69, &v50);
      inited = v27;
      if( v27 >= 0 )
      {
        v6 = v69;
        v67 = 1;
        switch( v8 )
        {
          case -1073740656:
            v47 = -536870360;
            break;
          case -1073740655:
            v47 = -536870320;
            break;
          case -1073740654:
            v47 = -536870319;
            break;
          case -1073740653:
            v47 = -536870318;
            break;
          case -1073740652:
            v47 = -536870375;
            break;
        }
      }
      v12 = ((v27 + 1073740653) & 0xFFFFFFFD) == 0;
      v28 = v49;
      if( !v12 )
        v28 = 1;
      LOBYTE(v49) = v28;
      goto LABEL_21;
    }
  }
LABEL_49:
  if( v51 )
    PiDevCfgFreeDriverNode(v51);
LABEL_51:
  RtlFreeAnsiString(&UnicodeString);
  RtlFreeAnsiString(&DestinationString);
  PiDevCfgFreeDeviceContext((INT64)result);
  if( v5 )
    PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DeviceConfig_Stop, v5, (unsigned int)inited);
  return(unsigned int)inited;
}

Referenced by:

PpDevCfgProcessDevice