diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf
index f94a1b4fe95..02ab3b3bfb1 100644
--- a/reactos/bootdata/hivesft.inf
+++ b/reactos/bootdata/hivesft.inf
@@ -737,6 +737,7 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Tonga Standard Tim
;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"
diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff
index 0d5aeae9485..4bb902a32f3 100755
--- a/reactos/bootdata/packages/reactos.dff
+++ b/reactos/bootdata/packages/reactos.dff
@@ -193,6 +193,7 @@ subsys\system\explorer\explorer-cfg-template.xml 4
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
diff --git a/reactos/include/idl/idl.xml b/reactos/include/idl/idl.xml
index 5b6598ce7c5..bf2143ebc50 100644
--- a/reactos/include/idl/idl.xml
+++ b/reactos/include/idl/idl.xml
@@ -35,4 +35,16 @@
eventlogrpc.idl
+
+ .
+ w32api/include
+
+ lsa.idl
+
+
+ .
+ w32api/include
+
+ lsa.idl
+
diff --git a/reactos/include/idl/lsa.idl b/reactos/include/idl/lsa.idl
new file mode 100644
index 00000000000..12eed465ac5
--- /dev/null
+++ b/reactos/include/idl/lsa.idl
@@ -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);
+}
diff --git a/reactos/lib/advapi32/advapi32.h b/reactos/lib/advapi32/advapi32.h
index 9f3e0113989..a89d320a5eb 100644
--- a/reactos/lib/advapi32/advapi32.h
+++ b/reactos/lib/advapi32/advapi32.h
@@ -24,6 +24,10 @@
/* this has to go after the NDK when being used with the NDK */
#include
+#include
+#include "svcctl_c.h"
+#include "lsa_c.h"
+
#ifndef HAS_FN_PROGRESSW
#define FN_PROGRESSW FN_PROGRESS
#endif
diff --git a/reactos/lib/advapi32/advapi32.xml b/reactos/lib/advapi32/advapi32.xml
index 437b5e2285e..ae610410c65 100644
--- a/reactos/lib/advapi32/advapi32.xml
+++ b/reactos/lib/advapi32/advapi32.xml
@@ -2,11 +2,13 @@
.
.
+ .
0x600
0x0500
0x0600
scm_client
+ lsa_client
ntdll
kernel32
rpcrt4
diff --git a/reactos/lib/advapi32/sec/lsa.c b/reactos/lib/advapi32/sec/lsa.c
index 993f9b21949..53266065307 100644
--- a/reactos/lib/advapi32/sec/lsa.c
+++ b/reactos/lib/advapi32/sec/lsa.c
@@ -16,24 +16,80 @@
#define NDEBUG
#include
+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 @@ LsaLookupSids(
PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
PLSA_TRANSLATED_NAME *Names)
{
- return STATUS_NOT_IMPLEMENTED;
+ return STATUS_NONE_MAPPED;
}
/******************************************************************************
diff --git a/reactos/lib/advapi32/service/scm.c b/reactos/lib/advapi32/service/scm.c
index 0f61b3e2686..33c914d3ef2 100644
--- a/reactos/lib/advapi32/service/scm.c
+++ b/reactos/lib/advapi32/service/scm.c
@@ -13,7 +13,6 @@
/* INCLUDES ******************************************************************/
#include
-#include "svcctl_c.h"
#define NDEBUG
#include
diff --git a/reactos/lib/advapi32/service/sctrl.c b/reactos/lib/advapi32/service/sctrl.c
index 55604d16c7b..6435f05edcd 100644
--- a/reactos/lib/advapi32/service/sctrl.c
+++ b/reactos/lib/advapi32/service/sctrl.c
@@ -13,7 +13,6 @@
/* INCLUDES ******************************************************************/
#include
-#include
#define NDEBUG
#include
diff --git a/reactos/lib/lsasrv/lsaport.c b/reactos/lib/lsasrv/lsaport.c
deleted file mode 100644
index 282f5e6709c..00000000000
--- a/reactos/lib/lsasrv/lsaport.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- */
-
-#define WIN32_NO_STATUS
-#include
-#define NTOS_MODE_USER
-#include
-
-//#define NDEBUG
-#include
-
-
-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 */
diff --git a/reactos/lib/lsasrv/lsarpc.c b/reactos/lib/lsasrv/lsarpc.c
new file mode 100644
index 00000000000..812c864a3f3
--- /dev/null
+++ b/reactos/lib/lsasrv/lsarpc.c
@@ -0,0 +1,67 @@
+/* INCLUDES ****************************************************************/
+
+#define WIN32_NO_STATUS
+#include
+#include
+#define NTOS_MODE_USER
+#include
+
+#include "lsa_s.h"
+
+#define NDEBUG
+#include
+
+
+/* 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 */
diff --git a/reactos/lib/lsasrv/lsasrv.c b/reactos/lib/lsasrv/lsasrv.c
index 6f16a7c88fd..fdefea9a051 100644
--- a/reactos/lib/lsasrv/lsasrv.c
+++ b/reactos/lib/lsasrv/lsasrv.c
@@ -3,22 +3,42 @@
#define NTOS_MODE_USER
#include
-#include
-
#define NDEBUG
#include
-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 */
diff --git a/reactos/lib/lsasrv/lsasrv.xml b/reactos/lib/lsasrv/lsasrv.xml
index 56d861f8d7f..fcaf7d58109 100644
--- a/reactos/lib/lsasrv/lsasrv.xml
+++ b/reactos/lib/lsasrv/lsasrv.xml
@@ -1,14 +1,19 @@
.
+ .
+ 0x600
+ 0x0600
-nostartfiles
-nostdlib
+ lsa_server
ntdll
kernel32
- lsaport.c
+ rpcrt4
+ lsarpc.c
lsasrv.c
lsasrv.rc
diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c
index fb541a9ab44..5cc8fd883c1 100644
--- a/reactos/subsys/system/winlogon/winlogon.c
+++ b/reactos/subsys/system/winlogon/winlogon.c
@@ -16,7 +16,7 @@
#include
#define SUPPORT_CONSOLESTART 1
-#define START_LSASS 0
+#define START_LSASS 1
/* GLOBALS ******************************************************************/
@@ -161,11 +161,12 @@ StartLsass (VOID)
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,8 +184,8 @@ StartLsass (VOID)
StartupInfo.cbReserved2 = 0;
StartupInfo.lpReserved2 = 0;
- Result = CreateProcess(L"lsass.exe",
- NULL,
+ Result = CreateProcess(NULL,
+ ServiceString,
NULL,
NULL,
FALSE,
@@ -199,7 +200,6 @@ StartLsass (VOID)
return(FALSE);
}
- DPRINT("WL: Waiting for lsass\n");
WaitForSingleObject(LsassInitEvent, INFINITE);
CloseHandle(LsassInitEvent);