當前位置:編程學習大全網 - 源碼下載 - C語言,如何實現搜索內存數據

C語言,如何實現搜索內存數據

壹般的講,內存裏邊雖然說有*G的空間,但有些地方只是掛名存在,實際上是不存在的,所以訪問了就會出錯,所以就要判斷內存是不是為有效地址,

就要用到VirtualQuery獲取指定內存屬性, 根據屬性來判斷能不能進行讀取,

如果能讀取就從調用VirtualQuery中得到的內存信息minfo中獲取當前內存地址的有效區域的大小,然後再進行讀取. 妳可以用VC調試來看看,不能訪問的內存就用?號來表示.由於搜所內存是壹種運算量龐大的工作,所以,在對比處理要作速度優化處理. 如果數據大於4字節,請用 long 的數據格式來作對比運算, long 是 char 的處理速度的三倍以上,(個人測試的) 用long處理前端數據,再用 char 作收尾工作. 這是對比處理了.流程就有以下:

判斷地址的有效性->定好搜所範圍->進行對比->輸出結果.

StartAdd 開始地址

EndAdd 結束地址

Data 查找的數據

DataSize 數據大小

void *FindMemory(DWORD StartAdd,DWORD EndAdd,void *Data,DWORD DataSize)

{

MEMORY_BASIC_INFORMATION minfo;

DWORD rt;

while(StartAdd<EndAdd)

{

::VirtualQuery((void*)StartAdd,&minfo,sizeof(MEMORY_BASIC_INFORMATION));

if(minfo.AllocationProtect)

if(minfo.State==MEM_COMMIT||minfo.State==MEM_FREE)

{

char *s=(char*)StartAdd,*e=s+minfo.RegionSize;

for(;s<e&&s+DataSize<=e;s++)

if(memcmp(s,Data,DataSize)==0)

return s;

}

StartAdd=(DWORD)minfo.BaseAddress+minfo.RegionSize;

}

return 0;

}

  • 上一篇:50大風源代碼
  • 下一篇:C語言中移位運算
  • copyright 2024編程學習大全網