         

     7 

     Win32 _  : 
              
   ; 
               
   (  )    
   ; 
              . 
             ,    
         8  9. 
    '\32-,    ,   
   ,     
(  )      . 

         

        VirtualAlloc. 

    LPVOID VirtualAllocd-PVOID IpAddress, DWORD cbSize, DWORD 
fdwAllocationType, DWORD fdwProtect); 

     , IpAddress,  , ,   
     .    
  NULL,     VirtualAlloc,  , 
   ,    , ,  
 ,  .   ,    
 ,     , ,  . 
    MEM_TOP_DOWN (   )    
  . 
           
     . ,    
:    "    
,       .    
\32-    ,    
       
 . 

    135 

    136 _____________________________Windows   

    ,   ,    50    
 .   IpAddress    52 428 800 
(50  1024  1024).         
,       .    
       ,   
 ,  VirtualAlloc  NULE. 
     Windows 95         
     000400000  Ox7FFFFFFF.    
       VirtualAlloc  NULL. 
     Windows NT  _    ,   
   000010000  Ox7FFEFFFF.      
      VirtualAlloc  NULL. 
          5,      
   (64     Win32). 
,        19 668 992 (300 
 65 536  8192),        , 
 64 ,         19 660 800 (300 
 65 536). 
      VirtualAlloc    ,   
   .   IpAddress  
 ,    ,     
 ,  64 . 
       VirtualAlloc  cbSize    
   .      
,   ,   ,  
 , , 79     80  (  
  4  8 ). 
     fdwAllocationType  ,     : 
     . (  
,   VirtualAlloc     ,  
    .) ,    
 ,       MEM_RESERVE. 
               
 ,          
   .     -   
  ,       
  .       
,   VirtualAlloc   IpAddress  NULL,   
MEM_RESERVE    MEM_TOP_DOWN. 

    NDOWS/  Windows 95  M_TOP_DOWN . 

     , fdwProtect,   ,  
. :  ,   ,    
 ,    .      
 ,              
            
  . (   ,      
     PAGE_NOACCESS.) 

    ____ 7.      137 

     ,     ,    
   ,  . ,   
        
PAGE_READWRITE,         .  
 ,        
  . 
           : PAGE_NOACCESS, 
PAGE_READWRITE, PAGE_READONLY, PAGE_EXECUTE, PAGE_EXECUTE_READ  
PAGE_EXECUTE_READWRITE.    PAGE_WRITECOPY  
PAGEJBXECUTE_WRITECOPY : VirtualAlloc      
NULL.  ,     PAGE_GUARD  PAGE_NOCACHE 
       . 
    Windows 95     PAGE_NOACCESS, PAGE_READONLY 
 PAGE_READWRITE.      PAGE_EXECUTE  
PAGE_EXECUTE_READ     PAGE_READONLY.   
PAGE_EXECUTE_READWRITE,      PAGE_READWRITE. 

        

     ,  ,       
 ,    .    
       .   , 
,        
  . 
         VirtualAlloc  ,   
 fdwAllocationType  MEM_RESERVE,  _1.    
  ,     ,     . 
      VirtualAlloc,        
 .     IpAddress   ,  
 cbSize      .    
   . 
    ,     . ,    
 Intel x86     512 ,    5 
242 880.        6 ,  
     2 .   VirtualAlloc  
 _1 : 

    VirtualAlloc((PVOID) (5242880 + (2 * 1024)), 6 * 1024, MEM_COMMIT. PAGE_READWRITE); 

         8       
 5 242 880  5 251 072 (. . 5 242 880 + 8 ),     
   PAGE_READWRITE.     
,      . ,  
        (,   
 PAGE_READWRITE,    PAGE_READONLY). 

    138 _____________________________Windows   


           

             
.  VirtualAlloc   : 

    PVOID pvMem = VirtualAlloc(NULL, 99 * 1024, MEM_RESERVE ; MEM_COMMIT, PAGE_READWRITE); 

            99    
 99   .  ,    
   ,    
     100  (   
4- )  104  (   8- ). 
        ,   IpAddress  
NULL.       ,     
          . 
  , VirtualAlloc   NULL. 
         ,    
100  (  4 )  104  (  8 )  .  
,            PAGE_READWRITE. 
    , VirtualAlloc     ,  
    pvMem.        
         , 
VirtualAlloc  NULL, 
    ,       ,  
   IpAddress       
       .  
 :  IpAddress  NULL, a fdwAllocationType   
 MEM_TOP_DOWN. 

           

    ,      ,  
  200   256 .      
 CELLDATA,   () .   
    ,  ,      
 : 

    CELLDATA CellData[200][256]; 

        CELLDATA    128 ,  
 6 553 600 (200  256  128)   .   
