externalizing secushare logic
[oweals/gnunet.git] / src / include / winproc.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2001, 2002, 2003, 2004, 2005 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  * @author Nils Durner
23  *
24  * @file
25  * Definitions for MS Windows
26  */
27
28 #ifndef _WINPROC_H
29 #define _WINPROC_H
30
31 #include <io.h>
32 #include <stdio.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <sys/timeb.h>
36 #include <time.h>
37 #include <dirent.h>
38 #ifndef FD_SETSIZE
39 #define FD_SETSIZE 1024
40 #endif
41 #include <winsock2.h>
42 #include <ws2tcpip.h>
43 #include <windows.h>
44 #include <winerror.h>
45 #include <iphlpapi.h>
46 #include <shlobj.h>
47 #include <objbase.h>
48 #include <sys/param.h>          /* #define BYTE_ORDER */
49 #include <ntsecapi.h>
50 #include <lm.h>
51 #include <aclapi.h>
52
53
54 #ifdef __cplusplus
55 extern "C"
56 {
57 #endif
58
59 #ifndef MAX_NAME_LENGTH
60 #define MAX_NAME_LENGTH 25
61 #endif
62
63   typedef DWORD WINAPI (*TNtQuerySystemInformation) (int, PVOID, ULONG, PULONG);
64   typedef DWORD WINAPI (*TGetIfEntry) (PMIB_IFROW pIfRow);
65   typedef DWORD WINAPI (*TGetIpAddrTable) (PMIB_IPADDRTABLE pIpAddrTable,
66                                            PULONG pdwSize, BOOL bOrder);
67   typedef DWORD WINAPI (*TGetIfTable) (PMIB_IFTABLE pIfTable, PULONG pdwSize,
68                                        BOOL bOrder);
69   typedef DWORD WINAPI (*TGetBestInterfaceEx) (struct sockaddr *, PDWORD);
70   /* TODO: Explicitly import -A variants (i.e. TCreateHardLinkA) or -W
71    * variants (TCreateHardLinkW), etc.
72    */
73   typedef DWORD WINAPI (*TCreateHardLink) (LPCTSTR lpFileName,
74                                            LPCTSTR lpExistingFileName,
75                                            LPSECURITY_ATTRIBUTES
76                                            lpSecurityAttributes);
77   typedef SC_HANDLE WINAPI (*TOpenSCManager) (LPCTSTR lpMachineName,
78                                               LPCTSTR lpDatabaseName,
79                                               DWORD dwDesiredAccess);
80   typedef SC_HANDLE WINAPI (*TCreateService) (SC_HANDLE hSCManager,
81                                               LPCTSTR lpServiceName,
82                                               LPCTSTR lpDisplayName,
83                                               DWORD dwDesiredAccess,
84                                               DWORD dwServiceType,
85                                               DWORD dwStartType,
86                                               DWORD dwErrorControl,
87                                               LPCTSTR lpBinaryPathName,
88                                               LPCTSTR lpLoadOrderGroup,
89                                               LPDWORD lpdwTagId,
90                                               LPCTSTR lpDependencies,
91                                               LPCTSTR lpServiceStartName,
92                                               LPCTSTR lpPassword);
93   typedef BOOL WINAPI (*TCloseServiceHandle) (SC_HANDLE hSCObject);
94   typedef BOOL WINAPI (*TDeleteService) (SC_HANDLE hService);
95   typedef SERVICE_STATUS_HANDLE WINAPI (*TRegisterServiceCtrlHandler) (LPCTSTR
96                                                                        lpServiceName,
97                                                                        LPHANDLER_FUNCTION
98                                                                        lpHandlerProc);
99   typedef BOOL WINAPI (*TSetServiceStatus) (SERVICE_STATUS_HANDLE
100                                             hServiceStatus,
101                                             LPSERVICE_STATUS lpServiceStatus);
102   typedef BOOL WINAPI (*TStartServiceCtrlDispatcher) (const
103                                                       LPSERVICE_TABLE_ENTRY
104                                                       lpServiceTable);
105   typedef BOOL WINAPI (*TControlService) (SC_HANDLE hService, DWORD dwControl,
106                                           LPSERVICE_STATUS lpServiceStatus);
107   typedef SC_HANDLE WINAPI (*TOpenService) (SC_HANDLE hSCManager,
108                                             LPCTSTR lpServiceName,
109                                             DWORD dwDesiredAccess);
110   typedef DWORD WINAPI (*TGetAdaptersInfo) (PIP_ADAPTER_INFO pAdapterInfo,
111                                             PULONG pOutBufLen);
112   typedef NET_API_STATUS WINAPI (*TNetUserAdd) (LPCWSTR, DWORD, PBYTE, PDWORD);
113   typedef NET_API_STATUS WINAPI (*TNetUserSetInfo) (LPCWSTR servername,
114                                                     LPCWSTR username,
115                                                     DWORD level, LPBYTE buf,
116                                                     LPDWORD param_err);
117   typedef NTSTATUS NTAPI (*TLsaOpenPolicy) (PLSA_UNICODE_STRING,
118                                             PLSA_OBJECT_ATTRIBUTES, ACCESS_MASK,
119                                             PLSA_HANDLE);
120   typedef NTSTATUS NTAPI (*TLsaAddAccountRights) (LSA_HANDLE, PSID,
121                                                   PLSA_UNICODE_STRING, ULONG);
122   typedef NTSTATUS NTAPI (*TLsaRemoveAccountRights) (LSA_HANDLE, PSID, BOOLEAN,
123                                                      PLSA_UNICODE_STRING,
124                                                      ULONG);
125   typedef NTSTATUS NTAPI (*TLsaClose) (LSA_HANDLE);
126   typedef BOOL WINAPI (*TLookupAccountName) (LPCTSTR lpSystemName,
127                                              LPCTSTR lpAccountName, PSID Sid,
128                                              LPDWORD cbSid,
129                                              LPTSTR ReferencedDomainName,
130                                              LPDWORD cchReferencedDomainName,
131                                              PSID_NAME_USE peUse);
132
133   typedef BOOL WINAPI (*TGetFileSecurity) (LPCTSTR lpFileName,
134                                            SECURITY_INFORMATION
135                                            RequestedInformation,
136                                            PSECURITY_DESCRIPTOR
137                                            pSecurityDescriptor, DWORD nLength,
138                                            LPDWORD lpnLengthNeeded);
139   typedef BOOL WINAPI (*TInitializeSecurityDescriptor) (PSECURITY_DESCRIPTOR
140                                                         pSecurityDescriptor,
141                                                         DWORD dwRevision);
142   typedef BOOL WINAPI (*TGetSecurityDescriptorDacl) (PSECURITY_DESCRIPTOR
143                                                      pSecurityDescriptor,
144                                                      LPBOOL lpbDaclPresent,
145                                                      PACL * pDacl,
146                                                      LPBOOL lpbDaclDefaulted);
147   typedef BOOL WINAPI (*TGetAclInformation) (PACL pAcl, LPVOID pAclInformation,
148                                              DWORD nAclInformationLength,
149                                              ACL_INFORMATION_CLASS
150                                              dwAclInformationClass);
151   typedef BOOL WINAPI (*TInitializeAcl) (PACL pAcl, DWORD nAclLength,
152                                          DWORD dwAclRevision);
153   typedef BOOL WINAPI (*TGetAce) (PACL pAcl, DWORD dwAceIndex, LPVOID * pAce);
154   typedef BOOL WINAPI (*TEqualSid) (PSID pSid1, PSID pSid2);
155   typedef BOOL WINAPI (*TAddAce) (PACL pAcl, DWORD dwAceRevision,
156                                   DWORD dwStartingAceIndex, LPVOID pAceList,
157                                   DWORD nAceListLength);
158   typedef BOOL WINAPI (*TAddAccessAllowedAce) (PACL pAcl, DWORD dwAceRevision,
159                                                DWORD AccessMask, PSID pSid);
160   typedef BOOL WINAPI (*TSetNamedSecurityInfo) (LPTSTR pObjectName,
161                                                 SE_OBJECT_TYPE ObjectType,
162                                                 SECURITY_INFORMATION
163                                                 SecurityInfo, PSID psidOwner,
164                                                 PSID psidGroup, PACL pDacl,
165                                                 PACL pSacl);
166
167   extern TGetBestInterfaceEx GNGetBestInterfaceEx;
168   extern TNtQuerySystemInformation GNNtQuerySystemInformation;
169   extern TGetIfEntry GNGetIfEntry;
170   extern TGetIpAddrTable GNGetIpAddrTable;
171   extern TGetIfTable GNGetIfTable;
172   extern TCreateHardLink GNCreateHardLink;
173   extern TOpenSCManager GNOpenSCManager;
174   extern TCreateService GNCreateService;
175   extern TCloseServiceHandle GNCloseServiceHandle;
176   extern TDeleteService GNDeleteService;
177   extern TRegisterServiceCtrlHandler GNRegisterServiceCtrlHandler;
178   extern TSetServiceStatus GNSetServiceStatus;
179   extern TStartServiceCtrlDispatcher GNStartServiceCtrlDispatcher;
180   extern TControlService GNControlService;
181   extern TOpenService GNOpenService;
182   extern TGetAdaptersInfo GNGetAdaptersInfo;
183   extern TNetUserAdd GNNetUserAdd;
184   extern TNetUserSetInfo GNNetUserSetInfo;
185   extern TLsaOpenPolicy GNLsaOpenPolicy;
186   extern TLsaAddAccountRights GNLsaAddAccountRights;
187   extern TLsaRemoveAccountRights GNLsaRemoveAccountRights;
188   extern TLsaClose GNLsaClose;
189   extern TLookupAccountName GNLookupAccountName;
190   extern TGetFileSecurity GNGetFileSecurity;
191   extern TInitializeSecurityDescriptor GNInitializeSecurityDescriptor;
192   extern TGetSecurityDescriptorDacl GNGetSecurityDescriptorDacl;
193   extern TGetAclInformation GNGetAclInformation;
194   extern TInitializeAcl GNInitializeAcl;
195   extern TGetAce GNGetAce;
196   extern TEqualSid GNEqualSid;
197   extern TAddAce GNAddAce;
198   extern TAddAccessAllowedAce GNAddAccessAllowedAce;
199   extern TSetNamedSecurityInfo GNSetNamedSecurityInfo;
200
201
202   BOOL CreateShortcut (const char *pszSrc, const char *pszDest);
203   BOOL DereferenceShortcut (char *pszShortcut);
204   long QueryRegistry (HKEY hMainKey, const char *pszKey, const char *pszSubKey,
205                       char *pszBuffer, long *pdLength);
206   int ListNICs (void (*callback) (void *, const char *, int), void *cls);
207   BOOL AddPathAccessRights (char *lpszFileName, char *lpszAccountName,
208                             DWORD dwAccessMask);
209   char *winErrorStr (const char *prefix, int dwErr);
210   void EnumNICs (PMIB_IFTABLE * pIfTable, PMIB_IPADDRTABLE * pAddrTable);
211
212 #define ENUMNICS3_MASK_OK 0x01
213 #define ENUMNICS3_BCAST_OK 0x02
214
215   struct EnumNICs3_results
216   {
217     unsigned char flags;
218     int is_default;
219     char pretty_name[1001];
220     size_t addr_size;
221     SOCKADDR_STORAGE address;
222     SOCKADDR_STORAGE mask;
223     SOCKADDR_STORAGE broadcast;
224   };
225
226   int EnumNICs3 (struct EnumNICs3_results **, int *EnumNICs3_results_count);
227   void EnumNICs3_free (struct EnumNICs3_results *);
228   int GNInitWinEnv ();
229   void GNShutdownWinEnv ();
230
231   BOOL SafeTerminateProcess (HANDLE hProcess, UINT uExitCode, DWORD dwTimeout);
232 #ifdef __cplusplus
233 }
234 #endif
235
236 #endif