      

                                                2 

     Win32 API         (handles). 
     , . . ,  
       ,    
.      -  ,    
          
 Win32-nporpaMM.       
      : , 
,   . . 
    ,  ,     .   
 ,            , 
        ,   .  
     , ,     
   . 

        

    ,          ,  
 \32-,  .   
       ,   : 

                    
                 
                            

       '\32-. , CreateFileMapping 
      (file-mapping object). 
        ,     
 .      ,    
   .   ( ,  
,     .)    ,  
       . ,   
   ,     ,   
     ,     . 
          ,   
           
.   Microsoft  ,    
      .    
 Microsoft ,     ,  
  - . 

    8   ______________________________Windows   

      :        ,  
       ?   ,  Win32 API 
  ,      
 .          
.    ,   ,   
,   .    
  32- ,      
  .    32-,  , 
    .       (  ). 
         Microsoft  ,  
     . ,   
   (  -   
)   ,        
,    ,  .   ,  
         
   . 

        

       ,   .  ,   
  ,   ,   ,  
    .        
;         , 
      ,       , 
 . 
     ,      , 
        .   
    ,      .   
    .     
   ,    .   
-  ,  ,      
   .    -  
,    . 

     

          (security descriptor), 
 ,           . 
       ; 
  ,       
. ,  Windows 95   ,     
    . 
    NDOWS/  Windows 95    .      
  ,   ,    
,        Windows NT. 
      ,   ,    
 SECURITY_ATTRIBUTES  , : 

    HANDLE CreateFileMapping(HANDLE hFile, 
    LPSECURITY_ATTRIBUTES IpFileMappingAttnbutes, DWORD flProtect, 
    DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR IpszName): 

          NULL   
    .   ,     

     2.     9 

         ,       
.        
SECURITY_ATTRIBUTES,     .   : 

    typedef struct _SECURITY_ATTRIBUTES { 
    DWORD nLength; 
    LPVOID IpSecurityDescriptor; 
    BOOL  bInheritHandle; 
    } SECURITY_ATTRIBUTES; 

       SECURITY_ATTRIBUTES,      
    IpSecurityDescriptor.      
   ,      
 SECURITY_ATTRIBUTES  : 

    SECURITY_ATTRIBUTES sa: 
    sa.nLength = slzeof(sa);            //     
    sa.IpSecurityDescriptor = pSD:      //   SD 
    sa.bInheritHandle = FALSE;          //    
    HANDLE hFileMapping = CreateFileMapping((HANDLE) Oxffffffff, &sa, 
    PAGE_READWRITE. 0, 1024, "MyFileMapping"); 

      bInheritHandle      , 
         . 
           ( ,  
 ), ,       . 
,           
 ,     OpenFileMapping  : 

    HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ, FALSE, "MyFileMapping"); 

     FILE_MAP_READ     OpenFileMapping,  
,         ,   
   .  OpenFileMapping,    
 ,    .  ,  
  (),      
 , OpenFileMapping   .   
   , OpenFileMapping  NULL,   
GetLastError    5 ( ERROR_ACCESS_DENIED).   ,  
     , Windows 95    
,          . 
              
 , ,  ,   .     User  
GDI (graphics device interface    ).   
  Win32  ,    User  
GDI   .  , ,    User    
  ? ,    ,   : 
 \32-,  .    , 
  ,  ,    ,  
  CreateFileMapping. 
         ,   User  GDI,   
 LPSECURITY_ATTRIBUTES,      Createlcon: 

    HICON CreateIcon(HINSTANCE hinst, int nWidth, int nHeight, 
    BYTE cPlanes, BYTE cBitsPixel, 
    CONST BYTE -IpbANDbits, CONST BYTE *lpbXORbits): 


    10 ______________________________Windows   


        

            , 
    .       
  . -     
    .    
, ,     Win32-nporpaMMHCT,  
 ,  ,      . 
    ,       
  ,      -   
Windows NT, Windows 95, Win32s  Windows CE.  ,   
 ,     ,     
         . 
     . 2-1 ,    ,  
.  ,     .   
 32-   -  ,    
 . 

      (    
 (   
    DWORD      DWORD   
                 )             ) 
    1               Ox????????                       Ox????????                
           Ox???????? 
    2             Ox"??^??                     Ox????????                      
  Ox???????? 

    . 2-1.   ,   


       

         ,    . 
       ,    
(, CreateFileMapping),         
  ;     , 
  ,    .  
  ,      1   
