Tcl Source Code

Hex Artifact Content
Login

Artifact e7ae6db38b926c62685cf099e58750aee24bebce:


0000: 2f 2a 0a 20 2a 20 74 63 6c 57 69 6e 52 65 67 2e  /*. * tclWinReg.
0010: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
0020: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
0030: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
0040: 20 6f 66 20 74 68 65 20 22 72 65 67 69 73 74 72   of the "registr
0050: 79 22 20 54 63 6c 20 62 75 69 6c 74 2d 69 6e 0a  y" Tcl built-in.
0060: 20 2a 09 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73   *.command. This
0070: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 75 69 6c   command is buil
0080: 74 20 61 73 20 61 20 64 79 6e 61 6d 69 63 61 6c  t as a dynamical
0090: 6c 79 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65  ly loadable exte
00a0: 6e 73 69 6f 6e 20 69 6e 0a 20 2a 09 61 20 73 65  nsion in. *.a se
00b0: 70 61 72 61 74 65 20 44 4c 4c 2e 0a 20 2a 0a 20  parate DLL.. *. 
00c0: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  * Copyright (c) 
00d0: 31 39 39 37 20 62 79 20 53 75 6e 20 4d 69 63 72  1997 by Sun Micr
00e0: 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63 2e 0a 20  osystems, Inc.. 
00f0: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  * Copyright (c) 
0100: 31 39 39 38 2d 31 39 39 39 20 62 79 20 53 63 72  1998-1999 by Scr
0110: 69 70 74 69 63 73 20 43 6f 72 70 6f 72 61 74 69  iptics Corporati
0120: 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68  on.. *. * See th
0130: 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e  e file "license.
0140: 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72  terms" for infor
0150: 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20  mation on usage 
0160: 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69  and redistributi
0170: 6f 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69  on of. * this fi
0180: 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49  le, and for a DI
0190: 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20  SCLAIMER OF ALL 
01a0: 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a  WARRANTIES.. */.
01b0: 0a 23 75 6e 64 65 66 20 53 54 41 54 49 43 5f 42  .#undef STATIC_B
01c0: 55 49 4c 44 0a 23 69 66 6e 64 65 66 20 55 53 45  UILD.#ifndef USE
01d0: 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 20 20 64  _TCL_STUBS.#   d
01e0: 65 66 69 6e 65 20 55 53 45 5f 54 43 4c 5f 53 54  efine USE_TCL_ST
01f0: 55 42 53 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  UBS.#endif.#incl
0200: 75 64 65 20 22 74 63 6c 49 6e 74 2e 68 22 0a 23  ude "tclInt.h".#
0210: 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 23  ifdef _MSC_VER.#
0220: 20 20 20 70 72 61 67 6d 61 20 63 6f 6d 6d 65 6e     pragma commen
0230: 74 20 28 6c 69 62 2c 20 22 61 64 76 61 70 69 33  t (lib, "advapi3
0240: 32 2e 6c 69 62 22 29 0a 23 65 6e 64 69 66 0a 23  2.lib").#endif.#
0250: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0260: 68 3e 0a 0a 23 69 66 6e 64 65 66 20 55 4e 49 43  h>..#ifndef UNIC
0270: 4f 44 45 0a 23 20 20 20 75 6e 64 65 66 20 54 63  ODE.#   undef Tc
0280: 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 0a  l_WinTCharToUtf.
0290: 23 20 20 20 64 65 66 69 6e 65 20 54 63 6c 5f 57  #   define Tcl_W
02a0: 69 6e 54 43 68 61 72 54 6f 55 74 66 28 61 2c 62  inTCharToUtf(a,b
02b0: 2c 63 29 09 54 63 6c 5f 45 78 74 65 72 6e 61 6c  ,c).Tcl_External
02c0: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
02d0: 4c 2c 61 2c 62 2c 63 29 0a 23 20 20 20 75 6e 64  L,a,b,c).#   und
02e0: 65 66 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54  ef Tcl_WinUtfToT
02f0: 43 68 61 72 0a 23 20 20 20 64 65 66 69 6e 65 20  Char.#   define 
0300: 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54 43 68 61  Tcl_WinUtfToTCha
0310: 72 28 61 2c 62 2c 63 29 09 54 63 6c 5f 55 74 66  r(a,b,c).Tcl_Utf
0320: 54 6f 45 78 74 65 72 6e 61 6c 44 53 74 72 69 6e  ToExternalDStrin
0330: 67 28 4e 55 4c 4c 2c 61 2c 62 2c 63 29 0a 23 65  g(NULL,a,b,c).#e
0340: 6e 64 69 66 20 2f 2a 20 21 55 4e 49 43 4f 44 45  ndif /* !UNICODE
0350: 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 45 6e 73 75 72   */../*. * Ensur
0360: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 61  e that we can sa
0370: 79 20 77 68 69 63 68 20 72 65 67 69 73 74 72 79  y which registry
0380: 20 69 73 20 62 65 69 6e 67 20 61 63 63 65 73 73   is being access
0390: 65 64 2e 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ed.. */..#ifndef
03a0: 20 4b 45 59 5f 57 4f 57 36 34 5f 36 34 4b 45 59   KEY_WOW64_64KEY
03b0: 0a 23 20 20 20 64 65 66 69 6e 65 20 4b 45 59 5f  .#   define KEY_
03c0: 57 4f 57 36 34 5f 36 34 4b 45 59 09 28 30 78 30  WOW64_64KEY.(0x0
03d0: 31 30 30 29 0a 23 65 6e 64 69 66 0a 23 69 66 6e  100).#endif.#ifn
03e0: 64 65 66 20 4b 45 59 5f 57 4f 57 36 34 5f 33 32  def KEY_WOW64_32
03f0: 4b 45 59 0a 23 20 20 20 64 65 66 69 6e 65 20 4b  KEY.#   define K
0400: 45 59 5f 57 4f 57 36 34 5f 33 32 4b 45 59 09 28  EY_WOW64_32KEY.(
0410: 30 78 30 32 30 30 29 0a 23 65 6e 64 69 66 0a 0a  0x0200).#endif..
0420: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
0430: 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 75  m length of a su
0440: 62 2d 6b 65 79 20 6e 61 6d 65 2e 0a 20 2a 2f 0a  b-key name.. */.
0450: 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 4b 45 59  .#ifndef MAX_KEY
0460: 5f 4c 45 4e 47 54 48 0a 23 20 20 20 64 65 66 69  _LENGTH.#   defi
0470: 6e 65 20 4d 41 58 5f 4b 45 59 5f 4c 45 4e 47 54  ne MAX_KEY_LENGT
0480: 48 09 32 35 36 0a 23 65 6e 64 69 66 0a 0a 2f 2a  H.256.#endif../*
0490: 0a 20 2a 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f  . * TCL_STORAGE_
04a0: 43 4c 41 53 53 20 69 73 20 73 65 74 20 75 6e 63  CLASS is set unc
04b0: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 74 6f 20  onditionally to 
04c0: 44 4c 4c 45 58 50 4f 52 54 20 62 65 63 61 75 73  DLLEXPORT becaus
04d0: 65 20 74 68 65 0a 20 2a 20 52 65 67 69 73 74 72  e the. * Registr
04e0: 79 5f 49 6e 69 74 20 64 65 63 6c 61 72 61 74 69  y_Init declarati
04f0: 6f 6e 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75  on is in the sou
0500: 72 63 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2c  rce file itself,
0510: 20 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20   which is only. 
0520: 2a 20 61 63 63 65 73 73 65 64 20 77 68 65 6e 20  * accessed when 
0530: 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20  we are building 
0540: 61 20 6c 69 62 72 61 72 79 2e 0a 20 2a 2f 0a 0a  a library.. */..
0550: 23 75 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41  #undef TCL_STORA
0560: 47 45 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65  GE_CLASS.#define
0570: 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41   TCL_STORAGE_CLA
0580: 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a 0a 2f 2a  SS DLLEXPORT../*
0590: 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  . * The followin
05a0: 67 20 6d 61 63 72 6f 73 20 63 6f 6e 76 65 72 74  g macros convert
05b0: 20 62 65 74 77 65 65 6e 20 64 69 66 66 65 72 65   between differe
05c0: 6e 74 20 65 6e 64 69 61 6e 20 69 6e 74 73 2e 0a  nt endian ints..
05d0: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 53 57 41   */..#define SWA
05e0: 50 57 4f 52 44 28 78 29 09 4d 41 4b 45 57 4f 52  PWORD(x).MAKEWOR
05f0: 44 28 48 49 42 59 54 45 28 78 29 2c 20 4c 4f 42  D(HIBYTE(x), LOB
0600: 59 54 45 28 78 29 29 0a 23 64 65 66 69 6e 65 20  YTE(x)).#define 
0610: 53 57 41 50 4c 4f 4e 47 28 78 29 09 4d 41 4b 45  SWAPLONG(x).MAKE
0620: 4c 4f 4e 47 28 53 57 41 50 57 4f 52 44 28 48 49  LONG(SWAPWORD(HI
0630: 57 4f 52 44 28 78 29 29 2c 20 53 57 41 50 57 4f  WORD(x)), SWAPWO
0640: 52 44 28 4c 4f 57 4f 52 44 28 78 29 29 29 0a 0a  RD(LOWORD(x)))..
0650: 2f 2a 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*. * The follow
0660: 69 6e 67 20 66 6c 61 67 20 69 73 20 75 73 65 64  ing flag is used
0670: 20 69 6e 20 4f 70 65 6e 4b 65 79 73 20 74 6f 20   in OpenKeys to 
0680: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
0690: 65 20 73 70 65 63 69 66 69 65 64 20 6b 65 79 0a  e specified key.
06a0: 20 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 72 65   * should be cre
06b0: 61 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e  ated if it doesn
06c0: 27 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  't currently exi
06d0: 73 74 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  st.. */..#define
06e0: 20 52 45 47 5f 43 52 45 41 54 45 20 31 0a 0a 2f   REG_CREATE 1../
06f0: 2a 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *. * The followi
0700: 6e 67 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69  ng tables contai
0710: 6e 20 74 68 65 20 6d 61 70 70 69 6e 67 20 66 72  n the mapping fr
0720: 6f 6d 20 72 65 67 69 73 74 72 79 20 72 6f 6f 74  om registry root
0730: 20 6e 61 6d 65 73 20 74 6f 20 74 68 65 0a 20 2a   names to the. *
0740: 20 73 79 73 74 65 6d 20 70 72 65 64 65 66 69 6e   system predefin
0750: 65 64 20 6b 65 79 73 2e 0a 20 2a 2f 0a 0a 73 74  ed keys.. */..st
0760: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0770: 2a 63 6f 6e 73 74 20 72 6f 6f 74 4b 65 79 4e 61  *const rootKeyNa
0780: 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 48  mes[] = {.    "H
0790: 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41 43 48 49 4e  KEY_LOCAL_MACHIN
07a0: 45 22 2c 20 22 48 4b 45 59 5f 55 53 45 52 53 22  E", "HKEY_USERS"
07b0: 2c 20 22 48 4b 45 59 5f 43 4c 41 53 53 45 53 5f  , "HKEY_CLASSES_
07c0: 52 4f 4f 54 22 2c 0a 20 20 20 20 22 48 4b 45 59  ROOT",.    "HKEY
07d0: 5f 43 55 52 52 45 4e 54 5f 55 53 45 52 22 2c 20  _CURRENT_USER", 
07e0: 22 48 4b 45 59 5f 43 55 52 52 45 4e 54 5f 43 4f  "HKEY_CURRENT_CO
07f0: 4e 46 49 47 22 2c 0a 20 20 20 20 22 48 4b 45 59  NFIG",.    "HKEY
0800: 5f 50 45 52 46 4f 52 4d 41 4e 43 45 5f 44 41 54  _PERFORMANCE_DAT
0810: 41 22 2c 20 22 48 4b 45 59 5f 44 59 4e 5f 44 41  A", "HKEY_DYN_DA
0820: 54 41 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 0a 73 74  TA", NULL.};..st
0830: 61 74 69 63 20 63 6f 6e 73 74 20 48 4b 45 59 20  atic const HKEY 
0840: 72 6f 6f 74 4b 65 79 73 5b 5d 20 3d 20 7b 0a 20  rootKeys[] = {. 
0850: 20 20 20 48 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41     HKEY_LOCAL_MA
0860: 43 48 49 4e 45 2c 20 48 4b 45 59 5f 55 53 45 52  CHINE, HKEY_USER
0870: 53 2c 20 48 4b 45 59 5f 43 4c 41 53 53 45 53 5f  S, HKEY_CLASSES_
0880: 52 4f 4f 54 2c 20 48 4b 45 59 5f 43 55 52 52 45  ROOT, HKEY_CURRE
0890: 4e 54 5f 55 53 45 52 2c 0a 20 20 20 20 48 4b 45  NT_USER,.    HKE
08a0: 59 5f 43 55 52 52 45 4e 54 5f 43 4f 4e 46 49 47  Y_CURRENT_CONFIG
08b0: 2c 20 48 4b 45 59 5f 50 45 52 46 4f 52 4d 41 4e  , HKEY_PERFORMAN
08c0: 43 45 5f 44 41 54 41 2c 20 48 4b 45 59 5f 44 59  CE_DATA, HKEY_DY
08d0: 4e 5f 44 41 54 41 0a 7d 3b 0a 0a 73 74 61 74 69  N_DATA.};..stati
08e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 52 45 47  c const char REG
08f0: 49 53 54 52 59 5f 41 53 53 4f 43 5f 4b 45 59 5b  ISTRY_ASSOC_KEY[
0900: 5d 20 3d 20 22 72 65 67 69 73 74 72 79 3a 3a 63  ] = "registry::c
0910: 6f 6d 6d 61 6e 64 22 3b 0a 0a 2f 2a 0a 20 2a 20  ommand";../*. * 
0920: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
0930: 62 6c 65 20 6d 61 70 73 20 66 72 6f 6d 20 72 65  ble maps from re
0940: 67 69 73 74 72 79 20 74 79 70 65 73 20 74 6f 20  gistry types to 
0950: 73 74 72 69 6e 67 73 2e 20 4e 6f 74 65 20 74 68  strings. Note th
0960: 61 74 20 74 68 65 0a 20 2a 20 69 6e 64 69 63 65  at the. * indice
0970: 73 20 66 6f 72 20 74 68 69 73 20 61 72 72 61 79  s for this array
0980: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
0990: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 73 20 66   the constants f
09a0: 6f 72 20 74 68 65 20 6b 6e 6f 77 6e 20 72 65 67  or the known reg
09b0: 69 73 74 72 79 0a 20 2a 20 74 79 70 65 73 20 73  istry. * types s
09c0: 6f 20 77 65 20 64 6f 6e 27 74 20 6e 65 65 64 20  o we don't need 
09d0: 61 20 73 65 70 61 72 61 74 65 20 74 61 62 6c 65  a separate table
09e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 70   to hold the map
09f0: 70 69 6e 67 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69  ping.. */..stati
0a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
0a10: 6e 73 74 20 74 79 70 65 4e 61 6d 65 73 5b 5d 20  nst typeNames[] 
0a20: 3d 20 7b 0a 20 20 20 20 22 6e 6f 6e 65 22 2c 20  = {.    "none", 
0a30: 22 73 7a 22 2c 20 22 65 78 70 61 6e 64 5f 73 7a  "sz", "expand_sz
0a40: 22 2c 20 22 62 69 6e 61 72 79 22 2c 20 22 64 77  ", "binary", "dw
0a50: 6f 72 64 22 2c 0a 20 20 20 20 22 64 77 6f 72 64  ord",.    "dword
0a60: 5f 62 69 67 5f 65 6e 64 69 61 6e 22 2c 20 22 6c  _big_endian", "l
0a70: 69 6e 6b 22 2c 20 22 6d 75 6c 74 69 5f 73 7a 22  ink", "multi_sz"
0a80: 2c 20 22 72 65 73 6f 75 72 63 65 5f 6c 69 73 74  , "resource_list
0a90: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 0a 73 74 61 74  ", NULL.};..stat
0aa0: 69 63 20 44 57 4f 52 44 20 6c 61 73 74 54 79 70  ic DWORD lastTyp
0ab0: 65 20 3d 20 52 45 47 5f 52 45 53 4f 55 52 43 45  e = REG_RESOURCE
0ac0: 5f 4c 49 53 54 3b 0a 0a 2f 2a 0a 20 2a 20 44 65  _LIST;../*. * De
0ad0: 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 66  clarations for f
0ae0: 75 6e 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64  unctions defined
0af0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 20   in this file.. 
0b00: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 09  */..static void.
0b10: 09 41 70 70 65 6e 64 53 79 73 74 65 6d 45 72 72  .AppendSystemErr
0b20: 6f 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  or(Tcl_Interp *i
0b30: 6e 74 65 72 70 2c 20 44 57 4f 52 44 20 65 72 72  nterp, DWORD err
0b40: 6f 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09  or);.static int.
0b50: 09 42 72 6f 61 64 63 61 73 74 56 61 6c 75 65 28  .BroadcastValue(
0b60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0b70: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 0a 09 09  rp, int objc,...
0b80: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
0b90: 6e 73 74 20 6f 62 6a 76 5b 5d 29 3b 0a 73 74 61  nst objv[]);.sta
0ba0: 74 69 63 20 44 57 4f 52 44 09 09 43 6f 6e 76 65  tic DWORD..Conve
0bb0: 72 74 44 57 4f 52 44 28 44 57 4f 52 44 20 74 79  rtDWORD(DWORD ty
0bc0: 70 65 2c 20 44 57 4f 52 44 20 76 61 6c 75 65 29  pe, DWORD value)
0bd0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 44  ;.static void..D
0be0: 65 6c 65 74 65 43 6d 64 28 43 6c 69 65 6e 74 44  eleteCmd(ClientD
0bf0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 3b  ata clientData);
0c00: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 44 65 6c  .static int..Del
0c10: 65 74 65 4b 65 79 28 54 63 6c 5f 49 6e 74 65 72  eteKey(Tcl_Inter
0c20: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
0c30: 62 6a 20 2a 6b 65 79 4e 61 6d 65 4f 62 6a 2c 0a  bj *keyNameObj,.
0c40: 09 09 09 20 20 20 20 52 45 47 53 41 4d 20 6d 6f  ...    REGSAM mo
0c50: 64 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09  de);.static int.
0c60: 09 44 65 6c 65 74 65 56 61 6c 75 65 28 54 63 6c  .DeleteValue(Tcl
0c70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0c80: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61 6d   Tcl_Obj *keyNam
0c90: 65 4f 62 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c  eObj,....    Tcl
0ca0: 5f 4f 62 6a 20 2a 76 61 6c 75 65 4e 61 6d 65 4f  _Obj *valueNameO
0cb0: 62 6a 2c 20 52 45 47 53 41 4d 20 6d 6f 64 65 29  bj, REGSAM mode)
0cc0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 47 65  ;.static int..Ge
0cd0: 74 4b 65 79 4e 61 6d 65 73 28 54 63 6c 5f 49 6e  tKeyNames(Tcl_In
0ce0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
0cf0: 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61 6d 65 4f 62  l_Obj *keyNameOb
0d00: 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f 62  j,....    Tcl_Ob
0d10: 6a 20 2a 70 61 74 74 65 72 6e 4f 62 6a 2c 20 52  j *patternObj, R
0d20: 45 47 53 41 4d 20 6d 6f 64 65 29 3b 0a 73 74 61  EGSAM mode);.sta
0d30: 74 69 63 20 69 6e 74 09 09 47 65 74 54 79 70 65  tic int..GetType
0d40: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
0d50: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65  erp, Tcl_Obj *ke
0d60: 79 4e 61 6d 65 4f 62 6a 2c 0a 09 09 09 20 20 20  yNameObj,....   
0d70: 20 54 63 6c 5f 4f 62 6a 20 2a 76 61 6c 75 65 4e   Tcl_Obj *valueN
0d80: 61 6d 65 4f 62 6a 2c 20 52 45 47 53 41 4d 20 6d  ameObj, REGSAM m
0d90: 6f 64 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ode);.static int
0da0: 09 09 47 65 74 56 61 6c 75 65 28 54 63 6c 5f 49  ..GetValue(Tcl_I
0db0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
0dc0: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61 6d 65 4f  cl_Obj *keyNameO
0dd0: 62 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f  bj,....    Tcl_O
0de0: 62 6a 20 2a 76 61 6c 75 65 4e 61 6d 65 4f 62 6a  bj *valueNameObj
0df0: 2c 20 52 45 47 53 41 4d 20 6d 6f 64 65 29 3b 0a  , REGSAM mode);.
0e00: 73 74 61 74 69 63 20 69 6e 74 09 09 47 65 74 56  static int..GetV
0e10: 61 6c 75 65 4e 61 6d 65 73 28 54 63 6c 5f 49 6e  alueNames(Tcl_In
0e20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
0e30: 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61 6d 65 4f 62  l_Obj *keyNameOb
0e40: 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f 62  j,....    Tcl_Ob
0e50: 6a 20 2a 70 61 74 74 65 72 6e 4f 62 6a 2c 20 52  j *patternObj, R
0e60: 45 47 53 41 4d 20 6d 6f 64 65 29 3b 0a 73 74 61  EGSAM mode);.sta
0e70: 74 69 63 20 69 6e 74 09 09 4f 70 65 6e 4b 65 79  tic int..OpenKey
0e80: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
0e90: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65  erp, Tcl_Obj *ke
0ea0: 79 4e 61 6d 65 4f 62 6a 2c 0a 09 09 09 20 20 20  yNameObj,....   
0eb0: 20 52 45 47 53 41 4d 20 6d 6f 64 65 2c 20 69 6e   REGSAM mode, in
0ec0: 74 20 66 6c 61 67 73 2c 20 48 4b 45 59 20 2a 6b  t flags, HKEY *k
0ed0: 65 79 50 74 72 29 3b 0a 73 74 61 74 69 63 20 44  eyPtr);.static D
0ee0: 57 4f 52 44 09 09 4f 70 65 6e 53 75 62 4b 65 79  WORD..OpenSubKey
0ef0: 28 63 68 61 72 20 2a 68 6f 73 74 4e 61 6d 65 2c  (char *hostName,
0f00: 20 48 4b 45 59 20 72 6f 6f 74 4b 65 79 2c 0a 09   HKEY rootKey,..
0f10: 09 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 4e  ..    char *keyN
0f20: 61 6d 65 2c 20 52 45 47 53 41 4d 20 6d 6f 64 65  ame, REGSAM mode
0f30: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 0a 09 09 09  , int flags,....
0f40: 20 20 20 20 48 4b 45 59 20 2a 6b 65 79 50 74 72      HKEY *keyPtr
0f50: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 50  );.static int..P
0f60: 61 72 73 65 4b 65 79 4e 61 6d 65 28 54 63 6c 5f  arseKeyName(Tcl_
0f70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0f80: 63 68 61 72 20 2a 6e 61 6d 65 2c 0a 09 09 09 20  char *name,.... 
0f90: 20 20 20 63 68 61 72 20 2a 2a 68 6f 73 74 4e 61     char **hostNa
0fa0: 6d 65 50 74 72 2c 20 48 4b 45 59 20 2a 72 6f 6f  mePtr, HKEY *roo
0fb0: 74 4b 65 79 50 74 72 2c 0a 09 09 09 20 20 20 20  tKeyPtr,....    
0fc0: 63 68 61 72 20 2a 2a 6b 65 79 4e 61 6d 65 50 74  char **keyNamePt
0fd0: 72 29 3b 0a 73 74 61 74 69 63 20 44 57 4f 52 44  r);.static DWORD
0fe0: 09 09 52 65 63 75 72 73 69 76 65 44 65 6c 65 74  ..RecursiveDelet
0ff0: 65 4b 65 79 28 48 4b 45 59 20 68 53 74 61 72 74  eKey(HKEY hStart
1000: 4b 65 79 2c 0a 09 09 09 20 20 20 20 63 6f 6e 73  Key,....    cons
1010: 74 20 54 43 48 41 52 20 2a 20 70 4b 65 79 4e 61  t TCHAR * pKeyNa
1020: 6d 65 2c 20 52 45 47 53 41 4d 20 6d 6f 64 65 29  me, REGSAM mode)
1030: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 52 65  ;.static int..Re
1040: 67 69 73 74 72 79 4f 62 6a 43 6d 64 28 43 6c 69  gistryObjCmd(Cli
1050: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
1060: 74 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 49  ta,....    Tcl_I
1070: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1080: 6e 74 20 6f 62 6a 63 2c 0a 09 09 09 20 20 20 20  nt objc,....    
1090: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
10a0: 62 6a 76 5b 5d 29 3b 0a 73 74 61 74 69 63 20 69  bjv[]);.static i
10b0: 6e 74 09 09 53 65 74 56 61 6c 75 65 28 54 63 6c  nt..SetValue(Tcl
10c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10d0: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61 6d   Tcl_Obj *keyNam
10e0: 65 4f 62 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c  eObj,....    Tcl
10f0: 5f 4f 62 6a 20 2a 76 61 6c 75 65 4e 61 6d 65 4f  _Obj *valueNameO
1100: 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74  bj, Tcl_Obj *dat
1110: 61 4f 62 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c  aObj,....    Tcl
1120: 5f 4f 62 6a 20 2a 74 79 70 65 4f 62 6a 2c 20 52  _Obj *typeObj, R
1130: 45 47 53 41 4d 20 6d 6f 64 65 29 3b 0a 0a 45 58  EGSAM mode);..EX
1140: 54 45 52 4e 20 69 6e 74 09 09 52 65 67 69 73 74  TERN int..Regist
1150: 72 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ry_Init(Tcl_Inte
1160: 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 45 58 54  rp *interp);.EXT
1170: 45 52 4e 20 69 6e 74 09 09 52 65 67 69 73 74 72  ERN int..Registr
1180: 79 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  y_Unload(Tcl_Int
1190: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
11a0: 20 66 6c 61 67 73 29 3b 0a 0c 0a 2f 2a 0a 20 2a   flags);.../*. *
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 67  ------. *. * Reg
1200: 69 73 74 72 79 5f 49 6e 69 74 20 2d 2d 0a 20 2a  istry_Init --. *
1210: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
1220: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  n initializes th
1230: 65 20 72 65 67 69 73 74 72 79 20 63 6f 6d 6d 61  e registry comma
1240: 6e 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nd.. *. * Result
1250: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
1260: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
1270: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
1280: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 52  -----. */..int.R
12e0: 65 67 69 73 74 72 79 5f 49 6e 69 74 28 0a 20 20  egistry_Init(.  
12f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1300: 74 65 72 70 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  terp).{.    Tcl_
1310: 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 0a 20 20  Command cmd;..  
1320: 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74    if (Tcl_InitSt
1330: 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 35  ubs(interp, "8.5
1340: 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ", 0) == NULL) {
1350: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1360: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
1370: 6d 64 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 4f  md = Tcl_CreateO
1380: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
1390: 2c 20 22 72 65 67 69 73 74 72 79 22 2c 20 52 65  , "registry", Re
13a0: 67 69 73 74 72 79 4f 62 6a 43 6d 64 2c 0a 09 20  gistryObjCmd,.. 
13b0: 20 20 20 69 6e 74 65 72 70 2c 20 44 65 6c 65 74     interp, Delet
13c0: 65 43 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 53  eCmd);.    Tcl_S
13d0: 65 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65  etAssocData(inte
13e0: 72 70 2c 20 52 45 47 49 53 54 52 59 5f 41 53 53  rp, REGISTRY_ASS
13f0: 4f 43 5f 4b 45 59 2c 20 4e 55 4c 4c 2c 20 63 6d  OC_KEY, NULL, cm
1400: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  d);.    return T
1410: 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
1420: 74 65 72 70 2c 20 22 72 65 67 69 73 74 72 79 22  terp, "registry"
1430: 2c 20 22 31 2e 33 2e 30 22 29 3b 0a 7d 0a 0c 0a  , "1.3.0");.}...
1440: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
1490: 2a 20 52 65 67 69 73 74 72 79 5f 55 6e 6c 6f 61  * Registry_Unloa
14a0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
14b0: 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65 73  function removes
14c0: 20 74 68 65 20 72 65 67 69 73 74 72 79 20 63 6f   the registry co
14d0: 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  mmand.. *. * Res
14e0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
14f0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
1500: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1510: 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 67 69 73  ts:. *.The regis
1520: 74 72 79 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  try command is d
1530: 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65 20 64  eleted and the d
1540: 6c 6c 20 6d 61 79 20 62 65 20 75 6e 6c 6f 61 64  ll may be unload
1550: 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ed.. *. *-------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15a0: 20 2a 2f 0a 0a 69 6e 74 0a 52 65 67 69 73 74 72   */..int.Registr
15b0: 79 5f 55 6e 6c 6f 61 64 28 0a 20 20 20 20 54 63  y_Unload(.    Tc
15c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15d0: 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65  ,../* Interprete
15e0: 72 20 66 6f 72 20 75 6e 6c 6f 61 64 69 6e 67 20  r for unloading 
15f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
1600: 29 09 09 09 2f 2a 20 46 6c 61 67 73 20 70 61 73  ).../* Flags pas
1610: 73 65 64 20 62 79 20 74 68 65 20 75 6e 6c 6f 61  sed by the unloa
1620: 64 20 73 79 73 74 65 6d 20 2a 2f 0a 7b 0a 20 20  d system */.{.  
1630: 20 20 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 63 6d    Tcl_Command cm
1640: 64 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  d;.    Tcl_Obj *
1650: 6f 62 6a 76 5b 33 5d 3b 0a 0a 20 20 20 20 2f 2a  objv[3];..    /*
1660: 0a 20 20 20 20 20 2a 20 55 6e 72 65 67 69 73 74  .     * Unregist
1670: 65 72 20 74 68 65 20 72 65 67 69 73 74 72 79 20  er the registry 
1680: 70 61 63 6b 61 67 65 2e 20 54 68 65 72 65 20 69  package. There i
1690: 73 20 6e 6f 20 54 63 6c 5f 50 6b 67 46 6f 72 67  s no Tcl_PkgForg
16a0: 65 74 28 29 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  et().     */..  
16b0: 20 20 6f 62 6a 76 5b 30 5d 20 3d 20 54 63 6c 5f    objv[0] = Tcl_
16c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61  NewStringObj("pa
16d0: 63 6b 61 67 65 22 2c 20 2d 31 29 3b 0a 20 20 20  ckage", -1);.   
16e0: 20 6f 62 6a 76 5b 31 5d 20 3d 20 54 63 6c 5f 4e   objv[1] = Tcl_N
16f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 6f 72  ewStringObj("for
1700: 67 65 74 22 2c 20 2d 31 29 3b 0a 20 20 20 20 6f  get", -1);.    o
1710: 62 6a 76 5b 32 5d 20 3d 20 54 63 6c 5f 4e 65 77  bjv[2] = Tcl_New
1720: 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 67 69 73  StringObj("regis
1730: 74 72 79 22 2c 20 2d 31 29 3b 0a 20 20 20 20 54  try", -1);.    T
1740: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65  cl_EvalObjv(inte
1750: 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 54 43 4c  rp, 3, objv, TCL
1760: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 0a  _EVAL_GLOBAL);..
1770: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 65      /*.     * De
1780: 6c 65 74 65 20 74 68 65 20 6f 72 69 67 69 6e 61  lete the origina
1790: 6c 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 63  lly registered c
17a0: 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 2a 2f 0a  ommand..     */.
17b0: 0a 20 20 20 20 63 6d 64 20 3d 20 54 63 6c 5f 47  .    cmd = Tcl_G
17c0: 65 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65  etAssocData(inte
17d0: 72 70 2c 20 52 45 47 49 53 54 52 59 5f 41 53 53  rp, REGISTRY_ASS
17e0: 4f 43 5f 4b 45 59 2c 20 4e 55 4c 4c 29 3b 0a 20  OC_KEY, NULL);. 
17f0: 20 20 20 69 66 20 28 63 6d 64 20 21 3d 20 4e 55     if (cmd != NU
1800: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
1810: 65 43 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65  eCommandFromToke
1820: 6e 28 69 6e 74 65 72 70 2c 20 63 6d 64 29 3b 0a  n(interp, cmd);.
1830: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
1840: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
1850: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
18a0: 44 65 6c 65 74 65 43 6d 64 20 2d 2d 0a 20 2a 0a  DeleteCmd --. *.
18b0: 20 2a 09 43 6c 65 61 6e 75 70 20 74 68 65 20 69   *.Cleanup the i
18c0: 6e 74 65 72 70 20 63 6f 6d 6d 61 6e 64 20 74 6f  nterp command to
18d0: 6b 65 6e 20 73 6f 20 74 68 61 74 20 75 6e 6c 6f  ken so that unlo
18e0: 61 64 69 6e 67 20 64 6f 65 73 6e 27 74 20 74 72  ading doesn't tr
18f0: 79 20 74 6f 0a 20 2a 09 72 65 2d 64 65 6c 65 74  y to. *.re-delet
1900: 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 28 77  e the command (w
1910: 68 69 63 68 20 77 69 6c 6c 20 63 72 61 73 68 29  hich will crash)
1920: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
1930: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
1940: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
1950: 09 54 68 65 20 75 6e 6c 6f 61 64 20 63 6f 6d 6d  .The unload comm
1960: 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74  and will not att
1970: 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74  empt to delete t
1980: 68 69 73 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a  his command.. *.
1990: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
19e0: 61 74 69 63 20 76 6f 69 64 0a 44 65 6c 65 74 65  atic void.Delete
19f0: 43 6d 64 28 0a 20 20 20 20 43 6c 69 65 6e 74 44  Cmd(.    ClientD
1a00: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 0a  ata clientData).
1a10: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
1a20: 20 2a 69 6e 74 65 72 70 20 3d 20 63 6c 69 65 6e   *interp = clien
1a30: 74 44 61 74 61 3b 0a 0a 20 20 20 20 54 63 6c 5f  tData;..    Tcl_
1a40: 53 65 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74  SetAssocData(int
1a50: 65 72 70 2c 20 52 45 47 49 53 54 52 59 5f 41 53  erp, REGISTRY_AS
1a60: 53 4f 43 5f 4b 45 59 2c 20 4e 55 4c 4c 2c 20 4e  SOC_KEY, NULL, N
1a70: 55 4c 4c 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  ULL);.}.../*. *-
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 67 69  -----. *. * Regi
1ad0: 73 74 72 79 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  stryObjCmd --. *
1ae0: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
1af0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  n implements the
1b00: 20 54 63 6c 20 22 72 65 67 69 73 74 72 79 22 20   Tcl "registry" 
1b10: 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 52  command.. *. * R
1b20: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
1b30: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
1b40: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
1b50: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
1b60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
1bb0: 73 74 61 74 69 63 20 69 6e 74 0a 52 65 67 69 73  static int.Regis
1bc0: 74 72 79 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43  tryObjCmd(.    C
1bd0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1be0: 44 61 74 61 2c 09 2f 2a 20 4e 6f 74 20 75 73 65  Data,./* Not use
1bf0: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  d. */.    Tcl_In
1c00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
1c10: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
1c20: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e  reter. */.    in
1c30: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d  t objc,.../* Num
1c40: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1c50: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
1c60: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09   *const objv[]).
1c70: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 76 61 6c 75  /* Argument valu
1c80: 65 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74  es. */.{.    int
1c90: 20 6e 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20   n = 1;.    int 
1ca0: 69 6e 64 65 78 2c 20 61 72 67 63 3b 0a 20 20 20  index, argc;.   
1cb0: 20 52 45 47 53 41 4d 20 6d 6f 64 65 20 3d 20 30   REGSAM mode = 0
1cc0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1cd0: 20 2a 65 72 72 53 74 72 69 6e 67 20 3d 20 4e 55   *errString = NU
1ce0: 4c 4c 3b 0a 0a 20 20 20 20 73 74 61 74 69 63 20  LL;..    static 
1cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
1d00: 74 20 73 75 62 63 6f 6d 6d 61 6e 64 73 5b 5d 20  t subcommands[] 
1d10: 3d 20 7b 0a 09 22 62 72 6f 61 64 63 61 73 74 22  = {.."broadcast"
1d20: 2c 20 22 64 65 6c 65 74 65 22 2c 20 22 67 65 74  , "delete", "get
1d30: 22 2c 20 22 6b 65 79 73 22 2c 20 22 73 65 74 22  ", "keys", "set"
1d40: 2c 20 22 74 79 70 65 22 2c 20 22 76 61 6c 75 65  , "type", "value
1d50: 73 22 2c 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a  s", NULL.    };.
1d60: 20 20 20 20 65 6e 75 6d 20 53 75 62 43 6d 64 49      enum SubCmdI
1d70: 64 78 20 7b 0a 09 42 72 6f 61 64 63 61 73 74 49  dx {..BroadcastI
1d80: 64 78 2c 20 44 65 6c 65 74 65 49 64 78 2c 20 47  dx, DeleteIdx, G
1d90: 65 74 49 64 78 2c 20 4b 65 79 73 49 64 78 2c 20  etIdx, KeysIdx, 
1da0: 53 65 74 49 64 78 2c 20 54 79 70 65 49 64 78 2c  SetIdx, TypeIdx,
1db0: 20 56 61 6c 75 65 73 49 64 78 0a 20 20 20 20 7d   ValuesIdx.    }
1dc0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1dd0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 6d  st char *const m
1de0: 6f 64 65 73 5b 5d 20 3d 20 7b 0a 09 22 2d 33 32  odes[] = {.."-32
1df0: 62 69 74 22 2c 20 22 2d 36 34 62 69 74 22 2c 20  bit", "-64bit", 
1e00: 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 0a 20 20 20  NULL.    };..   
1e10: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b   if (objc < 2) {
1e20: 0a 20 20 20 20 77 72 6f 6e 67 41 72 67 73 3a 0a  .    wrongArgs:.
1e30: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
1e40: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1e50: 76 2c 20 22 3f 2d 33 32 62 69 74 7c 2d 36 34 62  v, "?-32bit|-64b
1e60: 69 74 3f 20 6f 70 74 69 6f 6e 20 3f 61 72 67 20  it? option ?arg 
1e70: 2e 2e 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ...?");..return 
1e80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1e90: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ..    if (Tcl_Ge
1ea0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6e 5d 29  tString(objv[n])
1eb0: 5b 30 5d 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 69  [0] == '-') {..i
1ec0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
1ed0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1ee0: 62 6a 76 5b 6e 2b 2b 5d 2c 20 6d 6f 64 65 73 2c  bjv[n++], modes,
1ef0: 20 22 6d 6f 64 65 22 2c 20 30 2c 0a 09 09 26 69   "mode", 0,...&i
1f00: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ndex) != TCL_OK)
1f10: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54   {..    return T
1f20: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73 77  CL_ERROR;..}..sw
1f30: 69 74 63 68 20 28 69 6e 64 65 78 29 20 7b 0a 09  itch (index) {..
1f40: 63 61 73 65 20 30 3a 09 09 09 2f 2a 20 2d 33 32  case 0:.../* -32
1f50: 62 69 74 20 2a 2f 0a 09 20 20 20 20 6d 6f 64 65  bit */..    mode
1f60: 20 7c 3d 20 4b 45 59 5f 57 4f 57 36 34 5f 33 32   |= KEY_WOW64_32
1f70: 4b 45 59 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  KEY;..    break;
1f80: 0a 09 63 61 73 65 20 31 3a 09 09 09 2f 2a 20 2d  ..case 1:.../* -
1f90: 36 34 62 69 74 20 2a 2f 0a 09 20 20 20 20 6d 6f  64bit */..    mo
1fa0: 64 65 20 7c 3d 20 4b 45 59 5f 57 4f 57 36 34 5f  de |= KEY_WOW64_
1fb0: 36 34 4b 45 59 3b 0a 09 20 20 20 20 62 72 65 61  64KEY;..    brea
1fc0: 6b 3b 0a 09 7d 0a 09 69 66 20 28 6f 62 6a 63 20  k;..}..if (objc 
1fd0: 3c 20 33 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f  < 3) {..    goto
1fe0: 20 77 72 6f 6e 67 41 72 67 73 3b 0a 09 7d 0a 20   wrongArgs;..}. 
1ff0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
2000: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
2010: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6e  j(interp, objv[n
2020: 2b 2b 5d 2c 20 73 75 62 63 6f 6d 6d 61 6e 64 73  ++], subcommands
2030: 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 0a 09  , "option", 0,..
2040: 20 20 20 20 26 69 6e 64 65 78 29 20 21 3d 20 54      &index) != T
2050: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
2060: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2070: 7d 0a 0a 20 20 20 20 61 72 67 63 20 3d 20 28 6f  }..    argc = (o
2080: 62 6a 63 20 2d 20 6e 29 3b 0a 20 20 20 20 73 77  bjc - n);.    sw
2090: 69 74 63 68 20 28 69 6e 64 65 78 29 20 7b 0a 20  itch (index) {. 
20a0: 20 20 20 63 61 73 65 20 42 72 6f 61 64 63 61 73     case Broadcas
20b0: 74 49 64 78 3a 09 09 2f 2a 20 62 72 6f 61 64 63  tIdx:../* broadc
20c0: 61 73 74 20 2a 2f 0a 09 69 66 20 28 61 72 67 63  ast */..if (argc
20d0: 20 3d 3d 20 31 20 7c 7c 20 61 72 67 63 20 3d 3d   == 1 || argc ==
20e0: 20 33 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 72   3) {..    int r
20f0: 65 73 20 3d 20 42 72 6f 61 64 63 61 73 74 56 61  es = BroadcastVa
2100: 6c 75 65 28 69 6e 74 65 72 70 2c 20 61 72 67 63  lue(interp, argc
2110: 2c 20 6f 62 6a 76 20 2b 20 6e 29 3b 0a 0a 09 20  , objv + n);... 
2120: 20 20 20 69 66 20 28 72 65 73 20 21 3d 20 54 43     if (res != TC
2130: 4c 5f 42 52 45 41 4b 29 20 7b 0a 09 09 72 65 74  L_BREAK) {...ret
2140: 75 72 6e 20 72 65 73 3b 0a 09 20 20 20 20 7d 0a  urn res;..    }.
2150: 09 7d 0a 09 65 72 72 53 74 72 69 6e 67 20 3d 20  .}..errString = 
2160: 22 6b 65 79 4e 61 6d 65 20 3f 2d 74 69 6d 65 6f  "keyName ?-timeo
2170: 75 74 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 3f  ut milliseconds?
2180: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
2190: 61 73 65 20 44 65 6c 65 74 65 49 64 78 3a 09 09  ase DeleteIdx:..
21a0: 2f 2a 20 64 65 6c 65 74 65 20 2a 2f 0a 09 69 66  /* delete */..if
21b0: 20 28 61 72 67 63 20 3d 3d 20 31 29 20 7b 0a 09   (argc == 1) {..
21c0: 20 20 20 20 72 65 74 75 72 6e 20 44 65 6c 65 74      return Delet
21d0: 65 4b 65 79 28 69 6e 74 65 72 70 2c 20 6f 62 6a  eKey(interp, obj
21e0: 76 5b 6e 5d 2c 20 6d 6f 64 65 29 3b 0a 09 7d 20  v[n], mode);..} 
21f0: 65 6c 73 65 20 69 66 20 28 61 72 67 63 20 3d 3d  else if (argc ==
2200: 20 32 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72   2) {..    retur
2210: 6e 20 44 65 6c 65 74 65 56 61 6c 75 65 28 69 6e  n DeleteValue(in
2220: 74 65 72 70 2c 20 6f 62 6a 76 5b 6e 5d 2c 20 6f  terp, objv[n], o
2230: 62 6a 76 5b 6e 2b 31 5d 2c 20 6d 6f 64 65 29 3b  bjv[n+1], mode);
2240: 0a 09 7d 0a 09 65 72 72 53 74 72 69 6e 67 20 3d  ..}..errString =
2250: 20 22 6b 65 79 4e 61 6d 65 20 3f 76 61 6c 75 65   "keyName ?value
2260: 4e 61 6d 65 3f 22 3b 0a 09 62 72 65 61 6b 3b 0a  Name?";..break;.
2270: 20 20 20 20 63 61 73 65 20 47 65 74 49 64 78 3a      case GetIdx:
2280: 09 09 2f 2a 20 67 65 74 20 2a 2f 0a 09 69 66 20  ../* get */..if 
2290: 28 61 72 67 63 20 3d 3d 20 32 29 20 7b 0a 09 20  (argc == 2) {.. 
22a0: 20 20 20 72 65 74 75 72 6e 20 47 65 74 56 61 6c     return GetVal
22b0: 75 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  ue(interp, objv[
22c0: 6e 5d 2c 20 6f 62 6a 76 5b 6e 2b 31 5d 2c 20 6d  n], objv[n+1], m
22d0: 6f 64 65 29 3b 0a 09 7d 0a 09 65 72 72 53 74 72  ode);..}..errStr
22e0: 69 6e 67 20 3d 20 22 6b 65 79 4e 61 6d 65 20 76  ing = "keyName v
22f0: 61 6c 75 65 4e 61 6d 65 22 3b 0a 09 62 72 65 61  alueName";..brea
2300: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4b 65 79 73  k;.    case Keys
2310: 49 64 78 3a 09 09 2f 2a 20 6b 65 79 73 20 2a 2f  Idx:../* keys */
2320: 0a 09 69 66 20 28 61 72 67 63 20 3d 3d 20 31 29  ..if (argc == 1)
2330: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 47   {..    return G
2340: 65 74 4b 65 79 4e 61 6d 65 73 28 69 6e 74 65 72  etKeyNames(inter
2350: 70 2c 20 6f 62 6a 76 5b 6e 5d 2c 20 4e 55 4c 4c  p, objv[n], NULL
2360: 2c 20 6d 6f 64 65 29 3b 0a 09 7d 20 65 6c 73 65  , mode);..} else
2370: 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29 20   if (argc == 2) 
2380: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 47 65  {..    return Ge
2390: 74 4b 65 79 4e 61 6d 65 73 28 69 6e 74 65 72 70  tKeyNames(interp
23a0: 2c 20 6f 62 6a 76 5b 6e 5d 2c 20 6f 62 6a 76 5b  , objv[n], objv[
23b0: 6e 2b 31 5d 2c 20 6d 6f 64 65 29 3b 0a 09 7d 0a  n+1], mode);..}.
23c0: 09 65 72 72 53 74 72 69 6e 67 20 3d 20 22 6b 65  .errString = "ke
23d0: 79 4e 61 6d 65 20 3f 70 61 74 74 65 72 6e 3f 22  yName ?pattern?"
23e0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
23f0: 73 65 20 53 65 74 49 64 78 3a 09 09 2f 2a 20 73  se SetIdx:../* s
2400: 65 74 20 2a 2f 0a 09 69 66 20 28 61 72 67 63 20  et */..if (argc 
2410: 3d 3d 20 31 29 20 7b 0a 09 20 20 20 20 48 4b 45  == 1) {..    HKE
2420: 59 20 6b 65 79 3b 0a 0a 09 20 20 20 20 2f 2a 0a  Y key;...    /*.
2430: 09 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 74  .     * Create t
2440: 68 65 20 6b 65 79 20 61 6e 64 20 74 68 65 6e 20  he key and then 
2450: 63 6c 6f 73 65 20 69 74 20 69 6d 6d 65 64 69 61  close it immedia
2460: 74 65 6c 79 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  tely...     */..
2470: 09 20 20 20 20 6d 6f 64 65 20 7c 3d 20 4b 45 59  .    mode |= KEY
2480: 5f 41 4c 4c 5f 41 43 43 45 53 53 3b 0a 09 20 20  _ALL_ACCESS;..  
2490: 20 20 69 66 20 28 4f 70 65 6e 4b 65 79 28 69 6e    if (OpenKey(in
24a0: 74 65 72 70 2c 20 6f 62 6a 76 5b 6e 5d 2c 20 6d  terp, objv[n], m
24b0: 6f 64 65 2c 20 31 2c 20 26 6b 65 79 29 20 21 3d  ode, 1, &key) !=
24c0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74   TCL_OK) {...ret
24d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
24e0: 20 20 20 20 7d 0a 09 20 20 20 20 52 65 67 43 6c      }..    RegCl
24f0: 6f 73 65 4b 65 79 28 6b 65 79 29 3b 0a 09 20 20  oseKey(key);..  
2500: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2510: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 61 72 67  ..} else if (arg
2520: 63 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20 72  c == 3) {..    r
2530: 65 74 75 72 6e 20 53 65 74 56 61 6c 75 65 28 69  eturn SetValue(i
2540: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6e 5d 2c 20  nterp, objv[n], 
2550: 6f 62 6a 76 5b 6e 2b 31 5d 2c 20 6f 62 6a 76 5b  objv[n+1], objv[
2560: 6e 2b 32 5d 2c 20 4e 55 4c 4c 2c 0a 09 09 20 20  n+2], NULL,...  
2570: 20 20 6d 6f 64 65 29 3b 0a 09 7d 20 65 6c 73 65    mode);..} else
2580: 20 69 66 20 28 61 72 67 63 20 3d 3d 20 34 29 20   if (argc == 4) 
2590: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 53 65  {..    return Se
25a0: 74 56 61 6c 75 65 28 69 6e 74 65 72 70 2c 20 6f  tValue(interp, o
25b0: 62 6a 76 5b 6e 5d 2c 20 6f 62 6a 76 5b 6e 2b 31  bjv[n], objv[n+1
25c0: 5d 2c 20 6f 62 6a 76 5b 6e 2b 32 5d 2c 20 6f 62  ], objv[n+2], ob
25d0: 6a 76 5b 6e 2b 33 5d 2c 0a 09 09 20 20 20 20 6d  jv[n+3],...    m
25e0: 6f 64 65 29 3b 0a 09 7d 0a 09 65 72 72 53 74 72  ode);..}..errStr
25f0: 69 6e 67 20 3d 20 22 6b 65 79 4e 61 6d 65 20 3f  ing = "keyName ?
2600: 76 61 6c 75 65 4e 61 6d 65 20 64 61 74 61 20 3f  valueName data ?
2610: 74 79 70 65 3f 3f 22 3b 0a 09 62 72 65 61 6b 3b  type??";..break;
2620: 0a 20 20 20 20 63 61 73 65 20 54 79 70 65 49 64  .    case TypeId
2630: 78 3a 09 09 2f 2a 20 74 79 70 65 20 2a 2f 0a 09  x:../* type */..
2640: 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29 20 7b  if (argc == 2) {
2650: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 47 65 74  ..    return Get
2660: 54 79 70 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Type(interp, obj
2670: 76 5b 6e 5d 2c 20 6f 62 6a 76 5b 6e 2b 31 5d 2c  v[n], objv[n+1],
2680: 20 6d 6f 64 65 29 3b 0a 09 7d 0a 09 65 72 72 53   mode);..}..errS
2690: 74 72 69 6e 67 20 3d 20 22 6b 65 79 4e 61 6d 65  tring = "keyName
26a0: 20 76 61 6c 75 65 4e 61 6d 65 22 3b 0a 09 62 72   valueName";..br
26b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 56 61  eak;.    case Va
26c0: 6c 75 65 73 49 64 78 3a 09 09 2f 2a 20 76 61 6c  luesIdx:../* val
26d0: 75 65 73 20 2a 2f 0a 09 69 66 20 28 61 72 67 63  ues */..if (argc
26e0: 20 3d 3d 20 31 29 20 7b 0a 09 20 20 20 20 72 65   == 1) {..    re
26f0: 74 75 72 6e 20 47 65 74 56 61 6c 75 65 4e 61 6d  turn GetValueNam
2700: 65 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  es(interp, objv[
2710: 6e 5d 2c 20 4e 55 4c 4c 2c 20 6d 6f 64 65 29 3b  n], NULL, mode);
2720: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 61 72 67  ..} else if (arg
2730: 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 72  c == 2) {..    r
2740: 65 74 75 72 6e 20 47 65 74 56 61 6c 75 65 4e 61  eturn GetValueNa
2750: 6d 65 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  mes(interp, objv
2760: 5b 6e 5d 2c 20 6f 62 6a 76 5b 6e 2b 31 5d 2c 20  [n], objv[n+1], 
2770: 6d 6f 64 65 29 3b 0a 09 7d 0a 09 65 72 72 53 74  mode);..}..errSt
2780: 72 69 6e 67 20 3d 20 22 6b 65 79 4e 61 6d 65 20  ring = "keyName 
2790: 3f 70 61 74 74 65 72 6e 3f 22 3b 0a 09 62 72 65  ?pattern?";..bre
27a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ak;.    }.    Tc
27b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
27c0: 6e 74 65 72 70 2c 20 28 6d 6f 64 65 20 3f 20 33  nterp, (mode ? 3
27d0: 20 3a 20 32 29 2c 20 6f 62 6a 76 2c 20 65 72 72   : 2), objv, err
27e0: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 72 65 74  String);.    ret
27f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
2800: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2850: 2a 0a 20 2a 20 44 65 6c 65 74 65 4b 65 79 20 2d  *. * DeleteKey -
2860: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
2870: 63 74 69 6f 6e 20 64 65 6c 65 74 65 73 20 61 20  ction deletes a 
2880: 72 65 67 69 73 74 72 79 20 6b 65 79 2e 0a 20 2a  registry key.. *
2890: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
28a0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
28b0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
28c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
28d0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2920: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a   */..static int.
2930: 44 65 6c 65 74 65 4b 65 79 28 0a 20 20 20 20 54  DeleteKey(.    T
2940: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2950: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  p,../* Current i
2960: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
2970: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4e     Tcl_Obj *keyN
2980: 61 6d 65 4f 62 6a 2c 09 2f 2a 20 4e 61 6d 65 20  ameObj,./* Name 
2990: 6f 66 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65  of key to delete
29a0: 2e 20 2a 2f 0a 20 20 20 20 52 45 47 53 41 4d 20  . */.    REGSAM 
29b0: 6d 6f 64 65 29 09 09 2f 2a 20 4d 6f 64 65 20 66  mode)../* Mode f
29c0: 6c 61 67 73 20 74 6f 20 70 61 73 73 2e 20 2a 2f  lags to pass. */
29d0: 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 61 69  .{.    char *tai
29e0: 6c 2c 20 2a 62 75 66 66 65 72 2c 20 2a 68 6f 73  l, *buffer, *hos
29f0: 74 4e 61 6d 65 2c 20 2a 6b 65 79 4e 61 6d 65 3b  tName, *keyName;
2a00: 0a 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52  .    const TCHAR
2a10: 20 2a 6e 61 74 69 76 65 54 61 69 6c 3b 0a 20 20   *nativeTail;.  
2a20: 20 20 48 4b 45 59 20 72 6f 6f 74 4b 65 79 2c 20    HKEY rootKey, 
2a30: 73 75 62 6b 65 79 3b 0a 20 20 20 20 44 57 4f 52  subkey;.    DWOR
2a40: 44 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e  D result;.    in
2a50: 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 54 63  t length;.    Tc
2a60: 6c 5f 44 53 74 72 69 6e 67 20 62 75 66 3b 0a 20  l_DString buf;. 
2a70: 20 20 20 52 45 47 53 41 4d 20 73 61 76 65 4d 6f     REGSAM saveMo
2a80: 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20 20 20  de = mode;..    
2a90: 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e 64 20 74  /*.     * Find t
2aa0: 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65  he parent of the
2ab0: 20 6b 65 79 20 62 65 69 6e 67 20 64 65 6c 65 74   key being delet
2ac0: 65 64 20 61 6e 64 20 6f 70 65 6e 20 69 74 2e 0a  ed and open it..
2ad0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6b 65 79       */..    key
2ae0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
2af0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6b 65 79 4e  ringFromObj(keyN
2b00: 61 6d 65 4f 62 6a 2c 20 26 6c 65 6e 67 74 68 29  ameObj, &length)
2b10: 3b 0a 20 20 20 20 62 75 66 66 65 72 20 3d 20 63  ;.    buffer = c
2b20: 6b 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 20 2b 20  kalloc(length + 
2b30: 31 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28 62  1);.    strcpy(b
2b40: 75 66 66 65 72 2c 20 6b 65 79 4e 61 6d 65 29 3b  uffer, keyName);
2b50: 0a 0a 20 20 20 20 69 66 20 28 50 61 72 73 65 4b  ..    if (ParseK
2b60: 65 79 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 62  eyName(interp, b
2b70: 75 66 66 65 72 2c 20 26 68 6f 73 74 4e 61 6d 65  uffer, &hostName
2b80: 2c 20 26 72 6f 6f 74 4b 65 79 2c 0a 09 20 20 20  , &rootKey,..   
2b90: 20 26 6b 65 79 4e 61 6d 65 29 20 21 3d 20 54 43   &keyName) != TC
2ba0: 4c 5f 4f 4b 29 20 7b 0a 09 63 6b 66 72 65 65 28  L_OK) {..ckfree(
2bb0: 62 75 66 66 65 72 29 3b 0a 09 72 65 74 75 72 6e  buffer);..return
2bc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2bd0: 7d 0a 0a 20 20 20 20 69 66 20 28 2a 6b 65 79 4e  }..    if (*keyN
2be0: 61 6d 65 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  ame == '\0') {..
2bf0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2c00: 28 69 6e 74 65 72 70 2c 0a 09 09 54 63 6c 5f 4e  (interp,...Tcl_N
2c10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 62 61 64  ewStringObj("bad
2c20: 20 6b 65 79 3a 20 63 61 6e 6e 6f 74 20 64 65 6c   key: cannot del
2c30: 65 74 65 20 72 6f 6f 74 20 6b 65 79 73 22 2c 20  ete root keys", 
2c40: 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  -1));..Tcl_SetEr
2c50: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
2c60: 22 57 49 4e 5f 52 45 47 22 2c 20 22 44 45 4c 5f  "WIN_REG", "DEL_
2c70: 52 4f 4f 54 5f 4b 45 59 22 2c 20 4e 55 4c 4c 29  ROOT_KEY", NULL)
2c80: 3b 0a 09 63 6b 66 72 65 65 28 62 75 66 66 65 72  ;..ckfree(buffer
2c90: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
2ca0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
2cb0: 20 74 61 69 6c 20 3d 20 73 74 72 72 63 68 72 28   tail = strrchr(
2cc0: 6b 65 79 4e 61 6d 65 2c 20 27 5c 5c 27 29 3b 0a  keyName, '\\');.
2cd0: 20 20 20 20 69 66 20 28 74 61 69 6c 29 20 7b 0a      if (tail) {.
2ce0: 09 2a 74 61 69 6c 2b 2b 20 3d 20 27 5c 30 27 3b  .*tail++ = '\0';
2cf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 74  .    } else {..t
2d00: 61 69 6c 20 3d 20 6b 65 79 4e 61 6d 65 3b 0a 09  ail = keyName;..
2d10: 6b 65 79 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  keyName = NULL;.
2d20: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 6f 64 65 20      }..    mode 
2d30: 7c 3d 20 4b 45 59 5f 45 4e 55 4d 45 52 41 54 45  |= KEY_ENUMERATE
2d40: 5f 53 55 42 5f 4b 45 59 53 20 7c 20 44 45 4c 45  _SUB_KEYS | DELE
2d50: 54 45 3b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d  TE;.    result =
2d60: 20 4f 70 65 6e 53 75 62 4b 65 79 28 68 6f 73 74   OpenSubKey(host
2d70: 4e 61 6d 65 2c 20 72 6f 6f 74 4b 65 79 2c 20 6b  Name, rootKey, k
2d80: 65 79 4e 61 6d 65 2c 20 6d 6f 64 65 2c 20 30 2c  eyName, mode, 0,
2d90: 20 26 73 75 62 6b 65 79 29 3b 0a 20 20 20 20 69   &subkey);.    i
2da0: 66 20 28 72 65 73 75 6c 74 20 21 3d 20 45 52 52  f (result != ERR
2db0: 4f 52 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 63  OR_SUCCESS) {..c
2dc0: 6b 66 72 65 65 28 62 75 66 66 65 72 29 3b 0a 09  kfree(buffer);..
2dd0: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 45 52  if (result == ER
2de0: 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
2df0: 4e 44 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  ND) {..    retur
2e00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 09 54 63  n TCL_OK;..}..Tc
2e10: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2e20: 6e 74 65 72 70 2c 0a 09 09 54 63 6c 5f 4e 65 77  nterp,...Tcl_New
2e30: 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 6c  StringObj("unabl
2e40: 65 20 74 6f 20 64 65 6c 65 74 65 20 6b 65 79 3a  e to delete key:
2e50: 20 22 2c 20 2d 31 29 29 3b 0a 09 41 70 70 65 6e   ", -1));..Appen
2e60: 64 53 79 73 74 65 6d 45 72 72 6f 72 28 69 6e 74  dSystemError(int
2e70: 65 72 70 2c 20 72 65 73 75 6c 74 29 3b 0a 09 72  erp, result);..r
2e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
2ea0: 20 20 20 20 2a 20 4e 6f 77 20 77 65 20 72 65 63      * Now we rec
2eb0: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
2ec0: 74 68 65 20 6b 65 79 20 61 6e 64 20 65 76 65 72  the key and ever
2ed0: 79 74 68 69 6e 67 20 62 65 6c 6f 77 20 69 74 2e  ything below it.
2ee0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6e 61  .     */..    na
2ef0: 74 69 76 65 54 61 69 6c 20 3d 20 54 63 6c 5f 57  tiveTail = Tcl_W
2f00: 69 6e 55 74 66 54 6f 54 43 68 61 72 28 74 61 69  inUtfToTChar(tai
2f10: 6c 2c 20 2d 31 2c 20 26 62 75 66 29 3b 0a 20 20  l, -1, &buf);.  
2f20: 20 20 72 65 73 75 6c 74 20 3d 20 52 65 63 75 72    result = Recur
2f30: 73 69 76 65 44 65 6c 65 74 65 4b 65 79 28 73 75  siveDeleteKey(su
2f40: 62 6b 65 79 2c 20 6e 61 74 69 76 65 54 61 69 6c  bkey, nativeTail
2f50: 2c 20 73 61 76 65 4d 6f 64 65 29 3b 0a 20 20 20  , saveMode);.   
2f60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
2f70: 28 26 62 75 66 29 3b 0a 0a 20 20 20 20 69 66 20  (&buf);..    if 
2f80: 28 72 65 73 75 6c 74 20 21 3d 20 45 52 52 4f 52  (result != ERROR
2f90: 5f 53 55 43 43 45 53 53 20 26 26 20 72 65 73 75  _SUCCESS && resu
2fa0: 6c 74 20 21 3d 20 45 52 52 4f 52 5f 46 49 4c 45  lt != ERROR_FILE
2fb0: 5f 4e 4f 54 5f 46 4f 55 4e 44 29 20 7b 0a 09 54  _NOT_FOUND) {..T
2fc0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2fd0: 69 6e 74 65 72 70 2c 0a 09 09 54 63 6c 5f 4e 65  interp,...Tcl_Ne
2fe0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62  wStringObj("unab
2ff0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 6b 65 79  le to delete key
3000: 3a 20 22 2c 20 2d 31 29 29 3b 0a 09 41 70 70 65  : ", -1));..Appe
3010: 6e 64 53 79 73 74 65 6d 45 72 72 6f 72 28 69 6e  ndSystemError(in
3020: 74 65 72 70 2c 20 72 65 73 75 6c 74 29 3b 0a 09  terp, result);..
3030: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52  result = TCL_ERR
3040: 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OR;.    } else {
3050: 0a 09 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f  ..result = TCL_O
3060: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 52 65  K;.    }..    Re
3070: 67 43 6c 6f 73 65 4b 65 79 28 73 75 62 6b 65 79  gCloseKey(subkey
3080: 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 75  );.    ckfree(bu
3090: 66 66 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ffer);.    retur
30a0: 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a  n result;.}.../*
30b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3100: 44 65 6c 65 74 65 56 61 6c 75 65 20 2d 2d 0a 20  DeleteValue --. 
3110: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
3120: 6f 6e 20 64 65 6c 65 74 65 73 20 61 20 76 61 6c  on deletes a val
3130: 75 65 20 66 72 6f 6d 20 61 20 72 65 67 69 73 74  ue from a regist
3140: 72 79 20 6b 65 79 2e 0a 20 2a 0a 20 2a 20 52 65  ry key.. *. * Re
3150: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
3160: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
3170: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3180: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
3190: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
31e0: 74 61 74 69 63 20 69 6e 74 0a 44 65 6c 65 74 65  tatic int.Delete
31f0: 56 61 6c 75 65 28 0a 20 20 20 20 54 63 6c 5f 49  Value(.    Tcl_I
3200: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
3210: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
3220: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54  preter. */.    T
3230: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61 6d 65 4f  cl_Obj *keyNameO
3240: 62 6a 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 6b  bj,./* Name of k
3250: 65 79 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ey. */.    Tcl_O
3260: 62 6a 20 2a 76 61 6c 75 65 4e 61 6d 65 4f 62 6a  bj *valueNameObj
3270: 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 76 61 6c  ,./* Name of val
3280: 75 65 20 74 6f 20 64 65 6c 65 74 65 2e 20 2a 2f  ue to delete. */
3290: 0a 20 20 20 20 52 45 47 53 41 4d 20 6d 6f 64 65  .    REGSAM mode
32a0: 29 09 09 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73  )../* Mode flags
32b0: 20 74 6f 20 70 61 73 73 2e 20 2a 2f 0a 7b 0a 20   to pass. */.{. 
32c0: 20 20 20 48 4b 45 59 20 6b 65 79 3b 0a 20 20 20     HKEY key;.   
32d0: 20 63 68 61 72 20 2a 76 61 6c 75 65 4e 61 6d 65   char *valueName
32e0: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68  ;.    int length
32f0: 3b 0a 20 20 20 20 44 57 4f 52 44 20 72 65 73 75  ;.    DWORD resu
3300: 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  lt;.    Tcl_DStr
3310: 69 6e 67 20 64 73 3b 0a 0a 20 20 20 20 2f 2a 0a  ing ds;..    /*.
3320: 20 20 20 20 20 2a 20 41 74 74 65 6d 70 74 20 74       * Attempt t
3330: 6f 20 6f 70 65 6e 20 74 68 65 20 6b 65 79 20 66  o open the key f
3340: 6f 72 20 64 65 6c 65 74 69 6f 6e 2e 0a 20 20 20  or deletion..   
3350: 20 20 2a 2f 0a 0a 20 20 20 20 6d 6f 64 65 20 7c    */..    mode |
3360: 3d 20 4b 45 59 5f 53 45 54 5f 56 41 4c 55 45 3b  = KEY_SET_VALUE;
3370: 0a 20 20 20 20 69 66 20 28 4f 70 65 6e 4b 65 79  .    if (OpenKey
3380: 28 69 6e 74 65 72 70 2c 20 6b 65 79 4e 61 6d 65  (interp, keyName
3390: 4f 62 6a 2c 20 6d 6f 64 65 2c 20 30 2c 20 26 6b  Obj, mode, 0, &k
33a0: 65 79 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ey) != TCL_OK) {
33b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
33c0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 76  OR;.    }..    v
33d0: 61 6c 75 65 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  alueName = Tcl_G
33e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
33f0: 76 61 6c 75 65 4e 61 6d 65 4f 62 6a 2c 20 26 6c  valueNameObj, &l
3400: 65 6e 67 74 68 29 3b 0a 20 20 20 20 54 63 6c 5f  ength);.    Tcl_
3410: 57 69 6e 55 74 66 54 6f 54 43 68 61 72 28 76 61  WinUtfToTChar(va
3420: 6c 75 65 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 2c  lueName, length,
3430: 20 26 64 73 29 3b 0a 20 20 20 20 72 65 73 75 6c   &ds);.    resul
3440: 74 20 3d 20 52 65 67 44 65 6c 65 74 65 56 61 6c  t = RegDeleteVal
3450: 75 65 28 6b 65 79 2c 20 28 63 6f 6e 73 74 20 54  ue(key, (const T
3460: 43 48 41 52 20 2a 29 54 63 6c 5f 44 53 74 72 69  CHAR *)Tcl_DStri
3470: 6e 67 56 61 6c 75 65 28 26 64 73 29 29 3b 0a 20  ngValue(&ds));. 
3480: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
3490: 65 65 28 26 64 73 29 3b 0a 20 20 20 20 69 66 20  ee(&ds);.    if 
34a0: 28 72 65 73 75 6c 74 20 21 3d 20 45 52 52 4f 52  (result != ERROR
34b0: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 54 63 6c  _SUCCESS) {..Tcl
34c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
34d0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  terp, Tcl_ObjPri
34e0: 6e 74 66 28 0a 09 09 22 75 6e 61 62 6c 65 20 74  ntf(..."unable t
34f0: 6f 20 64 65 6c 65 74 65 20 76 61 6c 75 65 20 5c  o delete value \
3500: 22 25 73 5c 22 20 66 72 6f 6d 20 6b 65 79 20 5c  "%s\" from key \
3510: 22 25 73 5c 22 3a 20 22 2c 0a 09 09 54 63 6c 5f  "%s\": ",...Tcl_
3520: 47 65 74 53 74 72 69 6e 67 28 76 61 6c 75 65 4e  GetString(valueN
3530: 61 6d 65 4f 62 6a 29 2c 20 54 63 6c 5f 47 65 74  ameObj), Tcl_Get
3540: 53 74 72 69 6e 67 28 6b 65 79 4e 61 6d 65 4f 62  String(keyNameOb
3550: 6a 29 29 29 3b 0a 09 41 70 70 65 6e 64 53 79 73  j)));..AppendSys
3560: 74 65 6d 45 72 72 6f 72 28 69 6e 74 65 72 70 2c  temError(interp,
3570: 20 72 65 73 75 6c 74 29 3b 0a 09 72 65 73 75 6c   result);..resul
3580: 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  t = TCL_ERROR;. 
3590: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
35a0: 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20  ult = TCL_OK;.  
35b0: 20 20 7d 0a 20 20 20 20 52 65 67 43 6c 6f 73 65    }.    RegClose
35c0: 4b 65 79 28 6b 65 79 29 3b 0a 20 20 20 20 72 65  Key(key);.    re
35d0: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c  turn result;.}..
35e0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3630: 20 2a 20 47 65 74 4b 65 79 4e 61 6d 65 73 20 2d   * GetKeyNames -
3640: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
3650: 63 74 69 6f 6e 20 65 6e 75 6d 65 72 61 74 65 73  ction enumerates
3660: 20 74 68 65 20 73 75 62 6b 65 79 73 20 6f 66 20   the subkeys of 
3670: 61 20 67 69 76 65 6e 20 6b 65 79 2e 20 49 66 20  a given key. If 
3680: 74 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 20 2a 09  the optional. *.
3690: 70 61 74 74 65 72 6e 20 69 73 20 73 75 70 70 6c  pattern is suppl
36a0: 69 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ied, then only k
36b0: 65 79 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  eys that match t
36c0: 68 65 20 70 61 74 74 65 72 6e 20 77 69 6c 6c 20  he pattern will 
36d0: 62 65 0a 20 2a 09 72 65 74 75 72 6e 65 64 2e 0a  be. *.returned..
36e0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
36f0: 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 6c 69  *.Returns the li
3700: 73 74 20 6f 66 20 73 75 62 6b 65 79 73 20 69 6e  st of subkeys in
3710: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 62 6a 65   the result obje
3720: 63 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 70  ct of the interp
3730: 72 65 74 65 72 2c 0a 20 2a 09 6f 72 20 61 6e 20  reter,. *.or an 
3740: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e  error message on
3750: 20 66 61 69 6c 75 72 65 2e 0a 20 2a 0a 20 2a 20   failure.. *. * 
3760: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
3770: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
37d0: 6e 74 0a 47 65 74 4b 65 79 4e 61 6d 65 73 28 0a  nt.GetKeyNames(.
37e0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
37f0: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72  interp,../* Curr
3800: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ent interpreter.
3810: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
3820: 2a 6b 65 79 4e 61 6d 65 4f 62 6a 2c 09 2f 2a 20  *keyNameObj,./* 
3830: 4b 65 79 20 74 6f 20 65 6e 75 6d 65 72 61 74 65  Key to enumerate
3840: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
3850: 20 2a 70 61 74 74 65 72 6e 4f 62 6a 2c 09 2f 2a   *patternObj,./*
3860: 20 4f 70 74 69 6f 6e 61 6c 20 6d 61 74 63 68 20   Optional match 
3870: 70 61 74 74 65 72 6e 2e 20 2a 2f 0a 20 20 20 20  pattern. */.    
3880: 52 45 47 53 41 4d 20 6d 6f 64 65 29 09 09 2f 2a  REGSAM mode)../*
3890: 20 4d 6f 64 65 20 66 6c 61 67 73 20 74 6f 20 70   Mode flags to p
38a0: 61 73 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f  ass. */.{.    co
38b0: 6e 73 74 20 63 68 61 72 20 2a 70 61 74 74 65 72  nst char *patter
38c0: 6e 3b 09 2f 2a 20 50 61 74 74 65 72 6e 20 62 65  n;./* Pattern be
38d0: 69 6e 67 20 6d 61 74 63 68 65 64 20 61 67 61 69  ing matched agai
38e0: 6e 73 74 20 73 75 62 6b 65 79 73 20 2a 2f 0a 20  nst subkeys */. 
38f0: 20 20 20 48 4b 45 59 20 6b 65 79 3b 09 09 09 2f     HKEY key;.../
3900: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  * Handle to the 
3910: 6b 65 79 20 62 65 69 6e 67 20 65 78 61 6d 69 6e  key being examin
3920: 65 64 20 2a 2f 0a 20 20 20 20 54 43 48 41 52 20  ed */.    TCHAR 
3930: 62 75 66 66 65 72 5b 4d 41 58 5f 4b 45 59 5f 4c  buffer[MAX_KEY_L
3940: 45 4e 47 54 48 5d 3b 0a 09 09 09 09 2f 2a 20 42  ENGTH];...../* B
3950: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
3960: 65 20 73 75 62 6b 65 79 20 6e 61 6d 65 20 2a 2f  e subkey name */
3970: 0a 20 20 20 20 44 57 4f 52 44 20 62 75 66 53 69  .    DWORD bufSi
3980: 7a 65 3b 09 09 2f 2a 20 53 69 7a 65 20 6f 66 20  ze;../* Size of 
3990: 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  the buffer */.  
39a0: 20 20 44 57 4f 52 44 20 69 6e 64 65 78 3b 09 09    DWORD index;..
39b0: 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
39c0: 68 65 20 63 75 72 72 65 6e 74 20 73 75 62 6b 65  he current subke
39d0: 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6e  y */.    char *n
39e0: 61 6d 65 3b 09 09 09 2f 2a 20 53 75 62 6b 65 79  ame;.../* Subkey
39f0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c   name */.    Tcl
3a00: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72 3b  _Obj *resultPtr;
3a10: 09 09 2f 2a 20 4c 69 73 74 20 6f 66 20 73 75 62  ../* List of sub
3a20: 6b 65 79 73 20 62 65 69 6e 67 20 61 63 63 75 6d  keys being accum
3a30: 75 6c 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e  ulated */.    in
3a40: 74 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f  t result = TCL_O
3a50: 4b 3b 09 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c  K;./* Return val
3a60: 75 65 20 66 72 6f 6d 20 74 68 69 73 20 63 6f 6d  ue from this com
3a70: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
3a80: 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f 2a 20  DString ds;../* 
3a90: 42 75 66 66 65 72 20 74 6f 20 74 72 61 6e 73 6c  Buffer to transl
3aa0: 61 74 65 20 73 75 62 6b 65 79 20 6e 61 6d 65 20  ate subkey name 
3ab0: 74 6f 20 55 54 46 2d 38 20 2a 2f 0a 0a 20 20 20  to UTF-8 */..   
3ac0: 20 69 66 20 28 70 61 74 74 65 72 6e 4f 62 6a 29   if (patternObj)
3ad0: 20 7b 0a 09 70 61 74 74 65 72 6e 20 3d 20 54 63   {..pattern = Tc
3ae0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 61 74 74  l_GetString(patt
3af0: 65 72 6e 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65  ernObj);.    } e
3b00: 6c 73 65 20 7b 0a 09 70 61 74 74 65 72 6e 20 3d  lse {..pattern =
3b10: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
3b20: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 74 74 65    /*.     * Atte
3b30: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  mpt to open the 
3b40: 6b 65 79 20 66 6f 72 20 65 6e 75 6d 65 72 61 74  key for enumerat
3b50: 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ion..     */..  
3b60: 20 20 6d 6f 64 65 20 7c 3d 20 4b 45 59 5f 51 55    mode |= KEY_QU
3b70: 45 52 59 5f 56 41 4c 55 45 20 7c 20 4b 45 59 5f  ERY_VALUE | KEY_
3b80: 45 4e 55 4d 45 52 41 54 45 5f 53 55 42 5f 4b 45  ENUMERATE_SUB_KE
3b90: 59 53 3b 0a 20 20 20 20 69 66 20 28 4f 70 65 6e  YS;.    if (Open
3ba0: 4b 65 79 28 69 6e 74 65 72 70 2c 20 6b 65 79 4e  Key(interp, keyN
3bb0: 61 6d 65 4f 62 6a 2c 20 6d 6f 64 65 2c 20 30 2c  ameObj, mode, 0,
3bc0: 20 26 6b 65 79 29 20 21 3d 20 54 43 4c 5f 4f 4b   &key) != TCL_OK
3bd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
3be0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
3bf0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 75 6d    /*.     * Enum
3c00: 65 72 61 74 65 20 74 68 65 20 73 75 62 6b 65 79  erate the subkey
3c10: 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  s..     */..    
3c20: 72 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f  resultPtr = Tcl_
3c30: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 66 6f  NewObj();.    fo
3c40: 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 3b 20 2b  r (index = 0;; +
3c50: 2b 69 6e 64 65 78 29 20 7b 0a 09 62 75 66 53 69  +index) {..bufSi
3c60: 7a 65 20 3d 20 4d 41 58 5f 4b 45 59 5f 4c 45 4e  ze = MAX_KEY_LEN
3c70: 47 54 48 3b 0a 09 72 65 73 75 6c 74 20 3d 20 52  GTH;..result = R
3c80: 65 67 45 6e 75 6d 4b 65 79 45 78 28 6b 65 79 2c  egEnumKeyEx(key,
3c90: 20 69 6e 64 65 78 2c 20 62 75 66 66 65 72 2c 20   index, buffer, 
3ca0: 26 62 75 66 53 69 7a 65 2c 0a 09 09 4e 55 4c 4c  &bufSize,...NULL
3cb0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
3cc0: 4c 4c 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74  LL);..if (result
3cd0: 20 21 3d 20 45 52 52 4f 52 5f 53 55 43 43 45 53   != ERROR_SUCCES
3ce0: 53 29 20 7b 0a 09 20 20 20 20 69 66 20 28 72 65  S) {..    if (re
3cf0: 73 75 6c 74 20 3d 3d 20 45 52 52 4f 52 5f 4e 4f  sult == ERROR_NO
3d00: 5f 4d 4f 52 45 5f 49 54 45 4d 53 29 20 7b 0a 09  _MORE_ITEMS) {..
3d10: 09 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b  .result = TCL_OK
3d20: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
3d30: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
3d40: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
3d50: 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 22 75 6e  bjPrintf(...."un
3d60: 61 62 6c 65 20 74 6f 20 65 6e 75 6d 65 72 61 74  able to enumerat
3d70: 65 20 73 75 62 6b 65 79 73 20 6f 66 20 5c 22 25  e subkeys of \"%
3d80: 73 5c 22 3a 20 22 2c 0a 09 09 09 54 63 6c 5f 47  s\": ",....Tcl_G
3d90: 65 74 53 74 72 69 6e 67 28 6b 65 79 4e 61 6d 65  etString(keyName
3da0: 4f 62 6a 29 29 29 3b 0a 09 09 41 70 70 65 6e 64  Obj)));...Append
3db0: 53 79 73 74 65 6d 45 72 72 6f 72 28 69 6e 74 65  SystemError(inte
3dc0: 72 70 2c 20 72 65 73 75 6c 74 29 3b 0a 09 09 72  rp, result);...r
3dd0: 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f  esult = TCL_ERRO
3de0: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62  R;..    }..    b
3df0: 72 65 61 6b 3b 0a 09 7d 0a 09 54 63 6c 5f 57 69  reak;..}..Tcl_Wi
3e00: 6e 54 43 68 61 72 54 6f 55 74 66 28 62 75 66 66  nTCharToUtf(buff
3e10: 65 72 2c 20 62 75 66 53 69 7a 65 20 2a 20 73 69  er, bufSize * si
3e20: 7a 65 6f 66 28 54 43 48 41 52 29 2c 20 26 64 73  zeof(TCHAR), &ds
3e30: 29 3b 0a 09 6e 61 6d 65 20 3d 20 54 63 6c 5f 44  );..name = Tcl_D
3e40: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29  StringValue(&ds)
3e50: 3b 0a 09 69 66 20 28 70 61 74 74 65 72 6e 20 26  ;..if (pattern &
3e60: 26 20 21 54 63 6c 5f 53 74 72 69 6e 67 4d 61 74  & !Tcl_StringMat
3e70: 63 68 28 6e 61 6d 65 2c 20 70 61 74 74 65 72 6e  ch(name, pattern
3e80: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53  )) {..    Tcl_DS
3e90: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
3ea0: 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09  .    continue;..
3eb0: 7d 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f  }..result = Tcl_
3ec0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3ed0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73  ment(interp, res
3ee0: 75 6c 74 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65  ultPtr,...Tcl_Ne
3ef0: 77 53 74 72 69 6e 67 4f 62 6a 28 6e 61 6d 65 2c  wStringObj(name,
3f00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
3f10: 74 68 28 26 64 73 29 29 29 3b 0a 09 54 63 6c 5f  th(&ds)));..Tcl_
3f20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
3f30: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d  ;..if (result !=
3f40: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
3f50: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a  break;..}.    }.
3f60: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d      if (result =
3f70: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c  = TCL_OK) {..Tcl
3f80: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
3f90: 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 29  terp, resultPtr)
3fa0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
3fb0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3fc0: 28 72 65 73 75 6c 74 50 74 72 29 3b 20 2f 2a 20  (resultPtr); /* 
3fd0: 42 55 47 46 49 58 3a 20 44 6f 6e 27 74 20 6c 65  BUGFIX: Don't le
3fe0: 61 6b 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a  ak on failure. *
3ff0: 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 52 65 67  /.    }..    Reg
4000: 43 6c 6f 73 65 4b 65 79 28 6b 65 79 29 3b 0a 20  CloseKey(key);. 
4010: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
4020: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 0a 20 2a 0a 20 2a 20 47 65 74 54 79 70 65 20  -. *. * GetType 
4080: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
4090: 6e 63 74 69 6f 6e 20 67 65 74 73 20 74 68 65 20  nction gets the 
40a0: 74 79 70 65 20 6f 66 20 61 20 67 69 76 65 6e 20  type of a given 
40b0: 72 65 67 69 73 74 72 79 20 76 61 6c 75 65 20 61  registry value a
40c0: 6e 64 20 70 6c 61 63 65 73 20 69 74 20 69 6e 0a  nd places it in.
40d0: 20 2a 09 74 68 65 20 69 6e 74 65 72 70 72 65 74   *.the interpret
40e0: 65 72 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  er result.. *. *
40f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74   Results:. *.Ret
4100: 75 72 6e 73 20 61 20 6e 6f 72 6d 61 6c 20 54 63  urns a normal Tc
4110: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
4120: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4130: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
4190: 6e 74 0a 47 65 74 54 79 70 65 28 0a 20 20 20 20  nt.GetType(.    
41a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
41b0: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
41c0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
41d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79      Tcl_Obj *key
41e0: 4e 61 6d 65 4f 62 6a 2c 09 2f 2a 20 4e 61 6d 65  NameObj,./* Name
41f0: 20 6f 66 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20   of key. */.    
4200: 54 63 6c 5f 4f 62 6a 20 2a 76 61 6c 75 65 4e 61  Tcl_Obj *valueNa
4210: 6d 65 4f 62 6a 2c 09 2f 2a 20 4e 61 6d 65 20 6f  meObj,./* Name o
4220: 66 20 76 61 6c 75 65 20 74 6f 20 67 65 74 2e 20  f value to get. 
4230: 2a 2f 0a 20 20 20 20 52 45 47 53 41 4d 20 6d 6f  */.    REGSAM mo
4240: 64 65 29 09 09 2f 2a 20 4d 6f 64 65 20 66 6c 61  de)../* Mode fla
4250: 67 73 20 74 6f 20 70 61 73 73 2e 20 2a 2f 0a 7b  gs to pass. */.{
4260: 0a 20 20 20 20 48 4b 45 59 20 6b 65 79 3b 0a 20  .    HKEY key;. 
4270: 20 20 20 44 57 4f 52 44 20 72 65 73 75 6c 74 2c     DWORD result,
4280: 20 74 79 70 65 3b 0a 20 20 20 20 54 63 6c 5f 44   type;.    Tcl_D
4290: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 63  String ds;.    c
42a0: 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 6c 75 65  onst char *value
42b0: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
42c0: 54 43 48 41 52 20 2a 6e 61 74 69 76 65 56 61 6c  TCHAR *nativeVal
42d0: 75 65 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67  ue;.    int leng
42e0: 74 68 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  th;..    /*.    
42f0: 20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70   * Attempt to op
4300: 65 6e 20 74 68 65 20 6b 65 79 20 66 6f 72 20 72  en the key for r
4310: 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a  eading..     */.
4320: 0a 20 20 20 20 6d 6f 64 65 20 7c 3d 20 4b 45 59  .    mode |= KEY
4330: 5f 51 55 45 52 59 5f 56 41 4c 55 45 3b 0a 20 20  _QUERY_VALUE;.  
4340: 20 20 69 66 20 28 4f 70 65 6e 4b 65 79 28 69 6e    if (OpenKey(in
4350: 74 65 72 70 2c 20 6b 65 79 4e 61 6d 65 4f 62 6a  terp, keyNameObj
4360: 2c 20 6d 6f 64 65 2c 20 30 2c 20 26 6b 65 79 29  , mode, 0, &key)
4370: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
4380: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
43a0: 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 74 79      * Get the ty
43b0: 70 65 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e  pe of the value.
43c0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 76 61  .     */..    va
43d0: 6c 75 65 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  lueName = Tcl_Ge
43e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76  tStringFromObj(v
43f0: 61 6c 75 65 4e 61 6d 65 4f 62 6a 2c 20 26 6c 65  alueNameObj, &le
4400: 6e 67 74 68 29 3b 0a 20 20 20 20 6e 61 74 69 76  ngth);.    nativ
4410: 65 56 61 6c 75 65 20 3d 20 54 63 6c 5f 57 69 6e  eValue = Tcl_Win
4420: 55 74 66 54 6f 54 43 68 61 72 28 76 61 6c 75 65  UtfToTChar(value
4430: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 2c 20 26 64  Name, length, &d
4440: 73 29 3b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d  s);.    result =
4450: 20 52 65 67 51 75 65 72 79 56 61 6c 75 65 45 78   RegQueryValueEx
4460: 28 6b 65 79 2c 20 6e 61 74 69 76 65 56 61 6c 75  (key, nativeValu
4470: 65 2c 20 4e 55 4c 4c 2c 20 26 74 79 70 65 2c 0a  e, NULL, &type,.
4480: 09 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  .    NULL, NULL)
4490: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
44a0: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20  gFree(&ds);.    
44b0: 52 65 67 43 6c 6f 73 65 4b 65 79 28 6b 65 79 29  RegCloseKey(key)
44c0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  ;..    if (resul
44d0: 74 20 21 3d 20 45 52 52 4f 52 5f 53 55 43 43 45  t != ERROR_SUCCE
44e0: 53 53 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62  SS) {..Tcl_SetOb
44f0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
4500: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09  Tcl_ObjPrintf(..
4510: 09 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20  ."unable to get 
4520: 74 79 70 65 20 6f 66 20 76 61 6c 75 65 20 5c 22  type of value \"
4530: 25 73 5c 22 20 66 72 6f 6d 20 6b 65 79 20 5c 22  %s\" from key \"
4540: 25 73 5c 22 3a 20 22 2c 0a 09 09 54 63 6c 5f 47  %s\": ",...Tcl_G
4550: 65 74 53 74 72 69 6e 67 28 76 61 6c 75 65 4e 61  etString(valueNa
4560: 6d 65 4f 62 6a 29 2c 20 54 63 6c 5f 47 65 74 53  meObj), Tcl_GetS
4570: 74 72 69 6e 67 28 6b 65 79 4e 61 6d 65 4f 62 6a  tring(keyNameObj
4580: 29 29 29 3b 0a 09 41 70 70 65 6e 64 53 79 73 74  )));..AppendSyst
4590: 65 6d 45 72 72 6f 72 28 69 6e 74 65 72 70 2c 20  emError(interp, 
45a0: 72 65 73 75 6c 74 29 3b 0a 09 72 65 74 75 72 6e  result);..return
45b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
45c0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
45d0: 20 53 65 74 20 74 68 65 20 74 79 70 65 20 69 6e   Set the type in
45e0: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 2e 20 57  to the result. W
45f0: 61 74 63 68 20 6f 75 74 20 66 6f 72 20 75 6e 6b  atch out for unk
4600: 6e 6f 77 6e 20 74 79 70 65 73 2e 20 49 66 20 77  nown types. If w
4610: 65 20 64 6f 6e 27 74 0a 20 20 20 20 20 2a 20 6b  e don't.     * k
4620: 6e 6f 77 20 61 62 6f 75 74 20 74 68 65 20 74 79  now about the ty
4630: 70 65 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65  pe, just use the
4640: 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 2e 0a   numeric value..
4650: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
4660: 28 74 79 70 65 20 3e 20 6c 61 73 74 54 79 70 65  (type > lastType
4670: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52  ) {..Tcl_SetObjR
4680: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
4690: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74  l_NewIntObj((int
46a0: 29 20 74 79 70 65 29 29 3b 0a 20 20 20 20 7d 20  ) type));.    } 
46b0: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 4f  else {..Tcl_SetO
46c0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
46d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
46e0: 6a 28 74 79 70 65 4e 61 6d 65 73 5b 74 79 70 65  j(typeNames[type
46f0: 5d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  ], -1));.    }. 
4700: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
4710: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 0a 20 2a 0a 20 2a 20 47 65 74 56 61 6c 75 65  -. *. * GetValue
4770: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
4780: 75 6e 63 74 69 6f 6e 20 67 65 74 73 20 74 68 65  unction gets the
4790: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 72   contents of a r
47a0: 65 67 69 73 74 72 79 20 76 61 6c 75 65 20 61 6e  egistry value an
47b0: 64 20 70 6c 61 63 65 73 20 61 20 6c 69 73 74 0a  d places a list.
47c0: 20 2a 09 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68   *.containing th
47d0: 65 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 74  e data and the t
47e0: 79 70 65 20 69 6e 20 74 68 65 20 69 6e 74 65 72  ype in the inter
47f0: 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e 0a 20  preter result.. 
4800: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4810: 09 52 65 74 75 72 6e 73 20 61 20 6e 6f 72 6d 61  .Returns a norma
4820: 6c 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  l Tcl result.. *
4830: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4840: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
48a0: 69 63 20 69 6e 74 0a 47 65 74 56 61 6c 75 65 28  ic int.GetValue(
48b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
48c0: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72  *interp,../* Cur
48d0: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
48e0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
48f0: 20 2a 6b 65 79 4e 61 6d 65 4f 62 6a 2c 09 2f 2a   *keyNameObj,./*
4900: 20 4e 61 6d 65 20 6f 66 20 6b 65 79 2e 20 2a 2f   Name of key. */
4910: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 61  .    Tcl_Obj *va
4920: 6c 75 65 4e 61 6d 65 4f 62 6a 2c 09 2f 2a 20 4e  lueNameObj,./* N
4930: 61 6d 65 20 6f 66 20 76 61 6c 75 65 20 74 6f 20  ame of value to 
4940: 67 65 74 2e 20 2a 2f 0a 20 20 20 20 52 45 47 53  get. */.    REGS
4950: 41 4d 20 6d 6f 64 65 29 09 09 2f 2a 20 4d 6f 64  AM mode)../* Mod
4960: 65 20 66 6c 61 67 73 20 74 6f 20 70 61 73 73 2e  e flags to pass.
4970: 20 2a 2f 0a 7b 0a 20 20 20 20 48 4b 45 59 20 6b   */.{.    HKEY k
4980: 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ey;.    const ch
4990: 61 72 20 2a 76 61 6c 75 65 4e 61 6d 65 3b 0a 20  ar *valueName;. 
49a0: 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a     const TCHAR *
49b0: 6e 61 74 69 76 65 56 61 6c 75 65 3b 0a 20 20 20  nativeValue;.   
49c0: 20 44 57 4f 52 44 20 72 65 73 75 6c 74 2c 20 6c   DWORD result, l
49d0: 65 6e 67 74 68 2c 20 74 79 70 65 3b 0a 20 20 20  ength, type;.   
49e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 61 74   Tcl_DString dat
49f0: 61 2c 20 62 75 66 3b 0a 20 20 20 20 69 6e 74 20  a, buf;.    int 
4a00: 6e 61 6d 65 4c 65 6e 3b 0a 0a 20 20 20 20 2f 2a  nameLen;..    /*
4a10: 0a 20 20 20 20 20 2a 20 41 74 74 65 6d 70 74 20  .     * Attempt 
4a20: 74 6f 20 6f 70 65 6e 20 74 68 65 20 6b 65 79 20  to open the key 
4a30: 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  for reading..   
4a40: 20 20 2a 2f 0a 0a 20 20 20 20 6d 6f 64 65 20 7c    */..    mode |
4a50: 3d 20 4b 45 59 5f 51 55 45 52 59 5f 56 41 4c 55  = KEY_QUERY_VALU
4a60: 45 3b 0a 20 20 20 20 69 66 20 28 4f 70 65 6e 4b  E;.    if (OpenK
4a70: 65 79 28 69 6e 74 65 72 70 2c 20 6b 65 79 4e 61  ey(interp, keyNa
4a80: 6d 65 4f 62 6a 2c 20 6d 6f 64 65 2c 20 30 2c 20  meObj, mode, 0, 
4a90: 26 6b 65 79 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  &key) != TCL_OK)
4aa0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
4ab0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
4ac0: 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 69 74 69   /*.     * Initi
4ad0: 61 6c 69 7a 65 20 61 20 44 73 74 72 69 6e 67 20  alize a Dstring 
4ae0: 74 6f 20 6d 61 78 69 6d 75 6d 20 73 74 61 74 69  to maximum stati
4af0: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
4b00: 73 69 7a 65 20 77 65 20 63 6f 75 6c 64 20 67 65  size we could ge
4b10: 74 0a 20 20 20 20 20 2a 20 6f 6e 65 20 6d 6f 72  t.     * one mor
4b20: 65 20 62 79 74 65 20 62 79 20 61 76 6f 69 64 69  e byte by avoidi
4b30: 6e 67 20 54 63 6c 5f 44 53 74 72 69 6e 67 53 65  ng Tcl_DStringSe
4b40: 74 4c 65 6e 67 74 68 28 29 20 61 6e 64 20 6a 75  tLength() and ju
4b50: 73 74 20 73 65 74 74 69 6e 67 0a 20 20 20 20 20  st setting.     
4b60: 2a 20 6c 65 6e 67 74 68 20 74 6f 20 54 43 4c 5f  * length to TCL_
4b70: 44 53 54 52 49 4e 47 5f 53 54 41 54 49 43 5f 53  DSTRING_STATIC_S
4b80: 49 5a 45 2c 20 62 75 74 20 74 68 69 73 20 73 68  IZE, but this sh
4b90: 6f 75 6c 64 20 62 65 20 73 61 66 65 72 20 69 66  ould be safer if
4ba0: 20 74 68 65 0a 20 20 20 20 20 2a 20 69 6d 70 6c   the.     * impl
4bb0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 44 73  ementation of Ds
4bc0: 74 72 69 6e 67 73 20 63 68 61 6e 67 65 73 2e 0a  trings changes..
4bd0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
4be0: 69 73 20 61 6c 6c 6f 77 73 20 73 68 6f 72 74 20  is allows short 
4bf0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 72 65 61  values to be rea
4c00: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 67 69 73  d from the regis
4c10: 74 79 20 69 6e 20 6f 6e 65 20 63 61 6c 6c 2e 0a  ty in one call..
4c20: 20 20 20 20 20 2a 20 4c 6f 6e 67 65 72 20 76 61       * Longer va
4c30: 6c 75 65 73 20 6e 65 65 64 20 61 20 73 65 63 6f  lues need a seco
4c40: 6e 64 20 63 61 6c 6c 20 77 69 74 68 20 61 6e 20  nd call with an 
4c50: 65 78 70 61 6e 64 65 64 20 44 53 74 72 69 6e 67  expanded DString
4c60: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54  ..     */..    T
4c70: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
4c80: 64 61 74 61 29 3b 0a 20 20 20 20 54 63 6c 5f 44  data);.    Tcl_D
4c90: 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28  StringSetLength(
4ca0: 26 64 61 74 61 2c 20 54 43 4c 5f 44 53 54 52 49  &data, TCL_DSTRI
4cb0: 4e 47 5f 53 54 41 54 49 43 5f 53 49 5a 45 20 2d  NG_STATIC_SIZE -
4cc0: 20 31 29 3b 0a 20 20 20 20 6c 65 6e 67 74 68 20   1);.    length 
4cd0: 3d 20 54 43 4c 5f 44 53 54 52 49 4e 47 5f 53 54  = TCL_DSTRING_ST
4ce0: 41 54 49 43 5f 53 49 5a 45 2f 73 69 7a 65 6f 66  ATIC_SIZE/sizeof
4cf0: 28 54 43 48 41 52 29 20 2d 20 31 3b 0a 0a 20 20  (TCHAR) - 1;..  
4d00: 20 20 76 61 6c 75 65 4e 61 6d 65 20 3d 20 54 63    valueName = Tc
4d10: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
4d20: 62 6a 28 76 61 6c 75 65 4e 61 6d 65 4f 62 6a 2c  bj(valueNameObj,
4d30: 20 26 6e 61 6d 65 4c 65 6e 29 3b 0a 20 20 20 20   &nameLen);.    
4d40: 6e 61 74 69 76 65 56 61 6c 75 65 20 3d 20 54 63  nativeValue = Tc
4d50: 6c 5f 57 69 6e 55 74 66 54 6f 54 43 68 61 72 28  l_WinUtfToTChar(
4d60: 76 61 6c 75 65 4e 61 6d 65 2c 20 6e 61 6d 65 4c  valueName, nameL
4d70: 65 6e 2c 20 26 62 75 66 29 3b 0a 0a 20 20 20 20  en, &buf);..    
4d80: 72 65 73 75 6c 74 20 3d 20 52 65 67 51 75 65 72  result = RegQuer
4d90: 79 56 61 6c 75 65 45 78 28 6b 65 79 2c 20 6e 61  yValueEx(key, na
4da0: 74 69 76 65 56 61 6c 75 65 2c 20 4e 55 4c 4c 2c  tiveValue, NULL,
4db0: 20 26 74 79 70 65 2c 0a 09 20 20 20 20 28 42 59   &type,..    (BY
4dc0: 54 45 20 2a 29 20 54 63 6c 5f 44 53 74 72 69 6e  TE *) Tcl_DStrin
4dd0: 67 56 61 6c 75 65 28 26 64 61 74 61 29 2c 20 26  gValue(&data), &
4de0: 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 77 68 69  length);.    whi
4df0: 6c 65 20 28 72 65 73 75 6c 74 20 3d 3d 20 45 52  le (result == ER
4e00: 52 4f 52 5f 4d 4f 52 45 5f 44 41 54 41 29 20 7b  ROR_MORE_DATA) {
4e10: 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 57 69 6e  ../*.. * The Win
4e20: 64 6f 77 73 20 64 6f 63 73 20 73 61 79 20 74 68  dows docs say th
4e30: 61 74 20 69 6e 20 74 68 69 73 20 65 72 72 6f 72  at in this error
4e40: 20 63 61 73 65 2c 20 77 65 20 6a 75 73 74 20 6e   case, we just n
4e50: 65 65 64 20 74 6f 0a 09 20 2a 20 65 78 70 61 6e  eed to.. * expan
4e60: 64 20 6f 75 72 20 62 75 66 66 65 72 20 61 6e 64  d our buffer and
4e70: 20 72 65 71 75 65 73 74 20 6d 6f 72 65 20 64 61   request more da
4e80: 74 61 2e 20 52 65 71 75 69 72 65 64 20 66 6f 72  ta. Required for
4e90: 0a 09 20 2a 20 48 4b 45 59 5f 50 45 52 46 4f 52  .. * HKEY_PERFOR
4ea0: 4d 41 4e 43 45 5f 44 41 54 41 0a 09 20 2a 2f 0a  MANCE_DATA.. */.
4eb0: 0a 09 6c 65 6e 67 74 68 20 3d 20 54 63 6c 5f 44  ..length = Tcl_D
4ec0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 61  StringLength(&da
4ed0: 74 61 29 20 2a 20 28 32 20 2f 20 73 69 7a 65 6f  ta) * (2 / sizeo
4ee0: 66 28 54 43 48 41 52 29 29 3b 0a 09 54 63 6c 5f  f(TCHAR));..Tcl_
4ef0: 44 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68  DStringSetLength
4f00: 28 26 64 61 74 61 2c 20 28 69 6e 74 29 20 6c 65  (&data, (int) le
4f10: 6e 67 74 68 20 2a 20 73 69 7a 65 6f 66 28 54 43  ngth * sizeof(TC
4f20: 48 41 52 29 29 3b 0a 09 72 65 73 75 6c 74 20 3d  HAR));..result =
4f30: 20 52 65 67 51 75 65 72 79 56 61 6c 75 65 45 78   RegQueryValueEx
4f40: 28 6b 65 79 2c 20 6e 61 74 69 76 65 56 61 6c 75  (key, nativeValu
4f50: 65 2c 0a 09 09 4e 55 4c 4c 2c 20 26 74 79 70 65  e,...NULL, &type
4f60: 2c 20 28 42 59 54 45 20 2a 29 20 54 63 6c 5f 44  , (BYTE *) Tcl_D
4f70: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 61 74  StringValue(&dat
4f80: 61 29 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 20 20  a), &length);.  
4f90: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 72    }.    Tcl_DStr
4fa0: 69 6e 67 46 72 65 65 28 26 62 75 66 29 3b 0a 20  ingFree(&buf);. 
4fb0: 20 20 20 52 65 67 43 6c 6f 73 65 4b 65 79 28 6b     RegCloseKey(k
4fc0: 65 79 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73  ey);.    if (res
4fd0: 75 6c 74 20 21 3d 20 45 52 52 4f 52 5f 53 55 43  ult != ERROR_SUC
4fe0: 43 45 53 53 29 20 7b 0a 09 54 63 6c 5f 53 65 74  CESS) {..Tcl_Set
4ff0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
5000: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
5010: 0a 09 09 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  ..."unable to ge
5020: 74 20 76 61 6c 75 65 20 5c 22 25 73 5c 22 20 66  t value \"%s\" f
5030: 72 6f 6d 20 6b 65 79 20 5c 22 25 73 5c 22 3a 20  rom key \"%s\": 
5040: 22 2c 0a 09 09 54 63 6c 5f 47 65 74 53 74 72 69  ",...Tcl_GetStri
5050: 6e 67 28 76 61 6c 75 65 4e 61 6d 65 4f 62 6a 29  ng(valueNameObj)
5060: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
5070: 6b 65 79 4e 61 6d 65 4f 62 6a 29 29 29 3b 0a 09  keyNameObj)));..
5080: 41 70 70 65 6e 64 53 79 73 74 65 6d 45 72 72 6f  AppendSystemErro
5090: 72 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  r(interp, result
50a0: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
50b0: 72 65 65 28 26 64 61 74 61 29 3b 0a 09 72 65 74  ree(&data);..ret
50c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
50d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
50e0: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 20    * If the data 
50f0: 69 73 20 61 20 33 32 2d 62 69 74 20 71 75 61 6e  is a 32-bit quan
5100: 74 69 74 79 2c 20 73 74 6f 72 65 20 69 74 20 61  tity, store it a
5110: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 62 6a  s an integer obj
5120: 65 63 74 2e 20 49 66 20 69 74 0a 20 20 20 20 20  ect. If it.     
5130: 2a 20 69 73 20 61 20 6d 75 6c 74 69 2d 73 74 72  * is a multi-str
5140: 69 6e 67 2c 20 73 74 6f 72 65 20 69 74 20 61 73  ing, store it as
5150: 20 61 20 6c 69 73 74 20 6f 66 20 73 74 72 69 6e   a list of strin
5160: 67 73 2e 20 46 6f 72 20 6e 75 6c 6c 2d 74 65 72  gs. For null-ter
5170: 6d 69 6e 61 74 65 64 0a 20 20 20 20 20 2a 20 73  minated.     * s
5180: 74 72 69 6e 67 73 2c 20 61 70 70 65 6e 64 20 75  trings, append u
5190: 70 20 74 68 65 20 74 6f 20 66 69 72 73 74 20 6e  p the to first n
51a0: 75 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ull. Otherwise, 
51b0: 73 74 6f 72 65 20 69 74 20 61 73 20 61 20 62 69  store it as a bi
51c0: 6e 61 72 79 0a 20 20 20 20 20 2a 20 73 74 72 69  nary.     * stri
51d0: 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ng..     */..   
51e0: 20 69 66 20 28 74 79 70 65 20 3d 3d 20 52 45 47   if (type == REG
51f0: 5f 44 57 4f 52 44 20 7c 7c 20 74 79 70 65 20 3d  _DWORD || type =
5200: 3d 20 52 45 47 5f 44 57 4f 52 44 5f 42 49 47 5f  = REG_DWORD_BIG_
5210: 45 4e 44 49 41 4e 29 20 7b 0a 09 54 63 6c 5f 53  ENDIAN) {..Tcl_S
5220: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
5230: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
5240: 6a 28 28 69 6e 74 29 20 43 6f 6e 76 65 72 74 44  j((int) ConvertD
5250: 57 4f 52 44 28 74 79 70 65 2c 0a 09 09 2a 28 28  WORD(type,...*((
5260: 44 57 4f 52 44 20 2a 29 20 54 63 6c 5f 44 53 74  DWORD *) Tcl_DSt
5270: 72 69 6e 67 56 61 6c 75 65 28 26 64 61 74 61 29  ringValue(&data)
5280: 29 29 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ))));.    } else
5290: 20 69 66 20 28 74 79 70 65 20 3d 3d 20 52 45 47   if (type == REG
52a0: 5f 4d 55 4c 54 49 5f 53 5a 29 20 7b 0a 09 63 68  _MULTI_SZ) {..ch
52b0: 61 72 20 2a 70 20 3d 20 54 63 6c 5f 44 53 74 72  ar *p = Tcl_DStr
52c0: 69 6e 67 56 61 6c 75 65 28 26 64 61 74 61 29 3b  ingValue(&data);
52d0: 0a 09 63 68 61 72 20 2a 65 6e 64 20 3d 20 54 63  ..char *end = Tc
52e0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
52f0: 64 61 74 61 29 20 2b 20 6c 65 6e 67 74 68 3b 0a  data) + length;.
5300: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74  .Tcl_Obj *result
5310: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ptr = Tcl_NewObj
5320: 28 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 75 6c  ();.../*.. * Mul
5330: 74 69 73 74 72 69 6e 67 73 20 61 72 65 20 73 74  tistrings are st
5340: 6f 72 65 64 20 61 73 20 61 6e 20 61 72 72 61 79  ored as an array
5350: 20 6f 66 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61   of null-termina
5360: 74 65 64 20 73 74 72 69 6e 67 73 2c 0a 09 20 2a  ted strings,.. *
5370: 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 74   terminated by t
5380: 77 6f 20 6e 75 6c 6c 20 63 68 61 72 61 63 74 65  wo null characte
5390: 72 73 2e 20 41 6c 73 6f 20 64 6f 20 61 20 62 6f  rs. Also do a bo
53a0: 75 6e 64 73 20 63 68 65 63 6b 20 69 6e 20 63 61  unds check in ca
53b0: 73 65 0a 09 20 2a 20 77 65 20 67 65 74 20 62 6f  se.. * we get bo
53c0: 67 75 73 20 64 61 74 61 2e 0a 09 20 2a 2f 0a 0a  gus data... */..
53d0: 09 77 68 69 6c 65 20 28 28 70 20 3c 20 65 6e 64  .while ((p < end
53e0: 29 20 26 26 20 2a 28 28 54 63 6c 5f 55 6e 69 43  ) && *((Tcl_UniC
53f0: 68 61 72 20 2a 29 20 70 29 20 21 3d 20 30 29 20  har *) p) != 0) 
5400: 7b 0a 09 20 20 20 20 54 63 6c 5f 55 6e 69 43 68  {..    Tcl_UniCh
5410: 61 72 20 2a 75 70 3b 0a 0a 09 20 20 20 20 54 63  ar *up;...    Tc
5420: 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28  l_WinTCharToUtf(
5430: 28 54 43 48 41 52 20 2a 29 20 70 2c 20 2d 31 2c  (TCHAR *) p, -1,
5440: 20 26 62 75 66 29 3b 0a 09 20 20 20 20 54 63 6c   &buf);..    Tcl
5450: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5460: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65  ement(interp, re
5470: 73 75 6c 74 50 74 72 2c 0a 09 09 20 20 20 20 54  sultPtr,...    T
5480: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5490: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
54a0: 28 26 62 75 66 29 2c 0a 09 09 09 20 20 20 20 54  (&buf),....    T
54b0: 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68  cl_DStringLength
54c0: 28 26 62 75 66 29 29 29 3b 0a 09 20 20 20 20 75  (&buf)));..    u
54d0: 70 20 3d 20 28 54 63 6c 5f 55 6e 69 43 68 61 72  p = (Tcl_UniChar
54e0: 20 2a 29 20 70 3b 0a 0a 09 20 20 20 20 77 68 69   *) p;...    whi
54f0: 6c 65 20 28 2a 75 70 2b 2b 20 21 3d 20 30 29 20  le (*up++ != 0) 
5500: 7b 2f 2a 20 65 6d 70 74 79 20 62 6f 64 79 20 2a  {/* empty body *
5510: 2f 7d 0a 09 20 20 20 20 70 20 3d 20 28 63 68 61  /}..    p = (cha
5520: 72 20 2a 29 20 75 70 3b 0a 09 20 20 20 20 54 63  r *) up;..    Tc
5530: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 62  l_DStringFree(&b
5540: 75 66 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74  uf);..}..Tcl_Set
5550: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
5560: 2c 20 72 65 73 75 6c 74 50 74 72 29 3b 0a 20 20  , resultPtr);.  
5570: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 74 79    } else if ((ty
5580: 70 65 20 3d 3d 20 52 45 47 5f 53 5a 29 20 7c 7c  pe == REG_SZ) ||
5590: 20 28 74 79 70 65 20 3d 3d 20 52 45 47 5f 45 58   (type == REG_EX
55a0: 50 41 4e 44 5f 53 5a 29 29 20 7b 0a 09 54 63 6c  PAND_SZ)) {..Tcl
55b0: 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28  _WinTCharToUtf((
55c0: 54 43 48 41 52 20 2a 29 20 54 63 6c 5f 44 53 74  TCHAR *) Tcl_DSt
55d0: 72 69 6e 67 56 61 6c 75 65 28 26 64 61 74 61 29  ringValue(&data)
55e0: 2c 20 2d 31 2c 20 26 62 75 66 29 3b 0a 09 54 63  , -1, &buf);..Tc
55f0: 6c 5f 44 53 74 72 69 6e 67 52 65 73 75 6c 74 28  l_DStringResult(
5600: 69 6e 74 65 72 70 2c 20 26 62 75 66 29 3b 0a 20  interp, &buf);. 
5610: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a     } else {../*.
5620: 09 20 2a 20 53 61 76 65 20 62 69 6e 61 72 79 20  . * Save binary 
5630: 64 61 74 61 20 61 73 20 61 20 62 79 74 65 20 61  data as a byte a
5640: 72 72 61 79 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c  rray... */...Tcl
5650: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
5660: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
5670: 65 41 72 72 61 79 4f 62 6a 28 0a 09 09 28 42 59  eArrayObj(...(BY
5680: 54 45 20 2a 29 20 54 63 6c 5f 44 53 74 72 69 6e  TE *) Tcl_DStrin
5690: 67 56 61 6c 75 65 28 26 64 61 74 61 29 2c 20 28  gValue(&data), (
56a0: 69 6e 74 29 20 6c 65 6e 67 74 68 29 29 3b 0a 20  int) length));. 
56b0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74     }.    Tcl_DSt
56c0: 72 69 6e 67 46 72 65 65 28 26 64 61 74 61 29 3b  ringFree(&data);
56d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75  .    return resu
56e0: 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  lt;.}.../*. *---
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 56 61 6c  ---. *. * GetVal
5740: 75 65 4e 61 6d 65 73 20 2d 2d 0a 20 2a 0a 20 2a  ueNames --. *. *
5750: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65  .This function e
5760: 6e 75 6d 65 72 61 74 65 73 20 74 68 65 20 76 61  numerates the va
5770: 6c 75 65 73 20 6f 66 20 74 68 65 20 61 20 67 69  lues of the a gi
5780: 76 65 6e 20 6b 65 79 2e 20 49 66 20 74 68 65 0a  ven key. If the.
5790: 20 2a 09 6f 70 74 69 6f 6e 61 6c 20 70 61 74 74   *.optional patt
57a0: 65 72 6e 20 69 73 20 73 75 70 70 6c 69 65 64 2c  ern is supplied,
57b0: 20 74 68 65 6e 20 6f 6e 6c 79 20 76 61 6c 75 65   then only value
57c0: 20 6e 61 6d 65 73 20 74 68 61 74 20 6d 61 74 63   names that matc
57d0: 68 20 74 68 65 0a 20 2a 09 70 61 74 74 65 72 6e  h the. *.pattern
57e0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
57f0: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
5800: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65  :. *.Returns the
5810: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 20 6e   list of value n
5820: 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ames in the resu
5830: 6c 74 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 65  lt object of the
5840: 0a 20 2a 09 69 6e 74 65 72 70 72 65 74 65 72 2c  . *.interpreter,
5850: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   or an error mes
5860: 73 61 67 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  sage on failure.
5870: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5880: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
5890: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
58e0: 74 61 74 69 63 20 69 6e 74 0a 47 65 74 56 61 6c  tatic int.GetVal
58f0: 75 65 4e 61 6d 65 73 28 0a 20 20 20 20 54 63 6c  ueNames(.    Tcl
5900: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
5910: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74  ../* Current int
5920: 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20  erpreter. */.   
5930: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61 6d   Tcl_Obj *keyNam
5940: 65 4f 62 6a 2c 09 2f 2a 20 4b 65 79 20 74 6f 20  eObj,./* Key to 
5950: 65 6e 75 6d 65 72 61 74 65 2e 20 2a 2f 0a 20 20  enumerate. */.  
5960: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 74 65    Tcl_Obj *patte
5970: 72 6e 4f 62 6a 2c 09 2f 2a 20 4f 70 74 69 6f 6e  rnObj,./* Option
5980: 61 6c 20 6d 61 74 63 68 20 70 61 74 74 65 72 6e  al match pattern
5990: 2e 20 2a 2f 0a 20 20 20 20 52 45 47 53 41 4d 20  . */.    REGSAM 
59a0: 6d 6f 64 65 29 09 09 2f 2a 20 4d 6f 64 65 20 66  mode)../* Mode f
59b0: 6c 61 67 73 20 74 6f 20 70 61 73 73 2e 20 2a 2f  lags to pass. */
59c0: 0a 7b 0a 20 20 20 20 48 4b 45 59 20 6b 65 79 3b  .{.    HKEY key;
59d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65  .    Tcl_Obj *re
59e0: 73 75 6c 74 50 74 72 3b 0a 20 20 20 20 44 57 4f  sultPtr;.    DWO
59f0: 52 44 20 69 6e 64 65 78 2c 20 73 69 7a 65 2c 20  RD index, size, 
5a00: 72 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f  result;.    Tcl_
5a10: 44 53 74 72 69 6e 67 20 62 75 66 66 65 72 2c 20  DString buffer, 
5a20: 64 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ds;.    const ch
5a30: 61 72 20 2a 70 61 74 74 65 72 6e 2c 20 2a 6e 61  ar *pattern, *na
5a40: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  me;..    /*.    
5a50: 20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70   * Attempt to op
5a60: 65 6e 20 74 68 65 20 6b 65 79 20 66 6f 72 20 65  en the key for e
5a70: 6e 75 6d 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20  numeration..    
5a80: 20 2a 2f 0a 0a 20 20 20 20 6d 6f 64 65 20 7c 3d   */..    mode |=
5a90: 20 4b 45 59 5f 51 55 45 52 59 5f 56 41 4c 55 45   KEY_QUERY_VALUE
5aa0: 3b 0a 20 20 20 20 69 66 20 28 4f 70 65 6e 4b 65  ;.    if (OpenKe
5ab0: 79 28 69 6e 74 65 72 70 2c 20 6b 65 79 4e 61 6d  y(interp, keyNam
5ac0: 65 4f 62 6a 2c 20 6d 6f 64 65 2c 20 30 2c 20 26  eObj, mode, 0, &
5ad0: 6b 65 79 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  key) != TCL_OK) 
5ae0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
5af0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5b00: 72 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f  resultPtr = Tcl_
5b10: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63  NewObj();.    Tc
5b20: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 62  l_DStringInit(&b
5b30: 75 66 66 65 72 29 3b 0a 20 20 20 20 54 63 6c 5f  uffer);.    Tcl_
5b40: 44 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68  DStringSetLength
5b50: 28 26 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  (&buffer, (int) 
5b60: 28 4d 41 58 5f 4b 45 59 5f 4c 45 4e 47 54 48 20  (MAX_KEY_LENGTH 
5b70: 2a 20 73 69 7a 65 6f 66 28 54 43 48 41 52 29 29  * sizeof(TCHAR))
5b80: 29 3b 0a 20 20 20 20 69 6e 64 65 78 20 3d 20 30  );.    index = 0
5b90: 3b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54  ;.    result = T
5ba0: 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 20 28  CL_OK;..    if (
5bb0: 70 61 74 74 65 72 6e 4f 62 6a 29 20 7b 0a 09 70  patternObj) {..p
5bc0: 61 74 74 65 72 6e 20 3d 20 54 63 6c 5f 47 65 74  attern = Tcl_Get
5bd0: 53 74 72 69 6e 67 28 70 61 74 74 65 72 6e 4f 62  String(patternOb
5be0: 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  j);.    } else {
5bf0: 0a 09 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c  ..pattern = NULL
5c00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
5c10: 20 20 20 20 20 2a 20 45 6e 75 6d 65 72 61 74 65       * Enumerate
5c20: 20 74 68 65 20 76 61 6c 75 65 73 20 75 6e 64 65   the values unde
5c30: 72 20 74 68 65 20 67 69 76 65 6e 20 73 75 62 6b  r the given subk
5c40: 65 79 20 75 6e 74 69 6c 20 77 65 20 67 65 74 20  ey until we get 
5c50: 61 6e 20 65 72 72 6f 72 2c 0a 20 20 20 20 20 2a  an error,.     *
5c60: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
5c70: 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  end of the list.
5c80: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 6e 65   Note that we ne
5c90: 65 64 20 74 6f 20 72 65 73 65 74 20 73 69 7a 65  ed to reset size
5ca0: 20 61 66 74 65 72 0a 20 20 20 20 20 2a 20 65 61   after.     * ea
5cb0: 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63  ch iteration bec
5cc0: 61 75 73 65 20 52 65 67 45 6e 75 6d 56 61 6c 75  ause RegEnumValu
5cd0: 65 20 73 6d 61 73 68 65 73 20 74 68 65 20 6f 6c  e smashes the ol
5ce0: 64 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 2a 2f  d value..     */
5cf0: 0a 0a 20 20 20 20 73 69 7a 65 20 3d 20 4d 41 58  ..    size = MAX
5d00: 5f 4b 45 59 5f 4c 45 4e 47 54 48 3b 0a 20 20 20  _KEY_LENGTH;.   
5d10: 20 77 68 69 6c 65 20 28 52 65 67 45 6e 75 6d 56   while (RegEnumV
5d20: 61 6c 75 65 28 6b 65 79 2c 69 6e 64 65 78 2c 20  alue(key,index, 
5d30: 28 54 43 48 41 52 20 2a 29 54 63 6c 5f 44 53 74  (TCHAR *)Tcl_DSt
5d40: 72 69 6e 67 56 61 6c 75 65 28 26 62 75 66 66 65  ringValue(&buffe
5d50: 72 29 2c 0a 09 20 20 20 20 26 73 69 7a 65 2c 20  r),..    &size, 
5d60: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
5d70: 2c 20 4e 55 4c 4c 29 20 3d 3d 20 45 52 52 4f 52  , NULL) == ERROR
5d80: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 73 69 7a  _SUCCESS) {..siz
5d90: 65 20 2a 3d 20 73 69 7a 65 6f 66 28 54 43 48 41  e *= sizeof(TCHA
5da0: 52 29 3b 0a 0a 09 54 63 6c 5f 57 69 6e 54 43 68  R);...Tcl_WinTCh
5db0: 61 72 54 6f 55 74 66 28 28 54 43 48 41 52 20 2a  arToUtf((TCHAR *
5dc0: 29 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ) Tcl_DStringVal
5dd0: 75 65 28 26 62 75 66 66 65 72 29 2c 20 28 69 6e  ue(&buffer), (in
5de0: 74 29 20 73 69 7a 65 2c 0a 09 09 26 64 73 29 3b  t) size,...&ds);
5df0: 0a 09 6e 61 6d 65 20 3d 20 54 63 6c 5f 44 53 74  ..name = Tcl_DSt
5e00: 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29 3b 0a  ringValue(&ds);.
5e10: 09 69 66 20 28 21 70 61 74 74 65 72 6e 20 7c 7c  .if (!pattern ||
5e20: 20 54 63 6c 5f 53 74 72 69 6e 67 4d 61 74 63 68   Tcl_StringMatch
5e30: 28 6e 61 6d 65 2c 20 70 61 74 74 65 72 6e 29 29  (name, pattern))
5e40: 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d   {..    result =
5e50: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5e60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5e70: 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a 09 09 20  , resultPtr,... 
5e80: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5e90: 4f 62 6a 28 6e 61 6d 65 2c 20 54 63 6c 5f 44 53  Obj(name, Tcl_DS
5ea0: 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29  tringLength(&ds)
5eb0: 29 29 3b 0a 09 20 20 20 20 69 66 20 28 72 65 73  ));..    if (res
5ec0: 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ult != TCL_OK) {
5ed0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
5ee0: 65 65 28 26 64 73 29 3b 0a 09 09 62 72 65 61 6b  ee(&ds);...break
5ef0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 54 63 6c  ;..    }..}..Tcl
5f00: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
5f10: 29 3b 0a 0a 09 69 6e 64 65 78 2b 2b 3b 0a 09 73  );...index++;..s
5f20: 69 7a 65 20 3d 20 4d 41 58 5f 4b 45 59 5f 4c 45  ize = MAX_KEY_LE
5f30: 4e 47 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NGTH;.    }.    
5f40: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
5f50: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50  (interp, resultP
5f60: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  tr);.    Tcl_DSt
5f70: 72 69 6e 67 46 72 65 65 28 26 62 75 66 66 65 72  ringFree(&buffer
5f80: 29 3b 0a 20 20 20 20 52 65 67 43 6c 6f 73 65 4b  );.    RegCloseK
5f90: 65 79 28 6b 65 79 29 3b 0a 20 20 20 20 72 65 74  ey(key);.    ret
5fa0: 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a  urn result;.}...
5fb0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6000: 2a 20 4f 70 65 6e 4b 65 79 20 2d 2d 0a 20 2a 0a  * OpenKey --. *.
6010: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
6020: 20 6f 70 65 6e 73 20 74 68 65 20 73 70 65 63 69   opens the speci
6030: 66 69 65 64 20 6b 65 79 2e 20 54 68 69 73 20 66  fied key. This f
6040: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d  unction is a sim
6050: 70 6c 65 0a 20 2a 09 77 72 61 70 70 65 72 20 61  ple. *.wrapper a
6060: 72 6f 75 6e 64 20 50 61 72 73 65 4b 65 79 4e 61  round ParseKeyNa
6070: 6d 65 20 61 6e 64 20 4f 70 65 6e 53 75 62 4b 65  me and OpenSubKe
6080: 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  y.. *. * Results
6090: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65  :. *.Returns the
60a0: 20 6f 70 65 6e 65 64 20 6b 65 79 20 69 6e 20 74   opened key in t
60b0: 68 65 20 6b 65 79 50 74 72 20 61 72 67 75 6d 65  he keyPtr argume
60c0: 6e 74 20 61 6e 64 20 61 20 54 63 6c 20 72 65 73  nt and a Tcl res
60d0: 75 6c 74 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20  ult code.. *. * 
60e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
60f0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
6150: 6e 74 0a 4f 70 65 6e 4b 65 79 28 0a 20 20 20 20  nt.OpenKey(.    
6160: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6170: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
6180: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
6190: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79      Tcl_Obj *key
61a0: 4e 61 6d 65 4f 62 6a 2c 09 2f 2a 20 4b 65 79 20  NameObj,./* Key 
61b0: 74 6f 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  to open. */.    
61c0: 52 45 47 53 41 4d 20 6d 6f 64 65 2c 09 09 2f 2a  REGSAM mode,../*
61d0: 20 41 63 63 65 73 73 20 6d 6f 64 65 2e 20 2a 2f   Access mode. */
61e0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 2c 09  .    int flags,.
61f0: 09 09 2f 2a 20 30 20 6f 72 20 52 45 47 5f 43 52  ../* 0 or REG_CR
6200: 45 41 54 45 2e 20 2a 2f 0a 20 20 20 20 48 4b 45  EATE. */.    HKE
6210: 59 20 2a 6b 65 79 50 74 72 29 09 09 2f 2a 20 52  Y *keyPtr)../* R
6220: 65 74 75 72 6e 65 64 20 48 4b 45 59 2e 20 2a 2f  eturned HKEY. */
6230: 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  .{.    char *key
6240: 4e 61 6d 65 2c 20 2a 62 75 66 66 65 72 2c 20 2a  Name, *buffer, *
6250: 68 6f 73 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  hostName;.    in
6260: 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 48 4b  t length;.    HK
6270: 45 59 20 72 6f 6f 74 4b 65 79 3b 0a 20 20 20 20  EY rootKey;.    
6280: 44 57 4f 52 44 20 72 65 73 75 6c 74 3b 0a 0a 20  DWORD result;.. 
6290: 20 20 20 6b 65 79 4e 61 6d 65 20 3d 20 54 63 6c     keyName = Tcl
62a0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
62b0: 6a 28 6b 65 79 4e 61 6d 65 4f 62 6a 2c 20 26 6c  j(keyNameObj, &l
62c0: 65 6e 67 74 68 29 3b 0a 20 20 20 20 62 75 66 66  ength);.    buff
62d0: 65 72 20 3d 20 63 6b 61 6c 6c 6f 63 28 6c 65 6e  er = ckalloc(len
62e0: 67 74 68 20 2b 20 31 29 3b 0a 20 20 20 20 73 74  gth + 1);.    st
62f0: 72 63 70 79 28 62 75 66 66 65 72 2c 20 6b 65 79  rcpy(buffer, key
6300: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 72 65 73 75  Name);..    resu
6310: 6c 74 20 3d 20 50 61 72 73 65 4b 65 79 4e 61 6d  lt = ParseKeyNam
6320: 65 28 69 6e 74 65 72 70 2c 20 62 75 66 66 65 72  e(interp, buffer
6330: 2c 20 26 68 6f 73 74 4e 61 6d 65 2c 20 26 72 6f  , &hostName, &ro
6340: 6f 74 4b 65 79 2c 20 26 6b 65 79 4e 61 6d 65 29  otKey, &keyName)
6350: 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ;.    if (result
6360: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   == TCL_OK) {..r
6370: 65 73 75 6c 74 20 3d 20 4f 70 65 6e 53 75 62 4b  esult = OpenSubK
6380: 65 79 28 68 6f 73 74 4e 61 6d 65 2c 20 72 6f 6f  ey(hostName, roo
6390: 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 6d  tKey, keyName, m
63a0: 6f 64 65 2c 20 66 6c 61 67 73 2c 20 6b 65 79 50  ode, flags, keyP
63b0: 74 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74  tr);..if (result
63c0: 20 21 3d 20 45 52 52 4f 52 5f 53 55 43 43 45 53   != ERROR_SUCCES
63d0: 53 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  S) {..    Tcl_Se
63e0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
63f0: 70 2c 0a 09 09 20 20 20 20 54 63 6c 5f 4e 65 77  p,...    Tcl_New
6400: 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 61 62 6c  StringObj("unabl
6410: 65 20 74 6f 20 6f 70 65 6e 20 6b 65 79 3a 20 22  e to open key: "
6420: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 41 70 70  , -1));..    App
6430: 65 6e 64 53 79 73 74 65 6d 45 72 72 6f 72 28 69  endSystemError(i
6440: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 29 3b 0a  nterp, result);.
6450: 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43  .    result = TC
6460: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 20 65 6c 73 65  L_ERROR;..} else
6470: 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d   {..    result =
6480: 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 20 20 20 20   TCL_OK;..}.    
6490: 7d 0a 0a 20 20 20 20 63 6b 66 72 65 65 28 62 75  }..    ckfree(bu
64a0: 66 66 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ffer);.    retur
64b0: 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a  n result;.}.../*
64c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6510: 4f 70 65 6e 53 75 62 4b 65 79 20 2d 2d 0a 20 2a  OpenSubKey --. *
6520: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
6530: 6e 20 6f 70 65 6e 73 20 61 20 67 69 76 65 6e 20  n opens a given 
6540: 73 75 62 6b 65 79 20 6f 66 20 61 20 72 6f 6f 74  subkey of a root
6550: 20 6b 65 79 20 6f 6e 20 74 68 65 20 73 70 65 63   key on the spec
6560: 69 66 69 65 64 0a 20 2a 09 68 6f 73 74 2e 0a 20  ified. *.host.. 
6570: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
6580: 09 52 65 74 75 72 6e 73 20 74 68 65 20 6f 70 65  .Returns the ope
6590: 6e 65 64 20 6b 65 79 20 69 6e 20 74 68 65 20 6b  ned key in the k
65a0: 65 79 50 74 72 20 61 6e 64 20 61 20 57 69 6e 64  eyPtr and a Wind
65b0: 6f 77 73 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ows error code a
65c0: 73 20 74 68 65 0a 20 2a 09 72 65 74 75 72 6e 20  s the. *.return 
65d0: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  value.. *. * Sid
65e0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
65f0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6640: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 44 57 4f 52   */..static DWOR
6650: 44 0a 4f 70 65 6e 53 75 62 4b 65 79 28 0a 20 20  D.OpenSubKey(.  
6660: 20 20 63 68 61 72 20 2a 68 6f 73 74 4e 61 6d 65    char *hostName
6670: 2c 09 09 2f 2a 20 48 6f 73 74 20 74 6f 20 61 63  ,../* Host to ac
6680: 63 65 73 73 2c 20 6f 72 20 4e 55 4c 4c 20 66 6f  cess, or NULL fo
6690: 72 20 6c 6f 63 61 6c 2e 20 2a 2f 0a 20 20 20 20  r local. */.    
66a0: 48 4b 45 59 20 72 6f 6f 74 4b 65 79 2c 09 09 2f  HKEY rootKey,../
66b0: 2a 20 52 6f 6f 74 20 72 65 67 69 73 74 72 79 20  * Root registry 
66c0: 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72  key. */.    char
66d0: 20 2a 6b 65 79 4e 61 6d 65 2c 09 09 2f 2a 20 53   *keyName,../* S
66e0: 75 62 6b 65 79 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ubkey name. */. 
66f0: 20 20 20 52 45 47 53 41 4d 20 6d 6f 64 65 2c 09     REGSAM mode,.
6700: 09 2f 2a 20 41 63 63 65 73 73 20 6d 6f 64 65 2e  ./* Access mode.
6710: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   */.    int flag
6720: 73 2c 09 09 09 2f 2a 20 30 20 6f 72 20 52 45 47  s,.../* 0 or REG
6730: 5f 43 52 45 41 54 45 2e 20 2a 2f 0a 20 20 20 20  _CREATE. */.    
6740: 48 4b 45 59 20 2a 6b 65 79 50 74 72 29 09 09 2f  HKEY *keyPtr)../
6750: 2a 20 52 65 74 75 72 6e 65 64 20 48 4b 45 59 2e  * Returned HKEY.
6760: 20 2a 2f 0a 7b 0a 20 20 20 20 44 57 4f 52 44 20   */.{.    DWORD 
6770: 72 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f  result;.    Tcl_
6780: 44 53 74 72 69 6e 67 20 62 75 66 3b 0a 0a 20 20  DString buf;..  
6790: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 74 74 65    /*.     * Atte
67a0: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  mpt to open the 
67b0: 72 6f 6f 74 20 6b 65 79 20 6f 6e 20 61 20 72 65  root key on a re
67c0: 6d 6f 74 65 20 68 6f 73 74 20 69 66 20 6e 65 63  mote host if nec
67d0: 65 73 73 61 72 79 2e 0a 20 20 20 20 20 2a 2f 0a  essary..     */.
67e0: 0a 20 20 20 20 69 66 20 28 68 6f 73 74 4e 61 6d  .    if (hostNam
67f0: 65 29 20 7b 0a 09 68 6f 73 74 4e 61 6d 65 20 3d  e) {..hostName =
6800: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 57 69   (char *) Tcl_Wi
6810: 6e 55 74 66 54 6f 54 43 68 61 72 28 68 6f 73 74  nUtfToTChar(host
6820: 4e 61 6d 65 2c 20 2d 31 2c 20 26 62 75 66 29 3b  Name, -1, &buf);
6830: 0a 09 72 65 73 75 6c 74 20 3d 20 52 65 67 43 6f  ..result = RegCo
6840: 6e 6e 65 63 74 52 65 67 69 73 74 72 79 28 28 54  nnectRegistry((T
6850: 43 48 41 52 20 2a 29 68 6f 73 74 4e 61 6d 65 2c  CHAR *)hostName,
6860: 20 72 6f 6f 74 4b 65 79 2c 0a 09 09 26 72 6f 6f   rootKey,...&roo
6870: 74 4b 65 79 29 3b 0a 09 54 63 6c 5f 44 53 74 72  tKey);..Tcl_DStr
6880: 69 6e 67 46 72 65 65 28 26 62 75 66 29 3b 0a 09  ingFree(&buf);..
6890: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 45 52  if (result != ER
68a0: 52 4f 52 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  ROR_SUCCESS) {..
68b0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
68c0: 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  t;..}.    }..   
68d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20 6f   /*.     * Now o
68e0: 70 65 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  pen the specifie
68f0: 64 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 72  d key with the r
6900: 65 71 75 65 73 74 65 64 20 70 65 72 6d 69 73 73  equested permiss
6910: 69 6f 6e 73 2e 20 4e 6f 74 65 20 74 68 61 74 0a  ions. Note that.
6920: 20 20 20 20 20 2a 20 74 68 69 73 20 6b 65 79 20       * this key 
6930: 6d 75 73 74 20 62 65 20 63 6c 6f 73 65 64 20 62  must be closed b
6940: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
6950: 20 20 20 2a 2f 0a 0a 20 20 20 20 6b 65 79 4e 61     */..    keyNa
6960: 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  me = (char *) Tc
6970: 6c 5f 57 69 6e 55 74 66 54 6f 54 43 68 61 72 28  l_WinUtfToTChar(
6980: 6b 65 79 4e 61 6d 65 2c 20 2d 31 2c 20 26 62 75  keyName, -1, &bu
6990: 66 29 3b 0a 20 20 20 20 69 66 20 28 66 6c 61 67  f);.    if (flag
69a0: 73 20 26 20 52 45 47 5f 43 52 45 41 54 45 29 20  s & REG_CREATE) 
69b0: 7b 0a 09 44 57 4f 52 44 20 63 72 65 61 74 65 3b  {..DWORD create;
69c0: 0a 0a 09 72 65 73 75 6c 74 20 3d 20 52 65 67 43  ...result = RegC
69d0: 72 65 61 74 65 4b 65 79 45 78 28 72 6f 6f 74 4b  reateKeyEx(rootK
69e0: 65 79 2c 20 28 54 43 48 41 52 20 2a 29 6b 65 79  ey, (TCHAR *)key
69f0: 4e 61 6d 65 2c 20 30 2c 20 4e 55 4c 4c 2c 0a 09  Name, 0, NULL,..
6a00: 09 52 45 47 5f 4f 50 54 49 4f 4e 5f 4e 4f 4e 5f  .REG_OPTION_NON_
6a10: 56 4f 4c 41 54 49 4c 45 2c 20 6d 6f 64 65 2c 20  VOLATILE, mode, 
6a20: 4e 55 4c 4c 2c 20 6b 65 79 50 74 72 2c 20 26 63  NULL, keyPtr, &c
6a30: 72 65 61 74 65 29 3b 0a 20 20 20 20 7d 20 65 6c  reate);.    } el
6a40: 73 65 20 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d  se if (rootKey =
6a50: 3d 20 48 4b 45 59 5f 50 45 52 46 4f 52 4d 41 4e  = HKEY_PERFORMAN
6a60: 43 45 5f 44 41 54 41 29 20 7b 0a 09 2f 2a 0a 09  CE_DATA) {../*..
6a70: 20 2a 20 48 65 72 65 20 77 65 20 66 75 64 67 65   * Here we fudge
6a80: 20 69 74 20 66 6f 72 20 74 68 69 73 20 73 70 65   it for this spe
6a90: 63 69 61 6c 20 72 6f 6f 74 20 6b 65 79 2e 20 53  cial root key. S
6aa0: 65 65 20 4d 53 44 4e 20 66 6f 72 20 6d 6f 72 65  ee MSDN for more
6ab0: 20 69 6e 66 6f 0a 09 20 2a 20 6f 6e 20 48 4b 45   info.. * on HKE
6ac0: 59 5f 50 45 52 46 4f 52 4d 41 4e 43 45 5f 44 41  Y_PERFORMANCE_DA
6ad0: 54 41 20 61 6e 64 20 74 68 65 20 70 65 63 75 6c  TA and the pecul
6ae0: 69 61 72 69 74 69 65 73 20 73 75 72 72 6f 75 6e  iarities surroun
6af0: 64 69 6e 67 20 69 74 2e 0a 09 20 2a 2f 0a 0a 09  ding it... */...
6b00: 2a 6b 65 79 50 74 72 20 3d 20 48 4b 45 59 5f 50  *keyPtr = HKEY_P
6b10: 45 52 46 4f 52 4d 41 4e 43 45 5f 44 41 54 41 3b  ERFORMANCE_DATA;
6b20: 0a 09 72 65 73 75 6c 74 20 3d 20 45 52 52 4f 52  ..result = ERROR
6b30: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20  _SUCCESS;.    } 
6b40: 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d  else {..result =
6b50: 20 52 65 67 4f 70 65 6e 4b 65 79 45 78 28 72 6f   RegOpenKeyEx(ro
6b60: 6f 74 4b 65 79 2c 20 28 54 43 48 41 52 20 2a 29  otKey, (TCHAR *)
6b70: 6b 65 79 4e 61 6d 65 2c 20 30 2c 20 6d 6f 64 65  keyName, 0, mode
6b80: 2c 0a 09 09 6b 65 79 50 74 72 29 3b 0a 20 20 20  ,...keyPtr);.   
6b90: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69   }.    Tcl_DStri
6ba0: 6e 67 46 72 65 65 28 26 62 75 66 29 3b 0a 0a 20  ngFree(&buf);.. 
6bb0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 65 20     /*.     * Be 
6bc0: 73 75 72 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  sure to close th
6bd0: 65 20 72 6f 6f 74 20 6b 65 79 20 73 69 6e 63 65  e root key since
6be0: 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74   we are done wit
6bf0: 68 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 2a  h it now..     *
6c00: 2f 0a 0a 20 20 20 20 69 66 20 28 68 6f 73 74 4e  /..    if (hostN
6c10: 61 6d 65 29 20 7b 0a 09 52 65 67 43 6c 6f 73 65  ame) {..RegClose
6c20: 4b 65 79 28 72 6f 6f 74 4b 65 79 29 3b 0a 20 20  Key(rootKey);.  
6c30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
6c40: 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  esult;.}.../*. *
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 72  ------. *. * Par
6ca0: 73 65 4b 65 79 4e 61 6d 65 20 2d 2d 0a 20 2a 0a  seKeyName --. *.
6cb0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
6cc0: 20 70 61 72 73 65 73 20 61 20 6b 65 79 20 6e 61   parses a key na
6cd0: 6d 65 20 69 6e 74 6f 20 74 68 65 20 68 6f 73 74  me into the host
6ce0: 2c 20 72 6f 6f 74 2c 20 61 6e 64 20 73 75 62 6b  , root, and subk
6cf0: 65 79 20 70 61 72 74 73 2e 0a 20 2a 0a 20 2a 20  ey parts.. *. * 
6d00: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20  Results:. *.The 
6d10: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
6d20: 73 74 61 72 74 20 6f 66 20 74 68 65 20 68 6f 73  start of the hos
6d30: 74 20 61 6e 64 20 73 75 62 6b 65 79 20 6e 61 6d  t and subkey nam
6d40: 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
6d50: 69 6e 0a 20 2a 09 74 68 65 20 68 6f 73 74 4e 61  in. *.the hostNa
6d60: 6d 65 50 74 72 20 61 6e 64 20 6b 65 79 4e 61 6d  mePtr and keyNam
6d70: 65 50 74 72 20 76 61 72 69 61 62 6c 65 73 2e 20  ePtr variables. 
6d80: 54 68 65 20 73 70 65 63 69 66 69 65 64 20 72 6f  The specified ro
6d90: 6f 74 20 48 4b 45 59 20 69 73 0a 20 2a 09 72 65  ot HKEY is. *.re
6da0: 74 75 72 6e 65 64 20 69 6e 20 72 6f 6f 74 4b 65  turned in rootKe
6db0: 79 50 74 72 2e 20 52 65 74 75 72 6e 73 20 61 20  yPtr. Returns a 
6dc0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6dd0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
6de0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 6f 64 69  effects:. *.Modi
6df0: 66 69 65 73 20 74 68 65 20 6e 61 6d 65 20 73 74  fies the name st
6e00: 72 69 6e 67 20 62 79 20 69 6e 73 65 72 74 69 6e  ring by insertin
6e10: 67 20 6e 75 6c 6c 73 2e 0a 20 2a 0a 20 2a 2d 2d  g nulls.. *. *--
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
6e70: 20 69 6e 74 0a 50 61 72 73 65 4b 65 79 4e 61 6d   int.ParseKeyNam
6e80: 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  e(.    Tcl_Inter
6e90: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43  p *interp,../* C
6ea0: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  urrent interpret
6eb0: 65 72 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  er. */.    char 
6ec0: 2a 6e 61 6d 65 2c 0a 20 20 20 20 63 68 61 72 20  *name,.    char 
6ed0: 2a 2a 68 6f 73 74 4e 61 6d 65 50 74 72 2c 0a 20  **hostNamePtr,. 
6ee0: 20 20 20 48 4b 45 59 20 2a 72 6f 6f 74 4b 65 79     HKEY *rootKey
6ef0: 50 74 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 2a  Ptr,.    char **
6f00: 6b 65 79 4e 61 6d 65 50 74 72 29 0a 7b 0a 20 20  keyNamePtr).{.  
6f10: 20 20 63 68 61 72 20 2a 72 6f 6f 74 4e 61 6d 65    char *rootName
6f20: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74  ;.    int result
6f30: 2c 20 69 6e 64 65 78 3b 0a 20 20 20 20 54 63 6c  , index;.    Tcl
6f40: 5f 4f 62 6a 20 2a 72 6f 6f 74 4f 62 6a 3b 0a 0a  _Obj *rootObj;..
6f50: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 70      /*.     * Sp
6f60: 6c 69 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f  lit the key into
6f70: 20 68 6f 73 74 20 61 6e 64 20 72 6f 6f 74 20 70   host and root p
6f80: 6f 72 74 69 6f 6e 73 2e 0a 20 20 20 20 20 2a 2f  ortions..     */
6f90: 0a 0a 20 20 20 20 2a 68 6f 73 74 4e 61 6d 65 50  ..    *hostNameP
6fa0: 74 72 20 3d 20 2a 6b 65 79 4e 61 6d 65 50 74 72  tr = *keyNamePtr
6fb0: 20 3d 20 72 6f 6f 74 4e 61 6d 65 20 3d 20 4e 55   = rootName = NU
6fc0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6e 61 6d 65  LL;.    if (name
6fd0: 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09  [0] == '\\') {..
6fe0: 69 66 20 28 6e 61 6d 65 5b 31 5d 20 3d 3d 20 27  if (name[1] == '
6ff0: 5c 5c 27 29 20 7b 0a 09 20 20 20 20 2a 68 6f 73  \\') {..    *hos
7000: 74 4e 61 6d 65 50 74 72 20 3d 20 6e 61 6d 65 3b  tNamePtr = name;
7010: 0a 09 20 20 20 20 66 6f 72 20 28 72 6f 6f 74 4e  ..    for (rootN
7020: 61 6d 65 20 3d 20 6e 61 6d 65 2b 32 3b 20 2a 72  ame = name+2; *r
7030: 6f 6f 74 4e 61 6d 65 20 21 3d 20 27 5c 30 27 3b  ootName != '\0';
7040: 20 72 6f 6f 74 4e 61 6d 65 2b 2b 29 20 7b 0a 09   rootName++) {..
7050: 09 69 66 20 28 2a 72 6f 6f 74 4e 61 6d 65 20 3d  .if (*rootName =
7060: 3d 20 27 5c 5c 27 29 20 7b 0a 09 09 20 20 20 20  = '\\') {...    
7070: 2a 72 6f 6f 74 4e 61 6d 65 2b 2b 20 3d 20 27 5c  *rootName++ = '\
7080: 30 27 3b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b  0';...    break;
7090: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  ...}..    }..}. 
70a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 6f 6f     } else {..roo
70b0: 74 4e 61 6d 65 20 3d 20 6e 61 6d 65 3b 0a 20 20  tName = name;.  
70c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 6f 6f    }.    if (!roo
70d0: 74 4e 61 6d 65 29 20 7b 0a 09 54 63 6c 5f 53 65  tName) {..Tcl_Se
70e0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
70f0: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  p, Tcl_ObjPrintf
7100: 28 0a 09 09 22 62 61 64 20 6b 65 79 20 5c 22 25  (..."bad key \"%
7110: 73 5c 22 3a 20 6d 75 73 74 20 73 74 61 72 74 20  s\": must start 
7120: 77 69 74 68 20 61 20 76 61 6c 69 64 20 72 6f 6f  with a valid roo
7130: 74 22 2c 20 6e 61 6d 65 29 29 3b 0a 09 54 63 6c  t", name));..Tcl
7140: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
7150: 74 65 72 70 2c 20 22 57 49 4e 5f 52 45 47 22 2c  terp, "WIN_REG",
7160: 20 22 4e 4f 5f 52 4f 4f 54 5f 4b 45 59 22 2c 20   "NO_ROOT_KEY", 
7170: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7180: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7190: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
71a0: 70 6c 69 74 20 74 68 65 20 72 6f 6f 74 20 69 6e  plit the root in
71b0: 74 6f 20 72 6f 6f 74 20 61 6e 64 20 73 75 62 6b  to root and subk
71c0: 65 79 20 70 6f 72 74 69 6f 6e 73 2e 0a 20 20 20  ey portions..   
71d0: 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 2a    */..    for (*
71e0: 6b 65 79 4e 61 6d 65 50 74 72 20 3d 20 72 6f 6f  keyNamePtr = roo
71f0: 74 4e 61 6d 65 3b 20 2a 2a 6b 65 79 4e 61 6d 65  tName; **keyName
7200: 50 74 72 20 21 3d 20 27 5c 30 27 3b 20 28 2a 6b  Ptr != '\0'; (*k
7210: 65 79 4e 61 6d 65 50 74 72 29 2b 2b 29 20 7b 0a  eyNamePtr)++) {.
7220: 09 69 66 20 28 2a 2a 6b 65 79 4e 61 6d 65 50 74  .if (**keyNamePt
7230: 72 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20  r == '\\') {..  
7240: 20 20 2a 2a 6b 65 79 4e 61 6d 65 50 74 72 20 3d    **keyNamePtr =
7250: 20 27 5c 30 27 3b 0a 09 20 20 20 20 28 2a 6b 65   '\0';..    (*ke
7260: 79 4e 61 6d 65 50 74 72 29 2b 2b 3b 0a 09 20 20  yNamePtr)++;..  
7270: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
7280: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
7290: 20 4c 6f 6f 6b 20 66 6f 72 20 61 20 6d 61 74 63   Look for a matc
72a0: 68 69 6e 67 20 72 6f 6f 74 20 6e 61 6d 65 2e 0a  hing root name..
72b0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 6f 6f       */..    roo
72c0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74  tObj = Tcl_NewSt
72d0: 72 69 6e 67 4f 62 6a 28 72 6f 6f 74 4e 61 6d 65  ringObj(rootName
72e0: 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 73 75 6c  , -1);.    resul
72f0: 74 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  t = Tcl_GetIndex
7300: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7310: 72 6f 6f 74 4f 62 6a 2c 20 72 6f 6f 74 4b 65 79  rootObj, rootKey
7320: 4e 61 6d 65 73 2c 20 22 72 6f 6f 74 20 6e 61 6d  Names, "root nam
7330: 65 22 2c 0a 09 20 20 20 20 54 43 4c 5f 45 58 41  e",..    TCL_EXA
7340: 43 54 2c 20 26 69 6e 64 65 78 29 3b 0a 20 20 20  CT, &index);.   
7350: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
7360: 74 28 72 6f 6f 74 4f 62 6a 29 3b 0a 20 20 20 20  t(rootObj);.    
7370: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43  if (result != TC
7380: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7390: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
73a0: 0a 20 20 20 20 2a 72 6f 6f 74 4b 65 79 50 74 72  .    *rootKeyPtr
73b0: 20 3d 20 72 6f 6f 74 4b 65 79 73 5b 69 6e 64 65   = rootKeys[inde
73c0: 78 5d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  x];.    return T
73d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
73e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7420: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 63  ------. *. * Rec
7430: 75 72 73 69 76 65 44 65 6c 65 74 65 4b 65 79 20  ursiveDeleteKey 
7440: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
7450: 6e 63 74 69 6f 6e 20 72 65 63 75 72 73 69 76 65  nction recursive
7460: 6c 79 20 64 65 6c 65 74 65 73 20 61 6c 6c 20 74  ly deletes all t
7470: 68 65 20 6b 65 79 73 20 62 65 6c 6f 77 20 61 20  he keys below a 
7480: 73 74 61 72 74 69 6e 67 20 6b 65 79 2e 0a 20 2a  starting key.. *
7490: 09 41 6c 74 68 6f 75 67 68 20 57 69 6e 64 6f 77  .Although Window
74a0: 73 20 39 35 20 64 6f 65 73 20 74 68 69 73 20 61  s 95 does this a
74b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 77 65  utomatically, we
74c0: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 64   still need to d
74d0: 6f 20 74 68 69 73 0a 20 2a 09 66 6f 72 20 57 69  o this. *.for Wi
74e0: 6e 64 6f 77 73 20 4e 54 2e 0a 20 2a 0a 20 2a 20  ndows NT.. *. * 
74f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75  Results:. *.Retu
7500: 72 6e 73 20 61 20 57 69 6e 64 6f 77 73 20 65 72  rns a Windows er
7510: 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20  ror code.. *. * 
7520: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
7530: 09 44 65 6c 65 74 65 73 20 61 6c 6c 20 6f 66 20  .Deletes all of 
7540: 74 68 65 20 6b 65 79 73 20 61 6e 64 20 76 61 6c  the keys and val
7550: 75 65 73 20 62 65 6c 6f 77 20 74 68 65 20 67 69  ues below the gi
7560: 76 65 6e 20 6b 65 79 2e 0a 20 2a 0a 20 2a 2d 2d  ven key.. *. *--
7570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
75c0: 20 44 57 4f 52 44 0a 52 65 63 75 72 73 69 76 65   DWORD.Recursive
75d0: 44 65 6c 65 74 65 4b 65 79 28 0a 20 20 20 20 48  DeleteKey(.    H
75e0: 4b 45 59 20 73 74 61 72 74 4b 65 79 2c 09 09 2f  KEY startKey,../
75f0: 2a 20 50 61 72 65 6e 74 20 6f 66 20 6b 65 79 20  * Parent of key 
7600: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 2a  to be deleted. *
7610: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41  /.    const TCHA
7620: 52 20 2a 6b 65 79 4e 61 6d 65 2c 09 2f 2a 20 4e  R *keyName,./* N
7630: 61 6d 65 20 6f 66 20 6b 65 79 20 74 6f 20 62 65  ame of key to be
7640: 20 64 65 6c 65 74 65 64 20 69 6e 20 65 78 74 65   deleted in exte
7650: 72 6e 61 6c 0a 09 09 09 09 20 2a 20 65 6e 63 6f  rnal..... * enco
7660: 64 69 6e 67 2c 20 6e 6f 74 20 55 54 46 2e 20 2a  ding, not UTF. *
7670: 2f 0a 20 20 20 20 52 45 47 53 41 4d 20 6d 6f 64  /.    REGSAM mod
7680: 65 29 09 09 2f 2a 20 4d 6f 64 65 20 66 6c 61 67  e)../* Mode flag
7690: 73 20 74 6f 20 70 61 73 73 2e 20 2a 2f 0a 7b 0a  s to pass. */.{.
76a0: 20 20 20 20 44 57 4f 52 44 20 72 65 73 75 6c 74      DWORD result
76b0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 54 63 6c 5f  , size;.    Tcl_
76c0: 44 53 74 72 69 6e 67 20 73 75 62 6b 65 79 3b 0a  DString subkey;.
76d0: 20 20 20 20 48 4b 45 59 20 68 4b 65 79 3b 0a 20      HKEY hKey;. 
76e0: 20 20 20 52 45 47 53 41 4d 20 73 61 76 65 4d 6f     REGSAM saveMo
76f0: 64 65 20 3d 20 6d 6f 64 65 3b 0a 20 20 20 20 73  de = mode;.    s
7700: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 45  tatic int checkE
7710: 78 50 72 6f 63 20 3d 20 30 3b 0a 20 20 20 20 73  xProc = 0;.    s
7720: 74 61 74 69 63 20 46 41 52 50 52 4f 43 20 72 65  tatic FARPROC re
7730: 67 44 65 6c 65 74 65 4b 65 79 45 78 50 72 6f 63  gDeleteKeyExProc
7740: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a   = NULL;..    /*
7750: 0a 20 20 20 20 20 2a 20 44 6f 20 6e 6f 74 20 61  .     * Do not a
7760: 6c 6c 6f 77 20 4e 55 4c 4c 20 6f 72 20 65 6d 70  llow NULL or emp
7770: 74 79 20 6b 65 79 20 6e 61 6d 65 2e 0a 20 20 20  ty key name..   
7780: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 6b    */..    if (!k
7790: 65 79 4e 61 6d 65 20 7c 7c 20 2a 6b 65 79 4e 61  eyName || *keyNa
77a0: 6d 65 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72  me == '\0') {..r
77b0: 65 74 75 72 6e 20 45 52 52 4f 52 5f 42 41 44 4b  eturn ERROR_BADK
77c0: 45 59 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  EY;.    }..    m
77d0: 6f 64 65 20 7c 3d 20 4b 45 59 5f 45 4e 55 4d 45  ode |= KEY_ENUME
77e0: 52 41 54 45 5f 53 55 42 5f 4b 45 59 53 20 7c 20  RATE_SUB_KEYS | 
77f0: 44 45 4c 45 54 45 20 7c 20 4b 45 59 5f 51 55 45  DELETE | KEY_QUE
7800: 52 59 5f 56 41 4c 55 45 3b 0a 20 20 20 20 72 65  RY_VALUE;.    re
7810: 73 75 6c 74 20 3d 20 52 65 67 4f 70 65 6e 4b 65  sult = RegOpenKe
7820: 79 45 78 28 73 74 61 72 74 4b 65 79 2c 20 6b 65  yEx(startKey, ke
7830: 79 4e 61 6d 65 2c 20 30 2c 20 6d 6f 64 65 2c 20  yName, 0, mode, 
7840: 26 68 4b 65 79 29 3b 0a 20 20 20 20 69 66 20 28  &hKey);.    if (
7850: 72 65 73 75 6c 74 20 21 3d 20 45 52 52 4f 52 5f  result != ERROR_
7860: 53 55 43 43 45 53 53 29 20 7b 0a 09 72 65 74 75  SUCCESS) {..retu
7870: 72 6e 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 7d  rn result;.    }
7880: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
7890: 67 49 6e 69 74 28 26 73 75 62 6b 65 79 29 3b 0a  gInit(&subkey);.
78a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 53      Tcl_DStringS
78b0: 65 74 4c 65 6e 67 74 68 28 26 73 75 62 6b 65 79  etLength(&subkey
78c0: 2c 20 28 69 6e 74 29 20 28 4d 41 58 5f 4b 45 59  , (int) (MAX_KEY
78d0: 5f 4c 45 4e 47 54 48 20 2a 20 73 69 7a 65 6f 66  _LENGTH * sizeof
78e0: 28 54 43 48 41 52 29 29 29 3b 0a 0a 20 20 20 20  (TCHAR)));..    
78f0: 6d 6f 64 65 20 3d 20 73 61 76 65 4d 6f 64 65 3b  mode = saveMode;
7900: 0a 20 20 20 20 77 68 69 6c 65 20 28 72 65 73 75  .    while (resu
7910: 6c 74 20 3d 3d 20 45 52 52 4f 52 5f 53 55 43 43  lt == ERROR_SUCC
7920: 45 53 53 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41  ESS) {../*.. * A
7930: 6c 77 61 79 73 20 67 65 74 20 69 6e 64 65 78 20  lways get index 
7940: 30 20 62 65 63 61 75 73 65 20 6b 65 79 20 64 65  0 because key de
7950: 6c 65 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 6f  letion changes o
7960: 72 64 65 72 69 6e 67 2e 0a 09 20 2a 2f 0a 0a 09  rdering... */...
7970: 73 69 7a 65 20 3d 20 4d 41 58 5f 4b 45 59 5f 4c  size = MAX_KEY_L
7980: 45 4e 47 54 48 3b 0a 09 72 65 73 75 6c 74 20 3d  ENGTH;..result =
7990: 20 52 65 67 45 6e 75 6d 4b 65 79 45 78 28 68 4b   RegEnumKeyEx(hK
79a0: 65 79 2c 20 30 2c 20 28 54 43 48 41 52 20 2a 29  ey, 0, (TCHAR *)
79b0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
79c0: 28 26 73 75 62 6b 65 79 29 2c 0a 09 09 26 73 69  (&subkey),...&si
79d0: 7a 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ze, NULL, NULL, 
79e0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
79f0: 20 28 72 65 73 75 6c 74 20 3d 3d 20 45 52 52 4f   (result == ERRO
7a00: 52 5f 4e 4f 5f 4d 4f 52 45 5f 49 54 45 4d 53 29  R_NO_MORE_ITEMS)
7a10: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
7a20: 20 2a 20 52 65 67 44 65 6c 65 74 65 4b 65 79 45   * RegDeleteKeyE
7a30: 78 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  x doesn't exist 
7a40: 6f 6e 20 6e 6f 6e 2d 36 34 62 69 74 20 58 50 20  on non-64bit XP 
7a50: 70 6c 61 74 66 6f 72 6d 73 2c 20 73 6f 20 77 65  platforms, so we
7a60: 0a 09 20 20 20 20 20 2a 20 63 61 6e 27 74 20 63  ..     * can't c
7a70: 6f 6d 70 69 6c 65 20 77 69 74 68 20 69 74 20 69  ompile with it i
7a80: 6e 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 63 68  n. We need to ch
7a90: 65 63 6b 20 66 6f 72 20 69 74 20 61 74 20 72 75  eck for it at ru
7aa0: 6e 74 69 6d 65 0a 09 20 20 20 20 20 2a 20 61 6e  ntime..     * an
7ab0: 64 20 75 73 65 20 69 74 20 69 66 20 77 65 20 66  d use it if we f
7ac0: 69 6e 64 20 69 74 2e 0a 09 20 20 20 20 20 2a 2f  ind it...     */
7ad0: 0a 0a 09 20 20 20 20 69 66 20 28 6d 6f 64 65 20  ...    if (mode 
7ae0: 26 26 20 21 63 68 65 63 6b 45 78 50 72 6f 63 29  && !checkExProc)
7af0: 20 7b 0a 09 09 48 49 4e 53 54 41 4e 43 45 20 64   {...HINSTANCE d
7b00: 6c 6c 48 3b 0a 0a 09 09 63 68 65 63 6b 45 78 50  llH;....checkExP
7b10: 72 6f 63 20 3d 20 31 3b 0a 09 09 64 6c 6c 48 20  roc = 1;...dllH 
7b20: 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45  = LoadLibrary(TE
7b30: 58 54 28 22 61 64 76 61 70 69 33 32 2e 64 6c 6c  XT("advapi32.dll
7b40: 22 29 29 3b 0a 09 09 69 66 20 28 64 6c 6c 48 29  "));...if (dllH)
7b50: 20 7b 0a 09 09 20 20 20 20 72 65 67 44 65 6c 65   {...    regDele
7b60: 74 65 4b 65 79 45 78 50 72 6f 63 20 3d 20 28 46  teKeyExProc = (F
7b70: 41 52 50 52 4f 43 29 0a 09 09 09 20 20 20 20 47  ARPROC)....    G
7b80: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 64 6c  etProcAddress(dl
7b90: 6c 48 2c 20 22 52 65 67 44 65 6c 65 74 65 4b 65  lH, "RegDeleteKe
7ba0: 79 45 78 57 22 29 3b 0a 09 09 7d 0a 09 20 20 20  yExW");...}..   
7bb0: 20 7d 0a 09 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
7bc0: 20 26 26 20 72 65 67 44 65 6c 65 74 65 4b 65 79   && regDeleteKey
7bd0: 45 78 50 72 6f 63 29 20 7b 0a 09 09 72 65 73 75  ExProc) {...resu
7be0: 6c 74 20 3d 20 72 65 67 44 65 6c 65 74 65 4b 65  lt = regDeleteKe
7bf0: 79 45 78 50 72 6f 63 28 73 74 61 72 74 4b 65 79  yExProc(startKey
7c00: 2c 20 6b 65 79 4e 61 6d 65 2c 20 6d 6f 64 65 2c  , keyName, mode,
7c10: 20 30 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65   0);..    } else
7c20: 20 7b 0a 09 09 72 65 73 75 6c 74 20 3d 20 52 65   {...result = Re
7c30: 67 44 65 6c 65 74 65 4b 65 79 28 73 74 61 72 74  gDeleteKey(start
7c40: 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0a 09  Key, keyName);..
7c50: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b      }..    break
7c60: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
7c70: 73 75 6c 74 20 3d 3d 20 45 52 52 4f 52 5f 53 55  sult == ERROR_SU
7c80: 43 43 45 53 53 29 20 7b 0a 09 20 20 20 20 72 65  CCESS) {..    re
7c90: 73 75 6c 74 20 3d 20 52 65 63 75 72 73 69 76 65  sult = Recursive
7ca0: 44 65 6c 65 74 65 4b 65 79 28 68 4b 65 79 2c 0a  DeleteKey(hKey,.
7cb0: 09 09 20 20 20 20 28 63 6f 6e 73 74 20 54 43 48  ..    (const TCH
7cc0: 41 52 20 2a 29 20 54 63 6c 5f 44 53 74 72 69 6e  AR *) Tcl_DStrin
7cd0: 67 56 61 6c 75 65 28 26 73 75 62 6b 65 79 29 2c  gValue(&subkey),
7ce0: 20 6d 6f 64 65 29 3b 0a 09 7d 0a 20 20 20 20 7d   mode);..}.    }
7cf0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
7d00: 46 72 65 65 28 26 73 75 62 6b 65 79 29 3b 0a 20  Free(&subkey);. 
7d10: 20 20 20 52 65 67 43 6c 6f 73 65 4b 65 79 28 68     RegCloseKey(h
7d20: 4b 65 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Key);.    return
7d30: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a   result;.}.../*.
7d40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
7d90: 65 74 56 61 6c 75 65 20 2d 2d 0a 20 2a 0a 20 2a  etValue --. *. *
7da0: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73  .This function s
7db0: 65 74 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ets the contents
7dc0: 20 6f 66 20 61 20 72 65 67 69 73 74 72 79 20 76   of a registry v
7dd0: 61 6c 75 65 2e 20 49 66 20 74 68 65 20 6b 65 79  alue. If the key
7de0: 20 6f 72 0a 20 2a 09 76 61 6c 75 65 20 64 6f 65   or. *.value doe
7df0: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
7e00: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 2e  will be created.
7e10: 20 49 66 20 69 74 20 64 6f 65 73 20 65 78 69 73   If it does exis
7e20: 74 2c 20 74 68 65 6e 20 74 68 65 0a 20 2a 09 64  t, then the. *.d
7e30: 61 74 61 20 61 6e 64 20 74 79 70 65 20 77 69 6c  ata and type wil
7e40: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 2e 0a 20  l be replaced.. 
7e50: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
7e60: 09 52 65 74 75 72 6e 73 20 61 20 6e 6f 72 6d 61  .Returns a norma
7e70: 6c 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  l Tcl result.. *
7e80: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
7e90: 3a 0a 20 2a 09 4d 61 79 20 63 72 65 61 74 65 20  :. *.May create 
7ea0: 6e 65 77 20 6b 65 79 73 20 6f 72 20 76 61 6c 75  new keys or valu
7eb0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7f00: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a   */..static int.
7f10: 53 65 74 56 61 6c 75 65 28 0a 20 20 20 20 54 63  SetValue(.    Tc
7f20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7f30: 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e  ,../* Current in
7f40: 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20  terpreter. */.  
7f50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4e 61    Tcl_Obj *keyNa
7f60: 6d 65 4f 62 6a 2c 09 2f 2a 20 4e 61 6d 65 20 6f  meObj,./* Name o
7f70: 66 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 54 63  f key. */.    Tc
7f80: 6c 5f 4f 62 6a 20 2a 76 61 6c 75 65 4e 61 6d 65  l_Obj *valueName
7f90: 4f 62 6a 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20  Obj,./* Name of 
7fa0: 76 61 6c 75 65 20 74 6f 20 73 65 74 2e 20 2a 2f  value to set. */
7fb0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 61  .    Tcl_Obj *da
7fc0: 74 61 4f 62 6a 2c 09 09 2f 2a 20 44 61 74 61 20  taObj,../* Data 
7fd0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 2e 20 2a  to be written. *
7fe0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74  /.    Tcl_Obj *t
7ff0: 79 70 65 4f 62 6a 2c 09 09 2f 2a 20 54 79 70 65  ypeObj,../* Type
8000: 20 6f 66 20 64 61 74 61 20 74 6f 20 62 65 20 77   of data to be w
8010: 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 20 20 52  ritten. */.    R
8020: 45 47 53 41 4d 20 6d 6f 64 65 29 09 09 2f 2a 20  EGSAM mode)../* 
8030: 4d 6f 64 65 20 66 6c 61 67 73 20 74 6f 20 70 61  Mode flags to pa
8040: 73 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74  ss. */.{.    int
8050: 20 74 79 70 65 2c 20 6c 65 6e 67 74 68 3b 0a 20   type, length;. 
8060: 20 20 20 44 57 4f 52 44 20 72 65 73 75 6c 74 3b     DWORD result;
8070: 0a 20 20 20 20 48 4b 45 59 20 6b 65 79 3b 0a 20  .    HKEY key;. 
8080: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76     const char *v
8090: 61 6c 75 65 4e 61 6d 65 3b 0a 20 20 20 20 54 63  alueName;.    Tc
80a0: 6c 5f 44 53 74 72 69 6e 67 20 6e 61 6d 65 42 75  l_DString nameBu
80b0: 66 3b 0a 0a 20 20 20 20 69 66 20 28 74 79 70 65  f;..    if (type
80c0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
80d0: 74 79 70 65 20 3d 20 52 45 47 5f 53 5a 3b 0a 20  type = REG_SZ;. 
80e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 54 63     } else if (Tc
80f0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
8100: 6a 28 69 6e 74 65 72 70 2c 20 74 79 70 65 4f 62  j(interp, typeOb
8110: 6a 2c 20 74 79 70 65 4e 61 6d 65 73 2c 20 22 74  j, typeNames, "t
8120: 79 70 65 22 2c 0a 09 20 20 20 20 30 2c 20 28 69  ype",..    0, (i
8130: 6e 74 20 2a 29 20 26 74 79 70 65 29 20 21 3d 20  nt *) &type) != 
8140: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 69 66 20 28 54  TCL_OK) {..if (T
8150: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
8160: 28 4e 55 4c 4c 2c 20 74 79 70 65 4f 62 6a 2c 20  (NULL, typeObj, 
8170: 28 69 6e 74 20 2a 29 20 26 74 79 70 65 29 20 21  (int *) &type) !
8180: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
8190: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
81a0: 52 3b 0a 09 7d 0a 09 54 63 6c 5f 52 65 73 65 74  R;..}..Tcl_Reset
81b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
81c0: 20 20 20 20 7d 0a 20 20 20 20 6d 6f 64 65 20 7c      }.    mode |
81d0: 3d 20 4b 45 59 5f 41 4c 4c 5f 41 43 43 45 53 53  = KEY_ALL_ACCESS
81e0: 3b 0a 20 20 20 20 69 66 20 28 4f 70 65 6e 4b 65  ;.    if (OpenKe
81f0: 79 28 69 6e 74 65 72 70 2c 20 6b 65 79 4e 61 6d  y(interp, keyNam
8200: 65 4f 62 6a 2c 20 6d 6f 64 65 2c 20 31 2c 20 26  eObj, mode, 1, &
8210: 6b 65 79 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  key) != TCL_OK) 
8220: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8230: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8240: 76 61 6c 75 65 4e 61 6d 65 20 3d 20 54 63 6c 5f  valueName = Tcl_
8250: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8260: 28 76 61 6c 75 65 4e 61 6d 65 4f 62 6a 2c 20 26  (valueNameObj, &
8270: 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 76 61 6c  length);.    val
8280: 75 65 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  ueName = (char *
8290: 29 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54 43  ) Tcl_WinUtfToTC
82a0: 68 61 72 28 76 61 6c 75 65 4e 61 6d 65 2c 20 6c  har(valueName, l
82b0: 65 6e 67 74 68 2c 20 26 6e 61 6d 65 42 75 66 29  ength, &nameBuf)
82c0: 3b 0a 0a 20 20 20 20 69 66 20 28 74 79 70 65 20  ;..    if (type 
82d0: 3d 3d 20 52 45 47 5f 44 57 4f 52 44 20 7c 7c 20  == REG_DWORD || 
82e0: 74 79 70 65 20 3d 3d 20 52 45 47 5f 44 57 4f 52  type == REG_DWOR
82f0: 44 5f 42 49 47 5f 45 4e 44 49 41 4e 29 20 7b 0a  D_BIG_ENDIAN) {.
8300: 09 69 6e 74 20 76 61 6c 75 65 3b 0a 0a 09 69 66  .int value;...if
8310: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
8320: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 64 61 74 61  Obj(interp, data
8330: 4f 62 6a 2c 20 26 76 61 6c 75 65 29 20 21 3d 20  Obj, &value) != 
8340: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 52  TCL_OK) {..    R
8350: 65 67 43 6c 6f 73 65 4b 65 79 28 6b 65 79 29 3b  egCloseKey(key);
8360: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
8370: 67 46 72 65 65 28 26 6e 61 6d 65 42 75 66 29 3b  gFree(&nameBuf);
8380: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
8390: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 76 61 6c  _ERROR;..}...val
83a0: 75 65 20 3d 20 43 6f 6e 76 65 72 74 44 57 4f 52  ue = ConvertDWOR
83b0: 44 28 28 44 57 4f 52 44 29 20 74 79 70 65 2c 20  D((DWORD) type, 
83c0: 28 44 57 4f 52 44 29 20 76 61 6c 75 65 29 3b 0a  (DWORD) value);.
83d0: 09 72 65 73 75 6c 74 20 3d 20 52 65 67 53 65 74  .result = RegSet
83e0: 56 61 6c 75 65 45 78 28 6b 65 79 2c 20 28 54 43  ValueEx(key, (TC
83f0: 48 41 52 20 2a 29 20 76 61 6c 75 65 4e 61 6d 65  HAR *) valueName
8400: 2c 20 30 2c 0a 09 09 28 44 57 4f 52 44 29 20 74  , 0,...(DWORD) t
8410: 79 70 65 2c 20 28 42 59 54 45 20 2a 29 20 26 76  ype, (BYTE *) &v
8420: 61 6c 75 65 2c 20 73 69 7a 65 6f 66 28 44 57 4f  alue, sizeof(DWO
8430: 52 44 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  RD));.    } else
8440: 20 69 66 20 28 74 79 70 65 20 3d 3d 20 52 45 47   if (type == REG
8450: 5f 4d 55 4c 54 49 5f 53 5a 29 20 7b 0a 09 54 63  _MULTI_SZ) {..Tc
8460: 6c 5f 44 53 74 72 69 6e 67 20 64 61 74 61 2c 20  l_DString data, 
8470: 62 75 66 3b 0a 09 69 6e 74 20 6f 62 6a 63 2c 20  buf;..int objc, 
8480: 69 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6f 62  i;..Tcl_Obj **ob
8490: 6a 76 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  jv;...if (Tcl_Li
84a0: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
84b0: 28 69 6e 74 65 72 70 2c 20 64 61 74 61 4f 62 6a  (interp, dataObj
84c0: 2c 20 26 6f 62 6a 63 2c 20 26 6f 62 6a 76 29 20  , &objc, &objv) 
84d0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
84e0: 20 20 52 65 67 43 6c 6f 73 65 4b 65 79 28 6b 65    RegCloseKey(ke
84f0: 79 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  y);..    Tcl_DSt
8500: 72 69 6e 67 46 72 65 65 28 26 6e 61 6d 65 42 75  ringFree(&nameBu
8510: 66 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  f);..    return 
8520: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
8530: 2f 2a 0a 09 20 2a 20 41 70 70 65 6e 64 20 74 68  /*.. * Append th
8540: 65 20 65 6c 65 6d 65 6e 74 73 20 61 73 20 6e 75  e elements as nu
8550: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ll terminated st
8560: 72 69 6e 67 73 2e 20 4e 6f 74 65 20 74 68 61 74  rings. Note that
8570: 20 77 65 20 6d 75 73 74 0a 09 20 2a 20 6e 6f 74   we must.. * not
8580: 20 61 73 73 75 6d 65 20 74 68 65 20 6c 65 6e 67   assume the leng
8590: 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  th of the string
85a0: 20 69 6e 20 63 61 73 65 20 74 68 65 72 65 20 61   in case there a
85b0: 72 65 20 65 6d 62 65 64 64 65 64 0a 09 20 2a 20  re embedded.. * 
85c0: 6e 75 6c 6c 73 2c 20 77 68 69 63 68 20 61 72 65  nulls, which are
85d0: 6e 27 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 52  n't allowed in R
85e0: 45 47 5f 4d 55 4c 54 49 5f 53 5a 20 76 61 6c 75  EG_MULTI_SZ valu
85f0: 65 73 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44  es... */...Tcl_D
8600: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 61 74 61  StringInit(&data
8610: 29 3b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  );..for (i = 0; 
8620: 69 20 3c 20 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b  i < objc; i++) {
8630: 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ..    const char
8640: 20 2a 62 79 74 65 73 20 3d 20 54 63 6c 5f 47 65   *bytes = Tcl_Ge
8650: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8660: 62 6a 76 5b 69 5d 2c 20 26 6c 65 6e 67 74 68 29  bjv[i], &length)
8670: 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  ;...    Tcl_DStr
8680: 69 6e 67 41 70 70 65 6e 64 28 26 64 61 74 61 2c  ingAppend(&data,
8690: 20 62 79 74 65 73 2c 20 6c 65 6e 67 74 68 29 3b   bytes, length);
86a0: 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
86b0: 2a 20 41 64 64 20 61 20 6e 75 6c 6c 20 63 68 61  * Add a null cha
86c0: 72 61 63 74 65 72 20 74 6f 20 73 65 70 61 72 61  racter to separa
86d0: 74 65 20 74 68 69 73 20 76 61 6c 75 65 20 66 72  te this value fr
86e0: 6f 6d 20 74 68 65 20 6e 65 78 74 2e 0a 09 20 20  om the next...  
86f0: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f     */...    Tcl_
8700: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
8710: 61 74 61 2c 20 22 22 2c 20 31 29 3b 09 2f 2a 20  ata, "", 1);./* 
8720: 4e 55 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  NUL-terminated s
8730: 74 72 69 6e 67 20 2a 2f 0a 09 7d 0a 0a 09 54 63  tring */..}...Tc
8740: 6c 5f 57 69 6e 55 74 66 54 6f 54 43 68 61 72 28  l_WinUtfToTChar(
8750: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
8760: 28 26 64 61 74 61 29 2c 20 54 63 6c 5f 44 53 74  (&data), Tcl_DSt
8770: 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 61 74 61  ringLength(&data
8780: 29 2b 31 2c 0a 09 09 26 62 75 66 29 3b 0a 09 72  )+1,...&buf);..r
8790: 65 73 75 6c 74 20 3d 20 52 65 67 53 65 74 56 61  esult = RegSetVa
87a0: 6c 75 65 45 78 28 6b 65 79 2c 20 28 54 43 48 41  lueEx(key, (TCHA
87b0: 52 20 2a 29 20 76 61 6c 75 65 4e 61 6d 65 2c 20  R *) valueName, 
87c0: 30 2c 0a 09 09 28 44 57 4f 52 44 29 20 74 79 70  0,...(DWORD) typ
87d0: 65 2c 20 28 42 59 54 45 20 2a 29 20 54 63 6c 5f  e, (BYTE *) Tcl_
87e0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 62 75  DStringValue(&bu
87f0: 66 29 2c 0a 09 09 28 44 57 4f 52 44 29 20 54 63  f),...(DWORD) Tc
8800: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28  l_DStringLength(
8810: 26 62 75 66 29 29 3b 0a 09 54 63 6c 5f 44 53 74  &buf));..Tcl_DSt
8820: 72 69 6e 67 46 72 65 65 28 26 64 61 74 61 29 3b  ringFree(&data);
8830: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
8840: 65 28 26 62 75 66 29 3b 0a 20 20 20 20 7d 20 65  e(&buf);.    } e
8850: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20  lse if (type == 
8860: 52 45 47 5f 53 5a 20 7c 7c 20 74 79 70 65 20 3d  REG_SZ || type =
8870: 3d 20 52 45 47 5f 45 58 50 41 4e 44 5f 53 5a 29  = REG_EXPAND_SZ)
8880: 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20   {..Tcl_DString 
8890: 62 75 66 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72  buf;..const char
88a0: 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74   *data = Tcl_Get
88b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 64 61  StringFromObj(da
88c0: 74 61 4f 62 6a 2c 20 26 6c 65 6e 67 74 68 29 3b  taObj, &length);
88d0: 0a 0a 09 64 61 74 61 20 3d 20 28 63 68 61 72 20  ...data = (char 
88e0: 2a 29 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54  *) Tcl_WinUtfToT
88f0: 43 68 61 72 28 64 61 74 61 2c 20 6c 65 6e 67 74  Char(data, lengt
8900: 68 2c 20 26 62 75 66 29 3b 0a 0a 09 2f 2a 0a 09  h, &buf);.../*..
8910: 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 20 6e   * Include the n
8920: 75 6c 6c 20 69 6e 20 74 68 65 20 6c 65 6e 67 74  ull in the lengt
8930: 68 2c 20 70 61 64 64 69 6e 67 20 69 66 20 6e 65  h, padding if ne
8940: 65 64 65 64 20 66 6f 72 20 55 6e 69 63 6f 64 65  eded for Unicode
8950: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74  ... */...Tcl_DSt
8960: 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 26 62  ringSetLength(&b
8970: 75 66 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c  uf, Tcl_DStringL
8980: 65 6e 67 74 68 28 26 62 75 66 29 2b 31 29 3b 0a  ength(&buf)+1);.
8990: 09 6c 65 6e 67 74 68 20 3d 20 54 63 6c 5f 44 53  .length = Tcl_DS
89a0: 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 62 75 66  tringLength(&buf
89b0: 29 20 2b 20 31 3b 0a 0a 09 72 65 73 75 6c 74 20  ) + 1;...result 
89c0: 3d 20 52 65 67 53 65 74 56 61 6c 75 65 45 78 28  = RegSetValueEx(
89d0: 6b 65 79 2c 20 28 54 43 48 41 52 20 2a 29 20 76  key, (TCHAR *) v
89e0: 61 6c 75 65 4e 61 6d 65 2c 20 30 2c 0a 09 09 28  alueName, 0,...(
89f0: 44 57 4f 52 44 29 20 74 79 70 65 2c 20 28 42 59  DWORD) type, (BY
8a00: 54 45 20 2a 29 20 64 61 74 61 2c 20 28 44 57 4f  TE *) data, (DWO
8a10: 52 44 29 20 6c 65 6e 67 74 68 29 3b 0a 09 54 63  RD) length);..Tc
8a20: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 62  l_DStringFree(&b
8a30: 75 66 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  uf);.    } else 
8a40: 7b 0a 09 42 59 54 45 20 2a 64 61 74 61 3b 0a 0a  {..BYTE *data;..
8a50: 09 2f 2a 0a 09 20 2a 20 53 74 6f 72 65 20 62 69  ./*.. * Store bi
8a60: 6e 61 72 79 20 64 61 74 61 20 69 6e 20 74 68 65  nary data in the
8a70: 20 72 65 67 69 73 74 72 79 2e 0a 09 20 2a 2f 0a   registry... */.
8a80: 0a 09 64 61 74 61 20 3d 20 28 42 59 54 45 20 2a  ..data = (BYTE *
8a90: 29 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  ) Tcl_GetByteArr
8aa0: 61 79 46 72 6f 6d 4f 62 6a 28 64 61 74 61 4f 62  ayFromObj(dataOb
8ab0: 6a 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 72 65  j, &length);..re
8ac0: 73 75 6c 74 20 3d 20 52 65 67 53 65 74 56 61 6c  sult = RegSetVal
8ad0: 75 65 45 78 28 6b 65 79 2c 20 28 54 43 48 41 52  ueEx(key, (TCHAR
8ae0: 20 2a 29 20 76 61 6c 75 65 4e 61 6d 65 2c 20 30   *) valueName, 0
8af0: 2c 0a 09 09 28 44 57 4f 52 44 29 20 74 79 70 65  ,...(DWORD) type
8b00: 2c 20 64 61 74 61 2c 20 28 44 57 4f 52 44 29 20  , data, (DWORD) 
8b10: 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 0a 0a  length);.    }..
8b20: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
8b30: 72 65 65 28 26 6e 61 6d 65 42 75 66 29 3b 0a 20  ree(&nameBuf);. 
8b40: 20 20 20 52 65 67 43 6c 6f 73 65 4b 65 79 28 6b     RegCloseKey(k
8b50: 65 79 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  ey);..    if (re
8b60: 73 75 6c 74 20 21 3d 20 45 52 52 4f 52 5f 53 55  sult != ERROR_SU
8b70: 43 43 45 53 53 29 20 7b 0a 09 54 63 6c 5f 53 65  CCESS) {..Tcl_Se
8b80: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
8b90: 70 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69  p,...Tcl_NewStri
8ba0: 6e 67 4f 62 6a 28 22 75 6e 61 62 6c 65 20 74 6f  ngObj("unable to
8bb0: 20 73 65 74 20 76 61 6c 75 65 3a 20 22 2c 20 2d   set value: ", -
8bc0: 31 29 29 3b 0a 09 41 70 70 65 6e 64 53 79 73 74  1));..AppendSyst
8bd0: 65 6d 45 72 72 6f 72 28 69 6e 74 65 72 70 2c 20  emError(interp, 
8be0: 72 65 73 75 6c 74 29 3b 0a 09 72 65 74 75 72 6e  result);..return
8bf0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8c00: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
8c10: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c60: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 72 6f 61 64  ----. *. * Broad
8c70: 63 61 73 74 56 61 6c 75 65 20 2d 2d 0a 20 2a 0a  castValue --. *.
8c80: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
8c90: 20 62 72 6f 61 64 63 61 73 74 73 20 61 20 57 4d   broadcasts a WM
8ca0: 5f 53 45 54 54 49 4e 47 43 48 41 4e 47 45 20 6d  _SETTINGCHANGE m
8cb0: 65 73 73 61 67 65 20 74 6f 20 69 6e 64 69 63 61  essage to indica
8cc0: 74 65 20 74 6f 0a 20 2a 09 6f 74 68 65 72 20 70  te to. *.other p
8cd0: 72 6f 67 72 61 6d 73 20 74 68 61 74 20 77 65 20  rograms that we 
8ce0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 74 68 65  have changed the
8cf0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 72   contents of a r
8d00: 65 67 69 73 74 72 79 20 76 61 6c 75 65 2e 0a 20  egistry value.. 
8d10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
8d20: 09 52 65 74 75 72 6e 73 20 61 20 6e 6f 72 6d 61  .Returns a norma
8d30: 6c 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  l Tcl result.. *
8d40: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
8d50: 3a 0a 20 2a 09 57 69 6c 6c 20 63 61 75 73 65 20  :. *.Will cause 
8d60: 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 73 20 74  other programs t
8d70: 6f 20 72 65 6c 6f 61 64 20 74 68 65 69 72 20 73  o reload their s
8d80: 79 73 74 65 6d 20 73 65 74 74 69 6e 67 73 2e 0a  ystem settings..
8d90: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8de0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 42 72 6f 61  .static int.Broa
8df0: 64 63 61 73 74 56 61 6c 75 65 28 0a 20 20 20 20  dcastValue(.    
8e00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8e10: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
8e20: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
8e30: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09      int objc,...
8e40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8e50: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54  uments. */.    T
8e60: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8e70: 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e  jv[])./* Argumen
8e80: 74 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 7b 0a 20  t values. */.{. 
8e90: 20 20 20 4c 52 45 53 55 4c 54 20 72 65 73 75 6c     LRESULT resul
8ea0: 74 3b 0a 20 20 20 20 44 57 4f 52 44 5f 50 54 52  t;.    DWORD_PTR
8eb0: 20 73 65 6e 64 52 65 73 75 6c 74 3b 0a 20 20 20   sendResult;.   
8ec0: 20 55 49 4e 54 20 74 69 6d 65 6f 75 74 20 3d 20   UINT timeout = 
8ed0: 33 30 30 30 3b 0a 20 20 20 20 69 6e 74 20 6c 65  3000;.    int le
8ee0: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
8ef0: 72 20 2a 73 74 72 3b 0a 20 20 20 20 54 63 6c 5f  r *str;.    Tcl_
8f00: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20  Obj *objPtr;..  
8f10: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29    if (objc == 3)
8f20: 20 7b 0a 09 73 74 72 20 3d 20 54 63 6c 5f 47 65   {..str = Tcl_Ge
8f30: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8f40: 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a 09  bjv[1], &len);..
8f50: 69 66 20 28 28 6c 65 6e 20 3c 20 32 29 20 7c 7c  if ((len < 2) ||
8f60: 20 28 2a 73 74 72 20 21 3d 20 27 2d 27 29 0a 09   (*str != '-')..
8f70: 09 7c 7c 20 73 74 72 6e 63 6d 70 28 73 74 72 2c  .|| strncmp(str,
8f80: 20 22 2d 74 69 6d 65 6f 75 74 22 2c 20 28 73 69   "-timeout", (si
8f90: 7a 65 5f 74 29 20 6c 65 6e 29 29 20 7b 0a 09 20  ze_t) len)) {.. 
8fa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52     return TCL_BR
8fb0: 45 41 4b 3b 0a 09 7d 0a 09 69 66 20 28 54 63 6c  EAK;..}..if (Tcl
8fc0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
8fd0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
8fe0: 28 69 6e 74 20 2a 29 20 26 74 69 6d 65 6f 75 74  (int *) &timeout
8ff0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
9000: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9010: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
9020: 20 20 20 20 73 74 72 20 3d 20 54 63 6c 5f 47 65      str = Tcl_Ge
9030: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9040: 62 6a 76 5b 30 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[0], &len);. 
9050: 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29     if (len == 0)
9060: 20 7b 0a 09 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a   {..str = NULL;.
9070: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
9080: 20 20 20 2a 20 55 73 65 20 74 68 65 20 69 67 6e     * Use the ign
9090: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ore the result..
90a0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 73       */..    res
90b0: 75 6c 74 20 3d 20 53 65 6e 64 4d 65 73 73 61 67  ult = SendMessag
90c0: 65 54 69 6d 65 6f 75 74 41 28 48 57 4e 44 5f 42  eTimeoutA(HWND_B
90d0: 52 4f 41 44 43 41 53 54 2c 20 57 4d 5f 53 45 54  ROADCAST, WM_SET
90e0: 54 49 4e 47 43 48 41 4e 47 45 2c 0a 09 20 20 20  TINGCHANGE,..   
90f0: 20 28 57 50 41 52 41 4d 29 20 30 2c 20 28 4c 50   (WPARAM) 0, (LP
9100: 41 52 41 4d 29 20 73 74 72 2c 20 53 4d 54 4f 5f  ARAM) str, SMTO_
9110: 41 42 4f 52 54 49 46 48 55 4e 47 2c 20 74 69 6d  ABORTIFHUNG, tim
9120: 65 6f 75 74 2c 20 26 73 65 6e 64 52 65 73 75 6c  eout, &sendResul
9130: 74 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  t);..    objPtr 
9140: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
9150: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
9160: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c  ppendElement(NUL
9170: 4c 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  L, objPtr, Tcl_N
9180: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29  ewLongObj((long)
9190: 20 72 65 73 75 6c 74 29 29 3b 0a 20 20 20 20 54   result));.    T
91a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
91b0: 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62  Element(NULL, ob
91c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  jPtr, Tcl_NewLon
91d0: 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 73 65 6e 64  gObj((long) send
91e0: 52 65 73 75 6c 74 29 29 3b 0a 20 20 20 20 54 63  Result));.    Tc
91f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
9200: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
9210: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9220: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 70 70 65 6e 64  ---. *. * Append
9280: 53 79 73 74 65 6d 45 72 72 6f 72 20 2d 2d 0a 20  SystemError --. 
9290: 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74 69 6e  *. *.This routin
92a0: 65 20 66 6f 72 6d 61 74 73 20 61 20 57 69 6e 64  e formats a Wind
92b0: 6f 77 73 20 73 79 73 74 65 6d 20 65 72 72 6f 72  ows system error
92c0: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 70 6c 61   message and pla
92d0: 63 65 73 20 69 74 20 69 6e 74 6f 0a 20 2a 09 74  ces it into. *.t
92e0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  he interpreter r
92f0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 52 65 73  esult.. *. * Res
9300: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
9310: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
9320: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
9330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
9380: 74 69 63 20 76 6f 69 64 0a 41 70 70 65 6e 64 53  tic void.AppendS
9390: 79 73 74 65 6d 45 72 72 6f 72 28 0a 20 20 20 20  ystemError(.    
93a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
93b0: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
93c0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
93d0: 20 20 20 20 44 57 4f 52 44 20 65 72 72 6f 72 29      DWORD error)
93e0: 09 09 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65  ../* Result code
93f0: 20 66 72 6f 6d 20 65 72 72 6f 72 2e 20 2a 2f 0a   from error. */.
9400: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68  {.    int length
9410: 3b 0a 20 20 20 20 54 43 48 41 52 20 2a 74 4d 73  ;.    TCHAR *tMs
9420: 67 50 74 72 2c 20 2a 2a 74 4d 73 67 50 74 72 50  gPtr, **tMsgPtrP
9430: 74 72 20 3d 20 26 74 4d 73 67 50 74 72 3b 0a 20  tr = &tMsgPtr;. 
9440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d     const char *m
9450: 73 67 3b 0a 20 20 20 20 63 68 61 72 20 69 64 5b  sg;.    char id[
9460: 54 43 4c 5f 49 4e 54 45 47 45 52 5f 53 50 41 43  TCL_INTEGER_SPAC
9470: 45 5d 2c 20 6d 73 67 42 75 66 5b 32 34 20 2b 20  E], msgBuf[24 + 
9480: 54 43 4c 5f 49 4e 54 45 47 45 52 5f 53 50 41 43  TCL_INTEGER_SPAC
9490: 45 5d 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  E];.    Tcl_DStr
94a0: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f  ing ds;.    Tcl_
94b0: 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72 20 3d  Obj *resultPtr =
94c0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
94d0: 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20  t(interp);..    
94e0: 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64  if (Tcl_IsShared
94f0: 28 72 65 73 75 6c 74 50 74 72 29 29 20 7b 0a 09  (resultPtr)) {..
9500: 72 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f  resultPtr = Tcl_
9510: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 72 65 73  DuplicateObj(res
9520: 75 6c 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20  ultPtr);.    }. 
9530: 20 20 20 6c 65 6e 67 74 68 20 3d 20 46 6f 72 6d     length = Form
9540: 61 74 4d 65 73 73 61 67 65 28 46 4f 52 4d 41 54  atMessage(FORMAT
9550: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
9560: 53 54 45 4d 0a 09 20 20 20 20 7c 20 46 4f 52 4d  STEM..    | FORM
9570: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
9580: 41 54 45 5f 42 55 46 46 45 52 2c 20 4e 55 4c 4c  ATE_BUFFER, NULL
9590: 2c 20 65 72 72 6f 72 2c 0a 09 20 20 20 20 4d 41  , error,..    MA
95a0: 4b 45 4c 41 4e 47 49 44 28 4c 41 4e 47 5f 4e 45  KELANGID(LANG_NE
95b0: 55 54 52 41 4c 2c 20 53 55 42 4c 41 4e 47 5f 44  UTRAL, SUBLANG_D
95c0: 45 46 41 55 4c 54 29 2c 20 28 54 43 48 41 52 20  EFAULT), (TCHAR 
95d0: 2a 29 20 74 4d 73 67 50 74 72 50 74 72 2c 0a 09  *) tMsgPtrPtr,..
95e0: 20 20 20 20 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20      0, NULL);.  
95f0: 20 20 69 66 20 28 6c 65 6e 67 74 68 20 3d 3d 20    if (length == 
9600: 30 29 20 7b 0a 09 73 70 72 69 6e 74 66 28 6d 73  0) {..sprintf(ms
9610: 67 42 75 66 2c 20 22 75 6e 6b 6e 6f 77 6e 20 65  gBuf, "unknown e
9620: 72 72 6f 72 3a 20 25 6c 64 22 2c 20 65 72 72 6f  rror: %ld", erro
9630: 72 29 3b 0a 09 6d 73 67 20 3d 20 6d 73 67 42 75  r);..msg = msgBu
9640: 66 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  f;.    } else {.
9650: 09 63 68 61 72 20 2a 6d 73 67 50 74 72 3b 0a 0a  .char *msgPtr;..
9660: 09 54 63 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55  .Tcl_WinTCharToU
9670: 74 66 28 74 4d 73 67 50 74 72 2c 20 2d 31 2c 20  tf(tMsgPtr, -1, 
9680: 26 64 73 29 3b 0a 09 4c 6f 63 61 6c 46 72 65 65  &ds);..LocalFree
9690: 28 74 4d 73 67 50 74 72 29 3b 0a 0a 09 6d 73 67  (tMsgPtr);...msg
96a0: 50 74 72 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e  Ptr = Tcl_DStrin
96b0: 67 56 61 6c 75 65 28 26 64 73 29 3b 0a 09 6c 65  gValue(&ds);..le
96c0: 6e 67 74 68 20 3d 20 54 63 6c 5f 44 53 74 72 69  ngth = Tcl_DStri
96d0: 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 3b 0a 0a  ngLength(&ds);..
96e0: 09 2f 2a 0a 09 20 2a 20 54 72 69 6d 20 74 68 65  ./*.. * Trim the
96f0: 20 74 72 61 69 6c 69 6e 67 20 43 52 2f 4c 46 20   trailing CR/LF 
9700: 66 72 6f 6d 20 74 68 65 20 73 79 73 74 65 6d 20  from the system 
9710: 6d 65 73 73 61 67 65 2e 0a 09 20 2a 2f 0a 0a 09  message... */...
9720: 69 66 20 28 6d 73 67 50 74 72 5b 6c 65 6e 67 74  if (msgPtr[lengt
9730: 68 2d 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a  h-1] == '\n') {.
9740: 09 20 20 20 20 2d 2d 6c 65 6e 67 74 68 3b 0a 09  .    --length;..
9750: 7d 0a 09 69 66 20 28 6d 73 67 50 74 72 5b 6c 65  }..if (msgPtr[le
9760: 6e 67 74 68 2d 31 5d 20 3d 3d 20 27 5c 72 27 29  ngth-1] == '\r')
9770: 20 7b 0a 09 20 20 20 20 2d 2d 6c 65 6e 67 74 68   {..    --length
9780: 3b 0a 09 7d 0a 09 6d 73 67 50 74 72 5b 6c 65 6e  ;..}..msgPtr[len
9790: 67 74 68 5d 20 3d 20 30 3b 0a 09 6d 73 67 20 3d  gth] = 0;..msg =
97a0: 20 6d 73 67 50 74 72 3b 0a 20 20 20 20 7d 0a 0a   msgPtr;.    }..
97b0: 20 20 20 20 73 70 72 69 6e 74 66 28 69 64 2c 20      sprintf(id, 
97c0: 22 25 6c 64 22 2c 20 65 72 72 6f 72 29 3b 0a 20  "%ld", error);. 
97d0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
97e0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 57 49 4e  ode(interp, "WIN
97f0: 44 4f 57 53 22 2c 20 69 64 2c 20 6d 73 67 2c 20  DOWS", id, msg, 
9800: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 41  NULL);.    Tcl_A
9810: 70 70 65 6e 64 54 6f 4f 62 6a 28 72 65 73 75 6c  ppendToObj(resul
9820: 74 50 74 72 2c 20 6d 73 67 2c 20 6c 65 6e 67 74  tPtr, msg, lengt
9830: 68 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  h);.    Tcl_SetO
9840: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9850: 20 72 65 73 75 6c 74 50 74 72 29 3b 0a 0a 20 20   resultPtr);..  
9860: 20 20 69 66 20 28 6c 65 6e 67 74 68 20 21 3d 20    if (length != 
9870: 30 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  0) {..Tcl_DStrin
9880: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20  gFree(&ds);.    
9890: 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  }.}.../*. *-----
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98e0: 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 76 65 72 74 44  -. *. * ConvertD
98f0: 57 4f 52 44 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  WORD --. *. *.Th
9900: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
9910: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 61  rmines whether a
9920: 20 44 57 4f 52 44 20 6e 65 65 64 73 20 74 6f 20   DWORD needs to 
9930: 62 65 20 62 79 74 65 20 73 77 61 70 70 65 64 2c  be byte swapped,
9940: 20 61 6e 64 0a 20 2a 09 72 65 74 75 72 6e 73 20   and. *.returns 
9950: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  the appropriatel
9960: 79 20 73 77 61 70 70 65 64 20 76 61 6c 75 65 2e  y swapped value.
9970: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
9980: 20 2a 09 52 65 74 75 72 6e 73 20 61 20 63 6f 6e   *.Returns a con
9990: 76 65 72 74 65 64 20 44 57 4f 52 44 2e 0a 20 2a  verted DWORD.. *
99a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
99b0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a00: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
9a10: 69 63 20 44 57 4f 52 44 0a 43 6f 6e 76 65 72 74  ic DWORD.Convert
9a20: 44 57 4f 52 44 28 0a 20 20 20 20 44 57 4f 52 44  DWORD(.    DWORD
9a30: 20 74 79 70 65 2c 09 09 09 2f 2a 20 45 69 74 68   type,.../* Eith
9a40: 65 72 20 52 45 47 5f 44 57 4f 52 44 20 6f 72 20  er REG_DWORD or 
9a50: 52 45 47 5f 44 57 4f 52 44 5f 42 49 47 5f 45 4e  REG_DWORD_BIG_EN
9a60: 44 49 41 4e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  DIAN */.    DWOR
9a70: 44 20 76 61 6c 75 65 29 09 09 2f 2a 20 54 68 65  D value)../* The
9a80: 20 76 61 6c 75 65 20 74 6f 20 62 65 20 63 6f 6e   value to be con
9a90: 76 65 72 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20  verted. */.{.   
9aa0: 20 63 6f 6e 73 74 20 44 57 4f 52 44 20 6f 72 64   const DWORD ord
9ab0: 65 72 20 3d 20 31 3b 0a 20 20 20 20 44 57 4f 52  er = 1;.    DWOR
9ac0: 44 20 6c 6f 63 61 6c 54 79 70 65 3b 0a 0a 20 20  D localType;..  
9ad0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63    /*.     * Chec
9ae0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
9af0: 6c 6f 77 20 62 69 74 20 69 73 20 69 6e 20 74 68  low bit is in th
9b00: 65 20 66 69 72 73 74 20 62 79 74 65 2e 0a 20 20  e first byte..  
9b10: 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 6f 63 61 6c     */..    local
9b20: 54 79 70 65 20 3d 20 28 2a 28 28 63 6f 6e 73 74  Type = (*((const
9b30: 20 63 68 61 72 20 2a 29 20 26 6f 72 64 65 72 29   char *) &order)
9b40: 20 3d 3d 20 31 29 0a 09 20 20 20 20 3f 20 52 45   == 1)..    ? RE
9b50: 47 5f 44 57 4f 52 44 20 3a 20 52 45 47 5f 44 57  G_DWORD : REG_DW
9b60: 4f 52 44 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a  ORD_BIG_ENDIAN;.
9b70: 20 20 20 20 72 65 74 75 72 6e 20 28 74 79 70 65      return (type
9b80: 20 21 3d 20 6c 6f 63 61 6c 54 79 70 65 29 20 3f   != localType) ?
9b90: 20 28 44 57 4f 52 44 29 20 53 57 41 50 4c 4f 4e   (DWORD) SWAPLON
9ba0: 47 28 76 61 6c 75 65 29 20 3a 20 76 61 6c 75 65  G(value) : value
9bb0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61  ;.}.../*. * Loca
9bc0: 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 20 2a 20  l Variables:. * 
9bd0: 6d 6f 64 65 3a 20 63 0a 20 2a 20 63 2d 62 61 73  mode: c. * c-bas
9be0: 69 63 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20  ic-offset: 4. * 
9bf0: 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a  fill-column: 78.
9c00: 20 2a 20 45 6e 64 3a 0a 20 2a 2f 0a               * End:. */.