- use RPC for communication with lsass
- start lsass.exe on startup
Modified: trunk/reactos/bootdata/hivesft.inf
Modified: trunk/reactos/bootdata/packages/reactos.dff
Modified: trunk/reactos/include/idl/idl.xml
Added: trunk/reactos/include/idl/lsa.idl
Modified: trunk/reactos/lib/advapi32/advapi32.h
Modified: trunk/reactos/lib/advapi32/advapi32.xml
Modified: trunk/reactos/lib/advapi32/sec/lsa.c
Modified: trunk/reactos/lib/advapi32/service/scm.c
Modified: trunk/reactos/lib/advapi32/service/sctrl.c
Deleted: trunk/reactos/lib/lsasrv/lsaport.c
Added: trunk/reactos/lib/lsasrv/lsarpc.c
Modified: trunk/reactos/lib/lsasrv/lsasrv.c
Modified: trunk/reactos/lib/lsasrv/lsasrv.xml
Modified: trunk/reactos/subsys/system/winlogon/winlogon.c

Modified: trunk/reactos/bootdata/hivesft.inf
--- trunk/reactos/bootdata/hivesft.inf	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/bootdata/hivesft.inf	2006-01-15 13:19:57 UTC (rev 20890)
@@ -737,6 +737,7 @@
 ;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\system32\cmd.exe"
 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe"
 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartServices",0x00010001,0x00000001
+HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartLsass",0x00010001,0x00000001
 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartGUI",0x00010001,0x00000000
 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Userinit",0x00020000,"%SystemRoot%\system32\userinit.exe"
 

Modified: trunk/reactos/bootdata/packages/reactos.dff
--- trunk/reactos/bootdata/packages/reactos.dff	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/bootdata/packages/reactos.dff	2006-01-15 13:19:57 UTC (rev 20890)
@@ -193,6 +193,7 @@
 subsys\system\explorer\notifyhook\notifyhook.dll 1
 subsys\system\format\format.exe         1
 subsys\system\ibrowser\ibrowser.exe     1
+subsys\system\lsass\lsass.exe           1
 subsys\system\msconfig\msconfig.exe     1
 subsys\system\msiexec\msiexec.exe       1
 subsys\system\notepad\notepad.exe       1

Modified: trunk/reactos/include/idl/idl.xml
--- trunk/reactos/include/idl/idl.xml	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/include/idl/idl.xml	2006-01-15 13:19:57 UTC (rev 20890)
@@ -35,4 +35,16 @@
 	<define name="_X86_" />
 	<file switches="--oldnames">eventlogrpc.idl</file>
 </module>
+<module name="lsa_server" type="rpcserver">
+	<include base="ReactOS">.</include>
+	<include base="ReactOS">w32api/include</include>
+	<define name="_X86_" />
+	<file switches="--oldnames">lsa.idl</file>
+</module>
+<module name="lsa_client" type="rpcclient">
+	<include base="ReactOS">.</include>
+	<include base="ReactOS">w32api/include</include>
+	<define name="_X86_" />
+	<file switches="--oldnames">lsa.idl</file>
+</module>
 </group>

Added: trunk/reactos/include/idl/lsa.idl
--- trunk/reactos/include/idl/lsa.idl	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/include/idl/lsa.idl	2006-01-15 13:19:57 UTC (rev 20890)
@@ -0,0 +1,42 @@
+/*
+ * Local Security Authority interface definition
+ */
+
+#define BYTE unsigned char
+#define DWORD unsigned int
+#define BOOL unsigned long
+#define LPBYTE unsigned char*
+#define LPDWORD unsigned long*
+#define LSA_HANDLE unsigned long
+#define NTSTATUS unsigned int
+
+[
+  uuid(12345778-1234-abcd-ef00-0123456789ab),
+  version(0.0),
+  pointer_default(unique),
+  explicit_handle
+]
+interface lsarpc
+{
+/*
+    cpp_quote("#if 0")
+    typedef [handle, unique] wchar_t *LPWSTR;
+    typedef [handle, unique] char *LPSTR;
+    cpp_quote("#endif")
+    typedef [context_handle] void *LSA_HANDLE;
+    typedef LSA_HANDLE *PLSA_HANDLE;
+    typedef unsigned int NTSTATUS;
+*/
+
+    cpp_quote("#if 0")
+    typedef struct _LSA_UNICODE_STRING {
+	    unsigned short Length;
+	    unsigned short MaximumLength;
+	    [size_is(MaximumLength)] wchar_t *Buffer;
+    } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
+    cpp_quote("#endif")
+
+    /* Function 0 */
+    NTSTATUS LsarClose(handle_t BindingHandle,
+                       [in] LSA_HANDLE ObjectHandle);
+}
Property changes on: trunk/reactos/include/idl/lsa.idl
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/advapi32/advapi32.h
--- trunk/reactos/lib/advapi32/advapi32.h	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/advapi32/advapi32.h	2006-01-15 13:19:57 UTC (rev 20890)
@@ -24,6 +24,10 @@
 /* this has to go after the NDK when being used with the NDK */
 #include <ntsecapi.h>
 
