* Deleting tasks & folders requires elevated privileges on Windows 7. * Elevated privileges are needed to connect using a hostname. * Use a winetest context in the scheduler loops. * Use wide character string literals in scheduler.c. * Store the xml definitions as wide string literals in scheduler.c. * Use __HRESULT_FROM_WIN32() to initialize constants.
From: Francois Gouget fgouget@codeweavers.com
It is a macro and thus constant unlike HRESULT_FROM_WIN32(). --- dlls/taskschd/tests/scheduler.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index 07ba0f4bd95..0c0c7f5be9b 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -722,7 +722,7 @@ static void test_GetTask(void) { { 0, S_OK }, { TASK_CREATE, S_OK }, - { TASK_UPDATE, 0x80070002 /* HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) */ }, + { TASK_UPDATE, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) }, { TASK_CREATE | TASK_UPDATE, S_OK } }; static const struct @@ -730,8 +730,8 @@ static void test_GetTask(void) DWORD flags, hr; } open_existing_task[] = { - { 0, 0x800700b7 /* HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) */ }, - { TASK_CREATE, 0x800700b7 /* HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) */ }, + { 0, __HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) }, + { TASK_CREATE, __HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) }, { TASK_UPDATE, S_OK }, { TASK_CREATE | TASK_UPDATE, S_OK } };
From: Francois Gouget fgouget@codeweavers.com
--- dlls/taskschd/tests/scheduler.c | 97 ++++++++++++++------------------- 1 file changed, 41 insertions(+), 56 deletions(-)
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index 0c0c7f5be9b..fbb12077cef 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -683,8 +683,8 @@ static void test_GetTask(void) static WCHAR Wine_Task2[] = { '\','W','i','n','e','\','T','a','s','k','2',0 }; static WCHAR Task1[] = { 'T','a','s','k','1',0 }; static WCHAR Task2[] = { 'T','a','s','k','2',0 }; - static const char xml1[] = - "<?xml version=\"1.0\"?>\n" + static WCHAR xml1[] = + L"<?xml version=\"1.0\"?>\n" "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" " <RegistrationInfo>\n" " <Description>"Task1"</Description>\n" @@ -699,8 +699,8 @@ static void test_GetTask(void) " </Exec>\n" " </Actions>\n" "</Task>\n"; - static const char xml2[] = - "<?xml version=\"1.0\"?>\n" + static WCHAR xml2[] = + L"<?xml version=\"1.0\"?>\n" "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" " <RegistrationInfo>\n" " <Description>"Task2"</Description>\n" @@ -735,7 +735,6 @@ static void test_GetTask(void) { TASK_UPDATE, S_OK }, { TASK_CREATE | TASK_UPDATE, S_OK } }; - WCHAR xmlW[sizeof(xml1)]; HRESULT hr; BSTR bstr; TASK_STATE state; @@ -775,9 +774,7 @@ static void test_GetTask(void) hr = ITaskFolder_CreateFolder(root, Wine, v_null, &folder); ok(hr == S_OK, "CreateFolder error %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml1, -1, xmlW, ARRAY_SIZE(xmlW)); - - hr = ITaskFolder_RegisterTask(root, Wine, xmlW, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); + hr = ITaskFolder_RegisterTask(root, Wine, xml1, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED) || broken(hr == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) /* Vista */, "expected ERROR_ACCESS_DENIED, got %#lx\n", hr);
@@ -797,7 +794,7 @@ static void test_GetTask(void)
for (i = 0; i < ARRAY_SIZE(create_new_task); i++) { - hr = ITaskFolder_RegisterTask(root, Wine_Task1, xmlW, create_new_task[i].flags, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); + hr = ITaskFolder_RegisterTask(root, Wine_Task1, xml1, create_new_task[i].flags, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); ok(hr == create_new_task[i].hr, "%d: expected %#lx, got %#lx\n", i, create_new_task[i].hr, hr); if (hr == S_OK) { @@ -810,24 +807,24 @@ static void test_GetTask(void) hr = ITaskFolder_RegisterTask(root, Wine_Task1, NULL, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "expected RPC_X_NULL_REF_POINTER, got %#lx\n", hr);
- hr = ITaskFolder_RegisterTask(root, Wine, xmlW, TASK_VALIDATE_ONLY, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); + hr = ITaskFolder_RegisterTask(root, Wine, xml1, TASK_VALIDATE_ONLY, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); ok(hr == S_OK, "RegisterTask error %#lx\n", hr);
- hr = ITaskFolder_RegisterTask(root, Wine_Task1, xmlW, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); + hr = ITaskFolder_RegisterTask(root, Wine_Task1, xml1, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); ok(hr == S_OK, "RegisterTask error %#lx\n", hr);
- hr = ITaskFolder_RegisterTask(root, Wine_Task1, xmlW, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); + hr = ITaskFolder_RegisterTask(root, Wine_Task1, xml1, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); ok(hr == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr);
- hr = ITaskFolder_RegisterTask(root, Wine_Task1, xmlW, 0, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); + hr = ITaskFolder_RegisterTask(root, Wine_Task1, xml1, 0, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); ok(hr == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr);
- hr = ITaskFolder_RegisterTask(root, Wine_Task1, xmlW, TASK_CREATE_OR_UPDATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); + hr = ITaskFolder_RegisterTask(root, Wine_Task1, xml1, TASK_CREATE_OR_UPDATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); ok(hr == S_OK, "RegisterTask error %#lx\n", hr);
for (i = 0; i < ARRAY_SIZE(open_existing_task); i++) { - hr = ITaskFolder_RegisterTask(root, Wine_Task1, xmlW, open_existing_task[i].flags, v_null, v_null, TASK_LOGON_NONE, v_null, &task2); + hr = ITaskFolder_RegisterTask(root, Wine_Task1, xml1, open_existing_task[i].flags, v_null, v_null, TASK_LOGON_NONE, v_null, &task2); ok(hr == open_existing_task[i].hr, "%d: expected %#lx, got %#lx\n", i, open_existing_task[i].hr, hr); if (hr == S_OK) IRegisteredTask_Release(task2); @@ -856,12 +853,10 @@ static void test_GetTask(void)
IRegisteredTask_Release(task1);
- hr = ITaskFolder_RegisterTask(folder, Task1, xmlW, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task2); + hr = ITaskFolder_RegisterTask(folder, Task1, xml1, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task2); ok(hr == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS), "expected ERROR_ALREADY_EXISTS, got %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml2, -1, xmlW, ARRAY_SIZE(xmlW)); - - hr = ITaskFolder_RegisterTask(folder, Task2, xmlW, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task2); + hr = ITaskFolder_RegisterTask(folder, Task2, xml2, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task2); ok(hr == S_OK, "RegisterTask error %#lx\n", hr);
hr = IRegisteredTask_get_Name(task2, &bstr); @@ -967,7 +962,7 @@ static void test_GetTask(void) hr = ITaskFolder_DeleteTask(folder, Task2, 0); ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || hr == S_OK /* win7 */, "expected ERROR_FILE_NOT_FOUND, got %#lx\n", hr);
- hr = ITaskFolder_RegisterTask(root, NULL, xmlW, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); + hr = ITaskFolder_RegisterTask(root, NULL, xml2, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); if(hr == E_ACCESSDENIED) { skip("Access denied\n"); @@ -986,7 +981,7 @@ static void test_GetTask(void) ok(hr == S_OK, "DeleteTask error %#lx\n", hr); SysFreeString(bstr);
- hr = ITaskFolder_RegisterTask(folder, NULL, xmlW, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); + hr = ITaskFolder_RegisterTask(folder, NULL, xml2, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#lx\n", hr);
no_access: @@ -1455,8 +1450,9 @@ static void create_action(ITaskDefinition *taskdef)
static void test_TaskDefinition(void) { - static const char xml1[] = - "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" + static WCHAR xml0[] = L""; + static WCHAR xml1[] = + L"<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" " <RegistrationInfo>\n" " <Description>"Task1"</Description>\n" " <Author>author</Author>\n" @@ -1476,8 +1472,8 @@ static void test_TaskDefinition(void) " </Exec>\n" " </Actions>\n" "</Task>\n"; - static const char xml2[] = - "<Task>\n" + static WCHAR xml2[] = + L"<Task>\n" " <RegistrationInfo>\n" " <Description>"Task1"</Description>\n" " </RegistrationInfo>\n" @@ -1491,8 +1487,8 @@ static void test_TaskDefinition(void) " </Exec>\n" " </Actions>\n" "</Task>\n"; - static const char xml3[] = - "<TASK>\n" + static WCHAR xml3[] = + L"<TASK>\n" " <RegistrationInfo>\n" " <Description>"Task1"</Description>\n" " </RegistrationInfo>\n" @@ -1506,8 +1502,8 @@ static void test_TaskDefinition(void) " </Exec>\n" " </Actions>\n" "</TASK>\n"; - static const char xml4[] = - "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" + static WCHAR xml4[] = + L"<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" " <RegistrationInfo/>\n" " <Settings/>\n" " <Actions>\n" @@ -1516,14 +1512,14 @@ static void test_TaskDefinition(void) " </Exec>\n" " </Actions>\n" "</Task>\n"; - static const char xml5[] = - "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" + static WCHAR xml5[] = + L"<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" " <RegistrationInfo/>\n" " <Settings/>\n" " <Actions/>\n" "</Task>\n"; - static const char xml6[] = - "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" + static WCHAR xml6[] = + L"<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" " <RegistrationInfo/>\n" " <Actions>\n" " <Exec>\n" @@ -1532,8 +1528,8 @@ static void test_TaskDefinition(void) " </Actions>\n" " <Settings>\n" "</Task>\n"; - static const char xml7[] = - "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" + static WCHAR xml7[] = + L"<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" " <RegistrationInfo/>\n" " <Settings>\n" " <Enabled>FALSE</Enabled>\n" @@ -1567,7 +1563,6 @@ static void test_TaskDefinition(void) ITrigger *trigger; BSTR xml, bstr; VARIANT var; - WCHAR xmlW[sizeof(xml1)];
hr = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskService, (void **)&service); if (hr != S_OK) @@ -1604,43 +1599,34 @@ static void test_TaskDefinition(void) hr = ITaskDefinition_put_XmlText(taskdef, NULL); ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml1, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml1); ok(hr == S_OK, "put_XmlText error %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml2, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml2); ok(hr == SCHED_E_NAMESPACE, "expected SCHED_E_NAMESPACE, got %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml3, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml3); todo_wine ok(hr == SCHED_E_UNEXPECTEDNODE, "expected SCHED_E_UNEXPECTEDNODE, got %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml4, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml4); ok(hr == S_OK, "put_XmlText error %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml5, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml5); todo_wine ok(hr == SCHED_E_MISSINGNODE, "expected SCHED_E_MISSINGNODE, got %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml6, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml6); ok(hr == SCHED_E_MALFORMEDXML, "expected SCHED_E_MALFORMEDXML, got %#lx\n", hr);
- MultiByteToWideChar(CP_ACP, 0, xml7, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml7); ok(hr == SCHED_E_INVALIDVALUE, "expected SCHED_E_INVALIDVALUE, got %#lx\n", hr);
- xmlW[0] = 0; - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml0); ok(hr == SCHED_E_MALFORMEDXML, "expected SCHED_E_MALFORMEDXML, got %#lx\n", hr);
/* test registration info */ - MultiByteToWideChar(CP_ACP, 0, xml1, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml1); ok(hr == S_OK, "put_XmlText error %#lx\n", hr); hr = ITaskDefinition_get_RegistrationInfo(taskdef, ®info); ok(hr == S_OK, "get_RegistrationInfo error %#lx\n", hr); @@ -1732,8 +1718,7 @@ static void test_TaskDefinition(void)
IRegistrationInfo_Release(reginfo);
- MultiByteToWideChar(CP_ACP, 0, xml4, -1, xmlW, ARRAY_SIZE(xmlW)); - hr = ITaskDefinition_put_XmlText(taskdef, xmlW); + hr = ITaskDefinition_put_XmlText(taskdef, xml4); ok(hr == S_OK, "put_XmlText error %#lx\n", hr); hr = ITaskDefinition_get_RegistrationInfo(taskdef, ®info); ok(hr == S_OK, "get_RegistrationInfo error %#lx\n", hr);
From: Francois Gouget fgouget@codeweavers.com
--- dlls/taskschd/tests/scheduler.c | 129 +++++++++++++------------------- 1 file changed, 52 insertions(+), 77 deletions(-)
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index fbb12077cef..aa7b0754cb7 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -31,8 +31,6 @@
static void test_Connect(void) { - static WCHAR empty[] = { 0 }; - static const WCHAR deadbeefW[] = { '0','.','0','.','0','.','0',0 }; WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1]; DWORD len; HRESULT hr; @@ -79,7 +77,7 @@ static void test_Connect(void) was_connected = hr == S_OK; SysFreeString(V_BSTR(&v_comp));
- V_BSTR(&v_comp) = SysAllocString(deadbeefW); + V_BSTR(&v_comp) = SysAllocString(L"0.0.0.0"); hr = ITaskService_Connect(service, v_comp, v_null, v_null, v_null); ok(hr == HRESULT_FROM_WIN32(RPC_S_INVALID_NET_ADDR) || hr == HRESULT_FROM_WIN32(ERROR_BAD_NETPATH) /* VM */, "expected RPC_S_INVALID_NET_ADDR, got %#lx\n", hr); @@ -91,7 +89,7 @@ static void test_Connect(void) ok(vbool == VARIANT_FALSE || (was_connected && vbool == VARIANT_TRUE), "Connect shouldn't trash an existing connection, got %d (was connected %d)\n", vbool, was_connected);
- V_BSTR(&v_comp) = SysAllocString(empty); + V_BSTR(&v_comp) = SysAllocString(L""); hr = ITaskService_Connect(service, v_comp, v_null, v_null, v_null); ok(hr == S_OK, "Connect error %#lx\n", hr); SysFreeString(V_BSTR(&v_comp)); @@ -118,17 +116,15 @@ static void test_Connect(void)
static void test_GetFolder(void) { - static WCHAR dot[] = { '.',0 }; - static WCHAR empty[] = { 0 }; - static WCHAR slash[] = { '/',0 }; - static WCHAR bslash[] = { '\',0 }; - static WCHAR Wine[] = { '\','W','i','n','e',0 }; - static WCHAR Wine_Folder1[] = { '\','W','i','n','e','\','F','o','l','d','e','r','1',0 }; - static WCHAR Wine_Folder1_[] = { '\','W','i','n','e','\','F','o','l','d','e','r','1','\',0 }; - static WCHAR Wine_Folder1_Folder2[] = { '\','W','i','n','e','\','F','o','l','d','e','r','1','\','F','o','l','d','e','r','2',0 }; - static WCHAR Folder1_Folder2[] = { '\','F','o','l','d','e','r','1','\','F','o','l','d','e','r','2',0 }; - static const WCHAR Folder1[] = { 'F','o','l','d','e','r','1',0 }; - static const WCHAR Folder2[] = { 'F','o','l','d','e','r','2',0 }; + static WCHAR dot[] = L"."; + static WCHAR empty[] = L""; + static WCHAR slash[] = L"/"; + static WCHAR bslash[] = L"\"; + static WCHAR Wine[] = L"\Wine"; + static WCHAR Wine_Folder1[] = L"\Wine\Folder1"; + static WCHAR Wine_Folder1_[] = L"\Wine\Folder1\"; + static WCHAR Wine_Folder1_Folder2[] = L"\Wine\Folder1\Folder2"; + static WCHAR Folder1_Folder2[] = L"\Folder1\Folder2"; HRESULT hr; BSTR bstr; VARIANT v_null; @@ -240,7 +236,7 @@ static void test_GetFolder(void)
hr = ITaskFolder_get_Name(subfolder, &bstr); ok (hr == S_OK, "get_Name error %#lx\n", hr); - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = ITaskFolder_get_Path(subfolder, &bstr); ok(hr == S_OK, "get_Path error %#lx\n", hr); @@ -252,7 +248,7 @@ static void test_GetFolder(void) ok(hr == S_OK, "GetFolder error %#lx\n", hr); hr = ITaskFolder_get_Name(subfolder, &bstr); ok (hr == S_OK, "get_Name error %#lx\n", hr); - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = ITaskFolder_get_Path(subfolder, &bstr); ok(hr == S_OK, "get_Path error %#lx\n", hr); @@ -264,7 +260,7 @@ static void test_GetFolder(void) ok(hr == S_OK, "GetFolder error %#lx\n", hr); hr = ITaskFolder_get_Name(subfolder, &bstr); ok (hr == S_OK, "get_Name error %#lx\n", hr); - ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = ITaskFolder_get_Path(subfolder, &bstr); ok(hr == S_OK, "get_Path error %#lx\n", hr); @@ -317,7 +313,7 @@ static void test_GetFolder(void) ok(hr == S_OK, "GetFolder error %#lx\n", hr); hr = ITaskFolder_get_Name(subfolder2, &bstr); ok (hr == S_OK, "get_Name error %#lx\n", hr); - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = ITaskFolder_get_Path(subfolder2, &bstr); ok(hr == S_OK, "get_Path error %#lx\n", hr); @@ -330,7 +326,7 @@ static void test_GetFolder(void)
hr = ITaskFolder_get_Name(subfolder2, &bstr); ok (hr == S_OK, "get_Name error %#lx\n", hr); - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = ITaskFolder_get_Path(subfolder2, &bstr); ok(hr == S_OK, "get_Path error %#lx\n", hr); @@ -406,12 +402,10 @@ static void set_var(int vt, VARIANT *var, LONG val)
static void test_FolderCollection(void) { - static WCHAR Wine[] = { '\','W','i','n','e',0 }; - static WCHAR Wine_Folder1[] = { '\','W','i','n','e','\','F','o','l','d','e','r','1',0 }; - static WCHAR Wine_Folder2[] = { '\','W','i','n','e','\','F','o','l','d','e','r','2',0 }; - static WCHAR Wine_Folder3[] = { '\','W','i','n','e','\','F','o','l','d','e','r','3',0 }; - static const WCHAR Folder1[] = { 'F','o','l','d','e','r','1',0 }; - static const WCHAR Folder2[] = { 'F','o','l','d','e','r','2',0 }; + static WCHAR Wine[] = L"\Wine"; + static WCHAR Wine_Folder1[] = L"\Wine\Folder1"; + static WCHAR Wine_Folder2[] = L"\Wine\Folder2"; + static WCHAR Wine_Folder3[] = L"\Wine\Folder3"; HRESULT hr; BSTR bstr; VARIANT v_null, var[3]; @@ -518,9 +512,9 @@ static void test_FolderCollection(void) hr = ITaskFolder_get_Name(subfolder, &bstr); ok(hr == S_OK, "get_Name error %#lx\n", hr); if (is_first) - ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); else - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr));
ITaskFolder_Release(subfolder);
@@ -541,9 +535,9 @@ static void test_FolderCollection(void) hr = ITaskFolder_get_Name(subfolder, &bstr); ok(hr == S_OK, "get_Name error %#lx\n", hr); if (is_first) - ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); else - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr);
ITaskFolder_Release(subfolder); @@ -604,9 +598,9 @@ static void test_FolderCollection(void) hr = ITaskFolder_get_Name((ITaskFolder *)V_DISPATCH(&var[0]), &bstr); ok(hr == S_OK, "get_Name error %#lx\n", hr); if (is_first) - ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); else - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); IDispatch_Release(V_DISPATCH(&var[0]));
@@ -650,9 +644,9 @@ static void test_FolderCollection(void) hr = ITaskFolder_get_Name(subfolder, &bstr); ok(hr == S_OK, "get_Name error %#lx\n", hr); if (is_first) - ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder1"), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); else - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"Folder2"), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr);
ITaskFolder_Release(subfolder); @@ -678,11 +672,11 @@ static void test_FolderCollection(void)
static void test_GetTask(void) { - static WCHAR Wine[] = { '\','W','i','n','e',0 }; - static WCHAR Wine_Task1[] = { '\','W','i','n','e','\','T','a','s','k','1',0 }; - static WCHAR Wine_Task2[] = { '\','W','i','n','e','\','T','a','s','k','2',0 }; - static WCHAR Task1[] = { 'T','a','s','k','1',0 }; - static WCHAR Task2[] = { 'T','a','s','k','2',0 }; + static WCHAR Wine[] = L"\Wine"; + static WCHAR Wine_Task1[] = L"\Wine\Task1"; + static WCHAR Wine_Task2[] = L"\Wine\Task2"; + static WCHAR Task1[] = L"Task1"; + static WCHAR Task2[] = L"Task2"; static WCHAR xml1[] = L"<?xml version=\"1.0\"?>\n" "<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task%5C%22%3E%5Cn" @@ -1225,18 +1219,6 @@ static void change_settings(ITaskDefinition *taskdef, struct settings *test)
static void test_daily_trigger(ITrigger *trigger) { - static const WCHAR startW[] = - {'2','0','0','4','-','0','1','-','0','1','T','0','0',':','0','0',':','0','0',0}; - static const WCHAR start2W[] = - {'2','0','0','4','-','0','1','-','0','1','T','0','0',':','0','0',':','0','0','Z',0}; - static const WCHAR start3W[] = - {'2','0','0','4','-','0','1','-','0','1','T','0','0',':','0','0',':','0','0','+','0','1',':','0','0',0}; - static const WCHAR start4W[] = - {'2','0','0','4','.','0','1','.','0','1','T','0','0','.','0','0','.','0','0',0}; - static const WCHAR start5W[] = - {'9','9','9','9','-','9','9','-','9','9','T','9','9',':','9','9',':','9','9',0}; - static const WCHAR start6W[] = - {'i','n','v','a','l','i','d',0}; static const struct { const WCHAR *str; @@ -1244,12 +1226,12 @@ static void test_daily_trigger(ITrigger *trigger) } start_test[] = { - {startW, S_OK}, - {start2W, S_OK}, - {start3W, S_OK}, - {start4W, S_OK}, - {start5W, S_OK}, - {start6W, S_OK}, + {L"2004-01-01T00:00:00", S_OK}, + {L"2004-01-01T00:00:00Z", S_OK}, + {L"2004-01-01T00:00:00+01:00", S_OK}, + {L"2004.01.01T00.00.00", S_OK}, + {L"9999-99-99T99:99:99", S_OK}, + {L"invalid", S_OK}, }; IDailyTrigger *daily_trigger; BSTR start_boundary; @@ -1333,10 +1315,10 @@ static void test_daily_trigger(ITrigger *trigger)
static void create_action(ITaskDefinition *taskdef) { - static WCHAR task1_exe[] = { 't','a','s','k','1','.','e','x','e',0 }; - static WCHAR workdir[] = { 'w','o','r','k','d','i','r',0 }; - static WCHAR args[] = { 'a','r','g','u','m','e','n','s',0 }; - static WCHAR comment[] = { 'c','o','m','m','e','n','t',0 }; + static WCHAR task1_exe[] = L"task1.exe"; + static WCHAR workdir[] = L"workdir"; + static WCHAR args[] = L"argumens"; + static WCHAR comment[] = L"comment"; HRESULT hr; IActionCollection *actions; IAction *action; @@ -1540,18 +1522,11 @@ static void test_TaskDefinition(void) " </Exec>\n" " </Actions>\n" "</Task>\n"; - static const WCHAR authorW[] = { 'a','u','t','h','o','r',0 }; - static const WCHAR versionW[] = { '1','.','0',0 }; - static const WCHAR dateW[] = { '2','0','1','8','-','0','4','-','0','2','T','1','1',':','2','2',':','3','3',0 }; - static const WCHAR docW[] = { 'd','o','c',0 }; - static const WCHAR uriW[] = { 'u','r','i',0 }; - static const WCHAR sourceW[] = { 's','o','u','r','c','e',0 }; - static WCHAR Task1[] = { '"','T','a','s','k','1','"',0 }; - static struct settings def_settings = { { 0 }, { 'P','T','7','2','H',0 }, { 0 }, + static struct settings def_settings = { L"", L"PT72H", L"", 0, 7, TASK_INSTANCES_IGNORE_NEW, TASK_COMPATIBILITY_V2, VARIANT_TRUE, VARIANT_TRUE, VARIANT_TRUE, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_TRUE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE }; - static struct settings new_settings = { { 'P','1','Y',0 }, { 'P','T','1','0','M',0 }, { 0 }, + static struct settings new_settings = { L"P1Y", L"PT10M", L"", 100, 1, TASK_INSTANCES_STOP_EXISTING, TASK_COMPATIBILITY_V1, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_TRUE, VARIANT_TRUE, VARIANT_FALSE, VARIANT_TRUE, VARIANT_TRUE, VARIANT_TRUE }; @@ -1633,7 +1608,7 @@ static void test_TaskDefinition(void)
hr = IRegistrationInfo_get_Description(reginfo, &bstr); ok(hr == S_OK, "get_Description error %#lx\n", hr); - ok(!lstrcmpW(bstr, Task1), "expected Task1, got %s\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L""Task1""), "expected "Task1", got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = IRegistrationInfo_put_Description(reginfo, NULL); ok(hr == S_OK, "put_Description error %#lx\n", hr); @@ -1644,7 +1619,7 @@ static void test_TaskDefinition(void)
hr = IRegistrationInfo_get_Author(reginfo, &bstr); ok(hr == S_OK, "get_Author error %#lx\n", hr); - ok(!lstrcmpW(bstr, authorW), "expected %s, got %s\n", wine_dbgstr_w(authorW), wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"author"), "expected author, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = IRegistrationInfo_put_Author(reginfo, NULL); ok(hr == S_OK, "put_Author error %#lx\n", hr); @@ -1655,7 +1630,7 @@ static void test_TaskDefinition(void)
hr = IRegistrationInfo_get_Version(reginfo, &bstr); ok(hr == S_OK, "get_Version error %#lx\n", hr); - ok(!lstrcmpW(bstr, versionW), "expected %s, got %s\n", wine_dbgstr_w(versionW), wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"1.0"), "expected 1.0, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = IRegistrationInfo_put_Version(reginfo, NULL); ok(hr == S_OK, "put_Version error %#lx\n", hr); @@ -1666,7 +1641,7 @@ static void test_TaskDefinition(void)
hr = IRegistrationInfo_get_Date(reginfo, &bstr); ok(hr == S_OK, "get_Date error %#lx\n", hr); - ok(!lstrcmpW(bstr, dateW), "expected %s, got %s\n", wine_dbgstr_w(dateW), wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"2018-04-02T11:22:33"), "expected 2018-04-02T11:22:33, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = IRegistrationInfo_put_Date(reginfo, NULL); ok(hr == S_OK, "put_Date error %#lx\n", hr); @@ -1677,7 +1652,7 @@ static void test_TaskDefinition(void)
hr = IRegistrationInfo_get_Documentation(reginfo, &bstr); ok(hr == S_OK, "get_Documentation error %#lx\n", hr); - ok(!lstrcmpW(bstr, docW), "expected %s, got %s\n", wine_dbgstr_w(docW), wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"doc"), "expected doc, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = IRegistrationInfo_put_Documentation(reginfo, NULL); ok(hr == S_OK, "put_Documentation error %#lx\n", hr); @@ -1688,7 +1663,7 @@ static void test_TaskDefinition(void)
hr = IRegistrationInfo_get_URI(reginfo, &bstr); ok(hr == S_OK, "get_URI error %#lx\n", hr); - ok(!lstrcmpW(bstr, uriW), "expected %s, got %s\n", wine_dbgstr_w(uriW), wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"uri"), "expected uri, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = IRegistrationInfo_put_URI(reginfo, NULL); ok(hr == S_OK, "put_URI error %#lx\n", hr); @@ -1699,7 +1674,7 @@ static void test_TaskDefinition(void)
hr = IRegistrationInfo_get_Source(reginfo, &bstr); ok(hr == S_OK, "get_Source error %#lx\n", hr); - ok(!lstrcmpW(bstr, sourceW), "expected %s, got %s\n", wine_dbgstr_w(sourceW), wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, L"source"), "expected source, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = IRegistrationInfo_put_Source(reginfo, NULL); ok(hr == S_OK, "put_Source error %#lx\n", hr);
From: Francois Gouget fgouget@codeweavers.com
--- dlls/taskschd/tests/scheduler.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index aa7b0754cb7..58c02832bcc 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -788,14 +788,16 @@ static void test_GetTask(void)
for (i = 0; i < ARRAY_SIZE(create_new_task); i++) { + winetest_push_context("%d", i); hr = ITaskFolder_RegisterTask(root, Wine_Task1, xml1, create_new_task[i].flags, v_null, v_null, TASK_LOGON_NONE, v_null, &task1); - ok(hr == create_new_task[i].hr, "%d: expected %#lx, got %#lx\n", i, create_new_task[i].hr, hr); + ok(hr == create_new_task[i].hr, "expected %#lx, got %#lx\n", create_new_task[i].hr, hr); if (hr == S_OK) { hr = ITaskFolder_DeleteTask(root, Wine_Task1, 0); ok(hr == S_OK, "DeleteTask error %#lx\n", hr); IRegisteredTask_Release(task1); } + winetest_pop_context(); }
hr = ITaskFolder_RegisterTask(root, Wine_Task1, NULL, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); @@ -1276,19 +1278,21 @@ static void test_daily_trigger(ITrigger *trigger)
for (i = 0; i < ARRAY_SIZE(start_test); i++) { + winetest_push_context("%lu", i); start_boundary = SysAllocString(start_test[i].str); hr = IDailyTrigger_put_StartBoundary(daily_trigger, start_boundary); - ok(hr == start_test[i].hr, "%lu: got %08lx expected %08lx\n", i, hr, start_test[i].hr); + ok(hr == start_test[i].hr, "got %08lx expected %08lx\n", hr, start_test[i].hr); SysFreeString(start_boundary); if (hr == S_OK) { start_boundary = NULL; hr = IDailyTrigger_get_StartBoundary(daily_trigger, &start_boundary); - ok(hr == S_OK, "%lu: got %08lx\n", i, hr); + ok(hr == S_OK, "got %08lx\n", hr); ok(start_boundary != NULL, "start_boundary not set\n"); - ok(!lstrcmpW(start_boundary, start_test[i].str), "%lu: got %s\n", i, wine_dbgstr_w(start_boundary)); + ok(!lstrcmpW(start_boundary, start_test[i].str), "got %s\n", wine_dbgstr_w(start_boundary)); SysFreeString(start_boundary); } + winetest_pop_context(); }
hr = IDailyTrigger_put_StartBoundary(daily_trigger, NULL);
From: Francois Gouget fgouget@codeweavers.com
Being in the administrator group is not sufficient. --- dlls/taskschd/tests/scheduler.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index 58c02832bcc..7f2c547a83d 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -29,6 +29,22 @@
#include <wine/test.h>
+static BOOL is_process_elevated(void) +{ + HANDLE token; + if (OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &token )) + { + TOKEN_ELEVATION_TYPE type; + DWORD size; + BOOL ret; + + ret = GetTokenInformation( token, TokenElevationType, &type, sizeof(type), &size ); + CloseHandle( token ); + return (ret && type == TokenElevationTypeFull); + } + return FALSE; +} + static void test_Connect(void) { WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1]; @@ -73,7 +89,8 @@ static void test_Connect(void) V_BSTR(&v_comp) = SysAllocString(comp_name);
hr = ITaskService_Connect(service, v_comp, v_null, v_null, v_null); - ok(hr == S_OK || hr == E_ACCESSDENIED /* not an administrator */, "Connect error %#lx\n", hr); + ok(hr == S_OK || (hr == E_ACCESSDENIED && !is_process_elevated()), + "Connect error %#lx\n", hr); was_connected = hr == S_OK; SysFreeString(V_BSTR(&v_comp));
From: Francois Gouget fgouget@codeweavers.com
This means skipping any test that requires creating a folder as the test would be unable to clean up after itself. Add a test to show that there is the same issue with tasks by creating one in the root folder.
Wine-Bug: https://bugs.winehq.org//show_bug.cgi?id=54106 --- dlls/taskschd/tests/Makefile.in | 2 +- dlls/taskschd/tests/scheduler.c | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/dlls/taskschd/tests/Makefile.in b/dlls/taskschd/tests/Makefile.in index 63424dab5b0..41898c12f3e 100644 --- a/dlls/taskschd/tests/Makefile.in +++ b/dlls/taskschd/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = taskschd.dll -IMPORTS = oleaut32 ole32 +IMPORTS = advapi32 oleaut32 ole32
C_SRCS = \ scheduler.c diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index 7f2c547a83d..6db3a86ba8a 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -22,6 +22,7 @@ #define COBJMACROS
#include "windef.h" +#include "winternl.h" #include "winbase.h" #include "initguid.h" #include "objbase.h" @@ -45,6 +46,21 @@ static BOOL is_process_elevated(void) return FALSE; }
+static BOOL check_win_version(int min_major, int min_minor) +{ + HMODULE hntdll = GetModuleHandleA("ntdll.dll"); + NTSTATUS (WINAPI *pRtlGetVersion)(RTL_OSVERSIONINFOEXW *); + RTL_OSVERSIONINFOEXW rtlver; + + rtlver.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); + pRtlGetVersion = (void *)GetProcAddress(hntdll, "RtlGetVersion"); + pRtlGetVersion(&rtlver); + return rtlver.dwMajorVersion > min_major || + (rtlver.dwMajorVersion == min_major && + rtlver.dwMinorVersion >= min_minor); +} +#define is_win8_plus() check_win_version(6, 2) + static void test_Connect(void) { WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1]; @@ -222,6 +238,12 @@ static void test_GetFolder(void) todo_wine ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#lx\n", hr);
+ if (!is_process_elevated() && !is_win8_plus()) + { + win_skip("Skipping CreateFolder tests because deleting folders requires elevated privileges on Windows 7\n"); + goto cleanup; + } + hr = ITaskFolder_CreateFolder(folder, Wine_Folder1_Folder2, v_null, &subfolder); ok(hr == S_OK, "CreateFolder error %#lx\n", hr); ITaskFolder_Release(subfolder); @@ -376,6 +398,7 @@ static void test_GetFolder(void) todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_NAME), "expected ERROR_INVALID_NAME, got %#lx\n", hr);
+ cleanup: ITaskFolder_Release(folder); ITaskService_Release(service); } @@ -436,6 +459,12 @@ static void test_FolderCollection(void) VARIANT idx; static const int vt[] = { VT_I1, VT_I2, VT_I4, VT_I8, VT_UI1, VT_UI2, VT_UI4, VT_UI8, VT_INT, VT_UINT };
+ if (!is_process_elevated() && !is_win8_plus()) + { + win_skip("Skipping ITaskFolderCollection tests because deleting folders requires elevated privileges on Windows 7\n"); + return; + } + hr = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskService, (void **)&service); if (hr != S_OK) { @@ -758,6 +787,12 @@ static void test_GetTask(void) IID iid; int i;
+ if (!is_process_elevated() && !is_win8_plus()) + { + win_skip("Skipping task creation tests because deleting anything requires elevated privileges on Windows 7\n"); + return; + } + hr = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskService, (void **)&service); if (hr != S_OK) { @@ -782,6 +817,13 @@ static void test_GetTask(void) ok(hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) /* win7 */, "expected ERROR_PATH_NOT_FOUND, got %#lx\n", hr);
+ hr = ITaskFolder_RegisterTask(root, Wine, xml1, TASK_CREATE, v_null, v_null, TASK_LOGON_NONE, v_null, NULL); + ok(hr == S_OK, "RegisterTask error %#lx\n", hr); + + /* Without elevated privileges this fails on Windows 7 */ + hr = ITaskFolder_DeleteTask(root, Wine, 0); + ok(hr == S_OK, "DeleteTask error %#lx\n", hr); + hr = ITaskFolder_CreateFolder(root, Wine, v_null, &folder); ok(hr == S_OK, "CreateFolder error %#lx\n", hr);