笔记函数 - 判断内存是否有效
生活随笔
收集整理的這篇文章主要介紹了
笔记函数 - 判断内存是否有效
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 // 判斷內存是否有效.cpp : 定義控制臺應用程序的入口點。
2 //
3
4 #include "stdafx.h"
5 #include <windows.h>
6 #include <iostream>
7
8 using namespace std;
9
10 #define PAGE_EXECUTE_FLAGES \
11 (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)
12
13 BOOL UMS_IsExecutableAddress(LPVOID VirtualAddress);
14
15
16 int main()
17 {
18
19 //判斷Message函數地址是否有效
20 if (UMS_IsExecutableAddress(MessageBox) == TRUE)
21 {
22 int a = 5;
23 }
24
25
26 return 0;
27 }
28
29
30
31
32 BOOL UMS_IsExecutableAddress(LPVOID VirtualAddress)
33 {
34 BOOL IsOk = FALSE;
35 MEMORY_BASIC_INFORMATION MemoryBasicInfo = { 0 };
36
37
38 VirtualQuery(VirtualAddress, &MemoryBasicInfo, sizeof(MEMORY_BASIC_INFORMATION));
39
40
41
42 if ((MemoryBasicInfo.State == MEM_COMMIT &&
43 (MemoryBasicInfo.Protect & PAGE_EXECUTE_FLAGES)))
44 {
45 IsOk = TRUE;
46 }
47 return IsOk;
48 }
49
50 /*
51 typedef struct _MEMORY_BASIC_INFORMATION {
52 PVOID BaseAddress; //查詢內存塊所占的第一個頁面基地址
53 PVOID AllocationBase; //內存塊所占的第一塊區域基地址,小于等于BaseAddress,
54 //也就是說BaseAddress一定包含在AllocationBase分配的范圍內
55 DWORD AllocationProtect; //區域被初次保留時賦予的保護屬性
56 SIZE_T RegionSize; //從BaseAddress開始,具有相同屬性的頁面的大小,
57 DWORD State; //頁面的狀態,有三種可能值:MEM_COMMIT、MEM_FREE和MEM_RESERVE,
58 //這個參數對我們來說是最重要的了,從中我們便可知指定內存頁面的狀態了
59 DWORD Protect; //頁面的屬性,其可能的取值與AllocationProtect相同
60 DWORD Type; //該內存塊的類型,有三種可能值:MEM_IMAGE、MEM_MAPPED和MEM_PRIVATE
61 } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
62 */
63
64 /*
65 MEM_COMMIT 0x1000:
66 為指定地址空間提交物理內存。這個函數初始化內在為零
67 試圖提交已提交的內存頁不會導致函數失敗。這意味著您可以在不確定當前頁的當前提交狀態的情況下提交一系列頁面。
68 如果尚未保留內存頁,則設置此值會導致函數同時保留并提交內存頁。
69
70 MEM_RESERVE 0x2000:
71 保留指定地址空間,不分配物理內存。
72 這樣可以阻止其他內存分配函數malloc和LocalAlloc等再使用已保留的內存范圍,直到它被被釋放。
73 當使用上面的VirtualAlloc函數保留了一段地止空間后,接下還你還可以繼續多次調用同樣的函數提交這段地址空間中的不同頁面。
74
75 MEM_RESET 0x80000:
76 表示,在所指定的內存范圍內的數據lpAddress的dwSize不再是利益。頁面不應該被讀出或寫入到分頁文件。然而,將再次使用的內存塊后,所以它不應該decommitted的 。這個值不能使用任何其他的價值 。
77 使用這個值并不保證范圍與經營MEM_RESET將包含零。如果你想的范圍包含零,decommit內存,然后將它重新作出 。
78 當您指定MEM_RESET,VirtualAlloc函數忽略值flProtect。但是,您仍然必須設置flProtect有效的值,比如,PAGE_NOACCESS。
79 如果你使用MEM_RESET的內存范圍映射到一個文件,VirtualAlloc返回一個錯誤。如果它被映射到分頁文件共享視圖是唯一可以接受的的 。
80
81
82 */
?
轉載于:https://www.cnblogs.com/1228073191Blog/p/7448439.html
總結
以上是生活随笔為你收集整理的笔记函数 - 判断内存是否有效的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: requsets模块和beautiful
- 下一篇: jvm锁