1 /*
2 Copyright 2011-2020, Dirk Krause. All rights reserved.
3 SPDX-License-Identifier:	BSD-3-Clause
4 */
5 
6 
7 /**	@file	dkwt.h	Header file for the dkwt program.
8 */
9 
10 #ifndef DKWT_H_INCLUDED
11 #define DKT3_H_INCLUDED 1
12 
13 #include <lm.h>
14 #include <sddl.h>
15 
16 #if (_WIN32) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603)
17 #if defined(_MSC_VER)
18 #include <VersionHelpers.h>
19 #else
20 #include <versionhelpers.h>
21 #endif
22 #endif
23 
24 /**	Description for one Windows account.
25 */
26 typedef struct {
27   dkChar const	*logname;	/**< Login name. */
28   dkChar const	*fullname;	/**< Full name. */
29   dkChar const	*comment;	/**< Account comment. */
30   dkChar const	*usrcomment;	/**< User comment. */
31   dkChar const	*homedir;	/**< Home directory. */
32   dkChar const	*profile;	/**< User profile. */
33   dkChar const	*textsid;	/**< SID as text. */
34   DWORD		 priv;		/**< usri4_priv. */
35   DWORD		 flags;		/**< usri4_flags. */
36   DWORD		 a_flags;	/**< usri4_authflags. */
37   DWORD		 coco;		/**< Country code. */
38   DWORD		 codepage;	/**< Code page. */
39   int		 f_long;	/**< Flag: Long information was found. */
40 } dkwt_account_t;
41 
42 
43 
44 /**	Windows group.
45 */
46 typedef struct {
47   dkChar const	*groupname;	/**< Group name. */
48   dkChar const	*comment;	/**< Comment. */
49   dkChar const	*textsid;	/**< SID as text. */
50   DWORD		 attributes;	/**< Attributes. */
51   int		 gtype;		/**< Group type (net or local). */
52 } dkwt_group_t;
53 
54 
55 
56 /**	List of Windows accounts.
57 */
58 typedef struct {
59   dk3_sto_t	*s_acc;	/**< Accounts storage. */
60   dk3_sto_it_t	*i_acc;	/**< Accounts iterator. */
61 } dkwt_account_list_t;
62 
63 
64 
65 /**	List of Windows groups.
66 */
67 typedef struct {
68   dk3_sto_t	*s_grp;	/**< Groups storage. */
69   dk3_sto_it_t	*i_grp;	/**< Groups iterator. */
70 } dkwt_group_list_t;
71 
72 
73 
74 /**	Printer information.
75 */
76 typedef struct {
77   dkChar const	*printerName;		/**< Printer name. */
78   dkChar const	*comment;		/**< Comment for the printer. */
79   dkChar const	*description;		/**< Printer description text. */
80   dkChar const	*location;		/**< Printer location. */
81   dkChar const	*serverName;		/**< Print server managing queue. */
82   dkChar const	*shareName;		/**< Share name of the printer. */
83   dkChar const	*portName;		/**< Port name. */
84   dkChar const	*driverName;		/**< Driver name. */
85   dkChar const	*deviceName;		/**< Device name. */
86   dkChar const	*separatorFile;		/**< File printed to separate jobs. */
87   dkChar const	*printProcessor;	/**< Print processor name. */
88   dkChar const	*dataType;		/**< Print data type. */
89   dkChar const	*parameters;		/**< Printer parameters. */
90   DWORD		 attributes;		/**< Printer attributes. */
91   DWORD		 status;		/**< Printer status. */
92   DWORD		 nJobs;			/**< Number of jobs in queue. */
93 } dkwt_printer_t;
94 
95 
96 
97 /**	List of printers.
98 */
99 typedef struct {
100   dk3_sto_t	*s_prn;		/**< Storage containing the printers. */
101   dk3_sto_it_t	*i_prn;		/**< Iterator through @a s_prn storage. */
102 } dkwt_printer_list_t;
103 
104 
105 
106 #ifdef __cplusplus
107 extern "C" {
108 #endif
109 
110 /**	Function for dkwt boot|shutdown|login|logout.
111 	@param	app	Application structure.
112 	@param	msg	Localized message texts.
113 	@param	kwnl	Keywords, not localized.
114 	@param	evt	Event type: 0=boot, 1=shutdown, 2=login, 3=logout
115 	@return	0 on success, DKT_RESULT_ERR_xxx on error.
116 */
117 int
118 dkwt_event(
119   dk3_app_t		*app,
120   dkChar const * const	*msg,
121   dkChar const * const	*kwnl,
122   int			 evt
123 );
124 
125 /**	Show or modify environment.
126 	@param	app	Application structure.
127 	@param	msg	Localized message texts.
128 	@param	kwnl	Keywords, not localized.
129 	@return	0 on success, DKT_RESULT_ERR_xxx on error.
130 */
131 int
132 dkwt_env(
133   dk3_app_t		*app,
134   dkChar const * const	*msg,
135   dkChar const * const	*kwnl
136 );
137 
138 /**	Function to keep data while boot/login/logout/shutdown.
139 	@param	app	Application structure.
140 	@param	msg	Localized message texts.
141 	@param	kwnl	Keywords, not localized.
142 	@return	0 on success, DKT_RESULT_ERR_xxx on error.
143 */
144 int
145 dkwt_event_keep(
146   dk3_app_t		*app,
147   dkChar const * const	*msg,
148   dkChar const * const	*kwnl
149 );
150 
151 /**	Function to reset keep flag for boot/login/logout/shutdown.
152 	@param	app	Application structure.
153 	@param	msg	Localized message texts.
154 	@param	kwnl	Keywords, not localized.
155 	@return	0 on success, DKT_RESULT_ERR_xxx on error.
156 */
157 int
158 dkwt_event_unkeep(
159   dk3_app_t		*app,
160   dkChar const * const	*msg,
161   dkChar const * const	*kwnl
162 );
163 
164 /**	Function for dkwt accounts.
165 	@param	app	Application structure.
166 	@param	msg	Localized message texts.
167 	@param	kwnl	Keywords, not localized.
168 	@return	0 on success, DKT_RESULT_ERR_xxx on error.
169 */
170 int
171 dkwt_accounts(
172   dk3_app_t		*app,
173   dkChar const * const	*msg,
174   dkChar const * const	*kwnl
175 );
176 
177 /**	Create account, allocate memory.
178 	@param	logname	Login name of user.
179 	@param	app	Application structure for diagnostics.
180 	@return	Pointer to new account on success, NULL on error.
181 */
182 dkwt_account_t *
183 dkwt_tool_open_account(dkChar const *logname, dk3_app_t *app);
184 
185 /**	Destroy account, release memory.
186 	@param	ap	Account to destroy.
187 */
188 void
189 dkwt_tool_close_account(dkwt_account_t *ap);
190 
191 /**	Create account list, allocate memory.
192 	@param	app	Application structure for diagnostics.
193 	@param	f_long	Flag: Long listing required.
194 	@return	Pointer to new list on success, NULL on error.
195 */
196 dkwt_account_list_t *
197 dkwt_tool_open_account_list(dk3_app_t *app, int f_long);
198 
199 /**	Destroy account list, release memory.
200 	@param	lp	List to destroy.
201 */
202 void
203 dkwt_tool_close_account_list(dkwt_account_list_t *lp);
204 
205 /**	Reset account list before traversing it.
206 	@param	lp	List to reset.
207 */
208 void
209 dkwt_tool_reset_account_list(dkwt_account_list_t *lp);
210 
211 /**	Get next account from list.
212 	@param	lp	List to traverse.
213 	@return	Pointer to next account or NULL (list end).
214 */
215 dkwt_account_t *
216 dkwt_tool_get_account_from_list(dkwt_account_list_t *lp);
217 
218 /**	The dkwt groups command.
219 	@param	app	Application structure.
220 	@param	msg	Localized messages texts,
221 	@param	kwnl	Keywords, not localized.
222 */
223 int
224 dkwt_groups(
225   dk3_app_t		*app,
226   dkChar const * const	*msg,
227   dkChar const * const	*kwnl
228 );
229 
230 /**	The dkwt printers command.
231 	@param	app	Application structure.
232 	@param	msg	Localized messages texts,
233 	@param	kwnl	Keywords, not localized.
234 */
235 int
236 dkwt_printers(
237   dk3_app_t		*app,
238   dkChar const * const	*msg,
239   dkChar const * const	*kwnl
240 );
241 
242 /**	The dkwt print command.
243 	@param	app	Application structure.
244 	@param	msg	Localized message texts.
245 	@param	kwnl	Keywords, not localized.
246 */
247 int
248 dkwt_print(
249   dk3_app_t		*app,
250   dkChar const * const	*msg,
251   dkChar const * const	*kwnl
252 );
253 
254 /**	Create a new group list.
255 	@param	app	Application structure.
256 	@param	f_long	Flag: Long (full) listing.
257 	@return	Pointer to new group list on success, NULL on error.
258 */
259 dkwt_group_list_t *
260 dkwt_tool_open_group_list(dk3_app_t *app, int f_long);
261 
262 /**	Reset a group list.
263 	@param	glp	Group list to reset.
264 */
265 void
266 dkwt_tool_reset_group_list(dkwt_group_list_t *glp);
267 
268 /**	Retrieve next group from list.
269 	@param	glp	Group list to traverse.
270 	@return	Pointer to next group on success, NULL on error.
271 */
272 dkwt_group_t *
273 dkwt_tool_get_group_from_list(dkwt_group_list_t *glp);
274 
275 /**	Close group list, release memory.
276 	@param	glp	Group list to close.
277 */
278 void
279 dkwt_tool_close_group_list(dkwt_group_list_t *glp);
280 
281 /**	Open printer list.
282 	@param	app	Application structure.
283 	@param	f_long	Flag: Long information about printers.
284 	@return	Pointer to new printer list on success, NULL on errors.
285 */
286 dkwt_printer_list_t *
287 dkwt_tool_open_printer_list(dk3_app_t *app, int f_long);
288 
289 /**	Close printer list, release memory.
290 	@param	pl	List to close.
291 */
292 void
293 dkwt_tool_close_printer_list(dkwt_printer_list_t *pl);
294 
295 /**	Reset printer list.
296 	@param	pl	Printer list to reset.
297 */
298 void
299 dkwt_tool_printer_list_reset(dkwt_printer_list_t *pl);
300 
301 /**	Get next printer description from list.
302 	@param	pl	Printer list.
303 	@return	Pointer to next printer on success, NULL on error.
304 */
305 dkwt_printer_t *
306 dkwt_tool_printer_list_next(dkwt_printer_list_t *pl);
307 
308 /**	Open a registry key.
309 	@param	key
310 	@param	skn
311 	@param	sam
312 	@param	phk
313 	@return	ERROR_SUCCESS on success, any other value indicates
314 	an error.
315 */
316 long
317 dkwt_tool_reg_open_key(
318   HKEY		 key,
319   dkChar const	*skn,
320   REGSAM	 sam,
321   PHKEY		 phk
322 );
323 
324 /**	Query a registry value.
325 	@param	hk	Registry key.
326 	@param	vn	Value name.
327 	@param	pDwTp	Pointer to type variable (in/out).
328 	@param	buf	Pointer to result buffer.
329 	@param	pDwSz	Result buffer length available/used.
330 	@return	ERROR_SUCCESS on success, any other value indicates
331 	an error.
332 */
333 long
334 dkwt_tool_reg_query_value(
335   HKEY			 hk,
336   dkChar const		*vn,
337   DWORD			*pDwTp,
338   void			*buf,
339   DWORD			*pDwSz
340 );
341 
342 /**	Delete a registry entry (value).
343 	@param	hk	Registry key.
344 	@param	en	Name of entry to delete.
345 	@return	ERROR_SUCCESS on success, any other value indicates an error.
346 */
347 long
348 dkwt_tool_reg_delete_value(
349   HKEY		 hk,
350   dkChar const	*en
351 );
352 
353 /**	Delete subkey hierarchy.
354 	@param	hk	Parent registry key.
355 	@param	tn	Name of subkey to delete.
356 	@return	ERROR_SUCCESS on success, any other value indicates an error.
357 */
358 long
359 dkwt_tool_reg_delete_tree(
360   HKEY		 hk,
361   dkChar const	*tn
362 );
363 
364 /**	Enumerate subkeys of a key.
365 	@param	hk		Registry key.
366 	@param	dwIndex		Index of subkey to enumerate.
367 	@param	pResult		Pointer to result buffer.
368 	@param	pDwSzResult	Pointer to buffer length / result length.
369 	@param	pClass		Subkey class name, may be NULL.
370 	@param	pDwSzClass	Subkey class name length, may be NULL.
371 	@param	pLastWrite	Pointer to timestamp, may be NULL.
372 	@return ERROR_SUCCESS on success, ERROR_NO_MORE_DATA on end,
373 	any other value indicates an error.
374 */
375 long
376 dkwt_tool_reg_enum_key(
377   HKEY			 hk,
378   DWORD			 dwIndex,
379   dkChar		*pResult,
380   DWORD			*pDwSzResult,
381   dkChar		*pClass,
382   DWORD			*pDwSzClass,
383   PFILETIME		 pLastWrite
384 );
385 
386 /**	Create a registry key.
387 	@param	hk		Parent key.
388 	@param	kn		Subkey name.
389 	@param	dwOptions	Options (0 is a good choice).
390 	@param	sam		Access mask.
391 	@param	pHkeyResult	Pointer to result HKEY.
392 	@param	lpDwDisposition	Pointer to disposition DWORD, may be NULL.
393 	@return	ERROR_SUCCESS on success, any other value indicates an error.
394 */
395 long
396 dkwt_tool_reg_create_key(
397   HKEY		 hk,
398   dkChar const	*kn,
399   DWORD		 dwOptions,
400   REGSAM	 sam,
401   PHKEY		 pHkeyResult,
402   LPDWORD	 lpDwDisposition
403 );
404 
405 /**	Set a registry value.
406 	@param	hk	Handle for registry key.
407 	@param	vn	Value name.
408 	@param	dwType	Value type.
409 	@param	pData	Value data.
410 	@param	szData	Length of value data.
411 	@return	ERROR_SUCCESS on success, any other value indicates an error.
412 */
413 long
414 dkwt_ev_reg_set_value(
415   HKEY		 hk,
416   dkChar const	*vn,
417   DWORD		 dwType,
418   void		*pData,
419   DWORD		 szData
420 );
421 
422 /**	Clear local print queues.
423 	@param	app		Application structure for diagnostics.
424 	@param	msg		Localized message texts.
425 	@param	kwnl		Keywords, not localized.
426 	@param	userName	User for which to delete print jobs.
427 */
428 void
429 dkwt_clear_printers_local(
430   dk3_app_t		*app,
431   dkChar const * const	*msg,
432   dkChar const * const	*kwnl,
433   dkChar const		*userName
434 );
435 
436 /**	Clear LPRng/LPD remote print queues.
437 	@param	app		Application structure for diagnostics.
438 	@param	msg		Localized message texts.
439 	@param	kwnl		Keywords, not localized.
440 	@param	userName	User name for print jobs.
441 	@param	iterator	Iterator for print queue names storage.
442 */
443 void
444 dkwt_clear_printers_remote(
445   dk3_app_t		*app,
446   dkChar const * const	*msg,
447   dkChar const * const	*kwnl,
448   dkChar const		*userName,
449   dk3_sto_it_t		*iterator
450 );
451 
452 /**	Check whether the current process runs with administrative privileges.
453 	@return	1 for administrative process, 0 for non-administrative
454 	process, -1 for failed check.
455 */
456 int
457 dkwt_is_admin(void);
458 
459 #ifdef __cplusplus
460 }
461 #endif
462 
463 /**	Show groups found on network server.
464 */
465 #define	DKWT_GROUP_NET		0
466 
467 /**	Show groups found on local computer.
468 */
469 #define	DKWT_GROUP_LOCAL	1
470 
471 #endif
472 
473