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:. */.