4 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
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 /********************************************************************************
24 * Global and Local Variables:
27 #define FAVORITES_MENU_POSITION 3
29 static TCHAR s_szFavoritesRegKey
[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\Favorites");
31 static BOOL bInMenuLoop
= FALSE
; /* Tells us if we are in the menu loop */
33 /*******************************************************************************
34 * Local module support methods
37 static void resize_frame_rect(HWND hWnd
, PRECT prect
)
41 if (IsWindowVisible(hToolBar)) {
42 SendMessage(hToolBar, WM_SIZE, 0, 0);
43 GetClientRect(hToolBar, &rt);
44 prect->top = rt.bottom+3;
45 prect->bottom -= rt.bottom+3;
48 if (IsWindowVisible(hStatusBar
))
50 SetupStatusBar(hWnd
, TRUE
);
51 GetClientRect(hStatusBar
, &rt
);
52 prect
->bottom
-= rt
.bottom
;
54 MoveWindow(g_pChildWnd
->hWnd
, prect
->left
, prect
->top
, prect
->right
, prect
->bottom
, TRUE
);
57 static void resize_frame_client(HWND hWnd
)
61 GetClientRect(hWnd
, &rect
);
62 resize_frame_rect(hWnd
, &rect
);
65 /********************************************************************************/
67 static void OnInitMenu(HWND hWnd
)
71 DWORD dwIndex
, cbValueName
, cbValueData
, dwType
;
72 TCHAR szValueName
[256];
73 BYTE abValueData
[256];
74 static int s_nFavoriteMenuSubPos
= -1;
76 BOOL bDisplayedAny
= FALSE
;
78 /* Find Favorites menu and clear it out */
79 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
82 if (s_nFavoriteMenuSubPos
< 0)
84 s_nFavoriteMenuSubPos
= GetMenuItemCount(hMenu
);
88 while(RemoveMenu(hMenu
, s_nFavoriteMenuSubPos
, MF_BYPOSITION
))
92 lResult
= RegOpenKey(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, &hKey
);
93 if (lResult
!= ERROR_SUCCESS
)
99 cbValueName
= COUNT_OF(szValueName
);
100 cbValueData
= sizeof(abValueData
);
101 lResult
= RegEnumValue(hKey
, dwIndex
, szValueName
, &cbValueName
, NULL
, &dwType
, abValueData
, &cbValueData
);
102 if ((lResult
== ERROR_SUCCESS
) && (dwType
== REG_SZ
))
106 AppendMenu(hMenu
, MF_SEPARATOR
, 0, NULL
);
107 bDisplayedAny
= TRUE
;
109 AppendMenu(hMenu
, 0, ID_FAVORITES_MIN
+ GetMenuItemCount(hMenu
), szValueName
);
113 while(lResult
== ERROR_SUCCESS
);
120 static void OnEnterMenuLoop(HWND hWnd
)
123 UNREFERENCED_PARAMETER(hWnd
);
125 /* Update the status bar pane sizes */
127 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
129 SendMessage(hStatusBar
, SB_SETTEXT
, (WPARAM
)0, (LPARAM
)_T(""));
132 static void OnExitMenuLoop(HWND hWnd
)
135 /* Update the status bar pane sizes*/
136 SetupStatusBar(hWnd
, TRUE
);
140 static void OnMenuSelect(HWND hWnd
, UINT nItemID
, UINT nFlags
, HMENU hSysMenu
)
144 _tcscpy(str
, _T(""));
145 if (nFlags
& MF_POPUP
)
147 if (hSysMenu
!= GetMenu(hWnd
))
149 if (nItemID
== 2) nItemID
= 5;
152 if (LoadString(hInst
, nItemID
, str
, 100))
154 /* load appropriate string*/
156 /* first newline terminates actual string*/
157 lpsz
= _tcschr(lpsz
, _T('\n'));
161 SendMessage(hStatusBar
, SB_SETTEXT
, 0, (LPARAM
)str
);
164 void SetupStatusBar(HWND hWnd
, BOOL bResize
)
168 GetClientRect(hWnd
, &rc
);
172 SendMessage(hStatusBar
, WM_SIZE
, 0, 0);
173 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
176 void UpdateStatusBar(void)
179 ZeroMemory(&nmhdr
, sizeof(NMHDR
));
180 nmhdr
.code
= TVN_SELCHANGED
;
181 SendMessage(g_pChildWnd
->hWnd
, WM_NOTIFY
, (WPARAM
)TREE_WINDOW
, (LPARAM
)&nmhdr
);
184 static void toggle_child(HWND hWnd
, UINT cmd
, HWND hchild
)
186 BOOL vis
= IsWindowVisible(hchild
);
187 HMENU hMenuView
= GetSubMenu(hMenuFrame
, ID_VIEW_MENU
);
189 CheckMenuItem(hMenuView
, cmd
, vis
?MF_BYCOMMAND
:MF_BYCOMMAND
|MF_CHECKED
);
190 ShowWindow(hchild
, vis
?SW_HIDE
:SW_SHOW
);
191 resize_frame_client(hWnd
);
194 static BOOL
CheckCommDlgError(HWND hWnd
)
196 DWORD dwErrorCode
= CommDlgExtendedError();
197 UNREFERENCED_PARAMETER(hWnd
);
200 case CDERR_DIALOGFAILURE
:
202 case CDERR_FINDRESFAILURE
:
204 case CDERR_NOHINSTANCE
:
206 case CDERR_INITIALIZATION
:
210 case CDERR_LOCKRESFAILURE
:
212 case CDERR_NOTEMPLATE
:
214 case CDERR_LOADRESFAILURE
:
216 case CDERR_STRUCTSIZE
:
218 case CDERR_LOADSTRFAILURE
:
220 case FNERR_BUFFERTOOSMALL
:
222 case CDERR_MEMALLOCFAILURE
:
224 case FNERR_INVALIDFILENAME
:
226 case CDERR_MEMLOCKFAILURE
:
228 case FNERR_SUBCLASSFAILURE
:
236 TCHAR FileNameBuffer
[_MAX_PATH
];
237 TCHAR FileTitleBuffer
[_MAX_PATH
];
243 } FILTERPAIR
, *PFILTERPAIR
;
246 BuildFilterStrings(TCHAR
*Filter
, PFILTERPAIR Pairs
, int PairCount
)
251 for(i
= 0; i
< PairCount
; i
++)
253 c
+= LoadString(hInst
, Pairs
[i
].DisplayID
, &Filter
[c
], 255 * sizeof(TCHAR
));
255 c
+= LoadString(hInst
, Pairs
[i
].FilterID
, &Filter
[c
], 255 * sizeof(TCHAR
));
261 static BOOL
InitOpenFileName(HWND hWnd
, OPENFILENAME
* pofn
)
263 FILTERPAIR FilterPairs
[3];
264 static TCHAR Filter
[1024];
266 memset(pofn
, 0, sizeof(OPENFILENAME
));
267 pofn
->lStructSize
= sizeof(OPENFILENAME
);
268 pofn
->hwndOwner
= hWnd
;
269 pofn
->hInstance
= hInst
;
271 /* create filter string */
272 FilterPairs
[0].DisplayID
= IDS_FLT_REGFILES
;
273 FilterPairs
[0].FilterID
= IDS_FLT_REGFILES_FLT
;
274 FilterPairs
[1].DisplayID
= IDS_FLT_REGEDIT4
;
275 FilterPairs
[1].FilterID
= IDS_FLT_REGEDIT4_FLT
;
276 FilterPairs
[2].DisplayID
= IDS_FLT_ALLFILES
;
277 FilterPairs
[2].FilterID
= IDS_FLT_ALLFILES_FLT
;
278 BuildFilterStrings(Filter
, FilterPairs
, sizeof(FilterPairs
) / sizeof(FILTERPAIR
));
280 pofn
->lpstrFilter
= Filter
;
281 pofn
->lpstrFile
= FileNameBuffer
;
282 pofn
->nMaxFile
= _MAX_PATH
;
283 pofn
->lpstrFileTitle
= FileTitleBuffer
;
284 pofn
->nMaxFileTitle
= _MAX_PATH
;
285 pofn
->Flags
= OFN_HIDEREADONLY
;
286 pofn
->lpstrDefExt
= TEXT("reg");
290 static INT_PTR CALLBACK
LoadHive_KeyNameInHookProc(HWND hWndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
292 static LPTSTR sKey
= NULL
;
293 static INT sLength
= 0;
297 sKey
= (LPTSTR
)lParam
;
298 sLength
= 128; /* FIXME: Ugly hack! */
300 switch(LOWORD(wParam
))
303 if(GetDlgItemText(hWndDlg
, IDC_EDIT_KEY
, sKey
, sLength
))
304 return EndDialog(hWndDlg
, -1);
306 return EndDialog(hWndDlg
, 0);
308 return EndDialog(hWndDlg
, 0);
315 static BOOL
EnablePrivilege(LPCTSTR lpszPrivilegeName
, LPCTSTR lpszSystemName
, BOOL bEnablePrivilege
)
318 HANDLE hToken
= NULL
;
320 if (OpenProcessToken(GetCurrentProcess(),
321 TOKEN_ADJUST_PRIVILEGES
,
326 tp
.PrivilegeCount
= 1;
327 tp
.Privileges
[0].Attributes
= (bEnablePrivilege
? SE_PRIVILEGE_ENABLED
: 0);
329 if (LookupPrivilegeValue(lpszSystemName
,
331 &tp
.Privileges
[0].Luid
))
333 bRet
= AdjustTokenPrivileges(hToken
,
347 static BOOL
LoadHive(HWND hWnd
)
356 /* get the item key to load the hive in */
357 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
358 /* initialize the "open file" dialog */
359 InitOpenFileName(hWnd
, &ofn
);
360 /* build the "All Files" filter up */
361 filter
.DisplayID
= IDS_FLT_ALLFILES
;
362 filter
.FilterID
= IDS_FLT_ALLFILES_FLT
;
363 BuildFilterStrings(Filter
, &filter
, sizeof(filter
));
364 ofn
.lpstrFilter
= Filter
;
365 /* load and set the caption and flags for dialog */
366 LoadString(hInst
, IDS_LOAD_HIVE
, Caption
, COUNT_OF(Caption
));
367 ofn
.lpstrTitle
= Caption
;
368 ofn
.Flags
|= OFN_ENABLESIZING
;
369 /* ofn.lCustData = ;*/
370 /* now load the hive */
371 if (GetOpenFileName(&ofn
))
373 if(DialogBoxParam(hInst
, MAKEINTRESOURCE(IDD_LOADHIVE
), hWnd
, &LoadHive_KeyNameInHookProc
, (LPARAM
)xPath
))
377 /* Enable the required privileges */
378 EnablePrivilege(SE_BACKUP_NAME
, NULL
, TRUE
);
379 EnablePrivilege(SE_RESTORE_NAME
, NULL
, TRUE
);
382 regLoadResult
= RegLoadKey(hRootKey
, xPath
, ofn
.lpstrFile
);
384 /* Disable the privileges */
385 EnablePrivilege(SE_RESTORE_NAME
, NULL
, FALSE
);
386 EnablePrivilege(SE_BACKUP_NAME
, NULL
, FALSE
);
388 if(regLoadResult
== ERROR_SUCCESS
)
390 /* refresh tree and list views */
391 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
392 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
393 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
397 ErrorMessageBox(hWnd
, Caption
, regLoadResult
);
404 CheckCommDlgError(hWnd
);
409 static BOOL
UnloadHive(HWND hWnd
)
414 LONG regUnloadResult
;
416 /* get the item key to unload */
417 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
418 /* load and set the caption and flags for dialog */
419 LoadString(hInst
, IDS_UNLOAD_HIVE
, Caption
, COUNT_OF(Caption
));
421 /* Enable the required privileges */
422 EnablePrivilege(SE_BACKUP_NAME
, NULL
, TRUE
);
423 EnablePrivilege(SE_RESTORE_NAME
, NULL
, TRUE
);
425 /* Unload the hive */
426 regUnloadResult
= RegUnLoadKey(hRootKey
, pszKeyPath
);
428 /* Disable the privileges */
429 EnablePrivilege(SE_RESTORE_NAME
, NULL
, FALSE
);
430 EnablePrivilege(SE_BACKUP_NAME
, NULL
, FALSE
);
432 if(regUnloadResult
== ERROR_SUCCESS
)
434 /* refresh tree and list views */
435 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
436 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
437 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
441 ErrorMessageBox(hWnd
, Caption
, regUnloadResult
);
447 static BOOL
ImportRegistryFile(HWND hWnd
)
450 TCHAR Caption
[128], szTitle
[256], szText
[256];
454 InitOpenFileName(hWnd
, &ofn
);
455 LoadString(hInst
, IDS_IMPORT_REG_FILE
, Caption
, COUNT_OF(Caption
));
456 ofn
.lpstrTitle
= Caption
;
457 ofn
.Flags
|= OFN_ENABLESIZING
;
458 /* ofn.lCustData = ;*/
459 if (GetOpenFileName(&ofn
))
461 FILE *fp
= _wfopen(ofn
.lpstrFile
, L
"r");
462 if (fp
== NULL
|| !import_registry_file(fp
))
464 LPSTR p
= GetMultiByteString(ofn
.lpstrFile
);
465 fprintf(stderr
, "Can't open file \"%s\"\n", p
);
466 HeapFree(GetProcessHeap(), 0, p
);
471 LoadString(hInst
, IDS_APP_TITLE
, szTitle
, sizeof(szTitle
));
472 LoadString(hInst
, IDS_IMPORTED_OK
, szText
, sizeof(szTitle
));
473 /* show successful import */
474 MessageBox(NULL
, szText
, szTitle
, MB_OK
);
479 CheckCommDlgError(hWnd
);
482 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
483 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
484 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
489 static UINT_PTR CALLBACK
ExportRegistryFile_OFNHookProc(HWND hdlg
, UINT uiMsg
, WPARAM wParam
, LPARAM lParam
)
492 HWND hwndExportBranch
;
493 HWND hwndExportBranchText
;
494 UINT_PTR iResult
= 0;
496 LPTSTR pszSelectedKey
;
497 OFNOTIFY
*pOfnNotify
;
499 UNREFERENCED_PARAMETER(wParam
);
504 pOfn
= (OPENFILENAME
*) lParam
;
505 pszSelectedKey
= (LPTSTR
) pOfn
->lCustData
;
507 hwndExportAll
= GetDlgItem(hdlg
, IDC_EXPORT_ALL
);
509 SendMessage(hwndExportAll
, BM_SETCHECK
, pszSelectedKey
? BST_UNCHECKED
: BST_CHECKED
, 0);
511 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
512 if (hwndExportBranch
)
513 SendMessage(hwndExportBranch
, BM_SETCHECK
, pszSelectedKey
? BST_CHECKED
: BST_UNCHECKED
, 0);
515 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
516 if (hwndExportBranchText
)
517 SetWindowText(hwndExportBranchText
, pszSelectedKey
);
521 if (((NMHDR
*) lParam
)->code
== CDN_FILEOK
)
523 pOfnNotify
= (OFNOTIFY
*) lParam
;
524 pszSelectedKey
= (LPTSTR
) pOfnNotify
->lpOFN
->lCustData
;
526 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
527 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
528 if (hwndExportBranch
&& hwndExportBranchText
529 && (SendMessage(hwndExportBranch
, BM_GETCHECK
, 0, 0) == BST_CHECKED
))
531 GetWindowText(hwndExportBranchText
, pszSelectedKey
, _MAX_PATH
);
535 pszSelectedKey
[0] = '\0';
543 BOOL
ExportRegistryFile(HWND hWnd
)
546 TCHAR ExportKeyPath
[_MAX_PATH
];
551 /* Figure out which key path we are exporting */
552 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
553 GetKeyName(ExportKeyPath
, COUNT_OF(ExportKeyPath
), hKeyRoot
, pszKeyPath
);
555 InitOpenFileName(hWnd
, &ofn
);
556 LoadString(hInst
, IDS_EXPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
557 ofn
.lpstrTitle
= Caption
;
559 /* Only set the path if a key (not the root node) is selected */
562 ofn
.lCustData
= (LPARAM
) ExportKeyPath
;
564 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_EXPLORER
| OFN_ENABLEHOOK
| OFN_OVERWRITEPROMPT
;
565 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
566 ofn
.lpTemplateName
= MAKEINTRESOURCE(IDD_EXPORTRANGE
);
567 if (GetSaveFileName(&ofn
))
572 if (ofn
.nFilterIndex
== 1)
573 format
= REG_FORMAT_5
;
575 format
= REG_FORMAT_4
;
576 result
= export_registry_key(ofn
.lpstrFile
, ExportKeyPath
, format
);
579 LPSTR p
= GetMultiByteString(ofn
.lpstrFile
);
580 fprintf(stderr
, "Can't open file \"%s\"\n", p
);
581 HeapFree(GetProcessHeap(), 0, p
);
587 CheckCommDlgError(hWnd
);
592 BOOL
PrintRegistryHive(HWND hWnd
, LPTSTR path
)
596 UNREFERENCED_PARAMETER(path
);
598 ZeroMemory(&pd
, sizeof(PRINTDLG
));
599 pd
.lStructSize
= sizeof(PRINTDLG
);
601 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
602 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
603 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
605 pd
.nFromPage
= 0xFFFF;
608 pd
.nMaxPage
= 0xFFFF;
611 /* GDI calls to render output. */
612 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
618 hResult
= PrintDlgEx(&pd
);
621 switch (pd
.dwResultAction
)
623 case PD_RESULT_APPLY
:
624 /*The user clicked the Apply button and later clicked the Cancel button. This indicates that the user wants to apply the changes made in the property sheet, but does not yet want to print. The PRINTDLGEX structure contains the information specified by the user at the time the Apply button was clicked. */
626 case PD_RESULT_CANCEL
:
627 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
629 case PD_RESULT_PRINT
:
630 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
641 /*Insufficient memory. */
644 /* One or more arguments are invalid. */
647 /*Invalid pointer. */
653 /*Unspecified error. */
664 static void ChooseFavorite(LPCTSTR pszFavorite
)
667 TCHAR szFavoritePath
[512];
668 DWORD cbData
, dwType
;
670 if (RegOpenKeyEx(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
673 cbData
= (sizeof(szFavoritePath
) / sizeof(szFavoritePath
[0])) - 1;
674 memset(szFavoritePath
, 0, sizeof(szFavoritePath
));
675 if (RegQueryValueEx(hKey
, pszFavorite
, NULL
, &dwType
, (LPBYTE
) szFavoritePath
, &cbData
) != ERROR_SUCCESS
)
678 if (dwType
== REG_SZ
)
679 SelectNode(g_pChildWnd
->hTreeWnd
, szFavoritePath
);
686 BOOL
CopyKeyName(HWND hWnd
, HKEY hRootKey
, LPCTSTR keyName
)
688 BOOL bClipboardOpened
= FALSE
;
689 BOOL bSuccess
= FALSE
;
694 if (!OpenClipboard(hWnd
))
696 bClipboardOpened
= TRUE
;
698 if (!EmptyClipboard())
701 if (!GetKeyName(szBuffer
, COUNT_OF(szBuffer
), hRootKey
, keyName
))
704 hGlobal
= GlobalAlloc(GMEM_MOVEABLE
, (lstrlen(szBuffer
) + 1) * sizeof(TCHAR
));
708 s
= GlobalLock(hGlobal
);
709 _tcscpy(s
, szBuffer
);
710 GlobalUnlock(hGlobal
);
713 SetClipboardData(CF_UNICODETEXT
, hGlobal
);
715 SetClipboardData(CF_TEXT
, hGlobal
);
720 if (bClipboardOpened
)
725 static BOOL
CreateNewValue(HKEY hRootKey
, LPCTSTR pszKeyPath
, DWORD dwType
)
727 TCHAR szNewValueFormat
[128];
728 TCHAR szNewValue
[128];
731 DWORD dwExistingType
, cbData
;
736 if (RegOpenKeyEx(hRootKey
, pszKeyPath
, 0, KEY_QUERY_VALUE
| KEY_SET_VALUE
,
737 &hKey
) != ERROR_SUCCESS
)
740 LoadString(hInst
, IDS_NEW_VALUE
, szNewValueFormat
, COUNT_OF(szNewValueFormat
));
744 wsprintf(szNewValue
, szNewValueFormat
, iIndex
++);
745 cbData
= sizeof(data
);
746 lResult
= RegQueryValueEx(hKey
, szNewValue
, NULL
, &dwExistingType
, data
, &cbData
);
748 while(lResult
== ERROR_SUCCESS
);
753 cbData
= sizeof(DWORD
);
757 cbData
= sizeof(TCHAR
);
760 cbData
= sizeof(TCHAR
) * 2;
763 cbData
= sizeof(DWORD
) * 2;
769 memset(data
, 0, cbData
);
770 lResult
= RegSetValueEx(hKey
, szNewValue
, 0, dwType
, data
, cbData
);
772 if (lResult
!= ERROR_SUCCESS
)
777 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
779 /* locate the newly added value, and get ready to rename it */
780 memset(&lvfi
, 0, sizeof(lvfi
));
781 lvfi
.flags
= LVFI_STRING
;
782 lvfi
.psz
= szNewValue
;
783 iIndex
= ListView_FindItem(g_pChildWnd
->hListWnd
, -1, &lvfi
);
785 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, iIndex
);
791 InitializeRemoteRegistryPicker(OUT IDsObjectPicker
**pDsObjectPicker
)
795 *pDsObjectPicker
= NULL
;
797 hRet
= CoCreateInstance(&CLSID_DsObjectPicker
,
799 CLSCTX_INPROC_SERVER
,
800 &IID_IDsObjectPicker
,
801 (LPVOID
*)pDsObjectPicker
);
804 DSOP_INIT_INFO InitInfo
;
805 static DSOP_SCOPE_INIT_INFO Scopes
[] =
808 sizeof(DSOP_SCOPE_INIT_INFO
),
809 DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE
| DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE
|
810 DSOP_SCOPE_TYPE_GLOBAL_CATALOG
| DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN
|
811 DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN
| DSOP_SCOPE_TYPE_WORKGROUP
|
812 DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
| DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN
,
816 DSOP_FILTER_COMPUTERS
,
820 DSOP_DOWNLEVEL_FILTER_COMPUTERS
828 InitInfo
.cbSize
= sizeof(InitInfo
);
829 InitInfo
.pwzTargetComputer
= NULL
;
830 InitInfo
.cDsScopeInfos
= sizeof(Scopes
) / sizeof(Scopes
[0]);
831 InitInfo
.aDsScopeInfos
= Scopes
;
832 InitInfo
.flOptions
= 0;
833 InitInfo
.cAttributesToFetch
= 0;
834 InitInfo
.apwzAttributeNames
= NULL
;
836 hRet
= (*pDsObjectPicker
)->lpVtbl
->Initialize(*pDsObjectPicker
,
841 /* delete the object picker in case initialization failed! */
842 (*pDsObjectPicker
)->lpVtbl
->Release(*pDsObjectPicker
);
850 InvokeRemoteRegistryPickerDialog(IN IDsObjectPicker
*pDsObjectPicker
,
851 IN HWND hwndParent OPTIONAL
,
855 IDataObject
*pdo
= NULL
;
858 hRet
= pDsObjectPicker
->lpVtbl
->InvokeDialog(pDsObjectPicker
,
866 fe
.cfFormat
= (CLIPFORMAT
) RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST
);
868 fe
.dwAspect
= DVASPECT_CONTENT
;
870 fe
.tymed
= TYMED_HGLOBAL
;
872 hRet
= pdo
->lpVtbl
->GetData(pdo
,
877 PDS_SELECTION_LIST SelectionList
= (PDS_SELECTION_LIST
)GlobalLock(stm
.hGlobal
);
878 if (SelectionList
!= NULL
)
880 if (SelectionList
->cItems
== 1)
882 size_t nlen
= wcslen(SelectionList
->aDsSelection
[0].pwzName
);
889 SelectionList
->aDsSelection
[0].pwzName
,
890 nlen
* sizeof(WCHAR
));
892 WideCharToMultiByte(CP_ACP
,
894 SelectionList
->aDsSelection
[0].pwzName
,
901 lpBuffer
[nlen
] = L
'\0';
904 GlobalUnlock(stm
.hGlobal
);
907 ReleaseStgMedium(&stm
);
910 pdo
->lpVtbl
->Release(pdo
);
917 FreeObjectPicker(IN IDsObjectPicker
*pDsObjectPicker
)
919 pDsObjectPicker
->lpVtbl
->Release(pDsObjectPicker
);
922 /*******************************************************************************
924 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
926 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
929 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
931 HKEY hKeyRoot
= 0, hKey
= 0;
935 REGSAM regsam
= KEY_READ
;
939 UNREFERENCED_PARAMETER(lParam
);
940 UNREFERENCED_PARAMETER(message
);
942 switch (LOWORD(wParam
))
944 case ID_REGISTRY_LOADHIVE
:
947 case ID_REGISTRY_UNLOADHIVE
:
950 case ID_REGISTRY_IMPORTREGISTRYFILE
:
951 ImportRegistryFile(hWnd
);
953 case ID_REGISTRY_EXPORTREGISTRYFILE
:
954 ExportRegistryFile(hWnd
);
956 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
958 IDsObjectPicker
*ObjectPicker
;
959 TCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
962 hRet
= CoInitialize(NULL
);
965 hRet
= InitializeRemoteRegistryPicker(&ObjectPicker
);
968 hRet
= InvokeRemoteRegistryPickerDialog(ObjectPicker
,
971 sizeof(szComputerName
) / sizeof(szComputerName
[0]));
974 /* FIXME - connect to the registry */
977 FreeObjectPicker(ObjectPicker
);
985 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
987 case ID_REGISTRY_PRINT
:
988 PrintRegistryHive(hWnd
, _T(""));
990 case ID_REGISTRY_EXIT
:
993 case ID_VIEW_STATUSBAR
:
994 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
996 case ID_HELP_HELPTOPICS
:
997 WinHelp(hWnd
, _T("regedit"), HELP_FINDER
, 0);
1006 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
1007 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
1008 pt
.y
= (rt
.bottom
/ 2);
1010 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
))
1012 SetCursorPos(pts
.x
, pts
.y
);
1013 SetCursor(LoadCursor(0, IDC_SIZEWE
));
1014 SendMessage(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
1018 case ID_EDIT_RENAME
:
1019 case ID_EDIT_MODIFY
:
1020 case ID_EDIT_MODIFY_BIN
:
1021 case ID_EDIT_DELETE
:
1022 regsam
|= KEY_WRITE
;
1026 keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
1027 valueName
= GetValueName(g_pChildWnd
->hListWnd
, -1);
1030 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, regsam
, &hKey
);
1031 if (lRet
!= ERROR_SUCCESS
) hKey
= 0;
1034 switch (LOWORD(wParam
))
1036 case ID_EDIT_MODIFY
:
1037 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, FALSE
))
1038 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
1040 case ID_EDIT_MODIFY_BIN
:
1041 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, TRUE
))
1042 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
1044 case ID_EDIT_RENAME
:
1045 if (GetFocus() == g_pChildWnd
->hListWnd
)
1047 if(ListView_GetSelectedCount(g_pChildWnd
->hListWnd
) == 1)
1049 item
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
1052 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, item
);
1056 else if (GetFocus() == g_pChildWnd
->hTreeWnd
)
1058 /* Get focused entry of treeview (if any) */
1059 HTREEITEM hItem
= TreeView_GetSelection(g_pChildWnd
->hTreeWnd
);
1061 (void)TreeView_EditLabel(g_pChildWnd
->hTreeWnd
, hItem
);
1064 case ID_EDIT_DELETE
:
1066 if (GetFocus() == g_pChildWnd
->hListWnd
)
1068 UINT nSelected
= ListView_GetSelectedCount(g_pChildWnd
->hListWnd
);
1071 TCHAR msg
[128], caption
[128];
1072 LoadString(hInst
, IDS_QUERY_DELETE_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
1073 LoadString(hInst
, (nSelected
== 1 ? IDS_QUERY_DELETE_ONE
: IDS_QUERY_DELETE_MORE
), msg
, sizeof(msg
)/sizeof(TCHAR
));
1074 if(MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) == IDYES
)
1080 while((ni
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, item
, LVNI_SELECTED
)) > -1)
1082 valueName
= GetValueName(g_pChildWnd
->hListWnd
, item
);
1083 if(RegDeleteValue(hKey
, valueName
) != ERROR_SUCCESS
)
1090 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
1093 LoadString(hInst
, IDS_ERR_DELVAL_CAPTION
, caption
, sizeof(caption
)/sizeof(TCHAR
));
1094 LoadString(hInst
, IDS_ERR_DELETEVALUE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
1095 MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONSTOP
);
1100 else if (GetFocus() == g_pChildWnd
->hTreeWnd
)
1102 if (keyPath
== 0 || *keyPath
== 0)
1104 MessageBeep(MB_ICONHAND
);
1106 else if (DeleteKey(hWnd
, hKeyRoot
, keyPath
))
1108 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
1109 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
1114 case ID_EDIT_NEW_STRINGVALUE
:
1115 CreateNewValue(hKeyRoot
, keyPath
, REG_SZ
);
1117 case ID_EDIT_NEW_BINARYVALUE
:
1118 CreateNewValue(hKeyRoot
, keyPath
, REG_BINARY
);
1120 case ID_EDIT_NEW_DWORDVALUE
:
1121 CreateNewValue(hKeyRoot
, keyPath
, REG_DWORD
);
1123 case ID_EDIT_NEW_MULTISTRINGVALUE
:
1124 CreateNewValue(hKeyRoot
, keyPath
, REG_MULTI_SZ
);
1126 case ID_EDIT_NEW_EXPANDABLESTRINGVALUE
:
1127 CreateNewValue(hKeyRoot
, keyPath
, REG_EXPAND_SZ
);
1132 case ID_EDIT_FINDNEXT
:
1135 case ID_EDIT_COPYKEYNAME
:
1136 CopyKeyName(hWnd
, hKeyRoot
, keyPath
);
1138 case ID_EDIT_PERMISSIONS
:
1139 RegKeyEditPermissions(hWnd
, hKeyRoot
, NULL
, keyPath
);
1141 case ID_REGISTRY_PRINTERSETUP
:
1144 /*PAGESETUPDLG psd;*/
1145 /*PageSetupDlg(&psd);*/
1147 case ID_REGISTRY_OPENLOCAL
:
1150 case ID_VIEW_REFRESH
:
1151 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
1152 /*RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); */
1154 /*case ID_OPTIONS_TOOLBAR:*/
1155 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
1157 case ID_EDIT_NEW_KEY
:
1158 CreateNewKey(g_pChildWnd
->hTreeWnd
, TreeView_GetSelection(g_pChildWnd
->hTreeWnd
));
1161 if ((LOWORD(wParam
) >= ID_FAVORITES_MIN
) && (LOWORD(wParam
) <= ID_FAVORITES_MAX
))
1165 TCHAR szFavorite
[512];
1167 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
1169 memset(&mii
, 0, sizeof(mii
));
1170 mii
.cbSize
= sizeof(mii
);
1171 mii
.fMask
= MIIM_TYPE
;
1172 mii
.fType
= MFT_STRING
;
1173 mii
.dwTypeData
= szFavorite
;
1174 mii
.cch
= sizeof(szFavorite
) / sizeof(szFavorite
[0]);
1176 if (GetMenuItemInfo(hMenu
, LOWORD(wParam
) - ID_FAVORITES_MIN
, TRUE
, &mii
))
1178 ChooseFavorite(szFavorite
);
1193 /********************************************************************************
1195 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
1197 * PURPOSE: Processes messages for the main frame window.
1199 * WM_COMMAND - process the application menu
1200 * WM_DESTROY - post a quit message and return
1204 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1209 CreateWindowEx(0, szChildClass
, NULL
, WS_CHILD
| WS_VISIBLE
,
1210 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
1211 hWnd
, (HMENU
)0, hInst
, 0);
1214 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
1215 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
1219 SetFocus(g_pChildWnd
->hWnd
);
1222 resize_frame_client(hWnd
);
1229 case WM_ENTERMENULOOP
:
1230 OnEnterMenuLoop(hWnd
);
1232 case WM_EXITMENULOOP
:
1233 OnExitMenuLoop(hWnd
);
1236 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
1238 case WM_SYSCOLORCHANGE
:
1239 /* Forward WM_SYSCOLORCHANGE to common controls */
1240 SendMessage(g_pChildWnd
->hListWnd
, WM_SYSCOLORCHANGE
, 0, 0);
1241 SendMessage(g_pChildWnd
->hTreeWnd
, WM_SYSCOLORCHANGE
, 0, 0);
1244 WinHelp(hWnd
, _T("regedit"), HELP_QUIT
, 0);
1248 return DefWindowProc(hWnd
, message
, wParam
, lParam
);