• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            VirtualQueryEx描述,涉及內存管理的flag

            函數功能描述:查詢地址空間中內存地址的信息。

            函數原型:

            DWORD VirtualQueryEx( HANDLE hProcess, LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, DWORD dwLength );

            參數:
                hProcess   
            進程句柄。
                LpAddress  
            查詢內存的地址。
                LpBuffer   
            指向MEMORY_BASIC_INFORMATION結構的指針,用于接收內存信息。
                DwLength    MEMORY_BASIC_INFORMATION
            結構的大小。

            返回值:
               
            函數寫入lpBuffer的字節數,如果不等于sizeof(MEMORY_BASIC_INFORMATION)表示失敗。

            備注:
                MEMORY_BASIC_INFORMATION
            WinNT.h中定義如下:
                    typedef struct _MEMORY_BASIC_INFORMATION {
                        PVOID BaseAddress;       //
            區域基地址。
                        PVOID AllocationBase;    //
            分配基地址。
                        DWORD AllocationProtect; //
            區域被初次保留時賦予的保護屬性。
                        SIZE_T RegionSize;       //
            區域大小(以字節為計量單位)。
                        DWORD State;             //
            狀態(MEM_FREEMEM_RESERVE MEM_COMMIT)。
                        DWORD Protect;           //
            保護屬性。
                        DWORD Type;              //
            類型。
                    } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

            成員解釋:

                BaseAddress                   
            LpAddress參數的值相同,但是四舍五入為頁面的邊界值。

                AllocationBase                
            指明用VirtualAlloc函數分配內存區域的基地址。LpAddress
                                              
            在該區域之內。

                AllocationProtect             
            指明該地址空間區域被初次保留時賦予該區域的保護屬性。

                    PAGE_READONLY             
            只讀屬性,如果試圖進行寫操作,將引發訪問違規。如果系統
                                              
            區分只讀、執行兩種屬性,那么試圖在該區域執行代碼也將引
                                              
            發訪問違規。

                    PAGE_READWRITE            
            允許讀寫。

                    PAGE_EXECUTE              
            只允許執行代碼,對該區域試圖進行讀寫操作將引發訪問違規。

                    PAGE_EXECUTE_READ         
            允許執行和讀取。

                    PAGE_EXECUTE_READWRITE    
            允許讀寫和執行代碼。

                    PAGE_EXECUTE_WRITECOPY    
            對于該地址空間的區域,不管執行什么操作,都不會引發訪問違
                                              
            規。如果試圖在該頁面上的內存中進行寫入操作,就會將它自己
                                              
            的私有頁面(受頁文件的支持)拷貝賦予該進程。

                    PAGE_GUARD                
            在頁面上寫入一個字節時使應用程序收到一個通知(通過一個異
                                              
            常條件)。該標志有一些非常巧妙的用法。Windows 2000在創建
                                              
            線程堆棧時使用該標志。

                    PAGE_NOACCESS             
            禁止一切訪問。

                    PAGE_NOCACHE              
            停用已提交頁面的高速緩存。一般情況下最好不要使用該標志,
                                              
            因為它主要是供需要處理內存緩沖區的硬件設備驅動程序的開發
                                              
            人員使用的。

                RegionSize                    
            用于指明內存塊從基地址即BaseAddress開始的所有頁面的大
                                              
            小(以字節為計量單位)這些頁面與含有用LpAddress參數設
                                              
            定的地址的頁面擁有相同的保護屬性、狀態和類型。

                State                         
            用于指明所有相鄰頁面的狀態。

                    MEM_COMMIT                
            指明已分配物理內存或者系統頁文件。

                    MEM_FREE                  
            空閑狀態。該區域的虛擬地址不受任何內存的支持。該地址空間沒
                                              
            有被保留。改狀態下AllocationBaseAllocationProtectProtect
                                              
            Type等成員均未定義。

                    MEM_RESERVE               
            指明頁面被保留,但是沒有分配任何物理內存。該狀態下Protect
                                              
            員未定。

                Protect                       
            用于指明所有相鄰頁面(內存塊)的保護屬性。這些頁面與含有
                                              
            擁有相同的保屬性、狀態和類型。意義同AllocationProtect

                Type                          
            用于指明支持所有相鄰頁面的物理存儲器的類型(MEM_IMAGE
                                               MEM_MAPPED
            MEM_PRIVATE)。這些相鄰頁面擁有相同的保護屬
                                              
            性、狀態和類型。如果是Windows 98,那么這個成員將總是
                                               MEM_PRIVATE


                    MEM_IMAGE                
            指明該區域的虛擬地址原先受內存映射的映像文件(如.exeDLL
                                             
            文件)的支持,但也許不再受映像文件的支持。例如,當寫入模塊
                                             
            映像中的全局變量時,寫入時拷貝的機制將由頁文件來支持特
                                             
            定的頁面,而不是受原始映像文件的支持。

                    MEM_MAPPED               
            該區域的虛擬地址原先是受內存映射的數據文件的支持,但也許不
                                             
            再受數據文件的支持。例如,數據文件可以使用寫入時拷貝
                                             
            保護屬性來映射。對文件的任何寫入操作都將導致頁文件而不是原
                                             
            始數據支持特定的頁面。

                    MEM_PRIVATE              
            指明該內存區域是私有的。不被其他進程共享。


            #include "stdafx.h"
            #include <windows.h>
            #include <TCHAR.H>

            BOOL ShowProcMemInfo(DWORD dwPID);

            int _tmain(int argc, char* argv[])
            {
               ShowProcMemInfo( GetCurrentProcessId() );
               return 0;
            }


            //
            顯示一個進程的內存狀態 dwPID為進程ID
            BOOL ShowProcMemInfo(DWORD dwPID)
            {
               HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
                                      FALSE,
                                      dwPID);
               if(hProcess == NULL)
                  return FALSE;
               MEMORY_BASIC_INFORMATION mbi;
               PBYTE pAddress = NULL;
               TCHAR szInfo[200] = _T("BaseAddr     Size        Type        State         Protect \n");
               _tprintf(szInfo);

               while(TRUE)
               {
                  if(VirtualQueryEx(hProcess, pAddress, &mbi, sizeof(mbi)) != sizeof(mbi))
                  {
                     break;
                  }
                  if((mbi.AllocationBase != mbi.BaseAddress) && (mbi.State != MEM_FREE))
                  {
                     _stprintf(szInfo, _T("  %08X  %8dK  "),
                          mbi.BaseAddress,
                          mbi.RegionSize>>10);
                  }
                  else
                  {
                     _stprintf(szInfo, _T("%08X    %8dK  "),
                          mbi.BaseAddress,
                          mbi.RegionSize>>10);
                  }
                  PCTSTR pStr = _T("");
                  switch(mbi.Type)
                  {
                  case MEM_IMAGE:      pStr = _T("MEM_IMAGE  "); break;
                  case MEM_MAPPED:   pStr = _T("MEM_MAPPED "); break;
                  case MEM_PRIVATE:   pStr = _T("MEM_PRIVATE"); break;
                  default:         pStr = _T("-----------"); break;
                  }
                  _tcscat(szInfo, pStr);
                  _tcscat(szInfo, _T("  "));

                  switch(mbi.State)
                  {
                  case MEM_COMMIT:   pStr = _T("MEM_COMMIT "); break;
                  case MEM_RESERVE:   pStr = _T("MEM_RESERVE"); break;
                  case MEM_FREE:      pStr = _T("MEM_FREE   "); break;
                  default:         pStr = _T("-----------"); break;
                  }
                  _tcscat(szInfo, pStr);
                  _tcscat(szInfo, _T("  "));

                  switch(mbi.AllocationProtect)
                  {
                  case PAGE_READONLY:            pStr = _T("PAGE_READONLY         "); break;  
                  case PAGE_READWRITE:         pStr = _T("PAGE_READWRITE        "); break;  
                  case PAGE_WRITECOPY:         pStr = _T("PAGE_WRITECOPY        "); break;  
                  case PAGE_EXECUTE:            pStr = _T("PAGE_EXECUTE          "); break;  
                  case PAGE_EXECUTE_READ:         pStr = _T("PAGE_EXECUTE_READ     "); break;  
                  case PAGE_EXECUTE_READWRITE:   pStr = _T("PAGE_EXECUTE_READWRITE"); break;  
                  case PAGE_EXECUTE_WRITECOPY:   pStr = _T("PAGE_EXECUTE_WRITECOPY"); break;  
                  case PAGE_GUARD:            pStr = _T("PAGE_GUARD            "); break;  
                  case PAGE_NOACCESS:            pStr = _T("PAGE_NOACCESS         "); break;  
                  case PAGE_NOCACHE:            pStr = _T("PAGE_NOCACHE          "); break;  
                  default:                  pStr = _T("----------------------"); break;
                  }
                  _tcscat(szInfo, pStr);
                  _tcscat(szInfo, _T("\n"));
                  _tprintf(szInfo);

                  pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);
               }
               CloseHandle(hProcess);
               return TRUE;
            }

            posted on 2009-03-12 15:40 肥仔 閱讀(1126) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發

            99热精品久久只有精品| 久久这里只精品99re66| 99国产精品久久久久久久成人热| 97精品伊人久久大香线蕉| 久久棈精品久久久久久噜噜| 久久精品a亚洲国产v高清不卡| 国产国产成人精品久久| 亚洲国产成人精品无码久久久久久综合 | 久久久久人妻精品一区| 色综合色天天久久婷婷基地| 久久综合五月丁香久久激情| 久久婷婷激情综合色综合俺也去| 国产精品久久久久影院色| 久久久久国产精品嫩草影院| 亚洲国产精品无码成人片久久| 国产免费久久精品99久久| 亚洲中文字幕久久精品无码喷水| 久久99国产精品一区二区| 欧美日韩久久中文字幕| 国内精品伊人久久久久影院对白| 色婷婷综合久久久久中文一区二区| 91久久精品无码一区二区毛片| 欧美va久久久噜噜噜久久| 中文成人无码精品久久久不卡 | 久久99精品久久久久久噜噜| 亚洲香蕉网久久综合影视| 日本国产精品久久| 国产叼嘿久久精品久久| 色综合久久久久无码专区| 久久久久亚洲AV成人网人人网站| 精品久久久久久无码人妻热| 99精品国产在热久久| 少妇精品久久久一区二区三区| 久久久久99精品成人片牛牛影视| 亚洲国产精品婷婷久久| 精品999久久久久久中文字幕| 久久国产免费观看精品3| 久久精品麻豆日日躁夜夜躁| 日韩人妻无码一区二区三区久久| 日日狠狠久久偷偷色综合96蜜桃| 人妻精品久久久久中文字幕|