HINSTANCE hKrb4 = 0;
HINSTANCE hKrb5 = 0;
+HINSTANCE hKrb5_KFW_32 = 0;
HINSTANCE hKrb524 = 0;
HINSTANCE hSecur32 = 0;
HINSTANCE hComErr = 0;
DECL_FUNC_PTR(krb5_c_random_make_octets);
DECL_FUNC_PTR(krb5_free_addresses);
DECL_FUNC_PTR(krb5_free_default_realm);
+
+// Krb5 (3.2) functions
DECL_FUNC_PTR(krb5_get_error_message);
DECL_FUNC_PTR(krb5_free_error_message);
MAKE_FUNC_INFO(krb5_free_host_realm),
MAKE_FUNC_INFO(krb5_c_random_make_octets),
MAKE_FUNC_INFO(krb5_free_default_realm),
+ END_FUNC_INFO
+};
+
+FUNC_INFO k5_kfw_32_fi[] = {
MAKE_FUNC_INFO(krb5_get_error_message),
MAKE_FUNC_INFO(krb5_free_error_message),
END_FUNC_INFO
imp_rv = LoadFuncs(CCAPI_DLL, ccapi_fi, &hCCAPI, 0, 1, 0, 0);
/* CCAPI_DLL is optional. No error check. */
+ imp_rv = LoadFuncs(KRB5_DLL, k5_kfw_32_fi, &hKrb5_KFW_32, 0, 1, 0, 0);
+ /* KFW 3.2 krb5 functions are optional. No error check. */
+
memset(&osvi, 0, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
FreeLibrary(hKrb4);
if (hKrb5)
FreeLibrary(hKrb5);
+ if (hKrb5_KFW_32)
+ FreeLibrary(hKrb5_KFW_32);
if (hProfile)
FreeLibrary(hProfile);
if (hComErr)
extern DECL_FUNC_PTR(krb5_c_random_make_octets);
extern DECL_FUNC_PTR(krb5_free_default_realm);
+// Krb5 (3.2) functions
+extern DECL_FUNC_PTR(krb5_get_error_message);
+extern DECL_FUNC_PTR(krb5_free_error_message);
+
// Krb524 functions
extern DECL_FUNC_PTR(krb524_init_ets);
extern DECL_FUNC_PTR(krb524_convert_creds_kdc);
const char *errText;
int krb5Error = ((int)(rc & 255));
- errText = pkrb5_get_error_message(rc);
+ if (pkrb5_get_error_message)
+ errText = pkrb5_get_error_message(rc);
+ else
+ errText = perror_message(rc);
_snprintf(message, sizeof(message),
"%s\n(Kerberos error %ld)\n\n%s failed",
errText,
krb5Error,
FailedFunctionName);
- pkrb5_free_error_message(errText);
+ if (pkrb5_free_error_message)
+ pkrb5_free_error_message(errText);
MessageBoxA(NULL, message, "Kerberos Five", MB_OK | MB_ICONERROR |
MB_TASKMODAL |