diff Allocator.cpp @ 0:8b8875f5b359

Initial commit
author Nomad
date Fri, 05 Oct 2012 16:07:14 +0200
parents
children 93bf1d5f6a6d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Allocator.cpp	Fri Oct 05 16:07:14 2012 +0200
@@ -0,0 +1,317 @@
+#include <string.h>
+#include <stdio.h>
+#include "OSAPI.h"
+
+#include "Allocator.h"
+
+#include "mm7_data.h"
+
+
+
+Allocator *pAllocator; // idb
+
+
+
+
+
+void __fastcall CheckMemoryAccessibility(void *pBase, DWORD uSize);
+
+
+
+//----- (00426755) --------------------------------------------------------
+void *Allocator::AllocNamedChunk(const void *pPrevPtrValue, unsigned int uSize, const char *pName)
+{
+  Allocator *v4; // esi@1
+  unsigned int v5; // eax@7
+  void *result; // eax@8
+  unsigned int *pNumBuffersUsed; // ebx@12
+  unsigned int v8; // edi@15
+  char v9; // zf@15
+  int v10; // eax@16
+  void **v11; // ebx@19
+  void *v12; // eax@22
+  unsigned int Size; // [sp+14h] [bp+Ch]@16
+
+  v4 = this;
+  if ( pPrevPtrValue && !aborting_app )
+    AbortWithError();
+  if ( !v4->bBigBufferAllocated && !aborting_app )
+    AbortWithError();
+  v5 = uSize;
+  if ( uSize )
+  {
+    if ( (uSize & 0x80000000u) != 0 && !aborting_app )
+    {
+      AbortWithError();
+      v5 = uSize;
+    }
+    pNumBuffersUsed = &v4->uNumBuffersUsed;
+    if ( v4->uNumBuffersUsed == 6000 && !aborting_app )
+    {
+      AbortWithError();
+      v5 = uSize;
+    }
+    v8 = *pNumBuffersUsed;
+    v9 = v4->bUseBigBuffer == 0;
+    ++*pNumBuffersUsed;
+    if ( v9 )
+    {
+      v12 = malloc(v5);
+      v11 = (void **)((char *)v4 + 4 * v8);
+      *v11 = v12;
+      if ( v12 )
+      {
+        v4->uMemoryBuffersSizes[v8] = uSize;
+      }
+      else
+      {
+        if ( !aborting_app )
+          AbortWithError();
+      }
+    }
+    else
+    {
+      LOBYTE(v5) = v5 & 0xFC;
+      v10 = v5 + 4;
+      Size = v10;
+      if ( v10 + v4->uNextFreeOffsetInBigBuffer > v4->uBigBufferSizeAligned )
+      {
+        printf("Id: %s  Size: %i\n", pName, v10);
+        CreateFileDump("Memory");
+        if ( !aborting_app )
+          AbortWithError();
+      }
+      v11 = (void **)((char *)v4 + 4 * v8);
+      *v11 = (char *)v4->pBigMemoryBuffer + v4->uNextFreeOffsetInBigBuffer;
+      v4->uMemoryBuffersSizes[v8] = Size;
+      if ( pName )
+        strncpy((char *)v4 + 4 * (3 * v8 + 12000), pName, 11u);
+      v4->uNextFreeOffsetInBigBuffer += Size;
+    }
+    result = *v11;
+  }
+  else
+  {
+    result = 0;
+  }
+  return result;
+}
+// 720018: using guessed type int aborting_app;
+
+
+
+//----- (004266CD) --------------------------------------------------------
+bool Allocator::Initialize(unsigned int uNumKBytes)
+{
+  if (bBigBufferAllocated)
+    return false;
+
+  if (!uNumKBytes)
+    return false;
+
+  pBigMemoryBuffer = malloc(uNumKBytes * 1024);
+  if (!pBigMemoryBuffer)
+    return false;
+
+  pBigBufferAligned = (char *)pBigMemoryBuffer + -((unsigned __int16)pBigMemoryBuffer & 0xFFF) + 4096;
+  uBigBufferSizeAligned = (uNumKBytes * 1024) - 4096;
+
+  uNumBuffersUsed = 0;
+  uNextFreeOffsetInBigBuffer = 0;
+
+  bUseBigBuffer = true;
+  return bBigBufferAllocated = true;
+}
+
+
+//----- (00426474) --------------------------------------------------------
+void Allocator::FreeChunk(void *ptr)
+{
+  Allocator *v2; // esi@1
+  unsigned int v3; // eax@5
+  signed int i; // edi@5
+  unsigned int v5; // eax@13
+  signed int v6; // ecx@16
+  signed int j; // edx@16
+  char v8; // zf@20
+
+  v2 = this;
+  if ( ptr )
+  {
+    if ( !this->bBigBufferAllocated && !aborting_app )
+      AbortWithError();
+    v3 = v2->uNumBuffersUsed;
+    for ( i = 0; i < (signed int)v3; ++i )
+    {
+      if ( v2->pMemoryBuffers[i] == ptr )
+        break;
+    }
+    if ( i >= (signed int)v3 && !aborting_app )
+      AbortWithError();
+    if ( !v2->bUseBigBuffer )
+      free(v2->pMemoryBuffers[i]);
+    v2->pMemoryBuffers[i] = 0;
+    v2->uMemoryBuffersSizes[i] = 0;
+    LOBYTE(v2->pMemoryBuffers[3 * i + 12000]) = 0;
+    v5 = v2->uNumBuffersUsed;
+    if ( i == v5 - 1 )
+    {
+      if ( i )
+      {
+        v6 = 0;
+        for ( j = 0; j < (signed int)v5; ++j )
+        {
+          if ( v2->pMemoryBuffers[j] )
+            v6 = j;
+        }
+        v8 = v2->bUseBigBuffer == 0;
+        v2->uNumBuffersUsed = v6 + 1;
+        if ( !v8 )
+          v2->uNextFreeOffsetInBigBuffer = (char *)v2->pMemoryBuffers[v6]
+                                         + v2->uMemoryBuffersSizes[v6]
+                                         - v2->pBigMemoryBuffer;
+      }
+      else
+      {
+        v2->uNextFreeOffsetInBigBuffer = 0;
+        v2->uNumBuffersUsed = 0;
+      }
+    }
+  }
+}
+// 720018: using guessed type int aborting_app;
+
+
+
+//----- (00426429) --------------------------------------------------------
+Allocator::Allocator()
+{
+  Allocator *v1; // eax@1
+  signed int v2; // ecx@1
+  int v3; // edx@1
+
+  v1 = this;
+  v2 = 0;
+  v1->uBigBufferSizeAligned = 0;
+  v1->bBigBufferAllocated = 0;
+  v3 = (int)v1->pMemoryBuffersNames;
+  do
+  {
+    v1->pMemoryBuffers[v2] = 0;
+    v1->uMemoryBuffersSizes[v2] = 0;
+    *(char *)v3 = 0;
+    ++v2;
+    v3 += 12;
+  }
+  while ( v2 < 6000 );
+  v1->uDumpsCount = 0;
+}
+
+
+//----- (0042654C) --------------------------------------------------------
+bool Allocator::CreateFileDump(const char *a1)
+{
+  Allocator *v2; // esi@1
+  unsigned int v3; // ST44_4@1
+  FILE *v4; // eax@1
+  FILE *v5; // edi@1
+  bool result; // eax@2
+  unsigned int v7; // ecx@5
+  int v8; // edx@5
+  int v9; // eax@6
+  int v10; // eax@8
+  int v11; // ecx@8
+  signed int v12; // ebx@8
+  signed int v13; // ebx@10
+  struct _MEMORYSTATUS memstat; // [sp+8h] [bp-38h]@5
+  char Filename[20]; // [sp+28h] [bp-18h]@1
+  unsigned int *v16; // [sp+3Ch] [bp-4h]@11
+  int a1a; // [sp+48h] [bp+8h]@11
+
+  v2 = this;
+  v3 = this->uDumpsCount;
+  this->uDumpsCount = v3 + 1;
+  sprintfex(Filename, "Mem%03i.txt", v3);
+  v4 = fopen(Filename, "w");
+  v5 = v4;
+  if ( v4 )
+  {
+    if ( a1 )
+      fprintf(v4, "%s\n\n", a1);
+    fprintf(v5, "Windows Memory Status");
+    GlobalMemoryStatus(&memstat);
+    fprintf(v5, "dwLength:         %d\n\n", memstat.dwLength);
+    fprintf(v5, "dwMemoryLoad:     %d\n", memstat.dwMemoryLoad);
+    fprintf(v5, "dwTotalPhys:      %d\n", memstat.dwTotalPhys);
+    fprintf(v5, "dwAvailPhys:      %d\n", memstat.dwAvailPhys);
+    fprintf(v5, "dwTotalPageFile:  %d\n", memstat.dwTotalPageFile);
+    fprintf(v5, "dwAvailPageFile:  %d\n", memstat.dwAvailPageFile);
+    fprintf(v5, "dwTotalVirtual:   %d\n", memstat.dwTotalVirtual);
+    fprintf(v5, "dwAvailVirtual:   %d\n\n\n", memstat.dwAvailVirtual);
+    v7 = v2->uNumBuffersUsed;
+    v8 = 0;
+    if ( (signed int)v7 > 0 )
+    {
+      v9 = (int)v2->uMemoryBuffersSizes;
+      do
+      {
+        v8 += *(int *)v9;
+        v9 += 4;
+        --v7;
+      }
+      while ( v7 );
+    }
+    v10 = 0;
+    v11 = (int)v2->uMemoryBuffersSizes;
+    v12 = 6000;
+    do
+    {
+      v10 += *(int *)v11;
+      v11 += 4;
+      --v12;
+    }
+    while ( v12 );
+    fprintf(v5, "Size: %i  %i  %i\n\n", v2->uNumBuffersUsed, v8, v10);
+    v13 = 0;
+    if ( (signed int)v2->uNumBuffersUsed > 0 )
+    {
+      v16 = v2->uMemoryBuffersSizes;
+      a1a = (int)v2->pMemoryBuffersNames;
+      do
+      {
+        fprintf(v5, "%10i %10i %s\n", v13, *v16, a1a);
+        a1a += 12;
+        ++v16;
+        ++v13;
+      }
+      while ( v13 < (signed int)v2->uNumBuffersUsed );
+    }
+    fclose(v5);
+    result = 0;
+  }
+  else
+  {
+    result = 1;
+  }
+  return result;
+}
+
+
+
+
+
+
+
+
+//----- (00426892) --------------------------------------------------------
+static void __fastcall CheckMemoryAccessibility(void *pBase, DWORD uSize)
+{
+  DWORD v2; // edi@1
+  DWORD i; // eax@1
+  struct _SYSTEM_INFO SystemInfo; // [sp+8h] [bp-24h]@1
+
+  v2 = uSize;
+  GetSystemInfo(&SystemInfo);
+  for ( i = 16 * SystemInfo.dwPageSize; i < v2; i += SystemInfo.dwPageSize )
+    ;
+}