HRESULT __cdecl SchRpcRegisterTask(const WCHAR *path, const WCHAR *xml, DWORD flags, const WCHAR *sddl, DWORD task_logon_type, DWORD n_creds, const TASK_USER_CRED *creds, WCHAR **actual_path, TASK_XML_ERROR_INFO **xml_error_info) { WCHAR *full_name, *relative_path; DWORD disposition; HRESULT hr; WINE_TRACE("%s,%s,%#x,%s,%u,%u,%p,%p,%p\n", wine_dbgstr_w(path), wine_dbgstr_w(xml), flags, wine_dbgstr_w(sddl), task_logon_type, n_creds, creds, actual_path, xml_error_info); *actual_path = NULL; *xml_error_info = NULL; /* FIXME: assume that validation is performed on the client side */ if (flags & TASK_VALIDATE_ONLY) return S_OK; full_name = get_full_name(path, &relative_path); if (!full_name) return E_OUTOFMEMORY; if (strchrW(path, '\\') || strchrW(path, '/')) { WCHAR *p = strrchrW(full_name, '/'); if (!p) p = strrchrW(full_name, '\\'); *p = 0; hr = create_directory(full_name); *p = '\\'; } switch (flags & (TASK_CREATE | TASK_UPDATE)) { default: case TASK_CREATE: disposition = CREATE_NEW; break; case TASK_UPDATE: disposition = OPEN_EXISTING; break; case (TASK_CREATE | TASK_UPDATE): disposition = OPEN_ALWAYS; break; } hr = write_xml_utf8(full_name, disposition, xml); if (hr == S_OK) { *actual_path = heap_strdupW(relative_path); schedsvc_auto_start(); } heap_free(full_name); return hr; }
HRESULT __cdecl SchRpcRegisterTask(const WCHAR *path, const WCHAR *xml, DWORD flags, const WCHAR *sddl, DWORD task_logon_type, DWORD n_creds, const TASK_USER_CRED *creds, WCHAR **actual_path, TASK_XML_ERROR_INFO **xml_error_info) { WCHAR *full_name, *relative_path; DWORD disposition; HRESULT hr; TRACE("%s,%s,%#x,%s,%u,%u,%p,%p,%p\n", debugstr_w(path), debugstr_w(xml), flags, debugstr_w(sddl), task_logon_type, n_creds, creds, actual_path, xml_error_info); *actual_path = NULL; *xml_error_info = NULL; /* FIXME: assume that validation is performed on the client side */ if (flags & TASK_VALIDATE_ONLY) return S_OK; if (path) { full_name = get_full_name(path, &relative_path); if (!full_name) return E_OUTOFMEMORY; if (strchrW(path, '\\') || strchrW(path, '/')) { WCHAR *p = strrchrW(full_name, '/'); if (!p) p = strrchrW(full_name, '\\'); *p = 0; hr = create_directory(full_name); if (hr != S_OK && hr != HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) { heap_free(full_name); return hr; } *p = '\\'; } } else { IID iid; WCHAR uuid_str[39]; UuidCreate(&iid); StringFromGUID2(&iid, uuid_str, 39); full_name = get_full_name(uuid_str, &relative_path); if (!full_name) return E_OUTOFMEMORY; /* skip leading '\' */ relative_path++; } switch (flags & (TASK_CREATE | TASK_UPDATE)) { default: case TASK_CREATE: disposition = CREATE_NEW; break; case TASK_UPDATE: disposition = OPEN_EXISTING; break; case (TASK_CREATE | TASK_UPDATE): disposition = OPEN_ALWAYS; break; } hr = write_xml_utf8(full_name, disposition, xml); if (hr == S_OK) { *actual_path = heap_strdupW(relative_path); schedsvc_auto_start(); } heap_free(full_name); return hr; }