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
LoadHive(HWND hWnd
)
324 /* get the item key to load the hive in */
325 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
326 /* initialize the "open file" dialog */
327 InitOpenFileName(hWnd
, &ofn
);
328 /* build the "All Files" filter up */
329 filter
.DisplayID
= IDS_FLT_ALLFILES
;
330 filter
.FilterID
= IDS_FLT_ALLFILES_FLT
;
331 BuildFilterStrings(Filter
, &filter
, sizeof(filter
));
332 ofn
.lpstrFilter
= Filter
;
333 /* load and set the caption and flags for dialog */
334 LoadString(hInst
, IDS_LOAD_HIVE
, Caption
, COUNT_OF(Caption
));
335 ofn
.lpstrTitle
= Caption
;
336 ofn
.Flags
|= OFN_ENABLESIZING
;
337 /* ofn.lCustData = ;*/
338 /* now load the hive */
339 if (GetOpenFileName(&ofn
))
341 if(DialogBoxParam(hInst
, MAKEINTRESOURCE(IDD_LOADHIVE
), hWnd
, &LoadHive_KeyNameInHookProc
, (LPARAM
)xPath
))
343 LONG regLoadResult
= RegLoadKey(hRootKey
, xPath
, ofn
.lpstrFile
);
344 if(regLoadResult
== ERROR_SUCCESS
)
346 /* refresh tree and list views */
347 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
348 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
349 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
353 ErrorMessageBox(hWnd
, Caption
, regLoadResult
);
360 CheckCommDlgError(hWnd
);
365 static BOOL
UnloadHive(HWND hWnd
)
370 /* get the item key to unload */
371 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
372 /* load and set the caption and flags for dialog */
373 LoadString(hInst
, IDS_UNLOAD_HIVE
, Caption
, COUNT_OF(Caption
));
374 /* now unload the hive */
375 LONG regUnloadResult
= RegUnLoadKey(hRootKey
, pszKeyPath
);
376 if(regUnloadResult
== ERROR_SUCCESS
)
378 /* refresh tree and list views */
379 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
380 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
381 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
385 ErrorMessageBox(hWnd
, Caption
, regUnloadResult
);
391 static BOOL
ImportRegistryFile(HWND hWnd
)
398 InitOpenFileName(hWnd
, &ofn
);
399 LoadString(hInst
, IDS_IMPORT_REG_FILE
, Caption
, COUNT_OF(Caption
));
400 ofn
.lpstrTitle
= Caption
;
401 ofn
.Flags
|= OFN_ENABLESIZING
;
402 /* ofn.lCustData = ;*/
403 if (GetOpenFileName(&ofn
))
405 FILE *fp
= _wfopen(ofn
.lpstrFile
, L
"r");
406 if (fp
== NULL
|| !import_registry_file(fp
))
408 LPSTR p
= GetMultiByteString(ofn
.lpstrFile
);
409 fprintf(stderr
, "Can't open file \"%s\"\n", p
);
410 HeapFree(GetProcessHeap(), 0, p
);
419 CheckCommDlgError(hWnd
);
422 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
423 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
424 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
429 static UINT_PTR CALLBACK
ExportRegistryFile_OFNHookProc(HWND hdlg
, UINT uiMsg
, WPARAM wParam
, LPARAM lParam
)
432 HWND hwndExportBranch
;
433 HWND hwndExportBranchText
;
434 UINT_PTR iResult
= 0;
436 LPTSTR pszSelectedKey
;
437 OFNOTIFY
*pOfnNotify
;
439 UNREFERENCED_PARAMETER(wParam
);
444 pOfn
= (OPENFILENAME
*) lParam
;
445 pszSelectedKey
= (LPTSTR
) pOfn
->lCustData
;
447 hwndExportAll
= GetDlgItem(hdlg
, IDC_EXPORT_ALL
);
449 SendMessage(hwndExportAll
, BM_SETCHECK
, pszSelectedKey
? BST_UNCHECKED
: BST_CHECKED
, 0);
451 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
452 if (hwndExportBranch
)
453 SendMessage(hwndExportBranch
, BM_SETCHECK
, pszSelectedKey
? BST_CHECKED
: BST_UNCHECKED
, 0);
455 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
456 if (hwndExportBranchText
)
457 SetWindowText(hwndExportBranchText
, pszSelectedKey
);
461 if (((NMHDR
*) lParam
)->code
== CDN_FILEOK
)
463 pOfnNotify
= (OFNOTIFY
*) lParam
;
464 pszSelectedKey
= (LPTSTR
) pOfnNotify
->lpOFN
->lCustData
;
466 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
467 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
468 if (hwndExportBranch
&& hwndExportBranchText
469 && (SendMessage(hwndExportBranch
, BM_GETCHECK
, 0, 0) == BST_CHECKED
))
471 GetWindowText(hwndExportBranchText
, pszSelectedKey
, _MAX_PATH
);
475 pszSelectedKey
[0] = '\0';
483 BOOL
ExportRegistryFile(HWND hWnd
)
486 TCHAR ExportKeyPath
[_MAX_PATH
];
491 /* Figure out which key path we are exporting */
492 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
493 GetKeyName(ExportKeyPath
, COUNT_OF(ExportKeyPath
), hKeyRoot
, pszKeyPath
);
495 InitOpenFileName(hWnd
, &ofn
);
496 LoadString(hInst
, IDS_EXPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
497 ofn
.lpstrTitle
= Caption
;
499 /* Only set the path if a key (not the root node) is selected */
502 ofn
.lCustData
= (LPARAM
) ExportKeyPath
;
504 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_EXPLORER
| OFN_ENABLEHOOK
| OFN_OVERWRITEPROMPT
;
505 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
506 ofn
.lpTemplateName
= MAKEINTRESOURCE(IDD_EXPORTRANGE
);
507 if (GetSaveFileName(&ofn
))
512 if (ofn
.nFilterIndex
== 1)
513 format
= REG_FORMAT_5
;
515 format
= REG_FORMAT_4
;
516 result
= export_registry_key(ofn
.lpstrFile
, ExportKeyPath
, format
);
519 LPSTR p
= GetMultiByteString(ofn
.lpstrFile
);
520 fprintf(stderr
, "Can't open file \"%s\"\n", p
);
521 HeapFree(GetProcessHeap(), 0, p
);
527 CheckCommDlgError(hWnd
);
532 BOOL
PrintRegistryHive(HWND hWnd
, LPTSTR path
)
536 UNREFERENCED_PARAMETER(path
);
538 ZeroMemory(&pd
, sizeof(PRINTDLG
));
539 pd
.lStructSize
= sizeof(PRINTDLG
);
541 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
542 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
543 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
545 pd
.nFromPage
= 0xFFFF;
548 pd
.nMaxPage
= 0xFFFF;
551 /* GDI calls to render output. */
552 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
558 hResult
= PrintDlgEx(&pd
);
561 switch (pd
.dwResultAction
)
563 case PD_RESULT_APPLY
:
564 /*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. */
566 case PD_RESULT_CANCEL
:
567 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
569 case PD_RESULT_PRINT
:
570 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
581 /*Insufficient memory. */
584 /* One or more arguments are invalid. */
587 /*Invalid pointer. */
593 /*Unspecified error. */
604 static void ChooseFavorite(LPCTSTR pszFavorite
)
607 TCHAR szFavoritePath
[512];
608 DWORD cbData
, dwType
;
610 if (RegOpenKeyEx(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
613 cbData
= (sizeof(szFavoritePath
) / sizeof(szFavoritePath
[0])) - 1;
614 memset(szFavoritePath
, 0, sizeof(szFavoritePath
));
615 if (RegQueryValueEx(hKey
, pszFavorite
, NULL
, &dwType
, (LPBYTE
) szFavoritePath
, &cbData
) != ERROR_SUCCESS
)
618 if (dwType
== REG_SZ
)
619 SelectNode(g_pChildWnd
->hTreeWnd
, szFavoritePath
);
626 BOOL
CopyKeyName(HWND hWnd
, HKEY hRootKey
, LPCTSTR keyName
)
628 BOOL bClipboardOpened
= FALSE
;
629 BOOL bSuccess
= FALSE
;
634 if (!OpenClipboard(hWnd
))
636 bClipboardOpened
= TRUE
;
638 if (!EmptyClipboard())
641 if (!GetKeyName(szBuffer
, COUNT_OF(szBuffer
), hRootKey
, keyName
))
644 hGlobal
= GlobalAlloc(GMEM_MOVEABLE
, (lstrlen(szBuffer
) + 1) * sizeof(TCHAR
));
648 s
= GlobalLock(hGlobal
);
649 _tcscpy(s
, szBuffer
);
650 GlobalUnlock(hGlobal
);
653 SetClipboardData(CF_UNICODETEXT
, hGlobal
);
655 SetClipboardData(CF_TEXT
, hGlobal
);
660 if (bClipboardOpened
)
665 static BOOL
CreateNewValue(HKEY hRootKey
, LPCTSTR pszKeyPath
, DWORD dwType
)
667 TCHAR szNewValueFormat
[128];
668 TCHAR szNewValue
[128];
671 DWORD dwExistingType
, cbData
;
676 if (RegOpenKeyEx(hRootKey
, pszKeyPath
, 0, KEY_QUERY_VALUE
| KEY_SET_VALUE
,
677 &hKey
) != ERROR_SUCCESS
)
680 LoadString(hInst
, IDS_NEW_VALUE
, szNewValueFormat
, COUNT_OF(szNewValueFormat
));
684 wsprintf(szNewValue
, szNewValueFormat
, iIndex
++);
685 cbData
= sizeof(data
);
686 lResult
= RegQueryValueEx(hKey
, szNewValue
, NULL
, &dwExistingType
, data
, &cbData
);
688 while(lResult
== ERROR_SUCCESS
);
693 cbData
= sizeof(DWORD
);
697 cbData
= sizeof(TCHAR
);
700 cbData
= sizeof(TCHAR
) * 2;
703 cbData
= sizeof(DWORD
) * 2;
709 memset(data
, 0, cbData
);
710 lResult
= RegSetValueEx(hKey
, szNewValue
, 0, dwType
, data
, cbData
);
712 if (lResult
!= ERROR_SUCCESS
)
717 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
719 /* locate the newly added value, and get ready to rename it */
720 memset(&lvfi
, 0, sizeof(lvfi
));
721 lvfi
.flags
= LVFI_STRING
;
722 lvfi
.psz
= szNewValue
;
723 iIndex
= ListView_FindItem(g_pChildWnd
->hListWnd
, -1, &lvfi
);
725 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, iIndex
);
731 InitializeRemoteRegistryPicker(OUT IDsObjectPicker
**pDsObjectPicker
)
735 *pDsObjectPicker
= NULL
;
737 hRet
= CoCreateInstance(&CLSID_DsObjectPicker
,
739 CLSCTX_INPROC_SERVER
,
740 &IID_IDsObjectPicker
,
741 (LPVOID
*)pDsObjectPicker
);
744 DSOP_INIT_INFO InitInfo
;
745 static DSOP_SCOPE_INIT_INFO Scopes
[] =
748 sizeof(DSOP_SCOPE_INIT_INFO
),
749 DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE
| DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE
|
750 DSOP_SCOPE_TYPE_GLOBAL_CATALOG
| DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN
|
751 DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN
| DSOP_SCOPE_TYPE_WORKGROUP
|
752 DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
| DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN
,
756 DSOP_FILTER_COMPUTERS
,
760 DSOP_DOWNLEVEL_FILTER_COMPUTERS
768 InitInfo
.cbSize
= sizeof(InitInfo
);
769 InitInfo
.pwzTargetComputer
= NULL
;
770 InitInfo
.cDsScopeInfos
= sizeof(Scopes
) / sizeof(Scopes
[0]);
771 InitInfo
.aDsScopeInfos
= Scopes
;
772 InitInfo
.flOptions
= 0;
773 InitInfo
.cAttributesToFetch
= 0;
774 InitInfo
.apwzAttributeNames
= NULL
;
776 hRet
= (*pDsObjectPicker
)->lpVtbl
->Initialize(*pDsObjectPicker
,
781 /* delete the object picker in case initialization failed! */
782 (*pDsObjectPicker
)->lpVtbl
->Release(*pDsObjectPicker
);
790 InvokeRemoteRegistryPickerDialog(IN IDsObjectPicker
*pDsObjectPicker
,
791 IN HWND hwndParent OPTIONAL
,
795 IDataObject
*pdo
= NULL
;
798 hRet
= pDsObjectPicker
->lpVtbl
->InvokeDialog(pDsObjectPicker
,
806 fe
.cfFormat
= (CLIPFORMAT
) RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST
);
808 fe
.dwAspect
= DVASPECT_CONTENT
;
810 fe
.tymed
= TYMED_HGLOBAL
;
812 hRet
= pdo
->lpVtbl
->GetData(pdo
,
817 PDS_SELECTION_LIST SelectionList
= (PDS_SELECTION_LIST
)GlobalLock(stm
.hGlobal
);
818 if (SelectionList
!= NULL
)
820 if (SelectionList
->cItems
== 1)
822 size_t nlen
= wcslen(SelectionList
->aDsSelection
[0].pwzName
);
829 SelectionList
->aDsSelection
[0].pwzName
,
830 nlen
* sizeof(WCHAR
));
832 WideCharToMultiByte(CP_ACP
,
834 SelectionList
->aDsSelection
[0].pwzName
,
841 lpBuffer
[nlen
] = L
'\0';
844 GlobalUnlock(stm
.hGlobal
);
847 ReleaseStgMedium(&stm
);
850 pdo
->lpVtbl
->Release(pdo
);
857 FreeObjectPicker(IN IDsObjectPicker
*pDsObjectPicker
)
859 pDsObjectPicker
->lpVtbl
->Release(pDsObjectPicker
);
862 /*******************************************************************************
864 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
866 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
869 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
871 HKEY hKeyRoot
= 0, hKey
= 0;
875 REGSAM regsam
= KEY_READ
;
879 UNREFERENCED_PARAMETER(lParam
);
880 UNREFERENCED_PARAMETER(message
);
882 switch (LOWORD(wParam
))
884 case ID_REGISTRY_LOADHIVE
:
887 case ID_REGISTRY_UNLOADHIVE
:
890 case ID_REGISTRY_IMPORTREGISTRYFILE
:
891 ImportRegistryFile(hWnd
);
893 case ID_REGISTRY_EXPORTREGISTRYFILE
:
894 ExportRegistryFile(hWnd
);
896 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
898 IDsObjectPicker
*ObjectPicker
;
899 TCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
902 hRet
= CoInitialize(NULL
);
905 hRet
= InitializeRemoteRegistryPicker(&ObjectPicker
);
908 hRet
= InvokeRemoteRegistryPickerDialog(ObjectPicker
,
911 sizeof(szComputerName
) / sizeof(szComputerName
[0]));
914 /* FIXME - connect to the registry */
917 FreeObjectPicker(ObjectPicker
);
925 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
927 case ID_REGISTRY_PRINT
:
928 PrintRegistryHive(hWnd
, _T(""));
930 case ID_REGISTRY_EXIT
:
933 case ID_VIEW_STATUSBAR
:
934 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
936 case ID_HELP_HELPTOPICS
:
937 WinHelp(hWnd
, _T("regedit"), HELP_FINDER
, 0);
946 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
947 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
948 pt
.y
= (rt
.bottom
/ 2);
950 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
))
952 SetCursorPos(pts
.x
, pts
.y
);
953 SetCursor(LoadCursor(0, IDC_SIZEWE
));
954 SendMessage(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
960 case ID_EDIT_MODIFY_BIN
:
966 keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
967 valueName
= GetValueName(g_pChildWnd
->hListWnd
, -1);
970 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, regsam
, &hKey
);
971 if (lRet
!= ERROR_SUCCESS
) hKey
= 0;
974 switch (LOWORD(wParam
))
977 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, FALSE
))
978 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
980 case ID_EDIT_MODIFY_BIN
:
981 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, TRUE
))
982 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
985 if (GetFocus() == g_pChildWnd
->hListWnd
)
987 if(ListView_GetSelectedCount(g_pChildWnd
->hListWnd
) == 1)
989 item
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
992 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, item
);
996 else if (GetFocus() == g_pChildWnd
->hTreeWnd
)
998 /* Get focused entry of treeview (if any) */
999 HTREEITEM hItem
= TreeView_GetSelection(g_pChildWnd
->hTreeWnd
);
1001 (void)TreeView_EditLabel(g_pChildWnd
->hTreeWnd
, hItem
);
1004 case ID_EDIT_DELETE
:
1006 if (GetFocus() == g_pChildWnd
->hListWnd
)
1008 UINT nSelected
= ListView_GetSelectedCount(g_pChildWnd
->hListWnd
);
1011 TCHAR msg
[128], caption
[128];
1012 LoadString(hInst
, IDS_QUERY_DELETE_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
1013 LoadString(hInst
, (nSelected
== 1 ? IDS_QUERY_DELETE_ONE
: IDS_QUERY_DELETE_MORE
), msg
, sizeof(msg
)/sizeof(TCHAR
));
1014 if(MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) == IDYES
)
1020 while((ni
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, item
, LVNI_SELECTED
)) > -1)
1022 valueName
= GetValueName(g_pChildWnd
->hListWnd
, item
);
1023 if(RegDeleteValue(hKey
, valueName
) != ERROR_SUCCESS
)
1030 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
1033 LoadString(hInst
, IDS_ERR_DELVAL_CAPTION
, caption
, sizeof(caption
)/sizeof(TCHAR
));
1034 LoadString(hInst
, IDS_ERR_DELETEVALUE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
1035 MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONSTOP
);
1040 else if (GetFocus() == g_pChildWnd
->hTreeWnd
)
1042 if (keyPath
== 0 || *keyPath
== 0)
1044 MessageBeep(MB_ICONHAND
);
1046 else if (DeleteKey(hWnd
, hKeyRoot
, keyPath
))
1048 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
1049 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
1054 case ID_EDIT_NEW_STRINGVALUE
:
1055 CreateNewValue(hKeyRoot
, keyPath
, REG_SZ
);
1057 case ID_EDIT_NEW_BINARYVALUE
:
1058 CreateNewValue(hKeyRoot
, keyPath
, REG_BINARY
);
1060 case ID_EDIT_NEW_DWORDVALUE
:
1061 CreateNewValue(hKeyRoot
, keyPath
, REG_DWORD
);
1063 case ID_EDIT_NEW_MULTISTRINGVALUE
:
1064 CreateNewValue(hKeyRoot
, keyPath
, REG_MULTI_SZ
);
1066 case ID_EDIT_NEW_EXPANDABLESTRINGVALUE
:
1067 CreateNewValue(hKeyRoot
, keyPath
, REG_EXPAND_SZ
);
1072 case ID_EDIT_FINDNEXT
:
1075 case ID_EDIT_COPYKEYNAME
:
1076 CopyKeyName(hWnd
, hKeyRoot
, keyPath
);
1078 case ID_EDIT_PERMISSIONS
:
1079 RegKeyEditPermissions(hWnd
, hKeyRoot
, NULL
, keyPath
);
1081 case ID_REGISTRY_PRINTERSETUP
:
1084 /*PAGESETUPDLG psd;*/
1085 /*PageSetupDlg(&psd);*/
1087 case ID_REGISTRY_OPENLOCAL
:
1090 case ID_VIEW_REFRESH
:
1091 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
1092 /*RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); */
1094 /*case ID_OPTIONS_TOOLBAR:*/
1095 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
1097 case ID_EDIT_NEW_KEY
:
1098 CreateNewKey(g_pChildWnd
->hTreeWnd
, TreeView_GetSelection(g_pChildWnd
->hTreeWnd
));
1101 if ((LOWORD(wParam
) >= ID_FAVORITES_MIN
) && (LOWORD(wParam
) <= ID_FAVORITES_MAX
))
1105 TCHAR szFavorite
[512];
1107 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
1109 memset(&mii
, 0, sizeof(mii
));
1110 mii
.cbSize
= sizeof(mii
);
1111 mii
.fMask
= MIIM_TYPE
;
1112 mii
.fType
= MFT_STRING
;
1113 mii
.dwTypeData
= szFavorite
;
1114 mii
.cch
= sizeof(szFavorite
) / sizeof(szFavorite
[0]);
1116 if (GetMenuItemInfo(hMenu
, LOWORD(wParam
) - ID_FAVORITES_MIN
, TRUE
, &mii
))
1118 ChooseFavorite(szFavorite
);
1133 /********************************************************************************
1135 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
1137 * PURPOSE: Processes messages for the main frame window.
1139 * WM_COMMAND - process the application menu
1140 * WM_DESTROY - post a quit message and return
1144 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1149 CreateWindowEx(0, szChildClass
, NULL
, WS_CHILD
| WS_VISIBLE
,
1150 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
1151 hWnd
, (HMENU
)0, hInst
, 0);
1154 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
1155 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
1159 SetFocus(g_pChildWnd
->hWnd
);
1162 resize_frame_client(hWnd
);
1169 case WM_ENTERMENULOOP
:
1170 OnEnterMenuLoop(hWnd
);
1172 case WM_EXITMENULOOP
:
1173 OnExitMenuLoop(hWnd
);
1176 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
1179 WinHelp(hWnd
, _T("regedit"), HELP_QUIT
, 0);
1182 return DefWindowProc(hWnd
, message
, wParam
, lParam
);