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 WCHAR
* editValueName
;
31 static WCHAR
* stringValueData
;
32 static PVOID binValueData
;
33 static DWORD dwordValueData
;
34 static PCM_RESOURCE_LIST resourceValueData
;
35 static INT fullResourceIndex
= -1;
36 static DWORD valueDataLen
;
37 static EDIT_MODE dwordEditMode
= EDIT_MODE_HEX
;
39 void error(HWND hwnd
, INT resId
, ...)
47 hInstance
= GetModuleHandle(0);
49 if (!LoadStringW(hInstance
, IDS_ERROR
, title
, COUNT_OF(title
)))
50 wcscpy(title
, L
"Error");
52 if (!LoadStringW(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
53 wcscpy(errfmt
, L
"Unknown error string!");
56 _vsnwprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
59 MessageBoxW(hwnd
, errstr
, title
, MB_OK
| MB_ICONERROR
);
62 static void error_code_messagebox(HWND hwnd
, DWORD error_code
)
65 if (!LoadStringW(hInst
, IDS_ERROR
, title
, COUNT_OF(title
)))
66 wcscpy(title
, L
"Error");
67 ErrorMessageBox(hwnd
, title
, error_code
);
70 void warning(HWND hwnd
, INT resId
, ...)
78 hInstance
= GetModuleHandle(0);
80 if (!LoadStringW(hInstance
, IDS_WARNING
, title
, COUNT_OF(title
)))
81 wcscpy(title
, L
"Warning");
83 if (!LoadStringW(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
84 wcscpy(errfmt
, L
"Unknown error string!");
87 _vsnwprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
90 MessageBoxW(hwnd
, errstr
, title
, MB_OK
| MB_ICONSTOP
);
93 INT_PTR CALLBACK
modify_string_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
99 UNREFERENCED_PARAMETER(lParam
);
104 if (editValueName
&& wcscmp(editValueName
, L
""))
106 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
111 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
112 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
114 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, stringValueData
);
115 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
118 switch (LOWORD(wParam
))
121 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
123 if ((len
= GetWindowTextLength(hwndValue
)))
127 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(WCHAR
))))
129 stringValueData
= valueData
;
130 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
131 *stringValueData
= 0;
136 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(WCHAR
))))
138 stringValueData
= valueData
;
139 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
140 *stringValueData
= 0;
147 *stringValueData
= 0;
150 EndDialog(hwndDlg
, IDOK
);
153 EndDialog(hwndDlg
, IDCANCEL
);
161 INT_PTR CALLBACK
modify_multi_string_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
167 UNREFERENCED_PARAMETER(lParam
);
172 if (editValueName
&& wcscmp(editValueName
, L
""))
174 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
179 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
180 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
182 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, stringValueData
);
183 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
186 switch (LOWORD(wParam
))
189 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
191 if ((len
= GetWindowTextLength(hwndValue
)))
195 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(WCHAR
))))
197 stringValueData
= valueData
;
198 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
199 *stringValueData
= 0;
204 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(WCHAR
))))
206 stringValueData
= valueData
;
207 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
208 *stringValueData
= 0;
215 *stringValueData
= 0;
218 EndDialog(hwndDlg
, IDOK
);
221 EndDialog(hwndDlg
, IDCANCEL
);
229 LRESULT CALLBACK
DwordEditSubclassProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
233 oldwndproc
= (WNDPROC
)(LONG_PTR
)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
238 if (dwordEditMode
== EDIT_MODE_DEC
)
240 if (isdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
249 else if (dwordEditMode
== EDIT_MODE_HEX
)
251 if (isxdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
266 return CallWindowProcW(oldwndproc
, hwnd
, uMsg
, wParam
, lParam
);
270 INT_PTR CALLBACK
modify_dword_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
274 WCHAR ValueString
[32];
279 UNREFERENCED_PARAMETER(lParam
);
284 dwordEditMode
= EDIT_MODE_HEX
;
286 /* subclass the edit control */
287 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
288 oldproc
= (WNDPROC
)(LONG_PTR
)GetWindowLongPtr(hwndValue
, GWLP_WNDPROC
);
289 SetWindowLongPtr(hwndValue
, GWLP_USERDATA
, (DWORD_PTR
)oldproc
);
290 SetWindowLongPtr(hwndValue
, GWLP_WNDPROC
, (DWORD_PTR
)DwordEditSubclassProc
);
292 if (editValueName
&& wcscmp(editValueName
, L
""))
294 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
299 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
300 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
302 CheckRadioButton (hwndDlg
, IDC_FORMAT_HEX
, IDC_FORMAT_DEC
, IDC_FORMAT_HEX
);
303 swprintf(ValueString
, L
"%lx", dwordValueData
);
304 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
305 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
309 switch (LOWORD(wParam
))
312 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_DEC
)
314 dwordEditMode
= EDIT_MODE_HEX
;
315 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
317 if (GetWindowTextLength(hwndValue
))
319 if (GetWindowTextW(hwndValue
, ValueString
, 32))
321 Value
= wcstoul (ValueString
, &Remainder
, 10);
325 swprintf(ValueString
, L
"%lx", Value
);
326 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
332 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_HEX
)
334 dwordEditMode
= EDIT_MODE_DEC
;
335 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
337 if (GetWindowTextLength(hwndValue
))
339 if (GetWindowTextW(hwndValue
, ValueString
, 32))
341 Value
= wcstoul (ValueString
, &Remainder
, 16);
345 swprintf(ValueString
, L
"%lu", Value
);
346 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
352 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
354 if (GetWindowTextLength(hwndValue
))
356 if (!GetWindowTextW(hwndValue
, ValueString
, 32))
358 EndDialog(hwndDlg
, IDCANCEL
);
362 Base
= (dwordEditMode
== EDIT_MODE_HEX
) ? 16 : 10;
363 dwordValueData
= wcstoul (ValueString
, &Remainder
, Base
);
367 EndDialog(hwndDlg
, IDCANCEL
);
371 EndDialog(hwndDlg
, IDOK
);
375 EndDialog(hwndDlg
, IDCANCEL
);
383 INT_PTR CALLBACK
modify_binary_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
388 UNREFERENCED_PARAMETER(lParam
);
393 if (editValueName
&& wcscmp(editValueName
, L
""))
395 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
400 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
401 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
403 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
404 HexEdit_LoadBuffer(hwndValue
, binValueData
, valueDataLen
);
405 /* reset the hex edit control's font */
406 SendMessageW(hwndValue
, WM_SETFONT
, 0, 0);
410 switch (LOWORD(wParam
))
413 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
415 len
= (UINT
) HexEdit_GetBufferSize(hwndValue
);
416 if (len
> 0 && binValueData
)
417 binValueData
= HeapReAlloc(GetProcessHeap(), 0, binValueData
, len
);
419 binValueData
= HeapAlloc(GetProcessHeap(), 0, len
+ 1);
420 HexEdit_CopyBuffer(hwndValue
, binValueData
, len
);
423 EndDialog(hwndDlg
, IDOK
);
426 EndDialog(hwndDlg
, IDCANCEL
);
434 static BOOL
CreateResourceColumns(HWND hwnd
)
442 /* Create columns. */
443 lvC
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
;
444 lvC
.pszText
= szText
;
445 lvC
.fmt
= LVCFMT_LEFT
;
447 hwndLV
= GetDlgItem(hwnd
, IDC_DMA_LIST
);
448 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
449 GetClientRect(hwndLV
, &rc
);
451 /* Load the column labels from the resource file. */
453 lvC
.cx
= (rc
.right
- rc
.left
) / 2;
454 LoadStringW(hInst
, IDS_DMA_CHANNEL
, szText
, COUNT_OF(szText
));
455 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
459 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
460 LoadStringW(hInst
, IDS_DMA_PORT
, szText
, COUNT_OF(szText
));
461 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
466 hwndLV
= GetDlgItem(hwnd
, IDC_IRQ_LIST
);
467 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
468 GetClientRect(hwndLV
, &rc
);
469 width
= (rc
.right
- rc
.left
) / 4;
471 /* Load the column labels from the resource file. */
474 LoadStringW(hInst
, IDS_INTERRUPT_VECTOR
, szText
, COUNT_OF(szText
));
475 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
479 LoadStringW(hInst
, IDS_INTERRUPT_LEVEL
, szText
, COUNT_OF(szText
));
480 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
484 LoadStringW(hInst
, IDS_INTERRUPT_AFFINITY
, szText
, COUNT_OF(szText
));
485 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
489 lvC
.cx
= (rc
.right
- rc
.left
) - 3 * width
;
490 LoadStringW(hInst
, IDS_INTERRUPT_TYPE
, szText
, COUNT_OF(szText
));
491 if (ListView_InsertColumn(hwndLV
, 3, &lvC
) == -1)
496 hwndLV
= GetDlgItem(hwnd
, IDC_MEMORY_LIST
);
497 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
498 GetClientRect(hwndLV
, &rc
);
499 width
= (rc
.right
- rc
.left
) / 3;
501 /* Load the column labels from the resource file. */
504 LoadStringW(hInst
, IDS_MEMORY_ADDRESS
, szText
, COUNT_OF(szText
));
505 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
509 LoadStringW(hInst
, IDS_MEMORY_LENGTH
, szText
, COUNT_OF(szText
));
510 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
514 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
515 LoadStringW(hInst
, IDS_MEMORY_ACCESS
, szText
, COUNT_OF(szText
));
516 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
521 hwndLV
= GetDlgItem(hwnd
, IDC_PORT_LIST
);
522 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
523 GetClientRect(hwndLV
, &rc
);
524 width
= (rc
.right
- rc
.left
) / 3;
526 /* Load the column labels from the resource file. */
529 LoadStringW(hInst
, IDS_PORT_ADDRESS
, szText
, COUNT_OF(szText
));
530 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
534 LoadStringW(hInst
, IDS_PORT_LENGTH
, szText
, COUNT_OF(szText
));
535 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
539 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
540 LoadStringW(hInst
, IDS_PORT_ACCESS
, szText
, COUNT_OF(szText
));
541 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
544 /* Device specific list */
545 hwndLV
= GetDlgItem(hwnd
, IDC_DEVICE_LIST
);
546 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
547 GetClientRect(hwndLV
, &rc
);
548 width
= (rc
.right
- rc
.left
) / 3;
550 /* Load the column labels from the resource file. */
553 LoadStringW(hInst
, IDS_SPECIFIC_RESERVED1
, szText
, COUNT_OF(szText
));
554 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
558 LoadStringW(hInst
, IDS_SPECIFIC_RESERVED2
, szText
, COUNT_OF(szText
));
559 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
563 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
564 LoadStringW(hInst
, IDS_SPECIFIC_DATASIZE
, szText
, COUNT_OF(szText
));
565 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
572 GetInterfaceType(INTERFACE_TYPE InterfaceType
,
576 // LPWSTR lpInterfaceType;
578 switch (InterfaceType
)
580 case InterfaceTypeUndefined
:
581 LoadStringW(hInst
, IDS_BUS_UNDEFINED
, pBuffer
, dwLength
);
582 // lpInterfaceType = L"Undefined";
585 LoadStringW(hInst
, IDS_BUS_INTERNAL
, pBuffer
, dwLength
);
586 // lpInterfaceType = L"Internal";
589 LoadStringW(hInst
, IDS_BUS_ISA
, pBuffer
, dwLength
);
590 // lpInterfaceType = L"Isa";
593 LoadStringW(hInst
, IDS_BUS_EISA
, pBuffer
, dwLength
);
594 // lpInterfaceType = L"Eisa";
597 LoadStringW(hInst
, IDS_BUS_MICROCHANNEL
, pBuffer
, dwLength
);
598 // lpInterfaceType = L"MicroChannel";
601 LoadStringW(hInst
, IDS_BUS_TURBOCHANNEL
, pBuffer
, dwLength
);
602 // lpInterfaceType = L"TurboChannel";
605 LoadStringW(hInst
, IDS_BUS_PCIBUS
, pBuffer
, dwLength
);
606 // lpInterfaceType = L"PCIBus";
609 LoadStringW(hInst
, IDS_BUS_VMEBUS
, pBuffer
, dwLength
);
610 // lpInterfaceType = L"VMEBus";
613 LoadStringW(hInst
, IDS_BUS_NUBUS
, pBuffer
, dwLength
);
614 // lpInterfaceType = L"NuBus";
617 LoadStringW(hInst
, IDS_BUS_PCMCIABUS
, pBuffer
, dwLength
);
618 // lpInterfaceType = L"PCMCIABus";
621 LoadStringW(hInst
, IDS_BUS_CBUS
, pBuffer
, dwLength
);
622 // lpInterfaceType = L"CBus";
625 LoadStringW(hInst
, IDS_BUS_MPIBUS
, pBuffer
, dwLength
);
626 // lpInterfaceType = L"MPIBus";
629 LoadStringW(hInst
, IDS_BUS_MPSABUS
, pBuffer
, dwLength
);
630 // lpInterfaceType = L"MPSABus";
632 case ProcessorInternal
:
633 LoadStringW(hInst
, IDS_BUS_PROCESSORINTERNAL
, pBuffer
, dwLength
);
634 // lpInterfaceType = L"ProcessorInternal";
636 case InternalPowerBus
:
637 LoadStringW(hInst
, IDS_BUS_INTERNALPOWERBUS
, pBuffer
, dwLength
);
638 // lpInterfaceType = L"InternalPowerBus";
641 LoadStringW(hInst
, IDS_BUS_PNPISABUS
, pBuffer
, dwLength
);
642 // lpInterfaceType = L"PNPISABus";
645 LoadStringW(hInst
, IDS_BUS_PNPBUS
, pBuffer
, dwLength
);
646 // lpInterfaceType = L"PNPBus";
649 LoadStringW(hInst
, IDS_BUS_UNKNOWNTYPE
, pBuffer
, dwLength
);
650 // lpInterfaceType = L"Unknown interface type";
654 // wcscpy(pBuffer, lpInterfaceType);
659 ParseResources(HWND hwnd
)
661 PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor
;
662 PCM_PARTIAL_RESOURCE_LIST pPartialResourceList
;
663 PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor
;
671 pFullDescriptor
= &resourceValueData
->List
[fullResourceIndex
];
672 pPartialResourceList
= &pFullDescriptor
->PartialResourceList
;
675 GetInterfaceType(pFullDescriptor
->InterfaceType
, buffer
, 80);
676 SetDlgItemTextW(hwnd
, IDC_INTERFACETYPE
, buffer
);
679 SetDlgItemInt(hwnd
, IDC_BUSNUMBER
, (UINT
)pFullDescriptor
->BusNumber
, FALSE
);
682 SetDlgItemInt(hwnd
, IDC_VERSION
, (UINT
)pPartialResourceList
->Version
, FALSE
);
685 SetDlgItemInt(hwnd
, IDC_REVISION
, (UINT
)pPartialResourceList
->Revision
, FALSE
);
687 for (i
= 0; i
< pPartialResourceList
->Count
; i
++)
689 pDescriptor
= &pPartialResourceList
->PartialDescriptors
[i
];
691 switch (pDescriptor
->Type
)
693 case CmResourceTypePort
:
694 hwndLV
= GetDlgItem(hwnd
, IDC_PORT_LIST
);
697 wsprintf(buffer
, L
"0x%16I64x", pDescriptor
->u
.Port
.Start
.QuadPart
);
699 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Port
.Start
.u
.LowPart
);
702 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
707 item
.pszText
= buffer
;
708 item
.cchTextMax
= (int)wcslen(item
.pszText
);
709 item
.lParam
= (LPARAM
)pDescriptor
;
711 iItem
= ListView_InsertItem(hwndLV
, &item
);
714 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.Port
.Length
);
715 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
717 if (pDescriptor
->Flags
& CM_RESOURCE_PORT_IO
)
718 LoadStringW(hInst
, IDS_PORT_PORT_IO
, buffer
, COUNT_OF(buffer
));
720 LoadStringW(hInst
, IDS_PORT_MEMORY_IO
, buffer
, COUNT_OF(buffer
));
721 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
725 case CmResourceTypeInterrupt
:
726 hwndLV
= GetDlgItem(hwnd
, IDC_IRQ_LIST
);
728 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Interrupt
.Vector
);
730 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
735 item
.pszText
= buffer
;
736 item
.cchTextMax
= (int)wcslen(item
.pszText
);
737 item
.lParam
= (LPARAM
)pDescriptor
;
739 iItem
= ListView_InsertItem(hwndLV
, &item
);
742 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Interrupt
.Level
);
743 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
745 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Interrupt
.Affinity
);
746 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
748 if (pDescriptor
->Flags
& CM_RESOURCE_INTERRUPT_LATCHED
)
749 LoadStringW(hInst
, IDS_INTERRUPT_EDGE_SENSITIVE
, buffer
, COUNT_OF(buffer
));
751 LoadStringW(hInst
, IDS_INTERRUPT_LEVEL_SENSITIVE
, buffer
, COUNT_OF(buffer
));
753 ListView_SetItemText(hwndLV
, iItem
, 3, buffer
);
757 case CmResourceTypeMemory
:
758 hwndLV
= GetDlgItem(hwnd
, IDC_MEMORY_LIST
);
761 wsprintf(buffer
, L
"0x%16I64x", pDescriptor
->u
.Memory
.Start
.QuadPart
);
763 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Memory
.Start
.u
.LowPart
);
766 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
771 item
.pszText
= buffer
;
772 item
.cchTextMax
= (int)wcslen(item
.pszText
);
773 item
.lParam
= (LPARAM
)pDescriptor
;
775 iItem
= ListView_InsertItem(hwndLV
, &item
);
778 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.Memory
.Length
);
779 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
781 switch (pDescriptor
->Flags
& (CM_RESOURCE_MEMORY_READ_ONLY
| CM_RESOURCE_MEMORY_WRITE_ONLY
))
783 case CM_RESOURCE_MEMORY_READ_ONLY
:
784 LoadStringW(hInst
, IDS_MEMORY_READ_ONLY
, buffer
, COUNT_OF(buffer
));
787 case CM_RESOURCE_MEMORY_WRITE_ONLY
:
788 LoadStringW(hInst
, IDS_MEMORY_WRITE_ONLY
, buffer
, COUNT_OF(buffer
));
792 LoadStringW(hInst
, IDS_MEMORY_READ_WRITE
, buffer
, COUNT_OF(buffer
));
796 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
800 case CmResourceTypeDma
:
801 hwndLV
= GetDlgItem(hwnd
, IDC_DMA_LIST
);
803 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Dma
.Channel
);
805 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
810 item
.pszText
= buffer
;
811 item
.cchTextMax
= (int)wcslen(item
.pszText
);
812 item
.lParam
= (LPARAM
)pDescriptor
;
814 iItem
= ListView_InsertItem(hwndLV
, &item
);
817 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Dma
.Port
);
818 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
822 case CmResourceTypeDeviceSpecific
:
823 hwndLV
= GetDlgItem(hwnd
, IDC_DEVICE_LIST
);
825 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.DeviceSpecificData
.Reserved1
);
827 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
832 item
.pszText
= buffer
;
833 item
.cchTextMax
= (int)wcslen(item
.pszText
);
834 item
.lParam
= (LPARAM
)pDescriptor
;
836 iItem
= ListView_InsertItem(hwndLV
, &item
);
839 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.DeviceSpecificData
.Reserved2
);
840 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
842 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.DeviceSpecificData
.DataSize
);
843 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
852 OnResourceNotify(HWND hwndDlg
, NMHDR
*phdr
)
854 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
856 switch (phdr
->idFrom
)
859 case IDC_MEMORY_LIST
:
862 case IDC_DEVICE_LIST
:
866 if (lpnmlv
->iItem
!= -1)
868 PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor
;
871 item
.mask
= LVIF_PARAM
;
872 item
.iItem
= lpnmlv
->iItem
;
875 if (ListView_GetItem(phdr
->hwndFrom
, &item
))
877 pDescriptor
= (PCM_PARTIAL_RESOURCE_DESCRIPTOR
)item
.lParam
;
879 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNDETERMINED
),
880 (pDescriptor
->ShareDisposition
== CmResourceShareUndetermined
));
882 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHARED
),
883 (pDescriptor
->ShareDisposition
== CmResourceShareShared
));
885 EnableWindow(GetDlgItem(hwndDlg
, IDC_DEVICE_EXCLUSIVE
),
886 (pDescriptor
->ShareDisposition
== CmResourceShareDeviceExclusive
));
888 EnableWindow(GetDlgItem(hwndDlg
, IDC_DRIVER_EXCLUSIVE
),
889 (pDescriptor
->ShareDisposition
== CmResourceShareDriverExclusive
));
894 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNDETERMINED
), FALSE
);
895 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHARED
), FALSE
);
896 EnableWindow(GetDlgItem(hwndDlg
, IDC_DEVICE_EXCLUSIVE
), FALSE
);
897 EnableWindow(GetDlgItem(hwndDlg
, IDC_DRIVER_EXCLUSIVE
), FALSE
);
908 static INT_PTR CALLBACK
modify_resource_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
910 UNREFERENCED_PARAMETER(lParam
);
915 CreateResourceColumns(hwndDlg
);
916 ParseResources(hwndDlg
);
920 return OnResourceNotify(hwndDlg
, (NMHDR
*)lParam
);
923 switch (LOWORD(wParam
))
926 EndDialog(hwndDlg
, IDOK
);
929 EndDialog(hwndDlg
, IDCANCEL
);
936 static BOOL
CreateResourceListColumns(HWND hWndListView
)
942 ListView_SetExtendedListViewStyle(hWndListView
, LVS_EX_FULLROWSELECT
);
944 GetClientRect(hWndListView
, &rc
);
946 /* Create columns. */
947 lvC
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
;
948 lvC
.pszText
= szText
;
949 lvC
.fmt
= LVCFMT_LEFT
;
951 /* Load the column labels from the resource file. */
953 lvC
.cx
= (rc
.right
- rc
.left
) / 2;
954 LoadStringW(hInst
, IDS_BUSNUMBER
, szText
, COUNT_OF(szText
));
955 if (ListView_InsertColumn(hWndListView
, 0, &lvC
) == -1)
959 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
960 LoadStringW(hInst
, IDS_INTERFACE
, szText
, COUNT_OF(szText
));
961 if (ListView_InsertColumn(hWndListView
, 1, &lvC
) == -1)
967 static VOID
AddFullResourcesToList(HWND hwnd
)
969 PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor
;
975 for (i
= 0; i
< resourceValueData
->Count
; i
++)
977 pFullDescriptor
= &resourceValueData
->List
[i
];
979 wsprintf(buffer
, L
"%lu", pFullDescriptor
->BusNumber
);
981 item
.mask
= LVIF_TEXT
;
986 item
.pszText
= buffer
;
987 item
.cchTextMax
= (int)wcslen(item
.pszText
);
989 iItem
= ListView_InsertItem(hwnd
, &item
);
992 GetInterfaceType(pFullDescriptor
->InterfaceType
, buffer
, 80);
993 ListView_SetItemText(hwnd
, iItem
, 1, buffer
);
999 OnResourceListNotify(HWND hwndDlg
, NMHDR
*phdr
)
1001 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
1003 switch (phdr
->idFrom
)
1005 case IDC_RESOURCE_LIST
:
1009 fullResourceIndex
= lpnmlv
->iItem
;
1010 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHOW_RESOURCE
), (lpnmlv
->iItem
!= -1));
1014 if (lpnmlv
->iItem
!= -1)
1016 fullResourceIndex
= lpnmlv
->iItem
;
1017 DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE
), hwndDlg
, modify_resource_dlgproc
);
1028 static INT_PTR CALLBACK
modify_resource_list_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1030 UNREFERENCED_PARAMETER(lParam
);
1035 CreateResourceListColumns(GetDlgItem(hwndDlg
, IDC_RESOURCE_LIST
));
1036 AddFullResourcesToList(GetDlgItem(hwndDlg
, IDC_RESOURCE_LIST
));
1040 return OnResourceListNotify(hwndDlg
, (NMHDR
*)lParam
);
1043 switch (LOWORD(wParam
))
1045 case IDC_SHOW_RESOURCE
:
1046 if (fullResourceIndex
!= -1)
1047 DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE
), hwndDlg
, modify_resource_dlgproc
);
1050 EndDialog(hwndDlg
, IDOK
);
1053 EndDialog(hwndDlg
, IDCANCEL
);
1061 BOOL
ModifyValue(HWND hwnd
, HKEY hKey
, LPCWSTR valueName
, BOOL EditBin
)
1065 BOOL result
= FALSE
;
1070 editValueName
= valueName
;
1072 lRet
= RegQueryValueExW(hKey
, valueName
, 0, &type
, 0, &valueDataLen
);
1073 if (lRet
!= ERROR_SUCCESS
&& (!wcscmp(valueName
, L
"") || valueName
== NULL
))
1075 lRet
= ERROR_SUCCESS
; /* Allow editing of (Default) values which don't exist */
1078 stringValueData
= NULL
;
1079 binValueData
= NULL
;
1082 if (lRet
!= ERROR_SUCCESS
)
1084 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1088 if (EditBin
== FALSE
&& ((type
== REG_SZ
) || (type
== REG_EXPAND_SZ
)))
1090 if (valueDataLen
> 0)
1092 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
)))
1094 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1097 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
1098 if (lRet
!= ERROR_SUCCESS
)
1100 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1106 stringValueData
= NULL
;
1109 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING
), hwnd
, modify_string_dlgproc
) == IDOK
)
1111 if (stringValueData
)
1113 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)stringValueData
, (DWORD
) (wcslen(stringValueData
) + 1) * sizeof(WCHAR
));
1117 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, NULL
, 0);
1119 if (lRet
== ERROR_SUCCESS
)
1123 else if (EditBin
== FALSE
&& type
== REG_MULTI_SZ
)
1125 if (valueDataLen
> 0)
1127 size_t llen
, listlen
, nl_len
;
1128 LPWSTR src
, lines
= NULL
;
1130 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, valueDataLen
+ sizeof(WCHAR
))))
1132 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1135 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
1136 if (lRet
!= ERROR_SUCCESS
)
1138 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1142 /* convert \0 to \r\n */
1143 src
= stringValueData
;
1144 nl_len
= wcslen(L
"\r\n") * sizeof(WCHAR
);
1145 listlen
= sizeof(WCHAR
);
1146 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, listlen
+ sizeof(WCHAR
));
1147 while(*src
!= L
'\0')
1152 listlen
+= (llen
* sizeof(WCHAR
)) + nl_len
;
1153 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, listlen
);
1155 wcscat(lines
, L
"\r\n");
1158 HeapFree(GetProcessHeap(), 0, stringValueData
);
1159 stringValueData
= lines
;
1163 stringValueData
= NULL
;
1166 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_MULTI_STRING
), hwnd
, modify_multi_string_dlgproc
) == IDOK
)
1168 if (stringValueData
)
1170 /* convert \r\n to \0 */
1171 BOOL EmptyLines
= FALSE
;
1172 LPWSTR src
, lines
, nl
;
1173 size_t linechars
, buflen
, c_nl
, dest
;
1175 src
= stringValueData
;
1176 buflen
= sizeof(WCHAR
);
1177 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, buflen
+ sizeof(WCHAR
));
1178 c_nl
= wcslen(L
"\r\n");
1180 while(*src
!= L
'\0')
1182 if((nl
= wcsstr(src
, L
"\r\n")))
1184 linechars
= nl
- src
;
1194 linechars
= wcslen(src
);
1198 buflen
+= ((linechars
+ 1) * sizeof(WCHAR
));
1199 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, buflen
);
1200 memcpy((lines
+ dest
), src
, linechars
* sizeof(WCHAR
));
1202 lines
[dest
++] = L
'\0';
1208 src
+= linechars
+ (nl
!= NULL
? c_nl
: 0);
1210 lines
[++dest
] = L
'\0';
1214 warning(hwnd
, IDS_MULTI_SZ_EMPTY_STRING
);
1217 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)lines
, (DWORD
) buflen
);
1218 HeapFree(GetProcessHeap(), 0, lines
);
1222 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, NULL
, 0);
1224 if (lRet
== ERROR_SUCCESS
)
1228 else if (EditBin
== FALSE
&& type
== REG_DWORD
)
1230 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)&dwordValueData
, &valueDataLen
);
1231 if (lRet
!= ERROR_SUCCESS
)
1233 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1237 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD
), hwnd
, modify_dword_dlgproc
) == IDOK
)
1239 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)&dwordValueData
, sizeof(DWORD
));
1240 if (lRet
== ERROR_SUCCESS
)
1244 else if (EditBin
== FALSE
&& type
== REG_RESOURCE_LIST
)
1246 if (valueDataLen
> 0)
1248 resourceValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
);
1249 if (resourceValueData
== NULL
)
1251 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1255 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)resourceValueData
, &valueDataLen
);
1256 if (lRet
!= ERROR_SUCCESS
)
1258 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1264 resourceValueData
= NULL
;
1267 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE_LIST
), hwnd
, modify_resource_list_dlgproc
) == IDOK
)
1271 else if (EditBin
== TRUE
|| type
== REG_NONE
|| type
== REG_BINARY
)
1273 if(valueDataLen
> 0)
1275 if(!(binValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
+ 1)))
1277 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1281 /* Use the unicode version, so editing strings in binary mode is correct */
1282 lRet
= RegQueryValueExW(hKey
, valueName
,
1283 0, 0, (LPBYTE
)binValueData
, &valueDataLen
);
1284 if (lRet
!= ERROR_SUCCESS
)
1286 HeapFree(GetProcessHeap(), 0, binValueData
);
1287 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1293 binValueData
= NULL
;
1296 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_BIN_DATA
), hwnd
, modify_binary_dlgproc
) == IDOK
)
1298 /* Use the unicode version, so editing strings in binary mode is correct */
1299 lRet
= RegSetValueExW(hKey
, valueName
,
1300 0, type
, (LPBYTE
)binValueData
, valueDataLen
);
1301 if (lRet
== ERROR_SUCCESS
)
1304 if(binValueData
!= NULL
)
1305 HeapFree(GetProcessHeap(), 0, binValueData
);
1309 error(hwnd
, IDS_UNSUPPORTED_TYPE
, type
);
1313 if (resourceValueData
)
1314 HeapFree(GetProcessHeap(), 0, resourceValueData
);
1315 resourceValueData
= NULL
;
1317 if (stringValueData
)
1318 HeapFree(GetProcessHeap(), 0, stringValueData
);
1319 stringValueData
= NULL
;
1324 static LONG
CopyKey(HKEY hDestKey
, LPCWSTR lpDestSubKey
, HKEY hSrcKey
, LPCWSTR lpSrcSubKey
)
1327 DWORD dwDisposition
;
1328 HKEY hDestSubKey
= NULL
;
1329 HKEY hSrcSubKey
= NULL
;
1330 DWORD dwIndex
, dwType
, cbName
, cbData
;
1331 WCHAR szSubKey
[256];
1332 WCHAR szValueName
[256];
1333 BYTE szValueData
[512];
1337 /* open the source subkey, if specified */
1340 lResult
= RegOpenKeyExW(hSrcKey
, lpSrcSubKey
, 0, KEY_ALL_ACCESS
, &hSrcSubKey
);
1343 hSrcKey
= hSrcSubKey
;
1346 /* create the destination subkey */
1347 lResult
= RegCreateKeyExW(hDestKey
, lpDestSubKey
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
,
1348 &hDestSubKey
, &dwDisposition
);
1352 /* copy all subkeys */
1356 cbName
= sizeof(szSubKey
) / sizeof(szSubKey
[0]);
1357 lResult
= RegEnumKeyExW(hSrcKey
, dwIndex
++, szSubKey
, &cbName
, NULL
, NULL
, NULL
, &ft
);
1358 if (lResult
== ERROR_SUCCESS
)
1360 lResult
= CopyKey(hDestSubKey
, szSubKey
, hSrcKey
, szSubKey
);
1365 while(lResult
== ERROR_SUCCESS
);
1367 /* copy all subvalues */
1371 cbName
= sizeof(szValueName
) / sizeof(szValueName
[0]);
1372 cbData
= sizeof(szValueData
) / sizeof(szValueData
[0]);
1373 lResult
= RegEnumValueW(hSrcKey
, dwIndex
++, szValueName
, &cbName
, NULL
, &dwType
, szValueData
, &cbData
);
1374 if (lResult
== ERROR_SUCCESS
)
1376 lResult
= RegSetValueExW(hDestSubKey
, szValueName
, 0, dwType
, szValueData
, cbData
);
1381 while(lResult
== ERROR_SUCCESS
);
1383 lResult
= ERROR_SUCCESS
;
1387 RegCloseKey(hSrcSubKey
);
1389 RegCloseKey(hDestSubKey
);
1390 if (lResult
!= ERROR_SUCCESS
)
1391 SHDeleteKey(hDestKey
, lpDestSubKey
);
1395 static LONG
MoveKey(HKEY hDestKey
, LPCWSTR lpDestSubKey
, HKEY hSrcKey
, LPCWSTR lpSrcSubKey
)
1400 return ERROR_INVALID_FUNCTION
;
1402 if (_wcsicmp(lpDestSubKey
, lpSrcSubKey
) == 0)
1404 /* Destination name equals source name */
1405 return ERROR_SUCCESS
;
1408 lResult
= CopyKey(hDestKey
, lpDestSubKey
, hSrcKey
, lpSrcSubKey
);
1409 if (lResult
== ERROR_SUCCESS
)
1410 SHDeleteKey(hSrcKey
, lpSrcSubKey
);
1415 BOOL
DeleteKey(HWND hwnd
, HKEY hKeyRoot
, LPCWSTR keyPath
)
1417 WCHAR msg
[128], caption
[128];
1418 BOOL result
= FALSE
;
1422 lRet
= RegOpenKeyExW(hKeyRoot
, keyPath
, 0, KEY_READ
|KEY_SET_VALUE
, &hKey
);
1423 if (lRet
!= ERROR_SUCCESS
)
1425 error_code_messagebox(hwnd
, lRet
);
1429 LoadStringW(hInst
, IDS_QUERY_DELETE_KEY_CONFIRM
, caption
, COUNT_OF(caption
));
1430 LoadStringW(hInst
, IDS_QUERY_DELETE_KEY_ONE
, msg
, COUNT_OF(msg
));
1432 if (MessageBoxW(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) != IDYES
)
1435 lRet
= SHDeleteKey(hKeyRoot
, keyPath
);
1436 if (lRet
!= ERROR_SUCCESS
)
1438 error(hwnd
, IDS_BAD_KEY
, keyPath
);
1448 LONG
RenameKey(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpNewName
)
1451 LPWSTR lpNewSubKey
= NULL
;
1457 s
= wcsrchr(lpSubKey
, L
'\\');
1461 lpNewSubKey
= (LPWSTR
) HeapAlloc(GetProcessHeap(), 0, (s
- lpSubKey
+ wcslen(lpNewName
) + 1) * sizeof(WCHAR
));
1462 if (lpNewSubKey
!= NULL
)
1464 memcpy(lpNewSubKey
, lpSubKey
, (s
- lpSubKey
) * sizeof(WCHAR
));
1465 wcscpy(lpNewSubKey
+ (s
- lpSubKey
), lpNewName
);
1466 lpNewName
= lpNewSubKey
;
1469 return ERROR_NOT_ENOUGH_MEMORY
;
1472 Ret
= MoveKey(hKey
, lpNewName
, hKey
, lpSubKey
);
1476 HeapFree(GetProcessHeap(), 0, lpNewSubKey
);
1481 LONG
RenameValue(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpDestValue
, LPCWSTR lpSrcValue
)
1484 HKEY hSubKey
= NULL
;
1485 DWORD dwType
, cbData
;
1490 lResult
= RegOpenKeyW(hKey
, lpSubKey
, &hSubKey
);
1491 if (lResult
!= ERROR_SUCCESS
)
1496 cbData
= sizeof(data
);
1497 lResult
= RegQueryValueExW(hKey
, lpSrcValue
, NULL
, &dwType
, data
, &cbData
);
1498 if (lResult
!= ERROR_SUCCESS
)
1501 lResult
= RegSetValueExW(hKey
, lpDestValue
, 0, dwType
, data
, cbData
);
1502 if (lResult
!= ERROR_SUCCESS
)
1505 RegDeleteValue(hKey
, lpSrcValue
);
1509 RegCloseKey(hSubKey
);
1513 LONG
QueryStringValue(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpValueName
, LPWSTR pszBuffer
, DWORD dwBufferLen
)
1516 HKEY hSubKey
= NULL
;
1517 DWORD cbData
, dwType
;
1521 lResult
= RegOpenKeyW(hKey
, lpSubKey
, &hSubKey
);
1522 if (lResult
!= ERROR_SUCCESS
)
1527 cbData
= (dwBufferLen
- 1) * sizeof(*pszBuffer
);
1528 lResult
= RegQueryValueExW(hKey
, lpValueName
, NULL
, &dwType
, (LPBYTE
) pszBuffer
, &cbData
);
1529 if (lResult
!= ERROR_SUCCESS
)
1531 if (dwType
!= REG_SZ
)
1537 pszBuffer
[cbData
/ sizeof(*pszBuffer
)] = L
'\0';
1540 if (lResult
!= ERROR_SUCCESS
)
1541 pszBuffer
[0] = L
'\0';
1543 RegCloseKey(hSubKey
);
1547 BOOL
GetKeyName(LPWSTR pszDest
, size_t iDestLength
, HKEY hRootKey
, LPCWSTR lpSubKey
)
1551 if (hRootKey
== HKEY_CLASSES_ROOT
)
1552 pszRootKey
= L
"HKEY_CLASSES_ROOT";
1553 else if (hRootKey
== HKEY_CURRENT_USER
)
1554 pszRootKey
= L
"HKEY_CURRENT_USER";
1555 else if (hRootKey
== HKEY_LOCAL_MACHINE
)
1556 pszRootKey
= L
"HKEY_LOCAL_MACHINE";
1557 else if (hRootKey
== HKEY_USERS
)
1558 pszRootKey
= L
"HKEY_USERS";
1559 else if (hRootKey
== HKEY_CURRENT_CONFIG
)
1560 pszRootKey
= L
"HKEY_CURRENT_CONFIG";
1561 else if (hRootKey
== HKEY_DYN_DATA
)
1562 pszRootKey
= L
"HKEY_DYN_DATA";
1567 _snwprintf(pszDest
, iDestLength
, L
"%s\\%s", pszRootKey
, lpSubKey
);
1569 _snwprintf(pszDest
, iDestLength
, L
"%s", pszRootKey
);