系统信息
操作系统的许多值是由系统所运行的主机决定的,如页面大小和分配粒度。使用GetSystemInfo可以获得与主机有关的值:
VOID GetSystemInfo(LPSYSTEM_INFO psi);
SYSTEM_INFO结构定义如下:
typedef struct _SYSTEM_INFO{
union{
struct {
WORD wProcessorArchitecture;
WORD wReserved;
}; }; DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOLID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessor;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
}SYSTEM_INFO,*LPSYSTEM_INFO; |
上述这么多成员只有四个与内存有关。
dwPageSize表示cpu页面大小在x86和x64机器中,该值为4K。
lpMinimumApplicationAddress给出进程中可用地址空间最小的内存地址。由于每个进程地址空间最开始的64K是闲置的,因此该值为64K。
lpMaximumApplicationAddress给出每个进程私有地址空间中最大的
可用内存地址。
dwAllocationGranularity表示用于预定地址空间区域的分配粒度
其他的成员稍微做下介绍:
wReserved为今后拓展保留,不要使用。
dwNumOfProcessor机器cpu的数量。
dwActiveProcessorMask位掩码,用来表示哪些cpu处于活动状态。可以用来运行线程。
dwProcessorType已经作废。不再使用。
wProcessorArchitecture表示处理器的体系结构。如x86,x64;
wProcessorLevel进一步细分处理器的体系结构,比如Intel奔腾2或奔腾4.
wProcessorRevision进一步对wProcessLevel进行细分。
//以下代码演示了可重置内存及以上介绍的各个函数的使用。
#include"windows.h" #include<iostream> #include"tchar.h" TCHAR TextData[]=TEXT("c:\Users\yangyang\documents\visual studio 2010\Projects\MEM_RESET\MEM_RESET\main.cppc:\Users\yangyang\documents\visual studio 2010\Projects\MEM_RESET\MEM_RESET\main.cpp"); int main(int argc,char**argv) { PTSTR pszData=(PTSTR)VirtualAlloc(NULL,1024,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); if(pszData==NULL) { MessageBox(NULL,TEXT("分配失败"),TEXT(""),MB_OK); } _tcscpy_s(pszData,1024,TextData); int ret=MessageBox(NULL,TEXT("以后是否还要访问该段内存?"),TEXT(""),MB_YESNO); if(ret==IDNO) { MEMORY_BASIC_INFORMATION mbi; VirtualQuery(pszData,&mbi,sizeof(mbi)); VirtualAlloc(pszData,mbi.RegionSize,MEM_RESET,PAGE_READWRITE); }
MEMORYSTATUS mst; GlobalMemoryStatus(&mst); PVOID pvAddress=VirtualAlloc(NULL,mst.dwAvailVirtual,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); if(pvAddress) { ZeroMemory(pvAddress,mst.dwAvailVirtual); } if(!_tcscmp(TextData,pszData)) { MessageBox(NULL,TEXT("已经保存!"),TEXT(""),MB_YESNO); } else { MessageBox(NULL,TEXT("未保存!"),TEXT(""),MB_YESNO); } getchar(); VirtualFree(pvAddress,0,MEM_RELEASE); VirtualFree(pszData,0,MEM_RELEASE); return 0; } |
相关链接:
《Windows核心编程系列》谈谈Windows钩子
《Windows核心编程系列》谈谈内核对象及句柄的本质
《Windows核心编程系列》谈谈基址重定位和模块绑定
《Windows核心编程系列》谈谈修改导入段拦截API
《Windows核心编程系列》谈谈进程的建立和终止
《Windows核心编程系列》谈谈内存映射文件
《Windows核心编程系列》谈谈用户模式下的线程同步