[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