    : / 

     15 

         Windows NT  Windows 95  ,  
    . (    
 ,     .)     
    : 

                    

                          . 
                         . 
              . 
                  . 
            . 
             . 
                    
 (       Windows). 
                 (  
     Windows). 
                   (   ). 
     (socket)                
(  ).     ,   
,      Windows. 
                       . 

          Win32.  ,  Win32  
      .   
           
   Win32     .      
        . 
      Win32   ,      
, ,  ,     . , 
          
,      .  
    ,       
.     ,      . 

    467 

    468 ______________________________Windows   | 


        

      /       
  .          
.       ,  
  .   32-   
,    ,    
 . 

                     ,     

                           CreateFile (pszName    UNC-)      
                        CreateFile (pszName    UNC-  
  FILE_FLAG_BACKUP_SEMANTICS) 
                  CreateFile (pszName   \\.\:) 
                 CreateFile (pszName   \\.\PHYSICALDRIVEx) 
           CreateFile (pszName   ?) 
               CreateFile (pszName   LPT?) 
                  CreateMailslot (pszName   \\.\mailslot\maibtofaffie) 
                 CreateMailslot (pszName   <t\\servername\mauslot\mailslotname) 
       CreateNamedPipe (pszName   \\.\pipe\pipename) 
       CreateFile (pszName   \\servername\pipe\pipename) 
                   CreatePipe   
                            socket, accept, AcceptEx 
                           CreateConsoleScreenBuffer, GetStdHandle 

    1. Windows NT   ,    CreateFile 
  FILE_FLAG_BACKUP_SEMANTICS.      
 (,   . .),     . Windows 95 
   . 
    2. Windows NT    ,     
\\.\,    . ,    ^   ,  
\\.\:.  .        
.   

| Windows 95     .                   
                                               | 
    3. Windows NT    ,     
\\.\PHYSICALDRIVEx,     -   |   . 
,           
    : ,  \\.\PHYSICALDRIVEO.   ,  
       .   
    ,       
    . Windows 95    
 . 
    ,       , 
 SetCommConfig. 

    BOOL SetCommConfigCHANOLE hCommDev, LPCOMMCONFIG IpCC, DWORD dwSize); 

       -   , : 

    BOOL SetMailslotInfo(HANDLE hMailslot, DWORD IReadTimeout); 

     ,         . 
       ,   .    
      ChseHandle: 

    BOOL CloseHandle(HANDLE hObject); 

        ,     closesocket. 

    int closesocket(SOCKET s); 


    ________________________ 15. : / 469 


         - ,     
,  GetFileType: 

    DWORD GetFileType(HANDLE hFile); 

        ,   : 

                         

    FILE_TYPE_UNKNOWN        . 
    FILE_TYPE_DISK            . 
    FILE_TYPE_CHAR            ( LPT  ). 
    FILE_TYPE_PIPE               . 

     CrecrfeFi/e:  
     , , ,      
  CreateFile: 

    HANDLE CreateFile(LPGTSTR pszName, DWORD dwDesiredAccess, 
    DWORD dwShareMode, LPSECURITY_ATTRIBUTES pSecurityAttributes, 
    DWORD dwCreationDistribution, DWORD dwFlagsAndAttrs, 
    HANDLE hTemplateFile); 

         .        
 ,      . 
     16- Windows      OpenFile, 
lcreatvi _lopen.       Win32,    
 .  Win32-poex     ,  
    CreateFile. 
     pszName    ,   
 .    ,  
 CreateFile,    . 
     ,       ,    
  __  (260).   Windows NT   
 ,   CreateFileW (Unicode- CreateFile)  
    : \\?\.     , 
CreateFileW      ,    
32000 Unicode-. ,   ,     
,    . 
     dwDesiredAccess    .   
   : 

                               

                                              
 .    ,     
   (,   ). 
    GENERIC_READ                         . 

    . . . 


    470 ______________________________Windows   


     

                               

    GENERIC_WRITE                         . : 
     GENERIC_WRITE     
GENERIC_READ.        ,  
   . 
    GENERIC_READ ! GENERIC_WRITE        ,   
 .     ,   
  . 

     dwShareMode     
.    16- Windows,  Windows 95  Windows NT 
 ,   -    
  (  )   (  ). 
 .   ,        
     ,  ,   .  
   dwShareMode: 

                                  

                                             . 
   ,  CreateFile  . 
    FILE_SHARE_READ                          
.   
       ,  CreateFile  .  ,   
   ,   ,    
CreateFile      ,  . 
    FILE_SHARE_WRITE                         
.      ,  CreateFile  .  
,      ,   ,   
 CreateFile      ,  
. 
    FILE_SHARE_READ ! FILE_SHARE_WRITE       , 
   .       ,  
CreateFile  .   CreateFile    
      . 
     , pSecurityAttributes,    
SECURITY_ATTRIBUTES,         
    ,     
 (. .       ).   
          , 
 NULL   . 
     dwCreationDistribution ,  CreateFile   
  ,    -  .   : 

    ___________________________ 15. : / 471 


              

    CREATE_NEW            CreateFile   .    
   ,   . 
    CREATE_ALWAYS         CreateFile     
,      .  ,    . 
    OPEN_EXISTING          CreateFile   ,  
  ,   , 
    OPEN_ALWAYS            CreateFile   ,  
  ,  . 
    TRUNCATE_EXISTING     CreateFile   , 
    0.    ,   .   
      GENERIC_WRITE. 
         CreateFile ,   ,  
  dwCreationDistribution  OPEN_EXISTING. 
     dwFlagsAndAttrs   :   , 
    ,     
,    .   ,   
 . 
         ,      
.   ^  , 
  "  . 
     FILE_FLAG_NO_BUFFERING   /   . 
  ,   ,   
  .     ,    
   ,       .   
         ,    
       ,     
      (   
).   ,         
 :      ,  , , 
,  ReadFile,        . 
     ,      
,     ,  ,   , 
 ,    .      
   ,      ,    
 . ,          , 
,    . (     
,      FILE_FLAG_SEQUENTIAL_SCAN  FILE_FLAG_RANDOM_ACCESS.) 
      FILE_FLAG_NO_BUFFERING,     
   -       
  .    ,    ,    
        
.         
 ,  ,    : 
           ,    
 '; 
         ,    
 ; 

    1.          
GetDiskFreeSpace. 


    472 ______________________________Windows   

              
,        . 
        FILE_FLAG_SEQUENTIAL_SCAN  FILE_FLAG_RANDOM_ACCESS 
  ,     .    
FILE_FLAG_NO_BUFFERING,    . 
       FILE_FLAG_SEQUENTIAL_SCAN,  ,   
   .     ,  
    ,  .    
         .   
       ,   
       ,     
.  , ,      , 
   FILE_FEAG_RANDOM_ACCESS.   ,  
    . ~~     ,   
 ,  FILE_FLAG_WRITE_THROUGH    
    ,    .  
   ,        
,   .   -   
   ,      ,  
 .          , 
\32-       ,  
      . 
      ,   ,   .  
  dwFlagsAndAttrs  CreateFile   . 
          ,   
FILE_FLAG_DELETE_ON_CLOSE.        
FILE_ATTRIBUTE_TEMPORARY        , 
-   ,  , , ,     
    !      , 
    -  ,      
,      . 
     FILE_FLAG_BACKUP_SEMANTICS     
  .      - , 
            
   .     
 ,           
  .  FILE_FLAG_BACKUP_SEMANTICS   
     ,   ,  
       .  
       . 

    VWINDOWSY 
    Windows 95    FILE_FLAG_BACKUP_SEMANTICS. 

     FILE_FLAG_POSIX_SEMANTICS ,       
  POSIX.  ,  POSIX,   
    , , , JEFFREY. DOC, Jeffrey.Doc  
Jeffrey.doc    .     MS-DOS, 
16- Windows  Win32       . 
   ,  FILE_FLAG_POSIX_SEMANTICS. , 
     ,     
 MS-DOS, 16- Windows  Win32. 
     , FILE_FLAG_OVERLAPPED, ,     
   .   (   FILE_FLAG_OVERLAP

    ________________________ 15. : / 473 

    PED)     /,   
     MS-DOS  16- Windows.  
    ,      
 .        . 
     /      (   
 ),     .    
  :      ,  ,   
  /,       
     ,   . 
,       . ( 
/     .) Win32  
    / ,     
 . 

    WINDOWS 95 
    Windows 95,   /    
(,  ),      . 

          .    
  ,  ,         
 CreateFile   hTemplateFile  NULL.   
     : 

                       

    FILE_ATTRIBUTE_ARCHIVE          (   
 ).  CreateFile  ,   
 . 
    FILE_ATTRIBUTE_HIDDEN           (     
 ). 
    FILE_ATTRIBUTE_NORMAL        ,      
.   ,      . 
    FILE_ATTRIBUTE_READONLY         .   
 ,          . 
    FILE_ATTRIBUTE_SYSTEM               
   . 
    FILE_ATTRIBUTE_COMPRESSED       .   ,  
   .     ,     
     . 
    FILE_ATTRIBUTE_OFFLINE         ,     
,    .      
    . 
    FILE_ATTRIBUTE_TEMPORARY        
 .       
 ,       . 
     FILE_ATTRIBUTE_TEMPORARY     . 
    , CreateFile      
 ,    ,   .    
  ,             
     

    474 _____________________________ Windows   

       .     , 
  FILE_ATTRIBUTE_TEMPORARY  FILE_FLAG_DELETE_ON_CLOSE ( 
   ).         
       , ,      
 . 
       CreateFile hTemplateFile   
  ,  NULL.   hTemplateFile   
