schedsvc: Add ATSvc server side stubs.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Dmitry Timoshkov 2018-04-05 15:55:39 +08:00 committed by Alexandre Julliard
parent 6af0e50f36
commit 10688c5f91
5 changed files with 180 additions and 7 deletions

View File

@ -2,7 +2,10 @@ MODULE = schedsvc.dll
IMPORTS = rpcrt4 advapi32 ole32
C_SRCS = \
atsvc.c \
schedsvc.c \
svc_main.c
IDL_SRCS = schrpc.idl
IDL_SRCS = \
atsvc.idl \
schrpc.idl

View File

@ -0,0 +1,52 @@
/*
* ATSvc RPC API
*
* Copyright 2018 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include "windef.h"
#include "atsvc.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(schedsvc);
DWORD __cdecl NetrJobAdd(ATSVC_HANDLE server_name, AT_INFO *info, DWORD *jobid)
{
FIXME("%s,%p,%p: stub\n", debugstr_w(server_name), info, jobid);
return ERROR_NOT_SUPPORTED;
}
DWORD __cdecl NetrJobDel(ATSVC_HANDLE server_name, DWORD min_jobid, DWORD max_jobid)
{
FIXME("%s,%u,%u: stub\n", debugstr_w(server_name), min_jobid, max_jobid);
return ERROR_NOT_SUPPORTED;
}
DWORD __cdecl NetrJobEnum(ATSVC_HANDLE server_name, AT_ENUM_CONTAINER *container,
DWORD max_length, DWORD *total, DWORD *resume)
{
FIXME("%s,%p,%u,%p,%p: stub\n", debugstr_w(server_name), container, max_length, total, resume);
return ERROR_NOT_SUPPORTED;
}
DWORD __cdecl NetrJobGetInfo(ATSVC_HANDLE server_name, DWORD jobid, AT_INFO **info)
{
FIXME("%s,%u,%p: stub\n", debugstr_w(server_name), jobid, info);
return ERROR_NOT_SUPPORTED;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright 2018 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#pragma makedep server
#include "wine/atsvc.idl"

View File

@ -24,6 +24,7 @@
#include "winbase.h"
#include "winsvc.h"
#include "rpc.h"
#include "atsvc.h"
#include "schrpc.h"
#include "wine/debug.h"
@ -123,22 +124,38 @@ static RPC_BINDING_VECTOR *sched_bindings;
static RPC_STATUS RPC_init(void)
{
WCHAR transport[] = SCHEDSVC_TRANSPORT;
static WCHAR ncacn_npW[] = { 'n','c','a','c','n','_','n','p',0 };
static WCHAR endpoint_npW[] = { '\\','p','i','p','e','\\','a','t','s','v','c',0 };
static WCHAR ncalrpcW[] = { 'n','c','a','l','r','p','c',0 };
static WCHAR endpoint_lrpcW[] = { 'a','t','s','v','c',0 };
RPC_STATUS status;
TRACE("using %s\n", debugstr_w(transport));
status = RpcServerRegisterIf(ITaskSchedulerService_v1_0_s_ifspec, NULL, NULL);
if (status != RPC_S_OK)
{
ERR("RpcServerRegisterIf error %#x\n", status);
return status;
}
status = RpcServerUseProtseqEpW(transport, 0, NULL, NULL);
status = RpcServerRegisterIf(atsvc_v1_0_s_ifspec, NULL, NULL);
if (status != RPC_S_OK)
{
ERR("RpcServerRegisterIf error %#x\n", status);
RpcServerUnregisterIf(ITaskSchedulerService_v1_0_s_ifspec, NULL, FALSE);
return status;
}
status = RpcServerUseProtseqEpW(ncacn_npW, RPC_C_PROTSEQ_MAX_REQS_DEFAULT, endpoint_npW, NULL);
if (status != RPC_S_OK)
{
ERR("RpcServerUseProtseqEp error %#x\n", status);
return status;
}
status = RpcServerRegisterIf(ITaskSchedulerService_v1_0_s_ifspec, 0, 0);
status = RpcServerUseProtseqEpW(ncalrpcW, RPC_C_PROTSEQ_MAX_REQS_DEFAULT, endpoint_lrpcW, NULL);
if (status != RPC_S_OK)
{
ERR("RpcServerRegisterIf error %#x\n", status);
ERR("RpcServerUseProtseqEp error %#x\n", status);
return status;
}
@ -156,6 +173,13 @@ static RPC_STATUS RPC_init(void)
return status;
}
status = RpcEpRegisterW(atsvc_v1_0_s_ifspec, sched_bindings, NULL, NULL);
if (status != RPC_S_OK)
{
ERR("RpcEpRegister error %#x\n", status);
return status;
}
status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, TRUE);
if (status != RPC_S_OK)
{
@ -169,8 +193,10 @@ static void RPC_finish(void)
{
RpcMgmtStopServerListening(NULL);
RpcEpUnregister(ITaskSchedulerService_v1_0_s_ifspec, sched_bindings, NULL);
RpcEpUnregister(atsvc_v1_0_s_ifspec, sched_bindings, NULL);
RpcBindingVectorFree(&sched_bindings);
RpcServerUnregisterIf(NULL, NULL, FALSE);
RpcServerUnregisterIf(ITaskSchedulerService_v1_0_s_ifspec, NULL, FALSE);
RpcServerUnregisterIf(atsvc_v1_0_s_ifspec, NULL, FALSE);
}
void WINAPI ServiceMain(DWORD argc, LPWSTR *argv)

View File

@ -0,0 +1,71 @@
/*
* ATSvc Service definitions
*
* Copyright 2018 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
import "oaidl.idl";
import "ocidl.idl";
[
uuid(1ff70682-0a51-30e8-076d-740be8cee98b),
implicit_handle(handle_t rpc_handle),
version(1.0),
pointer_default(unique)
]
interface atsvc
{
typedef [handle] const WCHAR *ATSVC_HANDLE;
typedef struct _AT_ENUM
{
DWORD JobId;
DWORD_PTR JobTime;
DWORD DaysOfMonth;
unsigned char DaysOfWeek;
unsigned char Flags;
[string] WCHAR *Command;
} AT_ENUM, *PAT_ENUM, *LPAT_ENUM;
typedef struct _AT_INFO
{
DWORD_PTR JobTime;
DWORD DaysOfMonth;
unsigned char DaysOfWeek;
unsigned char Flags;
[string] WCHAR *Command;
} AT_INFO, *PAT_INFO, *LPAT_INFO;
typedef struct _AT_ENUM_CONTAINER
{
DWORD EntriesRead;
[size_is(EntriesRead)] LPAT_ENUM Buffer;
} AT_ENUM_CONTAINER, *PAT_ENUM_CONTAINER, *LPAT_ENUM_CONTAINER;
DWORD NetrJobAdd([in,string,unique] ATSVC_HANDLE ServerName,
[in] LPAT_INFO pAtInfo, [out] LPDWORD pJobId);
DWORD NetrJobDel([in,string,unique] ATSVC_HANDLE ServerName,
[in] DWORD MinJobId, [in] DWORD MaxJobId);
DWORD NetrJobEnum([in,string,unique] ATSVC_HANDLE ServerName,
[in,out] LPAT_ENUM_CONTAINER pEnumContainer, [in] DWORD PreferedMaximumLength,
[out] LPDWORD pTotalEntries, [in,out,unique] LPDWORD pResumeHandle);
DWORD NetrJobGetInfo([in,string,unique] ATSVC_HANDLE ServerName,
[in] DWORD JobId, [out] LPAT_INFO *ppAtInfo);
}