Implemented LockServiceDatabase and UnlockServiceDatabase

Alexander Yaworsky yaworsky at migusoft.ru
Thu Sep 2 00:26:56 CDT 2004


Hello

Introduced global shared memory object for locking SCM database.
Database is locked when this object extsts.
When StartServiceCtrlDispatcher is called it must somehow obtain service
name for naming global objects related with service (and for
SERVICE_WIN32_SHARE_PROCESS name is also required to select
service table entry).
Because at this moment database is locked we'll use shared memory
object capabilities as a bonus to pass service name from StartService
to StartServiceCtrlDispatcher across process boundary.

ChangeLog:

Implemented LockServiceDatabase and UnlockServiceDatabase


Index: dlls/advapi32/service.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/service.c,v
retrieving revision 1.51
diff -u -r1.51 service.c
--- dlls/advapi32/service.c 1 Sep 2004 17:29:00 -0000 1.51
+++ dlls/advapi32/service.c 2 Sep 2004 05:17:07 -0000
@@ -43,6 +43,8 @@
 static const WCHAR szServiceManagerKey[] = { 'S','y','s','t','e','m','\\',
       'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
       'S','e','r','v','i','c','e','s','\\',0 };
+static const WCHAR  szSCMLock[] = {'A','D','V','A','P','I','_','S','C','M',
+                                   'L','O','C','K',0};
 
 /******************************************************************************
  * SC_HANDLEs
@@ -286,8 +288,22 @@
  */
 LPVOID WINAPI LockServiceDatabase (SC_HANDLE hSCManager)
 {
-        FIXME("%p\n",hSCManager);
-        return (SC_HANDLE)0xcacacafe;
+    HANDLE ret;
+
+    TRACE("%p\n",hSCManager);
+
+    ret = CreateFileMappingW( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
+                              0, MAX_SERVICE_NAME * sizeof(WCHAR), szSCMLock );
+    if( ret && GetLastError() == ERROR_ALREADY_EXISTS )
+    {
+        CloseHandle( ret );
+        ret = NULL;
+        SetLastError( ERROR_SERVICE_DATABASE_LOCKED );
+    }
+
+    TRACE("returning %p\n", ret);
+
+    return ret;
 }
 
 /******************************************************************************
@@ -295,8 +311,9 @@
  */
 BOOL WINAPI UnlockServiceDatabase (LPVOID ScLock)
 {
-        FIXME(": %p\n",ScLock);
- return TRUE;
+    TRACE("%p\n",ScLock);
+
+    return CloseHandle( (HANDLE) ScLock );
 }
 
 /******************************************************************************




More information about the wine-patches mailing list