SMKM_STORE::SmStTrimWsStoreBatch

void __fastcall SMKM_STORE::SmStTrimWsStoreBatch(
        _EX_PUSH_LOCK *a1,
        unsigned int *a2,
        VOID **a3,
        unsigned int a4,
        int a5,
        _QWORD *a6){
  _EX_PUSH_LOCK *v6; 
  __int64 v7; 
  unsigned int *v9; 
  _EX_PUSH_LOCK *v10; 
  _QWORD *v11; 
  unsigned int Value; 
  __int64 v13; 
  unsigned int v14; 
  VOID **PoolWithTag; 
  unsigned int v16; 
  unsigned int v17; 
  VOID **v18; 
  char *v19; 
  VOID **v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  VOID *v25; 
  _BYTE *v26; 
  bool v27; 
  _ETHREAD *CurrentThread; 
  __int64 v29; 
  __int64 v30; 
  int MemoryInformationLength; 
  VOID *BaseAddress; 
  PVOID P; 
  UINT64 RegionSize; 
  _EX_PUSH_LOCK *v35; 
  unsigned int v38; 

  v6 = a1;
  v7 = a4;
  v9 = a2;
  BaseAddress = 0i64;
  v10 = a1 + 753;
  v35 = a1 + 753;
  if( _InterlockedCompareExchange64(&a1[753]._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(a1 + 753);
  KeAbPostRelease(&v6[753]);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  v11 = a6;
  Value = v6[776].Value;
  RegionSize = Value;
  if( a6 )
  {
    v14 = Value >> 12;
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 16 * v7 * v14, 1901555059i64);
    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(-1, *PoolWithTag, MemoryWorkingSetExInformation, 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((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 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((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 1ui64);
      ++a3;
      --v13;
    }
    while( v13 );
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockSharedEx(v10, 0i64);
  if( (_DWORD)v7 )
  {
    do
    {
      SMKM_STORE::SmStUnmapVirtualRegion((__int64)v6, *v9++, v29, v30, MemoryInformationLength, 2u);
      --v7;
    }
    while( v7 );
  }
}

Referenced by:

No references.