PiDevCfgFreeDriverNode

VOID __stdcall PiDevCfgFreeDriverNode(_PI_DEVCFG_DRIVER_NODE *DriverNode){
  _PI_DEVCFG_DRIVER_NODE **v2; 
  _PI_DEVCFG_DRIVER_NODE *v3; 
  _PI_DEVCFG_DRIVER_NODE **v4; 
  _PI_DEVCFG_DRIVER_NODE *v5; 
  _PI_DEVCFG_DRIVER_NODE **v6; 
  _PI_DEVCFG_DRIVER_NODE *v7; 
  void *v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 

  v2 = (_PI_DEVCFG_DRIVER_NODE **)(DriverNode + 56);
  while( 1 )
  {
    v3 = *v2;
    if( *v2 == (_PI_DEVCFG_DRIVER_NODE *)v2 )
      break;
    if( *((_PI_DEVCFG_DRIVER_NODE ***)v3 + 1) != v2
      || (v12 = *(_QWORD *)v3, *(_PI_DEVCFG_DRIVER_NODE **)(*(_QWORD *)v3 + 8i64) != v3) )
    {
LABEL_19:
      __fastfail(3u);
    }
    *v2 = (_PI_DEVCFG_DRIVER_NODE *)v12;
    *(_QWORD *)(v12 + 8) = v2;
    PiDevCfgFreeDriverNode(v3);
  }
  v4 = (_PI_DEVCFG_DRIVER_NODE **)(DriverNode + 52);
  while( 1 )
  {
    v5 = *v4;
    if( *v4 == (_PI_DEVCFG_DRIVER_NODE *)v4 )
      break;
    if( *((_PI_DEVCFG_DRIVER_NODE ***)v5 + 1) != v4 )
      goto LABEL_19;
    v13 = *(_QWORD *)v5;
    if( *(_PI_DEVCFG_DRIVER_NODE **)(*(_QWORD *)v5 + 8i64) != v5 )
      goto LABEL_19;
    *v4 = (_PI_DEVCFG_DRIVER_NODE *)v13;
    *(_QWORD *)(v13 + 8) = v4;
    PiDevCfgFreeDriverNode(v5);
  }
  v6 = (_PI_DEVCFG_DRIVER_NODE **)(DriverNode + 92);
  while( 1 )
  {
    v7 = *v6;
    if( *v6 == (_PI_DEVCFG_DRIVER_NODE *)v6 )
      break;
    if( *((_PI_DEVCFG_DRIVER_NODE ***)v7 + 1) != v6 )
      goto LABEL_19;
    v14 = *(_QWORD *)v7;
    if( *(_PI_DEVCFG_DRIVER_NODE **)(*(_QWORD *)v7 + 8i64) != v7 )
      goto LABEL_19;
    *v6 = (_PI_DEVCFG_DRIVER_NODE *)v14;
    *(_QWORD *)(v14 + 8) = v6;
    PiDevCfgFreeDriverNode(v7);
  }
  v8 = (void *)*((_QWORD *)DriverNode + 18);
  if( v8 )
    ExFreePoolWithTag(v8, 0);
  v9 = *((_QWORD *)DriverNode + 2);
  if( v9 )
    ZwClose(v9);
  v10 = *((_QWORD *)DriverNode + 3);
  if( v10 )
    ZwClose(v10);
  v11 = *((_QWORD *)DriverNode + 4);
  if( v11 )
    ZwClose(v11);
  RtlFreeAnsiString((_UNICODE_STRING *)(DriverNode + 14));
  RtlFreeAnsiString((_UNICODE_STRING *)(DriverNode + 10));
  RtlFreeAnsiString((_UNICODE_STRING *)(DriverNode + 18));
  RtlFreeAnsiString((_UNICODE_STRING *)(DriverNode + 22));
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 8);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 10);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 16);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 17);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 18);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 19);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 20);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 21);
  RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 22);
  RtlFreeAnsiString((_UNICODE_STRING *)(DriverNode + 98));
  ExFreePoolWithTag(DriverNode, 0);
}

Referenced by:

PiDevCfgCheckDeviceNeedsUpdate
PiDevCfgFindDeviceDriver
PiDevCfgFreeDriverNode
PiDevCfgProcessDevice
PiDevCfgQueryDriverNode
PiDevCfgQueryIncludedDriverNode
PpDevCfgProcessDeviceExtensions