, CreateFile      dwFlagsAndAttrs  
   ,     hTemplateFile. 
(   ,      GENERIC_READ.)  
CreateFile    ,   ,  
hTemplateFile . 

    VWINDOWS 95 
     Windows 95  hTemplateFile     NULL,  
ateFile  ,    GetLastError  ERROR_NOT_SUPPORTED. 

     CreateFile       ,  
     ,      INVALID_HANDLE_VALUE. 

    /\ 
     \32-    NULL,  CreateFile  
   INVALID_HANDLE_VALUE (  OxFFFFFFFF). 
     : 

    HANDLE hFile = CreateFile(...); 
    if(hFile == NULL) { 
    //      
    } else { 
    //    ,     
    } 
      .      : 
    HANDLE hFile = CreateFileC...); 
    if (hFile == INVALID_HANDLE_VALUE) { 
    //    
    } else { 
    //    
    } 


       

          ,    
  .   ,    
,     1[^_) 
  . 

       

     CreateFile   ,     
  .   64-   
,    

    _________________________ 15. : / 475 

           . 
     0, ,    ReadFile 
    CreateFile,      . 
    100  ,      
,     ,     
ReadFile    101-   . :  
    ,        
 .     : 

    HFILE hFile = CreateFile(...); 
    ReadFile(hFile, IpBuffer, 100, &dwBytesRead, NULL); 
    WriteFile(hFile, IpBuffer, 100, &dwBytesWritten, NULL); 

             100 , 
   100       100   199. 
   WriteFile        , 
     200. 
              .    
  .     ,  
,     ,     
,    ,      
      . : 

    HFILE hFilel = CreateFileC'MYFILE. DAT", ...); 
    HFILE hFIle2 = CreateFileC'MYFILE.DAT", ...); 
    ReadFile(hFile1, IpBuffer, 100, &dwBytesRead, NULL); 
    WriteFile(hFile2, IpBuffer, 100, &dwBytesWritten, NULL); 

         MYFILE.DAT     100 
.      hFilel    
 101- .  100       .   
,   hFile2, -    0.  
  100   "MYFILE.DAT   
,    .      
 ,     ReadFile  WriteFile   
  101-  . 
          ,   , 
   .     SetFilePointer. 

    DWORD SetFiiePointer(HANDLE hFile, LONG IDistanceToMove, PLONG 
IpDistanceToMoveHigh, DWORD dwMoveMethod); 

     hFile   ,    . 
 IDistanceToMove  ,      
 .       
 ,      
 .       ( 
 )   32-   .   
     64- . 
          IpDistanceToMoveHigh. 
    - 2    , 
 IpDistanceToMoveHigh  NULL.      
   18     ,  
  IpDistanceToMoveHigh  ,    
 32    . 
         ?   ,  SetFilePointer 
    .     
 32   ,     .  
     32 ,  SetFilePointer (  
)    ,    IpDistanceToMoveHigh. 

    476 ______________________________Windows   

     , dwMoveMethod,   SetFilePointer,  
  IDistanceToMove  IpDistanceToMoveHigh.  
 3 : 

         

    FILE_BEGIN           , 
  Distance ToMove-. 
    FILE_CURRENT         , 
  Distance -. 
    FILE_END                 
 ,   DutenceToMove-napaMeTpaMH.    
   . 
     SetFilePointer      ,  
 OxFFFFFFFF,     ,   
IpDistanceToMoveHigh,  NULL.      
       OxFFFFFFFF, 
    ,  GetLastError   
    NO_ERROR. 

       

            .   
     .     : 

    BOOL SetEndOfFile(HANDLE hFile); 

            . 
,      1024,  : 

    HFILE hFile = CreateFile(...); 
    SetFilePointer(hFile, 1024, NULL, FILE_BEGIN); 
    SetEndOfFile(hFile); 
    CloseHandle(hFile); 


         

     FILE_SHARE_READ  FILE_SHARE_WRITE ,    
      .  ,   
    ,   .   , 
,   .       , 
         FILE_SHARE_READ.    
-        ?   
    .      - , 
         .   
      ,     
.       . 
        FILE_SHARE_*,   
   ,        . 
,      ,    
 ,    ,      
        ,     
.     : 

    BOOL LockFile(HANDLE hFile. DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, 
DWORD cbLockLow, DWORD cbLockHigh); 

    _________________________ 15. : / 477 

     , hFile,   ,   
  .  (dwFileOffsetLow  dwFileOffsetHigh) 
 64-      ,  
  (dwLockLow  dwLockHigh)    .   
     100- ,  LockFile : 

    LockFile(hFile. sizeof(CUSTOMER_RECORD) * (100 - 1), , sizeof(CUSTOMER_RECORD), 0); 

       LockFile  TRUE.   , 
       ,    . 
      ReadFik  WriteFile   
     ,    ,  
-      .   
    , , , 
         . 
           .  
      .    
        . 
     ,  ,   , 
. ,   LockFile     : 

    LockFile(hFile, sizeof(CUSTOMER_RECORD) * (100 - 1), , 
sizeof(CUSTOMER_RECORD), 0); 
    LockFile(hFile, sizeof(CUSTOMER_RECORD) * (100 - 2), , 2 * 
sizeof(CUSTOMER_RECORD), 0); 

       LockFile  100-   .  
 ,    99-  100- . ,  
100-   ,    LockFile  . 
         , , ,  
: 

    BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD 
dwFileOffsetHigh, DWORD cbUnlockLow, DWORD cbUnlockHigh); 

      UnlockFile   LockFile',   
    .     
   ,     . ,  
    : 

    LockFile(hFile, sizeof(CUSTOMER_RECORD) * (100 - 1), 0. 
sizeof(CUSTOMER_RECORD), 0); 
    LockFil.e(hFile, sizeof(CUSTOMER_RECORD) * (100 - 2), 0, 
sizeof(CUSTOMER_RECORD), 0); 
    UnlockFile(hFile, sizeof(CUSTOMER_RECORD) * (100 - 2), 0, 2 * 
sizeof(CUSTOMER_RECORD), 0); 

     2  LockFile   100-  99-   
,     UnlockFile      
  .   .   2  
 LockFik,   UnlockFile    (  ). 

    478 _______________________________Windows   


    ^\ 
           
    . 

      2 ,      : 
    BOOL LockFileEx(HANDLE hFile. DWORD dwFlags, DWORD dwReserved, 
    DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh,             
                    i LPOVERLAPPED IpOverlapped);                              
    BOOL UnlockFileEx(HANOLE hFile, DWORD dwReserved, 
    DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh, 
LPOVERLAPPED IpOverlapped): 

         LockFile  UnlockFile. 

    \wiNDows7 
    B Windows 95  LockFileEx  UnlockFileEx     
 FALSE,    GetLastError   ERROR_CALL_NOT_IM- 
| PLEMENTED. 

    LockFileEx        
LockFile.   ,     ,   
     ,        
   .   LockFileEx   
  ;    ,   
 dwFlags  LOCKFILE_EXCLUSIVE_LOCK   OR. 
(LockFile    LockFileEx   .) 
    LockFileEx   ,     
   ,    .  
LockFile   ,   .      
  ,     ,  
  LockFile,          
TRUE.     LockFileEx     
 ,     .    
      ,    
,    dwFlags  LOCKFILE_FAIL_IMMEDIATELY  
 OR. 
          hFile, 
nNumberOfBytesToLockLow  nNumberOfBytesToLockHigh      
.  dwReserved        0. 
 , IpOverlapped,    OVERLAPPED: 

    typedef struct OVERLAPPED { 
    DWORD Internal: 
    DWORD InternalHigh: 
    DWORD Offset; 
    DWORD OffsetHigh; 
    HANDLE hEvent; 
    } OVERLAPPED; 
    typedef OVERLAPPED -LPOVERLAPPED; 

         LockFileEx   Offset  
OffsetHigh, a   .  Offset  OffsetHigh  
  :  LockFileEx ,     
  . 
           UnlockFile,   
UnlockFileEx. - UnlockFileEx      
UnlockFile,        . 

    _________________________  15. : / 479 


     / 

         \32-,   
 /   .  ,    
 ,  , ,   . .     
/        . 
    ,          : 

    BOOL ReadFile(HANDLE hFile, LPVOID IpBuffer. 
    DWORD nNumber-OfBytesToRead, LPDWORD IpNumberOfBytesRead, LPOVERLAPPED IpOverlapped); 
    BOOL WriteFile(HANDLE hFile, CONST VOID *lpBuffer, 
    DWORD nNumber-OfBytesToWrite, LPDWORD IpNumberOfBytesWritten, LPOVERLAPPED IpOverlapped): 

          File,      
   .  hFile  ,   
   .  ,    
FILE_FLAG_OVERLAPPED,   ,     
/.  IpBuffer   ,     
  (      ).  
nNumberOfBytesToRead  nNumberOfBytesTo Write   ReadFile  
WriteFile,          . 
     IpNumberOfBytesRead  IpNumberOfBytesWritten   
  DWORD,        
 (    ).  IpOverlapped (   
  ,   /)   
/   NULL. 
       ReadFile  WriteFile     
TRUE. ,      ,    
GENERIC_READ,      ,    GENERIC_WRITE. 

         

      CreateFile,     , 
      .   
 (,  ,    )  
  .       
