From: Zebediah Figura zfigura@codeweavers.com
The Rutoken driver installer tries to start this service, and fails if it doesn't exist.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54396 --- configure.ac | 1 + dlls/scardsvr/Makefile.in | 5 +++ dlls/scardsvr/scardsvr.c | 88 +++++++++++++++++++++++++++++++++++++ dlls/scardsvr/scardsvr.spec | 3 ++ loader/wine.inf.in | 16 +++++++ 5 files changed, 113 insertions(+) create mode 100644 dlls/scardsvr/Makefile.in create mode 100644 dlls/scardsvr/scardsvr.c create mode 100644 dlls/scardsvr/scardsvr.spec
diff --git a/configure.ac b/configure.ac index 9ff7c5e8914..2291449c4d0 100644 --- a/configure.ac +++ b/configure.ac @@ -2960,6 +2960,7 @@ WINE_CONFIG_MAKEFILE(dlls/sapi) WINE_CONFIG_MAKEFILE(dlls/sapi/tests) WINE_CONFIG_MAKEFILE(dlls/sas) WINE_CONFIG_MAKEFILE(dlls/scarddlg) +WINE_CONFIG_MAKEFILE(dlls/scardsvr) WINE_CONFIG_MAKEFILE(dlls/sccbase) WINE_CONFIG_MAKEFILE(dlls/schannel) WINE_CONFIG_MAKEFILE(dlls/schannel/tests) diff --git a/dlls/scardsvr/Makefile.in b/dlls/scardsvr/Makefile.in new file mode 100644 index 00000000000..c89e86c17d8 --- /dev/null +++ b/dlls/scardsvr/Makefile.in @@ -0,0 +1,5 @@ +MODULE = scardsvr.dll +IMPORTS = advapi32 + +C_SRCS = \ + scardsvr.c diff --git a/dlls/scardsvr/scardsvr.c b/dlls/scardsvr/scardsvr.c new file mode 100644 index 00000000000..5c4e26f5362 --- /dev/null +++ b/dlls/scardsvr/scardsvr.c @@ -0,0 +1,88 @@ +/* + * Smart card service + * + * Copyright 2014 Nikolay Sivov for CodeWeavers + * + * 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 "winbase.h" +#include "winsvc.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(winscard); + +static SERVICE_STATUS_HANDLE service_handle; +static HANDLE stop_event; + +static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_data, void *context) +{ + SERVICE_STATUS status; + + status.dwServiceType = SERVICE_WIN32; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP; + status.dwWin32ExitCode = 0; + status.dwServiceSpecificExitCode = 0; + status.dwCheckPoint = 0; + status.dwWaitHint = 0; + + switch(ctrl) + { + case SERVICE_CONTROL_STOP: + case SERVICE_CONTROL_SHUTDOWN: + TRACE("Shutting down.\n"); + status.dwCurrentState = SERVICE_STOP_PENDING; + status.dwControlsAccepted = 0; + SetServiceStatus(service_handle, &status); + SetEvent(stop_event); + return ERROR_SUCCESS; + + default: + FIXME("Got unknown control %#lx.\n", ctrl); + status.dwCurrentState = SERVICE_RUNNING; + SetServiceStatus(service_handle, &status); + return ERROR_SUCCESS; + } +} + +void WINAPI CalaisMain(DWORD argc, WCHAR **argv) +{ + SERVICE_STATUS status; + + TRACE("Starting service.\n"); + + stop_event = CreateEventW(NULL, TRUE, FALSE, NULL); + + if (!(service_handle = RegisterServiceCtrlHandlerExW(L"scardsvr", service_handler, NULL))) + return; + + status.dwServiceType = SERVICE_WIN32; + status.dwCurrentState = SERVICE_RUNNING; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; + status.dwWin32ExitCode = 0; + status.dwServiceSpecificExitCode = 0; + status.dwCheckPoint = 0; + status.dwWaitHint = 10000; + SetServiceStatus(service_handle, &status); + + WaitForSingleObject(stop_event, INFINITE); + + status.dwCurrentState = SERVICE_STOPPED; + status.dwControlsAccepted = 0; + SetServiceStatus(service_handle, &status); + TRACE("Service stopped.\n"); +} diff --git a/dlls/scardsvr/scardsvr.spec b/dlls/scardsvr/scardsvr.spec new file mode 100644 index 00000000000..5e13ea1221a --- /dev/null +++ b/dlls/scardsvr/scardsvr.spec @@ -0,0 +1,3 @@ +@ stdcall -private CalaisMain(long ptr) +@ stub InitSmartCardService +@ stub SvchostPushServiceGlobals diff --git a/loader/wine.inf.in b/loader/wine.inf.in index f1525c4f6dd..478f7a3d280 100644 --- a/loader/wine.inf.in +++ b/loader/wine.inf.in @@ -171,6 +171,7 @@ AddService=EventLog,0x800,EventLogService AddService=HTTP,0,HTTPService AddService=MSIServer,0,MSIService AddService=RpcSs,0,RpcSsService +AddService=scardsvr,0,ScardSvrService AddService=Spooler,0,SpoolerService AddService=StiSvc,0,StiService AddService=TermService,0,TerminalServices @@ -190,6 +191,7 @@ AddService=EventLog,0x800,EventLogService AddService=HTTP,0,HTTPService AddService=MSIServer,0,MSIService AddService=RpcSs,0,RpcSsService +AddService=scardsvr,0,ScardSvrService AddService=Spooler,0,SpoolerService AddService=StiSvc,0,StiService AddService=TermService,0,TerminalServices @@ -209,6 +211,7 @@ AddService=EventLog,0x800,EventLogService AddService=HTTP,0,HTTPService AddService=MSIServer,0,MSIService AddService=RpcSs,0,RpcSsService +AddService=scardsvr,0,ScardSvrService AddService=Spooler,0,SpoolerService AddService=StiSvc,0,StiService AddService=TermService,0,TerminalServices @@ -228,6 +231,7 @@ AddService=EventLog,0x800,EventLogService AddService=HTTP,0,HTTPService AddService=MSIServer,0,MSIService AddService=RpcSs,0,RpcSsService +AddService=scardsvr,0,ScardSvrService AddService=Spooler,0,SpoolerService AddService=StiSvc,0,StiService AddService=TermService,0,TerminalServices @@ -2321,6 +2325,18 @@ ServiceType=32 StartType=3 ErrorControl=1
+[ScardSvrService] +AddReg=ScardSvrServiceKeys +ServiceBinary="%11%\svchost.exe -k netsvcs" +ServiceType=32 +StartType=3 +ErrorControl=1 + +[ScardSvrServiceKeys] +HKR,Parameters,"ServiceDll",,"%11%\scardsvr.dll" +HKR,Parameters,"ServiceMain",,"CalaisMain" +HKLM,%CurrentVersionNT%\SvcHost,"netsvcs",0x00010000,"scardsvr" + [SpoolerService] AddReg=SpoolerServiceKeys Description="Loads files to memory for later printing"