.         
 ,       , , , 
    . (    ,  
  .) 
      ,    (      
  ): 

    HANDLE CreateThread(LPSECURITY_ATTRIBUTES IpThreadAttributes, 
    DWORD dwStackSize, LPTHREAD_START_ROUTINE IpStartAddress, 
    LPVOID IpParameter, DWORD dwCreationFlags, LPDWORD IpThreadId); 
    
    HANDLE CreateFile(LPCTSTR IpFileName, DWORD dwDesiredAccess, 
    DWORD dwShareMode, LPSECURITY_ATTRIBUTES IpSecurityAttributes, 
    DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, 
    HANDLE hTemplateFile); 
    
    HANDLE CreateFileMapping(HANDLE hFile, 
    LPSECURITY_ATTRIBUTES IpFileMappingAttributes, DWORD flProtect, 
    DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPGTSTR IpszName); 


     2.   11 


    HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES IpSemaphoreAttributes, LONG 
lInitialCount, LONG IMaximumCount, LPCTSTR IpszName); 

     ,   ,  ,  
           
 .        
,  ,     ,  
 ,    .      
          
   : 1, 2  . .  ,   
       . ,  
Windows NT   ,  ,  ,    
      . 
     ,    32-,   
   ,    ,    
-.       , 
  ,      . 
         (),    
  GetLastError  6 (ERROR_INVALID_HANDLE).     , 
        ,     
      . 
      ,   , ,   
  (NULL).        
      .  ,   
     0,  -1 (INVALID_HANDLE_VALUE). ,  
CreateFile     ,    
INVALID_HANDLE_VALUE.        , 
 ,   . ,  CreateMutex 
  INVALID_HANDLE_VALUE : 

    HANDLE hMutex = CreateMutex(...): 
    if (hMutex == INVALID_HANDLE_VALUE) { 
    //      ,   
    //   CreateMutex  NULL 


       

      ,      ,    
      CloseHandle: 

    BOOL CloseHandle(HANDLE hobj): 

         ,  
 ,  ,      
() ,       .  
  ,   FALSE, a GetLastError  
ERROR_INVALID_HANDLE.    ,    
           
;    ,     . 
        CloseHandle   
   :       
    .       
,     !   CloseHandle    
     ; ,     ,  
  .   ,   , 

    12 ______________________________Windows   

         ( ).   
        (  
CloseHandle),   . 
         CloseHandle    ?  ,  
.   (   )  ,    
.        
  ,   ,     
  :        
     . 

          

              
,    .   : 
          ,    
,        ; 
       (mailslots)    (named pipes)  
     ,   
   ; 
      (mutexes),  (semaphores)   (events)  
 ,    ,    
        . 
              
,        Win32  
  .  Microsoft      
 -,       
  .       ,   
      ,   
,     ( )  .    
.   ,  ,     , 
      .     
         
 . 
     ,         
 ,     . 

       

     ,      
 (-). ,    
     ,   ,   
,         .   
  ,     
 . 
    -,       ,    
   . (  :    
,      .) 
       ,     
  SECURITY_ATTRIBUTES,      
 Create-.    -   
 : 

     2.   13 


    SECURITY_ATTRIBUTES sa; 
    sa.nLength = sizeof(sa): 
    sa.IpSecurityDescriptor = NULL; 
    sa.bInheritHandle = TRUE; 
    HANDLE hMutex = CreateMutex(&sa, FALSE, NULL); 


        SECURITY_ATTRIBUTES, ,  
       ( Windows 95  ) 
      . 
    ^WINDOWS/ Windows 95    ,   
      bInheritHandle. 
        ,     , 
 .       , 
,     .  ,   
,     LPSECURITY_ATTRIBUTES  NULL,  
  ,     .    
bInheritHandle  TRUE,   1. 

    , -    ,   . 2-2. 

      (     (  
              DWORD      DWORD        
        )             ) 
    1            OxFOOOOOOO                Ox????????                      000000000 
    2          000000000              ()              () 
    3            OxFOOOOOlO                Ox????????                      000000001 

    . 2-2.       

     ,         : 
     1 ()  3 (). 
          .    
  CreateProcess: 

    BOOL CreateProcess(LPCTSTR IpAppllcationName, LPTSTR IpCommandLine, 
    LPSECURITY_ATTRIBUTES IpProcessAttr-ibutes, 
    LPSECURITY_ATTRIBUTES IpThreadAttributes, BOOL bInheritHandles, 
    DWORD dwCreationFlags, LPVOID IpEnvironment, 
    LPCTSTR IpCurrentDirectory, LPSTARTUPINFO IpStartupInfo, 
    LPPROCESS_INFORMATION IpProcessInformation); 

           3,      
     bInheritHandles.  ,  
     FALSE,    ,  
      ,  
   .    TRUE,   
  .   

    14 ______________________________Windows   

       ,        
.   ,  ,  ()  ,  
         
         .   
 ,   ,       
 (  ). 
         ,   
    ,     
  .   -  ,  
   ( CloseHandle) . . ,  
    CreateProcess    
   ,        
     . 
     . 2-3         
    .  ,  1  2  
,        . 
  3        (   
)  OxFOOOOOlO.         
    .  ,      
   (     ),  
        ,   
 ,          
 . 

      (     (  
              DWORD      DWORD   
                 )             ) 
    1           000000000              ()              () 
    2          000000000              ()              () 
    3            OxFOOOOOlO                Ox????????                      000000001 

    . 2-3.      (    
     ) 

       ,     
 .        
    ,      
 . 
            
:       ,    
- .      , 
    ,      
     -  .   , 
        ,   
       ,    
 ,       . 
              
 _       .  
      (   
sscanf),     ,     
   .      
 ,      

     2.   15 

          ,      
          
 . 
            
 ,  ,      . 
     ,     
   (  WaitForInputIdle,   
 11),    (  )  , 
   . 
      :        
  .        
     .   
  ,      
 ,  GetEnvironmentVariable,   .  
  ,      ,   
    . 

       

            , 
     .      
  .  ,      
,        . 
    ,     
,  SetHandleInformation: 

    BOOL SetHandleInformationCHANDLE hObject, DWORD dwMask, DWORD dwFlags); 

     ,     .  (hObject) 
  .  (dwMask)  , 
  ( )   .      
   : 

    #define HANDLE_FLAG_INHERIT                000000001 
    Sdefine HANDLE_FLAG_PROTECT_FROM_CLOSE     000000002 

         ,     
 OR. , ,    dwFlags  ,   
   . ,    
    : 

    SetHandleInf  Filiation (hob j. HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); 

        : 

    SetHandleInformation(hobJ, HANDLE_FLAG_INHERIT, 0); 

     HANDLE_FLAG_PROTECT_FROM_CLOSE  ,    
 : 

    SetHandleInforniation(hobj, HANDLE_FLAG_PROTECT_FROM_CLOSE, 
    HANDLE_FLAG_PROTECT_FROM_CLOSE); 
    CloseHandle(hobj);     //   

     -     , 
