PpDevCfgProcessDeviceExtensions

INT64 __fastcall PpDevCfgProcessDeviceExtensions(
        _DEVICE_NODE *DeviceNode,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        UINT *a7,
        INT64 a8){
  wchar_t *v9; 
  wchar_t *v10; 
  int v11; 
  int inited; 
  const wchar_t *v13; 
  INT64 v14; 
  INT64 v15; 
  WCHAR v16; 
  INT64 v17; 
  int DriverConfiguration; 
  UINT8 v19; 
  _UNICODE_STRING *p_a9; 
  int v21; 
  __int64 v22; 
  wchar_t *Buffer; 
  unsigned int v24; 
  _UNICODE_STRING *v25; 
  INT64 v26; 
  INT64 v27; 
  WCHAR v28; 
  INT64 v29; 
  INT64 v30; 
  __int64 v31; 
  WCHAR *v32; 
  WCHAR *v33; 
  const wchar_t *v34; 
  __int64 v35; 
  int v36; 
  UINT64 v38; 
  UINT64 v39; 
  INT64 v40; 
  INT64 v41; 
  INT64 v42; 
  INT64 v43; 
  INT64 a10; 
  INT64 a10a; 
  INT64 a11; 
  INT64 a11a; 
  __int64 v48; 
  INT64 v49; 
  __int64 v50; 
  struct _UNICODE_STRING UnicodeString; 
  struct _UNICODE_STRING DestinationString; 
  struct _UNICODE_STRING v53; 
  struct _UNICODE_STRING v54; 
  struct _UNICODE_STRING a9; 
  INT64 v56; 
  __int64 v57; 
  struct _UNICODE_STRING *p_DestinationString; 
  int v59; 
  int v60; 
  __int64 v61; 
  struct _UNICODE_STRING MultiSz; 
  struct _UNICODE_STRING v63; 
  struct _UNICODE_STRING v64; 
  struct _UNICODE_STRING v65; 
  INT64 result[2]; 
  INT64 v67; 
  _UNICODE_STRING *MultiSzAppend[2]; 
  __int128 v69; 
  memset((INT64)result, 0i64);
  LODWORD(v50) = 1;
  *(_OWORD *)MultiSzAppend = 0i64;
  *(_QWORD *)&DestinationString.Length = 0i64;
  v9 = 0i64;
  v69 = 0i64;
  DestinationString.Buffer = 0i64;
  v10 = 0i64;
  v49 = 0i64;
  v11 = 0;
  *(_QWORD *)&a9.Length = 0i64;
  a9.Buffer = 0i64;
  *(_QWORD *)&MultiSz.Length = 0i64;
  MultiSz.Buffer = 0i64;
  *(_QWORD *)&v63.Length = 0i64;
  v63.Buffer = 0i64;
  *(_QWORD *)&v64.Length = 0i64;
  v64.Buffer = 0i64;
  *(_QWORD *)&v65.Length = 0i64;
  v65.Buffer = 0i64;
  *(_QWORD *)&v53.Length = 0i64;
  v53.Buffer = 0i64;
  *(_QWORD *)&v54.Length = 0i64;
  v54.Buffer = 0i64;
  *(_QWORD *)&UnicodeString.Length = 0i64;
  UnicodeString.Buffer = 0i64;
  v48 = 0i64;
  if( !PiDevCfgMode )
  {
    inited = 0;
    goto LABEL_66;
  }
  v13 = (const wchar_t *)*((_QWORD *)DeviceNode + 6);
  if( !v13 )
  {
    inited = -1073741808;
    goto LABEL_66;
  }
  inited = PiDevCfgInitDeviceContext(v13, 0i64, result);
  if( inited < 0 )
    goto LABEL_64;
  v14 = v67;
  v15 = *((_QWORD *)DeviceNode + 6);
  v56 = (INT64)&DEVPKEY_Device_PendingConfigurationIds;
  LODWORD(v38) = 1;
  p_DestinationString = &DestinationString;
  v57 = 8210i64;
  v59 = 0;
  v61 = 0i64;
  v60 = 6;
  inited = PiDevCfgQueryObjectProperties(1i64, v15, 1ui64, v67, (INT64)&v56, v38);
  if( inited < 0 )
    goto LABEL_64;
  if( (int)v61 < 0 )
    RtlInitUnicodeString(&DestinationString, 0i64, v16);
  inited = PiDevCfgFindDeviceDriver((INT64)result, DestinationString.Buffer, &v49);
  if( inited < 0 )
    goto LABEL_64;
  v17 = *(_QWORD *)(v49 + 208);
  if( v17 == v49 + 208 )
    goto LABEL_48;
  do
  {
    DriverConfiguration = PiDevCfgQueryDriverConfiguration(v17);
    inited = DriverConfiguration;
    if( DriverConfiguration == -1073740653 )
    {
      v19 = 1;
      p_a9 = &a9;
    }
    else
    {
      if( DriverConfiguration < 0 )
        goto LABEL_64;
      if( *(_QWORD *)(v17 + 296) )
      {
        *(_DWORD *)(v17 + 184) &= ~1u;
        goto LABEL_27;
      }
      if( *(_QWORD *)(v17 + 312) )
      {
        inited = PiDevCfgAppendMultiSz(&MultiSz, 0i64, (_UNICODE_STRING *)(v17 + 304), 0);
        if( inited < 0 )
          goto LABEL_64;
      }
      if( *(_QWORD *)(v17 + 328) )
      {
        inited = PiDevCfgAppendMultiSz(&v63, 0i64, (_UNICODE_STRING *)(v17 + 320), 0);
        if( inited < 0 )
          goto LABEL_64;
      }
      if( *(_QWORD *)(v17 + 344) )
      {
        inited = PiDevCfgAppendMultiSz(&v64, 0i64, (_UNICODE_STRING *)(v17 + 336), 0);
        if( inited < 0 )
          goto LABEL_64;
      }
      if( *(_QWORD *)(v17 + 360) )
      {
        inited = PiDevCfgAppendMultiSz(&v65, 0i64, (_UNICODE_STRING *)(v17 + 352), 0);
        if( inited < 0 )
          goto LABEL_64;
      }
      v11 |= *(_DWORD *)(v17 + 384);
      inited = PiDevCfgAppendMultiSz(&v53, (_UNICODE_STRING *)(v17 + 40), 0i64, 0);
      if( inited < 0 )
        goto LABEL_64;
      v19 = 0;
      p_a9 = &v54;
    }
    inited = PiDevCfgAppendMultiSz(p_a9, (_UNICODE_STRING *)(v17 + 392), 0i64, v19);
    if( inited < 0 )
      goto LABEL_64;
LABEL_27:
    v21 = v11;
    v17 = *(_QWORD *)v17;
  }
  while( v17 != v49 + 208 );
  v22 = 0i64;
  if( inited < 0 )
    goto LABEL_64;
  Buffer = a9.Buffer;
  if( a9.Buffer )
  {
    LODWORD(a11) = 0;
    LODWORD(a10) = a9.Length;
    LODWORD(v42) = 8210;
    inited = PiDevCfgSetObjectProperty(
               PiPnpRtlCtx,
               result,
               *((WCHAR **)DeviceNode + 6),
               1ui64,
               v14,
               v39,
               (INT64)&DEVPKEY_Device_RequestConfigurationIds,
               v42,
               a9.Buffer,
               a10,
               a11);
    if( inited >= 0 )
      inited = -1073740653;
    goto LABEL_64;
  }
  v24 = 0;
  MultiSzAppend[0] = &MultiSz;
  MultiSzAppend[1] = &v63;
  *(_QWORD *)&v69 = &v64;
  *((_QWORD *)&v69 + 1) = &v65;
  do
  {
    v25 = MultiSzAppend[v22];
    if( v25->Buffer )
    {
      v26 = *((_QWORD *)DeviceNode + 6);
      v27 = *(_QWORD *)((char *)&off_140D2C6C0 + v22 * 8);
      v59 = 0;
      v61 = 0i64;
      v56 = v27;
      p_DestinationString = &UnicodeString;
      LODWORD(v39) = 1;
      v57 = 8210i64;
      v60 = 6;
      inited = PiDevCfgQueryObjectProperties((INT64)Buffer, v26, 1ui64, v14, (INT64)&v56, v39);
      if( inited < 0 )
        goto LABEL_64;
      if( (int)v61 < 0 )
        RtlInitUnicodeString(&UnicodeString, 0i64, v28);
      inited = PiDevCfgAppendMultiSz(&UnicodeString, 0i64, v25, 0);
      if( inited < 0 )
        goto LABEL_64;
      LODWORD(a11) = 0;
      LODWORD(a10) = UnicodeString.Length;
      LODWORD(v42) = 8210;
      inited = PiDevCfgSetObjectProperty(
                 PiPnpRtlCtx,
                 result,
                 *((WCHAR **)DeviceNode + 6),
                 1ui64,
                 v14,
                 v40,
                 *(_QWORD *)((char *)&off_140D2C6C0 + v22 * 8),
                 v42,
                 UnicodeString.Buffer,
                 a10,
                 a11);
      if( inited < 0 )
        goto LABEL_64;
      RtlFreeAnsiString(&UnicodeString);
    }
    ++v24;
    ++v22;
  }
  while( v24 < 4 );
  v29 = v49;
  v11 = v21;
  v30 = v49 + 208;
  v31 = *(_QWORD *)(v49 + 208);
  while( v31 != v30 )
  {
    if( (*(_DWORD *)(v31 + 184) & 1) != 0 )
    {
      inited = PiDevCfgConfigureDeviceDriver((__int64)DeviceNode, (__int64)result, v31, &v48, 0i64);
      if( inited < 0 )
        goto LABEL_64;
      v11 |= v48;
      v29 = v49;
    }
    v31 = *(_QWORD *)v31;
    v30 = v29 + 208;
  }
  v9 = v53.Buffer;
  v10 = v54.Buffer;
LABEL_48:
  if( DestinationString.Buffer )
  {
    LODWORD(a11) = 0;
    LODWORD(a10) = 0;
    LODWORD(v42) = 0;
    PiDevCfgSetObjectProperty(
      PiPnpRtlCtx,
      result,
      *((WCHAR **)DeviceNode + 6),
      1ui64,
      v14,
      v39,
      (INT64)&DEVPKEY_Device_PendingConfigurationIds,
      v42,
      0i64,
      a10,
      a11);
  }
  v32 = (WCHAR *)*((_QWORD *)DeviceNode + 6);
  LODWORD(a11) = 0;
  if( v9 )
  {
    LODWORD(a10) = v53.Length;
    LODWORD(v42) = 8210;
    inited = PiDevCfgSetObjectProperty(
               PiPnpRtlCtx,
               result,
               v32,
               1ui64,
               v14,
               v39,
               (INT64)&DEVPKEY_Device_DriverExtendedInfs,
               v42,
               v9,
               a10,
               a11);
    if( inited < 0 )
      goto LABEL_64;
  }
  else
  {
    LODWORD(a10) = 0;
    LODWORD(v42) = 0;
    PiDevCfgSetObjectProperty(
      PiPnpRtlCtx,
      result,
      v32,
      1ui64,
      v14,
      v39,
      (INT64)&DEVPKEY_Device_DriverExtendedInfs,
      v42,
      0i64,
      a10,
      a11);
  }
  v33 = (WCHAR *)*((_QWORD *)DeviceNode + 6);
  LODWORD(a11a) = 0;
  if( v10 )
  {
    LODWORD(a10a) = v54.Length;
    LODWORD(v43) = 8210;
    inited = PiDevCfgSetObjectProperty(
               PiPnpRtlCtx,
               result,
               v33,
               1ui64,
               v14,
               v41,
               (INT64)&DEVPKEY_Device_ExtendedConfigurationIds,
               v43,
               v10,
               a10a,
               a11a);
    if( inited < 0 )
      goto LABEL_64;
  }
  else
  {
    LODWORD(a10a) = 0;
    LODWORD(v43) = 0;
    PiDevCfgSetObjectProperty(
      PiPnpRtlCtx,
      result,
      v33,
      1ui64,
      v14,
      v41,
      (INT64)&DEVPKEY_Device_ExtendedConfigurationIds,
      v43,
      0i64,
      a10a,
      a11a);
  }
  if( v11 )
  {
    v34 = (const wchar_t *)*((_QWORD *)DeviceNode + 6);
    HIDWORD(v48) = 4;
    if( (int)CmGetDeviceRegProp(PiPnpRtlCtx, v34, v14, 11, (__int64)&v50, (__int64)&v48, (__int64)&v48 + 4, 0) < 0
      || (_DWORD)v50 != 4
      || (v36 = v48, HIDWORD(v48) != 4) )
    {
      v36 = 0;
    }
    LODWORD(v48) = v11 | v36;
    PiDevCfgSetDeviceRegProp(v35, (__int64)result, 11, 4, (__int64)&v48, 4);
  }
LABEL_64:
  if( v49 )
    PiDevCfgFreeDriverNode(v49);
LABEL_66:
  RtlFreeAnsiString(&DestinationString);
  RtlFreeAnsiString(&MultiSz);
  RtlFreeAnsiString(&v63);
  RtlFreeAnsiString(&v64);
  RtlFreeAnsiString(&v65);
  RtlFreeAnsiString(&v53);
  RtlFreeAnsiString(&v54);
  RtlFreeAnsiString(&UnicodeString);
  RtlFreeAnsiString(&a9);
  PiDevCfgFreeDeviceContext((INT64)result);
  return(unsigned int)inited;
}

Referenced by:

No references.