diff --git a/reactos/dll/win32/shell32/classes.c b/reactos/dll/win32/shell32/classes.c
index 7d0332aa0f0..9b85d4efa2e 100644
--- a/reactos/dll/win32/shell32/classes.c
+++ b/reactos/dll/win32/shell32/classes.c
@@ -386,6 +386,11 @@ BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
if(LoadStringW(shell32_hInstance, IDS_CONTROLPANEL, szDest, buflen))
ret = TRUE;
}
+ else if (IsEqualIID(riid, &CLSID_AdminFolderShortcut))
+ {
+ if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen))
+ ret = TRUE;
+ }
}
TRACE("-- %s\n", debugstr_w(szDest));
diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc
index 66a6d758282..3345a8a63f9 100644
--- a/reactos/dll/win32/shell32/lang/bg-BG.rc
+++ b/reactos/dll/win32/shell32/lang/bg-BG.rc
@@ -613,6 +613,7 @@ BEGIN
IDS_MYCOMPUTER " "
IDS_RECYCLEBIN_FOLDER_NAME ""
IDS_CONTROLPANEL " "
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
// context menus
IDS_VIEW_LARGE "& "
diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc
index 19df4c6e730..832775a43c0 100644
--- a/reactos/dll/win32/shell32/lang/ca-ES.rc
+++ b/reactos/dll/win32/shell32/lang/ca-ES.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc
index 0154a4333c0..9a7ed02db61 100644
--- a/reactos/dll/win32/shell32/lang/cs-CZ.rc
+++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc
@@ -612,6 +612,7 @@ BEGIN
IDS_MYCOMPUTER "Tento pota"
IDS_RECYCLEBIN_FOLDER_NAME "Ko"
IDS_CONTROLPANEL "Ovldac panely"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "&Vedle sebe"
diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc
index 72859695f09..c2fd211c356 100644
--- a/reactos/dll/win32/shell32/lang/da-DK.rc
+++ b/reactos/dll/win32/shell32/lang/da-DK.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc
index 2cf24a9c6a1..9027cc248c2 100644
--- a/reactos/dll/win32/shell32/lang/de-DE.rc
+++ b/reactos/dll/win32/shell32/lang/de-DE.rc
@@ -613,6 +613,7 @@ BEGIN
IDS_MYCOMPUTER "Arbeitsplatz"
IDS_RECYCLEBIN_FOLDER_NAME "Papierkorb"
IDS_CONTROLPANEL "Systemsteuerung"
+ IDS_ADMINISTRATIVETOOLS "Verwaltung"
/* context menus */
IDS_VIEW_LARGE "&Groe Symbole"
diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc
index d08a7e35fd2..c8e03be7d76 100644
--- a/reactos/dll/win32/shell32/lang/el-GR.rc
+++ b/reactos/dll/win32/shell32/lang/el-GR.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER " "
IDS_RECYCLEBIN_FOLDER_NAME " "
IDS_CONTROLPANEL " "
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "& "
diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc
index 7d58457488f..6a68804f03d 100644
--- a/reactos/dll/win32/shell32/lang/en-GB.rc
+++ b/reactos/dll/win32/shell32/lang/en-GB.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Recycle Bin"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc
index 94085ca31ff..7f8087edf90 100644
--- a/reactos/dll/win32/shell32/lang/en-US.rc
+++ b/reactos/dll/win32/shell32/lang/en-US.rc
@@ -611,6 +611,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc
index 061003bcb35..a2c1b86d3d8 100644
--- a/reactos/dll/win32/shell32/lang/es-ES.rc
+++ b/reactos/dll/win32/shell32/lang/es-ES.rc
@@ -612,6 +612,7 @@ BEGIN
IDS_MYCOMPUTER "Mi PC"
IDS_RECYCLEBIN_FOLDER_NAME "Papelera de reciclaje"
IDS_CONTROLPANEL "Panel de control"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Iconos &grandes"
diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc
index 43d4b14b282..1f9677c07af 100644
--- a/reactos/dll/win32/shell32/lang/fi-FI.rc
+++ b/reactos/dll/win32/shell32/lang/fi-FI.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "Oma Tietokone"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "&Suuret Kuvakkeet"
diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc
index c0d4dbd4f10..7c282cc32a2 100644
--- a/reactos/dll/win32/shell32/lang/fr-FR.rc
+++ b/reactos/dll/win32/shell32/lang/fr-FR.rc
@@ -614,6 +614,7 @@ BEGIN
IDS_MYCOMPUTER "Poste de travail"
IDS_RECYCLEBIN_FOLDER_NAME "Corbeille"
IDS_CONTROLPANEL "Panneau de configuration"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "&Grandes icnes"
diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc
index 7e461cd6b25..72ceea503a7 100644
--- a/reactos/dll/win32/shell32/lang/hu-HU.rc
+++ b/reactos/dll/win32/shell32/lang/hu-HU.rc
@@ -613,6 +613,7 @@ BEGIN
IDS_MYCOMPUTER "Szmtgp"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Nagy kpek"
diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc
index 3c670f08fe7..aa6f62c945b 100644
--- a/reactos/dll/win32/shell32/lang/it-IT.rc
+++ b/reactos/dll/win32/shell32/lang/it-IT.rc
@@ -611,6 +611,7 @@ BEGIN
IDS_MYCOMPUTER "Risorse del Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Cestino"
IDS_CONTROLPANEL "Pannello di controllo"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "&Icone Grandi"
diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc
index 7b4ae867026..7ec722b9ec7 100644
--- a/reactos/dll/win32/shell32/lang/ja-JP.rc
+++ b/reactos/dll/win32/shell32/lang/ja-JP.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "}C Rs[^"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "傫ACR(&G)"
diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc
index 5be19887818..cfcdde67acb 100644
--- a/reactos/dll/win32/shell32/lang/ko-KR.rc
+++ b/reactos/dll/win32/shell32/lang/ko-KR.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc
index 01649ac2d46..260be8d3ac9 100644
--- a/reactos/dll/win32/shell32/lang/nl-NL.rc
+++ b/reactos/dll/win32/shell32/lang/nl-NL.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc
index fe696946354..0461f468880 100644
--- a/reactos/dll/win32/shell32/lang/no-NO.rc
+++ b/reactos/dll/win32/shell32/lang/no-NO.rc
@@ -589,6 +589,7 @@ BEGIN
IDS_MYCOMPUTER "Min datamaskin"
IDS_RECYCLEBIN_FOLDER_NAME "Papirkurv"
IDS_CONTROLPANEL "Kontrollpanel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "&Store ikoner"
diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc
index 38ab73e9bdc..d9a19d857da 100644
--- a/reactos/dll/win32/shell32/lang/pl-PL.rc
+++ b/reactos/dll/win32/shell32/lang/pl-PL.rc
@@ -616,6 +616,7 @@ BEGIN
IDS_MYCOMPUTER "Mj komputer"
IDS_RECYCLEBIN_FOLDER_NAME "Kosz"
IDS_CONTROLPANEL "Panel Sterowania"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "&Due Ikony"
diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc
index 4ae9493f992..c4d23bc4b8a 100644
--- a/reactos/dll/win32/shell32/lang/pt-BR.rc
+++ b/reactos/dll/win32/shell32/lang/pt-BR.rc
@@ -612,6 +612,7 @@ BEGIN
IDS_MYCOMPUTER "Meu computador"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "cones &grandes"
diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc
index 3b2ce37ba7c..97c961207fd 100644
--- a/reactos/dll/win32/shell32/lang/pt-PT.rc
+++ b/reactos/dll/win32/shell32/lang/pt-PT.rc
@@ -612,6 +612,7 @@ BEGIN
IDS_MYCOMPUTER "O Meu Computador"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "cones &grandes"
diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc
index 5484bda8a42..b8ee36e5b5e 100644
--- a/reactos/dll/win32/shell32/lang/ru-RU.rc
+++ b/reactos/dll/win32/shell32/lang/ru-RU.rc
@@ -609,6 +609,7 @@ BEGIN
IDS_MYCOMPUTER " "
IDS_RECYCLEBIN_FOLDER_NAME ""
IDS_CONTROLPANEL " "
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "& "
diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc
index 8e269daaa8f..0c9e77ba696 100644
--- a/reactos/dll/win32/shell32/lang/sk-SK.rc
+++ b/reactos/dll/win32/shell32/lang/sk-SK.rc
@@ -616,6 +616,7 @@ BEGIN
IDS_MYCOMPUTER "Tento pota"
IDS_RECYCLEBIN_FOLDER_NAME "K"
IDS_CONTROLPANEL "Ovldac panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "&Vek ikony"
diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc
index 34669dde1d3..e3bb38cc1f0 100644
--- a/reactos/dll/win32/shell32/lang/sl-SI.rc
+++ b/reactos/dll/win32/shell32/lang/sl-SI.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc
index c7c8507b8cf..4fa86925d83 100644
--- a/reactos/dll/win32/shell32/lang/sv-SE.rc
+++ b/reactos/dll/win32/shell32/lang/sv-SE.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc
index 1b7c826c39b..911e56d86c5 100644
--- a/reactos/dll/win32/shell32/lang/tr-TR.rc
+++ b/reactos/dll/win32/shell32/lang/tr-TR.rc
@@ -610,6 +610,7 @@ BEGIN
IDS_MYCOMPUTER "Bilgisayarm"
IDS_RECYCLEBIN_FOLDER_NAME "p"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "B&yk Simgeler"
diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc
index 54ce9eec179..389d3e1d9a6 100644
--- a/reactos/dll/win32/shell32/lang/uk-UA.rc
+++ b/reactos/dll/win32/shell32/lang/uk-UA.rc
@@ -611,6 +611,7 @@ BEGIN
IDS_MYCOMPUTER "̳ '"
IDS_RECYCLEBIN_FOLDER_NAME ""
IDS_CONTROLPANEL " "
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "& "
diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc
index f7b85c316f3..2f6ccddf09e 100644
--- a/reactos/dll/win32/shell32/lang/zh-CN.rc
+++ b/reactos/dll/win32/shell32/lang/zh-CN.rc
@@ -599,6 +599,7 @@ BEGIN
IDS_MYCOMPUTER "ҵĵ"
IDS_RECYCLEBIN_FOLDER_NAME "վ"
IDS_CONTROLPANEL ""
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "ͼ(&G)"
diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc
index b100a443a6f..ef4b1b53d1b 100644
--- a/reactos/dll/win32/shell32/lang/zh-TW.rc
+++ b/reactos/dll/win32/shell32/lang/zh-TW.rc
@@ -611,6 +611,7 @@ BEGIN
IDS_MYCOMPUTER "My Computer"
IDS_RECYCLEBIN_FOLDER_NAME "Trash"
IDS_CONTROLPANEL "Control Panel"
+ IDS_ADMINISTRATIVETOOLS "Administrative Tools"
/* context menus */
IDS_VIEW_LARGE "Lar&ge Icons"
diff --git a/reactos/dll/win32/shell32/pidl.c b/reactos/dll/win32/shell32/pidl.c
index 1b44e614db9..452e85695e7 100644
--- a/reactos/dll/win32/shell32/pidl.c
+++ b/reactos/dll/win32/shell32/pidl.c
@@ -1402,6 +1402,12 @@ LPITEMIDLIST _ILCreateBitBucket(void)
return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin);
}
+LPITEMIDLIST _ILCreateAdminTools(void)
+{
+ TRACE("()\n");
+ return _ILCreateGuid(PT_GUID, &CLSID_AdminFolderShortcut);
+}
+
LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
{
LPITEMIDLIST pidlOut;
@@ -1657,6 +1663,18 @@ BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
return FALSE;
}
+BOOL _ILIsAdminTools(LPCITEMIDLIST pidl)
+{
+ REFIID iid = _ILGetGUIDPointer(pidl);
+
+ TRACE("(%p)\n",pidl);
+
+ if (iid)
+ return IsEqualIID(iid, &CLSID_AdminFolderShortcut);
+ else
+ return FALSE;
+}
+
BOOL _ILIsSpecialFolder (LPCITEMIDLIST pidl)
{
LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
diff --git a/reactos/dll/win32/shell32/pidl.h b/reactos/dll/win32/shell32/pidl.h
index 858432e143c..eee285e16a5 100644
--- a/reactos/dll/win32/shell32/pidl.h
+++ b/reactos/dll/win32/shell32/pidl.h
@@ -236,6 +236,7 @@ BOOL _ILIsMyComputer (LPCITEMIDLIST pidl);
BOOL _ILIsMyDocuments (LPCITEMIDLIST pidl);
BOOL _ILIsControlPanel (LPCITEMIDLIST pidl);
BOOL _ILIsBitBucket (LPCITEMIDLIST pidl);
+BOOL _ILIsAdminTools (LPCITEMIDLIST pidl);
BOOL _ILIsNetHood (LPCITEMIDLIST pidl);
BOOL _ILIsDrive (LPCITEMIDLIST pidl);
BOOL _ILIsFolder (LPCITEMIDLIST pidl);
@@ -285,6 +286,7 @@ LPITEMIDLIST _ILCreateControlPanel (void);
LPITEMIDLIST _ILCreatePrinters (void);
LPITEMIDLIST _ILCreateNetwork (void);
LPITEMIDLIST _ILCreateNetHood (void);
+LPITEMIDLIST _ILCreateAdminTools (void);
LPITEMIDLIST _ILCreateFont (void);
LPITEMIDLIST _ILCreateBitBucket (void);
LPITEMIDLIST _ILCreateDrive (LPCWSTR);
diff --git a/reactos/dll/win32/shell32/regsvr.c b/reactos/dll/win32/shell32/regsvr.c
index c0e98656849..c127059a5ec 100644
--- a/reactos/dll/win32/shell32/regsvr.c
+++ b/reactos/dll/win32/shell32/regsvr.c
@@ -646,6 +646,19 @@ static struct regsvr_coclass const coclass_list[] = {
NULL,
IDI_SHELL_FONTS_FOLDER
},
+ { &CLSID_AdminFolderShortcut,
+ "Administrative Tools",
+ IDS_ADMINISTRATIVETOOLS,
+ NULL,
+ "shell32.dll",
+ "Apartment",
+ SHELLFOLDER_ATTRIBUTES,
+ SFGAO_FOLDER,
+ 0,
+ NULL,
+ NULL,
+ IDI_SHELL_ADMINTOOLS //FIXME
+ },
{ &CLSID_Shortcut,
"Shortcut",
0,
@@ -758,7 +771,7 @@ static const WCHAR wszFolderOptions[] = { 'F','o','l','d','e','r',' ','O','p','t
static const WCHAR wszNethoodFolder[] = { 'N','e','t','h','o','o','d',' ','f','o','l','d','e','r',0};
static const WCHAR wszPrinters[] = { 'P','r','i','n','t','e','r','s',0 };
static const WCHAR wszFonts[] = { 'F','o','n','t','s',0 };
-
+static const WCHAR wszAdminTools[] = { 'A','d','m','i','n','T','o','o','l','s',0 };
const GUID CLSID_FolderOptions = { 0x6DFD7C5C, 0x2451, 0x11d3, {0xa2,0x99,0x00,0xC0,0x4F,0x8e,0xf6,0xaf} };
static struct regsvr_namespace const namespace_extensions_list[] = {
@@ -804,6 +817,11 @@ static struct regsvr_namespace const namespace_extensions_list[] = {
wszControlPanel,
wszPrinters
},
+ {
+ &CLSID_AdminFolderShortcut,
+ wszControlPanel,
+ wszAdminTools
+ },
{ NULL }
};
diff --git a/reactos/dll/win32/shell32/shell32.rbuild b/reactos/dll/win32/shell32/shell32.rbuild
index b3de9c6068e..991848772af 100644
--- a/reactos/dll/win32/shell32/shell32.rbuild
+++ b/reactos/dll/win32/shell32/shell32.rbuild
@@ -57,6 +57,7 @@
shfldr_mycomp.c
shfldr_mydocuments.c
shfldr_printers.c
+ shfldr_admintools.c
shlexec.c
shlfileop.c
shlfolder.c
diff --git a/reactos/dll/win32/shell32/shell32_main.h b/reactos/dll/win32/shell32/shell32_main.h
index 0ea0a394020..ec01b3b5a69 100644
--- a/reactos/dll/win32/shell32/shell32_main.h
+++ b/reactos/dll/win32/shell32/shell32_main.h
@@ -96,6 +96,7 @@ HRESULT WINAPI ISF_Printers_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOI
HRESULT WINAPI ISF_MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI ISF_NetworkPlaces_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI ISF_Fonts_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
+HRESULT WINAPI ISF_AdminTools_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI IDropTargetHelper_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV);
HRESULT WINAPI IControlPanel_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
diff --git a/reactos/dll/win32/shell32/shellole.c b/reactos/dll/win32/shell32/shellole.c
index 389de77f1a2..c4e7de7f977 100644
--- a/reactos/dll/win32/shell32/shellole.c
+++ b/reactos/dll/win32/shell32/shellole.c
@@ -78,6 +78,7 @@ static const struct {
{&CLSID_NetworkPlaces, &ISF_NetworkPlaces_Constructor},
{&CLSID_FontsFolderShortcut, &ISF_Fonts_Constructor},
{&CLSID_Printers, &ISF_Printers_Constructor},
+ {&CLSID_AdminFolderShortcut, &ISF_AdminTools_Constructor},
{&CLSID_RecycleBin, &RecycleBin_Constructor},
{&CLSID_OpenWith, &SHEOW_Constructor},
{&dummy1, &INewItem_Constructor},
diff --git a/reactos/dll/win32/shell32/shfldr_admintools.c b/reactos/dll/win32/shell32/shfldr_admintools.c
new file mode 100644
index 00000000000..bc67dd2b020
--- /dev/null
+++ b/reactos/dll/win32/shell32/shfldr_admintools.c
@@ -0,0 +1,780 @@
+/*
+ * Virtual Admin Tools Folder
+ *
+ * Copyright 2008 Johannes Anderwald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include
+#include
+#include
+#include
+
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include "winerror.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winspool.h"
+
+#include "ole2.h"
+#include "shlguid.h"
+
+#include "enumidlist.h"
+#include "pidl.h"
+#include "undocshell.h"
+#include "shell32_main.h"
+#include "shresdef.h"
+#include "shlwapi.h"
+#include "shellfolder.h"
+#include "wine/debug.h"
+#include "debughlp.h"
+#include "shfldr.h"
+#include "shresdef.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL (shell);
+
+/* List shortcuts of
+ * CSIDL_COMMON_ADMINTOOLS
+ * Note: CSIDL_ADMINTOOLS is ignored, tested with Window XP SP3+
+ */
+
+/***********************************************************************
+ * AdminTools folder implementation
+ */
+
+typedef struct {
+ IShellFolder2Vtbl *lpVtbl;
+ IPersistFolder2Vtbl *lpVtblPersistFolder2;
+
+ LONG ref;
+
+ CLSID *pclsid;
+
+ LPITEMIDLIST pidlRoot; /* absolute pidl */
+ LPWSTR szTarget;
+
+ int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */
+} IGenericSFImpl;
+
+static const shvheader AdminToolsSFHeader[] = {
+ {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
+ {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
+ {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
+ {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}
+};
+
+#define COLUMN_NAME 0
+#define COLUMN_SIZE 1
+#define COLUMN_TYPE 2
+#define COLUMN_DATE 3
+
+#define AdminToolsHELLVIEWCOLUMNS (4)
+
+
+#define _IPersistFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpVtblPersistFolder2)))
+#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset);
+
+#define _IUnknown_(This) (IShellFolder*)&(This->lpVtbl)
+#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl)
+
+#define _IPersist_(This) (IPersist*)&(This->lpVtblPersistFolder2)
+#define _IPersistFolder_(This) (IPersistFolder*)&(This->lpVtblPersistFolder2)
+#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpVtblPersistFolder2)
+
+/**************************************************************************
+ * ISF_AdminTools_fnQueryInterface
+ *
+ * NOTE does not support IPersist/IPersistFolder
+ */
+static HRESULT WINAPI ISF_AdminTools_fnQueryInterface(
+ IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj);
+
+ *ppvObj = NULL;
+
+ if (IsEqualIID (riid, &IID_IUnknown) ||
+ IsEqualIID (riid, &IID_IShellFolder) ||
+ IsEqualIID (riid, &IID_IShellFolder2))
+ {
+ *ppvObj = This;
+ }
+
+ else if (IsEqualIID (riid, &IID_IPersist) ||
+ IsEqualIID (riid, &IID_IPersistFolder) ||
+ IsEqualIID (riid, &IID_IPersistFolder2))
+ {
+ *ppvObj = _IPersistFolder2_ (This);
+ }
+
+ if (*ppvObj)
+ {
+ IUnknown_AddRef ((IUnknown *) (*ppvObj));
+ TRACE ("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj);
+ return S_OK;
+ }
+ TRACE ("-- Interface: E_NOINTERFACE\n");
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ISF_AdminTools_fnAddRef (IShellFolder2 * iface)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ ULONG refCount = InterlockedIncrement(&This->ref);
+
+ TRACE ("(%p)->(count=%lu)\n", This, refCount - 1);
+
+ return refCount;
+}
+
+static ULONG WINAPI ISF_AdminTools_fnRelease (IShellFolder2 * iface)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ ULONG refCount = InterlockedDecrement(&This->ref);
+
+ TRACE ("(%p)->(count=%lu)\n", This, refCount + 1);
+
+ if (!refCount)
+ {
+ TRACE ("-- destroying IShellFolder(%p)\n", This);
+ if (This->pidlRoot)
+ SHFree (This->pidlRoot);
+ LocalFree ((HLOCAL) This);
+ return 0;
+ }
+ return refCount;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnParseDisplayName
+ *
+ */
+static HRESULT WINAPI ISF_AdminTools_fnParseDisplayName (IShellFolder2 * iface,
+ HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
+ DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
+ This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
+ pchEaten, ppidl, pdwAttributes);
+
+ *ppidl = 0;
+ if (pchEaten)
+ *pchEaten = 0;
+
+ return E_NOTIMPL;
+}
+
+/**************************************************************************
+ * CreateAdminToolsEnumList()
+ */
+static BOOL CreateAdminToolsEnumList(IEnumIDList *list, IGenericSFImpl *This, DWORD dwFlags)
+{
+ TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags);
+ /* enumerate the elements in %windir%\desktop */
+ return CreateFolderEnumList(list, This->szTarget, dwFlags);
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnEnumObjects
+ */
+static HRESULT WINAPI ISF_AdminTools_fnEnumObjects (IShellFolder2 * iface,
+ HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n",
+ This, hwndOwner, dwFlags, ppEnumIDList);
+
+ if(!ppEnumIDList) return E_OUTOFMEMORY;
+ *ppEnumIDList = IEnumIDList_Constructor();
+ if (*ppEnumIDList)
+ CreateAdminToolsEnumList(*ppEnumIDList, This, dwFlags);
+
+ TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
+
+ return (*ppEnumIDList) ? S_OK : E_OUTOFMEMORY;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnBindToObject
+ */
+static HRESULT WINAPI ISF_AdminTools_fnBindToObject (IShellFolder2 * iface,
+ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This,
+ pidl, pbcReserved, shdebugstr_guid (riid), ppvOut);
+
+ return SHELL32_BindToChild (This->pidlRoot, NULL, pidl, riid, ppvOut);
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnBindToStorage
+ */
+static HRESULT WINAPI ISF_AdminTools_fnBindToStorage (IShellFolder2 * iface,
+ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
+ This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut);
+
+ *ppvOut = NULL;
+ return E_NOTIMPL;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnCompareIDs
+ */
+static HRESULT WINAPI ISF_AdminTools_fnCompareIDs (IShellFolder2 * iface,
+ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ int nReturn;
+
+ TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2);
+ nReturn = SHELL32_CompareIDs (_IShellFolder_ (This), lParam, pidl1, pidl2);
+ TRACE ("-- %i\n", nReturn);
+ return nReturn;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnCreateViewObject
+ */
+static HRESULT WINAPI ISF_AdminTools_fnCreateViewObject (IShellFolder2 * iface,
+ HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
+{
+
+ LPSHELLVIEW pShellView;
+ HRESULT hr = E_INVALIDARG;
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This,
+ hwndOwner, shdebugstr_guid (riid), ppvOut);
+
+ if (!ppvOut)
+ return hr;
+
+ *ppvOut = NULL;
+
+ if (IsEqualIID (riid, &IID_IDropTarget))
+ {
+ WARN ("IDropTarget not implemented\n");
+ hr = E_NOTIMPL;
+ }
+ else if (IsEqualIID (riid, &IID_IShellView))
+ {
+ pShellView = IShellView_Constructor ((IShellFolder *) iface);
+ if (pShellView)
+ {
+ hr = IShellView_QueryInterface (pShellView, riid, ppvOut);
+ IShellView_Release (pShellView);
+ }
+ }
+ TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut);
+ return hr;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnGetAttributesOf
+ */
+static HRESULT WINAPI ISF_AdminTools_fnGetAttributesOf (IShellFolder2 * iface,
+ UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ HRESULT hr = S_OK;
+ static const DWORD dwAdminToolsAttributes =
+ SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR |
+ SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM;
+
+ TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
+ This, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
+
+ if (!rgfInOut)
+ return E_INVALIDARG;
+ if (cidl && !apidl)
+ return E_INVALIDARG;
+
+ if (*rgfInOut == 0)
+ *rgfInOut = ~0;
+
+ if(cidl == 0) {
+ *rgfInOut &= dwAdminToolsAttributes;
+ } else {
+ while (cidl > 0 && *apidl) {
+ pdump (*apidl);
+ if (_ILIsAdminTools(*apidl)) {
+ *rgfInOut &= dwAdminToolsAttributes;
+ } else {
+ SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut);
+ }
+ apidl++;
+ cidl--;
+ }
+ }
+ /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
+ *rgfInOut &= ~SFGAO_VALIDATE;
+
+ TRACE ("-- result=0x%08x\n", *rgfInOut);
+
+ return hr;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnGetUIObjectOf
+ *
+ * PARAMETERS
+ * HWND hwndOwner, //[in ] Parent window for any output
+ * UINT cidl, //[in ] array size
+ * LPCITEMIDLIST* apidl, //[in ] simple pidl array
+ * REFIID riid, //[in ] Requested Interface
+ * UINT* prgfInOut, //[ ] reserved
+ * LPVOID* ppvObject) //[out] Resulting Interface
+ *
+ */
+static HRESULT WINAPI ISF_AdminTools_fnGetUIObjectOf (IShellFolder2 * iface,
+ HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl,
+ REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ LPITEMIDLIST pidl;
+ IUnknown *pObj = NULL;
+ HRESULT hr = E_INVALIDARG;
+
+ TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
+ This, hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut);
+
+ if (!ppvOut)
+ return hr;
+
+ *ppvOut = NULL;
+
+ if (IsEqualIID (riid, &IID_IContextMenu))
+ {
+ hr = CDefFolderMenu_Create2(This->pidlRoot, hwndOwner, cidl, apidl, (IShellFolder*)iface, NULL, 0, NULL, (IContextMenu**)&pObj);
+ }
+ else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1))
+ {
+ pObj = (LPUNKNOWN) IDataObject_Constructor( hwndOwner,
+ This->pidlRoot, apidl, cidl);
+ hr = S_OK;
+ }
+ else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1))
+ {
+ pidl = ILCombine (This->pidlRoot, apidl[0]);
+ pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
+ SHFree (pidl);
+ hr = S_OK;
+ }
+ else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1))
+ {
+ pidl = ILCombine (This->pidlRoot, apidl[0]);
+ pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
+ SHFree (pidl);
+ hr = S_OK;
+ }
+ else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1))
+ {
+ hr = IShellFolder_QueryInterface (iface,
+ &IID_IDropTarget, (LPVOID *) & pObj);
+ }
+ else if ((IsEqualIID(riid,&IID_IShellLinkW) ||
+ IsEqualIID(riid,&IID_IShellLinkA)) && (cidl == 1))
+ {
+ pidl = ILCombine (This->pidlRoot, apidl[0]);
+ hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj);
+ SHFree (pidl);
+ }
+ else
+ hr = E_NOINTERFACE;
+
+ if (SUCCEEDED(hr) && !pObj)
+ hr = E_OUTOFMEMORY;
+
+ *ppvOut = pObj;
+ TRACE ("(%p)->hr=0x%08x\n", This, hr);
+ return hr;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnGetDisplayNameOf
+ *
+ */
+static HRESULT WINAPI ISF_AdminTools_fnGetDisplayNameOf (IShellFolder2 * iface,
+ LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ HRESULT hr = S_OK;
+ LPWSTR pszPath;
+
+ TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet);
+ pdump (pidl);
+
+ if (!strRet)
+ return E_INVALIDARG;
+
+ pszPath = CoTaskMemAlloc((MAX_PATH +1) * sizeof(WCHAR));
+ if (!pszPath)
+ return E_OUTOFMEMORY;
+
+ ZeroMemory(pszPath, (MAX_PATH +1) * sizeof(WCHAR));
+
+ if (_ILIsAdminTools (pidl))
+ {
+ if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
+ (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
+ strcpyW(pszPath, This->szTarget);
+ else
+ HCR_GetClassNameW(&CLSID_AdminFolderShortcut, pszPath, MAX_PATH);
+ }
+ else if (_ILIsPidlSimple(pidl))
+ {
+ _ILSimpleGetTextW(pidl, pszPath, MAX_PATH);
+ }
+ else if (_ILIsSpecialFolder(pidl))
+ {
+ BOOL bSimplePidl = _ILIsPidlSimple(pidl);
+
+ if (bSimplePidl)
+ {
+ _ILSimpleGetTextW(pidl, pszPath, MAX_PATH);
+ }
+ else
+ {
+ FIXME("special pidl\n");
+ }
+
+ if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl)
+ {
+ int len = 0;
+
+ strcpyW(pszPath, This->szTarget);
+ PathAddBackslashW(pszPath);
+ len = lstrlenW(pszPath);
+
+ if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_INFOLDER, pszPath + len, MAX_PATH + 1 - len)))
+ {
+ CoTaskMemFree(pszPath);
+ return E_OUTOFMEMORY;
+ }
+
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ strRet->uType = STRRET_WSTR;
+ strRet->u.pOleStr = pszPath;
+ }
+ else
+ CoTaskMemFree(pszPath);
+
+ TRACE ("-- (%p)->(%s,0x%08x)\n", This, debugstr_w(strRet->u.pOleStr), hr);
+ return hr;
+}
+
+/**************************************************************************
+ * ISF_AdminTools_fnSetNameOf
+ * Changes the name of a file object or subfolder, possibly changing its item
+ * identifier in the process.
+ *
+ * PARAMETERS
+ * HWND hwndOwner, //[in ] Owner window for output
+ * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
+ * LPCOLESTR lpszName, //[in ] the items new display name
+ * DWORD dwFlags, //[in ] SHGNO formatting flags
+ * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
+ */
+static HRESULT WINAPI ISF_AdminTools_fnSetNameOf (IShellFolder2 * iface,
+ HWND hwndOwner, LPCITEMIDLIST pidl, /* simple pidl */
+ LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ FIXME ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl,
+ debugstr_w (lpName), dwFlags, pPidlOut);
+
+ return E_FAIL;
+}
+
+static HRESULT WINAPI ISF_AdminTools_fnGetDefaultSearchGUID(IShellFolder2 *iface,
+ GUID * pguid)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+
+ FIXME ("(%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ISF_AdminTools_fnEnumSearches (IShellFolder2 *iface,
+ IEnumExtraSearch ** ppenum)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ FIXME ("(%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ISF_AdminTools_fnGetDefaultColumn (IShellFolder2 * iface,
+ DWORD dwRes, ULONG * pSort, ULONG * pDisplay)
+{
+ if (pSort)
+ *pSort = 0;
+ if (pDisplay)
+ *pDisplay = 0;
+
+ return S_OK;
+}
+static HRESULT WINAPI ISF_AdminTools_fnGetDefaultColumnState (
+ IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags)
+{
+ if (!pcsFlags || iColumn >= AdminToolsHELLVIEWCOLUMNS)
+ return E_INVALIDARG;
+ *pcsFlags = AdminToolsSFHeader[iColumn].pcsFlags;
+ return S_OK;
+
+}
+
+static HRESULT WINAPI ISF_AdminTools_fnGetDetailsEx (IShellFolder2 * iface,
+ LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ FIXME ("(%p): stub\n", This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ISF_AdminTools_fnGetDetailsOf (IShellFolder2 * iface,
+ LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ WCHAR buffer[MAX_PATH] = {0};
+ HRESULT hr = E_FAIL;
+
+ TRACE("(%p)->(%p %i %p): stub\n", This, pidl, iColumn, psd);
+
+ if (iColumn >= AdminToolsHELLVIEWCOLUMNS)
+ return E_FAIL;
+
+ psd->fmt = AdminToolsSFHeader[iColumn].fmt;
+ psd->cxChar = AdminToolsSFHeader[iColumn].cxChar;
+ if (pidl == NULL)
+ {
+ psd->str.uType = STRRET_WSTR;
+ if (LoadStringW(shell32_hInstance, AdminToolsSFHeader[iColumn].colnameid, buffer, MAX_PATH))
+ hr = SHStrDupW(buffer, &psd->str.u.pOleStr);
+
+ return hr;
+ }
+
+ psd->str.uType = STRRET_CSTR;
+ switch (iColumn)
+ {
+ case COLUMN_NAME:
+ psd->str.uType = STRRET_WSTR;
+ hr = IShellFolder_GetDisplayNameOf(iface, pidl,
+ SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
+ break;
+ case COLUMN_SIZE:
+ _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH);
+ break;
+ case COLUMN_TYPE:
+ _ILGetFileType (pidl, psd->str.u.cStr, MAX_PATH);
+ break;
+ case COLUMN_DATE:
+ _ILGetFileDate (pidl, psd->str.u.cStr, MAX_PATH);
+ break;
+ }
+
+ return hr;
+}
+
+static HRESULT WINAPI ISF_AdminTools_fnMapColumnToSCID (
+ IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid)
+{
+ IGenericSFImpl *This = (IGenericSFImpl *)iface;
+ FIXME ("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static IShellFolder2Vtbl vt_ShellFolder2 =
+{
+ ISF_AdminTools_fnQueryInterface,
+ ISF_AdminTools_fnAddRef,
+ ISF_AdminTools_fnRelease,
+ ISF_AdminTools_fnParseDisplayName,
+ ISF_AdminTools_fnEnumObjects,
+ ISF_AdminTools_fnBindToObject,
+ ISF_AdminTools_fnBindToStorage,
+ ISF_AdminTools_fnCompareIDs,
+ ISF_AdminTools_fnCreateViewObject,
+ ISF_AdminTools_fnGetAttributesOf,
+ ISF_AdminTools_fnGetUIObjectOf,
+ ISF_AdminTools_fnGetDisplayNameOf,
+ ISF_AdminTools_fnSetNameOf,
+ /* ShellFolder2 */
+ ISF_AdminTools_fnGetDefaultSearchGUID,
+ ISF_AdminTools_fnEnumSearches,
+ ISF_AdminTools_fnGetDefaultColumn,
+ ISF_AdminTools_fnGetDefaultColumnState,
+ ISF_AdminTools_fnGetDetailsEx,
+ ISF_AdminTools_fnGetDetailsOf,
+ ISF_AdminTools_fnMapColumnToSCID
+};
+
+/************************************************************************
+ * IPF_AdminTools_QueryInterface
+ */
+static HRESULT WINAPI IPF_AdminTools_QueryInterface (
+ IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObj)
+{
+ _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface);
+
+ TRACE ("(%p)\n", This);
+
+ return IUnknown_QueryInterface (_IUnknown_ (This), iid, ppvObj);
+}
+
+/************************************************************************
+ * IPF_AdminTools_AddRef
+ */
+static ULONG WINAPI IPF_AdminTools_AddRef (IPersistFolder2 * iface)
+{
+ _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface);
+
+ TRACE ("(%p)->(count=%lu)\n", This, This->ref);
+
+ return IUnknown_AddRef (_IUnknown_ (This));
+}
+
+/************************************************************************
+ * IPF_AdminTools_Release
+ */
+static ULONG WINAPI IPF_AdminTools_Release (IPersistFolder2 * iface)
+{
+ _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface);
+
+ TRACE ("(%p)->(count=%lu)\n", This, This->ref);
+
+ return IUnknown_Release (_IUnknown_ (This));
+}
+
+/************************************************************************
+ * IPF_AdminTools_GetClassID
+ */
+static HRESULT WINAPI IPF_AdminTools_GetClassID (
+ IPersistFolder2 * iface, CLSID * lpClassId)
+{
+ _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface);
+
+ TRACE ("(%p)\n", This);
+
+ memcpy(lpClassId, &CLSID_AdminFolderShortcut, sizeof(CLSID));
+
+ return S_OK;
+}
+
+/************************************************************************
+ * IPF_AdminTools_Initialize
+ *
+ */
+static HRESULT WINAPI IPF_AdminTools_Initialize (
+ IPersistFolder2 * iface, LPCITEMIDLIST pidl)
+{
+ _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface);
+ FIXME ("(%p)->(%p): stub\n", This, pidl);
+ return E_NOTIMPL;
+}
+
+/**************************************************************************
+ * IPF_AdminTools_fnGetCurFolder
+ */
+static HRESULT WINAPI IPF_AdminTools_GetCurFolder (
+ IPersistFolder2 * iface, LPITEMIDLIST * pidl)
+{
+ _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface);
+
+ TRACE ("(%p)->(%p)\n", This, pidl);
+
+ *pidl = ILClone (This->pidlRoot);
+ return S_OK;
+}
+
+static IPersistFolder2Vtbl vt_PersistFolder2 =
+{
+ IPF_AdminTools_QueryInterface,
+ IPF_AdminTools_AddRef,
+ IPF_AdminTools_Release,
+ IPF_AdminTools_GetClassID,
+ IPF_AdminTools_Initialize,
+ IPF_AdminTools_GetCurFolder
+};
+
+/**************************************************************************
+ * ISF_AdminTools_Constructor
+ */
+HRESULT WINAPI ISF_AdminTools_Constructor (
+ IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
+{
+ IGenericSFImpl *sf;
+ HRESULT hr;
+
+ TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid));
+
+ if (pUnkOuter)
+ return CLASS_E_NOAGGREGATION;
+
+ sf = HeapAlloc( GetProcessHeap(), 0, sizeof(*sf) );
+ if (!sf)
+ return E_OUTOFMEMORY;
+
+ sf->szTarget = HeapAlloc( GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR) );
+ if (!sf->szTarget)
+ {
+ HeapFree(GetProcessHeap(), 0, sf);
+ return E_OUTOFMEMORY;
+ }
+ if (!SHGetSpecialFolderPathW(NULL, sf->szTarget, CSIDL_COMMON_ADMINTOOLS, FALSE))
+ {
+ HeapFree(GetProcessHeap(), 0, sf->szTarget);
+ HeapFree(GetProcessHeap(), 0, sf);
+ }
+
+ sf->ref = 1;
+ sf->lpVtbl = &vt_ShellFolder2;
+ sf->lpVtblPersistFolder2 = &vt_PersistFolder2;
+ sf->pidlRoot = _ILCreateAdminTools(); /* my qualified pidl */
+
+ hr = IUnknown_QueryInterface( _IUnknown_(sf), riid, ppv );
+ IUnknown_Release( _IUnknown_(sf) );
+
+ TRACE ("--(%p)\n", *ppv);
+ return hr;
+}
diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h
index 41f346cdc46..3a06fe0abcd 100644
--- a/reactos/dll/win32/shell32/shresdef.h
+++ b/reactos/dll/win32/shell32/shresdef.h
@@ -161,6 +161,7 @@
#define IDS_CUT 323
#define IDS_RESTORE 324
#define IDS_DEFAULT_CLUSTER_SIZE 325
+#define IDS_ADMINISTRATIVETOOLS 326
/* Note: this string is referenced from the registry */
#define IDS_RECYCLEBIN_FOLDER_NAME 8964
@@ -236,6 +237,7 @@
#define IDI_SHELL_CONFIRM_DELETE 161
#define IDI_SHELL_MY_DOCUMENTS 235
#define IDI_SHELL_CONTROL_PANEL1 330
+#define IDI_SHELL_ADMINTOOLS 328
/*
AVI resources, windows shell32 has 14 of them: 150-152 and 160-170
FIXME: Need to add them, but for now just let them use the same: searching.avi