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 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
121 switch (LOWORD(wParam
))
124 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
126 if ((len
= GetWindowTextLength(hwndValue
)))
130 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(WCHAR
))))
132 stringValueData
= valueData
;
133 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
134 *stringValueData
= 0;
139 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(WCHAR
))))
141 stringValueData
= valueData
;
142 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
143 *stringValueData
= 0;
150 *stringValueData
= 0;
153 EndDialog(hwndDlg
, IDOK
);
156 EndDialog(hwndDlg
, IDCANCEL
);
164 INT_PTR CALLBACK
modify_multi_string_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
170 UNREFERENCED_PARAMETER(lParam
);
175 if (editValueName
&& wcscmp(editValueName
, L
""))
177 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
182 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
183 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
185 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, stringValueData
);
186 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
189 switch (LOWORD(wParam
))
192 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
194 if ((len
= GetWindowTextLength(hwndValue
)))
198 if ((valueData
= HeapReAlloc(GetProcessHeap(), 0, stringValueData
, (len
+ 1) * sizeof(WCHAR
))))
200 stringValueData
= valueData
;
201 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
202 *stringValueData
= 0;
207 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(WCHAR
))))
209 stringValueData
= valueData
;
210 if (!GetWindowTextW(hwndValue
, stringValueData
, len
+ 1))
211 *stringValueData
= 0;
218 *stringValueData
= 0;
221 EndDialog(hwndDlg
, IDOK
);
224 EndDialog(hwndDlg
, IDCANCEL
);
232 LRESULT CALLBACK
DwordEditSubclassProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
236 oldwndproc
= (WNDPROC
)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
241 if (dwordEditMode
== EDIT_MODE_DEC
)
243 if (isdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
252 else if (dwordEditMode
== EDIT_MODE_HEX
)
254 if (isxdigit((int) wParam
& 0xff) || iscntrl((int) wParam
& 0xff))
269 return CallWindowProcW(oldwndproc
, hwnd
, uMsg
, wParam
, lParam
);
273 INT_PTR CALLBACK
modify_dword_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
277 WCHAR ValueString
[32];
282 UNREFERENCED_PARAMETER(lParam
);
287 dwordEditMode
= EDIT_MODE_HEX
;
289 /* subclass the edit control */
290 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
291 oldproc
= (WNDPROC
)GetWindowLongPtr(hwndValue
, GWLP_WNDPROC
);
292 SetWindowLongPtr(hwndValue
, GWLP_USERDATA
, (DWORD_PTR
)oldproc
);
293 SetWindowLongPtr(hwndValue
, GWLP_WNDPROC
, (DWORD_PTR
)DwordEditSubclassProc
);
295 if (editValueName
&& wcscmp(editValueName
, L
""))
297 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
302 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
303 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
305 CheckRadioButton (hwndDlg
, IDC_FORMAT_HEX
, IDC_FORMAT_DEC
, IDC_FORMAT_HEX
);
306 swprintf(ValueString
, L
"%lx", dwordValueData
);
307 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
308 SetFocus(GetDlgItem(hwndDlg
, IDC_VALUE_DATA
));
312 switch (LOWORD(wParam
))
315 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_DEC
)
317 dwordEditMode
= EDIT_MODE_HEX
;
318 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
320 if (GetWindowTextLength(hwndValue
))
322 if (GetWindowTextW(hwndValue
, ValueString
, 32))
324 Value
= wcstoul (ValueString
, &Remainder
, 10);
328 swprintf(ValueString
, L
"%lx", Value
);
329 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
335 if (HIWORD(wParam
) == BN_CLICKED
&& dwordEditMode
== EDIT_MODE_HEX
)
337 dwordEditMode
= EDIT_MODE_DEC
;
338 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
340 if (GetWindowTextLength(hwndValue
))
342 if (GetWindowTextW(hwndValue
, ValueString
, 32))
344 Value
= wcstoul (ValueString
, &Remainder
, 16);
348 swprintf(ValueString
, L
"%lu", Value
);
349 SetDlgItemTextW(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
355 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
357 if (GetWindowTextLength(hwndValue
))
359 if (!GetWindowTextW(hwndValue
, ValueString
, 32))
361 EndDialog(hwndDlg
, IDCANCEL
);
365 Base
= (dwordEditMode
== EDIT_MODE_HEX
) ? 16 : 10;
366 dwordValueData
= wcstoul (ValueString
, &Remainder
, Base
);
370 EndDialog(hwndDlg
, IDCANCEL
);
374 EndDialog(hwndDlg
, IDOK
);
378 EndDialog(hwndDlg
, IDCANCEL
);
386 INT_PTR CALLBACK
modify_binary_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
391 UNREFERENCED_PARAMETER(lParam
);
396 if (editValueName
&& wcscmp(editValueName
, L
""))
398 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
403 LoadStringW(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, COUNT_OF(buffer
));
404 SetDlgItemTextW(hwndDlg
, IDC_VALUE_NAME
, buffer
);
406 hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
);
407 HexEdit_LoadBuffer(hwndValue
, binValueData
, valueDataLen
);
408 /* reset the hex edit control's font */
409 SendMessageW(hwndValue
, WM_SETFONT
, 0, 0);
413 switch (LOWORD(wParam
))
416 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
418 len
= (UINT
) HexEdit_GetBufferSize(hwndValue
);
419 if (len
> 0 && binValueData
)
420 binValueData
= HeapReAlloc(GetProcessHeap(), 0, binValueData
, len
);
422 binValueData
= HeapAlloc(GetProcessHeap(), 0, len
+ 1);
423 HexEdit_CopyBuffer(hwndValue
, binValueData
, len
);
426 EndDialog(hwndDlg
, IDOK
);
429 EndDialog(hwndDlg
, IDCANCEL
);
437 static BOOL
CreateResourceColumns(HWND hwnd
)
445 /* Create columns. */
446 lvC
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
;
447 lvC
.pszText
= szText
;
448 lvC
.fmt
= LVCFMT_LEFT
;
450 hwndLV
= GetDlgItem(hwnd
, IDC_DMA_LIST
);
451 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
452 GetClientRect(hwndLV
, &rc
);
454 /* Load the column labels from the resource file. */
456 lvC
.cx
= (rc
.right
- rc
.left
) / 2;
457 LoadStringW(hInst
, IDS_DMA_CHANNEL
, szText
, COUNT_OF(szText
));
458 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
462 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
463 LoadStringW(hInst
, IDS_DMA_PORT
, szText
, COUNT_OF(szText
));
464 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
469 hwndLV
= GetDlgItem(hwnd
, IDC_IRQ_LIST
);
470 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
471 GetClientRect(hwndLV
, &rc
);
472 width
= (rc
.right
- rc
.left
) / 4;
474 /* Load the column labels from the resource file. */
477 LoadStringW(hInst
, IDS_INTERRUPT_VECTOR
, szText
, COUNT_OF(szText
));
478 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
482 LoadStringW(hInst
, IDS_INTERRUPT_LEVEL
, szText
, COUNT_OF(szText
));
483 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
487 LoadStringW(hInst
, IDS_INTERRUPT_AFFINITY
, szText
, COUNT_OF(szText
));
488 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
492 lvC
.cx
= (rc
.right
- rc
.left
) - 3 * width
;
493 LoadStringW(hInst
, IDS_INTERRUPT_TYPE
, szText
, COUNT_OF(szText
));
494 if (ListView_InsertColumn(hwndLV
, 3, &lvC
) == -1)
499 hwndLV
= GetDlgItem(hwnd
, IDC_MEMORY_LIST
);
500 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
501 GetClientRect(hwndLV
, &rc
);
502 width
= (rc
.right
- rc
.left
) / 3;
504 /* Load the column labels from the resource file. */
507 LoadStringW(hInst
, IDS_MEMORY_ADDRESS
, szText
, COUNT_OF(szText
));
508 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
512 LoadStringW(hInst
, IDS_MEMORY_LENGTH
, szText
, COUNT_OF(szText
));
513 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
517 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
518 LoadStringW(hInst
, IDS_MEMORY_ACCESS
, szText
, COUNT_OF(szText
));
519 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
524 hwndLV
= GetDlgItem(hwnd
, IDC_PORT_LIST
);
525 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
526 GetClientRect(hwndLV
, &rc
);
527 width
= (rc
.right
- rc
.left
) / 3;
529 /* Load the column labels from the resource file. */
532 LoadStringW(hInst
, IDS_PORT_ADDRESS
, szText
, COUNT_OF(szText
));
533 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
537 LoadStringW(hInst
, IDS_PORT_LENGTH
, szText
, COUNT_OF(szText
));
538 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
542 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
543 LoadStringW(hInst
, IDS_PORT_ACCESS
, szText
, COUNT_OF(szText
));
544 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
547 /* Device specific list */
548 hwndLV
= GetDlgItem(hwnd
, IDC_DEVICE_LIST
);
549 ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
550 GetClientRect(hwndLV
, &rc
);
551 width
= (rc
.right
- rc
.left
) / 3;
553 /* Load the column labels from the resource file. */
556 LoadStringW(hInst
, IDS_SPECIFIC_RESERVED1
, szText
, COUNT_OF(szText
));
557 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
561 LoadStringW(hInst
, IDS_SPECIFIC_RESERVED2
, szText
, COUNT_OF(szText
));
562 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
566 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
567 LoadStringW(hInst
, IDS_SPECIFIC_DATASIZE
, szText
, COUNT_OF(szText
));
568 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
575 GetInterfaceType(INTERFACE_TYPE InterfaceType
,
579 // LPWSTR lpInterfaceType;
581 switch (InterfaceType
)
583 case InterfaceTypeUndefined
:
584 LoadStringW(hInst
, IDS_BUS_UNDEFINED
, pBuffer
, dwLength
);
585 // lpInterfaceType = L"Undefined";
588 LoadStringW(hInst
, IDS_BUS_INTERNAL
, pBuffer
, dwLength
);
589 // lpInterfaceType = L"Internal";
592 LoadStringW(hInst
, IDS_BUS_ISA
, pBuffer
, dwLength
);
593 // lpInterfaceType = L"Isa";
596 LoadStringW(hInst
, IDS_BUS_EISA
, pBuffer
, dwLength
);
597 // lpInterfaceType = L"Eisa";
600 LoadStringW(hInst
, IDS_BUS_MICROCHANNEL
, pBuffer
, dwLength
);
601 // lpInterfaceType = L"MicroChannel";
604 LoadStringW(hInst
, IDS_BUS_TURBOCHANNEL
, pBuffer
, dwLength
);
605 // lpInterfaceType = L"TurboChannel";
608 LoadStringW(hInst
, IDS_BUS_PCIBUS
, pBuffer
, dwLength
);
609 // lpInterfaceType = L"PCIBus";
612 LoadStringW(hInst
, IDS_BUS_VMEBUS
, pBuffer
, dwLength
);
613 // lpInterfaceType = L"VMEBus";
616 LoadStringW(hInst
, IDS_BUS_NUBUS
, pBuffer
, dwLength
);
617 // lpInterfaceType = L"NuBus";
620 LoadStringW(hInst
, IDS_BUS_PCMCIABUS
, pBuffer
, dwLength
);
621 // lpInterfaceType = L"PCMCIABus";
624 LoadStringW(hInst
, IDS_BUS_CBUS
, pBuffer
, dwLength
);
625 // lpInterfaceType = L"CBus";
628 LoadStringW(hInst
, IDS_BUS_MPIBUS
, pBuffer
, dwLength
);
629 // lpInterfaceType = L"MPIBus";
632 LoadStringW(hInst
, IDS_BUS_MPSABUS
, pBuffer
, dwLength
);
633 // lpInterfaceType = L"MPSABus";
635 case ProcessorInternal
:
636 LoadStringW(hInst
, IDS_BUS_PROCESSORINTERNAL
, pBuffer
, dwLength
);
637 // lpInterfaceType = L"ProcessorInternal";
639 case InternalPowerBus
:
640 LoadStringW(hInst
, IDS_BUS_INTERNALPOWERBUS
, pBuffer
, dwLength
);
641 // lpInterfaceType = L"InternalPowerBus";
644 LoadStringW(hInst
, IDS_BUS_PNPISABUS
, pBuffer
, dwLength
);
645 // lpInterfaceType = L"PNPISABus";
648 LoadStringW(hInst
, IDS_BUS_PNPBUS
, pBuffer
, dwLength
);
649 // lpInterfaceType = L"PNPBus";
652 LoadStringW(hInst
, IDS_BUS_UNKNOWNTYPE
, pBuffer
, dwLength
);
653 // lpInterfaceType = L"Unknown interface type";
657 // wcscpy(pBuffer, lpInterfaceType);
662 ParseResources(HWND hwnd
)
664 PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor
;
665 PCM_PARTIAL_RESOURCE_LIST pPartialResourceList
;
666 PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor
;
674 pFullDescriptor
= &resourceValueData
->List
[fullResourceIndex
];
675 pPartialResourceList
= &pFullDescriptor
->PartialResourceList
;
678 GetInterfaceType(pFullDescriptor
->InterfaceType
, buffer
, 80);
679 SetDlgItemTextW(hwnd
, IDC_INTERFACETYPE
, buffer
);
682 SetDlgItemInt(hwnd
, IDC_BUSNUMBER
, (UINT
)pFullDescriptor
->BusNumber
, FALSE
);
685 SetDlgItemInt(hwnd
, IDC_VERSION
, (UINT
)pPartialResourceList
->Version
, FALSE
);
688 SetDlgItemInt(hwnd
, IDC_REVISION
, (UINT
)pPartialResourceList
->Revision
, FALSE
);
690 for (i
= 0; i
< pPartialResourceList
->Count
; i
++)
692 pDescriptor
= &pPartialResourceList
->PartialDescriptors
[i
];
694 switch (pDescriptor
->Type
)
696 case CmResourceTypePort
:
697 hwndLV
= GetDlgItem(hwnd
, IDC_PORT_LIST
);
700 wsprintf(buffer
, L
"0x%16I64x", pDescriptor
->u
.Port
.Start
.QuadPart
);
702 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Port
.Start
.u
.LowPart
);
705 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
710 item
.pszText
= buffer
;
711 item
.cchTextMax
= (int)wcslen(item
.pszText
);
712 item
.lParam
= (LPARAM
)pDescriptor
;
714 iItem
= ListView_InsertItem(hwndLV
, &item
);
717 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.Port
.Length
);
718 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
720 if (pDescriptor
->Flags
& CM_RESOURCE_PORT_IO
)
721 LoadStringW(hInst
, IDS_PORT_PORT_IO
, buffer
, COUNT_OF(buffer
));
723 LoadStringW(hInst
, IDS_PORT_MEMORY_IO
, buffer
, COUNT_OF(buffer
));
724 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
728 case CmResourceTypeInterrupt
:
729 hwndLV
= GetDlgItem(hwnd
, IDC_IRQ_LIST
);
731 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Interrupt
.Vector
);
733 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
738 item
.pszText
= buffer
;
739 item
.cchTextMax
= (int)wcslen(item
.pszText
);
740 item
.lParam
= (LPARAM
)pDescriptor
;
742 iItem
= ListView_InsertItem(hwndLV
, &item
);
745 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Interrupt
.Level
);
746 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
748 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Interrupt
.Affinity
);
749 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
751 if (pDescriptor
->Flags
& CM_RESOURCE_INTERRUPT_LATCHED
)
752 LoadStringW(hInst
, IDS_INTERRUPT_EDGE_SENSITIVE
, buffer
, COUNT_OF(buffer
));
754 LoadStringW(hInst
, IDS_INTERRUPT_LEVEL_SENSITIVE
, buffer
, COUNT_OF(buffer
));
756 ListView_SetItemText(hwndLV
, iItem
, 3, buffer
);
760 case CmResourceTypeMemory
:
761 hwndLV
= GetDlgItem(hwnd
, IDC_MEMORY_LIST
);
764 wsprintf(buffer
, L
"0x%16I64x", pDescriptor
->u
.Memory
.Start
.QuadPart
);
766 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.Memory
.Start
.u
.LowPart
);
769 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
774 item
.pszText
= buffer
;
775 item
.cchTextMax
= (int)wcslen(item
.pszText
);
776 item
.lParam
= (LPARAM
)pDescriptor
;
778 iItem
= ListView_InsertItem(hwndLV
, &item
);
781 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.Memory
.Length
);
782 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
784 switch (pDescriptor
->Flags
& (CM_RESOURCE_MEMORY_READ_ONLY
| CM_RESOURCE_MEMORY_WRITE_ONLY
))
786 case CM_RESOURCE_MEMORY_READ_ONLY
:
787 LoadStringW(hInst
, IDS_MEMORY_READ_ONLY
, buffer
, COUNT_OF(buffer
));
790 case CM_RESOURCE_MEMORY_WRITE_ONLY
:
791 LoadStringW(hInst
, IDS_MEMORY_WRITE_ONLY
, buffer
, COUNT_OF(buffer
));
795 LoadStringW(hInst
, IDS_MEMORY_READ_WRITE
, buffer
, COUNT_OF(buffer
));
799 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
803 case CmResourceTypeDma
:
804 hwndLV
= GetDlgItem(hwnd
, IDC_DMA_LIST
);
806 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Dma
.Channel
);
808 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
813 item
.pszText
= buffer
;
814 item
.cchTextMax
= (int)wcslen(item
.pszText
);
815 item
.lParam
= (LPARAM
)pDescriptor
;
817 iItem
= ListView_InsertItem(hwndLV
, &item
);
820 wsprintf(buffer
, L
"%lu", pDescriptor
->u
.Dma
.Port
);
821 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
825 case CmResourceTypeDeviceSpecific
:
826 hwndLV
= GetDlgItem(hwnd
, IDC_DEVICE_LIST
);
828 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.DeviceSpecificData
.Reserved1
);
830 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
835 item
.pszText
= buffer
;
836 item
.cchTextMax
= (int)wcslen(item
.pszText
);
837 item
.lParam
= (LPARAM
)pDescriptor
;
839 iItem
= ListView_InsertItem(hwndLV
, &item
);
842 wsprintf(buffer
, L
"0x%08lx", pDescriptor
->u
.DeviceSpecificData
.Reserved2
);
843 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
845 wsprintf(buffer
, L
"0x%lx", pDescriptor
->u
.DeviceSpecificData
.DataSize
);
846 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
855 OnResourceNotify(HWND hwndDlg
, NMHDR
*phdr
)
857 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
859 switch (phdr
->idFrom
)
862 case IDC_MEMORY_LIST
:
865 case IDC_DEVICE_LIST
:
869 if (lpnmlv
->iItem
!= -1)
871 PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor
;
874 item
.mask
= LVIF_PARAM
;
875 item
.iItem
= lpnmlv
->iItem
;
878 if (ListView_GetItem(phdr
->hwndFrom
, &item
))
880 pDescriptor
= (PCM_PARTIAL_RESOURCE_DESCRIPTOR
)item
.lParam
;
882 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNDETERMINED
),
883 (pDescriptor
->ShareDisposition
== CmResourceShareUndetermined
));
885 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHARED
),
886 (pDescriptor
->ShareDisposition
== CmResourceShareShared
));
888 EnableWindow(GetDlgItem(hwndDlg
, IDC_DEVICE_EXCLUSIVE
),
889 (pDescriptor
->ShareDisposition
== CmResourceShareDeviceExclusive
));
891 EnableWindow(GetDlgItem(hwndDlg
, IDC_DRIVER_EXCLUSIVE
),
892 (pDescriptor
->ShareDisposition
== CmResourceShareDriverExclusive
));
897 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNDETERMINED
), FALSE
);
898 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHARED
), FALSE
);
899 EnableWindow(GetDlgItem(hwndDlg
, IDC_DEVICE_EXCLUSIVE
), FALSE
);
900 EnableWindow(GetDlgItem(hwndDlg
, IDC_DRIVER_EXCLUSIVE
), FALSE
);
911 static INT_PTR CALLBACK
modify_resource_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
913 UNREFERENCED_PARAMETER(lParam
);
918 CreateResourceColumns(hwndDlg
);
919 ParseResources(hwndDlg
);
923 return OnResourceNotify(hwndDlg
, (NMHDR
*)lParam
);
926 switch (LOWORD(wParam
))
929 EndDialog(hwndDlg
, IDOK
);
932 EndDialog(hwndDlg
, IDCANCEL
);
939 static BOOL
CreateResourceListColumns(HWND hWndListView
)
945 ListView_SetExtendedListViewStyle(hWndListView
, LVS_EX_FULLROWSELECT
);
947 GetClientRect(hWndListView
, &rc
);
949 /* Create columns. */
950 lvC
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
;
951 lvC
.pszText
= szText
;
952 lvC
.fmt
= LVCFMT_LEFT
;
954 /* Load the column labels from the resource file. */
956 lvC
.cx
= (rc
.right
- rc
.left
) / 2;
957 LoadStringW(hInst
, IDS_BUSNUMBER
, szText
, COUNT_OF(szText
));
958 if (ListView_InsertColumn(hWndListView
, 0, &lvC
) == -1)
962 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
963 LoadStringW(hInst
, IDS_INTERFACE
, szText
, COUNT_OF(szText
));
964 if (ListView_InsertColumn(hWndListView
, 1, &lvC
) == -1)
970 static VOID
AddFullResourcesToList(HWND hwnd
)
972 PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor
;
978 for (i
= 0; i
< resourceValueData
->Count
; i
++)
980 pFullDescriptor
= &resourceValueData
->List
[i
];
982 wsprintf(buffer
, L
"%lu", pFullDescriptor
->BusNumber
);
984 item
.mask
= LVIF_TEXT
;
989 item
.pszText
= buffer
;
990 item
.cchTextMax
= (int)wcslen(item
.pszText
);
992 iItem
= ListView_InsertItem(hwnd
, &item
);
995 GetInterfaceType(pFullDescriptor
->InterfaceType
, buffer
, 80);
996 ListView_SetItemText(hwnd
, iItem
, 1, buffer
);
1002 OnResourceListNotify(HWND hwndDlg
, NMHDR
*phdr
)
1004 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
1006 switch (phdr
->idFrom
)
1008 case IDC_RESOURCE_LIST
:
1012 fullResourceIndex
= lpnmlv
->iItem
;
1013 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHOW_RESOURCE
), (lpnmlv
->iItem
!= -1));
1017 if (lpnmlv
->iItem
!= -1)
1019 fullResourceIndex
= lpnmlv
->iItem
;
1020 DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE
), hwndDlg
, modify_resource_dlgproc
);
1031 static INT_PTR CALLBACK
modify_resource_list_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1033 UNREFERENCED_PARAMETER(lParam
);
1038 CreateResourceListColumns(GetDlgItem(hwndDlg
, IDC_RESOURCE_LIST
));
1039 AddFullResourcesToList(GetDlgItem(hwndDlg
, IDC_RESOURCE_LIST
));
1043 return OnResourceListNotify(hwndDlg
, (NMHDR
*)lParam
);
1046 switch (LOWORD(wParam
))
1048 case IDC_SHOW_RESOURCE
:
1049 if (fullResourceIndex
!= -1)
1050 DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE
), hwndDlg
, modify_resource_dlgproc
);
1053 EndDialog(hwndDlg
, IDOK
);
1056 EndDialog(hwndDlg
, IDCANCEL
);
1064 BOOL
ModifyValue(HWND hwnd
, HKEY hKey
, LPCWSTR valueName
, BOOL EditBin
)
1068 BOOL result
= FALSE
;
1073 editValueName
= valueName
;
1075 lRet
= RegQueryValueExW(hKey
, valueName
, 0, &type
, 0, &valueDataLen
);
1076 if (lRet
!= ERROR_SUCCESS
&& (!wcscmp(valueName
, L
"") || valueName
== NULL
))
1078 lRet
= ERROR_SUCCESS
; /* Allow editing of (Default) values which don't exist */
1081 stringValueData
= NULL
;
1082 binValueData
= NULL
;
1085 if (lRet
!= ERROR_SUCCESS
)
1087 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1091 if (EditBin
== FALSE
&& ((type
== REG_SZ
) || (type
== REG_EXPAND_SZ
)))
1093 if (valueDataLen
> 0)
1095 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
)))
1097 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1100 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
1101 if (lRet
!= ERROR_SUCCESS
)
1103 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1109 stringValueData
= NULL
;
1112 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING
), hwnd
, modify_string_dlgproc
) == IDOK
)
1114 if (stringValueData
)
1116 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)stringValueData
, (DWORD
) (wcslen(stringValueData
) + 1) * sizeof(WCHAR
));
1120 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, NULL
, 0);
1122 if (lRet
== ERROR_SUCCESS
)
1126 else if (EditBin
== FALSE
&& type
== REG_MULTI_SZ
)
1128 if (valueDataLen
> 0)
1130 size_t llen
, listlen
, nl_len
;
1131 LPWSTR src
, lines
= NULL
;
1133 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, valueDataLen
+ sizeof(WCHAR
))))
1135 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1138 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
1139 if (lRet
!= ERROR_SUCCESS
)
1141 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1145 /* convert \0 to \r\n */
1146 src
= stringValueData
;
1147 nl_len
= wcslen(L
"\r\n") * sizeof(WCHAR
);
1148 listlen
= sizeof(WCHAR
);
1149 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, listlen
+ sizeof(WCHAR
));
1150 while(*src
!= L
'\0')
1155 listlen
+= (llen
* sizeof(WCHAR
)) + nl_len
;
1156 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, listlen
);
1158 wcscat(lines
, L
"\r\n");
1161 HeapFree(GetProcessHeap(), 0, stringValueData
);
1162 stringValueData
= lines
;
1166 stringValueData
= NULL
;
1169 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_MULTI_STRING
), hwnd
, modify_multi_string_dlgproc
) == IDOK
)
1171 if (stringValueData
)
1173 /* convert \r\n to \0 */
1174 BOOL EmptyLines
= FALSE
;
1175 LPWSTR src
, lines
, nl
;
1176 size_t linechars
, buflen
, c_nl
, dest
;
1178 src
= stringValueData
;
1179 buflen
= sizeof(WCHAR
);
1180 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, buflen
+ sizeof(WCHAR
));
1181 c_nl
= wcslen(L
"\r\n");
1183 while(*src
!= L
'\0')
1185 if((nl
= wcsstr(src
, L
"\r\n")))
1187 linechars
= nl
- src
;
1197 linechars
= wcslen(src
);
1201 buflen
+= ((linechars
+ 1) * sizeof(WCHAR
));
1202 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, buflen
);
1203 memcpy((lines
+ dest
), src
, linechars
* sizeof(WCHAR
));
1205 lines
[dest
++] = L
'\0';
1211 src
+= linechars
+ (nl
!= NULL
? c_nl
: 0);
1213 lines
[++dest
] = L
'\0';
1217 warning(hwnd
, IDS_MULTI_SZ_EMPTY_STRING
);
1220 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)lines
, (DWORD
) buflen
);
1221 HeapFree(GetProcessHeap(), 0, lines
);
1225 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, NULL
, 0);
1227 if (lRet
== ERROR_SUCCESS
)
1231 else if (EditBin
== FALSE
&& type
== REG_DWORD
)
1233 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)&dwordValueData
, &valueDataLen
);
1234 if (lRet
!= ERROR_SUCCESS
)
1236 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1240 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD
), hwnd
, modify_dword_dlgproc
) == IDOK
)
1242 lRet
= RegSetValueExW(hKey
, valueName
, 0, type
, (LPBYTE
)&dwordValueData
, sizeof(DWORD
));
1243 if (lRet
== ERROR_SUCCESS
)
1247 else if (EditBin
== FALSE
&& type
== REG_RESOURCE_LIST
)
1249 if (valueDataLen
> 0)
1251 resourceValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
);
1252 if (resourceValueData
== NULL
)
1254 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1258 lRet
= RegQueryValueExW(hKey
, valueName
, 0, 0, (LPBYTE
)resourceValueData
, &valueDataLen
);
1259 if (lRet
!= ERROR_SUCCESS
)
1261 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1267 resourceValueData
= NULL
;
1270 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE_LIST
), hwnd
, modify_resource_list_dlgproc
) == IDOK
)
1274 else if (EditBin
== TRUE
|| type
== REG_NONE
|| type
== REG_BINARY
)
1276 if(valueDataLen
> 0)
1278 if(!(binValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
+ 1)))
1280 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1284 /* Use the unicode version, so editing strings in binary mode is correct */
1285 lRet
= RegQueryValueExW(hKey
, valueName
,
1286 0, 0, (LPBYTE
)binValueData
, &valueDataLen
);
1287 if (lRet
!= ERROR_SUCCESS
)
1289 HeapFree(GetProcessHeap(), 0, binValueData
);
1290 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1296 binValueData
= NULL
;
1299 if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_BIN_DATA
), hwnd
, modify_binary_dlgproc
) == IDOK
)
1301 /* Use the unicode version, so editing strings in binary mode is correct */
1302 lRet
= RegSetValueExW(hKey
, valueName
,
1303 0, type
, (LPBYTE
)binValueData
, valueDataLen
);
1304 if (lRet
== ERROR_SUCCESS
)
1307 if(binValueData
!= NULL
)
1308 HeapFree(GetProcessHeap(), 0, binValueData
);
1312 error(hwnd
, IDS_UNSUPPORTED_TYPE
, type
);
1316 if (resourceValueData
)
1317 HeapFree(GetProcessHeap(), 0, resourceValueData
);
1318 resourceValueData
= NULL
;
1320 if (stringValueData
)
1321 HeapFree(GetProcessHeap(), 0, stringValueData
);
1322 stringValueData
= NULL
;
1327 static LONG
CopyKey(HKEY hDestKey
, LPCWSTR lpDestSubKey
, HKEY hSrcKey
, LPCWSTR lpSrcSubKey
)
1330 DWORD dwDisposition
;
1331 HKEY hDestSubKey
= NULL
;
1332 HKEY hSrcSubKey
= NULL
;
1333 DWORD dwIndex
, dwType
, cbName
, cbData
;
1334 WCHAR szSubKey
[256];
1335 WCHAR szValueName
[256];
1336 BYTE szValueData
[512];
1340 /* open the source subkey, if specified */
1343 lResult
= RegOpenKeyExW(hSrcKey
, lpSrcSubKey
, 0, KEY_ALL_ACCESS
, &hSrcSubKey
);
1346 hSrcKey
= hSrcSubKey
;
1349 /* create the destination subkey */
1350 lResult
= RegCreateKeyExW(hDestKey
, lpDestSubKey
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
,
1351 &hDestSubKey
, &dwDisposition
);
1355 /* copy all subkeys */
1359 cbName
= sizeof(szSubKey
) / sizeof(szSubKey
[0]);
1360 lResult
= RegEnumKeyExW(hSrcKey
, dwIndex
++, szSubKey
, &cbName
, NULL
, NULL
, NULL
, &ft
);
1361 if (lResult
== ERROR_SUCCESS
)
1363 lResult
= CopyKey(hDestSubKey
, szSubKey
, hSrcKey
, szSubKey
);
1368 while(lResult
== ERROR_SUCCESS
);
1370 /* copy all subvalues */
1374 cbName
= sizeof(szValueName
) / sizeof(szValueName
[0]);
1375 cbData
= sizeof(szValueData
) / sizeof(szValueData
[0]);
1376 lResult
= RegEnumValueW(hSrcKey
, dwIndex
++, szValueName
, &cbName
, NULL
, &dwType
, szValueData
, &cbData
);
1377 if (lResult
== ERROR_SUCCESS
)
1379 lResult
= RegSetValueExW(hDestSubKey
, szValueName
, 0, dwType
, szValueData
, cbData
);
1384 while(lResult
== ERROR_SUCCESS
);
1386 lResult
= ERROR_SUCCESS
;
1390 RegCloseKey(hSrcSubKey
);
1392 RegCloseKey(hDestSubKey
);
1393 if (lResult
!= ERROR_SUCCESS
)
1394 SHDeleteKey(hDestKey
, lpDestSubKey
);
1398 static LONG
MoveKey(HKEY hDestKey
, LPCWSTR lpDestSubKey
, HKEY hSrcKey
, LPCWSTR lpSrcSubKey
)
1403 return ERROR_INVALID_FUNCTION
;
1405 if (_wcsicmp(lpDestSubKey
, lpSrcSubKey
) == 0)
1407 /* Destination name equals source name */
1408 return ERROR_SUCCESS
;
1411 lResult
= CopyKey(hDestKey
, lpDestSubKey
, hSrcKey
, lpSrcSubKey
);
1412 if (lResult
== ERROR_SUCCESS
)
1413 SHDeleteKey(hSrcKey
, lpSrcSubKey
);
1418 BOOL
DeleteKey(HWND hwnd
, HKEY hKeyRoot
, LPCWSTR keyPath
)
1420 WCHAR msg
[128], caption
[128];
1421 BOOL result
= FALSE
;
1425 lRet
= RegOpenKeyExW(hKeyRoot
, keyPath
, 0, KEY_READ
|KEY_SET_VALUE
, &hKey
);
1426 if (lRet
!= ERROR_SUCCESS
)
1428 error_code_messagebox(hwnd
, lRet
);
1432 LoadStringW(hInst
, IDS_QUERY_DELETE_KEY_CONFIRM
, caption
, COUNT_OF(caption
));
1433 LoadStringW(hInst
, IDS_QUERY_DELETE_KEY_ONE
, msg
, COUNT_OF(msg
));
1435 if (MessageBoxW(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) != IDYES
)
1438 lRet
= SHDeleteKey(hKeyRoot
, keyPath
);
1439 if (lRet
!= ERROR_SUCCESS
)
1441 error(hwnd
, IDS_BAD_KEY
, keyPath
);
1451 LONG
RenameKey(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpNewName
)
1454 LPWSTR lpNewSubKey
= NULL
;
1460 s
= wcsrchr(lpSubKey
, L
'\\');
1464 lpNewSubKey
= (LPWSTR
) HeapAlloc(GetProcessHeap(), 0, (s
- lpSubKey
+ wcslen(lpNewName
) + 1) * sizeof(WCHAR
));
1465 if (lpNewSubKey
!= NULL
)
1467 memcpy(lpNewSubKey
, lpSubKey
, (s
- lpSubKey
) * sizeof(WCHAR
));
1468 wcscpy(lpNewSubKey
+ (s
- lpSubKey
), lpNewName
);
1469 lpNewName
= lpNewSubKey
;
1472 return ERROR_NOT_ENOUGH_MEMORY
;
1475 Ret
= MoveKey(hKey
, lpNewName
, hKey
, lpSubKey
);
1479 HeapFree(GetProcessHeap(), 0, lpNewSubKey
);
1484 LONG
RenameValue(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpDestValue
, LPCWSTR lpSrcValue
)
1487 HKEY hSubKey
= NULL
;
1488 DWORD dwType
, cbData
;
1493 lResult
= RegOpenKeyW(hKey
, lpSubKey
, &hSubKey
);
1494 if (lResult
!= ERROR_SUCCESS
)
1499 cbData
= sizeof(data
);
1500 lResult
= RegQueryValueExW(hKey
, lpSrcValue
, NULL
, &dwType
, data
, &cbData
);
1501 if (lResult
!= ERROR_SUCCESS
)
1504 lResult
= RegSetValueExW(hKey
, lpDestValue
, 0, dwType
, data
, cbData
);
1505 if (lResult
!= ERROR_SUCCESS
)
1508 RegDeleteValue(hKey
, lpSrcValue
);
1512 RegCloseKey(hSubKey
);
1516 LONG
QueryStringValue(HKEY hKey
, LPCWSTR lpSubKey
, LPCWSTR lpValueName
, LPWSTR pszBuffer
, DWORD dwBufferLen
)
1519 HKEY hSubKey
= NULL
;
1520 DWORD cbData
, dwType
;
1524 lResult
= RegOpenKeyW(hKey
, lpSubKey
, &hSubKey
);
1525 if (lResult
!= ERROR_SUCCESS
)
1530 cbData
= (dwBufferLen
- 1) * sizeof(*pszBuffer
);
1531 lResult
= RegQueryValueExW(hKey
, lpValueName
, NULL
, &dwType
, (LPBYTE
) pszBuffer
, &cbData
);
1532 if (lResult
!= ERROR_SUCCESS
)
1534 if (dwType
!= REG_SZ
)
1540 pszBuffer
[cbData
/ sizeof(*pszBuffer
)] = L
'\0';
1543 if (lResult
!= ERROR_SUCCESS
)
1544 pszBuffer
[0] = L
'\0';
1546 RegCloseKey(hSubKey
);
1550 BOOL
GetKeyName(LPWSTR pszDest
, size_t iDestLength
, HKEY hRootKey
, LPCWSTR lpSubKey
)
1554 if (hRootKey
== HKEY_CLASSES_ROOT
)
1555 pszRootKey
= L
"HKEY_CLASSES_ROOT";
1556 else if (hRootKey
== HKEY_CURRENT_USER
)
1557 pszRootKey
= L
"HKEY_CURRENT_USER";
1558 else if (hRootKey
== HKEY_LOCAL_MACHINE
)
1559 pszRootKey
= L
"HKEY_LOCAL_MACHINE";
1560 else if (hRootKey
== HKEY_USERS
)
1561 pszRootKey
= L
"HKEY_USERS";
1562 else if (hRootKey
== HKEY_CURRENT_CONFIG
)
1563 pszRootKey
= L
"HKEY_CURRENT_CONFIG";
1564 else if (hRootKey
== HKEY_DYN_DATA
)
1565 pszRootKey
= L
"HKEY_DYN_DATA";
1570 _snwprintf(pszDest
, iDestLength
, L
"%s\\%s", pszRootKey
, lpSubKey
);
1572 _snwprintf(pszDest
, iDestLength
, L
"%s", pszRootKey
);