1c2c66affSColin Finck #include "shelltest.h"
2c2c66affSColin Finck 
3*fe11f7a2SKatayama Hirofumi MZ // + Adapted from https://devblogs.microsoft.com/oldnewthing/20130503-00/?p=4463
4c2c66affSColin Finck // In short: We want to create an IDLIST from an item that does not exist,
5c2c66affSColin Finck // so we have to provide WIN32_FIND_DATAW in a bind context.
6c2c66affSColin Finck // If we don't, the FS will be queried, and we do not get a valid IDLIST for a non-existing path.
7c2c66affSColin Finck 
8c2c66affSColin Finck CComModule gModule;
9c2c66affSColin Finck 
10c2c66affSColin Finck class CFileSysBindData :
11c2c66affSColin Finck     public CComCoClass<CFileSysBindData>,
12c2c66affSColin Finck     public CComObjectRootEx<CComMultiThreadModelNoCS>,
13c2c66affSColin Finck     public IFileSystemBindData
14c2c66affSColin Finck {
15c2c66affSColin Finck public:
SetFindData(const WIN32_FIND_DATAW * pfd)16c2c66affSColin Finck     virtual HRESULT STDMETHODCALLTYPE SetFindData(const WIN32_FIND_DATAW *pfd)
17c2c66affSColin Finck     {
18c2c66affSColin Finck         m_Data = *pfd;
19c2c66affSColin Finck         return S_OK;
20c2c66affSColin Finck     }
21c2c66affSColin Finck 
GetFindData(WIN32_FIND_DATAW * pfd)22c2c66affSColin Finck     virtual HRESULT STDMETHODCALLTYPE GetFindData(WIN32_FIND_DATAW *pfd)
23c2c66affSColin Finck     {
24c2c66affSColin Finck         *pfd = m_Data;
25c2c66affSColin Finck         return S_OK;
26c2c66affSColin Finck     }
27c2c66affSColin Finck 
28c2c66affSColin Finck     DECLARE_NOT_AGGREGATABLE(CFileSysBindData)
29c2c66affSColin Finck     DECLARE_PROTECT_FINAL_CONSTRUCT()
30c2c66affSColin Finck     BEGIN_COM_MAP(CFileSysBindData)
31c2c66affSColin Finck         COM_INTERFACE_ENTRY_IID(IID_IFileSystemBindData, IFileSystemBindData)
32c2c66affSColin Finck     END_COM_MAP()
33c2c66affSColin Finck private:
34c2c66affSColin Finck     WIN32_FIND_DATAW m_Data;
35c2c66affSColin Finck };
36c2c66affSColin Finck 
37c2c66affSColin Finck static
38c2c66affSColin Finck HRESULT
AddFileSysBindCtx(_In_ IBindCtx * pbc)39c2c66affSColin Finck AddFileSysBindCtx(_In_ IBindCtx *pbc)
40c2c66affSColin Finck {
41c2c66affSColin Finck     CComPtr<IFileSystemBindData> spfsbc(new CComObject<CFileSysBindData>());
42c2c66affSColin Finck     WIN32_FIND_DATAW wfd = { 0 };
43c2c66affSColin Finck     wfd.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
44c2c66affSColin Finck     spfsbc->SetFindData(&wfd);
45c2c66affSColin Finck     HRESULT hr = pbc->RegisterObjectParam((LPOLESTR)STR_FILE_SYS_BIND_DATA, spfsbc);
46c2c66affSColin Finck     ok(hr == S_OK, "hr = %lx\n", hr);
47c2c66affSColin Finck     return hr;
48c2c66affSColin Finck }
49c2c66affSColin Finck 
50c2c66affSColin Finck static
51c2c66affSColin Finck HRESULT
CreateBindCtxWithOpts(_In_ BIND_OPTS * pbo,_Outptr_ IBindCtx ** ppbc)52c2c66affSColin Finck CreateBindCtxWithOpts(_In_ BIND_OPTS *pbo, _Outptr_ IBindCtx **ppbc)
53c2c66affSColin Finck {
54c2c66affSColin Finck     CComPtr<IBindCtx> spbc;
55c2c66affSColin Finck     HRESULT hr = CreateBindCtx(0, &spbc);
56c2c66affSColin Finck     ok(hr == S_OK, "hr = %lx\n", hr);
57c2c66affSColin Finck     if (SUCCEEDED(hr))
58c2c66affSColin Finck     {
59c2c66affSColin Finck         hr = spbc->SetBindOptions(pbo);
60c2c66affSColin Finck         ok(hr == S_OK, "hr = %lx\n", hr);
61c2c66affSColin Finck     }
62c2c66affSColin Finck     *ppbc = SUCCEEDED(hr) ? spbc.Detach() : NULL;
63c2c66affSColin Finck     return hr;
64c2c66affSColin Finck }
65c2c66affSColin Finck 
66c2c66affSColin Finck static HRESULT
CreateFileSysBindCtx(_Outptr_ IBindCtx ** ppbc)67c2c66affSColin Finck CreateFileSysBindCtx(_Outptr_ IBindCtx **ppbc)
68c2c66affSColin Finck {
69c2c66affSColin Finck     CComPtr<IBindCtx> spbc;
70c2c66affSColin Finck     BIND_OPTS bo = { sizeof(bo), 0, STGM_CREATE, 0 };
71c2c66affSColin Finck     HRESULT hr = CreateBindCtxWithOpts(&bo, &spbc);
72c2c66affSColin Finck     ok(hr == S_OK, "hr = %lx\n", hr);
73c2c66affSColin Finck     if (SUCCEEDED(hr))
74c2c66affSColin Finck     {
75c2c66affSColin Finck         hr = AddFileSysBindCtx(spbc);
76c2c66affSColin Finck         ok(hr == S_OK, "hr = %lx\n", hr);
77c2c66affSColin Finck     }
78c2c66affSColin Finck     *ppbc = SUCCEEDED(hr) ? spbc.Detach() : NULL;
79c2c66affSColin Finck     return hr;
80c2c66affSColin Finck }
81c2c66affSColin Finck 
82c2c66affSColin Finck VOID
PathToIDList(LPCWSTR pszPath,ITEMIDLIST ** ppidl)83c2c66affSColin Finck PathToIDList(LPCWSTR pszPath, ITEMIDLIST** ppidl)
84c2c66affSColin Finck {
85c2c66affSColin Finck     CComPtr<IBindCtx> spbc;
86c2c66affSColin Finck     HRESULT hr = CreateFileSysBindCtx(&spbc);
87c2c66affSColin Finck     ok(hr == S_OK, "hr = %lx\n", hr);
88c2c66affSColin Finck     if (SUCCEEDED(hr))
89c2c66affSColin Finck     {
90c2c66affSColin Finck         hr = SHParseDisplayName(pszPath, spbc, ppidl, 0, NULL);
91c2c66affSColin Finck         ok(hr == S_OK, "hr = %lx\n", hr);
92c2c66affSColin Finck     }
93c2c66affSColin Finck }
94c2c66affSColin Finck 
95*fe11f7a2SKatayama Hirofumi MZ // - Adapted from https://devblogs.microsoft.com/oldnewthing/20130503-00/?p=4463
96