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