Hi, The Lotus Smartsuite installer does: LoadLibrary("wininet"); func = GetProcAddress("InternetCloseHandle"); func(handlevalue); with a random handlevalue. This is obviously incorrect and should be caught. Ciao, Marcus License: LGPL Changelog: Protect InternetCloseHandle() against invalid handles. Index: internet.c =================================================================== RCS file: /home/wine/wine/dlls/wininet/internet.c,v retrieving revision 1.35 diff -u -r1.35 internet.c --- internet.c 21 Jun 2002 23:59:49 -0000 1.35 +++ internet.c 13 Jul 2002 07:23:12 -0000 @@ -46,6 +46,9 @@ #define NO_SHLWAPI_STREAM #include "shlwapi.h" +#include "wine/exception.h" +#include "msvcrt/excpt.h" + #include "internet.h" WINE_DEFAULT_DEBUG_CHANNEL(wininet); @@ -57,6 +60,15 @@ #define GET_HWININET_FROM_LPWININETFINDNEXT(lpwh) \ (LPWININETAPPINFOA)(((LPWININETFTPSESSIONA)(lpwh->hdr.lpwhparent))->hdr.lpwhparent) +/* filter for page-fault exceptions */ +static WINE_EXCEPTION_FILTER(page_fault) +{ + if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION || + GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION) + return EXCEPTION_EXECUTE_HANDLER; + return EXCEPTION_CONTINUE_SEARCH; +} + typedef struct { DWORD dwError; @@ -455,37 +467,43 @@ if (NULL == lpwh) return FALSE; - /* Clear any error information */ - INTERNET_SetLastError(0); - - switch (lpwh->htype) - { - case WH_HINIT: - INTERNET_CloseHandle((LPWININETAPPINFOA) lpwh); - retval = TRUE; - break; - - case WH_HHTTPSESSION: - HTTP_CloseHTTPSessionHandle((LPWININETHTTPSESSIONA) lpwh); - retval = TRUE; - break; - - case WH_HHTTPREQ: - HTTP_CloseHTTPRequestHandle((LPWININETHTTPREQA) lpwh); - retval = TRUE; - break; - - case WH_HFTPSESSION: - retval = FTP_CloseSessionHandle((LPWININETFTPSESSIONA) lpwh); - break; - - case WH_HFINDNEXT: - retval = FTP_CloseFindNextHandle((LPWININETFINDNEXTA) lpwh); - break; - - default: - break; + __TRY { + /* Clear any error information */ + INTERNET_SetLastError(0); + + switch (lpwh->htype) + { + case WH_HINIT: + INTERNET_CloseHandle((LPWININETAPPINFOA) lpwh); + retval = TRUE; + break; + + case WH_HHTTPSESSION: + HTTP_CloseHTTPSessionHandle((LPWININETHTTPSESSIONA) lpwh); + retval = TRUE; + break; + + case WH_HHTTPREQ: + HTTP_CloseHTTPRequestHandle((LPWININETHTTPREQA) lpwh); + retval = TRUE; + break; + + case WH_HFTPSESSION: + retval = FTP_CloseSessionHandle((LPWININETFTPSESSIONA) lpwh); + break; + + case WH_HFINDNEXT: + retval = FTP_CloseFindNextHandle((LPWININETFINDNEXTA) lpwh); + break; + + default: + break; + } + } __EXCEPT(page_fault) { + INTERNET_SetLastError(ERROR_INVALID_PARAMETER); + retval = FALSE; } + __ENDTRY return retval; }