|
C#,VirtualCopy的方式读写物理内存有问题,请指教
[复制链接]
- class WinCE_IO_Accessor
- {
- enum PageAccessFlags : uint
- {
- PAGE_NOACCESS = 0x01,
- PAGE_READONLY = 0x02,
- PAGE_READWRITE = 0x04,
- PAGE_WRITECOPY = 0x08,
- PAGE_EXECUTE = 0x10,
- PAGE_EXECUTE_READ = 0x20,
- PAGE_EXECUTE_READWRITE = 0x40,
- PAGE_EXECUTE_WRITECOPY = 0x80,
- PAGE_GUARD = 0x100,
- PAGE_NOCACHE = 0x200,
- PAGE_PHYSICAL = 0x400,
- PAGE_WRITECOMBINE = 0x400
- }
- enum MemUsageFlags : uint
- {
- MEM_COMMIT = 0x1000,
- MEM_RESERVE = 0x2000,
- MEM_DECOMMIT = 0x4000,
- MEM_RELEASE = 0x8000,
- MEM_FREE = 0x10000,
- MEM_PRIVATE = 0x20000,
- MEM_MAPPED = 0x40000,
- MEM_RESET = 0x80000,
- MEM_TOP_DOWN = 0x100000,
- MEM_AUTO_COMMIT = 0x200000,
- MEM_4MB_PAGES = 0x80000000
- }
- [DllImport("Coredll.dll", EntryPoint = "VirtualAlloc", SetLastError = true)]
- private static extern IntPtr VirtualAlloc(
- IntPtr lpAddress,
- uint dwSize,
- MemUsageFlags flAllocationType,
- PageAccessFlags flProtect);
- [DllImport("Coredll.dll", EntryPoint = "VirtualCopy", SetLastError = true)]
- private static extern bool VirtualCopy(
- IntPtr lpvDest,
- IntPtr lpvSrc,
- uint cbSize,
- PageAccessFlags fdwProtect);
- [DllImport("Coredll.dll", EntryPoint = "VirtualFree", SetLastError = true)]
- private static extern bool VirtualFree(
- IntPtr lpAddress,
- uint cbSize,
- MemUsageFlags dwFreeType);
- const uint DRIVER_GLOBALS_PHYSICAL_MEMORY_START = 0xac059000;
- const uint BASE_ADDR = DRIVER_GLOBALS_PHYSICAL_MEMORY_START / 256;
- const uint SIZE = 8;
- public IntPtr buf;
- public WinCE_IO_Accessor()
- {
- buf = VirtualAlloc(IntPtr.Zero, SIZE, MemUsageFlags.MEM_RESERVE, PageAccessFlags.PAGE_NOACCESS);
- if (buf == IntPtr.Zero)
- {
- throw new Exception("VirtualAlloc Fail");
- }
- if (!VirtualCopy(buf, (IntPtr)BASE_ADDR, SIZE, PageAccessFlags.PAGE_READWRITE |
- PageAccessFlags.PAGE_NOCACHE | PageAccessFlags.PAGE_PHYSICAL))
- {
- throw new Exception("VirtualCopy Fail");
- }
- byte a = 1;
- Marshal.WriteByte(buf, a);
- byte b = Marshal.ReadByte(buf); //这里读出的b=0
- VirtualFree(buf, 0, MemUsageFlags.MEM_RELEASE);
- }
- }
复制代码
帮别人做一个WinCE5.0下的小软件,要和硬件IO端口打交道,所以需要读写物理内存
C++很不熟悉,所以决定用C#,效率高点
读写物理内存的代码如上,写入一个字节1后,再读出来是0
现在硬件还没到位,在VS2008自带的模拟器(PPC2003)里跑的
不知道哪里出问题了,请明白人指点
非常感谢
|
|