Ignore:
Timestamp:
08/20/12 14:27:26 (9 months ago)
Author:
wisk
Message:

add relocate_hook to improve api hooking, fix dll name string comparison (no case sensitive), fix used after free on win32, add more hooks related to async file access

File:
1 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/libzzuf/lib-win32.c

    r4834 r4837  
    6262    LPOVERLAPPED, LPOVERLAPPED_COMPLETION_ROUTINE); 
    6363#endif 
     64#if defined HAVE_CREATEIOCOMPLETIONPORT 
     65static HANDLE (__stdcall *ORIG(CreateIoCompletionPort))(HANDLE, HANDLE, ULONG_PTR, DWORD); 
     66#endif 
     67#if defined HAVE_GETQUEUEDCOMPLETIONSTATUS 
     68static BOOL (__stdcall *ORIG(GetQueuedCompletionStatus))(HANDLE, LPDWORD, PULONG_PTR, LPOVERLAPPED *, DWORD); 
     69#endif 
     70#if defined HAVE_GETOVERLAPPEDRESULT 
     71static BOOL (__stdcall *ORIG(GetOverlappedResult))(HANDLE, LPOVERLAPPED, LPDWORD, BOOL); 
     72#endif 
    6473#if defined HAVE_CREATEFILEMAPPINGA 
    6574static HANDLE (__stdcall *ORIG(CreateFileMappingA))(HANDLE, LPSECURITY_ATTRIBUTES, 
     
    201210#endif 
    202211 
     212#if defined HAVE_CREATEIOCOMPLETIONPORT 
     213HANDLE __stdcall NEW(CreateIoCompletionPort)(HANDLE FileHandle, HANDLE ExistingCompletionPort, ULONG_PTR CompletionKey, DWORD NumberOfConcurrentThreads) 
     214{ 
     215        HANDLE ret; 
     216 
     217        ret = ORIG(CreateIoCompletionPort)(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads); 
     218 
     219        debug("GetQueuedCompletionStatus(0x%08x, 0x%08x, 0x%08x, %d) = 0x%08x", 
     220                FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads, ret); 
     221 
     222    if (!_zz_ready || !_zz_iswatched(FileHandle) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(FileHandle) || !_zz_isactive(FileHandle)) 
     223        return ret; 
     224 
     225    if (ret != NULL) 
     226    { 
     227        debug("handle %#08x is registered", ret); 
     228        _zz_register(ret); 
     229    } 
     230 
     231        return ret; 
     232} 
     233#endif 
     234 
     235#if defined HAVE_GETQUEUEDCOMPLETIONSTATUS 
     236BOOL __stdcall NEW(GetQueuedCompletionStatus)(HANDLE CompletionPort, LPDWORD lpNumberOfBytes, PULONG_PTR lpCompletion, LPOVERLAPPED *lpOverlapped, DWORD dwMilliseconds) 
     237{ 
     238    BOOL ret; 
     239 
     240    ret = ORIG(GetQueuedCompletionStatus)(CompletionPort, lpNumberOfBytes, lpCompletion, lpOverlapped, dwMilliseconds); 
     241 
     242        debug("GetQueuedCompletionStatus(0x%08x, { %d }, %p, %p, %d) = %s", 
     243        CompletionPort, *lpNumberOfBytes, lpCompletion, lpOverlapped, dwMilliseconds, (ret ? "TRUE" : "FALSE")); 
     244 
     245    return ret; 
     246} 
     247#endif 
     248 
     249#if defined HAVE_GETOVERLAPPEDRESULT 
     250BOOL __stdcall NEW(GetOverlappedResult)(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait) 
     251{ 
     252    BOOL ret; 
     253 
     254    ret = ORIG(GetOverlappedResult)(hFile, lpOverlapped, lpNumberOfBytesTransferred, bWait); 
     255 
     256    debug("GetOverlappedResult(0x%#08x, %p, %p, %s) = %s", 
     257        hFile, lpOverlapped, lpNumberOfBytesTransferred, (bWait ? "TRUE" : "FALSE"), (ret ? "TRUE" : "FALSE")); 
     258 
     259    return ret; 
     260} 
     261#endif 
     262 
    203263#if defined HAVE_CREATEFILEMAPPINGA 
    204264HANDLE __stdcall NEW(CreateFileMappingA)(HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes, 
     
    299359    DIVERT(CreateFileA), 
    300360    DIVERT(CreateFileW), 
     361    DIVERT(ReadFile), 
     362    DIVERT(ReadFileEx), 
     363        DIVERT(CreateIoCompletionPort), 
     364    DIVERT(GetQueuedCompletionStatus), 
     365    DIVERT(GetOverlappedResult), 
    301366    DIVERT(CreateFileMappingA), 
    302367    DIVERT(CreateFileMappingW), 
    303368    DIVERT(MapViewOfFile), 
    304     DIVERT(ReadFile), 
    305     DIVERT(ReadFileEx), 
    306369    DIVERT_END 
    307370}; 
Note: See TracChangeset for help on using the changeset viewer.