aboutsummaryrefslogtreecommitdiff
path: root/src/util/winproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/winproc.c')
-rw-r--r--src/util/winproc.c340
1 files changed, 0 insertions, 340 deletions
diff --git a/src/util/winproc.c b/src/util/winproc.c
deleted file mode 100644
index f2e4de4df..000000000
--- a/src/util/winproc.c
+++ /dev/null
@@ -1,340 +0,0 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
21/**
22 * @file util/winproc.c
23 * @brief Functions for MS Windows
24 * @author Nils Durner
25 */
26
27#include "platform.h"
28#include "gnunet_crypto_lib.h"
29#include "gnunet_common.h"
30
31
32#ifdef MINGW
33
34static HINSTANCE hNTDLL, hIphlpapi, hAdvapi, hNetapi;
35#ifdef W32_VEH
36static void *GNWinVEH_handle = NULL;
37#endif
38
39TNtQuerySystemInformation GNNtQuerySystemInformation;
40TGetIfEntry GNGetIfEntry;
41TGetIpAddrTable GNGetIpAddrTable;
42TGetIfTable GNGetIfTable;
43TOpenSCManager GNOpenSCManager;
44TCreateService GNCreateService;
45TCloseServiceHandle GNCloseServiceHandle;
46TDeleteService GNDeleteService;
47TRegisterServiceCtrlHandler GNRegisterServiceCtrlHandler;
48TSetServiceStatus GNSetServiceStatus;
49TStartServiceCtrlDispatcher GNStartServiceCtrlDispatcher;
50TControlService GNControlService;
51TOpenService GNOpenService;
52TGetBestInterfaceEx GNGetBestInterfaceEx;
53TGetAdaptersInfo GNGetAdaptersInfo;
54TNetUserAdd GNNetUserAdd;
55TNetUserSetInfo GNNetUserSetInfo;
56TLsaOpenPolicy GNLsaOpenPolicy;
57TLsaAddAccountRights GNLsaAddAccountRights;
58TLsaRemoveAccountRights GNLsaRemoveAccountRights;
59TLsaClose GNLsaClose;
60TLookupAccountName GNLookupAccountName;
61TGetFileSecurity GNGetFileSecurity;
62TInitializeSecurityDescriptor GNInitializeSecurityDescriptor;
63TGetSecurityDescriptorDacl GNGetSecurityDescriptorDacl;
64TGetAclInformation GNGetAclInformation;
65TInitializeAcl GNInitializeAcl;
66TGetAce GNGetAce;
67TEqualSid GNEqualSid;
68TAddAce GNAddAce;
69TAddAccessAllowedAce GNAddAccessAllowedAce;
70TSetNamedSecurityInfo GNSetNamedSecurityInfo;
71
72#define LOG(kind, ...) GNUNET_log_from(kind, "util-winproc", __VA_ARGS__)
73/**
74 * Log (panic) messages from PlibC
75 */
76void
77plibc_panic(int err, char *msg)
78{
79 LOG(((err == INT_MAX) ? GNUNET_ERROR_TYPE_DEBUG : GNUNET_ERROR_TYPE_ERROR),
80 "%s", msg);
81}
82
83#ifdef W32_VEH
84/**
85 * Handles exceptions (useful for debugging).
86 * Issues a DebugBreak() call if the process is being debugged (not really
87 * useful - if the process is being debugged, this handler won't be invoked
88 * anyway). If it is not, runs a debugger from GNUNET_DEBUGGER env var,
89 * substituting first %u in it for PID, and the second one for the event,
90 * that should be set once the debugger attaches itself (otherwise the
91 * only way out of WaitForSingleObject() is to time out after 1 minute).
92 */
93LONG __stdcall
94GNWinVEH(PEXCEPTION_POINTERS ExceptionInfo)
95{
96 char debugger[MAX_PATH + 1];
97 char *debugger_env = NULL;
98
99 if (IsDebuggerPresent())
100 {
101 DebugBreak();
102 return EXCEPTION_CONTINUE_EXECUTION;
103 }
104 debugger_env = getenv("GNUNET_DEBUGGER");
105 if (debugger_env != NULL)
106 {
107 STARTUPINFO si;
108 PROCESS_INFORMATION pi;
109 HANDLE event;
110 SECURITY_ATTRIBUTES sa;
111 memset(&si, 0, sizeof(si));
112 si.cb = sizeof(si);
113 memset(&pi, 0, sizeof(pi));
114 memset(&sa, 0, sizeof(sa));
115 sa.nLength = sizeof(sa);
116 sa.bInheritHandle = TRUE;
117 event = CreateEvent(&sa, FALSE, FALSE, NULL);
118 snprintf(debugger, MAX_PATH + 1, debugger_env, GetCurrentProcessId(), (uintptr_t)event);
119 debugger[MAX_PATH] = '\0';
120 if (0 != CreateProcessA(NULL, debugger, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
121 {
122 CloseHandle(pi.hProcess);
123 CloseHandle(pi.hThread);
124 WaitForSingleObject(event, 60000);
125 CloseHandle(event);
126 if (IsDebuggerPresent())
127 {
128 return EXCEPTION_CONTINUE_EXECUTION;
129 }
130 }
131 else
132 CloseHandle(event);
133 }
134 return EXCEPTION_CONTINUE_SEARCH;
135}
136#endif
137
138/**
139 * @brief Initialize PlibC and set up Windows environment
140 * @param logging context, NULL means stderr
141 * @return Error code from winerror.h, ERROR_SUCCESS on success
142 */
143int
144GNInitWinEnv()
145{
146 int ret;
147
148 plibc_initialized();
149 plibc_set_panic_proc(plibc_panic);
150 ret = plibc_init_utf8("GNU", PACKAGE, 1);
151 plibc_set_stat_size_size(sizeof(((struct stat *)0)->st_size));
152 plibc_set_stat_time_size(sizeof(((struct stat *)0)->st_mtime));
153 /* don't load other DLLs twice */
154 if (hNTDLL)
155 return ret;
156
157#ifdef W32_VEH
158 if (GNWinVEH_handle == NULL)
159 {
160 GNWinVEH_handle = AddVectoredExceptionHandler(1, &GNWinVEH);
161 if (GNWinVEH_handle == NULL)
162 {
163 /* This is bad, but what can we do? */
164 printf("Failed to set up an exception handler!\n");
165 }
166 }
167#endif
168
169 hNTDLL = LoadLibrary("ntdll.dll");
170
171 /* Function to get CPU usage under Win NT */
172 if (hNTDLL)
173 {
174 GNNtQuerySystemInformation =
175 (TNtQuerySystemInformation)GetProcAddress(hNTDLL,
176 "NtQuerySystemInformation");
177 }
178 else
179 {
180 GNNtQuerySystemInformation = NULL;
181 }
182
183 /* Functions to get information about a network adapter */
184 hIphlpapi = LoadLibrary("iphlpapi.dll");
185 if (hIphlpapi)
186 {
187 GNGetIfEntry = (TGetIfEntry)GetProcAddress(hIphlpapi, "GetIfEntry");
188 GNGetIpAddrTable =
189 (TGetIpAddrTable)GetProcAddress(hIphlpapi, "GetIpAddrTable");
190 GNGetIfTable = (TGetIfTable)GetProcAddress(hIphlpapi, "GetIfTable");
191 GNGetBestInterfaceEx =
192 (TGetBestInterfaceEx)GetProcAddress(hIphlpapi, "GetBestInterfaceEx");
193 GNGetAdaptersInfo =
194 (TGetAdaptersInfo)GetProcAddress(hIphlpapi, "GetAdaptersInfo");
195 }
196 else
197 {
198 GNGetIfEntry = NULL;
199 GNGetIpAddrTable = NULL;
200 GNGetIfTable = NULL;
201 GNGetBestInterfaceEx = NULL;
202 GNGetAdaptersInfo = NULL;
203 }
204
205 /* Service & Account functions */
206 hAdvapi = LoadLibrary("advapi32.dll");
207 if (hAdvapi)
208 {
209 GNOpenSCManager =
210 (TOpenSCManager)GetProcAddress(hAdvapi, "OpenSCManagerA");
211 GNCreateService =
212 (TCreateService)GetProcAddress(hAdvapi, "CreateServiceA");
213 GNCloseServiceHandle =
214 (TCloseServiceHandle)GetProcAddress(hAdvapi, "CloseServiceHandle");
215 GNDeleteService =
216 (TDeleteService)GetProcAddress(hAdvapi, "DeleteService");
217 GNRegisterServiceCtrlHandler =
218 (TRegisterServiceCtrlHandler)GetProcAddress(hAdvapi,
219 "RegisterServiceCtrlHandlerA");
220 GNSetServiceStatus =
221 (TSetServiceStatus)GetProcAddress(hAdvapi, "SetServiceStatus");
222 GNStartServiceCtrlDispatcher =
223 (TStartServiceCtrlDispatcher)GetProcAddress(hAdvapi,
224 "StartServiceCtrlDispatcherA");
225 GNControlService =
226 (TControlService)GetProcAddress(hAdvapi, "ControlService");
227 GNOpenService = (TOpenService)GetProcAddress(hAdvapi, "OpenServiceA");
228
229 GNLsaOpenPolicy =
230 (TLsaOpenPolicy)GetProcAddress(hAdvapi, "LsaOpenPolicy");
231 GNLsaAddAccountRights =
232 (TLsaAddAccountRights)GetProcAddress(hAdvapi, "LsaAddAccountRights");
233 GNLsaRemoveAccountRights =
234 (TLsaRemoveAccountRights)GetProcAddress(hAdvapi,
235 "LsaRemoveAccountRights");
236 GNLsaClose = (TLsaClose)GetProcAddress(hAdvapi, "LsaClose");
237 GNLookupAccountName =
238 (TLookupAccountName)GetProcAddress(hAdvapi, "LookupAccountNameA");
239
240 GNGetFileSecurity =
241 (TGetFileSecurity)GetProcAddress(hAdvapi, "GetFileSecurityA");
242 GNInitializeSecurityDescriptor =
243 (TInitializeSecurityDescriptor)GetProcAddress(hAdvapi,
244 "InitializeSecurityDescriptor");
245 GNGetSecurityDescriptorDacl =
246 (TGetSecurityDescriptorDacl)GetProcAddress(hAdvapi,
247 "GetSecurityDescriptorDacl");
248 GNGetAclInformation =
249 (TGetAclInformation)GetProcAddress(hAdvapi, "GetAclInformation");
250 GNInitializeAcl =
251 (TInitializeAcl)GetProcAddress(hAdvapi, "InitializeAcl");
252 GNGetAce = (TGetAce)GetProcAddress(hAdvapi, "GetAce");
253 GNEqualSid = (TEqualSid)GetProcAddress(hAdvapi, "EqualSid");
254 GNAddAce = (TAddAce)GetProcAddress(hAdvapi, "AddAce");
255 GNAddAccessAllowedAce =
256 (TAddAccessAllowedAce)GetProcAddress(hAdvapi, "AddAccessAllowedAce");
257 GNSetNamedSecurityInfo =
258 (TSetNamedSecurityInfo)GetProcAddress(hAdvapi,
259 "SetNamedSecurityInfoA");
260 }
261 else
262 {
263 GNOpenSCManager = NULL;
264 GNCreateService = NULL;
265 GNCloseServiceHandle = NULL;
266 GNDeleteService = NULL;
267 GNRegisterServiceCtrlHandler = NULL;
268 GNSetServiceStatus = NULL;
269 GNStartServiceCtrlDispatcher = NULL;
270 GNControlService = NULL;
271 GNOpenService = NULL;
272
273 GNLsaOpenPolicy = NULL;
274 GNLsaAddAccountRights = NULL;
275 GNLsaRemoveAccountRights = NULL;
276 GNLsaClose = NULL;
277 GNLookupAccountName = NULL;
278
279 GNGetFileSecurity = NULL;
280 GNInitializeSecurityDescriptor = NULL;
281 GNGetSecurityDescriptorDacl = NULL;
282 GNGetAclInformation = NULL;
283 GNInitializeAcl = NULL;
284 GNGetAce = NULL;
285 GNEqualSid = NULL;
286 GNAddAce = NULL;
287 GNAddAccessAllowedAce = NULL;
288 GNSetNamedSecurityInfo = NULL;
289 }
290
291 /* Account function */
292 hNetapi = LoadLibrary("netapi32.dll");
293 if (hNetapi)
294 {
295 GNNetUserAdd = (TNetUserAdd)GetProcAddress(hNetapi, "NetUserAdd");
296 GNNetUserSetInfo =
297 (TNetUserSetInfo)GetProcAddress(hNetapi, "NetUserSetInfo");
298 }
299 else
300 {
301 GNNetUserAdd = NULL;
302 GNNetUserSetInfo = NULL;
303 }
304
305 return ret;
306}
307
308/**
309 * Clean up Windows environment
310 */
311void
312GNShutdownWinEnv()
313{
314 plibc_shutdown();
315
316#ifdef W32_VEH
317 if (GNWinVEH_handle != NULL)
318 {
319 RemoveVectoredExceptionHandler(GNWinVEH_handle);
320 GNWinVEH_handle = NULL;
321 }
322#endif
323
324 FreeLibrary(hNTDLL);
325 FreeLibrary(hIphlpapi);
326 FreeLibrary(hAdvapi);
327 FreeLibrary(hNetapi);
328
329 CoUninitialize();
330}
331
332#endif /* MINGW */
333
334#if !HAVE_ATOLL
335long long
336atoll(const char *nptr)
337{
338 return atol(nptr);
339}
340#endif