使用C读取内存中的特定地址

时间:2013-04-30 22:55:59

标签: c

任何人都可以解释我如何从内存中的特定地址读取C中的DWORD,WORD,BYTE吗? 例如,使用MapViewOfFile()函数返回的基地址,如何使用C读取连续的BYTE,WORD或DWORD?
感谢。

4 个答案:

答案 0 :(得分:1)

假设地址适合您正在使用的数据类型 - 这很重要,因为在某些体系结构中,访问“未对齐”地址无效!

在C:

void *address = MapViewOfFile(...);
DWORD *dword_ptr = (DWORD *)address; 
WORD  *word_ptr = (WORD *)address;
BYTE  *byte_ptr = (BYTE *)address; 

在C ++中,模式类似,但不是基本的C样式转换,而是使用reinterpret_cast<type*>(address),其中typeDWORDWORD,{{ 1}}等等。例如:

BYTE

答案 1 :(得分:1)

MapViewOfFile()返回LPVOID,这是void*的typedef。你需要演员。

最简单的方法是一次读取一个字节。你没有在这里指定是否存在任何类型的性能要求(也没有指定你的平台,拱形等),所以我假设“一次一个字节”是可以的。

注意:WORD定义为short,在Win32中应为16位。 DWORD是一个i​​nt,在Win32中应该是32位。

LPVOID pvAddr= MapViewOfFile(...);

BYTE* pBytes= (BYTE*)pvAddr;

BYTE firstByte= pBytes[0]; /* copy first byte */

WORD w;
memcpy(&w, pBytes+1, 2); /* copy the next two bytes */

DWORD dw;
memcpy(&dw, pBytes+3, 4); /* copy the next 4 bytes */

希望有所帮助。

答案 2 :(得分:1)

那么你的问题基本上有两个部分:

  1. 有人可以解释我如何从内存中的特定地址读取C中的DWORDWORDBYTE吗?

    这很容易,但可能不是你想要的,你只需将地址转换为所需类型的指针。

    DWORD x = *((DWORD *)address);
    
  2. 例如,使用MapViewOfFile()函数返回的基地址,如何使用C读取连续的BYTEWORDDWORD

    这也不算太糟糕。您从void*获得MapViewOfFile,只需将其转换为适当的指针类型,然后将其用作数组:

    DWORD *p = MapViewOfFile(...);
    DWORD x = p[1]; // second DWORD of the mapped file
    

答案 3 :(得分:0)

MapViewOfFile会返回LPVOID(相当于void *),因此可以像其他任何pointer一样阅读。