WmipDSCleanup

void __fastcall WmipDSCleanup(ULONG_PTR BugCheckParameter2){
  UINT64 *v2; 
  _QWORD *v3; 
  volatile signed __int64 *v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 i; 
  volatile signed __int64 *v8; 
  void *v9; 
  if( (*(_DWORD *)(BugCheckParameter2 + 16) & 1) == 0 )
    KeBugCheckEx(0x14Au, 1ui64, BugCheckParameter2, 0i64, 0i64);
  KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
  v3 = *(_QWORD **)(BugCheckParameter2 + 40);
  while( v3 != (_QWORD *)(BugCheckParameter2 + 40) )
  {
    v4 = v3 - 5;
    if( *(v3 - 5) )
    {
      WmipUnlinkInstanceSetFromGuidEntry((__int64)(v3 - 5), v2);
      *((_QWORD *)v4 + 8) = 0i64;
    }
    v5 = *((_QWORD *)v4 + 7);
    if( v5 && (v4[2] & 8) == 0 )
    {
      v6 = *(_QWORD *)(v5 + 72) - WmipBinaryMofGuid;
      if( !v6 )
        v6 = *(_QWORD *)(v5 + 80) - 0x102906C9A000F0B2i64;
      if( !v6 )
      {
        KeReleaseMutex(&WmipSMMutex, 0);
        WmipGenerateBinaryMofNotification((__int64)(v3 - 5), &GUID_MOF_RESOURCE_REMOVED_NOTIFICATION);
        KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
        v5 = *((_QWORD *)v4 + 7);
      }
      WmipUnreferenceEntry((__int64)&WmipGEChunkInfo, (volatile signed __int64 *)v5);
    }
    *((_QWORD *)v4 + 7) = 0i64;
    v3 = (_QWORD *)*v3;
    WmipUnreferenceEntry((__int64)&WmipISChunkInfo, v4);
  }
  KeReleaseMutex(&WmipSMMutex, 0);
  for( i = 0i64; (unsigned int)i < *(_DWORD *)(BugCheckParameter2 + 64); i = (unsigned int)(i + 1) )
  {
    v8 = *(volatile signed __int64 **)(*(_QWORD *)(BugCheckParameter2 + 72) + 8 * i);
    if( v8 )
      WmipUnreferenceEntry((__int64)&WmipMRChunkInfo, v8);
  }
  v9 = *(void **)(BugCheckParameter2 + 72);
  if( v9 != (void *)(BugCheckParameter2 + 80) )
  {
    ExFreePoolWithTag(v9, 0);
    *(_QWORD *)(BugCheckParameter2 + 72) = 0i64;
  }
}

Referenced by:

No references.