Before code, !! IMPORTANT !!:
Only get the 'Process HANDLE' when you'll use it.
'Process.Handle' property gives an handle.
Process.GetProcess...() is almost equals the 'OpenProcess(...)' api.
This means, when you request a process instance,
Windows creates new handle for process and lefts it opened.
And when you read 'Process.Handle' property on different times/different zones of code, you'll see each Handle will be different. (sometimes Windows returns same open handle but there's no guarantee).
Whatever... I only want to warn you because I made sick of researching process memory operations and it didn't work because of i requested new handles...
And I didn't find a good information in google. Is no one knows this?? I got angry

Here are some methods for 'Write/Read Process Memory':
And, sorry for my bad English. 
Code:
using System;
using System.Text;
using System.Collections.Generic;
using System.Diagnostics;
public class PMemTest {
#region API Decls.
[DllImport( "kernel32.dll", EntryPoint = "WriteProcessMemory", SetLastError = true )]
public static extern int WriteProcessMemory( IntPtr hProcess, IntPtr lpAddr, byte[] lpBuffer, int nSize, ref int lpNumberOfBytesWritten );
[DllImport( "kernel32.dll", EntryPoint = "ReadProcessMemory", SetLastError = true )]
public static extern int ReadProcessMemory( IntPtr hProcess, IntPtr lpAddr, byte[] lpBuffer, int nSize, ref int lpNumberOfBytesWritten );
#endregion
public int getCurrentProcessId() { return Process.GetCurrentProcess().Id; }
public bool writeMemory(int pid, IntPtr lpAddr, byte[] buffer) {
Process.EnterDebugMode(); // Usally, this isn't needed. Gives the process 'SeDebugPriviledge' (if logged user has 'Administrator' rights - or 'Debug' rigths.
Process[] processArr=Process.GetProcessById(pid);
if (processArr==null || processArr.Length==0)
return false;
int len = buffer.Length;
int bytes = 0;
Process p=processArr[0];
IntPtr hProcess = p.Handle;
WriteProcessMemory( hProcess, lpAddr, buffer, len, ref bytes );
return (bytes>0);
}
public bool readMemory(int pid, IntPtr lpAddr, byte[] buffer) {
Process.EnterDebugMode(); // Usally, this isn't needed. Gives the process 'SeDebugPriviledge' (if logged user has 'Administrator' rights - or 'Debug' rigths.
Process[] processArr=Process.GetProcessById(pid);
if (processArr==null || processArr.Length==0)
return false;
int len = buffer.Length;
int bytes = 0;
Process p=processArr[0];
IntPtr hProcess = p.Handle;
ReadProcessMemory( hProcess, lpAddr, buffer, len, ref bytes );
return (bytes>0);
}