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 #define NTOS_MODE_USER
24 #include <ndk/cmtypes.h>
26 typedef enum _EDIT_MODE
33 static const WCHAR
* editValueName
;
34 static WCHAR
* stringValueData
;
35 static PVOID binValueData
;
36 static DWORD dwordValueData
;
37 static PCM_RESOURCE_LIST resourceValueData
;
38 static INT fullResourceIndex
= -1;
39 static DWORD valueDataLen
;
40 static EDIT_MODE dwordEditMode
= EDIT_MODE_HEX
;
42 void error(HWND hwnd
, INT resId
, ...)
50 hInstance
= GetModuleHandle(0);
52 if (!LoadStringW(hInstance
, IDS_ERROR
, title
, COUNT_OF(title
)))
53 wcscpy(title
, L
"Error");
55 if (!LoadStringW(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
56 wcscpy(errfmt
, L
"Unknown error string!");
59 _vsnwprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
62 MessageBoxW(hwnd
, errstr
, title
, MB_OK
| MB_ICONERROR
);
65 static void error_code_messagebox(HWND hwnd
, DWORD error_code
)
68 if (!LoadStringW(hInst
, IDS_ERROR
, title
, COUNT_OF(title
)))
69 wcscpy(title
, L
"Error");
70 ErrorMessageBox(hwnd
, title
, error_code
);
73 void warning(HWND hwnd
, INT resId
, ...)
81 hInstance
= GetModuleHandle(0);
83 if (!LoadStringW(hInstance
, IDS_WARNING
, title
, COUNT_OF(title
)))
84 wcscpy(title
, L
"Warning");
86 if (!LoadStringW(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
87 wcscpy(errfmt
, L
"Unknown error string!");
90 _vsnwprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
93 MessageBoxW(hwnd
, errstr
, title
, MB_OK
| MB_ICONSTOP
);
96 INT_PTR CALLBACK
modify_string_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
102 UNREFERENCED_PARAMETER(lParam
);
107 if (editValueName
&& wcscmp(editValueName
, L
""))
109 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
114 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
115 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
117 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, stringValueData
);
118 SendMessage(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
), EM_SETSEL
, 0, -1);
119 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
122 switch (LOWORD(wParam
))
125 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
127 if ((len
= GetWindowTextLength(hwndValue
)))
131 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(WCHAR
))))
133 stringValueData
= valueData
;
134 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
135 *stringValueData
= 0;
140 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(WCHAR
))))
142 stringValueData
= valueData
;
143 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
144 *stringValueData
= 0;
151 *stringValueData
= 0;
154 EndDialog(hwndDlg
, IDOK
);
157 EndDialog(hwndDlg
, IDCANCEL
);
165 INT_PTR CALLBACK
modify_multi_string_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
171 UNREFERENCED_PARAMETER(lParam
);
176 if (editValueName
&& wcscmp(editValueName
, L
""))
178 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
183 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
184 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
186 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, stringValueData
);
187 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
190 switch (LOWORD(wParam
))
193 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
195 if ((len
= GetWindowTextLength(hwndValue
)))
199 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(WCHAR
))))
201 stringValueData
= valueData
;
202 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
203 *stringValueData
= 0;
208 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(WCHAR
))))
210 stringValueData
= valueData
;
211 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
212 *stringValueData
= 0;
219 *stringValueData
= 0;
222 EndDialog(hwndDlg
, IDOK
);
225 EndDialog(hwndDlg
, IDCANCEL
);
233 LRESULT CALLBACK
DwordEditSubclassProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
237 oldwndproc
= (WNDPROC
)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
242 if (dwordEditMode
== EDIT_MODE_DEC
)
244 if (isdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
253 else if (dwordEditMode
== EDIT_MODE_HEX
)
255 if (isxdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
270 return CallWindowProcW(oldwndproc
, hwnd
, uMsg
, wParam
, lParam
);
274 INT_PTR CALLBACK
modify_dword_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
278 WCHAR ValueString
[32];
283 UNREFERENCED_PARAMETER(lParam
);
288 dwordEditMode
= EDIT_MODE_HEX
;
290 /* subclass the edit control */
291 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
292 oldproc
= (WNDPROC
)GetWindowLongPtr(hwndValue
, GWLP_WNDPROC
);
293 SetWindowLongPtr(hwndValue
, GWLP_USERDATA
, (DWORD_PTR
)oldproc
);
294 SetWindowLongPtr(hwndValue
, GWLP_WNDPROC
, (DWORD_PTR
)DwordEditSubclassProc
);
296 if (editValueName
&& wcscmp(editValueName
, L
""))
298 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
303 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
304 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
306 CheckRadioButton (hwndDlg
, IDC_FORMAT_HEX
, IDC_FORMAT_DEC
, IDC_FORMAT_HEX
);
307 swprintf(ValueString
, L
"%lx", dwordValueData
);
308 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
309 SendMessage(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
), EM_SETSEL
, 0, -1);
310 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
314 switch (LOWORD(wParam
))
317 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_DEC
)
319 dwordEditMode
= EDIT_MODE_HEX
;
320 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
322 if (GetWindowTextLength(hwndValue
))
324 if (GetWindowTextW(hwndValue
, ValueString
, 32))
326 Value
= wcstoul (ValueString
, &Remainder
, 10);
330 swprintf(ValueString
, L
"%lx", Value
);
331 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
337 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_HEX
)
339 dwordEditMode
= EDIT_MODE_DEC
;
340 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
342 if (GetWindowTextLength(hwndValue
))
344 if (GetWindowTextW(hwndValue
, ValueString
, 32))
346 Value
= wcstoul (ValueString
, &Remainder
, 16);
350 swprintf(ValueString
, L
"%lu", Value
);
351 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
357 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
359 if (GetWindowTextLength(hwndValue
))
361 if (!GetWindowTextW(hwndValue
, ValueString
, 32))
363 EndDialog(hwndDlg
, IDCANCEL
);
367 Base
= (dwordEditMode
== EDIT_MODE_HEX
) ? 16 : 10;
368 dwordValueData
= wcstoul (ValueString
, &Remainder
, Base
);
372 EndDialog(hwndDlg
, IDCANCEL
);
376 EndDialog(hwndDlg
, IDOK
);
380 EndDialog(hwndDlg
, IDCANCEL
);
388 INT_PTR CALLBACK
modify_binary_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
393 UNREFERENCED_PARAMETER(lParam
);
398 if (editValueName
&& wcscmp(editValueName
, L
""))
400 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
405 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
406 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
408 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
409 HexEdit_LoadBuffer(hwndValue
, binValueData
, valueDataLen
);
410 /* reset the hex edit control's font */
411 SendMessageW(hwndValue
, WM_SETFONT
, 0, 0);
415 switch (LOWORD(wParam
))
418 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
420 len
= (UINT
) HexEdit_GetBufferSize(hwndValue
);
421 if (len
> 0 && binValueData
)
422 binValueData
= HeapReAlloc(GetProcessHeap(), 0, binValueData
, len
);
424 binValueData
= HeapAlloc(GetProcessHeap(), 0, len
+ 1);
425 HexEdit_CopyBuffer(hwndValue
, binValueData
, len
);
428 EndDialog(hwndDlg
, IDOK
);
431 EndDialog(hwndDlg
, IDCANCEL
);
439 static BOOL
CreateResourceColumns(HWND hwnd
)
447 /* Create columns. */
448 lvC
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
;
449 lvC
.pszText
= szText
;
450 lvC
.fmt
= LVCFMT_LEFT
;
452 hwndLV
= GetDlgItem(hwnd
, IDC_DMA_LIST
);
453 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
454 GetClientRect(hwndLV
, &rc
);
456 /* Load the column labels from the resource file. */
458 lvC
.cx
= (rc
.right
- rc
.left
) / 2;
459 LoadStringW(hInst
, IDS_DMA_CHANNEL
, szText
, COUNT_OF(szText
));
460 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
464 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
465 LoadStringW(hInst
, IDS_DMA_PORT
, szText
, COUNT_OF(szText
));
466 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
471 hwndLV
= GetDlgItem(hwnd
, IDC_IRQ_LIST
);
472 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
473 GetClientRect(hwndLV
, &rc
);
474 width
= (rc
.right
- rc
.left
) / 4;
476 /* Load the column labels from the resource file. */
479 LoadStringW(hInst
, IDS_INTERRUPT_VECTOR
, szText
, COUNT_OF(szText
));
480 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
484 LoadStringW(hInst
, IDS_INTERRUPT_LEVEL
, szText
, COUNT_OF(szText
));
485 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
489 LoadStringW(hInst
, IDS_INTERRUPT_AFFINITY
, szText
, COUNT_OF(szText
));
490 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
494 lvC
.cx
= (rc
.right
- rc
.left
) - 3 * width
;
495 LoadStringW(hInst
, IDS_INTERRUPT_TYPE
, szText
, COUNT_OF(szText
));
496 if (ListView_InsertColumn(hwndLV
, 3, &lvC
) == -1)
501 hwndLV
= GetDlgItem(hwnd
, IDC_MEMORY_LIST
);
502 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
503 GetClientRect(hwndLV
, &rc
);
504 width
= (rc
.right
- rc
.left
) / 3;
506 /* Load the column labels from the resource file. */
509 LoadStringW(hInst
, IDS_MEMORY_ADDRESS
, szText
, COUNT_OF(szText
));
510 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
514 LoadStringW(hInst
, IDS_MEMORY_LENGTH
, szText
, COUNT_OF(szText
));
515 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
519 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
520 LoadStringW(hInst
, IDS_MEMORY_ACCESS
, szText
, COUNT_OF(szText
));
521 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
526 hwndLV
= GetDlgItem(hwnd
, IDC_PORT_LIST
);
527 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
528 GetClientRect(hwndLV
, &rc
);
529 width
= (rc
.right
- rc
.left
) / 3;
531 /* Load the column labels from the resource file. */
534 LoadStringW(hInst
, IDS_PORT_ADDRESS
, szText
, COUNT_OF(szText
));
535 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
539 LoadStringW(hInst
, IDS_PORT_LENGTH
, szText
, COUNT_OF(szText
));
540 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
544 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
545 LoadStringW(hInst
, IDS_PORT_ACCESS
, szText
, COUNT_OF(szText
));
546 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
549 /* Device specific list */
550 hwndLV
= GetDlgItem(hwnd
, IDC_DEVICE_LIST
);
551 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
552 GetClientRect(hwndLV
, &rc
);
553 width
= (rc
.right
- rc
.left
) / 3;
555 /* Load the column labels from the resource file. */
558 LoadStringW(hInst
, IDS_SPECIFIC_RESERVED1
, szText
, COUNT_OF(szText
));
559 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
563 LoadStringW(hInst
, IDS_SPECIFIC_RESERVED2
, szText
, COUNT_OF(szText
));
564 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
568 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
569 LoadStringW(hInst
, IDS_SPECIFIC_DATASIZE
, szText
, COUNT_OF(szText
));
570 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
577 GetInterfaceType(INTERFACE_TYPE InterfaceType
,
581 // LPWSTR lpInterfaceType;
583 switch (InterfaceType
)
585 case InterfaceTypeUndefined
:
586 LoadStringW(hInst
, IDS_BUS_UNDEFINED
, pBuffer
, dwLength
);
587 // lpInterfaceType = L"Undefined";
590 LoadStringW(hInst
, IDS_BUS_INTERNAL
, pBuffer
, dwLength
);
591 // lpInterfaceType = L"Internal";
594 LoadStringW(hInst
, IDS_BUS_ISA
, pBuffer
, dwLength
);
595 // lpInterfaceType = L"Isa";
598 LoadStringW(hInst
, IDS_BUS_EISA
, pBuffer
, dwLength
);
599 // lpInterfaceType = L"Eisa";
602 LoadStringW(hInst
, IDS_BUS_MICROCHANNEL
, pBuffer
, dwLength
);
603 // lpInterfaceType = L"MicroChannel";
606 LoadStringW(hInst
, IDS_BUS_TURBOCHANNEL
, pBuffer
, dwLength
);
607 // lpInterfaceType = L"TurboChannel";
610 LoadStringW(hInst
, IDS_BUS_PCIBUS
, pBuffer
, dwLength
);
611 // lpInterfaceType = L"PCIBus";
614 LoadStringW(hInst
, IDS_BUS_VMEBUS
, pBuffer
, dwLength
);
615 // lpInterfaceType = L"VMEBus";
618 LoadStringW(hInst
, IDS_BUS_NUBUS
, pBuffer
, dwLength
);
619 // lpInterfaceType = L"NuBus";
622 LoadStringW(hInst
, IDS_BUS_PCMCIABUS
, pBuffer
, dwLength
);
623 // lpInterfaceType = L"PCMCIABus";
626 LoadStringW(hInst
, IDS_BUS_CBUS
, pBuffer
, dwLength
);
627 // lpInterfaceType = L"CBus";
630 LoadStringW(hInst
, IDS_BUS_MPIBUS
, pBuffer
, dwLength
);
631 // lpInterfaceType = L"MPIBus";
634 LoadStringW(hInst
, IDS_BUS_MPSABUS
, pBuffer
, dwLength
);
635 // lpInterfaceType = L"MPSABus";
637 case ProcessorInternal
:
638 LoadStringW(hInst
, IDS_BUS_PROCESSORINTERNAL
, pBuffer
, dwLength
);
639 // lpInterfaceType = L"ProcessorInternal";
641 case InternalPowerBus
:
642 LoadStringW(hInst
, IDS_BUS_INTERNALPOWERBUS
, pBuffer
, dwLength
);
643 // lpInterfaceType = L"InternalPowerBus";
646 LoadStringW(hInst
, IDS_BUS_PNPISABUS
, pBuffer
, dwLength
);
647 // lpInterfaceType = L"PNPISABus";
650 LoadStringW(hInst
, IDS_BUS_PNPBUS
, pBuffer
, dwLength
);
651 // lpInterfaceType = L"PNPBus";
654 LoadStringW(hInst
, IDS_BUS_UNKNOWNTYPE
, pBuffer
, dwLength
);
655 // lpInterfaceType = L"Unknown interface type";
659 // wcscpy(pBuffer, lpInterfaceType);
664 ParseResources(HWND hwnd
)
666 PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor
;
667 PCM_PARTIAL_RESOURCE_LIST pPartialResourceList
;
668 PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor
;
676 pFullDescriptor
= &resourceValueData
->List
[0];
677 for (i
= 0; i
< fullResourceIndex
; i
++)
679 pFullDescriptor
= (PVOID
)(pFullDescriptor
->PartialResourceList
.PartialDescriptors
+
680 pFullDescriptor
->PartialResourceList
.Count
);
682 pPartialResourceList
= &pFullDescriptor
->PartialResourceList
;
685 GetInterfaceType(pFullDescriptor
->InterfaceType
, buffer
, 80);
686 SetDlgItemTextW(hwnd
, IDC_INTERFACETYPE
, buffer
);
689 SetDlgItemInt(hwnd
, IDC_BUSNUMBER
, (UINT
)pFullDescriptor
->BusNumber
, FALSE
);
692 SetDlgItemInt(hwnd
, IDC_VERSION
, (UINT
)pPartialResourceList
->Version
, FALSE
);
695 SetDlgItemInt(hwnd
, IDC_REVISION
, (UINT
)pPartialResourceList
->Revision
, FALSE
);
697 for (i
= 0; i
< pPartialResourceList
->Count
; i
++)
699 pDescriptor
= &pPartialResourceList
->PartialDescriptors
[i
];
701 switch (pDescriptor
->Type
)
703 case CmResourceTypePort
:
704 hwndLV
= GetDlgItem(hwnd
, IDC_PORT_LIST
);
707 wsprintf(buffer
, L
"0x%016I64x", pDescriptor
->u
.Port
.Start
.QuadPart
);
709 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Port
.Start
.u
.LowPart
);
712 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
717 item
.pszText
= buffer
;
718 item
.cchTextMax
= (int)wcslen(item
.pszText
);
719 item
.lParam
= (LPARAM
)pDescriptor
;
721 iItem
= ListView_InsertItem(hwndLV
, &item
);
724 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.Port
.Length
);
725 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
727 if (pDescriptor
->Flags
& CM_RESOURCE_PORT_IO
)
728 LoadStringW(hInst
, IDS_PORT_PORT_IO
, buffer
, COUNT_OF(buffer
));
730 LoadStringW(hInst
, IDS_PORT_MEMORY_IO
, buffer
, COUNT_OF(buffer
));
731 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
735 case CmResourceTypeInterrupt
:
736 hwndLV
= GetDlgItem(hwnd
, IDC_IRQ_LIST
);
738 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Interrupt
.Vector
);
740 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
745 item
.pszText
= buffer
;
746 item
.cchTextMax
= (int)wcslen(item
.pszText
);
747 item
.lParam
= (LPARAM
)pDescriptor
;
749 iItem
= ListView_InsertItem(hwndLV
, &item
);
752 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Interrupt
.Level
);
753 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
755 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Interrupt
.Affinity
);
756 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
758 if (pDescriptor
->Flags
& CM_RESOURCE_INTERRUPT_LATCHED
)
759 LoadStringW(hInst
, IDS_INTERRUPT_EDGE_SENSITIVE
, buffer
, COUNT_OF(buffer
));
761 LoadStringW(hInst
, IDS_INTERRUPT_LEVEL_SENSITIVE
, buffer
, COUNT_OF(buffer
));
763 ListView_SetItemText(hwndLV
, iItem
, 3, buffer
);
767 case CmResourceTypeMemory
:
768 hwndLV
= GetDlgItem(hwnd
, IDC_MEMORY_LIST
);
771 wsprintf(buffer
, L
"0x%016I64x", pDescriptor
->u
.Memory
.Start
.QuadPart
);
773 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Memory
.Start
.u
.LowPart
);
776 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
781 item
.pszText
= buffer
;
782 item
.cchTextMax
= (int)wcslen(item
.pszText
);
783 item
.lParam
= (LPARAM
)pDescriptor
;
785 iItem
= ListView_InsertItem(hwndLV
, &item
);
788 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.Memory
.Length
);
789 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
791 switch (pDescriptor
->Flags
& (CM_RESOURCE_MEMORY_READ_ONLY
| CM_RESOURCE_MEMORY_WRITE_ONLY
))
793 case CM_RESOURCE_MEMORY_READ_ONLY
:
794 LoadStringW(hInst
, IDS_MEMORY_READ_ONLY
, buffer
, COUNT_OF(buffer
));
797 case CM_RESOURCE_MEMORY_WRITE_ONLY
:
798 LoadStringW(hInst
, IDS_MEMORY_WRITE_ONLY
, buffer
, COUNT_OF(buffer
));
802 LoadStringW(hInst
, IDS_MEMORY_READ_WRITE
, buffer
, COUNT_OF(buffer
));
806 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
810 case CmResourceTypeDma
:
811 hwndLV
= GetDlgItem(hwnd
, IDC_DMA_LIST
);
813 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Dma
.Channel
);
815 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
820 item
.pszText
= buffer
;
821 item
.cchTextMax
= (int)wcslen(item
.pszText
);
822 item
.lParam
= (LPARAM
)pDescriptor
;
824 iItem
= ListView_InsertItem(hwndLV
, &item
);
827 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Dma
.Port
);
828 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
832 case CmResourceTypeDeviceSpecific
:
833 hwndLV
= GetDlgItem(hwnd
, IDC_DEVICE_LIST
);
835 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.DeviceSpecificData
.Reserved1
);
837 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
842 item
.pszText
= buffer
;
843 item
.cchTextMax
= (int)wcslen(item
.pszText
);
844 item
.lParam
= (LPARAM
)pDescriptor
;
846 iItem
= ListView_InsertItem(hwndLV
, &item
);
849 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.DeviceSpecificData
.Reserved2
);
850 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
852 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.DeviceSpecificData
.DataSize
);
853 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
862 OnResourceNotify(HWND hwndDlg
, NMHDR
*phdr
)
864 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
866 switch (phdr
->idFrom
)
869 case IDC_MEMORY_LIST
:
872 case IDC_DEVICE_LIST
:
876 if (lpnmlv
->iItem
!= -1)
878 PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor
;
881 item
.mask
= LVIF_PARAM
;
882 item
.iItem
= lpnmlv
->iItem
;
885 if (ListView_GetItem(phdr
->hwndFrom
, &item
))
887 pDescriptor
= (PCM_PARTIAL_RESOURCE_DESCRIPTOR
)item
.lParam
;
889 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNDETERMINED
),
890 (pDescriptor
->ShareDisposition
== CmResourceShareUndetermined
));
892 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHARED
),
893 (pDescriptor
->ShareDisposition
== CmResourceShareShared
));
895 EnableWindow(GetDlgItem(hwndDlg
, IDC_DEVICE_EXCLUSIVE
),
896 (pDescriptor
->ShareDisposition
== CmResourceShareDeviceExclusive
));
898 EnableWindow(GetDlgItem(hwndDlg
, IDC_DRIVER_EXCLUSIVE
),
899 (pDescriptor
->ShareDisposition
== CmResourceShareDriverExclusive
));
904 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNDETERMINED
), FALSE
);
905 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHARED
), FALSE
);
906 EnableWindow(GetDlgItem(hwndDlg
, IDC_DEVICE_EXCLUSIVE
), FALSE
);
907 EnableWindow(GetDlgItem(hwndDlg
, IDC_DRIVER_EXCLUSIVE
), FALSE
);
918 static INT_PTR CALLBACK
modify_resource_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
920 UNREFERENCED_PARAMETER(lParam
);
925 CreateResourceColumns(hwndDlg
);
926 ParseResources(hwndDlg
);
930 return OnResourceNotify(hwndDlg
, (NMHDR
*)lParam
);
933 switch (LOWORD(wParam
))
936 EndDialog(hwndDlg
, IDOK
);
939 EndDialog(hwndDlg
, IDCANCEL
);
946 static BOOL
CreateResourceListColumns(HWND hWndListView
)
952 ListView_SetExtendedListViewStyle(hWndListView
, LVS_EX_FULLROWSELECT
);
954 GetClientRect(hWndListView
, &rc
);
956 /* Create columns. */
957 lvC
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
;
958 lvC
.pszText
= szText
;
959 lvC
.fmt
= LVCFMT_LEFT
;
961 /* Load the column labels from the resource file. */
963 lvC
.cx
= (rc
.right
- rc
.left
) / 2;
964 LoadStringW(hInst
, IDS_BUSNUMBER
, szText
, COUNT_OF(szText
));
965 if (ListView_InsertColumn(hWndListView
, 0, &lvC
) == -1)
969 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
970 LoadStringW(hInst
, IDS_INTERFACE
, szText
, COUNT_OF(szText
));
971 if (ListView_InsertColumn(hWndListView
, 1, &lvC
) == -1)
977 static VOID
AddFullResourcesToList(HWND hwnd
)
979 PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor
;
985 pFullDescriptor
= &resourceValueData
->List
[0];
986 for (i
= 0; i
< resourceValueData
->Count
; i
++)
988 wsprintf(buffer
, L
"%lu", pFullDescriptor
->BusNumber
);
990 item
.mask
= LVIF_TEXT
;
995 item
.pszText
= buffer
;
996 item
.cchTextMax
= (int)wcslen(item
.pszText
);
998 iItem
= ListView_InsertItem(hwnd
, &item
);
1001 GetInterfaceType(pFullDescriptor
->InterfaceType
, buffer
, 80);
1002 ListView_SetItemText(hwnd
, iItem
, 1, buffer
);
1004 pFullDescriptor
= (PVOID
)(pFullDescriptor
->PartialResourceList
.PartialDescriptors
+
1005 pFullDescriptor
->PartialResourceList
.Count
);
1010 OnResourceListNotify(HWND hwndDlg
, NMHDR
*phdr
)
1012 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
1014 switch (phdr
->idFrom
)
1016 case IDC_RESOURCE_LIST
:
1020 fullResourceIndex
= lpnmlv
->iItem
;
1021 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHOW_RESOURCE
), (lpnmlv
->iItem
!= -1));
1025 if (lpnmlv
->iItem
!= -1)
1027 fullResourceIndex
= lpnmlv
->iItem
;
1028 DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE
), hwndDlg
, modify_resource_dlgproc
);
1039 static INT_PTR CALLBACK
modify_resource_list_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1041 UNREFERENCED_PARAMETER(lParam
);
1046 CreateResourceListColumns(GetDlgItem(hwndDlg
, IDC_RESOURCE_LIST
));
1047 AddFullResourcesToList(GetDlgItem(hwndDlg
, IDC_RESOURCE_LIST
));
1051 return OnResourceListNotify(hwndDlg
, (NMHDR
*)lParam
);
1054 switch (LOWORD(wParam
))
1056 case IDC_SHOW_RESOURCE
:
1057 if (fullResourceIndex
!= -1)
1058 DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE
), hwndDlg
, modify_resource_dlgproc
);
1061 EndDialog(hwndDlg
, IDOK
);
1064 EndDialog(hwndDlg
, IDCANCEL
);
1072 BOOL
ModifyValue(HWND hwnd
, HKEY hKey
, LPCWSTR valueName
, BOOL EditBin
)
1076 BOOL result
= FALSE
;
1081 editValueName
= valueName
;
1083 lRet
= RegQueryValueExW(hKey
, valueName
, 0, &type
, 0, &valueDataLen
);
1084 if (lRet
!= ERROR_SUCCESS
&& (valueName
== NULL
|| !valueName
[0]))
1086 lRet
= ERROR_SUCCESS
; /* Allow editing of (Default) values which don't exist */
1089 stringValueData
= NULL
;
1090 binValueData
= NULL
;
1093 if (lRet
!= ERROR_SUCCESS
)
1095 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1099 if (EditBin
== FALSE
&& ((type
== REG_SZ
) || (type
== REG_EXPAND_SZ
)))
1101 if (valueDataLen
> 0)
1103 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
)))
1105 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1108 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
1109 if (lRet
!= ERROR_SUCCESS
)
1111 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1117 stringValueData
= NULL
;
1120 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING
), hwnd
, modify_string_dlgproc
) == IDOK
)
1122 if (stringValueData
)
1124 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)stringValueData
, (DWORD
) (wcslen(stringValueData
) + 1) * sizeof(WCHAR
));
1128 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, NULL
, 0);
1130 if (lRet
== ERROR_SUCCESS
)
1134 else if (EditBin
== FALSE
&& type
== REG_MULTI_SZ
)
1136 if (valueDataLen
> 0)
1138 size_t llen
, listlen
, nl_len
;
1139 LPWSTR src
, lines
= NULL
;
1141 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, valueDataLen
+ sizeof(WCHAR
))))
1143 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1146 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
1147 if (lRet
!= ERROR_SUCCESS
)
1149 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1153 /* convert \0 to \r\n */
1154 src
= stringValueData
;
1155 nl_len
= wcslen(L
"\r\n") * sizeof(WCHAR
);
1156 listlen
= sizeof(WCHAR
);
1157 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, listlen
+ sizeof(WCHAR
));
1158 while(*src
!= L
'\0')
1163 listlen
+= (llen
* sizeof(WCHAR
)) + nl_len
;
1164 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, listlen
);
1166 wcscat(lines
, L
"\r\n");
1169 HeapFree(GetProcessHeap(), 0, stringValueData
);
1170 stringValueData
= lines
;
1174 stringValueData
= NULL
;
1177 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_MULTI_STRING
), hwnd
, modify_multi_string_dlgproc
) == IDOK
)
1179 if (stringValueData
)
1181 /* convert \r\n to \0 */
1182 BOOL EmptyLines
= FALSE
;
1183 LPWSTR src
, lines
, nl
;
1184 size_t linechars
, buflen
, c_nl
, dest
;
1186 src
= stringValueData
;
1187 buflen
= sizeof(WCHAR
);
1188 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, buflen
+ sizeof(WCHAR
));
1189 c_nl
= wcslen(L
"\r\n");
1191 while(*src
!= L
'\0')
1193 if((nl
= wcsstr(src
, L
"\r\n")))
1195 linechars
= nl
- src
;
1205 linechars
= wcslen(src
);
1209 buflen
+= ((linechars
+ 1) * sizeof(WCHAR
));
1210 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, buflen
);
1211 memcpy((lines
+ dest
), src
, linechars
* sizeof(WCHAR
));
1213 lines
[dest
++] = L
'\0';
1219 src
+= linechars
+ (nl
!= NULL
? c_nl
: 0);
1221 lines
[++dest
] = L
'\0';
1225 warning(hwnd
, IDS_MULTI_SZ_EMPTY_STRING
);
1228 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)lines
, (DWORD
) buflen
);
1229 HeapFree(GetProcessHeap(), 0, lines
);
1233 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, NULL
, 0);
1235 if (lRet
== ERROR_SUCCESS
)
1239 else if (EditBin
== FALSE
&& type
== REG_DWORD
)
1241 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)&dwordValueData
, &valueDataLen
);
1242 if (lRet
!= ERROR_SUCCESS
)
1244 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1248 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD
), hwnd
, modify_dword_dlgproc
) == IDOK
)
1250 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)&dwordValueData
, sizeof(DWORD
));
1251 if (lRet
== ERROR_SUCCESS
)
1255 else if (EditBin
== FALSE
&& type
== REG_RESOURCE_LIST
)
1257 if (valueDataLen
> 0)
1259 resourceValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
);
1260 if (resourceValueData
== NULL
)
1262 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1266 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)resourceValueData
, &valueDataLen
);
1267 if (lRet
!= ERROR_SUCCESS
)
1269 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1275 resourceValueData
= NULL
;
1278 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE_LIST
), hwnd
, modify_resource_list_dlgproc
) == IDOK
)
1282 else if (EditBin
== TRUE
|| type
== REG_NONE
|| type
== REG_BINARY
)
1284 if(valueDataLen
> 0)
1286 if(!(binValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
+ 1)))
1288 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1292 /* Use the unicode version, so editing strings in binary mode is correct */
1293 lRet
= RegQueryValueExW(hKey
, valueName
,
1294 0, 0, (LPBYTE
)binValueData
, &valueDataLen
);
1295 if (lRet
!= ERROR_SUCCESS
)
1297 HeapFree(GetProcessHeap(), 0, binValueData
);
1298 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1304 binValueData
= NULL
;
1307 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_BIN_DATA
), hwnd
, modify_binary_dlgproc
) == IDOK
)
1309 /* Use the unicode version, so editing strings in binary mode is correct */
1310 lRet
= RegSetValueExW(hKey
, valueName
,
1311 0, type
, (LPBYTE
)binValueData
, valueDataLen
);
1312 if (lRet
== ERROR_SUCCESS
)
1315 if(binValueData
!= NULL
)
1316 HeapFree(GetProcessHeap(), 0, binValueData
);
1320 error(hwnd
, IDS_UNSUPPORTED_TYPE
, type
);
1324 if (resourceValueData
)
1325 HeapFree(GetProcessHeap(), 0, resourceValueData
);
1326 resourceValueData
= NULL
;
1328 if (stringValueData
)
1329 HeapFree(GetProcessHeap(), 0, stringValueData
);
1330 stringValueData
= NULL
;
1335 static LONG
CopyKey(HKEY hDestKey
, LPCWSTR lpDestSubKey
, HKEY hSrcKey
, LPCWSTR lpSrcSubKey
)
1338 DWORD dwDisposition
;
1339 HKEY hDestSubKey
= NULL
;
1340 HKEY hSrcSubKey
= NULL
;
1341 DWORD dwIndex
, dwType
, cbName
, cbData
;
1342 WCHAR szSubKey
[256];
1343 WCHAR szValueName
[256];
1344 BYTE szValueData
[512];
1348 /* open the source subkey, if specified */
1351 lResult
= RegOpenKeyExW(hSrcKey
, lpSrcSubKey
, 0, KEY_ALL_ACCESS
, &hSrcSubKey
);
1354 hSrcKey
= hSrcSubKey
;
1357 /* create the destination subkey */
1358 lResult
= RegCreateKeyExW(hDestKey
, lpDestSubKey
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
,
1359 &hDestSubKey
, &dwDisposition
);
1363 /* copy all subkeys */
1367 cbName
= sizeof(szSubKey
) / sizeof(szSubKey
[0]);
1368 lResult
= RegEnumKeyExW(hSrcKey
, dwIndex
++, szSubKey
, &cbName
, NULL
, NULL
, NULL
, &ft
);
1369 if (lResult
== ERROR_SUCCESS
)
1371 lResult
= CopyKey(hDestSubKey
, szSubKey
, hSrcKey
, szSubKey
);
1376 while(lResult
== ERROR_SUCCESS
);
1378 /* copy all subvalues */
1382 cbName
= sizeof(szValueName
) / sizeof(szValueName
[0]);
1383 cbData
= sizeof(szValueData
) / sizeof(szValueData
[0]);
1384 lResult
= RegEnumValueW(hSrcKey
, dwIndex
++, szValueName
, &cbName
, NULL
, &dwType
, szValueData
, &cbData
);
1385 if (lResult
== ERROR_SUCCESS
)
1387 lResult
= RegSetValueExW(hDestSubKey
, szValueName
, 0, dwType
, szValueData
, cbData
);
1392 while(lResult
== ERROR_SUCCESS
);
1394 lResult
= ERROR_SUCCESS
;
1398 RegCloseKey(hSrcSubKey
);
1400 RegCloseKey(hDestSubKey
);
1401 if (lResult
!= ERROR_SUCCESS
)
1402 SHDeleteKey(hDestKey
, lpDestSubKey
);
1406 static LONG
MoveKey(HKEY hDestKey
, LPCWSTR lpDestSubKey
, HKEY hSrcKey
, LPCWSTR lpSrcSubKey
)
1411 return ERROR_INVALID_FUNCTION
;
1413 if (_wcsicmp(lpDestSubKey
, lpSrcSubKey
) == 0)
1415 /* Destination name equals source name */
1416 return ERROR_SUCCESS
;
1419 lResult
= CopyKey(hDestKey
, lpDestSubKey
, hSrcKey
, lpSrcSubKey
);
1420 if (lResult
== ERROR_SUCCESS
)
1421 SHDeleteKey(hSrcKey
, lpSrcSubKey
);
1426 BOOL
DeleteKey(HWND hwnd
, HKEY hKeyRoot
, LPCWSTR keyPath
)
1428 WCHAR msg
[128], caption
[128];
1429 BOOL result
= FALSE
;
1433 lRet
= RegOpenKeyExW(hKeyRoot
, keyPath
, 0, KEY_READ
|KEY_SET_VALUE
, &hKey
);
1434 if (lRet
!= ERROR_SUCCESS
)
1436 error_code_messagebox(hwnd
, lRet
);
1440 LoadStringW(hInst
, IDS_QUERY_DELETE_KEY_CONFIRM
, caption
, COUNT_OF(caption
));
1441 LoadStringW(hInst
, IDS_QUERY_DELETE_KEY_ONE
, msg
, COUNT_OF(msg
));
1443 if (MessageBoxW(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) != IDYES
)
1446 lRet
= SHDeleteKey(hKeyRoot
, keyPath
);
1447 if (lRet
!= ERROR_SUCCESS
)
1449 error(hwnd
, IDS_BAD_KEY
, keyPath
);
1459 LONG
RenameKey(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpNewName
)
1462 LPWSTR lpNewSubKey
= NULL
;
1468 s
= wcsrchr(lpSubKey
, L
'\\');
1472 lpNewSubKey
= (LPWSTR
) HeapAlloc(GetProcessHeap(), 0, (s
- lpSubKey
+ wcslen(lpNewName
) + 1) * sizeof(WCHAR
));
1473 if (lpNewSubKey
!= NULL
)
1475 memcpy(lpNewSubKey
, lpSubKey
, (s
- lpSubKey
) * sizeof(WCHAR
));
1476 wcscpy(lpNewSubKey
+ (s
- lpSubKey
), lpNewName
);
1477 lpNewName
= lpNewSubKey
;
1480 return ERROR_NOT_ENOUGH_MEMORY
;
1483 Ret
= MoveKey(hKey
, lpNewName
, hKey
, lpSubKey
);
1487 HeapFree(GetProcessHeap(), 0, lpNewSubKey
);
1492 LONG
RenameValue(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpDestValue
, LPCWSTR lpSrcValue
)
1495 HKEY hSubKey
= NULL
;
1496 DWORD dwType
, cbData
;
1501 lResult
= RegOpenKeyW(hKey
, lpSubKey
, &hSubKey
);
1502 if (lResult
!= ERROR_SUCCESS
)
1507 cbData
= sizeof(data
);
1508 lResult
= RegQueryValueExW(hKey
, lpSrcValue
, NULL
, &dwType
, data
, &cbData
);
1509 if (lResult
!= ERROR_SUCCESS
)
1512 lResult
= RegSetValueExW(hKey
, lpDestValue
, 0, dwType
, data
, cbData
);
1513 if (lResult
!= ERROR_SUCCESS
)
1516 RegDeleteValue(hKey
, lpSrcValue
);
1520 RegCloseKey(hSubKey
);
1524 LONG
QueryStringValue(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpValueName
, LPWSTR pszBuffer
, DWORD dwBufferLen
)
1527 HKEY hSubKey
= NULL
;
1528 DWORD cbData
, dwType
;
1532 lResult
= RegOpenKeyW(hKey
, lpSubKey
, &hSubKey
);
1533 if (lResult
!= ERROR_SUCCESS
)
1538 cbData
= (dwBufferLen
- 1) * sizeof(*pszBuffer
);
1539 lResult
= RegQueryValueExW(hKey
, lpValueName
, NULL
, &dwType
, (LPBYTE
) pszBuffer
, &cbData
);
1540 if (lResult
!= ERROR_SUCCESS
)
1542 if (dwType
!= REG_SZ
)
1548 pszBuffer
[cbData
/ sizeof(*pszBuffer
)] = L
'\0';
1551 if (lResult
!= ERROR_SUCCESS
)
1552 pszBuffer
[0] = L
'\0';
1554 RegCloseKey(hSubKey
);
1558 BOOL
GetKeyName(LPWSTR pszDest
, size_t iDestLength
, HKEY hRootKey
, LPCWSTR lpSubKey
)
1562 if (hRootKey
== HKEY_CLASSES_ROOT
)
1563 pszRootKey
= L
"HKEY_CLASSES_ROOT";
1564 else if (hRootKey
== HKEY_CURRENT_USER
)
1565 pszRootKey
= L
"HKEY_CURRENT_USER";
1566 else if (hRootKey
== HKEY_LOCAL_MACHINE
)
1567 pszRootKey
= L
"HKEY_LOCAL_MACHINE";
1568 else if (hRootKey
== HKEY_USERS
)
1569 pszRootKey
= L
"HKEY_USERS";
1570 else if (hRootKey
== HKEY_CURRENT_CONFIG
)
1571 pszRootKey
= L
"HKEY_CURRENT_CONFIG";
1572 else if (hRootKey
== HKEY_DYN_DATA
)
1573 pszRootKey
= L
"HKEY_DYN_DATA";
1578 _snwprintf(pszDest
, iDestLength
, L
"%s\\%s", pszRootKey
, lpSubKey
);
1580 _snwprintf(pszDest
, iDestLength
, L
"%s", pszRootKey
);