恶意软件开发——内存相关API (2)

4.LocalAlloc
该函数用于从局部堆中分配内存供程序使用,函数原型为:

HLOCAL LocalAlloc( UINT uFlags, //指定怎样去分配内存 UINT uBytes, //指定要分配的字节数 );

参数说明:
1.uFlags,指定怎样去分配内存。如果zero被指定,默认的是LMEM_FIXED标志。此参数有三种标志:LMEM_FIXED(分配固定内存,返回值是指向一个内存对象的指针),LMEM_ZEROINIT(初始化内存内容为zero),LPTR(结合了LMEM_FIXED和LMEM_ZEROINIT这两种标志),LMEM_MOVEABLE(分配可移动内存),LMEM_DISCARDABLE(分配可删除的内存)。
2.uBytes,指定要分配的字节数。
小结:
在16位Windows中是有区别的,因为在16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局 堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。而 LocalAlloc/GlobalAlloc就是分别用于在局部堆或全局堆中分配内存。
由于每个进程的局部堆很小,所以在局部堆中分配内存会受到空间的限制。但这个堆是每个进程私有的,相对而言分配数据较安全,数据访问出错不至于影响到整个系统。
而在全局堆中分配的内存是为各个进程共享的,每个进程只要拥有这个内存块的句柄都可以访问这块内存,但是每个全局内存空间需要额外的内存开销,造成分配浪费。而且一旦发生严重错误,可能会影响到整个系统的稳定。
不过在Win32中,每个进程都只拥有一个省缺的私有堆,它只能被当前进程访问。应用程序也不可能直接访问系统内存。所以在Win32中全局堆和局部堆都 指向进程的省缺堆。用LocalAlloc/GlobalAlloc分配内存没有任何区别。甚至LocalAlloc分配的内存可以被 GlobalFree释放掉。所以在Win32下编程,无需注意Local和Global的区别,一般的内存分配都等效于 HeapAlloc(GetProcessHeap(),...)。
LocalAlloc对应的释放函数为LockFree。

5.Malloc
malloc与free是C++/C语言的标准库函数,可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用 malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是 库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

6.New
是C++的运算符,主要用来新建类,与C++的构造函数和异常机制有关,与上述其它函数的使用环境大相庭径。一般编译器中的new都是用malloc来分配内存的。
New对应的释放函数为delete。

三、拷贝/复制内存函数

1.memcpy
函数原型:
void *memcpy(void *destin, void *source, unsigned n);
参数:

destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

source-- 指向要复制的数据源,类型强制转换为 void* 指针。

n-- 要被复制的字节数。

2.CopyMemory
函数原型:

VOID CopyMemory( PVOID Destination, CONST VOID *Source, SIZE_T Length );

参数:

Destination-- 要复制内存块的目的地址。

Source-- 要复制内存块的源地址。

Length-- 指定要复制内存块的大小,单位为字节

3.RtlCopyMemory
CopyMemory一样
函数原型:

void RtlCopyMemory( void* Destination, const void* Source, size_t Length );

参数:

Destination-- 要复制内存块的目的地址。

Source-- 要复制内存块的源地址。

Length-- 指定要复制内存块的大小,单位为字节

4.RtlMoveMemory
函数原型:

VOID RtlMoveMemory( VOID UNALIGNED *Destination, const VOID UNALIGNED *Source, SIZE_T Length );

参数:
Destination-- 指向移动目的地址的指针。
Source-- 指向要复制的内存地址的指针。
Length-- 指定要复制的字节数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysxyf.html