Module: wine Branch: master Commit: aff181e6d9c352182ef44e917af47c8be8571d3b URL: https://gitlab.winehq.org/wine/wine/-/commit/aff181e6d9c352182ef44e917af47c8...
Author: Zebediah Figura zfigura@codeweavers.com Date: Sun Jan 29 16:07:51 2023 -0600
scardsvr: Add stub service.
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 | 2 ++ configure.ac | 1 + dlls/scardsvr/Makefile.in | 5 +++ dlls/scardsvr/scardsvr.c | 88 +++++++++++++++++++++++++++++++++++++++++++++ dlls/scardsvr/scardsvr.spec | 3 ++ loader/wine.inf.in | 17 +++++++++ 6 files changed, 116 insertions(+)
diff --git a/configure b/configure index 759a59410df..25bffe3c8eb 100755 --- a/configure +++ b/configure @@ -1358,6 +1358,7 @@ enable_sane_ds enable_sapi enable_sas enable_scarddlg +enable_scardsvr enable_sccbase enable_schannel enable_schedsvc @@ -21590,6 +21591,7 @@ wine_fn_config_makefile dlls/sapi enable_sapi wine_fn_config_makefile dlls/sapi/tests enable_tests wine_fn_config_makefile dlls/sas enable_sas wine_fn_config_makefile dlls/scarddlg enable_scarddlg +wine_fn_config_makefile dlls/scardsvr enable_scardsvr wine_fn_config_makefile dlls/sccbase enable_sccbase wine_fn_config_makefile dlls/schannel enable_schannel wine_fn_config_makefile dlls/schannel/tests enable_tests diff --git a/configure.ac b/configure.ac index 2b0e0eaccff..8a6d21702cc 100644 --- a/configure.ac +++ b/configure.ac @@ -2961,6 +2961,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..c33a1aa6569 --- /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 58013064753..a306b07dc26 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,19 @@ ServiceType=32 StartType=3 ErrorControl=1
+[ScardSvrService] +AddReg=ScardSvrServiceKeys +DisplayName="Smart card server" +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",0x00010008,"scardsvr" + [SpoolerService] AddReg=SpoolerServiceKeys Description="Loads files to memory for later printing"