2 * Virtual Admin Tools Folder
4 * Copyright 2008 Johannes Anderwald
5 * Copyright 2009 Andrew Hill
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
27 This folder should not exist. It is just a file system folder...
31 * CSIDL_COMMON_ADMINTOOLS
32 * Note: CSIDL_ADMINTOOLS is ignored, tested with Window XP SP3+
35 /***********************************************************************
36 * AdminTools folder implementation
39 CAdminToolsFolder::CAdminToolsFolder()
47 CAdminToolsFolder::~CAdminToolsFolder()
49 HeapFree(GetProcessHeap(), 0, szTarget
);
50 m_pisfInner
.Release();
51 m_pisf2Inner
.Release();
54 HRESULT WINAPI
CAdminToolsFolder::FinalConstruct()
57 CComPtr
<IPersistFolder3
> ppf3
;
58 hr
= SHCoCreateInstance(NULL
, &CLSID_ShellFSFolder
, NULL
, IID_PPV_ARG(IShellFolder
, &m_pisfInner
));
62 hr
= m_pisfInner
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pisf2Inner
));
66 hr
= m_pisfInner
->QueryInterface(IID_PPV_ARG(IPersistFolder3
, &ppf3
));
70 PERSIST_FOLDER_TARGET_INFO info
;
71 ZeroMemory(&info
, sizeof(PERSIST_FOLDER_TARGET_INFO
));
72 info
.csidl
= CSIDL_COMMON_ADMINTOOLS
;
73 hr
= ppf3
->InitializeEx(NULL
, _ILCreateAdminTools(), &info
);
75 szTarget
= (LPWSTR
)HeapAlloc(GetProcessHeap(), 0, MAX_PATH
* sizeof(WCHAR
));
78 if (!SHGetSpecialFolderPathW(NULL
, szTarget
, CSIDL_COMMON_ADMINTOOLS
, FALSE
))
84 HRESULT WINAPI
CAdminToolsFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
85 ULONG
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
)
87 return m_pisfInner
->ParseDisplayName(hwndOwner
, pbc
, lpszDisplayName
, pchEaten
, ppidl
, pdwAttributes
);
90 HRESULT WINAPI
CAdminToolsFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
92 return m_pisfInner
->EnumObjects(hwndOwner
, dwFlags
, ppEnumIDList
);
95 HRESULT WINAPI
CAdminToolsFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
97 return m_pisfInner
->BindToObject(pidl
, pbcReserved
, riid
, ppvOut
);
100 HRESULT WINAPI
CAdminToolsFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
102 return m_pisfInner
->BindToStorage(pidl
, pbcReserved
, riid
, ppvOut
);
105 HRESULT WINAPI
CAdminToolsFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
107 return m_pisfInner
->CompareIDs(lParam
, pidl1
, pidl2
);
110 HRESULT WINAPI
CAdminToolsFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
)
112 return m_pisfInner
->CreateViewObject(hwndOwner
, riid
, ppvOut
);
115 HRESULT WINAPI
CAdminToolsFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
117 return m_pisfInner
->GetAttributesOf(cidl
, apidl
, rgfInOut
);
120 HRESULT WINAPI
CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
121 REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
)
123 return m_pisfInner
->GetUIObjectOf(hwndOwner
, cidl
, apidl
, riid
, prgfInOut
, ppvOut
);
126 HRESULT WINAPI
CAdminToolsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
128 if (!_ILIsSpecialFolder(pidl
))
129 return m_pisfInner
->GetDisplayNameOf(pidl
, dwFlags
, strRet
);
134 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl
, dwFlags
, strRet
);
140 pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
142 return E_OUTOFMEMORY
;
144 ZeroMemory(pszPath
, (MAX_PATH
+ 1) * sizeof(WCHAR
));
148 if ((GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
) &&
149 (GET_SHGDN_FOR (dwFlags
) & SHGDN_FORPARSING
))
150 wcscpy(pszPath
, szTarget
);
151 else if (!HCR_GetClassNameW(CLSID_AdminFolderShortcut
, pszPath
, MAX_PATH
))
157 strRet
->uType
= STRRET_WSTR
;
158 strRet
->pOleStr
= pszPath
;
159 TRACE ("-- (%p)->(%s,0x%08x)\n", this, debugstr_w(strRet
->pOleStr
), hr
);
162 CoTaskMemFree(pszPath
);
167 HRESULT WINAPI
CAdminToolsFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, /* simple pidl */
168 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
170 return m_pisfInner
->SetNameOf(hwndOwner
, pidl
, lpName
, dwFlags
, pPidlOut
);
173 HRESULT WINAPI
CAdminToolsFolder::GetDefaultSearchGUID(GUID
*pguid
)
175 return m_pisf2Inner
->GetDefaultSearchGUID(pguid
);
178 HRESULT WINAPI
CAdminToolsFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
180 return m_pisf2Inner
->EnumSearches(ppenum
);
183 HRESULT WINAPI
CAdminToolsFolder::GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
185 return m_pisf2Inner
->GetDefaultColumn(dwRes
, pSort
, pDisplay
);
188 HRESULT WINAPI
CAdminToolsFolder::GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
)
190 return m_pisf2Inner
->GetDefaultColumnState(iColumn
, pcsFlags
);
193 HRESULT WINAPI
CAdminToolsFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
195 return m_pisf2Inner
->GetDetailsEx(pidl
, pscid
, pv
);
198 HRESULT WINAPI
CAdminToolsFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
200 return m_pisf2Inner
->GetDetailsOf(pidl
, iColumn
, psd
);
203 HRESULT WINAPI
CAdminToolsFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
205 return m_pisf2Inner
->MapColumnToSCID(column
, pscid
);
208 /************************************************************************
209 * CAdminToolsFolder::GetClassID
211 HRESULT WINAPI
CAdminToolsFolder::GetClassID(CLSID
*lpClassId
)
213 TRACE ("(%p)\n", this);
215 memcpy(lpClassId
, &CLSID_AdminFolderShortcut
, sizeof(CLSID
));
220 /************************************************************************
221 * CAdminToolsFolder::Initialize
224 HRESULT WINAPI
CAdminToolsFolder::Initialize(LPCITEMIDLIST pidl
)
229 /**************************************************************************
230 * CAdminToolsFolder::GetCurFolder
232 HRESULT WINAPI
CAdminToolsFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
234 CComPtr
<IPersistFolder2
> ppf2
;
235 m_pisfInner
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
236 return ppf2
->GetCurFolder(pidl
);