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