PnpCtxCloseMachine

NTSTATUS __fastcall PnpCtxCloseMachine(VOID *P){
  INT64 v1; 
  _ETHREAD *CurrentThread; 
  int v3; 
  _QWORD *v5; 
  __int64 v6; 
  _QWORD *v7; 
  void *v8; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite(*((_QWORD *)P + 30), 1, v1);
  do
  {
    if( *((VOID **)P + 1) == (char *)P + 8 )
      break;
    v5 = (_QWORD *)*((_QWORD *)P + 2);
    v6 = *v5;
    if( *(_QWORD **)(*v5 + 8i64) == v5 )
    {
      v7 = (_QWORD *)v5[1];
      if( (_QWORD *)*v7 == v5 )
        continue;
    }
    __fastfail(3u);
    *v7 = v6;
    *(_QWORD *)(v6 + 8) = v7;
    v3 = PnpCtxDestroyNode(v5);
  }
  while( v3 >= 0 );
  ExReleaseResourceLite(*((PERESOURCE *)P + 30));
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v3 >= 0 )
  {
    v8 = (void *)*((_QWORD *)P + 30);
    ExDeleteResourceLite((UINT64)v8);
    ExFreePoolWithTag(v8, 0);
    ExFreePoolWithTag(P, 0);
  }
  return v3;
}

Referenced by:

PiDevCfgInitDriverDatabaseCallback
PipMigratePnpState