2 * Registry editing UI functions.
4 * Copyright (C) 2003 Dimitrie O. Paun
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 typedef enum _EDIT_MODE
30 static const TCHAR
* editValueName
;
31 static TCHAR
* stringValueData
;
32 static PVOID binValueData
;
33 static DWORD dwordValueData
;
34 static DWORD valueDataLen
;
35 static EDIT_MODE dwordEditMode
= EDIT_MODE_HEX
;
37 void error(HWND hwnd
, INT resId
, ...)
45 hInstance
= GetModuleHandle(0);
47 if (!LoadString(hInstance
, IDS_ERROR
, title
, COUNT_OF(title
)))
48 _tcscpy(title
, _T("Error"));
50 if (!LoadString(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
51 _tcscpy(errfmt
, _T("Unknown error string!"));
54 _vsntprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
57 MessageBox(hwnd
, errstr
, title
, MB_OK
| MB_ICONERROR
);
60 static void error_code_messagebox(HWND hwnd
, DWORD error_code
)
63 if (!LoadString(hInst
, IDS_ERROR
, title
, COUNT_OF(title
)))
64 lstrcpy(title
, TEXT("Error"));
65 ErrorMessageBox(hwnd
, title
, error_code
);
68 void warning(HWND hwnd
, INT resId
, ...)
76 hInstance
= GetModuleHandle(0);
78 if (!LoadString(hInstance
, IDS_WARNING
, title
, COUNT_OF(title
)))
79 _tcscpy(title
, _T("Warning"));
81 if (!LoadString(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
82 _tcscpy(errfmt
, _T("Unknown error string!"));
85 _vsntprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
88 MessageBox(hwnd
, errstr
, title
, MB_OK
| MB_ICONSTOP
);
91 INT_PTR CALLBACK
modify_string_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
97 UNREFERENCED_PARAMETER(lParam
);
101 if(editValueName
&& _tcscmp(editValueName
, _T("")))
103 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
108 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
109 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, buffer
);
111 SetDlgItemText(hwndDlg
, IDC_VALUE_DATA
, stringValueData
);
112 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
115 switch (LOWORD(wParam
))
118 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
120 if ((len
= GetWindowTextLength(hwndValue
)))
124 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(TCHAR
))))
126 stringValueData
= valueData
;
127 if (!GetWindowText(hwndValue
, stringValueData
, len
+ 1))
128 *stringValueData
= 0;
133 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(TCHAR
))))
135 stringValueData
= valueData
;
136 if (!GetWindowText(hwndValue
, stringValueData
, len
+ 1))
137 *stringValueData
= 0;
144 *stringValueData
= 0;
147 EndDialog(hwndDlg
, IDOK
);
150 EndDialog(hwndDlg
, IDCANCEL
);
158 INT_PTR CALLBACK
modify_multi_string_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
164 UNREFERENCED_PARAMETER(lParam
);
168 if(editValueName
&& _tcscmp(editValueName
, _T("")))
170 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
175 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
176 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, buffer
);
178 SetDlgItemText(hwndDlg
, IDC_VALUE_DATA
, stringValueData
);
179 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
182 switch (LOWORD(wParam
))
185 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
187 if ((len
= GetWindowTextLength(hwndValue
)))
191 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(TCHAR
))))
193 stringValueData
= valueData
;
194 if (!GetWindowText(hwndValue
, stringValueData
, len
+ 1))
195 *stringValueData
= 0;
200 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(TCHAR
))))
202 stringValueData
= valueData
;
203 if (!GetWindowText(hwndValue
, stringValueData
, len
+ 1))
204 *stringValueData
= 0;
211 *stringValueData
= 0;
214 EndDialog(hwndDlg
, IDOK
);
217 EndDialog(hwndDlg
, IDCANCEL
);
225 LRESULT CALLBACK
DwordEditSubclassProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
229 oldwndproc
= (WNDPROC
)(LONG_PTR
)GetWindowLongPtr(hwnd
, GWL_USERDATA
);
234 if (dwordEditMode
== EDIT_MODE_DEC
)
236 if (isdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
245 else if (dwordEditMode
== EDIT_MODE_HEX
)
247 if (isxdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
262 return CallWindowProc(oldwndproc
, hwnd
, uMsg
, wParam
, lParam
);
266 INT_PTR CALLBACK
modify_dword_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
270 TCHAR ValueString
[32];
275 UNREFERENCED_PARAMETER(lParam
);
279 dwordEditMode
= EDIT_MODE_HEX
;
281 /* subclass the edit control */
282 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
283 oldproc
= (WNDPROC
)(LONG_PTR
)GetWindowLongPtr(hwndValue
, GWL_WNDPROC
);
284 SetWindowLongPtr(hwndValue
, GWL_USERDATA
, (DWORD_PTR
)oldproc
);
285 SetWindowLongPtr(hwndValue
, GWL_WNDPROC
, (DWORD_PTR
)DwordEditSubclassProc
);
287 if(editValueName
&& _tcscmp(editValueName
, _T("")))
289 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
294 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
295 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, buffer
);
297 CheckRadioButton (hwndDlg
, IDC_FORMAT_HEX
, IDC_FORMAT_DEC
, IDC_FORMAT_HEX
);
298 _stprintf (ValueString
, _T("%lx"), dwordValueData
);
299 SetDlgItemText(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
300 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
304 switch (LOWORD(wParam
))
307 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_DEC
)
309 dwordEditMode
= EDIT_MODE_HEX
;
310 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
312 if (GetWindowTextLength(hwndValue
))
314 if (GetWindowText(hwndValue
, ValueString
, 32))
316 Value
= _tcstoul (ValueString
, &Remainder
, 10);
320 _stprintf (ValueString
, _T("%lx"), Value
);
321 SetDlgItemText(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
327 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_HEX
)
329 dwordEditMode
= EDIT_MODE_DEC
;
330 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
332 if (GetWindowTextLength(hwndValue
))
334 if (GetWindowText(hwndValue
, ValueString
, 32))
336 Value
= _tcstoul (ValueString
, &Remainder
, 16);
340 _stprintf (ValueString
, _T("%lu"), Value
);
341 SetDlgItemText(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
347 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
349 if (GetWindowTextLength(hwndValue
))
351 if (!GetWindowText(hwndValue
, ValueString
, 32))
353 EndDialog(hwndDlg
, IDCANCEL
);
357 Base
= (dwordEditMode
== EDIT_MODE_HEX
) ? 16 : 10;
358 dwordValueData
= _tcstoul (ValueString
, &Remainder
, Base
);
362 EndDialog(hwndDlg
, IDCANCEL
);
366 EndDialog(hwndDlg
, IDOK
);
370 EndDialog(hwndDlg
, IDCANCEL
);
378 INT_PTR CALLBACK
modify_binary_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
383 UNREFERENCED_PARAMETER(lParam
);
387 if(editValueName
&& _tcscmp(editValueName
, _T("")))
389 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
394 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
395 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, buffer
);
397 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
398 HexEdit_LoadBuffer(hwndValue
, binValueData
, valueDataLen
);
399 /* reset the hex edit control's font */
400 SendMessage(hwndValue
, WM_SETFONT
, 0, 0);
404 switch (LOWORD(wParam
))
407 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
409 len
= (UINT
) HexEdit_GetBufferSize(hwndValue
);
410 if (len
> 0 && binValueData
)
411 binValueData
= HeapReAlloc(GetProcessHeap(), 0, binValueData
, len
);
413 binValueData
= HeapAlloc(GetProcessHeap(), 0, len
+ 1);
414 HexEdit_CopyBuffer(hwndValue
, binValueData
, len
);
417 EndDialog(hwndDlg
, IDOK
);
420 EndDialog(hwndDlg
, IDCANCEL
);
428 BOOL
ModifyValue(HWND hwnd
, HKEY hKey
, LPCTSTR valueName
, BOOL EditBin
)
437 editValueName
= valueName
;
439 lRet
= RegQueryValueEx(hKey
, valueName
, 0, &type
, 0, &valueDataLen
);
440 if (lRet
!= ERROR_SUCCESS
&& (!_tcscmp(valueName
, _T("")) || valueName
== NULL
))
442 lRet
= ERROR_SUCCESS
; /* Allow editing of (Default) values which don't exist */
445 stringValueData
= NULL
;
449 if (lRet
!= ERROR_SUCCESS
)
451 error(hwnd
, IDS_BAD_VALUE
, valueName
);
455 if (EditBin
== FALSE
&& ((type
== REG_SZ
) || (type
== REG_EXPAND_SZ
)))
457 if (valueDataLen
> 0)
459 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
)))
461 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
464 lRet
= RegQueryValueEx(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
465 if (lRet
!= ERROR_SUCCESS
)
467 error(hwnd
, IDS_BAD_VALUE
, valueName
);
473 stringValueData
= NULL
;
476 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING
), hwnd
, modify_string_dlgproc
) == IDOK
)
480 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, (LPBYTE
)stringValueData
, (DWORD
) (_tcslen(stringValueData
) + 1) * sizeof(TCHAR
));
484 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, NULL
, 0);
486 if (lRet
== ERROR_SUCCESS
)
490 else if (EditBin
== FALSE
&& type
== REG_MULTI_SZ
)
492 if (valueDataLen
> 0)
494 size_t llen
, listlen
, nl_len
;
495 LPTSTR src
, lines
= NULL
;
497 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
)))
499 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
502 lRet
= RegQueryValueEx(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
503 if (lRet
!= ERROR_SUCCESS
)
505 error(hwnd
, IDS_BAD_VALUE
, valueName
);
509 /* convert \0 to \r\n */
510 src
= stringValueData
;
511 nl_len
= _tcslen(_T("\r\n")) * sizeof(TCHAR
);
512 listlen
= sizeof(TCHAR
);
513 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, listlen
+ sizeof(TCHAR
));
514 while(*src
!= _T('\0'))
519 listlen
+= (llen
* sizeof(TCHAR
)) + nl_len
;
520 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, listlen
);
522 _tcscat(lines
, _T("\r\n"));
525 HeapFree(GetProcessHeap(), 0, stringValueData
);
526 stringValueData
= lines
;
530 stringValueData
= NULL
;
533 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING
), hwnd
, modify_multi_string_dlgproc
) == IDOK
)
537 /* convert \r\n to \0 */
538 BOOL EmptyLines
= FALSE
;
539 LPTSTR src
, lines
, nl
;
540 size_t linechars
, buflen
, c_nl
, dest
;
542 src
= stringValueData
;
543 buflen
= sizeof(TCHAR
);
544 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, buflen
+ sizeof(TCHAR
));
545 c_nl
= _tcslen(_T("\r\n"));
547 while(*src
!= _T('\0'))
549 if((nl
= _tcsstr(src
, _T("\r\n"))))
551 linechars
= nl
- src
;
561 linechars
= _tcslen(src
);
565 buflen
+= ((linechars
+ 1) * sizeof(TCHAR
));
566 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, buflen
);
567 memcpy((lines
+ dest
), src
, linechars
* sizeof(TCHAR
));
569 lines
[dest
++] = _T('\0');
575 src
+= linechars
+ (nl
!= NULL
? c_nl
: 0);
577 lines
[++dest
] = _T('\0');
581 warning(hwnd
, IDS_MULTI_SZ_EMPTY_STRING
);
584 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, (LPBYTE
)lines
, (DWORD
) buflen
);
585 HeapFree(GetProcessHeap(), 0, lines
);
589 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, NULL
, 0);
591 if (lRet
== ERROR_SUCCESS
)
595 else if (EditBin
== FALSE
&& type
== REG_DWORD
)
597 lRet
= RegQueryValueEx(hKey
, valueName
, 0, 0, (LPBYTE
)&dwordValueData
, &valueDataLen
);
598 if (lRet
!= ERROR_SUCCESS
)
600 error(hwnd
, IDS_BAD_VALUE
, valueName
);
604 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_DWORD
), hwnd
, modify_dword_dlgproc
) == IDOK
)
606 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, (LPBYTE
)&dwordValueData
, sizeof(DWORD
));
607 if (lRet
== ERROR_SUCCESS
)
611 else if (EditBin
== TRUE
|| type
== REG_NONE
|| type
== REG_BINARY
)
615 int len_vname
= lstrlen(valueName
);
619 if(!(u_valuename
= HeapAlloc(GetProcessHeap(), 0, (len_vname
+ 1) * sizeof(WCHAR
))))
621 error(hwnd
, IDS_TOO_BIG_VALUE
, len_vname
);
624 /* convert the ansi value name to an unicode string */
625 MultiByteToWideChar(CP_ACP
, 0, valueName
, -1, u_valuename
, len_vname
+ 1);
626 valueDataLen
*= sizeof(WCHAR
);
633 if(!(binValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
+ 1)))
635 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
639 /* force to use the unicode version, so editing strings in binary mode is correct */
640 lRet
= RegQueryValueExW(hKey
,
646 0, 0, (LPBYTE
)binValueData
, &valueDataLen
);
647 if (lRet
!= ERROR_SUCCESS
)
649 HeapFree(GetProcessHeap(), 0, binValueData
);
652 HeapFree(GetProcessHeap(), 0, u_valuename
);
654 error(hwnd
, IDS_BAD_VALUE
, valueName
);
663 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA
), hwnd
, modify_binary_dlgproc
) == IDOK
)
665 /* force to use the unicode version, so editing strings in binary mode is correct */
666 lRet
= RegSetValueExW(hKey
,
672 0, type
, (LPBYTE
)binValueData
, valueDataLen
);
673 if (lRet
== ERROR_SUCCESS
)
676 if(binValueData
!= NULL
)
677 HeapFree(GetProcessHeap(), 0, binValueData
);
680 HeapFree(GetProcessHeap(), 0, u_valuename
);
685 error(hwnd
, IDS_UNSUPPORTED_TYPE
, type
);
690 HeapFree(GetProcessHeap(), 0, stringValueData
);
691 stringValueData
= NULL
;
696 static LONG
CopyKey(HKEY hDestKey
, LPCTSTR lpDestSubKey
, HKEY hSrcKey
, LPCTSTR lpSrcSubKey
)
700 HKEY hDestSubKey
= NULL
;
701 HKEY hSrcSubKey
= NULL
;
702 DWORD dwIndex
, dwType
, cbName
, cbData
;
704 TCHAR szValueName
[256];
705 BYTE szValueData
[512];
709 /* open the source subkey, if specified */
712 lResult
= RegOpenKeyEx(hSrcKey
, lpSrcSubKey
, 0, KEY_ALL_ACCESS
, &hSrcSubKey
);
715 hSrcKey
= hSrcSubKey
;
718 /* create the destination subkey */
719 lResult
= RegCreateKeyEx(hDestKey
, lpDestSubKey
, 0, NULL
, 0, KEY_WRITE
, NULL
,
720 &hDestSubKey
, &dwDisposition
);
724 /* copy all subkeys */
728 cbName
= sizeof(szSubKey
) / sizeof(szSubKey
[0]);
729 lResult
= RegEnumKeyEx(hSrcKey
, dwIndex
++, szSubKey
, &cbName
, NULL
, NULL
, NULL
, &ft
);
730 if (lResult
== ERROR_SUCCESS
)
732 lResult
= CopyKey(hDestSubKey
, szSubKey
, hSrcKey
, szSubKey
);
737 while(lResult
== ERROR_SUCCESS
);
739 /* copy all subvalues */
743 cbName
= sizeof(szValueName
) / sizeof(szValueName
[0]);
744 cbData
= sizeof(szValueData
) / sizeof(szValueData
[0]);
745 lResult
= RegEnumValue(hSrcKey
, dwIndex
++, szValueName
, &cbName
, NULL
, &dwType
, szValueData
, &cbData
);
746 if (lResult
== ERROR_SUCCESS
)
748 lResult
= RegSetValueEx(hDestSubKey
, szValueName
, 0, dwType
, szValueData
, cbData
);
753 while(lResult
== ERROR_SUCCESS
);
755 lResult
= ERROR_SUCCESS
;
759 RegCloseKey(hSrcSubKey
);
761 RegCloseKey(hDestSubKey
);
762 if (lResult
!= ERROR_SUCCESS
)
763 SHDeleteKey(hDestKey
, lpDestSubKey
);
767 static LONG
MoveKey(HKEY hDestKey
, LPCTSTR lpDestSubKey
, HKEY hSrcKey
, LPCTSTR lpSrcSubKey
)
772 return ERROR_INVALID_FUNCTION
;
774 lResult
= CopyKey(hDestKey
, lpDestSubKey
, hSrcKey
, lpSrcSubKey
);
775 if (lResult
== ERROR_SUCCESS
)
776 SHDeleteKey(hSrcKey
, lpSrcSubKey
);
781 BOOL
DeleteKey(HWND hwnd
, HKEY hKeyRoot
, LPCTSTR keyPath
)
783 TCHAR msg
[128], caption
[128];
788 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, KEY_READ
|KEY_SET_VALUE
, &hKey
);
789 if (lRet
!= ERROR_SUCCESS
) {
790 error_code_messagebox(hwnd
, lRet
);
794 LoadString(hInst
, IDS_QUERY_DELETE_KEY_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
795 LoadString(hInst
, IDS_QUERY_DELETE_KEY_ONE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
797 if (MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) != IDYES
)
800 lRet
= SHDeleteKey(hKeyRoot
, keyPath
);
801 if (lRet
!= ERROR_SUCCESS
) {
802 error(hwnd
, IDS_BAD_KEY
, keyPath
);
812 LONG
RenameKey(HKEY hKey
, LPCTSTR lpSubKey
, LPCTSTR lpNewName
)
815 LPTSTR lpNewSubKey
= NULL
;
821 s
= _tcsrchr(lpSubKey
, _T('\\'));
825 lpNewSubKey
= (LPTSTR
) HeapAlloc(GetProcessHeap(), 0, (s
- lpSubKey
+ _tcslen(lpNewName
) + 1) * sizeof(TCHAR
));
826 if (lpNewSubKey
!= NULL
)
828 memcpy(lpNewSubKey
, lpSubKey
, (s
- lpSubKey
) * sizeof(TCHAR
));
829 lstrcpy(lpNewSubKey
+ (s
- lpSubKey
), lpNewName
);
830 lpNewName
= lpNewSubKey
;
833 return ERROR_NOT_ENOUGH_MEMORY
;
836 Ret
= MoveKey(hKey
, lpNewName
, hKey
, lpSubKey
);
840 HeapFree(GetProcessHeap(), 0, lpNewSubKey
);
845 LONG
RenameValue(HKEY hKey
, LPCTSTR lpSubKey
, LPCTSTR lpDestValue
, LPCTSTR lpSrcValue
)
849 DWORD dwType
, cbData
;
854 lResult
= RegOpenKey(hKey
, lpSubKey
, &hSubKey
);
855 if (lResult
!= ERROR_SUCCESS
)
860 cbData
= sizeof(data
);
861 lResult
= RegQueryValueEx(hKey
, lpSrcValue
, NULL
, &dwType
, data
, &cbData
);
862 if (lResult
!= ERROR_SUCCESS
)
865 lResult
= RegSetValueEx(hKey
, lpDestValue
, 0, dwType
, data
, cbData
);
866 if (lResult
!= ERROR_SUCCESS
)
869 RegDeleteValue(hKey
, lpSrcValue
);
873 RegCloseKey(hSubKey
);
877 LONG
QueryStringValue(HKEY hKey
, LPCTSTR lpSubKey
, LPCTSTR lpValueName
, LPTSTR pszBuffer
, DWORD dwBufferLen
)
881 DWORD cbData
, dwType
;
885 lResult
= RegOpenKey(hKey
, lpSubKey
, &hSubKey
);
886 if (lResult
!= ERROR_SUCCESS
)
891 cbData
= (dwBufferLen
- 1) * sizeof(*pszBuffer
);
892 lResult
= RegQueryValueEx(hKey
, lpValueName
, NULL
, &dwType
, (LPBYTE
) pszBuffer
, &cbData
);
893 if (lResult
!= ERROR_SUCCESS
)
895 if (dwType
!= REG_SZ
)
901 pszBuffer
[cbData
/ sizeof(*pszBuffer
)] = _T('\0');
904 if (lResult
!= ERROR_SUCCESS
)
905 pszBuffer
[0] = _T('\0');
907 RegCloseKey(hSubKey
);
911 BOOL
GetKeyName(LPTSTR pszDest
, size_t iDestLength
, HKEY hRootKey
, LPCTSTR lpSubKey
)
915 if (hRootKey
== HKEY_CLASSES_ROOT
)
916 pszRootKey
= TEXT("HKEY_CLASSES_ROOT");
917 else if (hRootKey
== HKEY_CURRENT_USER
)
918 pszRootKey
= TEXT("HKEY_CURRENT_USER");
919 else if (hRootKey
== HKEY_LOCAL_MACHINE
)
920 pszRootKey
= TEXT("HKEY_LOCAL_MACHINE");
921 else if (hRootKey
== HKEY_USERS
)
922 pszRootKey
= TEXT("HKEY_USERS");
923 else if (hRootKey
== HKEY_CURRENT_CONFIG
)
924 pszRootKey
= TEXT("HKEY_CURRENT_CONFIG");
925 else if (hRootKey
== HKEY_DYN_DATA
)
926 pszRootKey
= TEXT("HKEY_DYN_DATA");
931 _sntprintf(pszDest
, iDestLength
, TEXT("%s\\%s"), pszRootKey
, lpSubKey
);
933 _sntprintf(pszDest
, iDestLength
, TEXT("%s"), pszRootKey
);