From: Attila Fidan dev@print0.net
--- dlls/shell32/brsfolder.c | 15 +++++++++++++++ dlls/shell32/tests/brsfolder.c | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c index ebaf01e7989..0fad56d83c9 100644 --- a/dlls/shell32/brsfolder.c +++ b/dlls/shell32/brsfolder.c @@ -188,9 +188,23 @@ static void InitializeTreeView( browse_info *info ) IEnumIDList * pEnumChildren = NULL; HTREEITEM item; DWORD flags; + LPITEMIDLIST pidlCSIDL = NULL; LPCITEMIDLIST root = info->lpBrowseInfo->pidlRoot;
TRACE("%p\n", info ); + + /* Some BURIKO engine installers depend on being able to pass CSIDL values + * in the pidlRoot member like resource identifiers. The folder is created + * if it doesn't exist, and this doesn't work on the new dialog style. + */ + if (!(info->lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) && IS_INTRESOURCE(root)) { + hr = SHGetFolderLocation(NULL, LOWORD(root) | CSIDL_FLAG_CREATE, NULL, 0, &pidlCSIDL); + if (FAILED(hr)) { + WARN("SHGetFolderLocation failed! hr = %08lx\n", hr); + return; + } + root = pidlCSIDL; + }
Shell_GetImageLists(NULL, &hImageList);
@@ -212,6 +226,7 @@ static void InitializeTreeView( browse_info *info ) pidlParent = ILClone(root); ILRemoveLastID(pidlParent); pidlChild = ILClone(ILFindLastID(root)); + ILFree(pidlCSIDL);
if (_ILIsDesktop(pidlParent)) { hr = SHGetDesktopFolder(&lpsfParent); diff --git a/dlls/shell32/tests/brsfolder.c b/dlls/shell32/tests/brsfolder.c index 40e571146d7..046da8eca21 100644 --- a/dlls/shell32/tests/brsfolder.c +++ b/dlls/shell32/tests/brsfolder.c @@ -420,5 +420,5 @@ START_TEST(brsfolder) { test_click_make_new_folder_button(); test_selection(); - if (!winetest_platform_is_wine) test_csidl_pidlroot(); + test_csidl_pidlroot(); }