您的位置:首页 > 移动开发

Some tips from Inject Lib sample application

2005-02-19 10:46 543 查看
1. 有时候我们书写的工具函数会有ANSI和UNICODE两个版本分别与相应ANSI或者UNICODE版本的Windows API配合使用。这种不同的编码版本其实是对于函数的"字符串参数"的编码方式来区分。在Windows2000以上的版本中系统都是使用UNICODE来处理的,所以我们通常是在ANSI版本的函数里面将"字符串参数"转换成UNICODE然后调用UNICODE版本就行了(模仿Windows的做法)。而且在UNICODE版本里面调用函数的时候并不需要显式调用UNICODE的Windows API,因为编译器会自动根据是否有UNICODE定义来选择Windows API函数的版本的。

注意:如果我们使用GetProcAddress API,我们应该总是使用特定的ANSI或者UNICODE版本,因为这两个是真正存在于系统DLL中的API函数。(所以这种情况也通常需要我们的函数分成两个版本来实现)

2. 在调用VirtualAllocEx和malloc等函数来分配字符串空间的时候,都应该分配字符串长度加1(可能加2,若为UNICODE),这个多出来的字符是为'0'(L'0')准备的。

3. VirtualQuery调用的结果如果State为MEM_FREE,则MEMORY_BASIC_INFORMATION.AllocationBase将会是0,这点要特别注意,最好使用

if(mbi.State==MEM_FREE)

{

 mbi.AllocationBase=mbi.BaseAddress;

}

来进行改变。

我们还可以通过mbi.AllocationBase是否等于mbi.BaseAddress来判断当前查询的地址是否在这个Region中的第一个Block中。

4. Tips from Image Walker dll:

因为一个Module的Handle其实就是这个模块的首地址,所以我们可以通过将一个模块的首地址强转成HINSTANCE类型然后传递给GetModuleFileName来获取此模块所对应的文件路径。

若传入的地址并不是一个模块的首地址,这个函数并不会失败,而只是返回的植为0。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: