title: c# memory THREADSTACK0 base address
body: <p>Below is my C# code that I use to read-memory (for pointers with multiple offsets). However, how should I modify it so it can be used for accessing pointers with '"<strong>THREADSTACK0"-0000032C</strong>' as a base address (instead of 0x1002CAA70)?</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  using System.Runtime.InteropServices;
  using System.Diagnostics;
  
  namespace ConsoleApplication1
  {
      class Program
      {
          const int PROCESS_WM_READ = 0x0010;
  
          [DllImport("kernel32.dll")]
          public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
  
          [DllImport("kernel32.dll")]
          public static extern bool ReadProcessMemory(int hProcess,
          Int64 lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
  
          static void Main(string[] args)
          {
              Process process = Process.GetProcessesByName("Tutorial-x86_64")[0];
              IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
  
              int bytesRead = 0;
              byte[] buffer = new byte[4];
  
              //Byte[] buffer = new Byte[4];
  
              Int64 baseAddress = 0x1002CAA70;
              ReadProcessMemory((int)processHandle, baseAddress, buffer, buffer.Length, ref bytesRead);
              Int64 baseValue = BitConverter.ToInt32(buffer, 0);
  
              Int64 firstAddress = baseValue + 0x10;
              ReadProcessMemory((int)processHandle, firstAddress, buffer, buffer.Length, ref bytesRead);
              Int64 firstValue = BitConverter.ToInt32(buffer, 0);
  
              Int64 secondAddress = firstValue + 0x18;
              ReadProcessMemory((int)processHandle, secondAddress, buffer, buffer.Length, ref bytesRead);
              Int64 secondValue = BitConverter.ToInt32(buffer, 0);
  
              Int64 thirdAddress = secondValue + 0x0;
              ReadProcessMemory((int)processHandle, thirdAddress, buffer, buffer.Length, ref bytesRead);
              Int64 thirdValue = BitConverter.ToInt32(buffer, 0);
  
              Int64 fourthAddress = thirdValue + 0x18;
              ReadProcessMemory((int)processHandle, fourthAddress, buffer, buffer.Length, ref bytesRead);
              Int64 fourthValue = BitConverter.ToInt32(buffer, 0);
  
              ReadProcessMemory((int)processHandle, fourthValue, buffer, buffer.Length, ref bytesRead);
              Console.WriteLine(BitConverter.ToInt32(buffer, 0));
              Console.ReadLine();
          }
      }
  }
  </code></pre>
  
  <p>I found this thread "<a href="https://stackoverflow.com/questions/28620186/using-pointers-found-in-cheat-engine-in-c-sharp">Using Pointers Found in Cheat Engine in C#</a>", but I'm having trouble implementing it. </p>