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);