[SHELL32] -SHChangeNotifyRegister: Don't call CreateFileW with something that is...
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Wed, 30 Aug 2017 12:49:59 +0000 (12:49 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Wed, 30 Aug 2017 12:49:59 +0000 (12:49 +0000)
svn path=/trunk/; revision=75713

reactos/dll/win32/shell32/wine/changenotify.c

index d3c75ee..0157297 100644 (file)
@@ -647,19 +647,25 @@ _AddDirectoryProc(ULONG_PTR arg)
 BOOL _OpenDirectory(LPNOTIFYREGISTER item)
 {
     STRRET strFile;
-    IShellFolder *psfDesktop;
+    IShellFolder *psf;
     HRESULT hr;
+    LPCITEMIDLIST child;
+    ULONG ulAttrs;
 
     // Makes function idempotent
     if (item->hDirectory && !(item->hDirectory == INVALID_HANDLE_VALUE))
         return TRUE;
 
-    hr = SHGetDesktopFolder(&psfDesktop);
+    hr = SHBindToParent(item->pidl, &IID_IShellFolder, (LPVOID*)&psf, &child);
     if (FAILED_UNEXPECTEDLY(hr))
-        return FALSE;
+        return hr;
+
+    ulAttrs = SFGAO_FILESYSTEM | SFGAO_FOLDER;
+    hr = IShellFolder_GetAttributesOf(psf, 1, (LPCITEMIDLIST*)&child, &ulAttrs);
+    if (SUCCEEDED(hr))
+        hr = IShellFolder_GetDisplayNameOf(psf, child, SHGDN_FORPARSING, &strFile);
 
-    hr = IShellFolder_GetDisplayNameOf(psfDesktop, item->pidl, SHGDN_FORPARSING, &strFile);
-    IShellFolder_Release(psfDesktop);
+    IShellFolder_Release(psf);
     if (FAILED_UNEXPECTEDLY(hr))
         return FALSE;
 
@@ -667,6 +673,13 @@ BOOL _OpenDirectory(LPNOTIFYREGISTER item)
     if (FAILED_UNEXPECTEDLY(hr))
         return FALSE;
 
+    if ((ulAttrs & (SFGAO_FILESYSTEM | SFGAO_FOLDER)) != (SFGAO_FILESYSTEM | SFGAO_FOLDER))
+    {
+        TRACE("_OpenDirectory ignoring %s\n", debugstr_w(item->wstrDirectory));
+        item->hDirectory = INVALID_HANDLE_VALUE;
+        return FALSE;
+    }
+
     TRACE("_OpenDirectory %s\n", debugstr_w(item->wstrDirectory));
 
     item->hDirectory = CreateFileW(item->wstrDirectory, // pointer to the file name