,  FlushFileBuffers: 

    BOOL FlushFileBuffers(HANDLE hFile); 

          ,   
,     hFile.      
 GENERIC_WRITE.      TRUE. 

     / 

          /   
  .     
      ,    
     .    
 Win32, /   :   
     ,      . 
    ,    ,    . 
  ,     ,    

    480 ______________________________Windows   

           .      
  File Open         
        .    
  ,       .   
        ,      
       ,    
  . 
      /     
.          
,           
  ,         .    
     ,    
.      ,    
     . 
    ,     ,   
. ,           
    .        
   .      
,      . 
              
CreateFile,    dwFlagsAndAttrs  FILE_FLAG_OVERLAPPED.  
 ,      . 
    Win32  4   / (  
   ).      .  
  /    ,    
   ;     
  .    ,   
 ,           
 /. 
            
   ,    ,    - 
.  ,      4    
       . 
            .    
   ,   . 

                                 

        ,     
        /  
  .     /  ,  
   . 
                 
/       .  
   /  ,     . 
     /                
/    . ,    /, 
  . 
      /         / 
   .     / 
 ,     .     
 . 

    _________________________  15. : / 481 


           

      .     /, ,   , 
 : 

    BOOL ReadFile(HANDLE hFile, LPVOID IpBuffer, 
    DWORD nNumberOfBytesToRead, LPDWORD IpNumberOfBytesRead, LPOVERLAPPED IpOverlapped); 
    BOOL WriteFile(HANDLE hFile, CONST VOID IpBuffer, 
    DWORD nNumberOfBytesToWnte, LPDWORD IpNumberOfBytesWritten, LPOVERLAPPED IpOverlapped); 

           /,   
 /     IpOverlapped  
  OVERLAPPED.  overlapped JB  
 ,     /  ^ 
__ ,   .   
   OVERLAPPED: 

    typedef struct .OVERLAPPED { 
    DWORD Internal; 
    DWORD Inter-nalHigh; 
    DWORD Offset; 
    DWORD OffsetHigh; 
    HANDLE hEvent; 
    } OVERLAPPED; 
    typedef OVERLAPPED .LPOVERLAPPED; 

      ReadFile  WriteFile   OVERLAPPED  
   Offset, OffsetHigh  hEvent.  Offset, 
