1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPLv2+ - See COPYING in the top level directory 4 * PURPOSE: Test for WinHttpOpen 5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org> 6 */ 7 8 #include <apitest.h> 9 10 #define WIN32_NO_STATUS 11 #define _INC_WINDOWS 12 #define COM_NO_WINDOWS_H 13 #include <windef.h> 14 #include <winsock2.h> 15 #include <winhttp.h> 16 17 struct hostent *(WINAPI *pgethostbyname)(const char *); 18 int (WINAPI *pWSACancelBlockingCall)(void); 19 int (WINAPI *pWSAGetLastError)(void); 20 21 HINTERNET (WINAPI *pWinHttpOpen)(LPCWSTR, DWORD, LPCWSTR, LPCWSTR, DWORD); 22 BOOL (WINAPI *pWinHttpCloseHandle)(HINTERNET); 23 24 static 25 PVOID 26 GetProc( 27 PCSTR FunctionName) 28 { 29 HMODULE ModuleHandle; 30 31 ModuleHandle = GetModuleHandleW(L"ws2_32"); 32 if (!ModuleHandle) 33 return NULL; 34 return GetProcAddress(ModuleHandle, FunctionName); 35 } 36 37 #define PROC(name) (p##name = GetProc(#name)) 38 39 static 40 BOOLEAN 41 IsWinsockLoaded(VOID) 42 { 43 return GetModuleHandleW(L"ws2_32") != NULL; 44 } 45 46 static 47 BOOLEAN 48 IsWininetLoaded(VOID) 49 { 50 return GetModuleHandleW(L"wininet") != NULL; 51 } 52 53 static 54 BOOLEAN 55 IsWinsockInitialized(VOID) 56 { 57 struct hostent *Hostent; 58 59 if (!PROC(gethostbyname) || !PROC(WSAGetLastError)) 60 return FALSE; 61 62 Hostent = pgethostbyname("localhost"); 63 if (!Hostent) 64 ok_dec(pWSAGetLastError(), WSANOTINITIALISED); 65 return Hostent != NULL; 66 } 67 68 static 69 BOOLEAN 70 AreLegacyFunctionsSupported(VOID) 71 { 72 int Error; 73 74 if (!PROC(WSACancelBlockingCall) || !PROC(WSAGetLastError)) 75 return FALSE; 76 77 Error = pWSACancelBlockingCall(); 78 ok(Error == SOCKET_ERROR, "Error = %d\n", Error); 79 ok(pWSAGetLastError() == WSAEOPNOTSUPP || 80 pWSAGetLastError() == WSAEINVAL, "WSAGetLastError = %d\n", pWSAGetLastError()); 81 82 return pWSAGetLastError() != WSAEOPNOTSUPP; 83 } 84 85 START_TEST(WinHttpOpen) 86 { 87 HMODULE ModuleHandle; 88 HINTERNET InternetHandle; 89 BOOL Success; 90 91 ok(!IsWinsockLoaded(), "Winsock loaded on startup\n"); 92 ok(!IsWinsockInitialized(), "Winsock initialized on startup\n"); 93 ok(!IsWininetLoaded(), "Wininet loaded on startup\n"); 94 95 ModuleHandle = GetModuleHandleW(L"winhttp"); 96 ok_ptr(ModuleHandle, NULL); 97 ModuleHandle = LoadLibraryW(L"winhttp"); 98 ok(ModuleHandle != NULL, "LoadLibrary failed, error %lu\n", GetLastError()); 99 100 pWinHttpOpen = (PVOID)GetProcAddress(ModuleHandle, "WinHttpOpen"); 101 pWinHttpCloseHandle = (PVOID)GetProcAddress(ModuleHandle, "WinHttpCloseHandle"); 102 103 ok(!IsWinsockLoaded(), "Winsock loaded after winhttp load\n"); 104 ok(!IsWinsockInitialized(), "Winsock initialized after winhttp load\n"); 105 ok(!IsWininetLoaded(), "Wininet loaded after winhttp load\n"); 106 107 InternetHandle = pWinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); 108 ok(InternetHandle != NULL, "InternetHandle = NULL\n"); 109 110 if (InternetHandle != NULL) 111 { 112 ok(IsWinsockLoaded(), "Winsock not loaded after WinHttpOpen\n"); 113 ok(IsWinsockInitialized(), "Winsock not initialized after WinHttpOpen\n"); 114 ok(!IsWininetLoaded(), "Wininet loaded after WinHttpOpen\n"); 115 ok(AreLegacyFunctionsSupported(), "Winsock initialized with version 2\n"); 116 Success = pWinHttpCloseHandle(InternetHandle); 117 ok(Success, "WinHttpCloseHandle failed, error %lu\n", GetLastError()); 118 } 119 120 ok(IsWinsockLoaded(), "Winsock unloaded after handle close\n"); 121 ok(IsWinsockInitialized(), "Winsock uninitialized after handle close\n"); 122 123 FreeLibrary(ModuleHandle); 124 125 ok(IsWinsockLoaded(), "Winsock unloaded after winhttp unload\n"); 126 trace("Winsock %sinitialized after winhttp unload (should be uninitialized in 2003, still initialized in 7)\n", 127 IsWinsockInitialized() ? "" : "un"); 128 } 129