+#include <services/services.h>
+#include "svcctl_c.h"
+#include "lsa_c.h"
+
 #ifndef HAS_FN_PROGRESSW
 #define FN_PROGRESSW FN_PROGRESS
 #endif

Modified: trunk/reactos/lib/advapi32/advapi32.xml
--- trunk/reactos/lib/advapi32/advapi32.xml	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/advapi32/advapi32.xml	2006-01-15 13:19:57 UTC (rev 20890)
@@ -2,11 +2,13 @@
 	<importlibrary definition="advapi32.def" />
 	<include base="advapi32">.</include>
 	<include base="scm_client">.</include>
+	<include base="lsa_client">.</include>
 	<define name="__USE_W32API" />
 	<define name="WINVER">0x600</define>
 	<define name="_WIN32_IE">0x0500</define>
 	<define name="_WIN32_WINNT">0x0600</define>
 	<library>scm_client</library>
+	<library>lsa_client</library>
 	<library>ntdll</library>
 	<library>kernel32</library>
 	<library>rpcrt4</library>

Modified: trunk/reactos/lib/advapi32/sec/lsa.c
--- trunk/reactos/lib/advapi32/sec/lsa.c	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/advapi32/sec/lsa.c	2006-01-15 13:19:57 UTC (rev 20890)
@@ -16,24 +16,80 @@
 #define NDEBUG
 #include <debug.h>
 
+static handle_t LSABindingHandle = NULL;
 
-#ifndef SID_REVISION /* FIXME - Winnt.h */
-#define	SID_REVISION (1)	/* Current revision */
-#endif
+static VOID
+LSAHandleUnbind(handle_t *Handle)
+{
+    RPC_STATUS status;
 
+    if (*Handle == NULL)
+        return;
 
+    status = RpcBindingFree(Handle);
+    if (status)
+    {
+        DPRINT1("RpcBindingFree returned 0x%x\n", status);
+    }
+}
+
+static VOID
+LSAHandleBind(VOID)
+{
+    LPWSTR pszStringBinding;
+    RPC_STATUS status;
+    handle_t Handle;
+
+    if (LSABindingHandle != NULL)
+        return;
+
+    status = RpcStringBindingComposeW(NULL,
+                                      L"ncacn_np",
+                                      NULL,
+                                      L"\\pipe\\lsarpc",
+                                      NULL,
+                                      &pszStringBinding);
+    if (status)
+    {
+        DPRINT1("RpcStringBindingCompose returned 0x%x\n", status);
+        return;
+    }
+
+    /* Set the binding handle that will be used to bind to the server. */
+    status = RpcBindingFromStringBindingW(pszStringBinding,
+                                          &Handle);
+    if (status)
+    {
+        DPRINT1("RpcBindingFromStringBinding returned 0x%x\n", status);
+    }
+
+    status = RpcStringFreeW(&pszStringBinding);
+    if (status)
+    {
+        DPRINT1("RpcStringFree returned 0x%x\n", status);
+    }
+
+    if (InterlockedCompareExchangePointer(&LSABindingHandle,
+                                          (PVOID)Handle,
+                                          NULL) != NULL)
+    {
+        LSAHandleUnbind(&Handle);
+    }
+}
+
+
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS STDCALL
 LsaClose(LSA_HANDLE ObjectHandle)
 {
-  static int count = 0;
-  if (count++ < 20)
-  {
-     DPRINT1("(%p):LsaClose stub\n",ObjectHandle);
-  }
-  return 0xc0000000;
+    DPRINT("LsaClose(0x%p) called\n", ObjectHandle);
+
+    LSAHandleBind();
+
+    return LsarClose(LSABindingHandle,
+                     (unsigned long)ObjectHandle);
 }
 
 /*
@@ -187,7 +243,7 @@
     PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
     PLSA_TRANSLATED_NAME *Names)
 {
-  return STATUS_NOT_IMPLEMENTED;
+  return STATUS_NONE_MAPPED;
 }
 
 /******************************************************************************

Modified: trunk/reactos/lib/advapi32/service/scm.c
--- trunk/reactos/lib/advapi32/service/scm.c	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/advapi32/service/scm.c	2006-01-15 13:19:57 UTC (rev 20890)
@@ -13,7 +13,6 @@
 /* INCLUDES ******************************************************************/
 
 #include <advapi32.h>
