home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 July / CHIP_CD_1998_07_PL.iso / SOFTWARE / bezpiecz / getadmin / PROCMEM.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-08  |  2.2 KB  |  116 lines

  1.  
  2.  
  3. #include <Windows.H>
  4.  
  5. #include "ProcMem.h"
  6.  
  7.  
  8. //////////////////////////////////////////////////////////////
  9.  
  10.  
  11. #if defined(_X86_)
  12. #define STACKPTR(Context)  (Context.Esp)
  13. #endif
  14.  
  15. #if defined(_MIPS_)
  16. #define STACKPTR(Context)  (Context.IntSp)
  17. #endif
  18.  
  19. #if defined(_ALPHA_)
  20. #define STACKPTR(Context)  (Context.IntSp)
  21. #endif
  22.  
  23. #if !defined(STACKPTR)
  24. #error Module contains CPU-specific code; modify and re-compile.
  25. #endif
  26.  
  27.  
  28. //////////////////////////////////////////////////////////////
  29.  
  30.  
  31. #define ORD_ExitThread        ((LPCSTR) MAKEINTRESOURCE(0x55))
  32.  
  33.  
  34. //////////////////////////////////////////////////////////////
  35.  
  36.  
  37. PVOID AllocProcessMemory (HANDLE hProcess, DWORD dwNumBytes) {
  38.     CONTEXT Context;
  39.     DWORD dwThreadId, dwNumBytesXferred, dwError;
  40.     HANDLE hThread;
  41.     HINSTANCE hinstKrnl = GetModuleHandle(__TEXT("Kernel32"));
  42.     PVOID pvMem;
  43.     MEMORY_BASIC_INFORMATION mbi;
  44.     BOOL fOk = FALSE;    
  45.  
  46.     __try {
  47.         hThread = CreateRemoteThread(
  48.             hProcess, 
  49.             NULL,    
  50.             dwNumBytes + sizeof(HANDLE),
  51.             (LPTHREAD_START_ROUTINE) 
  52.                 GetProcAddress(hinstKrnl, ORD_ExitThread), 
  53.             0,
  54.             CREATE_SUSPENDED,    
  55.             &dwThreadId);    
  56.  
  57.         if (hThread == NULL) {    
  58.             dwError = GetLastError();
  59.             __leave;
  60.         }
  61.  
  62.         Context.ContextFlags = CONTEXT_CONTROL;
  63.         if (!GetThreadContext(hThread, &Context))
  64.             __leave;
  65.  
  66.         if (sizeof(mbi) != VirtualQueryEx(hProcess,
  67.             (PDWORD) STACKPTR(Context) - 1, &mbi, sizeof(mbi)))
  68.             __leave;
  69.         pvMem = (PVOID) mbi.BaseAddress;
  70.  
  71.         fOk = WriteProcessMemory(hProcess, pvMem, &hThread, 
  72.             sizeof(hThread), &dwNumBytesXferred);
  73.  
  74.         if (!fOk) 
  75.             __leave;
  76.  
  77.         pvMem = (PVOID) ((PHANDLE) pvMem + 1);
  78.     }
  79.     __finally {
  80.         if (!fOk) {
  81.             if (hThread) {
  82.                 ResumeThread(hThread);
  83.             }
  84.             pvMem = NULL;
  85.         }
  86.     }        
  87.     
  88.     return(pvMem);
  89. }
  90.  
  91.  
  92. //////////////////////////////////////////////////////////////
  93.  
  94.  
  95. BOOL FreeProcessMemory (HANDLE hProcess, PVOID pvMem) {
  96.     BOOL fOk;
  97.     HANDLE hThread;
  98.     DWORD dwNumBytesXferred;
  99.  
  100.     pvMem = (PVOID) ((PHANDLE) pvMem - 1);
  101.  
  102.     fOk = ReadProcessMemory(hProcess, pvMem, &hThread, 
  103.         sizeof(hThread), &dwNumBytesXferred);
  104.  
  105.     if (fOk) {
  106.         if (ResumeThread(hThread) == 0xffffffff) {
  107.             fOk = FALSE;
  108.         }
  109.         CloseHandle(hThread);
  110.     }
  111.  
  112.     return(fOk);
  113. }
  114.  
  115.  
  116.