Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/krb5/src/windows/leashdll/leashdll.c
34914 views
1
#include <windows.h>
2
#include "leashdll.h"
3
#include <leashwin.h>
4
#include "leash-int.h"
5
6
HINSTANCE hLeashInst;
7
8
HINSTANCE hKrb5 = 0;
9
HINSTANCE hKrb524 = 0;
10
HINSTANCE hSecur32 = 0;
11
HINSTANCE hComErr = 0;
12
HINSTANCE hService = 0;
13
HINSTANCE hProfile = 0;
14
HINSTANCE hPsapi = 0;
15
HINSTANCE hToolHelp32 = 0;
16
HINSTANCE hCcapi = 0;
17
18
// krb5 functions
19
DECL_FUNC_PTR(krb5_change_password);
20
DECL_FUNC_PTR(krb5_get_init_creds_opt_alloc);
21
DECL_FUNC_PTR(krb5_get_init_creds_opt_free);
22
DECL_FUNC_PTR(krb5_get_init_creds_opt_init);
23
DECL_FUNC_PTR(krb5_get_init_creds_opt_set_tkt_life);
24
DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life);
25
DECL_FUNC_PTR(krb5_get_init_creds_opt_set_forwardable);
26
DECL_FUNC_PTR(krb5_get_init_creds_opt_set_proxiable);
27
DECL_FUNC_PTR(krb5_get_init_creds_opt_set_address_list);
28
DECL_FUNC_PTR(krb5_get_init_creds_opt_set_out_ccache);
29
DECL_FUNC_PTR(krb5_get_init_creds_password);
30
DECL_FUNC_PTR(krb5_build_principal_ext);
31
DECL_FUNC_PTR(krb5_cc_get_name);
32
DECL_FUNC_PTR(krb5_cc_resolve);
33
DECL_FUNC_PTR(krb5_cc_default);
34
DECL_FUNC_PTR(krb5_cc_default_name);
35
DECL_FUNC_PTR(krb5_cc_set_default_name);
36
DECL_FUNC_PTR(krb5_cc_initialize);
37
DECL_FUNC_PTR(krb5_cc_destroy);
38
DECL_FUNC_PTR(krb5_cc_close);
39
DECL_FUNC_PTR(krb5_cc_store_cred);
40
DECL_FUNC_PTR(krb5_cc_copy_creds);
41
// DECL_FUNC_PTR(krb5_cc_retrieve_cred);
42
DECL_FUNC_PTR(krb5_cc_get_principal);
43
DECL_FUNC_PTR(krb5_cc_start_seq_get);
44
DECL_FUNC_PTR(krb5_cc_next_cred);
45
DECL_FUNC_PTR(krb5_cc_end_seq_get);
46
// DECL_FUNC_PTR(krb5_cc_remove_cred);
47
DECL_FUNC_PTR(krb5_cc_set_flags);
48
// DECL_FUNC_PTR(krb5_cc_get_type);
49
DECL_FUNC_PTR(krb5_free_context);
50
DECL_FUNC_PTR(krb5_free_cred_contents);
51
DECL_FUNC_PTR(krb5_free_principal);
52
DECL_FUNC_PTR(krb5_get_in_tkt_with_password);
53
DECL_FUNC_PTR(krb5_init_context);
54
DECL_FUNC_PTR(krb5_parse_name);
55
DECL_FUNC_PTR(krb5_timeofday);
56
DECL_FUNC_PTR(krb5_timestamp_to_sfstring);
57
DECL_FUNC_PTR(krb5_unparse_name);
58
DECL_FUNC_PTR(krb5_get_credentials);
59
DECL_FUNC_PTR(krb5_mk_req);
60
DECL_FUNC_PTR(krb5_sname_to_principal);
61
DECL_FUNC_PTR(krb5_get_credentials_renew);
62
DECL_FUNC_PTR(krb5_free_data);
63
DECL_FUNC_PTR(krb5_free_data_contents);
64
// DECL_FUNC_PTR(krb5_get_realm_domain);
65
DECL_FUNC_PTR(krb5_free_unparsed_name);
66
DECL_FUNC_PTR(krb5_os_localaddr);
67
DECL_FUNC_PTR(krb5_copy_keyblock_contents);
68
DECL_FUNC_PTR(krb5_copy_data);
69
DECL_FUNC_PTR(krb5_free_creds);
70
DECL_FUNC_PTR(krb5_build_principal);
71
DECL_FUNC_PTR(krb5_get_renewed_creds);
72
DECL_FUNC_PTR(krb5_get_default_config_files);
73
DECL_FUNC_PTR(krb5_free_config_files);
74
DECL_FUNC_PTR(krb5_get_default_realm);
75
DECL_FUNC_PTR(krb5_free_ticket);
76
DECL_FUNC_PTR(krb5_decode_ticket);
77
DECL_FUNC_PTR(krb5_get_host_realm);
78
DECL_FUNC_PTR(krb5_free_host_realm);
79
DECL_FUNC_PTR(krb5_c_random_make_octets);
80
DECL_FUNC_PTR(krb5_free_addresses);
81
DECL_FUNC_PTR(krb5_free_default_realm);
82
DECL_FUNC_PTR(krb5_principal_compare);
83
DECL_FUNC_PTR(krb5_string_to_deltat);
84
DECL_FUNC_PTR(krb5_is_config_principal);
85
DECL_FUNC_PTR(krb5_cccol_cursor_new);
86
DECL_FUNC_PTR(krb5_cccol_cursor_free);
87
DECL_FUNC_PTR(krb5_cccol_cursor_next);
88
DECL_FUNC_PTR(krb5_cc_cache_match);
89
DECL_FUNC_PTR(krb5_cc_get_type);
90
DECL_FUNC_PTR(krb5_cc_new_unique);
91
DECL_FUNC_PTR(krb5_cc_support_switch);
92
DECL_FUNC_PTR(krb5_cc_switch);
93
DECL_FUNC_PTR(krb5_cc_get_full_name);
94
DECL_FUNC_PTR(krb5_free_string);
95
DECL_FUNC_PTR(krb5int_cc_user_set_default_name);
96
97
// ComErr functions
98
DECL_FUNC_PTR(com_err);
99
DECL_FUNC_PTR(error_message);
100
101
// Profile functions
102
DECL_FUNC_PTR(profile_init);
103
DECL_FUNC_PTR(profile_release);
104
DECL_FUNC_PTR(profile_get_subsection_names);
105
DECL_FUNC_PTR(profile_free_list);
106
DECL_FUNC_PTR(profile_get_string);
107
DECL_FUNC_PTR(profile_release_string);
108
DECL_FUNC_PTR(profile_get_integer);
109
110
// Service functions
111
DECL_FUNC_PTR(OpenSCManagerA);
112
DECL_FUNC_PTR(OpenServiceA);
113
DECL_FUNC_PTR(QueryServiceStatus);
114
DECL_FUNC_PTR(CloseServiceHandle);
115
DECL_FUNC_PTR(LsaNtStatusToWinError);
116
117
// LSA Functions
118
DECL_FUNC_PTR(LsaConnectUntrusted);
119
DECL_FUNC_PTR(LsaLookupAuthenticationPackage);
120
DECL_FUNC_PTR(LsaCallAuthenticationPackage);
121
DECL_FUNC_PTR(LsaFreeReturnBuffer);
122
DECL_FUNC_PTR(LsaGetLogonSessionData);
123
124
// CCAPI Functions
125
DECL_FUNC_PTR(cc_initialize);
126
DECL_FUNC_PTR(cc_shutdown);
127
DECL_FUNC_PTR(cc_get_NC_info);
128
DECL_FUNC_PTR(cc_free_NC_info);
129
130
FUNC_INFO k5_fi[] = {
131
MAKE_FUNC_INFO(krb5_change_password),
132
MAKE_FUNC_INFO(krb5_get_init_creds_opt_alloc),
133
MAKE_FUNC_INFO(krb5_get_init_creds_opt_free),
134
MAKE_FUNC_INFO(krb5_get_init_creds_opt_init),
135
MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_tkt_life),
136
MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_renew_life),
137
MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_forwardable),
138
MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_proxiable),
139
MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_address_list),
140
MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_out_ccache),
141
MAKE_FUNC_INFO(krb5_get_init_creds_password),
142
MAKE_FUNC_INFO(krb5_build_principal_ext),
143
MAKE_FUNC_INFO(krb5_cc_get_name),
144
MAKE_FUNC_INFO(krb5_cc_resolve),
145
MAKE_FUNC_INFO(krb5_cc_default),
146
MAKE_FUNC_INFO(krb5_cc_default_name),
147
MAKE_FUNC_INFO(krb5_cc_set_default_name),
148
MAKE_FUNC_INFO(krb5_cc_initialize),
149
MAKE_FUNC_INFO(krb5_cc_destroy),
150
MAKE_FUNC_INFO(krb5_cc_close),
151
MAKE_FUNC_INFO(krb5_cc_copy_creds),
152
MAKE_FUNC_INFO(krb5_cc_store_cred),
153
// MAKE_FUNC_INFO(krb5_cc_retrieve_cred),
154
MAKE_FUNC_INFO(krb5_cc_get_principal),
155
MAKE_FUNC_INFO(krb5_cc_start_seq_get),
156
MAKE_FUNC_INFO(krb5_cc_next_cred),
157
MAKE_FUNC_INFO(krb5_cc_end_seq_get),
158
// MAKE_FUNC_INFO(krb5_cc_remove_cred),
159
MAKE_FUNC_INFO(krb5_cc_set_flags),
160
// MAKE_FUNC_INFO(krb5_cc_get_type),
161
MAKE_FUNC_INFO(krb5_free_context),
162
MAKE_FUNC_INFO(krb5_free_cred_contents),
163
MAKE_FUNC_INFO(krb5_free_principal),
164
MAKE_FUNC_INFO(krb5_get_in_tkt_with_password),
165
MAKE_FUNC_INFO(krb5_init_context),
166
MAKE_FUNC_INFO(krb5_parse_name),
167
MAKE_FUNC_INFO(krb5_timeofday),
168
MAKE_FUNC_INFO(krb5_timestamp_to_sfstring),
169
MAKE_FUNC_INFO(krb5_unparse_name),
170
MAKE_FUNC_INFO(krb5_get_credentials),
171
MAKE_FUNC_INFO(krb5_mk_req),
172
MAKE_FUNC_INFO(krb5_sname_to_principal),
173
MAKE_FUNC_INFO(krb5_get_credentials_renew),
174
MAKE_FUNC_INFO(krb5_free_data),
175
MAKE_FUNC_INFO(krb5_free_data_contents),
176
// MAKE_FUNC_INFO(krb5_get_realm_domain),
177
MAKE_FUNC_INFO(krb5_free_unparsed_name),
178
MAKE_FUNC_INFO(krb5_os_localaddr),
179
MAKE_FUNC_INFO(krb5_copy_keyblock_contents),
180
MAKE_FUNC_INFO(krb5_copy_data),
181
MAKE_FUNC_INFO(krb5_free_creds),
182
MAKE_FUNC_INFO(krb5_build_principal),
183
MAKE_FUNC_INFO(krb5_get_renewed_creds),
184
MAKE_FUNC_INFO(krb5_free_addresses),
185
MAKE_FUNC_INFO(krb5_get_default_config_files),
186
MAKE_FUNC_INFO(krb5_free_config_files),
187
MAKE_FUNC_INFO(krb5_get_default_realm),
188
MAKE_FUNC_INFO(krb5_free_ticket),
189
MAKE_FUNC_INFO(krb5_decode_ticket),
190
MAKE_FUNC_INFO(krb5_get_host_realm),
191
MAKE_FUNC_INFO(krb5_free_host_realm),
192
MAKE_FUNC_INFO(krb5_c_random_make_octets),
193
MAKE_FUNC_INFO(krb5_free_default_realm),
194
MAKE_FUNC_INFO(krb5_principal_compare),
195
MAKE_FUNC_INFO(krb5_string_to_deltat),
196
MAKE_FUNC_INFO(krb5_is_config_principal),
197
MAKE_FUNC_INFO(krb5_cccol_cursor_new),
198
MAKE_FUNC_INFO(krb5_cccol_cursor_next),
199
MAKE_FUNC_INFO(krb5_cccol_cursor_free),
200
MAKE_FUNC_INFO(krb5_cc_cache_match),
201
MAKE_FUNC_INFO(krb5_cc_get_type),
202
MAKE_FUNC_INFO(krb5_cc_new_unique),
203
MAKE_FUNC_INFO(krb5_cc_support_switch),
204
MAKE_FUNC_INFO(krb5_cc_switch),
205
MAKE_FUNC_INFO(krb5_cc_get_full_name),
206
MAKE_FUNC_INFO(krb5_free_string),
207
MAKE_FUNC_INFO(krb5int_cc_user_set_default_name),
208
END_FUNC_INFO
209
};
210
211
FUNC_INFO profile_fi[] = {
212
MAKE_FUNC_INFO(profile_init),
213
MAKE_FUNC_INFO(profile_release),
214
MAKE_FUNC_INFO(profile_get_subsection_names),
215
MAKE_FUNC_INFO(profile_free_list),
216
MAKE_FUNC_INFO(profile_get_string),
217
MAKE_FUNC_INFO(profile_release_string),
218
MAKE_FUNC_INFO(profile_get_integer),
219
END_FUNC_INFO
220
};
221
222
FUNC_INFO ce_fi[] = {
223
MAKE_FUNC_INFO(com_err),
224
MAKE_FUNC_INFO(error_message),
225
END_FUNC_INFO
226
};
227
228
FUNC_INFO service_fi[] = {
229
MAKE_FUNC_INFO(OpenSCManagerA),
230
MAKE_FUNC_INFO(OpenServiceA),
231
MAKE_FUNC_INFO(QueryServiceStatus),
232
MAKE_FUNC_INFO(CloseServiceHandle),
233
MAKE_FUNC_INFO(LsaNtStatusToWinError),
234
END_FUNC_INFO
235
};
236
237
FUNC_INFO lsa_fi[] = {
238
MAKE_FUNC_INFO(LsaConnectUntrusted),
239
MAKE_FUNC_INFO(LsaLookupAuthenticationPackage),
240
MAKE_FUNC_INFO(LsaCallAuthenticationPackage),
241
MAKE_FUNC_INFO(LsaFreeReturnBuffer),
242
MAKE_FUNC_INFO(LsaGetLogonSessionData),
243
END_FUNC_INFO
244
};
245
246
// CCAPI v2
247
FUNC_INFO ccapi_fi[] = {
248
MAKE_FUNC_INFO(cc_initialize),
249
MAKE_FUNC_INFO(cc_shutdown),
250
MAKE_FUNC_INFO(cc_get_NC_info),
251
MAKE_FUNC_INFO(cc_free_NC_info),
252
END_FUNC_INFO
253
};
254
255
// psapi functions
256
DECL_FUNC_PTR(GetModuleFileNameExA);
257
DECL_FUNC_PTR(EnumProcessModules);
258
259
FUNC_INFO psapi_fi[] = {
260
MAKE_FUNC_INFO(GetModuleFileNameExA),
261
MAKE_FUNC_INFO(EnumProcessModules),
262
END_FUNC_INFO
263
};
264
265
// toolhelp functions
266
DECL_FUNC_PTR(CreateToolhelp32Snapshot);
267
DECL_FUNC_PTR(Module32First);
268
DECL_FUNC_PTR(Module32Next);
269
270
FUNC_INFO toolhelp_fi[] = {
271
MAKE_FUNC_INFO(CreateToolhelp32Snapshot),
272
MAKE_FUNC_INFO(Module32First),
273
MAKE_FUNC_INFO(Module32Next),
274
END_FUNC_INFO
275
};
276
277
BOOL WINAPI
278
DllMain(
279
HANDLE hinstDLL,
280
DWORD fdwReason,
281
LPVOID lpReserved
282
)
283
{
284
hLeashInst = hinstDLL;
285
286
switch (fdwReason)
287
{
288
case DLL_PROCESS_ATTACH:
289
{
290
OSVERSIONINFO osvi;
291
LoadFuncs(KRB5_DLL, k5_fi, &hKrb5, 0, 1, 0, 0);
292
LoadFuncs(COMERR_DLL, ce_fi, &hComErr, 0, 0, 1, 0);
293
LoadFuncs(SERVICE_DLL, service_fi, &hService, 0, 1, 0, 0);
294
LoadFuncs(SECUR32_DLL, lsa_fi, &hSecur32, 0, 1, 1, 1);
295
LoadFuncs(PROFILE_DLL, profile_fi, &hProfile, 0, 1, 0, 0);
296
LoadFuncs(CCAPI_DLL, ccapi_fi, &hCcapi, 0, 1, 0, 0);
297
298
memset(&osvi, 0, sizeof(OSVERSIONINFO));
299
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
300
GetVersionEx(&osvi);
301
302
// XXX: We should really use feature testing, first
303
// checking for CreateToolhelp32Snapshot. If that's
304
// not around, we try the psapi stuff.
305
//
306
// Only load LSA functions if on NT/2000/XP
307
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
308
{
309
// Windows 9x
310
LoadFuncs(TOOLHELPDLL, toolhelp_fi, &hToolHelp32, 0, 1, 0, 0);
311
hPsapi = 0;
312
}
313
else if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
314
{
315
// Windows NT
316
LoadFuncs(PSAPIDLL, psapi_fi, &hPsapi, 0, 1, 0, 0);
317
hToolHelp32 = 0;
318
}
319
320
321
/*
322
* Register window class for the MITPasswordControl that
323
* replaces normal edit controls for password input.
324
* zero any fields we don't explicitly set
325
*/
326
hLeashInst = hinstDLL;
327
328
Register_MITPasswordEditControl(hLeashInst);
329
330
return TRUE;
331
}
332
case DLL_PROCESS_DETACH:
333
if (hKrb5)
334
FreeLibrary(hKrb5);
335
if (hCcapi)
336
FreeLibrary(hCcapi);
337
if (hProfile)
338
FreeLibrary(hProfile);
339
if (hComErr)
340
FreeLibrary(hComErr);
341
if (hService)
342
FreeLibrary(hService);
343
if (hSecur32)
344
FreeLibrary(hSecur32);
345
if (hPsapi)
346
FreeLibrary(hPsapi);
347
if (hToolHelp32)
348
FreeLibrary(hToolHelp32);
349
350
return TRUE;
351
default:
352
return TRUE;
353
}
354
}
355
356