-#include "svcctl_c.h"
 
 #define NDEBUG
 #include <debug.h>

Modified: trunk/reactos/lib/advapi32/service/sctrl.c
--- trunk/reactos/lib/advapi32/service/sctrl.c	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/advapi32/service/sctrl.c	2006-01-15 13:19:57 UTC (rev 20890)
@@ -13,7 +13,6 @@
 /* INCLUDES ******************************************************************/
 
 #include <advapi32.h>
-#include <services/services.h>
 
 #define NDEBUG
 #include <debug.h>

Deleted: trunk/reactos/lib/lsasrv/lsaport.c
--- trunk/reactos/lib/lsasrv/lsaport.c	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/lsasrv/lsaport.c	2006-01-15 13:19:57 UTC (rev 20890)
@@ -1,179 +0,0 @@
-/*
- */
-
-#define WIN32_NO_STATUS
-#include <windows.h>
-#define NTOS_MODE_USER
-#include <ndk/ntndk.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-
-HANDLE PortThreadHandle = NULL;
-HANDLE ConnectPortHandle = NULL;
-HANDLE MessagePortHandle = NULL;
-
-
-static NTSTATUS
-InitializeLsaPort(VOID)
-{
-  OBJECT_ATTRIBUTES ObjectAttributes;
-  UNICODE_STRING PortName;
-  PORT_MESSAGE Request;
-  NTSTATUS Status;
-
-  ConnectPortHandle = NULL;
-  MessagePortHandle = NULL;
-
-  RtlInitUnicodeString(&PortName,
-                       L"\\SeLsaCommandPort");
-
-  InitializeObjectAttributes(&ObjectAttributes,
-			     &PortName,
-			     0,
-			     NULL,
-			     NULL);
-
-  Status = NtCreatePort(&ConnectPortHandle,
-			&ObjectAttributes,
-			0,
-			0x100,
-			0x2000);
-  if (!NT_SUCCESS(Status))
-    {
-      DPRINT1("NtCreatePort() failed (Status %lx)\n", Status);
-      goto ByeBye;
-    }
-
-  Status = NtListenPort(ConnectPortHandle,
-			&Request);
-  if (!NT_SUCCESS(Status))
-    {
-      DPRINT1("NtListenPort() failed (Status %lx)\n", Status);
-      goto ByeBye;
-    }
-
-  Status = NtAcceptConnectPort(&MessagePortHandle,
-			       ConnectPortHandle,
-			       NULL,
-			       TRUE,
-			       NULL,
-			       NULL);
-  if (!NT_SUCCESS (Status))
-    {
-      DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status);
-      goto ByeBye;
-    }
-
-  Status = NtCompleteConnectPort (MessagePortHandle);
-  if (!NT_SUCCESS (Status))
-    {
-      DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status);
-      goto ByeBye;
-    }
-
-ByeBye:
-  if (!NT_SUCCESS (Status))
-    {
-      if (ConnectPortHandle != NULL)
-	NtClose (ConnectPortHandle);
-
-      if (MessagePortHandle != NULL)
-	NtClose (MessagePortHandle);
-    }
-
-  return Status;
-}
-
-
-static NTSTATUS
-ProcessPortMessage(VOID)
-{
-  PORT_MESSAGE Request;
-//  LPC_MAX_MESSAGE Reply;
-  NTSTATUS Status;
-
-
-  DPRINT1("ProcessPortMessage() called\n");
-
-  Status = STATUS_SUCCESS;
-
-  for (;;)
-    {
-      Status = NtReplyWaitReceivePort(MessagePortHandle,
-				      0,
-				      NULL,
-				      &Request);
-      if (!NT_SUCCESS(Status))
-	{
-	  DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
-	  break;
-	}
-
-      DPRINT("Received message\n");
-
-      if (Request.u2.s2.Type == LPC_PORT_CLOSED)
-	{
-	  DPRINT("Port closed\n");
-
-//	  return STATUS_UNSUCCESSFUL;
-	}
-      if (Request.u2.s2.Type == LPC_REQUEST)
-	{
-	  DPRINT("Received request\n");
-
-	}
-      else if (Request.u2.s2.Type == LPC_DATAGRAM)
-	{
-	  DPRINT("Received datagram\n");
-
-//	  Message = (PIO_ERROR_LOG_MESSAGE)&Request.Data;
-
-	}
-    }
-
-  return Status;
-}
-
-
-static NTSTATUS STDCALL
-PortThreadRoutine(PVOID Param)
-{
-  NTSTATUS Status = STATUS_SUCCESS;
-
-  Status = InitializeLsaPort();
-  if (!NT_SUCCESS(Status))
-    return Status;
-
-  while (NT_SUCCESS(Status))
-    {
-      Status = ProcessPortMessage();
-    }
-
-  if (ConnectPortHandle != NULL)
-    NtClose (ConnectPortHandle);
-
-  if (MessagePortHandle != NULL)
-    NtClose (MessagePortHandle);
-
-  return Status;
-}
-
-
-BOOLEAN
-StartLsaPortThread(VOID)
-{
-  DWORD ThreadId;
-
-  PortThreadHandle = CreateThread(NULL,
-				  0x1000,
-				  (LPTHREAD_START_ROUTINE)PortThreadRoutine,
-				  NULL,
-				  0,
-				  &ThreadId);
-
-  return (PortThreadHandle != NULL);
-}
-
-/* EOF */

