       

      6 

    D    ,     , 
          . 
           
^32-,        
      . 

      

     ,  Win32   ,  ,  
    Win32.   (    
 )   GetSystemInfo: 

    VOID GetSystemInfo(LPSYSTEM_INFO IpSystemInfo): 

        GetSystemInfo   SYSTEM_INFO,   
   : 

    typedef struct _SYSTEM_INFO { union { 
    DWORD dwOemId:   //     struct { 
    WORD wProcessorArchitecture; 
    WORD wReserved: 
    DWORD dwPageSize: 
    LPVOID IpMinimumApplicationAddress; 
    LPVOID IpMaximumApplicationAddress; 
    DWORD dwActiveProcessorMask; 
    DWORD dwNurnberOfProcessors: 
    DWORD dwProcessorType: 
    DWORD dwAllocationGranularity; 
    WORD wProcessorLevel; 
    WORD wProcessorRevision; 
    } SYSTEM_INFO, *LPSYSTEM_INFO; 

           ;  
    .  GetSystemInfo  
  ,       .   
       .    
 : 

    105 

    106 _______________________________Windows   

                       

    dwPageSize    .   xS6, 
MIPS  PowerPC    4096,    Alpha  8192 . 
    IpMinimumApplicationAddress      
   .  Windows 95    4 194 304, 
 000400000,   4      
.  Windows NT    65 536,  000010000,    
     64     
. 
   IpMaximumApplicationAddress     
 ,      .  
Windows 95    2 147 483 647,  Ox7FFFFFFF,    2 
   ,   ,     
.  Windows NT     2 147418 111,  Ox7FFEFFFF, 
        64   
 2 . 
   dwAllocationGranularity       
.        64    
 Win32. 

    - Syslnfo 

    Syslnfo (SYSINFO.EXE) (.   . 6-1)    
;    GetSystemInfo     , 
   SYSTEM_INFO.       
    SYSINFO  -,   . 
      Syslnfo   
  : 

    Processor Architecture:                    Intel 
    Processor level:                 Pentium 
    Processor revision:               [unknown] 
    Number of processors:                       1 
    Active processor mask:             000000001 
    Allocation granularity:                   65.536 
    Page size:                    4.096 
    Minimum app. address:               4.194.304 
    Maximum app. address:           2.147.483.647 


    ________________________________I  Windows 95   Intel x86 
    

    Processor Architecture:                     Intel 
    Processor level:                  Pentium 
    Processor revision:       Model 2. Stepping 4 
    Number of processors:                        2 
    Active processor mask:               000000003 
    Allocation granularity:                   65,536 
    Page size:                    4.096 
    Minimum app. address:                   65,536 
    Maximum app. address:             2.147.41.1 

    ________________________________I Windows NT   Intel x86 



    ___________________ 6.    107 


    Processor Architecture:                    MIPS 
    Processor level:                   R4000 
    Processor revision:                      34 
    Number of processors:                       1 
    Active processor mask:              000000001 
    Allocation granularity:                   65,536 
    Page size:                    4.096 
    Minimum app. address:                   65,536 
    Maximum app. address:             2,147.418,111 

    _________________________________I Windows NT   MIPS R4000 

    Processor Architecture:                   Alpha 
    Processor level:                   21064 
    Processor revision:          Model A. Pass 3 
    Number of processors:                        1 
    Active processor mask:               000000001 
    Allocation granularity:                   65,536 
    Page size:                    8.192 
    Minimum app. address:                   65.536 
    
    Maximum app. address:             2,147.418.111 

    ________________________I Windows NT   DEC Alpha 
    
    Processor Architecture:                 PowerPC 
    Processor level:                     601 
    Processor revision:                      0,2 
    Number of processors:                        1 
    Active processor mask:               000000001 
    Allocation granularity:                   65.536 
    Page size:                    4.096 
    Minimum app. address:                   65,536 
    Maximum app. address:             2,147,418,111 

    ________________________________I Windows NT   PowerPC 

    SYSINFO.C 
    ; SysInfo.C 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    ftinclude ", . \CinnHdr, H"                 /* .   */ 
    ftinclude <windows,h> 
    ftinclude <windowsx.h> 
    ftinclude <tchar.h> 
    ffinclude <stdio.h> 
    ffinclude "Resource.H" 

    . 6-1.  . Syslnfo 


    108 ____________________________Windows   


    . 6-1 () 

    / I  TRUE,     Windows 95 
    BOOL g_fWin95IsHost = FALSE; 
    ///////////////////////////// 
    // 3id  1      , 
    //      
    LPTSTR BigNumToString (LONG INum, LPTSTR szBuf) { 
    WORD wNumDigits = 0. wNumChars = 0; 
    do { 
    //         
    szBuf[wNumChars++] = (TCHAR) (INum % 10 + __(0')); 
    
    //   ,    
    wNumDigits++; 
    //   ,   ,   
    if (wNumDigits % 3 == 0) 
    szBuf[wNumChars++] = __(','): 
    //    10    
    INum /= 10; 
    //     ,      
    } while (INum != 0); 
    //   ,   , - , 
    //   
    if (szBuf[wNumChars - 1] == __(',')) 
    szBuf[wNumChars - 1] = 0; 
    //     
    szBuf[wNumChars] = 0: 
    //          -  
    //    
    _tcsrev(szBuf); 
    //   .    ,    
    //  .   ,    
    //  ,   . 
    return(szBuf); 
    /////////////////////////////////////////////////////////////////////////////// 

    . . . 


     6.    109 


    . 6-1 () 

    void ShowCPUInfo (HWND hwnd, WORD wProcessorArchitecture, 
    WORD wProcessorLevel, WORD wProcessorRevision) { 
    TCHAR szCPUArch[64]; 
    TCHAR szCPULevel[64]; 
    TCHAR szCPURev[64]: 
    szCPULevel[0] = 0; 
    szCPURev[0] = 0; 
    switch (wProcessorArchitecture) { 
    case PROCESSOR_ARCHITECTURE_INTEL: 
    lstrcpy(szCPUArch, __TEXT("Intel")); 
    switch (wProcessorLevel) { 
    case 3: case 4: 
    wsprintf(szCPULevel, __TEXT("80%c86"), wProcessorLevel + '0'); 
    if (!g_fWin95IsHost) 
    wsprintf(szCPURev, __TEXT("%c%d"), 
    HIBYTE(wProcessorRevision) + __TEXT('A'), 
    LOBYTE(wProcessorRevision)): 
    else 
    lstrcpy(szCPURev, __TEXT("(unknown)")); 
    break; 
    case 5: 
    wsprintf(szCPIJLevel, __TEXT(" Pentium")): 
    if Ug_fWin95IsHost) 
    wsprintf(szCPURev, 
    
    __TEXT("Model %d, Stepping %d"), 
    HIBYTE(wProcessorRevision), 
    LOBYTE(wProcessorRevision)); 
    else 
    1st rcpy(szCPURev, __TEXT("(unknown)")): 
    break; 
    } 
    break; 
    case PROCESSOR_ARCHITECTURE_MIPS: 
    lstrcpy(szCPUArch, __TEXT("MIPS")); 
    wsprintf(szCPULevel, __TEXT("R%04d"), LOBYTE(wProcessorLevel) * 1000): 
    wsprintf(szCPURev, __TEXT("%d"), LOBYTE(wProcessorRevision)); 
    break; 
    case PROCESSOR_ARCHITECTURE_ALPHA: 
    1st rcpy(szCPUArch, __TEXT("Alpha")); 
    wsprintf(szCPULevel, __TEXT("%d"), wProcessorLevel): 
    wsprintf(szGPURev, __TEXT("Model %c, Pass %d"), 
    HIBYTE(wProcessorRevision) + __TEXT('A'). 
    LOBYTE(wProcessorRevision)); 
    break; 

    . . . 

    110 _______________________________Windows   


    . 6-1 () 

    case PROCESSOR_ARCHITECTURE_PPC: 
    lstrcpy(szCPUArch. __TEXT("PowerPC")); 
    switch (wProcessorLevel) { 
    case 1: case 3: case 4; case 20: 
    wsprintf(szCPULevel, __TEXT("%d"), 600 + wProcessorLevel): 
    break; 
    case 6: 
    wsprintf(szCPULevel, __TEXT("603+"), wProcessorLevel); 
    break; 
    case 9: 
    wsprintf(szCPULevel, __TEXT("604+"), wProcessorLevel); 
    break; 
    wsprintf(szCPURev, __TEXT("%d.%d"), 
    HIBYTE(wProcessorRevision), 
    LOBYTE(wProcessorRevision)); 
    break; 
    case PROCESSOR_ARCHITECTURE_UNKNOWN: 
    default: 
    wsprintf(szCPUArch. __TEXT("Unknown")); 
    break; 
    i / 
    SetDlgItemText(hwnd, IDC_PROCARCH,  szCPUArch);. 
    SetDlgItemText(hwnd, IDC_PROCLEVEL, szCPULevel); 
    SetDlgItemText(hwnd, IDC_PROCREV,   szCPURev); 
    ////////////////////// 
    BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    TCHAR szBuf[50]; 
    SYSTEM_INFO sinf: 
    //      
    chSETDLGICONS(hwnd, IDI_SYSINFO, IDI_SYSINFO): 
    GetSystemInfo(&sinf); 
    if (g_fWin95IsHost) { 
    sinf.wProcessorLevel = (WORD) (sinf.dwProcessorType / 100); 
    i / 
    ShowCPUInfo(hwnd, sinf.wProcessorArchitecture, 
    sinf.wProcessorLevel, sinf.wProcessorRevision); 
    SetDlgItemText(hwnd, IDC_PAGESIZE, 
    BigNumToString(sinf.dwPageSize, szBuf)); 
    . . . 


    ___________________ 6.    111 


    . 6-1 () 
    SetDlgItemText(hwnd, IDC_MINAPPADDR, 
    BigNumToString((LONG) sinf.IpMinimumAppllcationAddress, szBuf)): 
    SetDlgItemText(hwnd, IDC_MAXAPPADDR, 
    BigNumToString((LONG) sinf. IpMaxirnumApplicationAddress, szBuf)): 
    _stprlntf(szBuf, __TEXT("Ox%08X"), sinf.dwActiveProcessorMask); 
    SetDlgItemText(hwnd, IDC_ACTIVEPROCMASK, szBuf); 
    SetDlgItemText(hwnd, IDC_NUMOFPROCS, 
    BigNumToString(sinf.dwNumberOfProcessors, szBuf)); 
    SetDlgIteniText(hwnd, IDC_ALLOGGRAN, 
    BigNumToString(sinf.dwAllocationGranularity, szBuf)); 
    return(TRUE); 
    /////////////////////////////////////////////////////////////////////////////// 
    void Dig^OnCommand (HWND hwnd. int id, HWND hwndCti, UINT codeNotify) { 
    switch (id) { 
    case IOCANCEL: 
    End0ialog(hwnd, id); 
    break; 
    /////////////////////////////////////////////////////////////////////////////// 
    BOOL CALLBACK Dlg_Proc (HWND hDlg. UINT uMsg, WPARAM wParam, LPARAM 
IParam) { 
    BOOL fProcessed = TRUE; 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog); 
    chHANDLE_DLGMSG(hDlg, WM_COMMAND, Dlg_OnCommand); 
    default: 
    fProcessed = FALSE; 
    break; 
    } 
    return(fProcessed); 
    } 
    /////////////////////////////////////////////////////////////////////////////// 
    . . . 


    112 ______________________________Windows   


    . 6-1 () 

    int WINAPI tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    OSVERSIONINFO osvi; 
    chWARNIFUNICODEUNDERWIN95(); 
    osvi.dwOSVersionInfoSize = sizeof(osvi): 
    GetVersionEx(&osvi); 
    g_fWin95IsHost = (osvi,dwPlatformId == VER_PLATFORM_WIN32_WINDOWS); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDO_SYSINFO), NULL, Dlg_Proc); 
    return(O); 
    1111111111111111111/111/1111'/   ///////////////////////////////// 


       

    32- GhbalMemoryStatus     : 

    VOID GlobalMemoryStatusCLPMEMORYSTATUS IpmstMemStat); 

      ,    ;  GhbalMemoryStatus 
,   -        
 16- Windows.   Win32   ,     
    GhbalAlloc     
 16- Windows  Win32.  ,     
 GhbalMemoryStatus -  , VirtualMemoryStatus. 
      GlobalMemoryStatus       
MEMORYSTATUS.   : 

    typedef struct J1EMORYSTATUS { 
    DWORD dwLength; 
    DWORD dwMemoryLoad; 
    DWORD dwTotalPhys; 
    DWORD dwAvailPhys; 
    DWORD dwTotalPageFile; 
    DWORD dwAvailPageFile; 
    DWORD dwTotalVirtual; 
    DWORD dwAvallVirtual; 
    } MEMORYSTATUS, *LPMEMORYSTATUS; 

      GlobalMemoryStatus     dwLength  
  , . . sizeof (MEMORYSTATUS).     
        Win32 API,  
  .   GlobalMemoryStatus 
      . 
        ,  
  - VMStat. 

    ___________________ 6.    113 


    - VMStat 

    VMStat (VMSTAT.EXE) (.   . 6-2)     
    GlobalMemoryStatus.     
 ,   VMStat       
.           
VMSTAT  -,   .      
 VMStat    Windows NT     Intel 
Pentium  32   : 

    Memory load:             83 
    TotalPhys:       32,956,' 
    AvailPhys:         1.1-')2.78'1 
    TotalPageFile:    7.50.744 
    AvailPageFile:    33.816.576 
    TotalVirtual:    2.1'17.352.576 
    AvailVirtual:    2.131.615.744 

     dwMemoryLoad (  Memory Load)  , 
    .       
    100.  Windows 95  Windows NT ,   
 , .  ,       
    . ,  ,  
      . 
     dwTotalPhys (  TotalPhys)    
 ()   .   Pentium-  32  
     32 956 416,   598 016  
 32 . ,   GlobalMemoryStatus     32 
,   ,        
 ,   .   dwAvailPhys ( 
 AvailPhys)      . 
     dwTotalPageFile (  TotalPageFile)  
  ,       
()    ().  VMStat ,    
   57 503 744 ,     
  .  dwAvailPageFile (  AvailPageFile) 
,     33816576      
     . 
     dwTotalVirtual (  TotalVirtual)   
 ,      . 
 2 147 352 576   128   2 .    
    000000000  OxOOOOFFFF   Ox7FFFOOOO  
Ox7FFFFFFF         128 .  VMStat  
Windows 95,  ,       2 143 289 
344 (2    4 ).   4   - ,  Windows 
95     000000000  Ox003FFFFF (  4 ). 
    , , dwAvailVirtual (  AvailVirtual)   
 ,    ,  
GlobalMemoryStatus (       
    ,      ).   
 dwAvailVirtual        
   .      
  ,     VMStat 

    114 ______________________________Windows   

     2 131 615 744    .   
 dwTotalVirtual  dwAvailVirtual,   15 736 832  
    VMStat      
.  ,      
,     ,  . 

    VMSTAT.C 
    : VMStat. 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    ,,*,.,*****,**********,*,,.,*.....*.**....*...,,******,****,*...**.***.*,,/ 
    #include ", .\CninHdr, H"                  /* .   */ 
    ftinclude <windows.h> 
    include <windowsx.h> 
    #include <tchar.h> 
    #include "Resource.H" 
    /////////////////////////////////////////////////////////////////////////////// 
    define IDT_UPDATE 1 
    /////////////////////////////////////////////////////////////////////////////// 
    //         , 
    //      
    LPTSTR WINAPI BigNumToString (LONG INum, LPTSTR szBuf) { 
    WORD wNumDigits = 0, wNumChars = 0; 
    do { 
    //         
    szBuf[wNumChars++] = (TCHAR) (INum % 10 + __(0')); 
    //   ,    
    wNumDigits++; 
    //   ,   ,   
    if (wNumDigits % 3 == 0) 
    szBuf[wNumChars++] = __(','); 
    //    10    
    INum /= 10: 
    //     ,      
    } while (INum != 0); 
    //   ,   , - , 
    //   
    . .  

    . 6-2.   VMStat 


    ___________________ 6.    115 


    . 6-2, () 
    if (szBufLwNumChars - 1] == __(',')) 
    szBuf[wNumChars - 1] = 0; 
    //     
    szBuf[wNumChars] = 0; 
    //          -  
    //    
    _tcsrev(szBuf); 
    //   .    ,    
    //  .   ,    
    //  ,   . 
    return(szBuf); 
    ll/llllllllll/llll/ltll/l/l//lll/l!lllillllll/llll/ll/l///l/H/ll/lllllllllllll 
    BOOL Dlg_OnInitDialog (HWNO hwnd, HWND hwndFocus, LPARAM IParam) { 
    //      
    chSETDLGICONS(hwnd, IDI_VMSTAT, IDI_VMSTAT); 
    //   ,     
    SetTinier(hwnd. IDT_UPDATE, 1 * 1000, NULL): 
    //       
    FORWARD_WMJ"IMER(hwnd, IDTJJPDATE, SendMessage); 
    return(TRUE); 
    } 
    lll/lll|l|l|lllll/i^//i/^:/!/l/l^!:///l/i!i:ii/il/l/i///////!///i/i/!!/i/i^!/ 
    void Dlg_OnTimer(HWNO hwnd, UINT id) { 
    TCHAR szBuf[50]; 
    MEMORYSTATUS ms; 
    //      GlopalMemoryStatus, 
    //    dwLength   
    ms.dwLength = sizeof(ms); 
    GlobalMemoryStatus(&(ns); 
    SetDlgIternTextChwnd, IDC_MEMLOAD, 
    BigNumToString(ms.dwMemoryLoad, szBuf)); 
    SetDlgItemText(hwnd, IDC_TOTALPHYS, 
    BigNumToString(ms. dwTotalPhys, szBLif)); 
    . . . 

    116 _______________________________Windows   


    . 6~2 () 

    SetDlgItemTextChwnd, IDCJWAILPHYS. 
    BigNuniToString(ms.dwAvailPriys, szBuf)): 
    SetDlgIteniText(hwnd, IDC_TOTALPAGEFILE, 
    BigNumToString(ms. dwTotalPageFile, szBuf)); 
    SetDlgIteinText(hwnd, IDC_AVAILPAGEFILE, 
    BigNurnToString(ms.dwAvailPageFile, szBuf)): 
    SetDlgItefiiText(hwnd, IDC_TOTALVIRTUAL, 
    igNumToString(ms.dwTotalVirtual, szBuf)); 
    SetDlgItemText(hwnd, IDC_AVAILVIRTUAL, 
    igNumToString(ms.dwAva11 Virtual. szBuf)); 
    /////////////////////////////////////////////////////////////////////////////// 
    void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtI, UINT codeNotify) { 
    switch (id) { 
    case IDCANCEL: 
    KillTimer(hwnd, IDT_UPDATE); 
    EndDialog(hwnd, id); 
    break; 
    } 
    1 
    /////i//l^l/l/////!/i/!i^//l/://ll//lll/////l/l//l//lllii!//!/:/:/!!:i!:/::.;.; 
    BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM 
IParam) { 
    switch (uMsg) { 
    chHANDLE_OLGMSG(hwnd, WM_INITDIALOG, Dlg_OhInitDialog); 
    chHANDLE^DLGMSG(hwnd. WM_COMMAND.    01g_OnComfnand); 
    chHANDLE_DLGMSG(hwnd, WM_TIMER,      Dlg_OnTimer); 
    } return(FALSE): 
    } 
    /////////////////////////////////////////////////////////////////////////////// 
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    chWARNIFUNICODEUNDERWIN95(); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_VMSTAT), NULL, Dlg_Proc); 
    ;      return(O); 
    i 
    //////////////////////////////////   ///////////////////////////////// 


    ___________________ 6.    117 


        

     Win32  ,      
    : ,     .  
,     VMMap (  .  . 6-4)  
  ,       5.  
^32-  VirtualQuery. 

    DWORD VirtualQuery(LPVOID IpAddress. 
    PMEMORY_BASIC_INFORMATION IpBuffer, 
    DWORD dwLength); 

      VirtualQuery   (IpAddress)    
 ,       .  
IpBuffer     MEMORY_BASIC_INFORMATION,    
  .      WINNT.H : 

    typedef struct _MEMORY_BASIC_INFORMATION { 
    PVOID BaseAddress: 
    PVOID AllocationBase; 
    DWORD AllocationProtect; 
    DWORD RegionSize; 
    DWORD State; 
    DWORD Protect: 
    DWORD Type; 
    } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 

     dwLength    MEMORY_BASIC_INFORMATION. 
 VirtualQuery   ,   . 
     ,     IpAddress,   
     ,   
,    .      : 

            

    BaseAddress        ,    IpAddress,  
    ,   . 
    AllocationBase       ,    
,    IpAddress. 
    AllocationProtect   ,    
 . 
    RegionSize         ( )  , 
     BaseAddress      
,   ,   ,   ,   
 IpAddress. 
    State            (MEM_FREE, MEM_RESERVE  _1)  
     ,      ,   ,  
 ,   ,    IpAddress.  
 MEM_FREE,  AllocationBase, AllocationProtect, Protect  Type 
  .    MEM_RESERVE,  
    Protect. 
    Protect            (PAGE_*)   
,  
        ,   ,   , 
  ,    IpAddress. 
    . . . 


    118 ______________________________Windows   


     

            
    Type               (MEM_IMAGE, MEM_MAPPED 
 MEM_PRIVATE),    ,     
 ,   ,   ,   , 
   IpAddress.  Windows 95     MEM_PRIVATE. 

     VMQuery 

         Win32,    
VirtualQuery  .       ,  
,   VMMAP.EXE      , 
   .       
,      VirtualQuery,    
    ,    
MEMORY_BASIC_INFORMATION.       Windows NT 3.1 
SDK (    ),       
Win32    .  ,    ,   
-  ,   VirtualQuery   
MEMORY_BASIC_INFORMATION         
 . 
      ,   MEMORY_BASIC_INFORMATION     
,    .      
     , VirtualQuery  
.   ,   ,     
         -.  
          
     ,       , 
   . 
          ,    
    VMQuery. BOOL VMQuery(PVOID pvAddress, PVMQUERY pVMQ); 
    ,   VirtualQuery,    (pvAddress)   
,    (pVMQ)    ,   
.  VMQUERY (  )    : 

    typedef struct { 
    //    
    PVOID pvRgnBaseAddress; 
  
    DWORD dwRgnProtection;     // PAGE_* 
    DWORD dwRgnSize; 
    
    DWORD dwRgnStorage;        // MEM_*: Free, Image, Mapped, Private 
    DWORD dwRgnBlocks; 
    
    DWORD dwRgnGuardBlks;      //  > ,     
    BOOL fRgnIsAStack;        // TRUE,      
    
    //    
    PVOID pvBlkBaseAddress; 
    
    DWORD dwBlkProtection;     // PAGE_* 
    DWORD dwBlkSize; 
    
    DWORD dwBlkStorage;        //MEM_*: Free, Reserve, Image, Mapped, Private 
    } VMQUERY, *PVMQUERY; 


    ___________________ 6.    119 


       ,    VMQUERY    
,  MEMORY_BASIC_INFORMATION,   VirtualQuery. 
  (, )   :      ,  
     (     pvAddress). 
     : 

               

    pvRgnBaseAddress         
 ,  ,    pvAddress. 
    dwRgnProtection       ,     . 
    dwRgnSize            ( )  . 
    dwRgnStorage          ,   
  : MEM_FREE, MEMJMAGE, MEM_MAPPED  MEM_PRIVATE. 
 Windows 95    ,     
    MEM_FREE,  MEM_PRIVATE. 
    dwRgnBlocks               . 
    dwRgnGuardBlks           
 PAGE_GUARD.     0,  1.    1,  
      .  Windows 95   
  0. 
    fRgnIsAStack       ,       . 
     ,     
  ,     . 
    pvBlkBaseAddress       ,  , 
   pvAddress. 
    dwBlkProtection        ,  
,    pvAddress. 
    dwBlkSize               ( ), 
 ,    pvAddress. 
    dwBlkStorage           ,  , 
   pvAddress.    : MEM_FREE, 
MEM_RESERVE, MEMJMAGE, MEMJMAPPED  MEM_PRIVATE.  Windows 95   
    MEM_IMAGE  MEMJMAPPED. 
        , VMQuery, ,  
    (     
^VirtualQuery),  -      VirtualQuery. 
     ,     .  
    ,  VMQuery,  VirtualQuery. 
      VMQUERY.C (. . 6-3) ,     
 ,      VMQUERY. 
( VMQUERY.C  VMQUERY.H    VMMAP  -, 
  .)        
,      ,   
  . 


    120 -______________________________Windows   


    VMQUERY.C 
    : VMQuery.C : Copyright  1995-1997,   (Jeffrey Richter) 
    flinclude "..\CmnHdr.H"              /* .   */ 
    Sinclude <windows.h> 
    ftinclude <windowsx.h> 
    Sinclude "VMOuery.H" 
    /llllllillll/llllllllllllllllll/lllil/llllillllllHIIIIII/llll/lllll/lllll 
    typedef struct { 
    DWORD dwRgnSize; 
    DWORD dwRgnStorage;    // MEM_*: Free, Image, Mapped, Private 
    DWORD dwRgnBlocks; 
    DWORD dwRgnGuardBlks:  //  > ,      
    BOOL fRgnIsAStack;    // TRUE,       
    } VMQUERY_HELP; 
    //   ,   
    //       ; 
    //     VMQuery 
    static DWORD gs_dwAllocGran = 0; 
    Illllllllllllllllllllll/llllllllllll/llllllllllll/l/ll/lllll/lllll/llll/lllllll 
    II    NTBUG_VIRTUALQUERY,    
    //  ""   VirtualQuery,   Windows NT 
    ffdefine NTBUG_VIRTUALQUERY 
    tfifdef NTBUG_VIRTUALQUERY 
    DWORD NTBug_VirtualQuery (LPVOID IpvAddress, 
    PMEMORY_BASIC_INFORMATION pmblBurfer, DWORD cbLength) { 
    DWORD dwRetVal = VirtualQuery(lpvAddress, pmbiBuffer, cbLength); 
    if (dwRetVal == cbLength) { 
    //   ,    MBI 
    if (((DWORD) pmbiBuffer->AllocationBase % 01000) == OxFFF) { 
    //   AllocationBase   OxFFF, 
    //     1   
    pmbiBuffer-->AHocationBase = (PVOID) 
    ((PBYTE) pmbiBuffer->AllocationBase + 1); 
    i 
    . . . 

    . 6-3.   VMQuery 


    ___________________ 6.    121 


    . 6-3 () 

    if ((pmbiBuffer->RegionSize % 01000) == OxFFF) { 
    //   RegionSize   OxFFF, 
    //     1   
    pmbiBuffer->RegionSize++: 
    1 
    if ((pmbiBuffer->State != MEM_FREE) && 
    (pmbiBuffer->AllocationProtect == 0)) { 
    //      AllocationProtect  , 
    //  AllocationProtect   PAGE_READONLY 
    pmbiBuffei-->AllocationProtect = PAGE_READONLY; 
    i i 
    \ return(dwRetVal); 
    Sdefine VirtualQuery NTBug_VirtualQuery 
    ffendif 
    /////////////////////////////////////////////////////////////////////////////// 
    //         
    //      
    static BOOL VMQueryHelp (PVOID pvAddress, VMQUERY_HELP *pVMQHelp) { 
    MEMORY_BASIC_INFORMATION MBI; 
    PVOID pvRgnBaseAddress. pvAddressBlk; 
    BOOL fOk; 
    DWORD dwProtectBlock[4] = { 0 }: 
    // 0 = reserved, PAGE_NOACCESS, PAGE_READWRITE 
    //    
    chINITSTRUCT(*pVMQHelp, FALSE); 
    //     ,    
    //    
    f0k = (VlrtualQuery(pvAddress, &MBI, slzeof(MBI)) == sizeor(MBI)): 
    if (!f0k) { 
    //        , 
    //  FALSE,   ;    
    //  GetLastErrorO 
    return(fOk); 
    } 
    // pvRgnBaseAddress     
    //     
    pvRgnBaseAddress = MBI.AllocationBase; 
    . . . 


    122 ______________________________Windows   


    . 6-3 () 
    II pvAddress       
    //        
    pvAddressBlk = pvRgnBaseAddress; 
    //    ,    
    pVMQHelp->dwRgnStorage = MBI.Type; 
    for (;;) { 
    //      
    f0k = VirtualQuery(pvAddressBlk. &MBI, sizeof(MBI)); 
    if (!f0k) { 
    //    ;   
    break; 
    ) 
    
    // ,       
    if (MBI.AllocationBase != pvRgnBaseAddress) { 
    //    ;   
    break; 
    i 
    //     
    //   if     
    //  Windows 95;        
    // 4  : "", PAGE_NOACCESS, 
    // PAGE_READWRITE    "" 
    if (pVMQHelp->dwRgnBlocks < 4) { 
    //    0-3,     
    //    
    dwProtectBlock[pVMQHelp->dwRgnBlocks] = 
    (MBI.State == MEM_RESERVE) ?  ; MBI.Protect; 
    } else { 
    //    4    : 
    //       
    
    MoveMemory(&dwProtectBlock[0], &dwProtectBlock[1], 
    sizeof(dwProtectBlock) - sizeor(DWORD)); 
    
    //         
    dwProtectBlock[3] = (MBI.State == MEM_RESERVE) '?  : MBI.Protect; 
    
    //        1 
    pVMQHelp->dwRgnBlocks++; 
    
    //        
    pVMQHelp->dwRgnSize += MBI.RegionSize; 
    . . . 

    ___________________ 6.    123 


    . 6-3 () 

    //     PAGE_GUARD,  1    
    //    
    if (MBI.Protect & PAGE_GUARD) { 
    pVMQHelp->dwRgnGuardBlks++; 
    ( 
    //        , 
    //   .    , 
    //         MEM_IMAGE 
    //  MEM_PRIVATE   MEM_MAPPED  MEM_PRIVATE: MEM_PRIVATE   
    //      MEM_IMAGE  MEM_MAPPED. 
    if (pVMQHelp-XJwRgnStorage == MEM_PRIVATE) { 
    pVMQHelp->dwRgnStorage = MBI.Type: 
    //     
    pvAddressBlk = (PVOID) ((PBYTE) pvAddressBlk + MBI.RegionSize); 
    } 
    //  , :    7 
    // Windows NT:   -       1  
    //                PAGE_GUARD. 
    // Windows 95:   -       4 , 
    //                  : 
    
    //              3-   : reserved 
    //              2-   : PAGE_NOACCESS 
    //              1-   : PAGE_READWRITE 
    //               : reserved 
    pVMOHelp->fRgnIsAStack = 
    (pVMQHelp->dwRgnGuardBlks > 0) :: 
    ((pVMQHelp->dwRgnBlocks >= 4) && 
    (dwProtectBlock[0] == 0) && 
    (dwProtectBlock[1] == PAGE_NOACCESS) && 
    (dwProtectBlock[2] == PAGE_READWRITE) && 
    (dwProtectBlock[3] == 0)): 
    // ,     
    return(TRUE); 
    1 
    { 
    
    //////////////////////////////////////////////
    BOOL VMQuery (PVOID pvAddress, PVMQUERY pVMQ) { 
    MEMORY_BASIC_INFORMATION MBI; 
    VMQUERY_HELP VMOHelp: 
    BOOL fOk; 
    . . . 


    124 ______________________________Windows   


    . 6-3 () 

    if (gs_dwAllocGran == 0) { 
    //        ,  
    //   ,    , 
    //        
    SYSTEM_INFO SI; 
    QetSystemInfo(&SI); 
    gs_dwAllocGran = SI,dwAllocationGranularity: 
    
    //    
    chINITSTRUCT(*pVMQ, FALSE): 
    
    //  MEMORY_BASIC_INFORMATION    
    f0k = VirtitalQuery(pvAddress, &MBI, sizeof(MBI)) == sizeof(MBI); 
    if (!f0k) { 
    
    //        , 
    //  FALSE,   ;    
    //  GetLastErrorO 
    return(fOk); 
    
    //  MEMORY_BASIC_INFORMATION   
    //  -      VMQUERY 
    
    // -,  ,   .  
    //    . 
    switch (MBI.State) { 
    case MEM_FREE: 
    //      
    //  
    pVMQ->pvBlkBaseAddress = NULL; 
    pVMQ->dwBlkSize = 0; 
    pVMQ->dwBlkProtection = 0; 
    pVMQ->dwBlkStorage - MEM_FREE; 
    break; 
    case MEM_RESERVE: 
    
    //     , 
    //      
    pVMQ->pvBlkBaseAddress = MBI.BaseAddress; 
    pVMQ->dwBlkSize = MBI,RegionSize; 
    
    //  ,     , 
    //  MBI.Protect .   , 
    //       
    //  ,    . 
    pVMQ->dwBlkProtection = MBI.AIlocatlonProtect; 
    pVMQ->dwBlkStorage = MEM_RESERVE; 
    break; 
    . . . 


    ____________________ 6.     125 


    . 6-3 () 
    case MEM_COMMIT: 
    
    //     , 
    //     
    pVMQ->pvBlkBaseAddress = MBI.BaseAddress; 
    pVMQ->dwBlk8ize = MBI.RegionSize; 
    pVMQ->dwBlkProtection = MBI.Protect: 
    pVMQ->dwBlkStorage = MBI,Type; 
    Preak; 
    } 
    
    // -,  ,    (  
    //   MBI,     VirtualQuery). 
    //    VirtualQuery  ,    
    //   . 
    switch (MBI.State) { 
    case MEM_FREE: 
    //      
    pVMQ->pvRgnBaseAddress = MBI.BaseAddress; 
    pVMQ->dwRgnProtection = MBI.AllocationProtect; 
    pVMQ->dwRgnSize = MBI. RegionSize; 
    pVMQ->dwRgnStorage = MEM_FREE: 
    pVMQ->dwRgnBlocks = 0; 
    pVMQ->dwRgnGuardBlks = 0; 
    pVMQ->fRgn!sAStack = FALSE: 
    break; 
    case MEM_RESERVE: 
    
    //   ,    
    //   
    pVMQ->pvRgnBaseAddress = MBI.AllocationBase: 
    pVMQ->dwRgnProtection = MBI.AllocationProtect: 
    
    //      ,   
    //       
    VMQueryHelp(pvAddress, &VMQHelp); 
    pVMQ->dwRgnSize = VMQHelp.dwRgnSize; 
    pVMQ->dwRgnStorage = VMQHelp.dwRgnStorage; 
    pVMQ->dwRgnBlocks = VMQHelp.dwRgnBlocks; 
    pVMQ->dwRgnGuardBlks = VMQHelp.dwRgnGuardBlks; 
    pVMQ->fRgn!sAStack = VMQHelp.fRgnIsAStack; 
    break; 
    case MEM_COMMIT: 
    
    //   ,   
    //   
    pVMQ->pvRgnBaseAddress = MBI.AllocationBase: 
    pVMQ->dwRgnProtection = MBI.AllocationProtect; 
    LM. L/li.4/. 1. flip. 


    126 _______________________________Windows   


    . 6~3 () 
    
    II      ,   
    //       
    VMQueryHelp(pvAddress, &VMQHelp); 
    pVMQ->dwRgn8ize = VMQHelp.dwRgnSize; 
    pVMQ->dwRgnStorage = VMQHelp.dwRgnStorage; 
    pVMQ->dwRgnBlocks = VMQHelp.dwRgnBlocks; 
    pVMQ->dwRgnGuardBlks = VMQHelp.dwRgnGuardBlks; 
    pVMQ->fRgnIsAStack = VMQHelp.fRgnIsAStack; 
    break; 
    i 
    
    // ,     
    return(fOk); 
    //////////////////////////////////   ///////////////////////////////// 

    VMQUERY.H 
    : VMQuery.H 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    typedef struct { 
    
    //    
    PVOID pvRgnBaseAddress; 
    
    DWORD dwRgnProtection;     // PAGE_* 
    DWORD dwRgnSize; 
    
    DWORD dwRgnStorage;        //MEM_*; Free, Image, Mapped, Private 
    DWORD dwRgnBlocks; 
    
    DWORD dwRgnGuardBlks;      //  > ,     
    BOOL fRgnIsAStack;        // TRUE,      
    
    //    
    PVOID pvBlkBaseAddress; 
    
    DWORD dwBlkProtection;     // PAGE_* 
    DWORD dwBlkSize; 
    
    DWORD dwBlkStorage;        // MEM_*: Free, Reserve, Image, Mapped, Private 
    } VMQUERY, *PVMQUERY: 
    
    i'///////////////////////////////////////////'^////////t///'///////////'////l^ 
    BOOL VMQuery (PVOID pvAddress, PVMQUERY pVMQ); 
    
    Illlllllllllllllllllllllll/lllllll   !/! I I I I I I I I I I I I 


    ___________________ 6.    127 


    - VMMap 

    VMMap (VMMAP.) (.   . 6-4)  ,  
         
  ,   .      
     VMMAP  -,   
.  ,    : 

    OOOiOOUO     Pri-vace        4.096      i. -RW-                            
    OOOLOOOO Pri.va.ce         1096          -RW- -
    OOOLLOOO     Free           61-110 
    00020000     Pri-va.Ce         4.096       L -RW-                          
    00020000 Pri-vaCe        1096         -RW- -
    0002LOOO     Free           61.14.0 
    00030000     Pri-vace     1-013576      3 -RW-     reread sca.ck 
    00030000 Reserve     1.036288         -RW- -
    001-20000 Pri.va.ce         4.096          -RW- c
    001-2e000 Pri.va.ce         SL92          -RW- -
    OOL30000     PrtvaCe         4.096      L -RW
    001-30000 Pri-vace        1096         -RW- -
    OOL31-000     Free           6L11Q 
    ;OOL10000     Pri-va.Ce     1.018576      2 -RW-     DeEa.u.Lc Process Heap 
    001-4.0000 Pri-va.Ce        1.2238          -RW- -
    001-4.3000 Reserve     1036288         -RW- -
    00210000     Mapped        65536      2 -RW
    00210000 Mapped         1096         -RW- -
    0024.LOOO Reserve        61-110          -RW- -
    00250000             901.1.2       1. -R" 
    002SOOOO Mapped        901.1-2         -R-- -
    00266000     Free          10960                                           , 
    00270000     Mapped       L17156      L -R--                             'J 
    
      ,    5  . 5-5, 5-6  5.7, 
     . 
             VMQuery.  
  VMMap  : 

    PVOID pvAddress = 000000000; 
    BOOL f0k = TRUE: 
    VMQUERY VMQ; 
    while(fOk) { 
    f0k = VMQuery(pvAddress, &VMQ): 
    if (f0k) { 
    //       
    //       
    ConstructRgnInfoLine(&VMQ, szLine, sizeof(szLine)); 
    ListBox_AddString(hWndLB, szLine): 
    #if 1 
    
    //  1  0,     
    //    
    
    for (dwBlock = 0; f0k && (dwBlock < VMQ.dwRgnBlocks); dwBlock++) { 
    ConstructRgnInfoLine(&VMQ, szLine, sizeof(szLine)); 
    ListBox_AddString(hWndLB, szLine); 
    
    //     
    pvAddress = ((BYTE *) pvAddress + VMQ,dwBlkSize); 
    . . . 


    128 _______________________________Windows   


    if (dwBlock < VMQ.dwRgnBlocks - 1) { 
    //      
    //    
    f0k = VMQuery(pvAddress, &VMQ); 
    } 
    ftendif 
    
    //     
    pvAddress = ((BYTE *) VMQ.pvRgnBaseAddress + VMQ.dwRgnSize); 
    I. 
    ) 
    } 

           000000000  
,  VMQuery  FALSE,     
    .    
   ConstructRgnInfoLine;     
  .      . 
                 
   .        
 ConstructRgnInfoLine,      
 .      .  ,   
VMQuery      . 

    VMMAP.C 
    
    : VMMap.C 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    ftinclude ". .\CrnnHdr. H"           /* .   */ 
    include <windows.h> 
    include <windowsx.h> 
    include <tchar.h> 
    include <stdio.h>               //  sprintf 
    include <string.h>              //  strchr 
    include "Resource.H" 
    include "VMQuery.H" 
    ////////////////////////////////////////////////////////////'/////////'//,''//'//'/ 
    
    //  COPYTOCLIPBOARD  TRUE,    
    //      
    define COPYTOCLIPBOARD   TRUE//FALSE 
    if COPYTOCLIPBOARD 
    
    // ,       , 
    //    ,    , 
    //   . 
    . . . 

    . 6-4.   VMMap 


    ___________________ 6.    129 


    . 6-4 () 
    
    void CopyControlToClipboard (HWND hwnd) { 
    int nCount, nNum: 
    TCHAR szClipData[20000] = { 0 }; 
    HGLOBAL hClipData; 
    LPTSTR IpClipData; 
    BOOL fOk: 
    nCount = ListBox_GetCount(hwnd): 
    for (nNum = 0; nNum < nCount; nNum++) { 
    TCHAR szLine[1000]; 
    ListBox_GetText(hwnd, nNum, szLine); 
    _tcscat(szClipData, szLine): 
    _tcscat(szClipData. __TEXT("\r\n")); 
    OpenClipboard(NULL): 
    EmptyClipboard(); 
    
    //     ,   , 
    //   GlobalAlloc   GMEM_MOVEABLE  
    // GMEM_DDESHARE 
    
    hClipData = GlobalAlloc(GMEM_MOVEABLE ; GMEM_DDESHARE, 
    sizeof(TCHAR) * (_tcslen(szClipData) + 1)); 
    IpClipData = (LPTSTR) GlobalLock(hClipData); 
    _tcscpy(lpClipData, szClipData): 
    #ifdef UNICODE 
    fOk = (SetClipboardData(CF_UNICODETEXT, hClipData) == hClipData); 
    #else 
    fOk = (SetClipboardData(CF_TEXT, hClipData) == hClipData); 
    ffendif 
    CloseClipboard(): 
    if (!f0k) { 
    GlobalFree(hClipData); 
    MessageBox(Get Focus(), 
    __TEXT("Error putting text on the clipboard"), 
    NULL, MB_OK ; MB_ICONINFORMATION); 
    } 
    
    #endif 


    130 _______________________________Windows   ] 


    . 6-4 () 
    
    LPCTSTR GetMemStorageText (DWORD dwStorage) { 
    LPCTSTR p = __TEXT("Unknown"); 
    switch (dwStorage) { 
    case MEM_FREE:      p = __TEXT("Free   "); break; 
    case MEM_RESERVE:   p = __TEXT("Reserve"); break; 
    case MEM_IMAGE:     p = __TEXT("Image "); break; 
    case MEM_MAPPED:    p = __TEXT("Mapped "); break; 
    case MEM_PRIVATE:   p = __TEXT("Private"); break; 
    } 
    return(p); 
    } 
    
////////////////7/7//////////////////////////////'//////,///'1////.//.1'1'1/ 
' '  : .1 / ' 
    
    LPTSTR GetProtectText (DWORD dwProtect, LPTSTR szBuf, 
    BOOL fShowFlags) { 
    LPCTSTR p = __TEXT("Unknown"); 
    switch (dwProtect & ~(PAGE_GUARD ; PAGE_NOCACHE)) { 
    case PAGE_READONLY:           p = __TEXT("-R--"); break; 
    case PAGE_READWRITE:          p = __TEXT("-RW-"); break; 
    case PAGE_WRITECOPY:          p = __TEXT("-RWC"): break; 
    case PAGE_EXECUTE:            p = __TEXT("E---"); break; 
    case PAGE_EXECUTE_READ:       p = __TEXT("ER--"); break: 
    case PAGE_EXECUTE_READWRITE: p = __TEXT("ERW-"); break; 
    case PAGE_EXECUTE_WRITECOPY: p = __TEXT("ERWC"); break; 
    case PAGE_NOACCESS:           p = __TEXT("----"); break; 
    } 
    _tcscpy(szBuf, p);1 
    if (fShowFlags) { 
    _tcscat(szBur, __TEXT(" ")); 
    
    _tcscat(szBuf, (dwProtect & PAGE_GUARD) ? 
    __TEXT("G") : __TEXT( "-)); 
    
    _tcscat(szBuf, (dwProtect & PAGE_NOCACHE) ? 
    __TEXT("N") : __TEXT("-")); 
    
    } 
    retnrn(szBuf); 
    f 
    
    //////////////////////////////////////////////////////////////////
    void ConstructRgnInfoLine (PVMQUERY pVMQ, LPTSTR szLine, int nMaxLen) { 
    int nLen; 
    
    _stprintf(szLine, __TEXT("%08X     %s %10u "), 
    pVMQ->pvRgnBaseAddress, 
    GetMemStorageText(pVMQ->dwRgn3torage), 
    pVMQ->dwRgnSize); 
    w. . . 


    ___________________ 6.    131 


    . 6-4 () 

    if (pVMQ->dwRgnStorage != MEM_FREE) { 
    _stprintf(_tcschr(szLine, 0), __TEXT("%5u "), pVMQ->dwRgnBlocks); 
    GetProtectText(pVMQ->dwRgnProtection, _tcschr(szLine, 0), FALSE); 
    } 
    _tcscat(szLine, _TEXT("     ")); 
    //         
    nLen = _tcslen(szLine); 
    if (pVMQ->pvRgnBaseAddress != NULL) 
    GetModuleFileName((HINSTANCE) pVMQ->pvRgnBaseAddress, 
    szLlne + nLen, nMaxLen - nLen); 
    if (pVMQ->pvRgnBaseAddress == GetProcessHeap()) { 
    _tcscat(szLlne, __TEXT("Default Process Heap")); 
    if (pVMO->fRgn!sAStack) { 
    _tcscat(szLine, __TEXT("Thread Stack")); 
    } 
    /////////////////////////////////////////////////////////////////////////////// 
    void ConstructBlkInfoLine (PVMQUERY pVMQ, LPTSTR szLine, int nMaxLen) { 
    
    _stprintf(szLine, __TEXT("   08 %s %10u         "), 
    pVMQ->pvBlkBaseAddress, 
    GetMemStorageText(pVMQ->dwBlkStorage), 
    pVMQ->dwBlkSize); 
    
    if (pVMQ->dwBlkStorage != MEM_FREE) { 
    GetProtectText(pVMQ->dwBlkProtection, 
    _tcschr(szLine, 0), TRUE); 
    /////////////////////////////////////////////////////////////////////////////// 
    void Dlg_OnSize (HWND hwnd, UINT state, int ex. int cy) { 
    SetWindowPos(Get01gItem(hwnd, IDC_LISTBOX), NULL, , , 
    ex, cy, SWP_NOZORDER); 
     
    ) 
    /////////////////////////////////////////////////////////////////////////////// 
    . . . 


    132 ______________________________Windows   


    . 6-4 () 

    BOOL Dlg_0nlnit0ialog (HWND hwnd, HWND hwndFocus, LPARAM iParam) { 
    HWND hWndLB = GetDlgItem(hwnd, IDC_LISTBOX); 
    PVOID pvAddress = 000000000: 
    
    TCHAR szLine[200]:                                                         
                 j 
    RECT re:                                                                   
                 i 
    DWORD dwBlock;                                                             
                 | 
    VMQUERY VMQ;                                                              
                 I 
    BOOL fOk = TRUE;                                                           
                \ 
    I I      
    chSETDLGICONS(hwnd, IDI_VMMAP, IDI_VMMAP): 
    l 
    
    //                          
                | 
    ListBox_SetHorizontalExtent(hWndLB, 150 * LOWORD(GetDialogBaseUnits())): 
    
    //     ,    
    //    WM_SIZE      
    //  
    GetClientRect(hwnd, &rc); 
    SetWindowPos(hWndLB, NULL, 0, 0, .right, re.bottom, SWP_NOZORDER):       
                , i 
    
    //    , 
    //      
    while (f0k) { 
    f0k = VMQuery(pvAddress, &VMO);                                            
              
    if (f0k) { 
    //                                          
         : 
    //       
    ConstructRgnInfoLine(&VMQ, szLine, sizeof(szLine));                        
          ' 
    ListBox_AddString(hWndLB, szLine); 
    #if 1                                                                      
                    : 
    //  1  0,     
    //    
    for (dwBlock = 0; f0k && (dwBlock < VMQ.dwRgnBlocks); 
    dwBlock++) { 
    ConstructBlkInfoLine(&VMQ, szLine, sizeof(szLine)); 
    ListBox_AddString(hWndLB, szLine); 

    , ; , :,,', . 


    ___________________ 6.    133 


    . 6-4 () 
    
    //     
    pvAddress = ((BYTE *) pvAddress + VMQ.dwBlkSize); 
    if (dwBlock < VMQ.dwRgnBlocks - 1) { 
    //      
    //    
    f0k = VMQuery(pvAddress, &VMO); 
    > ftendif 
    //     
    pvAddress = ((BYTE *) VMQ.pvRgnBaseAddress + VMQ,dwRgnSize); 
    < 
    f 
    #if COPYTOCLIPBOARD 
    CopyControlToClipboard(hWndLB); 
    ffendif 
    return(TRUE); 
    } 
    //////////// ///////////////// //////////////// /////////////// /////////// 
    void Dlg_OnCoffiiriand (HWND hwnd, int id, HWND hwndCtI, UINT codeNotify) { 
    
    switch (id) { 
    case IDCANCEL: 
    End0ialog(hwnd, id); 
    break; 
    \ f 
    f 
    
    ////// ///////// //////////// ///////////// ///////////// /////////// ////////////// 
    BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM IParam) { 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd, WM_INITDIALOQ, Dlg_0nlnit0ialog); 
    chHANDLE_DLGMSG(hwnd, WM_COMMA'ND, Dlg_OnCommand); 
    chHANDLE_DLGMSG(hwnd, WM_SIZE, Dlg_OnSize); 
    } 
    return(FALSE); 
    I 
    I/II/I/III/III/IIIII//II//II/IIIII/II/IIIIIIIIIIIIIIII/IIIII/II/IIII/////III/II 
    . . rrnp. 


    134 ______________________________Windows   


    . 6-4 () 

    int WINAPI tWinMain (HINSTANCE hinstExe. 
    HINSTANCE hinstPrev. LPTSTR pszCmdLine, int nCmdShow) < 
    chWARNIFUNICODEUNDERWIN95(); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_VMMAP), NULL, Dlg_Proc); 
    roturn(O); 
    111111111111/111111111/111/1111111   I / I I I I / I/I/I I I I I 
