6-1

it2022-05-09  21

/* * IoByFile.c * * Sample code for Multithreading Applications in Win32 * This is from Chapter 6, Listing 6-1 * * Demonstrates how a file handle becomes signaled * when an overlapped operation on the handle's file * is completed.  Notice that sometimes the operation * is completed immediately. The operation is only * queued, or pended, if ERROR_IO_PENDING is returned. */

#define WIN32_LEAN_AND_MEAN#include <stdio.h>#include <stdlib.h>#include <windows.h>

//// Constants//#define READ_SIZE       512

//// Function prototypes//void CheckOsVersion();

int main(){    BOOL rc;    HANDLE hFile;    DWORD numread;    OVERLAPPED overlap;    char buf[READ_SIZE];    char szPath[MAX_PATH];

    CheckOsVersion();

    GetWindowsDirectory(szPath, sizeof(szPath));    strcat(szPath, "http://www.cnblogs.com/nanshouyong326/admin/file://WINHLP32.EXE/");    // Open the file for overlapped reads    hFile = CreateFile( szPath,                    GENERIC_READ,                    FILE_SHARE_READ|FILE_SHARE_WRITE,                    NULL,                    OPEN_EXISTING,                    FILE_FLAG_OVERLAPPED,                    NULL                );    if (hFile == INVALID_HANDLE_VALUE)    {        printf("Could not open %s\n", szPath);        return -1;    }

    // Initialize the OVERLAPPED structure    memset(&overlap, 0, sizeof(overlap));    overlap.Offset = 1500;

    // Request the data    rc = ReadFile(                hFile,                buf,                READ_SIZE,                &numread,                &overlap            );    printf("Issued read request\n");

    // Was the operation queued?    if (rc)    {        // The data was read successfully        printf("Request was returned immediately\n");    }    else    {        if (GetLastError() == ERROR_IO_PENDING)        {            // We could do something else for awhile here...

            printf("Request queued, waiting...\n");            WaitForSingleObject(hFile, INFINITE);            printf("Request completed.\n");

            rc = GetOverlappedResult(                                    hFile,                                    &overlap,                                    &numread,                                    FALSE                                );            printf("Result was %d\n", rc);        }        else        {   // We should check for memory and quota   // errors here and retry. See the samples   // IoByEvnt and IoByAPC.

            // Something went wrong            printf("Error reading file\n");        }    }

    CloseHandle(hFile);

    return EXIT_SUCCESS;}

//// Make sure we are running under an operating// system that supports overlapped I/O to files.//void CheckOsVersion(){    OSVERSIONINFO   ver;    BOOL            bResult;

    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    bResult = GetVersionEx((LPOSVERSIONINFO) &ver);

    if ( (!bResult) ||         (ver.dwPlatformId != VER_PLATFORM_WIN32_NT) )    {        fprintf(stderr, "IoByFile must be run under Windows NT.\n");  exit(EXIT_FAILURE);    }

}

od

 