Added: trunk/reactos/lib/lsasrv/lsarpc.c
--- trunk/reactos/lib/lsasrv/lsarpc.c	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/lsasrv/lsarpc.c	2006-01-15 13:19:57 UTC (rev 20890)
@@ -0,0 +1,67 @@
+/* INCLUDES ****************************************************************/
+
+#define WIN32_NO_STATUS
+#include <windows.h>
+#include <ntsecapi.h>
+#define NTOS_MODE_USER
+#include <ndk/ntndk.h>
+
+#include "lsa_s.h"
+
+#define NDEBUG
+#include <debug.h>
+
+
+/* GLOBALS *****************************************************************/
+
+/* VARIABLES ***************************************************************/
+
+
+/* FUNCTIONS ***************************************************************/
+
+VOID
+LsarStartRpcServer(VOID)
+{
+    RPC_STATUS Status;
+
+    DPRINT("LsarStartRpcServer() called");
+
+    Status = RpcServerUseProtseqEpW(L"ncacn_np",
+                                    10,
+                                    L"\\pipe\\lsarpc",
+                                    NULL);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
+        return;
+    }
+
+    Status = RpcServerRegisterIf(lsarpc_ServerIfHandle,
+                                 NULL,
+                                 NULL);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);
+        return;
+    }
+
+    Status = RpcServerListen(1, 20, TRUE);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);
+        return;
+    }
+
+    DPRINT("LsarStartRpcServer() done");
+}
+
+/* Function 0 */
+unsigned int
+LsarClose(IN handle_t BindingHandle,
+          IN unsigned long ObjectHandle)
+{
+    DPRINT1("LsarClose(0x%p) called!\n", ObjectHandle);
+    return STATUS_INVALID_HANDLE;
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/lsasrv/lsarpc.c
___________________________________________________________________
Name: svn:keywords
   + author date revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/lsasrv/lsasrv.c
--- trunk/reactos/lib/lsasrv/lsasrv.c	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/lsasrv/lsasrv.c	2006-01-15 13:19:57 UTC (rev 20890)
@@ -3,22 +3,42 @@
 #define NTOS_MODE_USER
 #include <ndk/ntndk.h>
 
-#include <lsass/lsasrv.h>
-
 #define NDEBUG
 #include <debug.h>
 
-VOID StartLsaPortThread(VOID);
+VOID LsarStartRpcServer(VOID);
 
 
 NTSTATUS STDCALL
 LsapInitLsa(VOID)
 {
-  DPRINT1("LsapInitLsa() called\n");
+    HANDLE hEvent;
 
-  StartLsaPortThread();
+    DPRINT1("LsapInitLsa() called\n");
 
-  return STATUS_SUCCESS;
+    LsarStartRpcServer();
+
+    hEvent = OpenEventW(EVENT_MODIFY_STATE,
+                        FALSE,
+                        L"\\SECURITY_SERVICES_STARTED");
+    if (hEvent != NULL)
+    {
+        SetEvent(hEvent);
+        CloseHandle(hEvent);
+    }
+    return STATUS_SUCCESS;
 }
 
+void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
+{
+    return RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, len);
+}
+
+
+void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
+{
+    RtlFreeHeap(RtlGetProcessHeap(), 0, ptr);
+}
+
+
 /* EOF */

