shell32: Construct the proper path target for UnixFolder.
Worse than just no unix integration is that it can actually crash if you parse e.g. "/". Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
This commit is contained in:
parent
40afa8d937
commit
a9b3fdd3ae
1 changed files with 16 additions and 6 deletions
|
@ -1797,7 +1797,7 @@ static const IDropTargetVtbl dtvt = {
|
|||
ISFDropTarget_Drop
|
||||
};
|
||||
|
||||
static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CLSID *clsid)
|
||||
static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CLSID *clsid, const WCHAR *path_target)
|
||||
{
|
||||
IGenericSFImpl *sf;
|
||||
HRESULT hr;
|
||||
|
@ -1820,6 +1820,16 @@ static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CL
|
|||
sf->ISFHelper_iface.lpVtbl = &shvt;
|
||||
sf->pclsid = clsid;
|
||||
sf->outer_unk = outer_unk ? outer_unk : &sf->IUnknown_inner;
|
||||
if (path_target)
|
||||
{
|
||||
SIZE_T size = (wcslen(path_target) + 1) * sizeof(WCHAR);
|
||||
if (!(sf->sPathTarget = SHAlloc(size)))
|
||||
{
|
||||
LocalFree(sf);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
memcpy(sf->sPathTarget, path_target, size);
|
||||
}
|
||||
|
||||
hr = IUnknown_QueryInterface(&sf->IUnknown_inner, riid, ppv);
|
||||
IUnknown_Release(&sf->IUnknown_inner);
|
||||
|
@ -1830,25 +1840,25 @@ static HRESULT create_fs( IUnknown *outer_unk, REFIID riid, void **ppv, const CL
|
|||
|
||||
HRESULT WINAPI IFSFolder_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv)
|
||||
{
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_ShellFSFolder );
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_ShellFSFolder, NULL );
|
||||
}
|
||||
|
||||
HRESULT WINAPI UnixFolder_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv)
|
||||
{
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_UnixFolder );
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_UnixFolder, L"\\\\?\\unix\\" );
|
||||
}
|
||||
|
||||
HRESULT WINAPI UnixDosFolder_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv)
|
||||
{
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_UnixDosFolder );
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_UnixDosFolder, NULL );
|
||||
}
|
||||
|
||||
HRESULT WINAPI FolderShortcut_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv)
|
||||
{
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_FolderShortcut );
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_FolderShortcut, NULL );
|
||||
}
|
||||
|
||||
HRESULT WINAPI MyDocuments_Constructor(IUnknown *outer_unk, REFIID riid, void **ppv)
|
||||
{
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_MyDocuments );
|
||||
return create_fs( outer_unk, riid, ppv, &CLSID_MyDocuments, NULL );
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue