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_ */