PiDrvDbDestroyNode

VOID __fastcall PiDrvDbDestroyNode(CHAR *P){
  void *v2; 
  __int64 v3; 
  CHAR **v4; 
  UINT64 *v5; 
  UINT64 v6; 
  INT64 v7; 
  void *v8; 
  VOID *v9; 
  if( (*((_DWORD *)P + 16) & 0x10) != 0 )
  {
    v2 = (void *)*((_QWORD *)P + 9);
    if( v2 )
      ZwClose(v2);
  }
  v3 = *(_QWORD *)P;
  if( *(_QWORD *)P )
  {
    if( *(CHAR **)(v3 + 8) != P || (v4 = (CHAR **)*((_QWORD *)P + 1), *v4 != P) )
      __fastfail(3u);
    *v4 = (CHAR *)v3;
    *(_QWORD *)(v3 + 8) = v4;
  }
  RtlFreeAnsiString((_UNICODE_STRING *)P + 1);
  RtlFreeAnsiString((_UNICODE_STRING *)P + 2);
  RtlFreeAnsiString((_UNICODE_STRING *)P + 3);
  RtlFreeAnsiString((_UNICODE_STRING *)(P + 504));
  if( P[192] )
    ExDeleteResourceLite((INT64)(P + 88), v5, v6, v7, v9);
  v8 = (void *)*((_QWORD *)P + 59);
  if( v8 )
    ZwClose(v8);
  ExFreePoolWithTag(P, 0);
}

Referenced by:

PiDrvDbCreateNode
PiDrvDbRegisterNode