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 LONG regUnloadResult
;
372 /* get the item key to unload */
373 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
374 /* load and set the caption and flags for dialog */
375 LoadString(hInst
, IDS_UNLOAD_HIVE
, Caption
, COUNT_OF(Caption
));
376 /* now unload the hive */
377 regUnloadResult
= RegUnLoadKey(hRootKey
, pszKeyPath
);
378 if(regUnloadResult
== ERROR_SUCCESS
)
380 /* refresh tree and list views */
381 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
382 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
383 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
387 ErrorMessageBox(hWnd
, Caption
, regUnloadResult
);
393 static BOOL
ImportRegistryFile(HWND hWnd
)
396 TCHAR Caption
[128], szTitle
[256], szText
[256];
400 InitOpenFileName(hWnd
, &ofn
);
401 LoadString(hInst
, IDS_IMPORT_REG_FILE
, Caption
, COUNT_OF(Caption
));
402 ofn
.lpstrTitle
= Caption
;
403 ofn
.Flags
|= OFN_ENABLESIZING
;
404 /* ofn.lCustData = ;*/
405 if (GetOpenFileName(&ofn
))
407 FILE *fp
= _wfopen(ofn
.lpstrFile
, L
"r");
408 if (fp
== NULL
|| !import_registry_file(fp
))
410 LPSTR p
= GetMultiByteString(ofn
.lpstrFile
);
411 fprintf(stderr
, "Can't open file \"%s\"\n", p
);
412 HeapFree(GetProcessHeap(), 0, p
);
417 LoadString(hInst
, IDS_APP_TITLE
, szTitle
, sizeof(szTitle
));
418 LoadString(hInst
, IDS_IMPORTED_OK
, szText
, sizeof(szTitle
));
419 /* show successful import */
420 MessageBox(NULL
, szText
, szTitle
, MB_OK
);
425 CheckCommDlgError(hWnd
);
428 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
429 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hRootKey
);
430 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
435 static UINT_PTR CALLBACK
ExportRegistryFile_OFNHookProc(HWND hdlg
, UINT uiMsg
, WPARAM wParam
, LPARAM lParam
)
438 HWND hwndExportBranch
;
439 HWND hwndExportBranchText
;
440 UINT_PTR iResult
= 0;
442 LPTSTR pszSelectedKey
;
443 OFNOTIFY
*pOfnNotify
;
445 UNREFERENCED_PARAMETER(wParam
);
450 pOfn
= (OPENFILENAME
*) lParam
;
451 pszSelectedKey
= (LPTSTR
) pOfn
->lCustData
;
453 hwndExportAll
= GetDlgItem(hdlg
, IDC_EXPORT_ALL
);
455 SendMessage(hwndExportAll
, BM_SETCHECK
, pszSelectedKey
? BST_UNCHECKED
: BST_CHECKED
, 0);
457 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
458 if (hwndExportBranch
)
459 SendMessage(hwndExportBranch
, BM_SETCHECK
, pszSelectedKey
? BST_CHECKED
: BST_UNCHECKED
, 0);
461 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
462 if (hwndExportBranchText
)
463 SetWindowText(hwndExportBranchText
, pszSelectedKey
);
467 if (((NMHDR
*) lParam
)->code
== CDN_FILEOK
)
469 pOfnNotify
= (OFNOTIFY
*) lParam
;
470 pszSelectedKey
= (LPTSTR
) pOfnNotify
->lpOFN
->lCustData
;
472 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
473 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
474 if (hwndExportBranch
&& hwndExportBranchText
475 && (SendMessage(hwndExportBranch
, BM_GETCHECK
, 0, 0) == BST_CHECKED
))
477 GetWindowText(hwndExportBranchText
, pszSelectedKey
, _MAX_PATH
);
481 pszSelectedKey
[0] = '\0';
489 BOOL
ExportRegistryFile(HWND hWnd
)
492 TCHAR ExportKeyPath
[_MAX_PATH
];
497 /* Figure out which key path we are exporting */
498 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
499 GetKeyName(ExportKeyPath
, COUNT_OF(ExportKeyPath
), hKeyRoot
, pszKeyPath
);
501 InitOpenFileName(hWnd
, &ofn
);
502 LoadString(hInst
, IDS_EXPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
503 ofn
.lpstrTitle
= Caption
;
505 /* Only set the path if a key (not the root node) is selected */
508 ofn
.lCustData
= (LPARAM
) ExportKeyPath
;
510 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_EXPLORER
| OFN_ENABLEHOOK
| OFN_OVERWRITEPROMPT
;
511 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
512 ofn
.lpTemplateName
= MAKEINTRESOURCE(IDD_EXPORTRANGE
);
513 if (GetSaveFileName(&ofn
))
518 if (ofn
.nFilterIndex
== 1)
519 format
= REG_FORMAT_5
;
521 format
= REG_FORMAT_4
;
522 result
= export_registry_key(ofn
.lpstrFile
, ExportKeyPath
, format
);
525 LPSTR p
= GetMultiByteString(ofn
.lpstrFile
);
526 fprintf(stderr
, "Can't open file \"%s\"\n", p
);
527 HeapFree(GetProcessHeap(), 0, p
);
533 CheckCommDlgError(hWnd
);
538 BOOL
PrintRegistryHive(HWND hWnd
, LPTSTR path
)
542 UNREFERENCED_PARAMETER(path
);
544 ZeroMemory(&pd
, sizeof(PRINTDLG
));
545 pd
.lStructSize
= sizeof(PRINTDLG
);
547 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
548 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
549 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
551 pd
.nFromPage
= 0xFFFF;
554 pd
.nMaxPage
= 0xFFFF;
557 /* GDI calls to render output. */
558 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
564 hResult
= PrintDlgEx(&pd
);
567 switch (pd
.dwResultAction
)
569 case PD_RESULT_APPLY
:
570 /*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. */
572 case PD_RESULT_CANCEL
:
573 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
575 case PD_RESULT_PRINT
:
576 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
587 /*Insufficient memory. */
590 /* One or more arguments are invalid. */
593 /*Invalid pointer. */
599 /*Unspecified error. */
610 static void ChooseFavorite(LPCTSTR pszFavorite
)
613 TCHAR szFavoritePath
[512];
614 DWORD cbData
, dwType
;
616 if (RegOpenKeyEx(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
619 cbData
= (sizeof(szFavoritePath
) / sizeof(szFavoritePath
[0])) - 1;
620 memset(szFavoritePath
, 0, sizeof(szFavoritePath
));
621 if (RegQueryValueEx(hKey
, pszFavorite
, NULL
, &dwType
, (LPBYTE
) szFavoritePath
, &cbData
) != ERROR_SUCCESS
)
624 if (dwType
== REG_SZ
)
625 SelectNode(g_pChildWnd
->hTreeWnd
, szFavoritePath
);
632 BOOL
CopyKeyName(HWND hWnd
, HKEY hRootKey
, LPCTSTR keyName
)
634 BOOL bClipboardOpened
= FALSE
;
635 BOOL bSuccess
= FALSE
;
640 if (!OpenClipboard(hWnd
))
642 bClipboardOpened
= TRUE
;
644 if (!EmptyClipboard())
647 if (!GetKeyName(szBuffer
, COUNT_OF(szBuffer
), hRootKey
, keyName
))
650 hGlobal
= GlobalAlloc(GMEM_MOVEABLE
, (lstrlen(szBuffer
) + 1) * sizeof(TCHAR
));
654 s
= GlobalLock(hGlobal
);
655 _tcscpy(s
, szBuffer
);
656 GlobalUnlock(hGlobal
);
659 SetClipboardData(CF_UNICODETEXT
, hGlobal
);
661 SetClipboardData(CF_TEXT
, hGlobal
);
666 if (bClipboardOpened
)
671 static BOOL
CreateNewValue(HKEY hRootKey
, LPCTSTR pszKeyPath
, DWORD dwType
)
673 TCHAR szNewValueFormat
[128];
674 TCHAR szNewValue
[128];
677 DWORD dwExistingType
, cbData
;
682 if (RegOpenKeyEx(hRootKey
, pszKeyPath
, 0, KEY_QUERY_VALUE
| KEY_SET_VALUE
,
683 &hKey
) != ERROR_SUCCESS
)
686 LoadString(hInst
, IDS_NEW_VALUE
, szNewValueFormat
, COUNT_OF(szNewValueFormat
));
690 wsprintf(szNewValue
, szNewValueFormat
, iIndex
++);
691 cbData
= sizeof(data
);
692 lResult
= RegQueryValueEx(hKey
, szNewValue
, NULL
, &dwExistingType
, data
, &cbData
);
694 while(lResult
== ERROR_SUCCESS
);
699 cbData
= sizeof(DWORD
);
703 cbData
= sizeof(TCHAR
);
706 cbData
= sizeof(TCHAR
) * 2;
709 cbData
= sizeof(DWORD
) * 2;
715 memset(data
, 0, cbData
);
716 lResult
= RegSetValueEx(hKey
, szNewValue
, 0, dwType
, data
, cbData
);
718 if (lResult
!= ERROR_SUCCESS
)
723 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
725 /* locate the newly added value, and get ready to rename it */
726 memset(&lvfi
, 0, sizeof(lvfi
));
727 lvfi
.flags
= LVFI_STRING
;
728 lvfi
.psz
= szNewValue
;
729 iIndex
= ListView_FindItem(g_pChildWnd
->hListWnd
, -1, &lvfi
);
731 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, iIndex
);
737 InitializeRemoteRegistryPicker(OUT IDsObjectPicker
**pDsObjectPicker
)
741 *pDsObjectPicker
= NULL
;
743 hRet
= CoCreateInstance(&CLSID_DsObjectPicker
,
745 CLSCTX_INPROC_SERVER
,
746 &IID_IDsObjectPicker
,
747 (LPVOID
*)pDsObjectPicker
);
750 DSOP_INIT_INFO InitInfo
;
751 static DSOP_SCOPE_INIT_INFO Scopes
[] =
754 sizeof(DSOP_SCOPE_INIT_INFO
),
755 DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE
| DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE
|
756 DSOP_SCOPE_TYPE_GLOBAL_CATALOG
| DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN
|
757 DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN
| DSOP_SCOPE_TYPE_WORKGROUP
|
758 DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
| DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN
,
762 DSOP_FILTER_COMPUTERS
,
766 DSOP_DOWNLEVEL_FILTER_COMPUTERS
774 InitInfo
.cbSize
= sizeof(InitInfo
);
775 InitInfo
.pwzTargetComputer
= NULL
;
776 InitInfo
.cDsScopeInfos
= sizeof(Scopes
) / sizeof(Scopes
[0]);
777 InitInfo
.aDsScopeInfos
= Scopes
;
778 InitInfo
.flOptions
= 0;
779 InitInfo
.cAttributesToFetch
= 0;
780 InitInfo
.apwzAttributeNames
= NULL
;
782 hRet
= (*pDsObjectPicker
)->lpVtbl
->Initialize(*pDsObjectPicker
,
787 /* delete the object picker in case initialization failed! */
788 (*pDsObjectPicker
)->lpVtbl
->Release(*pDsObjectPicker
);
796 InvokeRemoteRegistryPickerDialog(IN IDsObjectPicker
*pDsObjectPicker
,
797 IN HWND hwndParent OPTIONAL
,
801 IDataObject
*pdo
= NULL
;
804 hRet
= pDsObjectPicker
->lpVtbl
->InvokeDialog(pDsObjectPicker
,
812 fe
.cfFormat
= (CLIPFORMAT
) RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST
);
814 fe
.dwAspect
= DVASPECT_CONTENT
;
816 fe
.tymed
= TYMED_HGLOBAL
;
818 hRet
= pdo
->lpVtbl
->GetData(pdo
,
823 PDS_SELECTION_LIST SelectionList
= (PDS_SELECTION_LIST
)GlobalLock(stm
.hGlobal
);
824 if (SelectionList
!= NULL
)
826 if (SelectionList
->cItems
== 1)
828 size_t nlen
= wcslen(SelectionList
->aDsSelection
[0].pwzName
);
835 SelectionList
->aDsSelection
[0].pwzName
,
836 nlen
* sizeof(WCHAR
));
838 WideCharToMultiByte(CP_ACP
,
840 SelectionList
->aDsSelection
[0].pwzName
,
847 lpBuffer
[nlen
] = L
'\0';
850 GlobalUnlock(stm
.hGlobal
);
853 ReleaseStgMedium(&stm
);
856 pdo
->lpVtbl
->Release(pdo
);
863 FreeObjectPicker(IN IDsObjectPicker
*pDsObjectPicker
)
865 pDsObjectPicker
->lpVtbl
->Release(pDsObjectPicker
);
868 /*******************************************************************************
870 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
872 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
875 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
877 HKEY hKeyRoot
= 0, hKey
= 0;
881 REGSAM regsam
= KEY_READ
;
885 UNREFERENCED_PARAMETER(lParam
);
886 UNREFERENCED_PARAMETER(message
);
888 switch (LOWORD(wParam
))
890 case ID_REGISTRY_LOADHIVE
:
893 case ID_REGISTRY_UNLOADHIVE
:
896 case ID_REGISTRY_IMPORTREGISTRYFILE
:
897 ImportRegistryFile(hWnd
);
899 case ID_REGISTRY_EXPORTREGISTRYFILE
:
900 ExportRegistryFile(hWnd
);
902 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
904 IDsObjectPicker
*ObjectPicker
;
905 TCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
908 hRet
= CoInitialize(NULL
);
911 hRet
= InitializeRemoteRegistryPicker(&ObjectPicker
);
914 hRet
= InvokeRemoteRegistryPickerDialog(ObjectPicker
,
917 sizeof(szComputerName
) / sizeof(szComputerName
[0]));
920 /* FIXME - connect to the registry */
923 FreeObjectPicker(ObjectPicker
);
931 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
933 case ID_REGISTRY_PRINT
:
934 PrintRegistryHive(hWnd
, _T(""));
936 case ID_REGISTRY_EXIT
:
939 case ID_VIEW_STATUSBAR
:
940 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
942 case ID_HELP_HELPTOPICS
:
943 WinHelp(hWnd
, _T("regedit"), HELP_FINDER
, 0);
952 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
953 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
954 pt
.y
= (rt
.bottom
/ 2);
956 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
))
958 SetCursorPos(pts
.x
, pts
.y
);
959 SetCursor(LoadCursor(0, IDC_SIZEWE
));
960 SendMessage(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
966 case ID_EDIT_MODIFY_BIN
:
972 keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
973 valueName
= GetValueName(g_pChildWnd
->hListWnd
, -1);
976 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, regsam
, &hKey
);
977 if (lRet
!= ERROR_SUCCESS
) hKey
= 0;
980 switch (LOWORD(wParam
))
983 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, FALSE
))
984 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
986 case ID_EDIT_MODIFY_BIN
:
987 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, TRUE
))
988 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
991 if (GetFocus() == g_pChildWnd
->hListWnd
)
993 if(ListView_GetSelectedCount(g_pChildWnd
->hListWnd
) == 1)
995 item
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
998 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, item
);
1002 else if (GetFocus() == g_pChildWnd
->hTreeWnd
)
1004 /* Get focused entry of treeview (if any) */
1005 HTREEITEM hItem
= TreeView_GetSelection(g_pChildWnd
->hTreeWnd
);
1007 (void)TreeView_EditLabel(g_pChildWnd
->hTreeWnd
, hItem
);
1010 case ID_EDIT_DELETE
:
1012 if (GetFocus() == g_pChildWnd
->hListWnd
)
1014 UINT nSelected
= ListView_GetSelectedCount(g_pChildWnd
->hListWnd
);
1017 TCHAR msg
[128], caption
[128];
1018 LoadString(hInst
, IDS_QUERY_DELETE_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
1019 LoadString(hInst
, (nSelected
== 1 ? IDS_QUERY_DELETE_ONE
: IDS_QUERY_DELETE_MORE
), msg
, sizeof(msg
)/sizeof(TCHAR
));
1020 if(MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) == IDYES
)
1026 while((ni
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, item
, LVNI_SELECTED
)) > -1)
1028 valueName
= GetValueName(g_pChildWnd
->hListWnd
, item
);
1029 if(RegDeleteValue(hKey
, valueName
) != ERROR_SUCCESS
)
1036 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
1039 LoadString(hInst
, IDS_ERR_DELVAL_CAPTION
, caption
, sizeof(caption
)/sizeof(TCHAR
));
1040 LoadString(hInst
, IDS_ERR_DELETEVALUE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
1041 MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONSTOP
);
1046 else if (GetFocus() == g_pChildWnd
->hTreeWnd
)
1048 if (keyPath
== 0 || *keyPath
== 0)
1050 MessageBeep(MB_ICONHAND
);
1052 else if (DeleteKey(hWnd
, hKeyRoot
, keyPath
))
1054 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
1055 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
1060 case ID_EDIT_NEW_STRINGVALUE
:
1061 CreateNewValue(hKeyRoot
, keyPath
, REG_SZ
);
1063 case ID_EDIT_NEW_BINARYVALUE
:
1064 CreateNewValue(hKeyRoot
, keyPath
, REG_BINARY
);
1066 case ID_EDIT_NEW_DWORDVALUE
:
1067 CreateNewValue(hKeyRoot
, keyPath
, REG_DWORD
);
1069 case ID_EDIT_NEW_MULTISTRINGVALUE
:
1070 CreateNewValue(hKeyRoot
, keyPath
, REG_MULTI_SZ
);
1072 case ID_EDIT_NEW_EXPANDABLESTRINGVALUE
:
1073 CreateNewValue(hKeyRoot
, keyPath
, REG_EXPAND_SZ
);
1078 case ID_EDIT_FINDNEXT
:
1081 case ID_EDIT_COPYKEYNAME
:
1082 CopyKeyName(hWnd
, hKeyRoot
, keyPath
);
1084 case ID_EDIT_PERMISSIONS
:
1085 RegKeyEditPermissions(hWnd
, hKeyRoot
, NULL
, keyPath
);
1087 case ID_REGISTRY_PRINTERSETUP
:
1090 /*PAGESETUPDLG psd;*/
1091 /*PageSetupDlg(&psd);*/
1093 case ID_REGISTRY_OPENLOCAL
:
1096 case ID_VIEW_REFRESH
:
1097 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
1098 /*RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); */
1100 /*case ID_OPTIONS_TOOLBAR:*/
1101 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
1103 case ID_EDIT_NEW_KEY
:
1104 CreateNewKey(g_pChildWnd
->hTreeWnd
, TreeView_GetSelection(g_pChildWnd
->hTreeWnd
));
1107 if ((LOWORD(wParam
) >= ID_FAVORITES_MIN
) && (LOWORD(wParam
) <= ID_FAVORITES_MAX
))
1111 TCHAR szFavorite
[512];
1113 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
1115 memset(&mii
, 0, sizeof(mii
));
1116 mii
.cbSize
= sizeof(mii
);
1117 mii
.fMask
= MIIM_TYPE
;
1118 mii
.fType
= MFT_STRING
;
1119 mii
.dwTypeData
= szFavorite
;
1120 mii
.cch
= sizeof(szFavorite
) / sizeof(szFavorite
[0]);
1122 if (GetMenuItemInfo(hMenu
, LOWORD(wParam
) - ID_FAVORITES_MIN
, TRUE
, &mii
))
1124 ChooseFavorite(szFavorite
);
1139 /********************************************************************************
1141 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
1143 * PURPOSE: Processes messages for the main frame window.
1145 * WM_COMMAND - process the application menu
1146 * WM_DESTROY - post a quit message and return
1150 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1155 CreateWindowEx(0, szChildClass
, NULL
, WS_CHILD
| WS_VISIBLE
,
1156 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
1157 hWnd
, (HMENU
)0, hInst
, 0);
1160 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
1161 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
1165 SetFocus(g_pChildWnd
->hWnd
);
1168 resize_frame_client(hWnd
);
1175 case WM_ENTERMENULOOP
:
1176 OnEnterMenuLoop(hWnd
);
1178 case WM_EXITMENULOOP
:
1179 OnExitMenuLoop(hWnd
);
1182 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
1184 case WM_SYSCOLORCHANGE
:
1185 /* Forward WM_SYSCOLORCHANGE to common controls */
1186 SendMessage(g_pChildWnd
->hListWnd
, WM_SYSCOLORCHANGE
, 0, 0);
1187 SendMessage(g_pChildWnd
->hTreeWnd
, WM_SYSCOLORCHANGE
, 0, 0);
1190 WinHelp(hWnd
, _T("regedit"), HELP_QUIT
, 0);
1193 return DefWindowProc(hWnd
, message
, wParam
, lParam
);