CloseHandle   .      
 .     ,    
,        .      
,       ,  
.    ,   ,    
 ,   .     
  ,       .   
  ,   ,    
  . 

    16 ______________________________Windows   

      , ,   .  , : 

    SetHandleInformation(hobj, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); 
    CloseHandle(hobj); 

       HANDLE_FLAG_PROTECT_FROM_CLOSE    
 .      ,  
    .       ,   
   ,       . 
       , ,    GetHandleInformation: 

    BOOL GetHandleInformation(HANDLE hObj, LPDWORD IpdwFlags); 

              
 DWORD,    IpdwFlags.  ,   
 ,  : 

    DWORD dwFlags: 
    GetHandleInformation(hObj, &dwFlags): 
    BOOL fHandleIsInheritable = (0 != (dwFlags & HANDLE_FLAG_INHERITABLE)); 


      

     ,      
     ,     .  
  (  )  . ,    
  : 

    HANDLE CreateMutex(LPSECURITY_ATTRIBUTES IpMutexAttributes. 
    BOOL bInitialOwner, LPCTSTR IpszName); 
    
    
    HANDLE CreateEvent(LPSECURITY_ATTRIBUTES IpEventAttnbutes, 
    BOOL bManualReset, BOOL bInitialState, LPCTSTR IpszName): 
    
    HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES IpSemaphoreAttributes, 
    LONG UnitialCount, LONG IMaximumCount, LPCTSTR IpszName); 
    
    HANDLE CreateWaitableTimei-(LPSECURITY_ATTRIBUTES IpTimerAttributes, 
    BOOL bManualReset, LPCTSTR IpszName); 
    
    HANDLE CreateFileMapping(HANDLE hFile, 
    
    LPSECURITY_ATTRIBUTES IpFileMappingAttributes, DWORD flProtect, 
    DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR IpszName): 

         ( CreateFileMapping )   
 .    ,    
  IpszName.    NULL,     