Modified: trunk/reactos/lib/lsasrv/lsasrv.xml
--- trunk/reactos/lib/lsasrv/lsasrv.xml	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/lib/lsasrv/lsasrv.xml	2006-01-15 13:19:57 UTC (rev 20890)
@@ -1,14 +1,19 @@
 <module name="lsasrv" type="win32dll" baseaddress="${BASEADDRESS_LSASRV}" entrypoint="0" installbase="system32" installname="lsasrv.dll">
 	<importlibrary definition="lsasrv.def" />
 	<include base="lsasrv">.</include>
+	<include base="lsa_server">.</include>
 	<define name="UNICODE" />
 	<define name="_UNICODE" />
 	<define name="__USE_W32API" />
+	<define name="WINVER">0x600</define>
+	<define name="_WIN32_WINNT">0x0600</define>
 	<linkerflag>-nostartfiles</linkerflag>
 	<linkerflag>-nostdlib</linkerflag>
+	<library>lsa_server</library>
 	<library>ntdll</library>
 	<library>kernel32</library>
-	<file>lsaport.c</file>
+	<library>rpcrt4</library>
+	<file>lsarpc.c</file>
 	<file>lsasrv.c</file>
 	<file>lsasrv.rc</file>
 </module>

Modified: trunk/reactos/subsys/system/winlogon/winlogon.c
--- trunk/reactos/subsys/system/winlogon/winlogon.c	2006-01-15 12:30:17 UTC (rev 20889)
+++ trunk/reactos/subsys/system/winlogon/winlogon.c	2006-01-15 13:19:57 UTC (rev 20890)
@@ -16,7 +16,7 @@
 #include <debug.h>
 
 #define SUPPORT_CONSOLESTART 1
-#define START_LSASS          0
+#define START_LSASS          1
 
 /* GLOBALS ******************************************************************/
 
@@ -161,11 +161,12 @@
    BOOLEAN Result;
    STARTUPINFO StartupInfo;
    PROCESS_INFORMATION ProcessInformation;
+   WCHAR ServiceString[] = L"lsass.exe";
 
    LsassInitEvent = CreateEvent(NULL,
                                 TRUE,
                                 FALSE,
-                                L"\\LsassInitDone");
+                                L"\\SECURITY_SERVICES_STARTED");
 
    if (LsassInitEvent == NULL)
      {
@@ -183,10 +184,10 @@
    StartupInfo.cbReserved2 = 0;
    StartupInfo.lpReserved2 = 0;
 
-   Result = CreateProcess(L"lsass.exe",
+   Result = CreateProcess(NULL,
+                          ServiceString,
                           NULL,
                           NULL,
-                          NULL,
                           FALSE,
                           DETACHED_PROCESS,
                           NULL,
@@ -199,7 +200,6 @@
         return(FALSE);
      }
 
-   DPRINT("WL: Waiting for lsass\n");
    WaitForSingleObject(LsassInitEvent, INFINITE);
    CloseHandle(LsassInitEvent);