[1/5] taskschd: Make GetFolder check whether task folder tree exists in the registry.

Dmitry Timoshkov dmitry at baikal.ru
Mon Jan 20 01:04:16 CST 2014


---
 dlls/taskschd/Makefile.in       |  2 +-
 dlls/taskschd/folder.c          | 37 +++++++++++++++++++++++++++++++++++++
 dlls/taskschd/tests/scheduler.c |  1 -
 3 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/dlls/taskschd/Makefile.in b/dlls/taskschd/Makefile.in
index 80775c7..fa4beba 100644
--- a/dlls/taskschd/Makefile.in
+++ b/dlls/taskschd/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = taskschd.dll
-IMPORTS   = oleaut32
+IMPORTS   = advapi32 oleaut32
 
 C_SRCS = \
 	folder.c \
diff --git a/dlls/taskschd/folder.c b/dlls/taskschd/folder.c
index c19aa4e..cb285fd 100644
--- a/dlls/taskschd/folder.c
+++ b/dlls/taskschd/folder.c
@@ -22,6 +22,7 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "winreg.h"
 #include "objbase.h"
 #include "taskschd.h"
 #include "taskschd_private.h"
@@ -31,6 +32,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(taskschd);
 
+static const char root[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree";
+
 typedef struct
 {
     ITaskFolder ITaskFolder_iface;
@@ -116,6 +119,29 @@ static HRESULT WINAPI TaskFolder_get_Name(ITaskFolder *iface, BSTR *name)
     return E_NOTIMPL;
 }
 
+static HRESULT reg_open_folder(const WCHAR *path, HKEY *hfolder)
+{
+    HKEY hroot;
+    DWORD ret;
+
+    ret = RegCreateKeyA(HKEY_LOCAL_MACHINE, root, &hroot);
+    if (ret) return HRESULT_FROM_WIN32(ret);
+
+    while (*path == '\\') path++;
+    ret = RegOpenKeyExW(hroot, path, 0, KEY_ALL_ACCESS, hfolder);
+    if (ret == ERROR_FILE_NOT_FOUND)
+        ret = ERROR_PATH_NOT_FOUND;
+
+    RegCloseKey(hroot);
+
+    return HRESULT_FROM_WIN32(ret);
+}
+
+static inline void reg_close_folder(HKEY hfolder)
+{
+    RegCloseKey(hfolder);
+}
+
 static HRESULT WINAPI TaskFolder_get_Path(ITaskFolder *iface, BSTR *path)
 {
     TaskFolder *folder = impl_from_ITaskFolder(iface);
@@ -232,6 +258,8 @@ HRESULT TaskFolder_create(const WCHAR *parent, const WCHAR *path, ITaskFolder **
     TaskFolder *folder;
     WCHAR *folder_path;
     int len = 0;
+    HRESULT hr;
+    HKEY hfolder;
 
     if (path)
     {
@@ -260,6 +288,15 @@ HRESULT TaskFolder_create(const WCHAR *parent, const WCHAR *path, ITaskFolder **
         strcatW(folder_path, path);
     }
 
+    hr = reg_open_folder(folder_path, &hfolder);
+    if (hr)
+    {
+        HeapFree(GetProcessHeap(), 0, folder_path);
+        return hr;
+    }
+
+    reg_close_folder(hfolder);
+
     folder = HeapAlloc(GetProcessHeap(), 0, sizeof(*folder));
     if (!folder)
     {
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c
index 38d60a4..32c8f71 100644
--- a/dlls/taskschd/tests/scheduler.c
+++ b/dlls/taskschd/tests/scheduler.c
@@ -203,7 +203,6 @@ todo_wine
     ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_NAME), "expected ERROR_INVALID_NAME, got %#x\n", hr);
 
     hr = ITaskService_GetFolder(service, Wine_Folder1_Folder2, &subfolder);
-todo_wine
     ok(hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "expected ERROR_PATH_NOT_FOUND, got %#x\n", hr);
 
     hr = ITaskFolder_CreateFolder(folder, bslash, v_null, &subfolder);
-- 
1.8.5.2




More information about the wine-patches mailing list