?          
. ,    . 
             
 , , ,   (linked lists).  
   CELLDATA    ,  - 
.         , 
    .       
 . , ,      
 5   10,   _   .  
      ,  , 
   . 

     7.      139 

     ,        
      .   
        ,  
 ,    ,    
 . 
       : 
    1.    ,      
   CELLDATA.       
.                                                       " 
    2.      ,    
 ,       
 CELLDATA. ,        
,           
 . 
    3.    ^ _._2^.--   
   CELLDATA. (     
    ,      
,       .) 
    4.     CELLDATA. 
           
,     ,      
.  , ,     , 
 ,        
      .       
    ,      
    . 
             : 
 ,       
 .      ,  
  ,           
     . 
           (4   86, MIPS  
PowerPC  8   Alpha).       
 CELLDATA (  . 2)      .  
 ,   ,   :     
  CELLDATA,        
CELLDATA.       (    
). , ,       . 
     4  ,       : 
         .  ,  
,        ,  
      VirtualAlloc.    
   ,       
,    .   ,    
  CELLDATA   VirtualAlloc, , , 
    . 
      (  VirtualQuery),      
 ,   CELLDATA.  ,   
 ;    VirtualAlloc   .     
  :     ,     
 -   VirtualQuery. 

    140 Windows   

      ,     ,    . 
    :     
VirtualAlloc,     ,  ,  , 
  .     ,    
 ;   ,         
   . 
            (SEH). SEH 
    Win32,        
  .    ,     
 ,       ,  
   ,      
 .         
,     ,  .    
    ,          
.       ( ,   
);  , ,     ,  
.        
    16. 

          

       ,   ,   
      VirtualFree: 

    BOOL VirtualFree(LPVOID IpAddress, DWORD cdSize, DWORD fdwFreeType); 

            
 .       , 
 ,         
     VirtualFree. 
         IpAddress     , 
. . ,   VirtualAlloc   
 .    ,    
,    cbSize   0.    
  ,   VirtualFree   .   
 (fdwFreeType)   MEM_RELEASE;    
    ,   ,   
  .  ,    
    .    
, , 500 ,     200    
  500 . 
      ,   ,      
,  ,  VirtualFree.     
IpAddress   ,     . 
 ,   cbSize    ,   
 fdwFreeType   MEM_DECOMMIT. 
      ,       
.  ,  ,    , 
    . ,   ,  
  IpAddress  cbSize    .   
   ,     IpAddress  
IpAddress + cbSize. 

    ______ 7.      141 

       cbSize  0, a IpAddress     
 , VirtualFree       
.        
  ,     ,     
 ,    .    
   
       ,    ,   
.      .    
    Intel 86,      4 , . . 
 1   32 (4096 /128)  CELLDATA.   
   CellData[0][l],     , 
       CellData[0][0]  CellData[0][31]   
.      : 
     ,      CELLDATA ,  
   1 . ,     -   
   ,   ,   ,   
 .        ,  
 ,         . 
    ,       , 
      . 
           .   
    . ,    100 ,  
    100 .     
(),   ,      .   
      (. . 
  ).    -   
       ,  ^ 
   .  ~   ,    . 
           .  ,  
          
.    ,    
   BOOL ( , , fInUse)  ,  , 
     ,    TRUE. 
             
,     .    ( 
,  ,    )   , 
    ;  ,    fInUse.   
 0,   ; TRUE   .   
,     ,    
 VirtualFree,   ,  , ,   
   . 
           ,    
   ,     ,    
      ,  ,    
.            
.       ,   
.           
  /,       . 
         . ,    
,    ,   . 

    142 _____________________________Windows   | 


    - VMAlloc:    

     VMAlloc (VMALLOC.EXE) (.   . 7-1)  
       . 
        VMALLOC  
-,   .       : 
          ,    
,   , ,      
.    Reserve A Region For 50 structures, 2 KB Each 
(   50   2  ),  VMAlloc 
 VirtualAlloc   ,      
.          . 
                 
    Use ().    ,   
   ,   .  
        , 
   .  ,  ,  
  Use,    7  46  ,  ( 
        4 )   : 

    ______ 7.      143 

      ,   ,  ,  
 Clear ().        , 
   .   ,     
          
  .     ,     , 
   .     Clear  
    ,     
  . 
         ,    flnUse 
  FALSE.    ,     
      .  Garbage 
Collect ( ),     ,   VMAlloc 
   .         
   . 
     ,     ,   
   46. :     .  
  Garbage Collect.   ,  46- 
,      : 
    , ,       ,     
       . 
          ,      . 
        
   : 
             Use  
  Clear,  ; 
          ,      
flnUse,  ,    ; 
            ,   
