2 * Registry editing UI functions.
4 * Copyright (C) 2003 Dimitrie O. Paun
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 typedef enum _EDIT_MODE
30 static const TCHAR
* editValueName
;
31 static TCHAR
* stringValueData
;
32 static PVOID binValueData
;
33 static DWORD dwordValueData
;
34 static 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 (!LoadString(hInstance
, IDS_ERROR
, title
, COUNT_OF(title
)))
50 _tcscpy(title
, _T("Error"));
52 if (!LoadString(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
53 _tcscpy(errfmt
, _T("Unknown error string!"));
56 _vsntprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
59 MessageBox(hwnd
, errstr
, title
, MB_OK
| MB_ICONERROR
);
62 static void error_code_messagebox(HWND hwnd
, DWORD error_code
)
65 if (!LoadString(hInst
, IDS_ERROR
, title
, COUNT_OF(title
)))
66 lstrcpy(title
, TEXT("Error"));
67 ErrorMessageBox(hwnd
, title
, error_code
);
70 void warning(HWND hwnd
, INT resId
, ...)
78 hInstance
= GetModuleHandle(0);
80 if (!LoadString(hInstance
, IDS_WARNING
, title
, COUNT_OF(title
)))
81 _tcscpy(title
, _T("Warning"));
83 if (!LoadString(hInstance
, resId
, errfmt
, COUNT_OF(errfmt
)))
84 _tcscpy(errfmt
, _T("Unknown error string!"));
87 _vsntprintf(errstr
, COUNT_OF(errstr
), errfmt
, ap
);
90 MessageBox(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
&& _tcscmp(editValueName
, _T("")))
106 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
111 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
112 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, buffer
);
114 SetDlgItemText(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(TCHAR
))))
129 stringValueData
= valueData
;
130 if (!GetWindowText(hwndValue
, stringValueData
, len
+ 1))
131 *stringValueData
= 0;
136 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(TCHAR
))))
138 stringValueData
= valueData
;
139 if (!GetWindowText(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
&& _tcscmp(editValueName
, _T("")))
174 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
179 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
180 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, buffer
);
182 SetDlgItemText(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(TCHAR
))))
197 stringValueData
= valueData
;
198 if (!GetWindowText(hwndValue
, stringValueData
, len
+ 1))
199 *stringValueData
= 0;
204 if ((valueData
= HeapAlloc(GetProcessHeap(), 0, (len
+ 1) * sizeof(TCHAR
))))
206 stringValueData
= valueData
;
207 if (!GetWindowText(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
, GWL_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 CallWindowProc(oldwndproc
, hwnd
, uMsg
, wParam
, lParam
);
270 INT_PTR CALLBACK
modify_dword_dlgproc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
274 TCHAR 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
, GWL_WNDPROC
);
289 SetWindowLongPtr(hwndValue
, GWL_USERDATA
, (DWORD_PTR
)oldproc
);
290 SetWindowLongPtr(hwndValue
, GWL_WNDPROC
, (DWORD_PTR
)DwordEditSubclassProc
);
292 if(editValueName
&& _tcscmp(editValueName
, _T("")))
294 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
299 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
300 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, buffer
);
302 CheckRadioButton (hwndDlg
, IDC_FORMAT_HEX
, IDC_FORMAT_DEC
, IDC_FORMAT_HEX
);
303 _stprintf (ValueString
, _T("%lx"), dwordValueData
);
304 SetDlgItemText(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 (GetWindowText(hwndValue
, ValueString
, 32))
321 Value
= _tcstoul (ValueString
, &Remainder
, 10);
325 _stprintf (ValueString
, _T("%lx"), Value
);
326 SetDlgItemText(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 (GetWindowText(hwndValue
, ValueString
, 32))
341 Value
= _tcstoul (ValueString
, &Remainder
, 16);
345 _stprintf (ValueString
, _T("%lu"), Value
);
346 SetDlgItemText(hwndDlg
, IDC_VALUE_DATA
, ValueString
);
352 if ((hwndValue
= GetDlgItem(hwndDlg
, IDC_VALUE_DATA
)))
354 if (GetWindowTextLength(hwndValue
))
356 if (!GetWindowText(hwndValue
, ValueString
, 32))
358 EndDialog(hwndDlg
, IDCANCEL
);
362 Base
= (dwordEditMode
== EDIT_MODE_HEX
) ? 16 : 10;
363 dwordValueData
= _tcstoul (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
&& _tcscmp(editValueName
, _T("")))
395 SetDlgItemText(hwndDlg
, IDC_VALUE_NAME
, editValueName
);
400 LoadString(hInst
, IDS_DEFAULT_VALUE_NAME
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
401 SetDlgItemText(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 SendMessage(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 LoadString(hInst
, IDS_DMA_CHANNEL
, szText
, sizeof(szText
)/sizeof(TCHAR
));
455 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
459 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
460 LoadString(hInst
, IDS_DMA_PORT
, szText
, sizeof(szText
)/sizeof(TCHAR
));
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 LoadString(hInst
, IDS_INTERRUPT_VECTOR
, szText
, sizeof(szText
)/sizeof(TCHAR
));
475 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
479 LoadString(hInst
, IDS_INTERRUPT_LEVEL
, szText
, sizeof(szText
)/sizeof(TCHAR
));
480 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
484 LoadString(hInst
, IDS_INTERRUPT_AFFINITY
, szText
, sizeof(szText
)/sizeof(TCHAR
));
485 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
489 lvC
.cx
= (rc
.right
- rc
.left
) - 3 * width
;
490 LoadString(hInst
, IDS_INTERRUPT_TYPE
, szText
, sizeof(szText
)/sizeof(TCHAR
));
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 LoadString(hInst
, IDS_MEMORY_ADDRESS
, szText
, sizeof(szText
)/sizeof(TCHAR
));
505 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
509 LoadString(hInst
, IDS_MEMORY_LENGTH
, szText
, sizeof(szText
)/sizeof(TCHAR
));
510 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
514 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
515 LoadString(hInst
, IDS_MEMORY_ACCESS
, szText
, sizeof(szText
)/sizeof(TCHAR
));
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 LoadString(hInst
, IDS_PORT_ADDRESS
, szText
, sizeof(szText
)/sizeof(TCHAR
));
530 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
534 LoadString(hInst
, IDS_PORT_LENGTH
, szText
, sizeof(szText
)/sizeof(TCHAR
));
535 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
539 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
540 LoadString(hInst
, IDS_PORT_ACCESS
, szText
, sizeof(szText
)/sizeof(TCHAR
));
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 LoadString(hInst
, IDS_SPECIFIC_RESERVED1
, szText
, sizeof(szText
)/sizeof(TCHAR
));
554 if (ListView_InsertColumn(hwndLV
, 0, &lvC
) == -1)
558 LoadString(hInst
, IDS_SPECIFIC_RESERVED2
, szText
, sizeof(szText
)/sizeof(TCHAR
));
559 if (ListView_InsertColumn(hwndLV
, 1, &lvC
) == -1)
563 lvC
.cx
= (rc
.right
- rc
.left
) - 2 * width
;
564 LoadString(hInst
, IDS_SPECIFIC_DATASIZE
, szText
, sizeof(szText
)/sizeof(TCHAR
));
565 if (ListView_InsertColumn(hwndLV
, 2, &lvC
) == -1)
572 GetInterfaceType(INTERFACE_TYPE InterfaceType
,
576 // LPTSTR lpInterfaceType;
578 switch (InterfaceType
)
580 case InterfaceTypeUndefined
:
581 LoadString(hInst
, IDS_BUS_UNDEFINED
, pBuffer
, dwLength
);
582 // lpInterfaceType = _T("Undefined");
585 LoadString(hInst
, IDS_BUS_INTERNAL
, pBuffer
, dwLength
);
586 // lpInterfaceType = _T("Internal");
589 LoadString(hInst
, IDS_BUS_ISA
, pBuffer
, dwLength
);
590 // lpInterfaceType = _T("Isa");
593 LoadString(hInst
, IDS_BUS_EISA
, pBuffer
, dwLength
);
594 // lpInterfaceType = _T("Eisa");
597 LoadString(hInst
, IDS_BUS_MICROCHANNEL
, pBuffer
, dwLength
);
598 // lpInterfaceType = _T("MicroChannel");
601 LoadString(hInst
, IDS_BUS_TURBOCHANNEL
, pBuffer
, dwLength
);
602 // lpInterfaceType = _T("TurboChannel");
605 LoadString(hInst
, IDS_BUS_PCIBUS
, pBuffer
, dwLength
);
606 // lpInterfaceType = _T("PCIBus");
609 LoadString(hInst
, IDS_BUS_VMEBUS
, pBuffer
, dwLength
);
610 // lpInterfaceType = _T("VMEBus");
613 LoadString(hInst
, IDS_BUS_NUBUS
, pBuffer
, dwLength
);
614 // lpInterfaceType = _T("NuBus");
617 LoadString(hInst
, IDS_BUS_PCMCIABUS
, pBuffer
, dwLength
);
618 // lpInterfaceType = _T("PCMCIABus");
621 LoadString(hInst
, IDS_BUS_CBUS
, pBuffer
, dwLength
);
622 // lpInterfaceType = _T("CBus");
625 LoadString(hInst
, IDS_BUS_MPIBUS
, pBuffer
, dwLength
);
626 // lpInterfaceType = _T("MPIBus");
629 LoadString(hInst
, IDS_BUS_MPSABUS
, pBuffer
, dwLength
);
630 // lpInterfaceType = _T("MPSABus");
632 case ProcessorInternal
:
633 LoadString(hInst
, IDS_BUS_PROCESSORINTERNAL
, pBuffer
, dwLength
);
634 // lpInterfaceType = _T("ProcessorInternal");
636 case InternalPowerBus
:
637 LoadString(hInst
, IDS_BUS_INTERNALPOWERBUS
, pBuffer
, dwLength
);
638 // lpInterfaceType = _T("InternalPowerBus");
641 LoadString(hInst
, IDS_BUS_PNPISABUS
, pBuffer
, dwLength
);
642 // lpInterfaceType = _T("PNPISABus");
645 LoadString(hInst
, IDS_BUS_PNPBUS
, pBuffer
, dwLength
);
646 // lpInterfaceType = _T("PNPBus");
649 LoadString(hInst
, IDS_BUS_UNKNOWNTYPE
, pBuffer
, dwLength
);
650 // lpInterfaceType = _T("Unknown interface type");
654 // _tcscpy(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 SetDlgItemText(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
, _T("0x%16I64x"), pDescriptor
->u
.Port
.Start
.QuadPart
);
699 wsprintf(buffer
, _T("0x%08lx"), pDescriptor
->u
.Port
.Start
.u
.LowPart
);
702 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
707 item
.pszText
= buffer
;
708 item
.cchTextMax
= (int)_tcslen(item
.pszText
);
709 item
.lParam
= (LPARAM
)pDescriptor
;
711 iItem
= ListView_InsertItem(hwndLV
, &item
);
714 wsprintf(buffer
, _T("0x%lx"), pDescriptor
->u
.Port
.Length
);
715 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
717 if (pDescriptor
->Flags
& CM_RESOURCE_PORT_IO
)
718 LoadString(hInst
, IDS_PORT_PORT_IO
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
720 LoadString(hInst
, IDS_PORT_MEMORY_IO
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
721 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
725 case CmResourceTypeInterrupt
:
726 hwndLV
= GetDlgItem(hwnd
, IDC_IRQ_LIST
);
728 wsprintf(buffer
, _T("%lu"), pDescriptor
->u
.Interrupt
.Vector
);
730 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
735 item
.pszText
= buffer
;
736 item
.cchTextMax
= (int)_tcslen(item
.pszText
);
737 item
.lParam
= (LPARAM
)pDescriptor
;
739 iItem
= ListView_InsertItem(hwndLV
, &item
);
742 wsprintf(buffer
, _T("%lu"), pDescriptor
->u
.Interrupt
.Level
);
743 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
745 wsprintf(buffer
, _T("0x%08lx"), pDescriptor
->u
.Interrupt
.Affinity
);
746 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
748 if (pDescriptor
->Flags
& CM_RESOURCE_INTERRUPT_LATCHED
)
749 LoadString(hInst
, IDS_INTERRUPT_EDGE_SENSITIVE
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
751 LoadString(hInst
, IDS_INTERRUPT_LEVEL_SENSITIVE
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
753 ListView_SetItemText(hwndLV
, iItem
, 3, buffer
);
757 case CmResourceTypeMemory
:
758 hwndLV
= GetDlgItem(hwnd
, IDC_MEMORY_LIST
);
761 wsprintf(buffer
, _T("0x%16I64x"), pDescriptor
->u
.Memory
.Start
.QuadPart
);
763 wsprintf(buffer
, _T("0x%08lx"), pDescriptor
->u
.Memory
.Start
.u
.LowPart
);
766 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
771 item
.pszText
= buffer
;
772 item
.cchTextMax
= (int)_tcslen(item
.pszText
);
773 item
.lParam
= (LPARAM
)pDescriptor
;
775 iItem
= ListView_InsertItem(hwndLV
, &item
);
778 wsprintf(buffer
, _T("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 LoadString(hInst
, IDS_MEMORY_READ_ONLY
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
787 case CM_RESOURCE_MEMORY_WRITE_ONLY
:
788 LoadString(hInst
, IDS_MEMORY_WRITE_ONLY
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
792 LoadString(hInst
, IDS_MEMORY_READ_WRITE
, buffer
, sizeof(buffer
)/sizeof(TCHAR
));
796 ListView_SetItemText(hwndLV
, iItem
, 2, buffer
);
800 case CmResourceTypeDma
:
801 hwndLV
= GetDlgItem(hwnd
, IDC_DMA_LIST
);
803 wsprintf(buffer
, _T("%lu"), pDescriptor
->u
.Dma
.Channel
);
805 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
810 item
.pszText
= buffer
;
811 item
.cchTextMax
= (int)_tcslen(item
.pszText
);
812 item
.lParam
= (LPARAM
)pDescriptor
;
814 iItem
= ListView_InsertItem(hwndLV
, &item
);
817 wsprintf(buffer
, _T("%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
, _T("0x%08lx"), pDescriptor
->u
.DeviceSpecificData
.Reserved1
);
827 item
.mask
= LVIF_TEXT
| LVIF_PARAM
;
832 item
.pszText
= buffer
;
833 item
.cchTextMax
= (int)_tcslen(item
.pszText
);
834 item
.lParam
= (LPARAM
)pDescriptor
;
836 iItem
= ListView_InsertItem(hwndLV
, &item
);
839 wsprintf(buffer
, _T("0x%08lx"), pDescriptor
->u
.DeviceSpecificData
.Reserved2
);
840 ListView_SetItemText(hwndLV
, iItem
, 1, buffer
);
842 wsprintf(buffer
, _T("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 LoadString(hInst
, IDS_BUSNUMBER
, szText
, sizeof(szText
)/sizeof(TCHAR
));
955 if (ListView_InsertColumn(hWndListView
, 0, &lvC
) == -1)
959 lvC
.cx
= (rc
.right
- rc
.left
) - lvC
.cx
;
960 LoadString(hInst
, IDS_INTERFACE
, szText
, sizeof(szText
)/sizeof(TCHAR
));
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
, _T("%lu"), pFullDescriptor
->BusNumber
);
981 item
.mask
= LVIF_TEXT
;
986 item
.pszText
= buffer
;
987 item
.cchTextMax
= (int)_tcslen(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 DialogBox(0, MAKEINTRESOURCE(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 DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_RESOURCE
), hwndDlg
, modify_resource_dlgproc
);
1050 EndDialog(hwndDlg
, IDOK
);
1053 EndDialog(hwndDlg
, IDCANCEL
);
1061 BOOL
ModifyValue(HWND hwnd
, HKEY hKey
, LPCTSTR valueName
, BOOL EditBin
)
1065 BOOL result
= FALSE
;
1070 editValueName
= valueName
;
1072 lRet
= RegQueryValueEx(hKey
, valueName
, 0, &type
, 0, &valueDataLen
);
1073 if (lRet
!= ERROR_SUCCESS
&& (!_tcscmp(valueName
, _T("")) || 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
= RegQueryValueEx(hKey
, valueName
, 0, 0, (LPBYTE
)stringValueData
, &valueDataLen
);
1098 if (lRet
!= ERROR_SUCCESS
)
1100 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1106 stringValueData
= NULL
;
1109 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING
), hwnd
, modify_string_dlgproc
) == IDOK
)
1111 if (stringValueData
)
1113 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, (LPBYTE
)stringValueData
, (DWORD
) (_tcslen(stringValueData
) + 1) * sizeof(TCHAR
));
1117 lRet
= RegSetValueEx(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 LPTSTR src
, lines
= NULL
;
1130 if (!(stringValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
)))
1132 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1135 lRet
= RegQueryValueEx(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
= _tcslen(_T("\r\n")) * sizeof(TCHAR
);
1145 listlen
= sizeof(TCHAR
);
1146 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, listlen
+ sizeof(TCHAR
));
1147 while(*src
!= _T('\0'))
1149 llen
= _tcslen(src
);
1152 listlen
+= (llen
* sizeof(TCHAR
)) + nl_len
;
1153 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, listlen
);
1154 _tcscat(lines
, src
);
1155 _tcscat(lines
, _T("\r\n"));
1158 HeapFree(GetProcessHeap(), 0, stringValueData
);
1159 stringValueData
= lines
;
1163 stringValueData
= NULL
;
1166 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING
), hwnd
, modify_multi_string_dlgproc
) == IDOK
)
1168 if (stringValueData
)
1170 /* convert \r\n to \0 */
1171 BOOL EmptyLines
= FALSE
;
1172 LPTSTR src
, lines
, nl
;
1173 size_t linechars
, buflen
, c_nl
, dest
;
1175 src
= stringValueData
;
1176 buflen
= sizeof(TCHAR
);
1177 lines
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, buflen
+ sizeof(TCHAR
));
1178 c_nl
= _tcslen(_T("\r\n"));
1180 while(*src
!= _T('\0'))
1182 if((nl
= _tcsstr(src
, _T("\r\n"))))
1184 linechars
= nl
- src
;
1194 linechars
= _tcslen(src
);
1198 buflen
+= ((linechars
+ 1) * sizeof(TCHAR
));
1199 lines
= HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lines
, buflen
);
1200 memcpy((lines
+ dest
), src
, linechars
* sizeof(TCHAR
));
1202 lines
[dest
++] = _T('\0');
1208 src
+= linechars
+ (nl
!= NULL
? c_nl
: 0);
1210 lines
[++dest
] = _T('\0');
1214 warning(hwnd
, IDS_MULTI_SZ_EMPTY_STRING
);
1217 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, (LPBYTE
)lines
, (DWORD
) buflen
);
1218 HeapFree(GetProcessHeap(), 0, lines
);
1222 lRet
= RegSetValueEx(hKey
, valueName
, 0, type
, NULL
, 0);
1224 if (lRet
== ERROR_SUCCESS
)
1228 else if (EditBin
== FALSE
&& type
== REG_DWORD
)
1230 lRet
= RegQueryValueEx(hKey
, valueName
, 0, 0, (LPBYTE
)&dwordValueData
, &valueDataLen
);
1231 if (lRet
!= ERROR_SUCCESS
)
1233 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1237 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_DWORD
), hwnd
, modify_dword_dlgproc
) == IDOK
)
1239 lRet
= RegSetValueEx(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
= RegQueryValueEx(hKey
, valueName
, 0, 0, (LPBYTE
)resourceValueData
, &valueDataLen
);
1256 if (lRet
!= ERROR_SUCCESS
)
1258 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1264 resourceValueData
= NULL
;
1267 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_RESOURCE_LIST
), hwnd
, modify_resource_list_dlgproc
) == IDOK
)
1271 else if (EditBin
== TRUE
|| type
== REG_NONE
|| type
== REG_BINARY
)
1275 int len_vname
= lstrlen(valueName
);
1279 if(!(u_valuename
= HeapAlloc(GetProcessHeap(), 0, (len_vname
+ 1) * sizeof(WCHAR
))))
1281 error(hwnd
, IDS_TOO_BIG_VALUE
, len_vname
);
1284 /* convert the ansi value name to an unicode string */
1285 MultiByteToWideChar(CP_ACP
, 0, valueName
, -1, u_valuename
, len_vname
+ 1);
1286 valueDataLen
*= sizeof(WCHAR
);
1291 if(valueDataLen
> 0)
1293 if(!(binValueData
= HeapAlloc(GetProcessHeap(), 0, valueDataLen
+ 1)))
1295 error(hwnd
, IDS_TOO_BIG_VALUE
, valueDataLen
);
1299 /* force to use the unicode version, so editing strings in binary mode is correct */
1300 lRet
= RegQueryValueExW(hKey
,
1306 0, 0, (LPBYTE
)binValueData
, &valueDataLen
);
1307 if (lRet
!= ERROR_SUCCESS
)
1309 HeapFree(GetProcessHeap(), 0, binValueData
);
1312 HeapFree(GetProcessHeap(), 0, u_valuename
);
1314 error(hwnd
, IDS_BAD_VALUE
, valueName
);
1320 binValueData
= NULL
;
1323 if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA
), hwnd
, modify_binary_dlgproc
) == IDOK
)
1325 /* force to use the unicode version, so editing strings in binary mode is correct */
1326 lRet
= RegSetValueExW(hKey
,
1332 0, type
, (LPBYTE
)binValueData
, valueDataLen
);
1333 if (lRet
== ERROR_SUCCESS
)
1336 if(binValueData
!= NULL
)
1337 HeapFree(GetProcessHeap(), 0, binValueData
);
1340 HeapFree(GetProcessHeap(), 0, u_valuename
);
1345 error(hwnd
, IDS_UNSUPPORTED_TYPE
, type
);
1349 if (resourceValueData
)
1350 HeapFree(GetProcessHeap(), 0, resourceValueData
);
1351 resourceValueData
= NULL
;
1353 if (stringValueData
)
1354 HeapFree(GetProcessHeap(), 0, stringValueData
);
1355 stringValueData
= NULL
;
1360 static LONG
CopyKey(HKEY hDestKey
, LPCTSTR lpDestSubKey
, HKEY hSrcKey
, LPCTSTR lpSrcSubKey
)
1363 DWORD dwDisposition
;
1364 HKEY hDestSubKey
= NULL
;
1365 HKEY hSrcSubKey
= NULL
;
1366 DWORD dwIndex
, dwType
, cbName
, cbData
;
1367 TCHAR szSubKey
[256];
1368 TCHAR szValueName
[256];
1369 BYTE szValueData
[512];
1373 /* open the source subkey, if specified */
1376 lResult
= RegOpenKeyEx(hSrcKey
, lpSrcSubKey
, 0, KEY_ALL_ACCESS
, &hSrcSubKey
);
1379 hSrcKey
= hSrcSubKey
;
1382 /* create the destination subkey */
1383 lResult
= RegCreateKeyEx(hDestKey
, lpDestSubKey
, 0, NULL
, 0, KEY_WRITE
, NULL
,
1384 &hDestSubKey
, &dwDisposition
);
1388 /* copy all subkeys */
1392 cbName
= sizeof(szSubKey
) / sizeof(szSubKey
[0]);
1393 lResult
= RegEnumKeyEx(hSrcKey
, dwIndex
++, szSubKey
, &cbName
, NULL
, NULL
, NULL
, &ft
);
1394 if (lResult
== ERROR_SUCCESS
)
1396 lResult
= CopyKey(hDestSubKey
, szSubKey
, hSrcKey
, szSubKey
);
1401 while(lResult
== ERROR_SUCCESS
);
1403 /* copy all subvalues */
1407 cbName
= sizeof(szValueName
) / sizeof(szValueName
[0]);
1408 cbData
= sizeof(szValueData
) / sizeof(szValueData
[0]);
1409 lResult
= RegEnumValue(hSrcKey
, dwIndex
++, szValueName
, &cbName
, NULL
, &dwType
, szValueData
, &cbData
);
1410 if (lResult
== ERROR_SUCCESS
)
1412 lResult
= RegSetValueEx(hDestSubKey
, szValueName
, 0, dwType
, szValueData
, cbData
);
1417 while(lResult
== ERROR_SUCCESS
);
1419 lResult
= ERROR_SUCCESS
;
1423 RegCloseKey(hSrcSubKey
);
1425 RegCloseKey(hDestSubKey
);
1426 if (lResult
!= ERROR_SUCCESS
)
1427 SHDeleteKey(hDestKey
, lpDestSubKey
);
1431 static LONG
MoveKey(HKEY hDestKey
, LPCTSTR lpDestSubKey
, HKEY hSrcKey
, LPCTSTR lpSrcSubKey
)
1436 return ERROR_INVALID_FUNCTION
;
1438 lResult
= CopyKey(hDestKey
, lpDestSubKey
, hSrcKey
, lpSrcSubKey
);
1439 if (lResult
== ERROR_SUCCESS
)
1440 SHDeleteKey(hSrcKey
, lpSrcSubKey
);
1445 BOOL
DeleteKey(HWND hwnd
, HKEY hKeyRoot
, LPCTSTR keyPath
)
1447 TCHAR msg
[128], caption
[128];
1448 BOOL result
= FALSE
;
1452 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, KEY_READ
|KEY_SET_VALUE
, &hKey
);
1453 if (lRet
!= ERROR_SUCCESS
)
1455 error_code_messagebox(hwnd
, lRet
);
1459 LoadString(hInst
, IDS_QUERY_DELETE_KEY_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
1460 LoadString(hInst
, IDS_QUERY_DELETE_KEY_ONE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
1462 if (MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) != IDYES
)
1465 lRet
= SHDeleteKey(hKeyRoot
, keyPath
);
1466 if (lRet
!= ERROR_SUCCESS
)
1468 error(hwnd
, IDS_BAD_KEY
, keyPath
);
1478 LONG
RenameKey(HKEY hKey
, LPCTSTR lpSubKey
, LPCTSTR lpNewName
)
1481 LPTSTR lpNewSubKey
= NULL
;
1487 s
= _tcsrchr(lpSubKey
, _T('\\'));
1491 lpNewSubKey
= (LPTSTR
) HeapAlloc(GetProcessHeap(), 0, (s
- lpSubKey
+ _tcslen(lpNewName
) + 1) * sizeof(TCHAR
));
1492 if (lpNewSubKey
!= NULL
)
1494 memcpy(lpNewSubKey
, lpSubKey
, (s
- lpSubKey
) * sizeof(TCHAR
));
1495 lstrcpy(lpNewSubKey
+ (s
- lpSubKey
), lpNewName
);
1496 lpNewName
= lpNewSubKey
;
1499 return ERROR_NOT_ENOUGH_MEMORY
;
1502 Ret
= MoveKey(hKey
, lpNewName
, hKey
, lpSubKey
);
1506 HeapFree(GetProcessHeap(), 0, lpNewSubKey
);
1511 LONG
RenameValue(HKEY hKey
, LPCTSTR lpSubKey
, LPCTSTR lpDestValue
, LPCTSTR lpSrcValue
)
1514 HKEY hSubKey
= NULL
;
1515 DWORD dwType
, cbData
;
1520 lResult
= RegOpenKey(hKey
, lpSubKey
, &hSubKey
);
1521 if (lResult
!= ERROR_SUCCESS
)
1526 cbData
= sizeof(data
);
1527 lResult
= RegQueryValueEx(hKey
, lpSrcValue
, NULL
, &dwType
, data
, &cbData
);
1528 if (lResult
!= ERROR_SUCCESS
)
1531 lResult
= RegSetValueEx(hKey
, lpDestValue
, 0, dwType
, data
, cbData
);
1532 if (lResult
!= ERROR_SUCCESS
)
1535 RegDeleteValue(hKey
, lpSrcValue
);
1539 RegCloseKey(hSubKey
);
1543 LONG
QueryStringValue(HKEY hKey
, LPCTSTR lpSubKey
, LPCTSTR lpValueName
, LPTSTR pszBuffer
, DWORD dwBufferLen
)
1546 HKEY hSubKey
= NULL
;
1547 DWORD cbData
, dwType
;
1551 lResult
= RegOpenKey(hKey
, lpSubKey
, &hSubKey
);
1552 if (lResult
!= ERROR_SUCCESS
)
1557 cbData
= (dwBufferLen
- 1) * sizeof(*pszBuffer
);
1558 lResult
= RegQueryValueEx(hKey
, lpValueName
, NULL
, &dwType
, (LPBYTE
) pszBuffer
, &cbData
);
1559 if (lResult
!= ERROR_SUCCESS
)
1561 if (dwType
!= REG_SZ
)
1567 pszBuffer
[cbData
/ sizeof(*pszBuffer
)] = _T('\0');
1570 if (lResult
!= ERROR_SUCCESS
)
1571 pszBuffer
[0] = _T('\0');
1573 RegCloseKey(hSubKey
);
1577 BOOL
GetKeyName(LPTSTR pszDest
, size_t iDestLength
, HKEY hRootKey
, LPCTSTR lpSubKey
)
1581 if (hRootKey
== HKEY_CLASSES_ROOT
)
1582 pszRootKey
= TEXT("HKEY_CLASSES_ROOT");
1583 else if (hRootKey
== HKEY_CURRENT_USER
)
1584 pszRootKey
= TEXT("HKEY_CURRENT_USER");
1585 else if (hRootKey
== HKEY_LOCAL_MACHINE
)
1586 pszRootKey
= TEXT("HKEY_LOCAL_MACHINE");
1587 else if (hRootKey
== HKEY_USERS
)
1588 pszRootKey
= TEXT("HKEY_USERS");
1589 else if (hRootKey
== HKEY_CURRENT_CONFIG
)
1590 pszRootKey
= TEXT("HKEY_CURRENT_CONFIG");
1591 else if (hRootKey
== HKEY_DYN_DATA
)
1592 pszRootKey
= TEXT("HKEY_DYN_DATA");
1597 _sntprintf(pszDest
, iDestLength
, TEXT("%s\\%s"), pszRootKey
, lpSubKey
);
1599 _sntprintf(pszDest
, iDestLength
, TEXT("%s"), pszRootKey
);