首页
社区
课程
招聘
[求助]WriteProcessMemory的奇怪问题
发表于: 2007-10-11 23:58 11123

[求助]WriteProcessMemory的奇怪问题

2007-10-11 23:58
11123
环境: VC++6.0(sp6) 英文原版(非精简)
平台: WinXP SP2简体中文版

今天写如下代码:
                byte hexData[] = {
                        0x74, 0x17
                };
               
                ::WriteProcessMemory(GetCurrentProcess(),(LPVOID)hint,
                        (LPCVOID)hexData,sizeof(hexData),NULL);

编译通不过,报:
error C2664: 'WriteProcessMemory' : cannot convert parameter 3 from 'const void *' to 'void *'

查看对应的MSDN(2001),发现函数原型是对的呀
BOOL WriteProcessMemory(
  HANDLE hProcess,                // handle to process
  LPVOID lpBaseAddress,           // base of memory area
  LPCVOID lpBuffer,               // data buffer    
  SIZE_T nSize,                   // count of bytes to write
  SIZE_T * lpNumberOfBytesWritten // count of bytes written
);

  Header: Declared in Winbase.h; include Windows.h.
  Library: Use Kernel32.lib.

//----------------------------------------------------------------------------------
再查了一下MSDN在线库
MicroSoft的函数原型是:

原文地址 http://msdn2.microsoft.com/en-us/library/ms681674.aspx

BOOL WINAPI WriteProcessMemory(
  __in          HANDLE hProcess,
  __in          LPVOID lpBaseAddress,
  __in          LPCVOID lpBuffer,
  __in          SIZE_T nSize,
  __out         SIZE_T* lpNumberOfBytesWritten
);

似乎也没有错哦

不明白为何通不过,此处也参考了
http://bbs.pediy.com/showthread.php?threadid=26258

这时我查了一下Winbase.h中的原型,却发现如下:

Winbase.h中的函数原型的描述是:
WriteProcessMemory(
    HANDLE hProcess,
    LPVOID lpBaseAddress,
    LPVOID lpBuffer,
    DWORD nSize,
    LPDWORD lpNumberOfBytesWritten
    );

这难道是说,sp6的包还是错的?难道我要更换sdk或升级IDE?有没有解决的方法呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
用LPVOID就行了,编译器是按照*.h文件里定义的类型识别的。
2007-10-12 09:33
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
下载个最新的Windows SDK吧
我的头文件是这样的
WINBASEAPI
BOOL
WINAPI
WriteProcessMemory(
    __in      HANDLE hProcess,
    __in      LPVOID lpBaseAddress,
    __in_bcount(nSize) LPCVOID lpBuffer,
    __in      SIZE_T nSize,
    __out_opt SIZE_T * lpNumberOfBytesWritten
    );
2007-10-12 09:35
0
雪    币: 256
活跃值: (788)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
用LPVOID是可以通过的.
另我试着修改winbase.h中的原型为LPCVOID,结果还是提示LPVOID,他包含的是kernel32.lib?有没有办法使他支持LPCVOID这个类型而使用最小的修改呢?
2007-10-12 10:41
0
雪    币: 256
活跃值: (788)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
如果我还是使用VC++6,有没有适合这个版本的SDK?在哪里下载?

现在最新的是vs.net 2008吧? .NET也是3.0了.
2007-10-12 10:43
0
雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
byte hexData[]
不要用byte
直接用char就可以了
2007-10-12 18:22
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你去下载最新的SDK(for XP/2k)应该是可以和VC6和睦相处的, 我用过很长一段时间2003的SDK和VC6,当时我的VC6是打了SP4的,SDK和编译器都是独立的
2007-10-12 20:20
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
原版的VC6:

WINBASEAPI
BOOL
WINAPI
WriteProcessMemory(
    HANDLE hProcess,
    LPVOID lpBaseAddress,
    LPVOID lpBuffer,
    DWORD nSize,
    LPDWORD lpNumberOfBytesWritten
    );

2003年2月SDK已经修正:

WINBASEAPI
BOOL
WINAPI
WriteProcessMemory(
    IN HANDLE hProcess,
    IN LPVOID lpBaseAddress,
    IN LPCVOID lpBuffer,
    IN SIZE_T nSize,
    OUT SIZE_T * lpNumberOfBytesWritten
    );

以前也发现过一个bug:

原版的VC6:

BOOLAPI
GetUrlCacheEntryInfoW(
    IN LPCSTR lpszUrlName,
    OUT LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
    IN OUT LPDWORD lpdwCacheEntryInfoBufferSize
    );

2003年2月SDK已经修正:

URLCACHEAPI_(BOOL) GetUrlCacheEntryInfoW(
    IN LPCWSTR lpszUrlName,
    OUT LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
    IN OUT LPDWORD lpdwCacheEntryInfoBufferSize
    );
2007-10-13 12:34
0
雪    币: 256
活跃值: (788)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
找到一个地址:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm

不知这个是不是可以,大家给推荐一个链接吧
2007-10-13 17:42
0
游客
登录 | 注册 方可回帖
返回
//