,  ,    . 
       VMAlloc    VirtualQuery, 
   . 

    144 ______________________________Windows   


    VMALLOC.C 
    /,,^ *^,^, *^* *^ *^, ^.^ ^^^^ **,,********,**.*,*,,**** *,,*,. *,** 
    : VMAlloc.C 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    Sinclude "..\CmnHdr.H"           /* .   */ 
    #include <windows,h> 
    #include <windowsx.h> 
    ftinclude <tchar.h> 
    ffinclude <stdio.h>               //  sprintf 
    ^include "Resource.H" 
    //./////.///////////////''''1''11/'''1''1'1''/1/////.///1/./'1'    1 
    UINT g_uPage3ize = 0; 
    typedef struct { 
    BOOL fAllocated; 
    BYTE bOtherData[2048 - sizeof(BOOL)]; 
    } SOMEDATA, *PSOMEDATA: 
    
    ffdefine MAX_SOMEDATA    (50) 
    PSOMEDATA g_pSomeData = NULL; 
    
    RECT g_rcMemMap; 
    
    1! i I 11 11111 1111 /1  ''/'! ii/ ' '//:;, /'''.''//'/.' //.'. / 
    BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    TCHAR szBuf[10]; 
    
    //      
    ch8ETDLGICONS(hwnd, IDI_VMALLOC, IDI_VMALLOC): 
    
    //      
    //     
    EnableWindow(GetDlgItem(hwnd, IDC_INDEXTEXT), FALSE); 
    
    EnableWindow(QetDlgItein(hwnd, IDC_INOEX), FALSE); 
    
    ScrollBar_SetRange(GetDlgItem(hwnd, IDC_INDEXSCRL), 
    0, MAX_SOMEDATA - 1, FALSE); 
    Scroll8ar_SetPos(GetDlgItem(hwnd, IDC_INDEXSCRL), O.TRUE): 
    EnableWindow(GetDlgItem(hwnd, IDC_INDEXSCRL), FALSE); 
    EnableWindow(GetDlgIteffi(hwnd, IDC_USE), FALSE); 
    EnableWindow(GetDlgItem(hwnd, IDC_CLEAR), FALSE); 
    EnableWindow(GetDlgItem(hwnd, IDC_GARBAGECOLLECT), FALSE); 
    
    //       
    GetWindowRect(GetDlgItem(hwnd, IDC_MEMMAP), &g_rcMemMap); 

    . . . 


    . 7-1.   VMAlloc 


    ______ 7.      145 


    . 7-1 () 

    MapWindowPoints(NULL, hwnd. (LPPOINT) &g_rcMemMap. ?); 
    
    //   ,    
    //      
    DestroyWindow(GetDlgIteni(hwnd, IDC_MEMMAP)); 
    
    //       (  ) 
    _stpnntf(szBuf, __TEXT("%d KB"), g_uPageSlze / 1024); 
    SetDlgItemText(hwnd, IDC_PAGESIZE, szBuf): 
    
    //    
    SetDlgItemIntChwnd, IDC_INDEX, 0, FALSE): 
    return(TRUE); 
    } 
    
    void Dlg_OnDestroy (HWND hwnd) { 
    if (g_pSomeData != NULL) 
    VirtualFree(g_pSomeData, 0, MEM_RELEASE); 
    i 
    void Dlg_OnCommand (HWND hwnd. int id, HWND hwndCtI, UINT codeNotify) { 
    UINT ulndex, ulndexLast, uPage, uMaxPages; 
    BOOL fTranslated, fOk, fAnyAllocs; 
    MEMORY_BASIC_INFORMATION MemoryBasicInfo; 
    switch (id) { 
    case IDCRESERVE: 
    
    //   ,    
    // MAX_SOMEDATA  SOMEDATA 
    g_pSomeData = (PSOMEDATA) VirtualAlloc(NULL, 
    
    MAX_SOMEDATA * sizeof(SOMEDATA). MEM_RESERVE, 
    PAGE_READWRITE); 
    
    //   Reserve    
    //   
    EnableWindow(GetDlgItem(hwnd, IDC_RESERVE), FALSE); 
    EnableWindow(GetDlgItem(hwnd. IOC_INDEXTEXT), TRUE); 
    EnableWindow(GetDlgItem(hwnd, IDC_INDEX), TRUE); 
    EnableWindow(GetDlgItem(hwnd, IDC_INDEXSCRL), TRUE): 
    EnableWindow(GetDlgItem(hwnd, IDC_USE), TRUE); 
    EnableWindow(GetDlgItem(hwnd, IDC_GARBAGECOLLECT), TRUE); 
    //       

    . . . 


    146 _____________________________Windows   


    . 7-1 () 

    SetFocus(GetDlgItem(hwnd, IDC_INDEX)); 
    
    //       
    InvalidateRect(hwnd, &g_rcMemMap, FALSE); 
    break; 
    case IDC_INDEX: 
    
    if (codeNotify != EN_CHANGE) 
    break; 
    ulndex = GetDlgItemInt(hwnd, id, SfTranslated. FALSE); 
    if ((g_p8omeData == NULL) !! (ulndex >= MAX_SOMEDATA)) { 
    //      ,  
    //   
    ^Translated = FALSE: 
    if (^Translated) { 
    Virtuaiduery(&g_pSomeDataTulndex], 
    SMemoryBasicInfo, sizeof(MemoryBasidnfo)); 
    fOk = (MemoryBasicInfo.State == MEM_COMMIT); 
    if (fOk) 
    fOk = g_pSomeData[ulndex].fAllocated; 
    EnableNindow(GetDlgItem(hwnd, IDC_USE), !f0k); 
    EnableWindow(GetDlgItem(hwnd, IOC_CLEAR), fOk); 
    ScrollBar_SetPos(GetDlgItem(hwnd, IDC_INDEXSCRL), ulndex, TRUE); 
    } else { 
    EnableWindow(GetDlgItern(hwnd, IDC_USE), FALSE); 
    EnableWindow(GetDlgItem(hwnd. IDC_GLEAR), FALSE); 
    \ 
    break; 
    case IDC_L(SE: 
    ulndex = GetDlgItemInt(hwnd, IDC_INDEX, &fTranslated, FALSE); 
    if (ulndex >= MAX_SOMEDATA) { 
    //      ,  
    //   
    ^Translated = FALSE; 
    \ 
    if (fTranslated) { 
    VirtualAlloc(&g_pSomeData[ulndex], 
    Sizeof(SOMEDATA), MEM_COMMIT, PAGE_READWRITE); 
    
    //    Windows NT   
    g_pSomeData[uIndex].fAllocated = TRUE; 

    . . . 


    _______ 7.      147 


    . 7~1 () 

    EnableWindow(GetDlgItem(hwnd, IDCJJSE), FALSE); 
    EnableWindow(GetDlgItem(hwnd, IDC_CLEAR), TRUE); 
    
    //     Clear 
    SetFocus(GetDlgItem(hwnd, IDC_CLEAR)); 
    //       
    InvalidateRect(hwnd, &g_rcMemMap, FALSE); 
    } 
    break; 
    case IDC_CLEAR: 
    ulndex = GetDlgIteniInt(hwnd, IDC_INDEX, &fTranslated, FALSE): 
    if (ulndex >= MAX_SOMEDATA) { 
    //      ,  
    //   
    fTranslated = FALSE; 
    } 
    if (fTranslated) { 
    g_pSomeData[uIndex].fAllocated = FALSE; 
    EnableWindow(GetDlgIteiii(hwnd, IDC_USE), TRUE): 
    EnableWindow(GetDlgItem(hwnd, IDC_CLEAR), FALSE): 
    //     Use 
    SetFocus(GetDlgItem(hwnd, IDCJJSE)); 
    } 
    break; 
    case IDC_GARBAGECOLLECT: 
    uMaxPages = MAX_SOMEDATA * sizeof(SOMEDATA) / g_uPage8ize; 
    
    for (uPage = 0; uPage < uMaxPages: uPage++) { 
    fAnyAllocs = FALSE; 
    ulndex = uPage * g_uPageSize / sizeof(SOMEDATA); 
    ulndexLast = ulndex + g_uPage3ize / sizeof(SOMEDATA); 
    
    for (; ulndex < ulndexLast; ulndex++) { 
    VirtualQuery(&g_pSorneData[ ulndex], 
    &MemoryBasicInfo, sizeof(MemoryBasicInfo)): 
    
    if ((MemoryBasicInfo,State == MEM_COMMIT) && 
    g_pSomeData[uIndex],fAllocated) { 
    fAnyAllocs = TRUE; 
    break; 
    } 

    , . . 


    148 ._____________________________Windows   


    . 7-1 () 

    if (IfAnyAllocs) { 
    //      :   
    //   
    
    VirtualFree(&g_pSomeData[uIndexLast - 1], 
    sizeof(SOMEDATA), MEM_DECOMMIT); 
    } 
    
    //       
    InvalidateRect(hwnd, &g_rcMemMap, FALSE); 
    break; 
    case IDCANCEL: 
    EndDialog(hwnd, id); 
    break: . 
    } 
    } 
    void Dlg_OnHScroll (HWND hwnd, HWND hwndCtI, UINT code, int pos) < 
    INT nScrlPos; 
    
    if (hwndCtI != GetDlgItem(hwnd, IDC_INDEXSCRL)) 
    return; 
    nScrlPos = ScrollBar_GetPos(hwndCtl); 
    switch (code) { 
    case SB_LINELEFT: 
    nScrlPos--; 
    break; 
    case SB_LINERIGHT: 
    nScrlPos++; 
    break; 
    case SB_PAGELEFT: 
    nScrlPos -= g_uPage8ize / sizeof(SOMEDATA); 
    break; 
    case SB_PAGERIGHT: 
    nScrlPos += g_uPageSize / sizeof(SOMEDATA); 
    break; 
    case SB_THUMBTRACK: 
    nScrlPos = pos; 
    break: 

    . . . 


    _______ 7.      149 


    . 7-1 () 

    case SB_LEFT: 
    nScrlPos = 0; 
    break; 
    case SB_RIGHT: 
    nScrlPos = MAX_SOMEDATA - 1: 
    break; 
    
    if (nScrlPos < 0) 
    nScrlPos = 0; 
    
    if (nScrlPos >= MAX_SOMEDATA) 
    nScrlPos = MAX_SOMEDATA - 1: 
    ScrollBar_SetPos(hwndCtl, nScrlPos, TRUE); 
    SetDlgItemInt(hwnd, IDC_INDEX, nScrlPos, TRUE); 
    / / / //',' ,',' :'/'//////// /Il //' / ! /' /' /' //' i'I i I /'///// 
    void Dlg_OnPaint (HWNO hwnd) { 
    UINT uPage, ulndex, ulndexLast, uMemMapWidth; 
    UINT uMaxPages = MAX_SOMEDATA * sizeof(SOMEDATA) / g_uPageSize; 
    MEMORY_BASIC_INFORMATION MemoryBasicInfo; 
    PAINTSTRUCT ps; 
    BeginPaint(hwnd, &ps); 
    if (g_p8omeData == NULL) { 
    
    //     
    Rectangle(ps,hdc, g_rcMemMap.left, g_rcMemMap.top, 
    g_rcMemMap. right, g_rcMemMap.bottom); 
    i 
    
    //    ,     
    uPage = 0; 
    while ((g_pSomeData != NULL) && uPage < uMaxPages) { 
    ulndex = uPage * g_uPage8ize / sizeof(SOMEDATA); 
    ulndexLast = ulndex + g_uPageSize / sizeof(SOMEDATA); 
    for (; ulndex < ulndexLast; ulndex++) { 
    
    VirtualQuery(&g_pSomeData[ulndex], &MemoryBasicInfo, 
    sizeof(MemoryBasicInfo)); 
    CM. fulfil. Lttti). 


    150 _____________________________Windows   


    . 7-1 () 
    
    switch (MemoryBasicInfo. State) { 
    case MEM_FREE: 
    Select0bject(ps.hdc, GetStockObject(WHITE_BRUSH)); 
    break; 
    case MEM_RESERVE; 
    Select0bject(ps.hdc, GetStockObject(GRAY_BRUSH)); 
    break; 
    case MEM_COMMIT: 
    Select0bject(ps.hdc, GetStockOb]ect(BLACK_BRUSH)); 
    break; 
    } 
    uMemMapWidth = g_rcMemMap. right - g_rcMemMap.left; 
    Rectangle(ps.hdc, 
    g_rcMemMap.left + uMemMapWidth / uMaxPages * uPage, 
    g_rcMemMap.top, 
    g_rcMemMap.left + uMemMapWidth / uMaxPages * (uPage + 1), 
    g_rcMemMap.bottom); 
    / 
    uPage++; 
    } 
    EndPaint(hwnd, &ps); 
    / 
    BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM 
IParam) { 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd. WM_INITDIALOG,    Dlg_OnInitDialog); 
    chHANDLE_DLGMSG(hwnd, WM_COMMAND,       Dlg_OnCommand); 
    chHANDLE_DLGMSG(hwnd, WM_HSCROLL,       Dlg_OnHScroll); 
    chHANDLE_DLGMSG(hwnd, WM_PAINT,         Dlg_OnPaint); 
    chHANDLE_DLGMSG(hwnd, WM_DESTROY,       Dlg_OnDestroy); 
    } 
    return(FALSE): 
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszGmdLine, int nCmdShow) { 

    . . . 


    ________ 7.      151 


    . 7-1 () 

    SYSTEM_INFO Systemlnfo; 
    chWARNIFUNICODEUNDERWIN95(): 
    
    //       
    GetSystemInfo(&SystemInfo); 
    9_uPageSize = Systemlnfo.dwPageSize; 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_VMALLOC), NULL, Dlg_Proc): 
    return(O); 
    } 
    //////////////////////////////////   I / I//I I I I I I I I / I 


       

       ,   ,    
   ,  . ,  
     ,  ()  
   .     , 
          
    PAGE_READWRITE,       PAGE_NOACCESS. 
     ,           
. ,  -    -   
       ,   
.      '     
 |>^_   .                                

           VirtualProtect 

    BOOL VirtualProtect(LPVOID IpAddress, DWORD dwSize, DWORD fINewProtect, 
PDWORD IpflOldProtect); 

     IpAddress     , dwSize   
,      , a fINewProtect   
  PAGE_*,  PAGEJWRITECOPY  PAGE_EXECUTE_WRITECOPY. 
     , IpflOldProtect,     DWORD, 
  VirtualProtect        
 .       ,  
    .       
   ,     DWORD,    
IpflOldProtect,         
.    VirtualProtect  TRUE. 
    ,           
  . ,     4- 
  VirtualProtect, , : 

    VirtualProtect(lpRgnBase + (3 * 1024), 2 * 1024, PAGE_NOACCESS, &fl01dProtect); 

       PAGE_NOACCESS   2  . 

    152 _____________________________Windows   

    - TInjLib,    18, ,   
  VirtualProtect     . 
    Windows 95     PAGE_NOACCESS, PAGE_READONLY 
 PAGE_READWRITE.       PAGE_EXECUTE  
PAGE_EXECUTE_READ   ,       
PAGE_READONLY.    PAGE_EXECUTE_READWRITE,     
 PAGE_READWRITE. 

        RAM 

    :          
   .       
,     ,    
 ,       (RAM).   
      ,   
   .     Win32   , 
    : VirtualLock  VirtualUnlock. 
    VirtualLock  ,        
 .         
 ,        .    
 ,         
    .       
       ,  
     .   
,        RAM.    
       
  . 
        ,    ,   
      .    
       ,   . 
         
,     ,   
.   ,        
 ,       
 ,        . 
        RAM   Win32   . 
,          
    ,        
  .       
  .       ,  
        .   : 
          
    . 
     ,          
    realtime:       ( 
 DLL,  , ,   . .),   
  .      - 
, ,         
   , 

    _ 7.      153 

         .   
 :     ,    
   . 
            RAM,  VirtualLock: 

    BOOL VirtualLockCLPVOID IpvMem, DWORD cbMem); 

          cbMem ,    
IpvMem.      TRUE.   , 
          
.  , VirtualLock        
 PAGE_NOACCESS.       
  30  .        
  86   122 880 .    : 
        . 
        VirtualUnlock: 

    BOOL VirtualUnlock(LPVOID IpvMem. DWORD cbMem); 

          cbMem ,   
 IpvMem. (      , 
  .)    VirtualUnlock  TRUE. 
       ,    , VirtualLock  
VirtualUnlock     . ,   
    ,     
   . 
    VirtualLock  VirtualUnlock  Windows 95     
 FALSE;  GetLastError,    ERROR_CALL_NOT IMPLEMENTED. 
    Windows NT   VirtualUnlock    
VirtualLock. Windows NT        
(working set) ,        . 
 ^ ,         
   ,   VirtualUnlock   . 

        

          ,  
         . , 
 ,        
    -, DLL /  .  
         
    . 
     Windows NT 4   ,    
 ,    .   ,  
        ,    
        . 

    154 _____________________________Windows   

         : 

    int WINAPI WinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPSTR pszCmdLine, int nCmdShow) { 
    const char szAppName[] = "MEM_RESET tester"; 
    const char szTestData[]= "Some text data"; 
    PVOID pvData, pvDummy; 
    MEMORYSTATUS mst; 
    MEMORY_BASIC_INFORMATION inbi; 
    
    //        
    pvData = VirtualAlloc(NULL, 1024, 
    MEM_RESERVE ! MEM_COMMIT, PAGE_READWRITE); 
    strcpy(pvData, szTestData); 
    
    if (MessageBox(NULL, "Do you want to access this data later?", 
    szAppName, MB_YESNO) == IDNO) { 
    //          , 
    //       . 
    //  ,       . 
    
    // :  MEM_RESET  , VirtualAlloc  
    //          . 
    //  : 
    
    
    //    VirtualAlloc(pvData, 5000, MEM_RESET, PAGE_READWRITE) 
    //  0    DEC Alpha (1  = 8 )  1  
    //    (1  = 4 ). ,   
    // VirtualAlloc   ,    VirtualQuery 
    //     . 
    VirtualQuery(pvData,&mbi, sizeof(mbi)): 
    
    VirtualAlloc(pvData, mbi.RegionSize, MEM_RESET, PAGE_READWRITE): 
    } 
    
    //   ,     
    GlobalMemoryStatus(&mst): 
    
    
    pvDummy = VirtualAlloc(NULL, mst.dwTotalPhys, 
    MEM_RESERVE : MEM_COMMIT, PAGE_READWRITE); 
    //      ,   , 
    //    ,     
    ZeroMemory(pvDummy, mst,dwTotalPhys); 
    
    //      ,     
    if (strcmp(pvData, szTextData) == 0) { 
    
    //    pvData   ,   . 
    //  FillMemory     
    //  (  pvData)   . 
    MessageBox(NULL, "Modified data page was saved.", szAppName, MB_OK): 
    } else { 


    _______ 7.      155 


    //    pvData    ,   . 
    //  FillMemory      
    //  (  pvData)   ,   
    //   . 
    MessageBox(NULL, "Modified data page was NOT saved.", szAppName, MB_OK); 
    \ 
    ( 
    return(O); 
    } 

    ,    ,       
 .      1024 ,  
       (4    
86, MIPS  PowerPC; 8   DEC Alpha).   strcpy    
 ,    .    
,    ,   ,    
   .       
,         
 . 
              
,     .    
(  No),   ^ ^ , 
   VirtualAlloc   MEMJRESET^ 
     ,       VirtualAlloc,  
  ,   .      
  ,    ,  
.     ,    , 
    ,       
.     ]~   , 
   .        
,     .      
  ,       ,   
   ,  .    
   ,  ,      
 . 
       ,     . -, , 
, ,    VirtualQuery    VirtualAlloc. 
 VirtualAlloc       , 
  ,         
 .     ^ ;  
VirtualAlloc,    MEM_RESET,     
 . ,      : 
    
    PINT pnData = (PINT) VirtualAlloc(NULL, 1024, MEM_RESERVE : MEM_COMMIT, 
    PAGE_READWRITE); 
    pn[0] = 100; 
    pn[1] = 200; 
    VirtualAlloc((PVOID) pnData, sizeof(int), MEM_RESET, PAGE_REAOWRITE); 

         ,    ,  
 4   sizeof(int)        . ,  
,      t    
    ,   .   
       (VirtualAlloc  )  
 :  VirtualAlloc   MEM_RESET,   
     ,   ,  
       .    
,     .      
    ,        . 

    156 _____________________________Windows   

    ,    :  MEM_RESET    
,      .   
    NULL: 

    PVOID pv = VirtualAlloc(NULL, 1024, 
    MEM_RESERVE ; MEM_GOMMIT ; MEM_RESET, PAGE_READWRITE); 

       MEM_RESET     . 
    , , ,    VirtualAlloc   MEM_RESET 
 ,    ,     
 . 
         .    ,  
  ,      
,  : 
    1.     ,  GlobalMemoryStatus. 
    2.      VirtualAlloc.   
  ,      , 
    - . 
    3.         
ZeroMe.       ,   
    . 
        ,   ,   
           
    .      
 ,    ,       
,     . 
      ZeroMemory       , 
   .    ,  , 
  ,   ,   .     
   ,       
     .      
      ,   , 
,     .    ! 

      

        -     
 .      5,      
      .    
       . 
     ,    ,    
     (    )  
   -   .    
 1        2  
 .     ,   
    /STACK: 

    /STACK:reserve^,commit] 

             
,      /STACK .  
,        
CreateThread  _beginthreadex.     ,  
   ,     . 
    0,    

    ____ 7.      157 

    ,    /STACK.     ,   
   . 
     . 7-2 ,      ( 
  008000000)       4 .     
      PAGE_READWRITE. 
     ,        
.       
         (,  
  008100000).   ,      
 ;      (guard page). 
         (    
  ) , ,     . 
       (  ),  
   .          
    ,     .  
 PAGE_GUARD,   ,       
,     .     
,  ,    .   
      ,      
,   . 7-3. 
    ,     (  . 7-3)    
     008003004. ,     
  ,        
.         008001000,  
   .     ,    . 7-4. 
        ,  PAGE_GUARD     
008002000 ,     008001000   
.  (!)      PAGE_GUARD.  
,    ,    
,     ,     
.      ,   . 
          008001000,  
   : , EXCEPTION_STACK_OVERFLOW ( 
 WINNT.H    OxCOOOOOFD).    
  (SEH)        
    .   SEH .  16   
 SEHSum,   . 
           ,   
 ,         
008001000,          
008000000.      (  ), 
    .      
  .    .     
      ,    .    
,      . ; . ., ! 
      ,       
.         
.  ,   Ox07FFFOOO ( 1  ,  
008000000)         
 .      008000000   
 ,         
    .       
  ,         
        . 

    158 _____________________________Windows   

       

    Ox080FFOOO    ( ) 
    Ox080FEOOO     PAGE_GUARD 
    OxOSOFDOOO   
    008003000   
    008002000   
    008001000   
    008000000    ( ) 

    . 7-2.          

       

    Ox080FFOOO    ( ) 
    Ox080FEOOO   
    OxOSOFDOOO   
    008003000   
    008002000     PAGE_GUARD 
    008001000   
    008000000    ( ) 

    . 7-3.      

       

    Ox080FFOOO    ( ) 
    Ox080FEOOO   
    Ox080FDOOO   
    008003000   
    008002000   
    008001 000   
    008000000    ( ) 

    . 7-4.      


    ________ 7.      159 


       Windows 95 

     Windows 95      ,    Windows NT.   
  .  . 7-5 ,   Windows 95    
 (   000530000)  1 . 

                                                   
           | 
000640000	1 6  (65 536 )	   
  (       ) 
Ox0063FOOO	1  (4096 )	    
    PAGEREADWRITE (  ) 
	1  (4096 )	   PAGEIMOACCESS 
   (  PAGEGUARD) 
000638000	6  (24 576 )	,    
    
000637000	1  (4096 )	   
    PAGEREADWRITE (   1 6- ) 
000540000	247  (1 011 71 2 )	,   
   000530000	1 6  (65 536 )	 
  (    ) 

    . 7-5.          
 Windows 95 

    , -,       1   128 , 
      1 .  Windows 95     
 128  ,   .      
 ,         64  . 
           ,   
        .  , 
    ,  : 

    int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE hinstPrev, 
    LPSTR IpszCmdLine, int nCmdShow) { 
    char szBuf[100]; 
    szBuf[10000] = 0: //      
    return 0; 
    } 

            
   . ,  ,    
      , ,    
  Windows 95,      
