SMKM_STORE::SmStTrimWsStoreBatch

void __fastcall SMKM_STORE::SmStTrimWsStoreBatch(
        __int64 a1,
        unsigned int *a2,
        PVOID *a3,
        unsigned int a4,
        int a5,
        _QWORD *a6){
  __int64 v6; 
  __int64 v7; 
  unsigned int *v9; 
  UINT64 v10; 
  _QWORD *v11; 
  unsigned int v12; 
  __int64 v13; 
  unsigned int v14; 
  PVOID *PoolWithTag; 
  unsigned int v16; 
  unsigned int v17; 
  PVOID *v18; 
  char *v19; 
  PVOID *v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  PVOID v25; 
  _BYTE *v26; 
  bool v27; 
  _ETHREAD *CurrentThread; 
  __int64 v29; 
  __int64 v30; 
  int MemoryInformationLength; 
  PVOID BaseAddress; 
  PVOID P; 
  ULONG_PTR NumberOfBytesToUnlock; 
  UINT64 v35; 
  unsigned int v38; 
  v6 = a1;
  v7 = a4;
  v9 = a2;
  BaseAddress = 0i64;
  v10 = a1 + 6024;
  v35 = a1 + 6024;
  if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 6024), 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)(a1 + 6024));
  KeAbPostRelease((PVOID)(v6 + 6024));
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  v11 = a6;
  v12 = *(_DWORD *)(v6 + 6208);
  NumberOfBytesToUnlock = v12;
  if( a6 )
  {
    v14 = v12 >> 12;
    PoolWithTag = (PVOID *)ExAllocatePoolWithTag(NonPagedPoolNx, 16 * v7 * v14, 0x71576D73ui64);
    P = PoolWithTag;
    if( PoolWithTag )
    {
      v16 = 0;
      v17 = 0;
      if( (_DWORD)v7 )
      {
        v18 = a3;
        do
        {
          v19 = (char *)*v18;
          ++v17;
          BaseAddress = *v18;
          if( v16 < v14 * v17 )
          {
            v20 = &PoolWithTag[2 * v16];
            v21 = v14 * v17 - v16;
            v16 = v14 * v17;
            do
            {
              *v20 = v19;
              v20 += 2;
              v19 = (char *)BaseAddress + 4096;
              BaseAddress = (char *)BaseAddress + 4096;
              --v21;
            }
            while( v21 );
          }
          ++v18;
        }
        while( v17 < (unsigned int)v7 );
        v11 = a6;
      }
      if( ZwQueryVirtualMemory(
             (PVOID)0xFFFFFFFFFFFFFFFFi64,
             *PoolWithTag,
             MemoryWorkingSetExList,
             PoolWithTag,
             16 * v7 * v14,
             0i64) >= 0 )
      {
        v22 = 0;
        v23 = 0;
        v38 = 0;
        if( (_DWORD)v7 )
        {
          v24 = v14;
          do
          {
            v25 = 0i64;
            BaseAddress = 0i64;
            if( v23 < v24 )
            {
              v26 = P;
              do
              {
                if( (v26[16 * v23 + 8] & 1) != 0 )
                {
                  v27 = (*v11)-- == 1i64;
                  v25 = *a3;
                  BaseAddress = *a3;
                  if( v27 )
                    break;
                }
                ++v23;
              }
              while( v23 < v24 );
              if( v25 )
                ZwUnlockVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &NumberOfBytesToUnlock, 1ui64);
              v22 = v38;
            }
            if( !*v11 )
              break;
            ++v22;
            v24 += v14;
            ++a3;
            v38 = v22;
          }
          while( v22 < (unsigned int)v7 );
          v10 = v35;
        }
      }
      else
      {
        *v11 = 0i64;
      }
      ExFreePoolWithTag(P, 0);
      v6 = a1;
    }
    else
    {
      *a6 = 0i64;
    }
    v9 = a2;
  }
  else if( (_DWORD)v7 )
  {
    v13 = v7;
    do
    {
      BaseAddress = *a3;
      ZwUnlockVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &NumberOfBytesToUnlock, 1ui64);
      ++a3;
      --v13;
    }
    while( v13 );
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 243);
  ExAcquirePushLockSharedEx(v10, 0i64);
  if( (_DWORD)v7 )
  {
    do
    {
      SMKM_STORE::SmStUnmapVirtualRegion(v6, *v9++, v29, v30, MemoryInformationLength, 2u);
      --v7;
    }
    while( v7 );
  }
}

Referenced by:

No references.