WmipGenerateBinaryMofNotification

void __fastcall WmipGenerateBinaryMofNotification(__int64 a1, _OWORD *a2){
  unsigned int v4; 
  _QWORD *v5; 
  int v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  char *PoolWithTag; 
  char *v11; 
  BOOL v12; 
  UINT64 v13; 
  int v14; 
  __int64 v15; 
  UINT64 dwFlags; 
  __int64 v17; 
  if( *(_DWORD *)(a1 + 72) )
  {
    v4 = 0;
    v5 = (_QWORD *)(a1 + 88);
    do
    {
      v6 = *(_DWORD *)(a1 + 16);
      if( (v6 & 2) != 0 )
      {
        v15 = -1i64;
        v9 = v4;
        do
          ++v15;
        while( *(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 88) + 8i64 * v4) + 2 * v15) );
        v8 = 2 * v15 + 4;
      }
      else
      {
        if( (v6 & 1) == 0 )
          return;
        v7 = -1i64;
        do
          ++v7;
        while( *(_WORD *)(*v5 + 2 * v7 + 4) );
        v8 = 2 * v7 + 14;
        v9 = v4;
      }
      PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, v8 + 74, 0x70696D57ui64);
      v11 = PoolWithTag;
      if( PoolWithTag )
      {
        memset((INT64)PoolWithTag, 0i64);
        *(_DWORD *)v11 = v8 + 74;
        *((_DWORD *)v11 + 1) = 3;
        *((_QWORD *)v11 + 1) = 1i64;
        *((_DWORD *)v11 + 11) = 10;
        *(_OWORD *)(v11 + 24) = *a2;
        *((_QWORD *)v11 + 2) = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
        *((_DWORD *)v11 + 15) = v8 + 2;
        v13 = v8 - 2;
        *((_DWORD *)v11 + 12) = 64;
        *((_DWORD *)v11 + 14) = 72;
        *((_WORD *)v11 + 32) = 0;
        *((_WORD *)v11 + 36) = 0;
        v14 = *(_DWORD *)(a1 + 16);
        if( (v14 & 2) != 0 )
        {
          *((_WORD *)v11 + 37) = v13;
          RtlStringCbCopyW((PWCHAR)v11 + 38, v13, *(PWCHAR *)(*v5 + 8 * v9));
        }
        else if( (v14 & 1) != 0 )
        {
          LODWORD(v17) = v4 + *(_DWORD *)*v5;
          LODWORD(dwFlags) = 512;
          RtlStringCbPrintfExW((WCHAR *)v11 + 38, v13, 0i64, 0i64, dwFlags, L"%ws%d", *v5 + 4i64, v17);
          *((_WORD *)v11 + 37) = v13;
        }
        LOBYTE(v12) = 1;
        WmipProcessEvent((WNODE_HEADER *)v11, v12, 0);
        ExFreePoolWithTag(v11, 0);
        v5 = (_QWORD *)(a1 + 88);
      }
      ++v4;
    }
    while( v4 < *(_DWORD *)(a1 + 72) );
  }
}

Referenced by:

WmipAddDataSource
WmipDSCleanup
WmipUpdateDataSource