.      Windows 95,   Windows 
NT,           . "," 
    ,      
,     ,     . 
     :         PAGE_GUARD. 
 Windows 95    ,     
    .     , 
  

    160 Windows   

    ,  PAGE_NOACCESS ( . 7-5    ). 
     ,   .  
  ,      PAGE_NOACCESS 
 PAGE_READWRITE      ,  
  . 
    :        
PAGE_READWRITE   000637000 (. 7-5).    
  16- Windows.  Microsoft     , 
 ,   16    16- 
     ,      
.  \32-  Windows 95    
16-         
  16     , Microsoft   
    Windows 95.  32-    
16-, Windows 95  16-   32-   
      (SS)  ,     
   000637000.   16- ,    
 16     ,     . 
        ,    Windows 95,  
     ,    
 ,       1 ,     
 ,    Windows NT.     , 
     16- Windows,    
    64- ,     
.      Windows 95  ,  
  . 7-6. 

    		  

    000640000	1 6  (65 536 )	   
(       ) 
    000540000	256  (1 )	    
PAGEREADWRITE (  ) 
    000539000	7  (28 672 )	,   
   
    000538000	1  (4096 )	    
PAGEREADWRITE (   1 6- ) 
    000530000	8  (32 768 )	   ( 
   ) 

    . 7-6.       Windows 95 


            

      MS-DOS  16- Windows   ,  
     ,   
     .     
     .      