00401000  /$  81EC 1C030000 sub     esp, 31C00401006  |.  53            push    ebx00401007  |.  56            push    esi00401008  |.  57            push    edi00401009  |.  E8 52010000   call    004011600040100E  |.  8D4424 24     lea     eax, dword ptr [esp+24]00401012  |.  68 04010000   push    104                              ; /BufSize = 104 (260.)00401017  |.  50            push    eax                              ; |Buffer00401018  |.  FF15 18204000 call    dword ptr [<&KERNEL32.GetWindows>; \GetWindowsDirectoryA0040101E  |.  BF B4304000   mov     edi, 004030B4                    ;  ASCII "\WINHLP32.EXE"00401023  |.  83C9 FF       or      ecx, FFFFFFFF00401026  |.  33C0          xor     eax, eax00401028  |.  8D5424 24     lea     edx, dword ptr [esp+24]0040102C  |.  F2:AE         repne   scas byte ptr es:[edi]0040102E  |.  F7D1          not     ecx00401030  |.  2BF9          sub     edi, ecx00401032  |.  50            push    eax                              ; /hTemplateFile => NULL00401033  |.  8BF7          mov     esi, edi                         ; |00401035  |.  8BD9          mov     ebx, ecx                         ; |00401037  |.  8BFA          mov     edi, edx                         ; |00401039  |.  83C9 FF       or      ecx, FFFFFFFF                    ; |0040103C  |.  F2:AE         repne   scas byte ptr es:[edi]           ; |0040103E  |.  8BCB          mov     ecx, ebx                         ; |00401040  |.  4F            dec     edi                              ; |00401041  |.  C1E9 02       shr     ecx, 2                           ; |00401044  |.  F3:A5         rep     movs dword ptr es:[edi], dword p>; |00401046  |.  68 00000040   push    40000000                         ; |Attributes = OVERLAPPED0040104B  |.  8BCB          mov     ecx, ebx                         ; |0040104D  |.  6A 03         push    3                                ; |Mode = OPEN_EXISTING0040104F  |.  50            push    eax                              ; |pSecurity => NULL00401050  |.  83E1 03       and     ecx, 3                           ; |00401053  |.  6A 03         push    3                                ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE00401055  |.  8D4424 38     lea     eax, dword ptr [esp+38]          ; |00401059  |.  68 00000080   push    80000000                         ; |Access = GENERIC_READ0040105E  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr>; |00401060  |.  50            push    eax                              ; |FileName00401061  |.  FF15 14204000 call    dword ptr [<&KERNEL32.CreateFile>; \CreateFileA00401067  |.  8BF0          mov     esi, eax00401069  |.  83FE FF       cmp     esi, -10040106C  |.  75 1F         jnz     short 0040108D0040106E  |.  8D4C24 24     lea     ecx, dword ptr [esp+24]00401072  |.  51            push    ecx                              ; /<%s>00401073  |.  68 A0304000   push    004030A0                         ; |format = "Could not open %s",LF,""00401078  |.  FF15 24204000 call    dword ptr [<&MSVCRTD.printf>]    ; \printf0040107E  |.  83C4 08       add     esp, 800401081  |.  0BC6          or      eax, esi00401083  |.  5F            pop     edi00401084  |.  5E            pop     esi00401085  |.  5B            pop     ebx00401086  |.  81C4 1C030000 add     esp, 31C0040108C  |.  C3            retn0040108D  |>  33D2          xor     edx, edx0040108F  |.  8D4424 10     lea     eax, dword ptr [esp+10]00401093  |.  895424 10     mov     dword ptr [esp+10], edx00401097  |.  8D4C24 0C     lea     ecx, dword ptr [esp+C]0040109B  |.  895424 14     mov     dword ptr [esp+14], edx0040109F  |.  50            push    eax                              ; /pOverlapped004010A0  |.  895424 1C     mov     dword ptr [esp+1C], edx          ; |004010A4  |.  51            push    ecx                              ; |pBytesRead004010A5  |.  895424 24     mov     dword ptr [esp+24], edx          ; |004010A9  |.  68 00020000   push    200                              ; |BytesToRead = 200 (512.)004010AE  |.  895424 2C     mov     dword ptr [esp+2C], edx          ; |004010B2  |.  8D9424 340100>lea     edx, dword ptr [esp+134]         ; |004010B9  |.  52            push    edx                              ; |Buffer004010BA  |.  56            push    esi                              ; |hFile004010BB  |.  C74424 2C DC0>mov     dword ptr [esp+2C], 5DC          ; |004010C3  |.  FF15 10204000 call    dword ptr [<&KERNEL32.ReadFile>] ; \ReadFile004010C9  |.  8B3D 24204000 mov     edi, dword ptr [<&MSVCRTD.printf>;  MSVCRTD.printf004010CF  |.  68 88304000   push    00403088                         ; /format = "Issued read request",LF,""004010D4  |.  8BD8          mov     ebx, eax                         ; |004010D6  |.  FFD7          call    edi                              ; \printf004010D8  |.  83C4 04       add     esp, 4004010DB  |.  85DB          test    ebx, ebx004010DD  |.  74 07         je      short 004010E6004010DF  |.  68 64304000   push    00403064                         ;  ASCII "Request was returned immediately",LF004010E4  |.  EB 60         jmp     short 00401146004010E6  |>  FF15 0C204000 call    dword ptr [<&KERNEL32.GetLastErr>; [GetLastError004010EC  |.  3D E5030000   cmp     eax, 3E5004010F1  |.  75 4E         jnz     short 00401141004010F3  |.  68 48304000   push    00403048                         ;  ASCII "Request queued, waiting...",LF004010F8  |.  FFD7          call    edi004010FA  |.  83C4 04       add     esp, 4004010FD  |.  6A FF         push    -1                               ; /Timeout = INFINITE004010FF  |.  56            push    esi                              ; |hObject00401100  |.  FF15 08204000 call    dword ptr [<&KERNEL32.WaitForSin>; \WaitForSingleObject00401106  |.  68 34304000   push    00403034                         ;  ASCII "Request completed.",LF0040110B  |.  FFD7          call    edi0040110D  |.  83C4 04       add     esp, 400401110  |.  8D4424 0C     lea     eax, dword ptr [esp+C]00401114  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]00401118  |.  6A 00         push    0                                ; /Wait = FALSE0040111A  |.  50            push    eax                              ; |pByteCount0040111B  |.  51            push    ecx                              ; |pOverlapped0040111C  |.  56            push    esi                              ; |hFile0040111D  |.  FF15 04204000 call    dword ptr [<&KERNEL32.GetOverlap>; \GetOverlappedResult00401123  |.  50            push    eax00401124  |.  68 24304000   push    00403024                         ;  ASCII "Result was %d",LF00401129  |.  FFD7          call    edi0040112B  |.  83C4 08       add     esp, 80040112E  |.  56            push    esi                              ; /hObject0040112F  |.  FF15 00204000 call    dword ptr [<&KERNEL32.CloseHandl>; \CloseHandle00401135  |.  5F            pop     edi00401136  |.  5E            pop     esi00401137  |.  33C0          xor     eax, eax00401139  |.  5B            pop     ebx0040113A  |.  81C4 1C030000 add     esp, 31C00401140  |.  C3            retn00401141  |>  68 10304000   push    00403010                         ;  ASCII "Error reading file",LF00401146  |>  FFD7          call    edi00401148  |.  83C4 04       add     esp, 40040114B  |.  56            push    esi                              ; /hObject0040114C  |.  FF15 00204000 call    dword ptr [<&KERNEL32.CloseHandl>; \CloseHandle00401152  |.  5F            pop     edi00401153  |.  5E            pop     esi00401154  |.  33C0          xor     eax, eax00401156  |.  5B            pop     ebx00401157  |.  81C4 1C030000 add     esp, 31C0040115D  \.  C3            retn

 

 

ida

.text:00401000.text:00401000 ; =============== S U B R O U T I N E =======================================.text:00401000.text:00401000.text:00401000 ; int __cdecl main(int argc, const char **argv, const char *envp).text:00401000 _main           proc near               ; CODE XREF: start+FAp.text:00401000.text:00401000 NumberOfBytesTransferred= dword ptr -31Ch.text:00401000 Overlapped      = _OVERLAPPED ptr -318h.text:00401000 FileName        = byte ptr -304h.text:00401000 Buffer          = byte ptr -200h.text:00401000 argc            = dword ptr  4.text:00401000 argv            = dword ptr  8.text:00401000 envp            = dword ptr  0Ch.text:00401000.text:00401000                 sub     esp, 31Ch.text:00401006                 push    ebx.text:00401007                 push    esi.text:00401008                 push    edi.text:00401009                 call    sub_401160.text:0040100E                 lea     eax, [esp+328h+FileName].text:00401012                 push    104h            ; uSize.text:00401017                 push    eax             ; lpBuffer.text:00401018                 call    ds:GetWindowsDirectoryA.text:0040101E                 mov     edi, offset aWinhlp32_exe ; "http://www.cnblogs.com/nanshouyong326/admin/file://WINHLP32.EXE/".text:00401023                 or      ecx, 0FFFFFFFFh.text:00401026                 xor     eax, eax.text:00401028                 lea     edx, [esp+328h+FileName].text:0040102C                 repne scasb.text:0040102E                 not     ecx.text:00401030                 sub     edi, ecx.text:00401032                 push    eax             ; hTemplateFile.text:00401033                 mov     esi, edi.text:00401035                 mov     ebx, ecx.text:00401037                 mov     edi, edx.text:00401039                 or      ecx, 0FFFFFFFFh.text:0040103C                 repne scasb.text:0040103E                 mov     ecx, ebx.text:00401040                 dec     edi.text:00401041                 shr     ecx, 2.text:00401044                 rep movsd.text:00401046                 push    40000000h       ; dwFlagsAndAttributes.text:0040104B                 mov     ecx, ebx.text:0040104D                 push    3               ; dwCreationDisposition.text:0040104F                 push    eax             ; lpSecurityAttributes.text:00401050                 and     ecx, 3.text:00401053                 push    3               ; dwShareMode.text:00401055                 lea     eax, [esp+33Ch+FileName].text:00401059                 push    80000000h       ; dwDesiredAccess.text:0040105E                 rep movsb.text:00401060                 push    eax             ; lpFileName.text:00401061                 call    ds:CreateFileA.text:00401067                 mov     esi, eax.text:00401069                 cmp     esi, 0FFFFFFFFh.text:0040106C                 jnz     short loc_40108D.text:0040106E                 lea     ecx, [esp+328h+FileName].text:00401072                 push    ecx.text:00401073                 push    offset Format   ; "Could not open %s\n".text:00401078                 call    ds:printf.text:0040107E                 add     esp, 8.text:00401081                 or      eax, esi.text:00401083                 pop     edi.text:00401084                 pop     esi.text:00401085                 pop     ebx.text:00401086                 add     esp, 31Ch.text:0040108C                 retn.text:0040108D ; ---------------------------------------------------------------------------.text:0040108D.text:0040108D loc_40108D:                             ; CODE XREF: _main+6Cj.text:0040108D                 xor     edx, edx.text:0040108F                 lea     eax, [esp+328h+Overlapped].text:00401093                 mov     [esp+328h+Overlapped.Internal], edx.text:00401097                 lea     ecx, [esp+328h+NumberOfBytesTransferred].text:0040109B                 mov     [esp+328h+Overlapped.InternalHigh], edx.text:0040109F                 push    eax             ; lpOverlapped.text:004010A0                 mov     dword ptr [esp+32Ch+Overlapped.anonymous_0], edx.text:004010A4                 push    ecx             ; lpNumberOfBytesRead.text:004010A5                 mov     dword ptr [esp+330h+Overlapped.anonymous_0+4], edx.text:004010A9                 push    200h            ; nNumberOfBytesToRead.text:004010AE                 mov     [esp+334h+Overlapped.hEvent], edx.text:004010B2                 lea     edx, [esp+334h+Buffer].text:004010B9                 push    edx             ; lpBuffer.text:004010BA                 push    esi             ; hFile.text:004010BB                 mov     dword ptr [esp+33Ch+Overlapped.anonymous_0], 5DCh.text:004010C3                 call    ds:ReadFile.text:004010C9                 mov     edi, ds:printf.text:004010CF                 push    offset aIssuedReadRequ ; "Issued read request\n".text:004010D4                 mov     ebx, eax.text:004010D6                 call    edi ; printf.text:004010D8                 add     esp, 4.text:004010DB                 test    ebx, ebx.text:004010DD                 jz      short loc_4010E6.text:004010DF                 push    offset aRequestWasRetu ; "Request was returned immediately\n".text:004010E4                 jmp     short loc_401146.text:004010E6 ; ---------------------------------------------------------------------------.text:004010E6.text:004010E6 loc_4010E6:                             ; CODE XREF: _main+DDj.text:004010E6                 call    ds:GetLastError.text:004010EC                 cmp     eax, ERROR_IO_PENDING.text:004010F1                 jnz     short loc_401141.text:004010F3                 push    offset aRequestQueuedW ; "Request queued, waiting...\n".text:004010F8                 call    edi ; printf.text:004010FA                 add     esp, 4.text:004010FD                 push    0FFFFFFFFh      ; dwMilliseconds.text:004010FF                 push    esi             ; hHandle.text:00401100                 call    ds:WaitForSingleObject.text:00401106                 push    offset aRequestComplet ; "Request completed.\n".text:0040110B                 call    edi ; printf.text:0040110D                 add     esp, 4.text:00401110                 lea     eax, [esp+328h+NumberOfBytesTransferred].text:00401114                 lea     ecx, [esp+328h+Overlapped].text:00401118                 push    0               ; bWait.text:0040111A                 push    eax             ; lpNumberOfBytesTransferred.text:0040111B                 push    ecx             ; lpOverlapped.text:0040111C                 push    esi             ; hFile.text:0040111D                 call    ds:GetOverlappedResult.text:00401123                 push    eax.text:00401124                 push    offset aResultWasD ; "Result was %d\n".text:00401129                 call    edi ; printf.text:0040112B                 add     esp, 8.text:0040112E                 push    esi             ; hObject.text:0040112F                 call    ds:CloseHandle.text:00401135                 pop     edi.text:00401136                 pop     esi.text:00401137                 xor     eax, eax.text:00401139                 pop     ebx.text:0040113A                 add     esp, 31Ch.text:00401140                 retn.text:00401141 ; ---------------------------------------------------------------------------.text:00401141.text:00401141 loc_401141:                             ; CODE XREF: _main+F1j.text:00401141                 push    offset aErrorReadingFi ; "Error reading file\n".text:00401146.text:00401146 loc_401146:                             ; CODE XREF: _main+E4j.text:00401146                 call    edi ; printf.text:00401148                 add     esp, 4.text:0040114B                 push    esi             ; hObject.text:0040114C                 call    ds:CloseHandle.text:00401152                 pop     edi.text:00401153                 pop     esi.text:00401154                 xor     eax, eax.text:00401156                 pop     ebx.text:00401157                 add     esp, 31Ch.text:0040115D                 retn.text:0040115D _main           endp.text:0040115D.text:0040115D ; ---------------------------------------------------------------------------.text:0040115E                 align 10h.text:00401160

转载于:https://www.cnblogs.com/nanshouyong326/archive/2010/07/08/1773806.html


最新回复(0)