.            
 (.  ),    DuplicateHandle (. 
 ).      ,     
- .   NULL   IpszName    
   (   ).      
_  (    260)     
 \.  , Microsoft       
 . ,     JeffObj,    
  ,          .   
, , , ,      
(waitable timers)      .   
 CreateSemaphore    NULL: 

     2.   17 

    HANDLE hMutex = CreateMutex(NULL, FALSE, "JeffObJ"): 
    HANDLE hSem = CreateSemaphore(NULL, 1, 1. "JeffObJ"); 
    DWORD dwError-Code = GetLastError(); 

         dwErrorCode   6 
(ERROR_INVALID_HANDLE).     ,    . 
    ,     , ,    
   . ,      : 

    HANDLE hMutexProcessA = CreateMutex(NULL, FALSE, "JeffMutex"): 

         ,     
       JeffMutex. ,   
hMutexProcessA      ,       
     . 
     -      . , 
      ;    Explorer  
  . ( -     
   .)      
,  : 

    HANDLE hMutexProcessB = CreateMutex(NULL, FALSE, "JeffMutex"); 

         ,      
   . ,   ,    
.          JeffMutex,  
  CreateMutex      , 
  ,  ,     ,  
     . 
         CreateMutex,  -  . 
     ,    
-.  ,  ,   ,   
  ,           . 
,           
,     :       
 ,   . 
        ,      . 
 CreateMutex,         . 
 ,   ,       
!  ,   :    
     ,   GetLastError   
   ^-: 

    HANDLE hMutex = CreateMutex(NULL, FALSE, "JeffOb]"); 
    if (GetLastErrorO == ERROR_ALREADY_EXISTS) { 
    //     
    } else { 
    //     
    } 

           .   
Create-        Open-: 
    
    HANDLE OpenMutex(DWORD dwDesir-edAccess, BOOL bInheritHandle, 
    LPCTSTR IpszName); 
    
    HANDLE OpenEvent(DWORD dwDesir-edAccess, BOOL bInheritHandle, 
    LPCTSTR IpszName); 

    . . . 


    18 ______________________________Windows   
    

    HANDLE OpenSemaphore(DWORD dwDesireaAccess. BOOL bInheritHandle. 
    LPCTSTR IpszName); 
    
    HANDLE OpenWaitableTimer(DWORD dwDesiredAccess, BOOL bInheritHandle, 
    LPCTSTR IpszName); 
    
    HANDLE OpenFileMapping(DWORD dwDesiredAccess, BOOL bInheritHandle, 
    LPCTSTR IpszName): 

    :      .  , 
IpszName,    .     NULL   
      .     
   ,   .     
  ,   NULL, a GetLastError   2 
(ERROR_FILE_NOT_FOUND).          
    ,   ,  ,    
     (  dwDesiredAccess). 
 ,      ,   
     .   
bInheritHandle  TRUE,    . 
        Create-  Open-  ,   
   Q-eafe-  ,  Open- 
   . 

       

           
   DuplicateHandle: 

    BOOL DuplicateHandle( 
    HANDLE hSourceProcessHandle, HANDLE hSourceHandle, 
    HANDLE hTargetProcessHandle, LPHANDLE IpTargetHandle, 
    DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions); 

     -,         
       . DuplicateHandle  
 ,      .   
       . 
         DuplicateHandle   
  ,    .  ,  
         
 ,          . 
         3,    
   :       
    . 
     , hSourceHandle,      . 
      ,  DuplicateHandle,  
 ,     hSourceProcessHandle.  
IpTargetHandle    HANDLE,     
     .   
   ,   hTargetProcessHandle. 
       DuplicateHandle     
  ,        -. 

    __________________________________ 2.   19 

    , ,  dwOptions   0     
: DUPLICATE_SAME_ACCESS  DUPLICATE_CLOSE_SOURCE. 
        DuplicateHandle:  ,  
-,      ,      
-.    DuplicateHandle   dwDesiredAccess. 
           -.  
       .  
    . ,      
   . 
    XwiNDowsy  Microsoft     Windows 95,    
