xref: /freebsd/crypto/krb5/src/windows/leashdll/leashdll.c (revision ee3960cba1068e12fb032a68c46d74841d9edab3)
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