16-    ,     
 C/C++   ,   
       (  
 ),       .  
,  , ,      

    ____ 7.      161 

            ,   
   . 
      Win32      
,        . 
      32-  C/C++     
,    .   ,   
     32-  . ,  
,  ,       : 

    void SomeFunctionO { 
    int nValues[4000]; 
    
    //  -    
    nValues[0] =0; //  -  

           16 000 
 [4000 * sizeof(int);     4 ]  
. ,  ,    
         16 000 
.          
,       . 
          4  8     . 
       ,   
  (     ),    
 ,    . -,  
      _,   
         . 
           , 
   (4   86, MIPS  PowerPC  8   
Alpha).       ,   
     ,      , 
  ,  .     
      ,  ,   . 
      ,  ,    , 
 . (   ,     
     .) 

    //    ""      
    Sifdef _M_ALPHA 
    Sdefine PAGESIZE (8 * 1024)   //   8  
    ftelse 
    ftdefine PAGESIZE (4 * 1024)   //   4  
    #endif 
    void StackCheck(int nBytesNeededFromStack) { 
    
    //    .      
    //         . 
    PBYTE pbStackPtr = (  ); 
    while (nBytesNeededFromStack >= PAGESIZE) { 
    
    //      -    
    pbStackPtr -= PAGESIZE; 

    . . . 


    162 _____________________________Windows   
    

    //   -    ,  
    //           
    pb3tackPtr[0] = 0; 
    
    //       
    nBytesNeededFromStack -= PAGESIZE; 
    } 
    
    //     StackGheck   
    //    ,      
    } 
      Visual C++  ,   
   ,      
    StackCheck.   ,   
  ,  ,     .  99.99999 
     DLL     .