DUPLICA\^/ TE_CLOSE_SOURCE.     , 
>/     . 
        DuplicateHandle  . 
     (. 2-4)     1  2. 
        S,  
       һ. 
     . 2-5      S,  
    ,  2.    
    ,    . 

      (     (  
              DWORD      DWORD   
                 )             ) 
    1            OxFOOOOOOO                Ox????????                     000000000 
    (   S) 
    2            OxFOOOOOlO                Ox????????                     000000000 
    (   ) 
    . 2-4.      
      (     (  
              DWORD      DWORD        
        )             ) 
    1           000000000              ()              () 
    2            OxF0000020               Ox????????                     000000000 
    (   ) 

    . 2-5.     S 

     . 2-6 ,         
     DuplicateHandle.  ,    
    ,  2,     1  
.   

    20 ______________________________Windows   


      (     (  

              DWORD      DWORD   

                 )             ) 
    1           000000000              ()              () 
    2                           ????????                     000000000 
    (   ) 

    . 2-6.        DuplicateHandle 

         DuplicateHandle : 
    DupllcateHandle(1, 2, 2, &h0b], 0, TRUE, DUPLICATE_SAME_ACCESS); 
              (. 2-7). 
      (     (  
              DWORD      DWORD   
                 )             ) 
    1            OxF0000020                Ox????????                      000000001 
    2                           ????????                     000000000 
    (   ) 

    . 2-7.        DuplicateHandle 

          S     
    .  DuplicateHandle   
 hObj    1        
,      . 
       DuplicateHandle   DUPLICATE_SAME_ACCESS, 
            
 S.  ,    DuplicateHandle  
 dwDesiredAccess.  ,      
,     bInheritHandle  DuplicateHandle  
 TRUE. 
    ,       DuplicateHandle  
 ,    ,     
.         
, ,  ,      . 
       ,  DuplicateHandle    
: -     ,    
    .     -  
  ,        ;   
            
    hObj.  ,      
  ,      ,  
     ,    Windows- 
    . 
        DuplicateHandle    . ,  , 
   .      ,  
   .       
. ,       ,   
   ,       
     . ,   

     2.   21 

          ,       
  .     DuplicateHandle  : 

    //        
    
    //  -,    
    HANDLE hObjProcessA = CreateMutex(NULL, FALSE, NULL); 
    
    //     " " 
    HANDLE hProcessB = OpenProcess(PROCESS_ALL_ACGESS, FALSE, dwProcessIdB); 
    
    HANDLE hObjProcessB;   //  , 
    //     
    
    //      - 
    DuplicateHandle(GetCurrentProcess(), nObjProcessA, hObjProcessB, 
    &hObjProcessB, 0, FALSE, DUPLICATE_SAME_ACCESS); 
    
    //  -   ,   
    //       hObjProcessB 
    
    //        
    CloseHandle(hProcessB): 
    
    //      -,     
    CloseHandle(hObjProcessA); 

     GetCurrentProcess  ,   
  ,      .   
 DuplicateHandle  , hObjProcessB  
,         ,   
 hObjProcessA (      ).   
          : 
    
    //        , 
    //    
    CloseHandle(hObjProcessB); 

         ,    (    ) 
.   ,          
 ,    hObjProcessB.       
 ,    ,   . 
         DuplicateHandle. ,  
    -.      
,       -.  Windows  
    ,  ,   
    , . ,    
  ,    .    
    .    ,    
   ,    DuplicateHandle  
     .    
 : 

    22  ______________________________Windows   
    
    int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE hinstExePrev, 
    LPSTR IpszCmdLine, int nCmdShow) { 
    
    HANDLE hThread;  //      
    DWORD dwThreadId; 
    
    //   - 
    HANDLE hMutex = CreateMutex(NULL, FALSE, NULL): 
    
    //        
    //  - 
    HANDLE hMutexWorker: 
    //      
    //         
    DupllcateHandle(GetCurrentProcess(), hMutex, 
    GetCu rent Process(), ShMutexWorker, 
    0, FALSE, DUPLICATE_SAME_ACCESS); 
    
    //        
    //   
    
    hThread = CreateThread(NULL, 0, ThreadFunc, 
    (LPVOID) hMutexWorker, 0, &dwThreadId); 
    
    //       
    //     hMutex 
    //       ,   ; 
    
    //   ,    
    Clo3eHandle(hMutex); 
    
    //     
    WaitForSingleObject(hThread, INFINITE); 
    
    //     " " 
    CloseHandle(hThread); 
    return(O); 
    DWORD WINAPI ThreadFunc(PVOID pvParam) { 
    
    //      pvParam 
    HANDLE hMutex = (HANDLE)pvParam; 
    
    //        
    //      hMutex 
    
    //       ,   ; 
    
    //   ,    
    CloseHandle(hMutex); 
    return(O); 
