1/*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at http://curl.haxx.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22 23#include "setup.h" 24 25#ifdef USE_WINDOWS_SSPI 26 27#include <curl/curl.h> 28 29#include "curl_sspi.h" 30 31#define _MPRINTF_REPLACE /* use our functions only */ 32#include <curl/mprintf.h> 33 34#include "curl_memory.h" 35/* The last #include file should be: */ 36#include "memdebug.h" 37 38 39/* We use our own typedef here since some headers might lack these */ 40typedef PSecurityFunctionTableA (APIENTRY *INITSECURITYINTERFACE_FN_A)(VOID); 41 42/* Handle of security.dll or secur32.dll, depending on Windows version */ 43HMODULE s_hSecDll = NULL; 44 45/* Pointer to SSPI dispatch table */ 46PSecurityFunctionTableA s_pSecFn = NULL; 47 48 49/* 50 * Curl_sspi_global_init() 51 * 52 * This is used to load the Security Service Provider Interface (SSPI) 53 * dynamic link library portably across all Windows versions, without 54 * the need to directly link libcurl, nor the application using it, at 55 * build time. 56 * 57 * Once this function has been executed, Windows SSPI functions can be 58 * called through the Security Service Provider Interface dispatch table. 59 */ 60 61CURLcode 62Curl_sspi_global_init(void) 63{ 64 OSVERSIONINFO osver; 65 INITSECURITYINTERFACE_FN_A pInitSecurityInterface; 66 67 /* If security interface is not yet initialized try to do this */ 68 if(s_hSecDll == NULL) { 69 70 /* Find out Windows version */ 71 memset(&osver, 0, sizeof(osver)); 72 osver.dwOSVersionInfoSize = sizeof(osver); 73 if(! GetVersionEx(&osver)) 74 return CURLE_FAILED_INIT; 75 76 /* Security Service Provider Interface (SSPI) functions are located in 77 * security.dll on WinNT 4.0 and in secur32.dll on Win9x. Win2K and XP 78 * have both these DLLs (security.dll forwards calls to secur32.dll) */ 79 80 /* Load SSPI dll into the address space of the calling process */ 81 if(osver.dwPlatformId == VER_PLATFORM_WIN32_NT 82 && osver.dwMajorVersion == 4) 83 s_hSecDll = LoadLibrary("security.dll"); 84 else 85 s_hSecDll = LoadLibrary("secur32.dll"); 86 if(! s_hSecDll) 87 return CURLE_FAILED_INIT; 88 89 /* Get address of the InitSecurityInterfaceA function from the SSPI dll */ 90 pInitSecurityInterface = (INITSECURITYINTERFACE_FN_A) 91 GetProcAddress(s_hSecDll, "InitSecurityInterfaceA"); 92 if(! pInitSecurityInterface) 93 return CURLE_FAILED_INIT; 94 95 /* Get pointer to Security Service Provider Interface dispatch table */ 96 s_pSecFn = pInitSecurityInterface(); 97 if(! s_pSecFn) 98 return CURLE_FAILED_INIT; 99 100 } 101 return CURLE_OK; 102} 103 104 105/* 106 * Curl_sspi_global_cleanup() 107 * 108 * This deinitializes the Security Service Provider Interface from libcurl. 109 */ 110 111void 112Curl_sspi_global_cleanup(void) 113{ 114 if(s_hSecDll) { 115 FreeLibrary(s_hSecDll); 116 s_hSecDll = NULL; 117 s_pSecFn = NULL; 118 } 119} 120 121#endif /* USE_WINDOWS_SSPI */ 122