OffsetHigh ,     .   
       0. 

    /*\ 
     Offset  OffsetHigh    ,   
.      ,    
 , a GetLastError  ERROR_INVALID_PARAMETER. 

         Offset  OffsetHigh  64- 
,     . ,   100 
    ,  345,   : 

    //     / HANDLE hFile = 
CreateFile(..., FILE_FLAG_OVERLAPPED, ...); 
    //      BYTE bBuffer[100]; 
    //    DWORD     DWORD dwNumBytesRead; 
    //   OVERLAPPED,   // ,  
  

    . . . 

    482 _______________________________Windows   


    OVERLAPPED Overlapped: 
    Overlapped.Offset = 345; 
    Overlapped.OffsetHigh = 0: 
    Overlapped.hEvent = NULL; //   
    //     
    ReadFile(hFile, bBuffer, slzeof(bBuffer), &dwNumBytesRead, &0verlapped); 
    //   ReadFile    ,  
    //        

      /,    .  
 /        
.          
,      ,   
.  ,    ,  
      ,   . 
      /  . ,     
 OVERLAPPED.   2  ReadFile   
  ,    ,       
.   , ,      ,    
    .     Microsoft 
  ReadFile  WriteFile ,     
   /    OVERLAPPED. 
       ReadFile  WriteFile,  ,   
    ;   ,       
 .         ,  
  ,        . 
    ,     
DWORD,     IpNumberOfBytesRead  
IpNumberOfBytesWritten.     /   
 , ReadFile  WriteFile  TRUE.     
 /, ReadFile  WriteFile     FALSE, 
    /   .     , , 
  ,  GetLastError.    
ERROR_IO_PENDING,        . 
      /   ,     
      (   
 ).          
,  ReadFile  'WriteFile  FALSE,  GetLastError  
ERROR_INVALID_USER_BUFFER,  ERROR_NOT_ENOUGH_MEMORY.    . 
     /,     
,     2.      
 (working set)  .       
,   /  ,  GetLastError   
ERROR_NOT_ENOUGH_QUOTA.    ,   SetProcessWorkingSetSize: 

    BOOL SetProcessWorkingSetSize(HANDLE hProcess, 
    DWORD dwMinimumWorklngSetSIze, DWORD dwMaximumWorkingSetSize); 

    2.     .  7 (,    
 VirtnalLock  VirtualUnlock). 

    _________________________ 15. : / 483 

      ,   .       
/ ,        (  
GetLastError) ERROR_INVALID_USER_BUFFER, ERROR_NOT_ENOUGH_MEMORY  
ERROR_NOT_ENOUGH_QUOTA,       
  /      . 

    /^ 
       /  ,   ,   
OVEREAPPED  !       
  ,    . 

         ,    
   -  .      
   -      
/.  ,       , 
        ,     
       . 
     Win32      , . 
.      ,    .  
ReadFilen WriteFile     ,    
   . ,     , 
      .  
WaitForSingleObject  WaitForMultipleObjects,     
         
 .      : 

    //     / 
    HANDLE hFile = Cr-eateFile(, .., FILE_FLAG_OVERLAPPED, ,..); 
    ^ // "     
    BYTE bBuffer[100]; 
    //    DWORD     
    DWORD dwNumBytesRead; 
    //   OVEREAPPED,   
    // ,    
    OVEREAPPED Overlapped; 
    Overlapped.Offset = 345; 
    Overlapped.OffsetHigh = 0; 
    Overlapped.hEvent = NUEE; //   
    //     
    ReadFile(hFile, bBuffer, sizeof(bBuffer), &dwNumBytesRead, .Overlapped); 
    
    //   ReadFile    ,  
    //        
    
    // IIOIOK    i  :  ; ., :.,\ 
    //        
    WaitForSingleObject(hFile, INFINITE); 

    . . . 

    484 _______________________________Windows   


    //  ,    , 
    //     

         .     
,   ,     . 
      : 

    BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED IpOverlapped, LPDWORD 
IpcbTransfer, BOOL fWait); 

     hFile  IpOverlapped    GetOverlappedResult  
         OVERLAPPED,    
 ReadFile  WriteFile.  IpcbTransfer    
 DWORD,      ,    
   /.       
,        ,    
   . 
        fWait   ,   
GetOverlappedResult,       
.    FALSE,    ,     
 TRUE,  GetOverlappedResult    WaitForSingleObject. 
       GetOverlappedResult  TRUE.   
fWait  FALSE   /   , 
GetOverlappedResult  FALSE.  ,    
 GetOverlappedResult      , 
 GetLastError.    ERROR_IO_INCOMPLETE,   
 ,   /   . 
     Windows 95  GetOverlappedResult    
 . 
     OVERLAPPED   ,    
.     : 

    void Fund (void) { 
    //     / 
    HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...); 
    //      
    BYTE bBuffer[100]; 
    Func2(hFile, bBuffer, sizeof(bBuffer)): 
    void Func2 (HANDLE hFile, LPVOID bBuffer, DWORD dwBufSize) { 
    DWORD dwNumBytesRead; 
    //   OVERLAPPED,  ib , 
    //    

    _________________________ 15. : / 485 


    OVERLAPPED Overlapped; 
    memset(&0verlapped, 0, sizeof'(Overlapped)): 
    //    
    ReadFile(hFile, bBuffer, dwBufSize. &dwNumBytesRead, &0verlapped): 
    } 

      ,    OVERLAPPED,   
 Func2,    ,  Func2    
Fund.           ReadFile ( 
WriteFile).  / ,     Internal, 
InternalHigh  hEvent  . ,      
,      ,    ,   
     ! 
      - Windows NT  Internal  InternalHigh 
 OVERLAPPED,       
/,     .   Microsoft 
 ,          .  
     ,    , 
   .     ,   
Internal   ,   InternalHigh    
.       ,     
IpcbTrasfer  GetOverlappedResult. 

           

          ,     , 
         /. ,  
          
,         
     .   ,  
     ,     . 
        ,      
 , ,  WaitForSingleObject     
,   ,    :   . 
,        
 . ,  ,  . 
     hEvent,    OVERLAPPED,   
 ,      CreateEvent (  
 .  10).      
/,     hEvent  NULL.  hEvent 
  NULL, ,  SetEventn  hEvent   
-,      .   
      . ,   
     ,   
 ,   . 
            /,  
     ,    OVERLAPPED 
  hEvent   ReadFile win WriteFile.  
,           
/,  WaitForMultipkObjects,    , 
    OVERLAPPED.    , 
          
 /,    . 

    486 ______________________________Windows   

           
/    GetOverlappedResult.    fWait 
 TRUE,    WaitForSingleObject     hEvent 
 OVERLAPPED. 
         .       
/      (    ), 
    .  WaitForSingleObject,   
  /,        
    .    
GetOverlappedResult,      ,  
 TRUE    fWait.       
WaitForSingleObject.    WaitForSingleObject    
,     .   
GetOverlappedResult    ,    ! 

     / 

      ,     _  
    (asynchronous procedure call, APC). 
-   ,    ,    
11.  -     ,   , 
           
    .  
-  ,   ,   
    . 
       /    - 
 .       , 
  ReadFileEx  WriteFileEx: 

    BOOL ReadTileEx(HANDLE hFile, LPVOID IpBuffer, 
    DWORD nNumberOfBytesToRead, LPOVERLAPPED IpOverlapped, 
    LPOVERLAPPED_COMPLETION_ROUTINE IpCompletionRoutine); 
    BOOL WriteFileEx(HANDLE hFile, CONST VOID *lpBuffer, 
    DWORD nNumberOfBytesToWnte, LPOVERLAPPED IpOverlapped, 
    LPOVERLAPPED_COMPLETION_ROUTINE IpCompletionRoutine): 
    
     Windows 95  ReadFileEx,  WriteFileEx     
FALSE.   GetLastError  ERR6Rl'CTLL_NOT_IMPLEMENTED. 
     ReadFileEx  WriteFileEx      
/     .     
  ,    -    .   
 2     (   
    ).    /,  
 ReadFileEx  WriteFileEx, ,    
     - 3.     
     ,    ,   
 ReadFileEx  WriteFileEx. 
     ReadFileEx/WriteFileEx    ,    
ReadFile/WriteFik,    . -, *-   
    
    3.      hEvent  OVERLAPPED 
       . 

     15. : / 487 

    DWORD,       ;   
      .  -, ^Ex- 
         
(completion routine): 

    VOID WINAPI FileIOCompletionRoutine(DWORD fdwError, DWORD cbTransferred, 
LPOVERLAPPED Ipo): 

         ,   ,    
  /. ,      
3   : 

    hFile = CreateFile(.,,); 
    //    ReadFileEx 
    ReadFileEx(hFile, ...); 
    //    WriteFileEx 
    WriteFileEx(hFile,,..); 
    //    ReadFileEx 
    ReadFileEx(hFile, ..,); 
    SomeFuncO; 

       SomeFunc  ,    
     3  /.   
 SomeFunc,       - , 
  .    : 

    1-  WriteFileEx  
    2-  ReadFileEx  
    1-  ReadFileEx  

    -  .  ,     
 : ,  ,   
,  .   -    
 :  ,   ,   
OVERLAPPED (  ReadFileEx  WriteFileEx) __ . 
       ,    -   
    :       
-      .    
-,      (alertable) .   
  :      ,     
 .        Win32 
 5 :

    DWORD SleepEx(DWORD dwTimeout, BOOL fAlertable); 
    DWORD WaitForSingleObjectEx(HANDLE h0b]ect, DWORD dwTimeout, BOOL fAlertable): 
    DWORD WaitForMultipleOb]ectsEx(DWORD cObjects, LPHANDLE IphObjects, BOOL 
fWaitAll, DWORD dwTimeout, BOOL fAlertable); 
    BOOL SignalObjectAndWait(HANDLE hOb]ectTo8ignal, HANDLE hObJectToWaitOn, 
DWORD dwMilliseconds, BOOL fAlertable); 
    DWORD MsgWaitForMultipleObjectsEx(DWORD nCount, LPHANDLE pHandles, DWORD 
dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags); 

    488 ____________________________Windows   

            ,  
,       .   
 MsgWaitForMultipleObjectsEx     MWMO_ALERTABLE. 
,  Sleep, WaitForSingleObjectu WaitForMultipleObjects  
    *-   FALSE   fAlertable. 
          5      
   ,      -. 
       ,      
            
        , 
      OVERLAPPED.    
   ,  ,    
-   -.  ,   .  
 ,    ,      
   .   :      
  -   ! 
             
 -.     ,  ,   
     -   -.   
 (     )     
 ,     .    5 
     ,    
      . 
     5    .    WAIT_IO_COMPLETION, 
,    ,      
 .     ,   
-   ,      
  - ( .  10). 
     Windows 95  Windows NT 4   ,   
   -: 

    DWORD QueueUserAPC(PAPCFUNG pfnAPC, HANDLE hThread, DWORD dwData); 

          -  : 

    VOID WINAPI APCFunc(DVJORD dwParam); 

       QueueUserAPC   ,   
   . ,        
.  hThread    ,  
pfnAPC        . , , 
 dwData   32- ,   
 . 
     QueueUserAPC   ,    
DWORD,       ,      
  .   QueueUserAPC    
,    .     
   32 . 
    VviNDowsY  QueueUserAPC    Windows 95,   
      Kernel32.DLL.   
    Windows NT 4,    Windows 95. 
             
- . ,     , 
   ,   ,   
   ;       
 . 

    _________________________  15. : / 489 

       ReadFileExn    
    .    
     ,    
  ,      
FileIOCompletionRoutine.        
   ,      ReadFileEx. , 
    ,   FileIOCompletionRoutine,  
        . 
       /  ,   
           . 
       . , 
,      /    - 
.    ,   ,  
    . , ,     
  ,           
    .    , 
Microsoft   Win32 API     / ( 
      ). 

    - AlertIO 

     AlertIO (ALERTIO. EXE) (.   . 15-1)  
 /.         
   ALERTIO  -,   .   
 ,  ,      ALERTIO.CPY.  
     : 

    Pathname: 
    Browse...    |j               RIesize:  0 

      ,   Browse (). ,  , 
    Pathname ( )  File Size ( ). 
  Copy ()     FileCopy,   
    PrepareDstFile,     
   -. :     
CreateFik   FILE_FLAG_NO_BUFFERING,      
         -. 

    /\ 

        ,   -,  
   SetFilePointer  SetEndOfFile.    
   ,  NTFS    
(highwater marker),       ,  
  .     ,    
,    .       
          
,         .  
     2,     
  ,   .     
 ,      , NTFS  
.     AlertIO     
-,         . 

    490 ______________________________Windows   

           /.   
 MAX_PENDING_IO_REQS  IOREQ.     
 OVERLAPPED,    ReadFileEx  WriteFileEx.  
   Offset  OffsetHigh      
.   hEvent  NULL, ,     
,     ,   ReadFileEx  
WriteFileEx,   . 
      OVERLAPPED,     /  
  .   ,    IOREQ  pbData  
   ,   VirtualAlloc.   
       ,  
    FILE_FLAG_NO_BUFFERING (  
  ,        ). 
         IOREQ  ReadFileEx, 
        1.   
,  -,    AlertIO,   
.     /,   , , 
     .     SleepEx 
  INFINITE       . SleepEx 
 ,        -. 
            ,  - 
   .      
 ( SleepEx),  -     
ReadCompletionRoutine.    ^Overlapped   PIOREQ. 
    :      
OVERLAPPED        ReadFile(Ex)  
WriteFile(Ex).      OVERLAPPED   
,           
     . 
     ReadCompletionRoutine      
.      ,     
  . ReadCompletionRoutine    
    ,   ,    
   CreateFile   FILE_FLAG_NO_BUFFERING.  
 WriteFileEx,       -;  
         1. 
         -     
.      ,   
     WriteCompletionRoutine,   
 ,   ReadCompletionRoutine:   
     , ,      
  ,  ReadFileEx,      
    . 
      ,  SleepEx     
    /.      
  CopyCleanup,      -.  
   -,       
FILE_FLAG_NO_BUFFERING.         
 ,    -    . 

    __________________________ 15. : / 491 


    ALERTIO.C 
    /*.******.*..*****.,.**..*.*,,*..**...***.,*...,**.,*********...***.,.*,*..*** 
    : AlertIO.C : Copyright  1995-1997,   (Jeffrey Richter) 
    (tinclude "..\CmnHdr.H"              /* .   */ 
    ftinclude <windows.h> 
    ^include <windowsx.h> 
    ftinclude <tchar.h> 
    include <stdio.h> 
    ftinclude <stdlib.h> 
    ffinclude "Resource.H" 
    ll/lllllll/l/lllllllllllllllllllllll/lll/HIIIIII/lllllll/ltlllllllllllllllll/l 
    static BOOL PrepareOstFile(LPCTSTR pszFileSrc, LPCTSTR pszFileDst, 
    PHANDLE phFileSrc, PHANDLE phFileDst, 
    PULARGE_INTEGER pulFileSize, DWORD dwPageSize) { 
    ULARGE_INTEGER ulFileSizeDst; 
    DWORD dwError: 
    BOOL fOk = FALSE; 
    __try { 
    //      
    *phFileSrc = CreateFile(pszFileSrc, GENERIC_READ, 
    FILE_SHARE_READ, NULL, OPEN_EXISTING, 
    FILE_FLAG_NO_BUFFERING : FILE_FLAG_OVERLAPPED, NULL); 
    if (*phFileSrc == INVALID_HANDLE_VALUE) 
    __leave; 
    //  -,     
    *phFileDst = CreateFile(pszFileDst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 
    FILE_FLAG_NO_BUFFERING ; FILE_FLAG_OVERLAPPEO, *phFileSrc); 
    if (*phFileDst == INVALID_HANDLE_VALUE) 
    __leave: 
    //     
    pulFileSize->LowPart = GetFileSize(*phFileSrc, &pulFileSize->HighPart): 
    //       
    //  ,    
    ulFileSizeDst.QuadPart = (pulFileSize->QuadPart + 
    dwPageSize - 1) & -(dwPageSize - 1): 

    . . . 

    . 15-1.   AlertIO 


    492 ______________________________Windows   


    . 15-1 () 

    II   - 
    dwError = SetFilePointer(*phFileDst, ulFileSizeDst.LowPart, 
    (PLONG) ulFileSizeDst.HighPart, FILE_BEGIN): 
    if ((dwError == Oxffffffff) && (6etLastError() != NO_ERROR)) 
    __leave; 
    if (!SetEndOfFile(*phFileDst)) 
    __leave; 
    fOk = TRUE: //    
    } 
    finally { 
    //   - ,   
    if (!f0k) { 
    if (*phFileSrc != INVALID_HANDLE_VALUE) { 
    CloseHandle(*phFileSre); 
    *phFile8rc = INVALID_HANDLE_VALUE; 
    } 
    if (*phFileSrc != INVALID_HANDLE_VALUE) { 
    CloseHandle(*phFileDst): 
    *phFileDst = INVALID_HANDLE_VALUE; 
    \ I 
    } return(fOk); 
    /////////////////////////////////////////////////////////////////////////////// 
    static void CopyCleanup(LPCTSTR pszFileDst, HANDLE hFileSrc, 
    HANDLE hFileDst, PULARGE_INTEGER pulFileSize) { 
    //     - 
    CloseHandle(hFileDst); 
    CloseHandle(hFileSrc); 
    //     -,  
    //   FILE_FLAG_NO_BUFFERING.    
    //     ,    . 
    hFileDst = CreateFile(pszFlleDst, GENERIC_WRITE, 
    FILE_SHARE_READ ; FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL): 
    if (hFileDst != INVALID_HANDLE_VALUE) { 
    //   -    
    // ,        

    . . . 

    ___________________________ 15. : / 493 


    . 15-1 () 

    SetFilePointer(hFileOst, pulFileSize->LowPart, (PLONG) 
pulFile8ize->HighPart, FILE_BEGIN); 
    SetEndOfFile(hFileDst); 
    CloseHandle(hFileOst): 
    typedef struct { 
    //  ,     
    DWORD dwPageSize; 
    //     - 
    HANDLE hFileSrc, hFileDst; 
    //    
    ULARGE_INTEGER ulFileSize: 
    //    ,      
    ULARGE_INTEGER ulNextReadOffset; 
    //     / 
    int nReadsInProgress; 
    int nWriTesInProgress; 
    } COPYSTATE, *PCOPYSTATE; 
    COPYSTATE g_cs: 
    //     OVERLAPPED   
    typedef struct { 
    OVERLAPPED Overlapped; 
    PBYTE      pbData; 
    } IOREQ, *PIOREQ; 
    ftdefine MAX_PENDING_IO_REQS  4 
    #define BUFFSIZE              (64 * 1024) 
    ////////////////////////////////////////////////////
    VOID WINAPI WriteCompletionHoutine(DWORD dwErrorCode, 
    DWORD dwNurnberOfBytesTransferred, LPOVERLAPPED pOverlapped): 
    /////////////////////////////////////////////////////
    VOID WINAPI ReadCompletionRoutine(DWORD dwErrorCode, 
    DWORD dwNumberOfBytesTransfe^-ed^ LPOVERLAPPED pOverlapped) { 

    . . . 

    494 ______________________________Windows   


    . 15-1 () 

    PIOREQ pIOReq = (PIOREQ) pOverlapped; 
    chASSERT(dwErrorCode == NO_ERROR); 
    n_cs.nReadsInProgress--; 
    //       , 
    //       
    dwNumPerOfBytesTransferred = 
    (dwNuniberOfBytesTransferred + g_cs. dwPageSize - 1) & ~(g_cs. dwPageSize - 1); 
    chVERIFY(WriteFileEx(g_cs.hFileDst, pIOReq->pbData, 
    dwNumberOfBytesTransf erred, pOverlapped, WriteCompletlonRoutine)); 
    g_cs,nWritesInProgress++; 
    VOID WINAPI WriteCompletionRoutine(DWORD dwErrorCode, 
    DWORD dwNumberOfBytesTransferred, LPOVERLAPPED pOverlapped) { 
    PIOREQ pIOReq = (PIOREQ) pOverlapped; 
    chASSERT(dwErrorCode == NO_ERROR): 
    g_cs.nWritesInProgress-: 
    if (g_cs.ulNextReadOffset.QuadPart < g_cs.ulFileSize.QuadPart) { 
    //       ;     
    p0verlapped->0ffset       = g_cs.ulNextReadOffset.LowPart; 
    pOverlapped->OffsetRigh   = g_cs.ulNextReadOffset.RighPart; 
    chVERIFY(ReadFileEx(g_cs.hFileSrc. pIOReq->pbData, 
    BUFFSIZE, pOverlapped, ReadCompletionRoutine)); 
    g_cs,nReads!nProgress++; 
    //    ,      
    g_cs.ulNextReadOffset.QuadPart += BUFFSIZE; 
    BOOL FileCopy (LPCTSTR pszFileSrc, LPCTSTR pszFileDst) { 
    //       / 
    IOREQ IOReq[MAX_PENDING_IO_REQS] = { 0 }; 
    SYSTEM_INFO si: 
    int nIOReq: 
    BOOL fOk; 
    //    COPYSTATE 
    Get8ystemlnfo(&si); 

    . . . 

    _________________________ 15. : / 495 


    . 15-1 () 

    g_cs.dwPage8ize = si.dwPageSize; 
    g_cs. ulNextReadOffset.QuadPart = 0; 
    g_cs.nReadsInProgress = 0; 
    g_cs.nWritesInProgress = 0: 
    //      
    f0k = PrepareDstFile(pszFileSrc, pszFileDst. &g_cs.hFileSrc. &g_cs.hFileDst, 
    &g_cs.ulFileSize, g_cs.dwPageSize): 
    if (!f0k) 
    return(fOk): 
    //   ,    
    //      
    for (nIOReq = 0; nIOReq < MAX_PENDING_IO_REQS; nIOReq++) { 
    IOReq[nIOReq].Overlapped.Internal = 0: 
    IOReq[nIOReq].Overlapped.InternalHigh = 0; 
    IOReq[nIOReq].Overlapped.Off set = g_cs.ulNextReadOffset,LowPart; 
    IOReq[nIOReq].Overlapped.OffsetHigh = g_cs,ulNextReadOffset.HighPart; 
    IOReq[nIOReq].Overlapped,hEvent = NULL; 
    IOReq[nIOReq].pbOata = VirtualAlloc(NULL, 
    BUFFSIZE, MEM_RESERVE ; MEM_COMMIT, PAGE_READWRITE); 
    if (g_cs,ulNextReadOffset.QuadPart < g_cs.ulFileSize.QuadPart) { 
    chVERIFY(ReadFileEx(g_cs.hFileSrc, IOReq[nIOReq].pbOata, BUFFSIZE, 
    &IOReq[nIOReq].Over lapped, ReadCompletionRoutine)); 
    g_cs.nReads!nProgress++; 
    g_cs.ulNextReadOffset.QuadPart += BUFFSIZE; 
    } 
    //  ,      
    // -     
    while ((g_cs.nReadsInProgress > 0) !! (g_cs.nWritesInProgress > 0)) { 
    SleepEx(INFINITE, TRUE): 
    //  ,    
    for (nIOReq = 0; nIOReq < MAX_PENDING_IO_REQS; nIOReq++) { 
    VirtualFree(IOReq[nIOReq].pbData, 0. MEM_RELEASE): 
    //       
    //      
    CopyCleanup(pszFileDst, g_cs.hFileSrc, 
    g_cs.hFileDst, &g_cs.ulFileSize); 
    '"t.ir'ifTRUF): 

    . . . 

    496 _______________________________Windows   


    . 15~1 () 

    BOOL Dlg_0nlnit0ialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    //      
    chSETDLGICONS(hwnd, IDI_ALERTIO, IDI_ALERTIO); 
    //   Copy,       
    EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); 
    return(TRUE); 
    void Dlg_OnConimand (HWND hwnd, int id, HWND hwndCtI, UINT codeNotify) { 
    TCHAR szPathname[_MAX_DIR]; 
    BOOL fOk; 
    OPENFILENAME ofn; 
    switch (id) { 
    case IDOK: 
    //     - 
    Static_GetText(GetDlgItem(hwnd, IDC_SRCFILE), 
    szPathname, sizeof(szPathname)); 
    SetCursor(LoadGursor(NULL, IDC_WAIT)): 
    FileCopy(szPathname, __TEXT("AlertIO.CPY")); 
    break; 
    case IDC_BROWSE: 
    chINITSTRUCT(ofn, TRUE); 
    ofn.hwnddwner = hwnd; 
    of-n.lpstrFilter = __TEXT("*.*\0"): 
    _tcscpy(szPathname, __TEXT("*.*")); 
    ofn,IpstrFile = szPathname; 
    ofn.nMaxFile = sizeof(szPathname); 
    Ofn.Flags = OFN_FILEMUSTEXIST; 
    fOk = GetOpenFileName(&ofn); 
    if (fOk) { 
    HANDLE hFlle; 
    Static_SetText(GetDlgItem(hwnd. IDC_SRCFILE), szPathname): 
    hFile = CreateFile(szPathname, GENERIC_READ, 
    0, NULL, OPEN_EXISTING, 0, NULL); 
    SetDlgItemInt(hwnd. IDC_SRCFILESIZE. 
    GetFileSize(hFile, NULL), FALSE); 
    CloseHandle(hFile); 

    . . . 

    ________________________ 15. : / 497 


    . 15-1 () 

    II   Copy,    
    //     
    GetWindowText(GetDlgItem(hwnd, IDC_SRCFILE), 
    szPathname, sizeof(szPathname)); 
    EnableWindow(GetDlgIteni(hwnd, IOOK), 
    szPathname[0] != __TEXT('(')): 
    if (fOk) { 
    //         
    //   ,     Copy 
    FORWARD_WM_NEXTDLGCTL(hwnd, GetDlgItem(hwnd, IOOK), TRUE, SendMessage); 
    case IDCANCEL: 
    EndDialog(hwnd, id); 
    break; 
    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); 
    } 
    return(FALSE); 
    int WINAPI _tWinMain (HINSTANCE hinstExe. 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    chWARNIFUNICODEUNDERWIN95(); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_ALERTIO), NULL, Dlg_Proc); 
    return(O): 
    ///////////////////////////   ///////////////////////////

    498 ______________________________Windows   


      / 

    Windows NT   ,   , 
 ,      . 
  (  ,    
)   Windows NT Workstation,      
Windows NT Server. 

    WINDOWS  B Windows 95     . 

     2     : 
            (  ); 
  ,     ; 
            ,    
 ,    ,     . 
              
. ,    , . 
          ,    
    .  2   
  ,      ,  
      . ,  
  ,     SMP. , 
       ,  
     .  
   Ping. 
    "- ,   ,   
 .         
 .     ,     
  .      .  
     ,     
    ,   .  , 
,   ,   .  
,      ,  
,    ,    
   SMP-.     
(   )    
  . 
         Windows NT  ,  
  ,     ,  
      ,   .  
,        
    .      
  (. .  ), Microsoft  ,   
Windows NT         
          . 
      Windows NT    ,  
   .    Windows NT 3.5      
  / (I/O completion port).     
  :  

    _________________________  15. : / 499 

         . , 500 
     500 .     
? ,    ,      
           
.    ,     
     . 
              
  .     ,  
     4 ,     
,     .    
  ,        
,           
 .          /. 
      /, ,    , 
  Win32 API.    ,  CreateIoCompletionPort: 

    HANDLE CreateIoCompletionPort(HANDLE hFileHandle. 
    HANDLE hExistingCompletionPort, DWORD dwCompletionKey, DWORD 
dwNumberOfConcurentTh reads): 

        :    /  
   .   , ,   , Microsoft 
     .     /,  
   ,    2  .   
 CreateNewCompletionPort: 

    HANDLE CreateNewCompletionPort(DWORD dwNumberOfConcurrentThreads) { 
return(CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 
    dwNumberOfConcurrentThreads)); 
    } 

         , dwNumberOfConcurrentThreads,  
  CreateIoCompletionPort,      
 ,      dwNumberOfConcurrentThreads. 
 ,     CreateIoCompletionPort  
       / (   
  ).    ,   3 : 
INVALID_HANDLE_VALUE, NULL   . 
     dwNumberOfConcurrentThreads    
/   ,    . 
  ,         
.  ,    ,   ,  
     .    , 
     ,   
.     
'dwNumberOfConcurrentThreads,       
  . 
    ,   ,  CreateIoCompletionPort 
,         
LPSECURITY_ATTRIBUTES. A   ,     
    .    ,     
  . 
         /,   5  
,   . 15-2 (       
 ). 

    500 ______________________________Windows  ! 


      

      : 

    hDevice       dwCompletionKey 

      : 
      CreateCompfeh'onPort. 

      : 
       . 

      / (FIFO) 

      : 

    dwBylesTransferred dwCompletionKey    pOverlapped        dwError 

      : 
         /; 
      PostQueuedComplelionStafus. 
     , : 
            . 

    . 15-2.     / 

    _________________________ 15. : / 501 


    . 15-2 () 

      (waiting)  (LIFO) 

      : 

    dwThreadId 

      : 
       GerQueuedCompletionStatus. 
     , : 
       /  ,   
        ( 
    /, dwThreadId    
 , a GefQueuedCompleft'onStatus  ). 

      (released)  

      : 
    dwThreadId 
     , : 
            ; 
       . 
     , : 
        GerQueuedCompfetionStatus (dwThreadId  
          ); 
       ,    
      (dwTnreadId     ). 
      (paused)  
      : 

       dwThreadId 

     , : 
        ,   . 
     , : 
        (dwThreadId    
  ). 

    502 ______________________________Windows   

         .     
 ,        .  
  ,  CreateIoCompletionPort.    
, AssociateDeviceWithCompletionPort,     
CreateIoCompletionPort 

    BOOL AssociateDeviceWithCompletionPort(HANDLE hCompPort, 
    HANDLE hDevice, DWORD dwCompKey) { 
    HANDLE h = CreateIoCompletionPort(hDevice, hCompPort, dwCompKey, 0); 
    return (h == hCompPort); 

     AssociateDeviceWithCompletionPort     
    .     
 (   CreateNewCompletionPort), 
  (   , ,  , 
  . .)      (completion key)   
 32- ,   '~ ,  
    ,        
  . 

    /\ 
         2    CreateIoCompletionPort,  
     .    
  ,     . ,    
 ,        .   
  /      COMPKEY_FILE. 
     .                               

    ftdefine COMPKEY_FILE 1               --., ^ 
    HANDLE hFile = CreateFile(...); 
    HANDLE hPort = CreateIoCompletionPort(NULL, hFile, COMPKEY_FILE, 2); 

    Windows NT 3.5 ,         
- !  - .  , Windows NT 3.5  
   INVALID_HANDLE_VALUE     
CreateIoCompletionPort.    3.51,    
,     INVALID_HANDLE_VALUE     
 ,     . 
          / (I/O completion 
queue).       /  
,      , ,  ,  
      /,     
..       , 
32-  ,      , 
   OVERLAPPED    .    
,      . 

    /\ 
         ,   
         
/.    ,   . ,  
       ,    
 .     /     
  ,    hEvent  OVERLAPPED 
         OR 
 1: 

    . . . 

    _________________________  15. : / 503 


    Overlapped. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
    Overlapped.hEvent |= 1; 
    /iw*'w-\ ReadFile(..., &0verlapped); 

          /,    
OVERLAPPED   /32- (   ReadFik). 
     ,         
 . ,     - : 

    Overlapped.hEvent = 1; 
    ReadFile(..., &0verlapped); 

        . 
     ,       : 

    CloseHandle(Overlapped. hEvent &.^_1J_ 

           , 
 -  CreateNewCompletionPort.     , 
  .   :     
 ?   ,     .     
,        .  
,        4 . 
           .    
   ,    ,   
   .       ,  
 / .      GetQueuedCompletionStatus: 

    BOOL GetQueuedCompletipnStatus(HANDLE hCompletionPort, 
    LPDWORD IpdwNumberOfBytesTransferred, LPDWORD IpdwCompletionKey. 
    LPOVERLAPPED *lp0verlapped, DWORD dwMilliseconds); 

      , hCompletionPort,    
/,    .   
   ,      
/  .   GetQueuedCompletionStatus 
 ,        -   
       ,   
 dwMilliseconds. 
      ,     /,  
   (waiting thread queue).      
GetQueuedCompletionStatus,       
.       /  
,       /.   
   ,       
 .    ,    
 /:   ,     
 OVERLAPPED.     
IpdwNumberOfBytesTransferred, IpdwCompletionKey  IpOverlapped  GetQueuedCompletionStatus. 
           .   
    (,     
),   FALSE, a GetLastError    (  
 ERROR_INVALID_HANDLE).     -  
-,   FALSE,  GetLastError  WAIT_TIMEOUT. 
          ,   
  IpdwNumberOfBytesTransferred, IpdwCompletionKey  
IpOverlapped,     ,    
.    

    504 ______________________________Windows   

        /, 
GetQueuedCompletionStatus  TRUE.       
,  FALSE,    GetLastError    /. 
     ,   GetQueuedCompletionStatus  
: -   /,  -   
-  ,    IpOverlapped,  
 : 

    DWORD dwNumberOfBytesTransferred, dwCompletionKey; 
    LPOVERLAPPED IpOverlapped; 
    
    //  hIOCompPort  -     
    BOOL fOK = GetQueuedCompletionStatus(hIOCompPort, 
    &dwNumberOfBytesTransferred, &dwCo(npletionKey, &lp0verlapped, 1000); 
    DWORD dwError = GetLastError(); 
    if (fOK) { 
    //      / 
    } else { 
    if (IpOverlapped != NULL) { 
    //   ; 
    //  dwError    
    } else { 
    if (dwError == WAIT_TIMEOUT) { 
    //        
    } else { 
    //    GetQueuedCompletionStatus: 
    // dwError    
    } 

              
  (first-in-first-out, FIFO).  ,  
GetQueuedCompletionStatus,  :     
 (last-in-first-out, LIFO).     
. , 4      . 
     /   , 
 GetQueuedCompletionStatus.     . 
,     GetQueuedCompletionStatus,    
   .        
(   /),        . 
       /   ,   
    ,    .  
  LIFO   (  )7 
 ,     ,   
  .     ,    
,    .     
 ,      , 
        . 

    _________________________ 15. : / 505 

     ,      /. -, 
  ,    ,    
.    ,     
  .4        
   .      ,  
 .  ,   4   4     
GetQueuedCompletionStatus,   /   2 
    .    , 
    GetQueuedCompletionStatus.     
  ,      ,  
   . 
       ,   ,  ,  
:    /    
 ,       ?' 
,       2 ,   
 /, ,       2 
,        4  (   
).  ,    2  ,  
  . 
      /  .    
,       , 
   ,     (released thread 
Hst) (. . 15-2).       
 .      ,  
   ,     ,     
,       (paused thread 
list)    ,     /. 
             
    ,     .  
        ,  
    ,    
,        .  
  ,       
    .   ,     
       ,   . 
        .    - 
 .    ,   
   2 ,   4 ,     
/.      3 ,    
   2 .       
  ,    .   
     Sleep, WaitForSingleObject, 
WaitForMultipleObjects, SignalObjectAndWait  -  , 
  .   /   
    . 
             .   
,        . 
              , 
          
.   ,       
          
       GetQueuedCompletionStatus.  
      ,     . 
    4.    ,   GetSystemlnfo (. 
 6). 

    506 ______________________________Windows   

           .   ,  
 ,        
         .  
     ,    ,  .  
 ,      ,   
        
.          , 
         . 
    , ,      . 
, Internet Information Service (US),  Microsoft,  
      .   
,  IIS  ,  .   
US-     10   .    
          , 
      ,   .5 
            ISAPI DLL, US- 
        1,   
ISAPI-  , IIS    
.   ,  IIS  ,   ISAPI-.   
    , US-     . 
            ,  
    .        
   .  ,    
,       (    ,   
     ). IIS    . 
   1    GetQueuedCompletionStatus  
     .6 
         ,      
      .  ,      
 ,    ?      
. IIS  ,    GetQueuedCompletionStatus 
-,  24 .        ,  
     ,     . 
      ,         ,  
  .    ,    
.          ,  
   ,     . 
        / 
     Windows NT 3.51 Microsoft   ,    
,  PostQueuedCompletionStatus: 

    BOOL PostQueuedCompletionStatus(HANDLE hCompletionPort, 
    DWORD dwNumberOfBytesTransferred, DWORD dwCompletionKey, 
    LPOVERLAPPED IpOverlapped); 

             
/ .  hCompletionPort   ,  
  
    5.     Microsoft US,      
   ,    .      
       . 
    6.       
Interlockedlncrement  InterlockedDecrement. 

    _________________________ 15. : / 507 

       .   
(dwNumberOfBytesTransferred, dwCompletionKey  IpOverlapped)  
,    GetQueuedCompletionStatus.   
      ,   
 TRUE,       /. 
     PostQueuedCompktionStatus  :      
     . ,    
 ,      .   
  /, ,      , 
   .  PostQueuedCompletionStatus     
  ,   .   ,  
GetQueuedCompktionStatus, ,   ,   
   . 
      ,   .    
  ,      ,    
GetQueuedCompletionStatus. ,     -    
      GetQueuedCompletionStatus,  
 .   ,      
 LIFO. ,       
   ,   - 
       ,  
       . 

    - lOCmpPrt 

     lOCmpPrt (IOCMPPRT.EXE) (.   . 15-3)  
   /.      
      IOCMPPRT  -,  
 .    ,  ,    
IOCPMPRT.CPY.  ,    : 

    pathname: 
    Browse... |   |          |                 File size:   0 

      ,   Browse (). ,  , 
    Pathname ( )  File Size ( ). 
  Copy ()    FileCopy,    
  DstFile (    ,  
 AlertIO). 
      -   -   
CreateNewCompletionPort     /. ( 
  CreateNewCompletionPort    \32- 
CreateIoCompletionPort.)  ,     .  
    AssociateDeviceWithCompletionPort,    
 CreateIoCompletionPort.      / 
    .     
 .      KEY_READ,   
   COMPKEY_WRITE. 
        ( OVERLAPPED)  
  .          
 :  PostQueuedCompletionStatus,    
    

    508 _______________________________Windows   

     .       ,  - 
    .   ,  
,        , ,  ,  
ReadFile,    . 
      ,     .  
 ,  GetQueuedCompletionStatus;   ,   
,        .    
GetQueuedCompletionStatus      dwCompKey. 
   COMPKEY_READ, ,       
.    WriteFile,      
-.   dwCompKey  COMPKEY_WRITE,  ReadFile, 
      . 
         ,   .   
CloseHandle       /; 
        CopyCleanup.    
    -. 

    IOCMPPRT.C 
    : lOCmpPrt.C 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    *************************************************************
    ffinclude ",.\CmnHdr,H"              /* .   */ 
    Sinclude <windows.h> 
    Sinclude <windowsx.h> 
    Sinclude <tchar,h> 
    ftinclude <stdio.h> 
    ftinclude Otdlib. h> 
    ftinclude "Resource.H" 
    ////////////////////////////////////////////////////////////    
    HANDLE CreateNewCompletionPort(DWORD cSimultaneousClients) { 
    return(CreateIoCompletionPort(INVALID_HANDLE_VALUE, 
    NULL, 0, cSimultaneousClients)); 
    BOOL AssociateDeviceWithCompletionPort( 
    
    HANDLE hCompPort, HANDLE hDevice, DWORD dwCompKey) { 
    HANDLE h = CreateIoCompletionPort(nDevice, 
    hCompPort, dwCompKey, 0); 
    return(h == hCompPort): 
    ////////////////////////////////////////////////////////////
    static BOOL PrepareDstFile(LPCTSTR pszFileSrc, 
    LPCTSTR pszFileDst, PHANDLE phFileSrc, PHANDLE phFileDst, 

    . . . 

    . 15-3.   lOCmpPrt 


    _________________________  15. : / 509 


    . 15-3 () 

    PULARGE_INTEGER pulFileSize, DWORD dwPageSize) { 
    ULARGE_INTEGER ulFileSizeDst; 
    DWORD dwError; 
    BOOL fOk = FALSE; 
    _-try { 
    //      
    
    *phFileSrc = CreateFile(pszFileSrc, GENERIC_READ, 
    FILE_SHARE_READ, NULL, OPEN_EXISTING, 
    FILE_FLAG_NO_BUFFERING ; FILE_FLAG_OVERLAPPED, NULL): 
    
    if (*phFile8rc == INVALID_HANDLE,VALUE) 
    __leave; 
    //  -,     
    
    *phFileDst = CreateFile(pszFileDst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 
    FILE_FLAG_NO_BUFFERING ; FILE_FLAG OVERLAPPED, *phFileSrc); 
    
    if (*phFileDst == INVALID_HANDLE_VALUE) 
    __leave; 
    
    //     
    pulFileSize->LowPart = GetFileSize(*phFileSrc, &pulFileSize->HighPart); 
    
    //       
    //  ,    
    ulFileSizeDst.QuadPart = (pulFile8ize->QuadPart + 
    dwPageSize - 1) & ~(dwPageSize - 1); 
    
    //   - 
    dwError = SetFilePointer(*phFlleDst, ulFxIeSizeOst.LowPart, 
    
    (PLONG) ulFileSizeDst,HighPart, FILE_BEGIN): 
    if ((dwError == Oxffffffff) && (GetLastError() != NO_ERROR)) 
    __leave; 
    if (!SetEndOfFile(*phFileDst)) 
    __leave; 
    fOk = TRUE; //    
     
    f 
    finally { 
    //   - ,   
    if (!f0k) { 
    if (*phFileSrc != INVALID_HANDLE_VALUE) { 
    CloseHandle(*phFileSrc); 
    *phFileSrc = INVALID_HANDLE_VALUE; 
    } 

    . . . 


    510 ______________________________Windows   


    . 15-3 () 

    if (*phFileSrc != INVALID_HANDLE_VALUE) { 
    CloseHandle(*phFileDst); 
    *phFileDst = INVALID_HANDLE_VALUE; 
    } 
    f 
    return(fOk); 
    } 
    /////////////////////////////////////////////////////////////////////////////// 
    
    static void CopyCleanup(LPCTSTR pszFileDst, HANDLE hFileSrc, 
    HANDLE hFileOst, PULARGE_INTEGER pulFileSize) { 
    
    //      
    CloseHandle(hFileDst); 
    CloseHandle(hFileSrc); 
    
    //     -,  
    //   FILE_FLAG_NO_BUFFERING.    
    //     ,    . 
    hFileDst = CreateFile(pszFileDst, GENERIC_WRITE, 
    FILE_SHARE_READ ; FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 
    if (hFileDst != INVALID_HANDLE_VALUE) { 
    
    //   -    
    // ,        
    SetFilePointer(hFileDst, pulFileSize->LowPart, 
    (PLONG) pulFileSize->HighPart, FILE_BEGIN); 
    SetEndOfFile(hFileDst); 
    CloseHandle(hFileDst); 
    I / 
    I I 
    /////////////////////////////////////////////////////////////////////////////// 
    typedef struct { 
    
    //  ,     
    DWORD dwPageSize; 
    
    //     - 
    HANDLE hFileSrc, hFileDst; 
    
    //    
    ULARGE_INTEGER ulFileSize; 
    
    //    ,      
    ULARGE_INTEGER ulNextReaddffset; 

    . . . 

    _________________________ 15. : / 511 
    . 15-3 () 
    

    II     / 
    int nReadsInProgress; 
    int nWritesInProgress; 
    } COPYSTATE, *PCOPYSTATE; 
    COPYSTATE g_cs: 
    
    //     OVERLAPPED   
    typedef struct { 
    OVERLAPPED Overlapped; 
    PBYTE      pbData; 
    } IOREQ, *PIOREQ: 
    
    Sdefine MAX_PENDING_IO_REQS  4 
    (tdefine BUFFSIZE              (64 * 1024) 
    
    //       
    ftdefine COMPKEY_REAO   1 
    ffdefine COMPKEY_WRITE 2 
    
    /////////////////////////////////////////////////////////////////////////////// 
    BOOL FileCopy (LPCTSTR pszFileSrc, LPCTSTR pszFileDst) { 
    
    //       
    COPYSTATE cs; 
    
    //      
    IOREQ IOReq[MAX_PENDING_IO_REQS] = { 0 }; 
    SYSTEM_INFO si; 
    int nIOReq; 
    BOOL fOk, fDone = FALSE; 
    
    //   /,   
    //       
    HANDLE hIOCompPort = NULL; 
    DWORD dwNumBytesXfer, dwCompKey; 
    LPOVERLAPPED pOverlapped; 
    
    //    COPYSTATE 
    GetSystemInfo(&si); 
    cs.dwPageSize = si.dwPageSize; 
    cs.ulNextReadOffset.QuadPart = 0; 
    cs.nReadsInProgress = 0; 
    cs.nWritesInProgress = 0: 

    . . . 

    512 ______________________________Windows   


    . 15-3 () 
    
    I /      
    f0k = PrepareDstFile(pszFileSrc, pszFileDst, &cs.hFileSrc. &cs.hFileDst, 
    &cs,ulFileSize, cs.dwPageSize); 
    if (!f0k) 
    return(fOk); 
    
    //     
    hIOCompPort = CreateNewCompletionPort(O); 
    chASSERT(hIOCompPort != NULL); 
    
    //     /    
    //   .      COMPKEY_READ, 
    chVERIFY(AssociateDeviceWithCompletionPort(hIOCompPort, 
    cs.hFileSrc, COMPKEY_READ)); 
    
    //     /  - 
    //   .      COMPKEY_WRITE. 
    chVERIFY(AssociateDeviceWithCoinpletionPort(hIOCompPort, 
    cs.hFileDst, COMPKEY_WRITE)); 
    //   ,    
    //      
    for (nIOReq = 0; nIOReq < MAX_PENDING_IO_REQS; nIOReq++) { 
    IOReq[nIOReq].Overlapped.Internal = 0; 
    IOReq[nIOReq].Overlapped.InternalHigh = 0; 
    IOReq[nIOReq].Overlapped.Offset = 0; 
    IOReq[nIOReq].Overlapped.OffsetHigh = 0; 
    IOReq[nIOReq].Overlapped.hEvent = NULL; 
    IOReq[nIOReq].pbData = VirtualAlloc(NULL, 
    BUFFSIZE, MEM_RESERVE ; MEM_COMMIT, PAGE_READWRITE): 
    cs.nWrites!nProgress++; 
    PostQueuedCompletionStatus(hIOCompPort, 0, 
    COMPKEY_WRITE, &IOReq[nIOReq].Overlapped): 
    \ 
    f 
    I/  ,      
    // -     
    while ((cs,nReadsInProgress > 0) !! (cs.nWritesInProgress > 0)) { 
    PIOREQ pIOReq; 
    f0k = GetQueuedCompletionStatus(hIOCompPort, 
    &dwNumBytesXfer, &dwCompKey, &p0verlapped, INFINITE); 
    ChASSERT(fOk ;; (GetLastErrorO == NO_ERROR)); 
    pIOReq = (PIOREQ) pOverlapped; 
    
    switch (dwCortipKey) { 
    case COMPKEY_REAO: 
    cs.nReadsInProgress--; 

    . . . 

    _________________________ 15. : / 513 


    . 15~3 () 
    
    I/       , 
    //       
    dwNumBytesXfer = (dwNumBytesXfer + cs.dwPageSize - 1) & 
    -(cs.dwPageSize - 1); 
    f0k = WriteFile(cs.hFileDst, pIOReq->pbData, 
    dwNumBytesXfer, &dwNuffiBytesXfer, pOverlapped); 
    // ,    
    chASSERT(fOk ;: (!f0k && (GetLastError() == ERROR_IO_PENDING))); 
    cs.nWritesInProgress++; 
    break: 
    case COMPKEY_WRITE: 
    cs.nWritesInProgress--; 
    
    if (cs.ulNextReadOffset,QuadPart >= cs.ulFileSize.QuadPart) 
    break; 
    //       ; 
    
    //     
    p0verlapped->0ffset       = cs.ulNextReadOffset.LowPart; 
    pOverlapped->OrfsetHigh   = cs.ulNextReadOffset.HighPart; 
    
    f0k = ReadFile(cs.hFileSrc, pIOReq->pbData, 
    BUFFSIZE, &dwNumBytesXfer, pOverlapped); 
    
    //    , 
    //     
    chASSERT(fOk ;; (!f0k && (GetLastError() == ERROR_IO_PENDING))); 
    cs.nReadsInProgress++; 
    
    //    ,  
    //     
    cs.ulNextReadOffset.QuadPart += BUFFSIZE; 
    break; 
    } 
    
    //    / 
    CloseHandle(hIOCompPort); 
    
    //  ,    
    for (nIOReq = 0; nIOReq < MAX_PENDING_IO_REQS: nIOReq++) { 
    
    VirtualFree(H)Req[nIOReq].pWata, 0, ME_RELEASE), 
    } 
    
    II       
    //      
    CopyCleanup(pszFileDst, cs.hFileSrc, 
    cs.hFileDst, &cs.ulFileSize); 
    return(TRUE); 
    } 
    ///////////////////////////////////////////////

    . . . 

    514 ______________________________Windows   


    . 15-3 () 

    BOOL DIgJMnitDialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    
    //      
    chSETDLGICONS(hwnd, IDI_IOCMPPRT, IDI_IOCMPPRT): 
    
    //   Copy,       
    EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); 
    return(TRL)E); 
    1 
    / 
    /////////////////////////////////////////////////////////////////////////////// 
    
    void Dlg_OnCofH(Tiand (HWND hwnd, int id, HWND hwndCtI, DINT codeNotify) { 
    TCHAR szPathname[_MAX_DIR]; 
    BOOL fOk: 
    OPENFILENAME ofn; 
    switch (id) { 
    case IDOK: 
    
    //     - 
    Static_GetText(GetDlgItem(hwnd, IDC_SRCFILE), 
    szPathname, sizeof(szPathname)); 
    SetCursor(LoadCursor(NULL, IDC_WAIT)); 
    FileCopy(szPathname, __TEXT("IOC(npPrt.CPY")); 
    break: 
    case IDC_BROWSE: 
    chINITSTRUCT(ofn, TRUE); 
    ofn.hwndOwner = hwnd; 
    ofn.lpstrFilter = __TEXT("*.*\0"); 
    _tcscpy(szPathnaiDe, __TEXT("*. *")); 
    ofn.IpstrFile = szPathname; 
    ofn.nMaxFile = sizeof(szPathname): 
    ofn.Flags = OFN_FILEMUSTEXIST; 
    fOk = GetOpenFileName(&ofn); 
    if (fOk) { 
    HANDLE hFile: 
    Static_SetText(GetDlgItem(hwnd, IDC_SRCFILE), szPathname); 
    
    hFile = CreateFile(szPathname, GENERIC_READ, 
    0, NULL, OPEN_EXISTING, 0, NULL); 
    
    SetDlgItemInt(hwnd, IDG_SRCFILESIZE, 
    GetFileSize(hFile, NULL), FALSE); 
    CloseHandle(hFile); 
    ( 

    . . . 

    _________________________  15. : / 515 


    . 15-3 () 
    
    II   Copy,    
    //     
    GetWindowText(GetDlgItem(hwnd, IOC_SRCFILE), 
    szPathname, sizeof(szPathname)): 
    EnableWindow(Get01gItefn(hwnd, IDOK), 
    szPathname[0] != __TEXT(()); 
    if (fOk) { 
    
    //         
    //   ,     Copy 
    FORWARD_WM_NEXTDLGCTL(hwnd, 
    GetDlgItein(hwnd, IOOK), TRUE, SendMessage); 
    } 
    break: 
    case IDCANCEL: 
    EndDialog(hwnd, id); 
    break; 
    } 
    / 
    llil/llll//llllll/llil/lll/ll!l/lll/lllllll/ll///l/lltll/l/llllllllllll/ll//lll 
    BOOL CALLBACK Dlg_Proc (HWND hwnd, DINT uMsg, WPARAM wParam, LPARAM 
IParam) { 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog); 
    chHANDLE_DLGMSG(hwnd, WM_COMMAND, 01g_OnCoinmand); 
    retLirn(FALSE); 
    } 
    11111111111111111111/1/illllllllllll/IIHIIIIIIIIItilllll/llllll/lllllllllllll/ 
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    chWARNIFUNICODEUNOERWIN95(); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_IOCMPPRT), NULL, Dlg_Proc); 
    return(O); 
    } 
    ///////////////////  ///////////////////////////////


    516 ______________________________Windows   


     /     / 

    Win32 SDK,      ,   
Windows NT 4,  ' HasOverlappedIoCompleted: 
    ffdefine HasOverlappedIoCompleted(lpOverlapped) \ 
((lp0verlapped)->lnternal != STATUS_PENDING) 
      ,        
Windows NT.    ,      
/.        OVERLAPPED, 
   .    ,   
FALSE,    TRUE. 
      ,   ,   
GetOverlappedResult  GetQueuedCompletionStatus,     
 .       ( 
)    . 

        / 

     Windows NT 4   ,    
 /    : 

    BOOL CancelIO(HANDLE hFile): 

    :    ,   . 
,   ,  .    
 FALSE. 
       /   ReadFileEx  WriteFileEx,  
CancelIO    - .     
,       ERROR_OPERATION_ABORTED. 
           ,  
  GetQueuedCompletionStatus.   GetLastError   ERROR_OPERATION_ABORTED. 
     ,   CloseHandle  ,    
   /,    . 