PiDevCfgFreeDriverNode

VOID __fastcall PiDevCfgFreeDriverNode(INT64 a1){
  _QWORD **v2; 
  _QWORD *v3; 
  _QWORD **v4; 
  _QWORD *v5; 
  _QWORD **v6; 
  _QWORD *v7; 
  void *v8; 
  void *v9; 
  void *v10; 
  void *v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  _QWORD *v14; 
  v2 = (_QWORD **)(a1 + 224);
  while( 1 )
  {
    v3 = *v2;
    if( *v2 == v2 )
      break;
    if( (_QWORD **)v3[1] != v2 || (v12 = (_QWORD *)*v3, *(_QWORD **)(*v3 + 8i64) != v3) )
LABEL_19:
      __fastfail(3u);
    *v2 = v12;
    v12[1] = v2;
    PiDevCfgFreeDriverNode((INT64)v3);
  }
  v4 = (_QWORD **)(a1 + 208);
  while( 1 )
  {
    v5 = *v4;
    if( *v4 == v4 )
      break;
    if( (_QWORD **)v5[1] != v4 )
      goto LABEL_19;
    v13 = (_QWORD *)*v5;
    if( *(_QWORD **)(*v5 + 8i64) != v5 )
      goto LABEL_19;
    *v4 = v13;
    v13[1] = v4;
    PiDevCfgFreeDriverNode((INT64)v5);
  }
  v6 = (_QWORD **)(a1 + 368);
  while( 1 )
  {
    v7 = *v6;
    if( *v6 == v6 )
      break;
    if( (_QWORD **)v7[1] != v6 )
      goto LABEL_19;
    v14 = (_QWORD *)*v7;
    if( *(_QWORD **)(*v7 + 8i64) != v7 )
      goto LABEL_19;
    *v6 = v14;
    v14[1] = v6;
    PiDevCfgFreeDriverNode((INT64)v7);
  }
  v8 = *(void **)(a1 + 144);
  if( v8 )
    ExFreePoolWithTag(v8, 0);
  v9 = *(void **)(a1 + 16);
  if( v9 )
    ZwClose(v9);
  v10 = *(void **)(a1 + 24);
  if( v10 )
    ZwClose(v10);
  v11 = *(void **)(a1 + 32);
  if( v11 )
    ZwClose(v11);
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 56));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 40));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 72));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 88));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 128));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 160));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 256));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 272));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 288));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 304));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 320));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 336));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 352));
  RtlFreeAnsiString((_UNICODE_STRING *)(a1 + 392));
  ExFreePoolWithTag((PVOID)a1, 0);
}

Referenced by:

PiDevCfgCheckDeviceNeedsUpdate
PiDevCfgFindDeviceDriver
PiDevCfgFreeDriverNode
PiDevCfgProcessDevice
PiDevCfgQueryDriverNode
PiDevCfgQueryIncludedDriverNode
PpDevCfgProcessDeviceExtensions