1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 * 25 * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 26 */ 27 28 #ifndef _MLSVC_WINREG_NDL_ 29 #define _MLSVC_WINREG_NDL_ 30 31 /* 32 * Windows Registry (WINREG) RPC interface definition. 33 * 34 * The Windows registry is split into a number of hives, which are divided 35 * by function. The hive names are abbreviated and prefixed by HKEY or HK. 36 * 37 * HKEY_CLASSES_ROOT (HKCR) Information about registered applications 38 * HKEY_CURRENT_USER (HKCU) Settings for the current logged in user. 39 * HKEY_LOCAL_MACHINE (HKLM) Settings for all users on the computer. 40 * HKEY_USERS (HKU) HKEY_CURRENT_USER subkeys for user accounts. 41 * HKEY_CURRENT_CONFIG (HKCC) Runtime configuration information. 42 * HKEY_PERFORMANCE_DATA (HKPD) Runtime performance data. 43 * HKEY_DYN_DATA (HKDD) Runtime data for Windows 9x applications. 44 * HKEY_PERFORMANCE_TEXT (HKPT) Runtime performance information. 45 * HKEY_PERFORMANCE_NLS (HKPN) Runtime performance information. 46 */ 47 48 #include <libmlrpc/ndrtypes.ndl> 49 50 /* Windows NT */ 51 #define WINREG_OPNUM_OpenHKCR 0x00 52 #define WINREG_OPNUM_OpenHKCU 0x01 53 #define WINREG_OPNUM_OpenHKLM 0x02 54 #define WINREG_OPNUM_OpenHKPD 0x03 55 #define WINREG_OPNUM_OpenHKUsers 0x04 56 #define WINREG_OPNUM_Close 0x05 57 #define WINREG_OPNUM_CreateKey 0x06 58 #define WINREG_OPNUM_DeleteKey 0x07 59 #define WINREG_OPNUM_DeleteValue 0x08 60 #define WINREG_OPNUM_EnumKey 0x09 61 #define WINREG_OPNUM_EnumValue 0x0a 62 #define WINREG_OPNUM_FlushKey 0x0b 63 #define WINREG_OPNUM_GetKeySec 0x0c 64 #define WINREG_OPNUM_LoadKey 0x0d 65 #define WINREG_OPNUM_NotifyChange 0x0e 66 #define WINREG_OPNUM_OpenKey 0x0f 67 #define WINREG_OPNUM_QueryKey 0x10 68 #define WINREG_OPNUM_QueryValue 0x11 69 #define WINREG_OPNUM_ReplaceKey 0x12 70 #define WINREG_OPNUM_RestoreKey 0x13 71 #define WINREG_OPNUM_SaveKey 0x14 72 #define WINREG_OPNUM_SetKeySec 0x15 73 74 /* Windows 2000 */ 75 #define WINREG_OPNUM_CreateValue 0x16 76 #define WINREG_OPNUM_UnloadKey 0x17 77 #define WINREG_OPNUM_Shutdown 0x18 78 #define WINREG_OPNUM_AbortShutdown 0x19 79 #define WINREG_OPNUM_GetVersion 0x1a 80 #define WINREG_OPNUM_OpenHKCC 0x1b 81 #define WINREG_OPNUM_OpenHKDD 0x1c 82 #define WINREG_OPNUM_QueryMultiValues 0x1d 83 #define WINREG_OPNUM_ShutdownEx 0x1e 84 85 /* Windows XP and Windows Server 2003 */ 86 #define WINREG_OPNUM_SavekeyEx 0x1f 87 #define WINREG_OPNUM_OpenHKPT 0x20 88 #define WINREG_OPNUM_OpenHKPN 0x21 89 90 /* Windows 2003 SP1 */ 91 #define WINREG_OPNUM_QueryMultiValues2 0x22 92 #define WINREG_OPNUM_DeleteKeyEx 0x23 93 94 #define WINREG_TYPE_NONE 0 95 #define WINREG_SZ 1 96 #define WINREG_EXPAND_SZ 2 97 #define WINREG_BINARY 3 98 #define WINREG_DWORD 4 99 #define WINREG_DWORD_BIG_ENDIAN 5 100 #define WINREG_LINK 6 101 #define WINREG_MULTI_SZ 7 102 #define WINREG_RESOURCE_LIST 8 103 #define WINREG_RESOURCE_DESC 9 104 #define WINREG_RESOURCE_REQ_LIST 10 105 #define WINREG_QWORD 11 106 107 #define WINREG_ACCESS_QUERY_VALUE 0x00000001 108 #define WINREG_ACCESS_SET_VALUE 0x00000002 109 #define WINREG_ACCESS_CREATE_KEY 0x00000004 110 #define WINREG_ACCESS_ENUMERATE 0x00000008 111 #define WINREG_ACCESS_NOTIFY 0x00000010 112 #define WINREG_ACCESS_CREATE_LINK 0x00000020 113 #define WINREG_ACCESS_KEY64 0x00000100 114 #define WINREG_ACCESS_KEY32 0x00000200 115 116 CONTEXT_HANDLE(winreg_handle) winreg_handle_t; 117 118 struct winreg_string_desc { 119 WORD length; 120 WORD allosize; 121 LPTSTR str; 122 }; 123 typedef struct winreg_string_desc winreg_string_t; 124 125 /* 126 * Fake Varying/Conformant with a funny conformant. 127 */ 128 struct winreg_value { 129 DWORD vc_first_is; /* 0 */ 130 DWORD vc_length_is; 131 SIZE_IS(vc_length_is) 132 BYTE value[ANY_SIZE_ARRAY]; 133 }; 134 135 struct winreg_vcs { 136 DWORD vc_first_is; /* 0 */ 137 DWORD vc_length_is; 138 SIZE_IS(vc_length_is) 139 WORD value[ANY_SIZE_ARRAY]; 140 }; 141 142 struct winreg_vcbuf { 143 WORD wclen; 144 WORD wcsize; 145 struct winreg_vcs *buf; 146 }; 147 typedef struct winreg_vcbuf winreg_vcbuf_t; 148 149 struct file_time { 150 DWORD low; 151 DWORD high; 152 }; 153 typedef struct file_time file_time_t; 154 155 struct winreg_secdesc { 156 struct winreg_value *sd_buf; 157 DWORD sd_len; 158 DWORD sd_size; 159 }; 160 161 OPERATION(WINREG_OPNUM_OpenHKCR) 162 struct winreg_OpenHKCR { 163 IN DWORD *server; 164 IN DWORD access_mask; 165 OUT winreg_handle_t handle; 166 OUT DWORD status; 167 }; 168 169 OPERATION(WINREG_OPNUM_OpenHKCU) 170 struct winreg_OpenHKCU { 171 IN DWORD *server; 172 IN DWORD access_mask; 173 OUT winreg_handle_t handle; 174 OUT DWORD status; 175 }; 176 177 OPERATION(WINREG_OPNUM_OpenHKLM) 178 struct winreg_OpenHKLM { 179 IN DWORD *server; 180 IN DWORD access_mask; 181 OUT winreg_handle_t handle; 182 OUT DWORD status; 183 }; 184 185 OPERATION(WINREG_OPNUM_OpenHKPD) 186 struct winreg_OpenHKPD { 187 IN DWORD *server; 188 IN DWORD access_mask; 189 OUT winreg_handle_t handle; 190 OUT DWORD status; 191 }; 192 193 OPERATION(WINREG_OPNUM_OpenHKUsers) 194 struct winreg_OpenHKUsers { 195 IN DWORD *server; 196 IN DWORD access_mask; 197 OUT winreg_handle_t handle; 198 OUT DWORD status; 199 }; 200 201 202 OPERATION(WINREG_OPNUM_Close) 203 struct winreg_Close { 204 IN winreg_handle_t handle; 205 OUT winreg_handle_t result_handle; 206 OUT DWORD status; 207 }; 208 209 #define WINREG_ACTION_NONE 0 210 #define WINREG_ACTION_NEW_KEY 1 211 #define WINREG_ACTION_EXISTING_KEY 2 212 213 OPERATION(WINREG_OPNUM_CreateKey) 214 struct winreg_CreateKey { 215 IN winreg_handle_t handle; 216 IN winreg_string_t subkey; 217 IN winreg_string_t keyclass; 218 IN DWORD options; 219 IN DWORD access_mask; 220 IN DWORD *sd; 221 OUT winreg_handle_t result_handle; 222 OUT DWORD *action; 223 OUT DWORD status; 224 }; 225 226 227 OPERATION(WINREG_OPNUM_DeleteKey) 228 struct winreg_DeleteKey { 229 IN winreg_handle_t handle; 230 IN winreg_string_t subkey; 231 OUT DWORD status; 232 }; 233 234 235 OPERATION(WINREG_OPNUM_DeleteValue) 236 struct winreg_DeleteValue { 237 IN winreg_handle_t handle; 238 IN winreg_string_t name; 239 OUT DWORD status; 240 }; 241 242 /* 243 * Some of the OUT parameters are also supplied 244 * as IN parameters but we can ignore them. 245 */ 246 OPERATION(WINREG_OPNUM_EnumKey) 247 struct winreg_EnumKey { 248 IN winreg_handle_t handle; 249 IN DWORD index; 250 IN winreg_string_t name_in; 251 IN winreg_string_t *class_in; 252 OUT winreg_string_t name_out; 253 OUT winreg_string_t *class_out; 254 INOUT file_time_t *change_time; 255 OUT DWORD status; 256 }; 257 258 /* 259 * Some of the OUT parameters are also supplied 260 * as IN parameters but we can ignore them. 261 */ 262 OPERATION(WINREG_OPNUM_EnumValue) 263 struct winreg_EnumValue { 264 IN winreg_handle_t handle; 265 IN DWORD index; 266 /* IN ignore the remaining input data */ 267 268 OUT winreg_vcbuf_t name; 269 OUT DWORD *type; 270 OUT struct winreg_value *value; 271 OUT DWORD *value_size; 272 OUT DWORD *value_size_total; 273 OUT DWORD status; 274 }; 275 276 OPERATION(WINREG_OPNUM_FlushKey) 277 struct winreg_FlushKey { 278 IN winreg_handle_t handle; 279 OUT DWORD status; 280 }; 281 282 OPERATION(WINREG_OPNUM_GetKeySec) 283 struct winreg_GetKeySec { 284 IN winreg_handle_t handle; 285 IN DWORD sec_info; 286 OUT REFERENCE struct winreg_secdesc *sd; 287 OUT DWORD status; 288 }; 289 290 OPERATION(WINREG_OPNUM_NotifyChange) 291 struct winreg_NotifyChange { 292 IN winreg_handle_t handle; 293 IN DWORD watch_subtree; 294 IN DWORD notify_filter; 295 OUT DWORD status; 296 }; 297 298 OPERATION(WINREG_OPNUM_OpenKey) 299 struct winreg_OpenKey { 300 IN winreg_handle_t handle; 301 IN winreg_string_t name; 302 IN DWORD options; 303 IN DWORD access_mask; 304 OUT winreg_handle_t result_handle; 305 OUT DWORD status; 306 }; 307 308 309 OPERATION(WINREG_OPNUM_QueryKey) 310 struct winreg_QueryKey { 311 IN winreg_handle_t handle; 312 INOUT winreg_string_t name; 313 OUT DWORD num_subkeys; 314 OUT DWORD max_subkey_len; 315 OUT DWORD max_class_len; 316 OUT DWORD num_values; 317 OUT DWORD max_value_namelen; 318 OUT DWORD max_value_len; 319 OUT DWORD secdesc_size; 320 OUT file_time_t last_write_time; 321 OUT DWORD status; 322 }; 323 324 325 /* 326 * Some of the OUT parameters are also supplied 327 * as IN parameters but we can ignore them. 328 */ 329 OPERATION(WINREG_OPNUM_QueryValue) 330 struct winreg_QueryValue { 331 IN winreg_handle_t handle; 332 IN winreg_string_t value_name; 333 /* IN ignore the remaining input data */ 334 335 OUT DWORD *type; 336 OUT struct winreg_value *value; 337 OUT DWORD *value_size; 338 OUT DWORD *value_size_total; 339 OUT DWORD status; 340 }; 341 342 343 OPERATION(WINREG_OPNUM_SetKeySec) 344 struct winreg_SetKeySec { 345 IN winreg_handle_t handle; 346 IN DWORD access_mask; 347 IN DWORD sd; 348 OUT DWORD status; 349 }; 350 351 OPERATION(WINREG_OPNUM_CreateValue) 352 struct winreg_CreateValue { 353 IN winreg_handle_t handle; 354 IN winreg_string_t name; 355 IN winreg_string_t class; 356 IN DWORD options; 357 /* IN ignore the remaining input data */ 358 359 OUT DWORD status; 360 }; 361 362 363 /* 364 * The real structure of shutdown passes some strings, a timeout 365 * and reboot/shutdown flags but this allows us to accept the call, 366 * without anything appearing in the log, and return access denied. 367 */ 368 OPERATION(WINREG_OPNUM_Shutdown) 369 struct winreg_Shutdown { 370 IN DWORD ignored; 371 OUT DWORD status; 372 }; 373 374 OPERATION(WINREG_OPNUM_AbortShutdown) 375 struct winreg_AbortShutdown { 376 IN DWORD ignored; 377 OUT DWORD status; 378 }; 379 380 OPERATION(WINREG_OPNUM_GetVersion) 381 struct winreg_GetVersion { 382 IN winreg_handle_t handle; 383 OUT DWORD version; 384 OUT DWORD status; 385 }; 386 387 OPERATION(WINREG_OPNUM_OpenHKCC) 388 struct winreg_OpenHKCC { 389 IN DWORD *server; 390 IN DWORD access_mask; 391 OUT winreg_handle_t handle; 392 OUT DWORD status; 393 }; 394 395 OPERATION(WINREG_OPNUM_OpenHKDD) 396 struct winreg_OpenHKDD { 397 IN DWORD *server; 398 IN DWORD access_mask; 399 OUT winreg_handle_t handle; 400 OUT DWORD status; 401 }; 402 403 OPERATION(WINREG_OPNUM_OpenHKPT) 404 struct winreg_OpenHKPT { 405 IN DWORD *server; 406 IN DWORD access_mask; 407 OUT winreg_handle_t handle; 408 OUT DWORD status; 409 }; 410 411 OPERATION(WINREG_OPNUM_OpenHKPN) 412 struct winreg_OpenHKPN { 413 IN DWORD *server; 414 IN DWORD access_mask; 415 OUT winreg_handle_t handle; 416 OUT DWORD status; 417 }; 418 419 /* 420 * The WINREG interface. 421 */ 422 INTERFACE(0) 423 union winreg_interface { 424 CASE(WINREG_OPNUM_OpenHKCR) 425 struct winreg_OpenHKCR OpenHKCR; 426 CASE(WINREG_OPNUM_OpenHKCU) 427 struct winreg_OpenHKCU OpenHKCU; 428 CASE(WINREG_OPNUM_OpenHKLM) 429 struct winreg_OpenHKLM OpenHKLM; 430 CASE(WINREG_OPNUM_OpenHKPD) 431 struct winreg_OpenHKPD OpenHKPD; 432 CASE(WINREG_OPNUM_OpenHKUsers) 433 struct winreg_OpenHKUsers OpenHKUsers; 434 CASE(WINREG_OPNUM_Close) 435 struct winreg_Close Close; 436 CASE(WINREG_OPNUM_CreateKey) 437 struct winreg_CreateKey CreateKey; 438 CASE(WINREG_OPNUM_DeleteKey) 439 struct winreg_DeleteKey DeleteKey; 440 CASE(WINREG_OPNUM_DeleteValue) 441 struct winreg_DeleteValue DeleteValue; 442 CASE(WINREG_OPNUM_EnumKey) 443 struct winreg_EnumKey EnumKey; 444 CASE(WINREG_OPNUM_EnumValue) 445 struct winreg_EnumValue EnumValue; 446 CASE(WINREG_OPNUM_FlushKey) 447 struct winreg_FlushKey FlushKey; 448 CASE(WINREG_OPNUM_GetKeySec) 449 struct winreg_GetKeySec GetKeySec; 450 CASE(WINREG_OPNUM_NotifyChange) 451 struct winreg_NotifyChange NotifyChange; 452 CASE(WINREG_OPNUM_OpenKey) 453 struct winreg_OpenKey OpenKey; 454 CASE(WINREG_OPNUM_QueryKey) 455 struct winreg_QueryKey QueryKey; 456 CASE(WINREG_OPNUM_QueryValue) 457 struct winreg_QueryValue QueryValue; 458 CASE(WINREG_OPNUM_SetKeySec) 459 struct winreg_SetKeySec SetKeySec; 460 CASE(WINREG_OPNUM_CreateValue) 461 struct winreg_CreateValue CreateValue; 462 CASE(WINREG_OPNUM_Shutdown) 463 struct winreg_Shutdown Shutdown; 464 CASE(WINREG_OPNUM_AbortShutdown) 465 struct winreg_AbortShutdown AbortShutdown; 466 CASE(WINREG_OPNUM_GetVersion) 467 struct winreg_GetVersion GetVersion; 468 CASE(WINREG_OPNUM_OpenHKCC) 469 struct winreg_OpenHKCC OpenHKCC; 470 CASE(WINREG_OPNUM_OpenHKDD) 471 struct winreg_OpenHKDD OpenHKDD; 472 CASE(WINREG_OPNUM_OpenHKPT) 473 struct winreg_OpenHKPT OpenHKPT; 474 CASE(WINREG_OPNUM_OpenHKPN) 475 struct winreg_OpenHKPN OpenHKPN; 476 }; 477 typedef union winreg_interface winreg_interface_t; 478 EXTERNTYPEINFO(winreg_interface) 479 480 #endif /* _MLSVC_WINREG_NDL_ */