mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
- Lsasrv: Create the LsaAuthenticationPort and add a basic server loop that listens to incoming requests.
- Lsalib: Combine request and reply data of the register request into a connection info struct. My test application can now connect to the LsaAuthenticationPort. svn path=/trunk/; revision=44793
This commit is contained in:
parent
050435c284
commit
b837d58c19
6 changed files with 220 additions and 25 deletions
139
reactos/dll/win32/lsasrv/authport.c
Normal file
139
reactos/dll/win32/lsasrv/authport.c
Normal file
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* PROJECT: Local Security Authority Server DLL
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: dll/win32/lsasrv/authport.c
|
||||
* PURPOSE: LsaAuthenticationPort server routines
|
||||
* COPYRIGHT: Copyright 2009 Eric Kohl
|
||||
*/
|
||||
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#define NTOS_MODE_USER
|
||||
#include <ndk/ntndk.h>
|
||||
|
||||
#include "lsass.h"
|
||||
#include "lsasrv.h"
|
||||
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
|
||||
|
||||
|
||||
static HANDLE PortThreadHandle = NULL;
|
||||
static HANDLE AuthPortHandle = NULL;
|
||||
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
NTSTATUS WINAPI
|
||||
AuthPortThreadRoutine(PVOID Param)
|
||||
{
|
||||
LSASS_REQUEST Request;
|
||||
PPORT_MESSAGE Reply = NULL;
|
||||
NTSTATUS Status;
|
||||
|
||||
NTSTATUS Status2;
|
||||
|
||||
HANDLE ConnectionHandle = NULL;
|
||||
PVOID Context = NULL;
|
||||
BOOLEAN Accept;
|
||||
|
||||
TRACE("AuthPortThreadRoutine() called\n");
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
Status = NtReplyWaitReceivePort(AuthPortHandle,
|
||||
0,
|
||||
Reply,
|
||||
&Request.Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
|
||||
break;
|
||||
}
|
||||
|
||||
TRACE("Received message\n");
|
||||
|
||||
if (Request.Header.u2.s2.Type == LPC_CONNECTION_REQUEST)
|
||||
{
|
||||
TRACE("Port connection request\n");
|
||||
|
||||
Accept = TRUE;
|
||||
Status2 = NtAcceptConnectPort(&ConnectionHandle,
|
||||
&Context,
|
||||
&Request.Header,
|
||||
Accept,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
|
||||
Status2 = NtCompleteConnectPort(ConnectionHandle);
|
||||
|
||||
}
|
||||
else if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED ||
|
||||
Request.Header.u2.s2.Type == LPC_CLIENT_DIED)
|
||||
{
|
||||
TRACE("Port closed or client died request\n");
|
||||
|
||||
// return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
else if (Request.Header.u2.s2.Type == LPC_REQUEST)
|
||||
{
|
||||
TRACE("Received request (Type: %lu)\n", Request.Type);
|
||||
|
||||
}
|
||||
else if (Request.Header.u2.s2.Type == LPC_DATAGRAM)
|
||||
{
|
||||
TRACE("Received datagram\n");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
StartAuthenticationPort(VOID)
|
||||
{
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING PortName;
|
||||
DWORD ThreadId;
|
||||
NTSTATUS Status;
|
||||
|
||||
RtlInitUnicodeString(&PortName,
|
||||
L"\\LsaAuthenticationPort");
|
||||
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&PortName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
Status = NtCreatePort(&AuthPortHandle,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
0x100,
|
||||
0x2000);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
TRACE("NtCreatePort() failed (Status %lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
PortThreadHandle = CreateThread(NULL,
|
||||
0x1000,
|
||||
(LPTHREAD_START_ROUTINE)AuthPortThreadRoutine,
|
||||
NULL,
|
||||
0,
|
||||
&ThreadId);
|
||||
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,3 +1,13 @@
|
|||
/*
|
||||
* PROJECT: Local Security Authority Server DLL
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: dll/win32/lsasrv/lsasrv.c
|
||||
* PURPOSE: Main file
|
||||
* COPYRIGHT: Copyright 2006-2009 Eric Kohl
|
||||
*/
|
||||
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#define NTOS_MODE_USER
|
||||
|
@ -10,17 +20,20 @@
|
|||
WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
|
||||
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
NTSTATUS WINAPI
|
||||
LsapInitLsa(VOID)
|
||||
{
|
||||
HANDLE hEvent;
|
||||
DWORD dwError;
|
||||
|
||||
TRACE("LsapInitLsa()\n");
|
||||
TRACE("LsapInitLsa() called\n");
|
||||
|
||||
/* Start the RPC server */
|
||||
LsarStartRpcServer();
|
||||
|
||||
TRACE("Creating notification event!\n");
|
||||
/* Notify the service manager */
|
||||
hEvent = CreateEventW(NULL,
|
||||
TRUE,
|
||||
|
@ -43,10 +56,13 @@ LsapInitLsa(VOID)
|
|||
}
|
||||
}
|
||||
|
||||
TRACE("Set notification event!\n");
|
||||
SetEvent(hEvent);
|
||||
|
||||
/* NOTE: Do not close the event handle!!!! */
|
||||
|
||||
StartAuthenticationPort();
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,11 +2,13 @@
|
|||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: Local Security Authority (LSA) Server
|
||||
* FILE: reactos/dll/win32/lsasrv/lsasrv.h
|
||||
* PURPOSE:
|
||||
* PURPOSE: Common header file
|
||||
*
|
||||
* PROGRAMMERS: Eric Kohl
|
||||
*/
|
||||
|
||||
/* authport.c */
|
||||
NTSTATUS StartAuthenticationPort(VOID);
|
||||
|
||||
/* lsarpc.c */
|
||||
VOID LsarStartRpcServer(VOID);
|
||||
|
||||
|
|
|
@ -2,11 +2,13 @@
|
|||
<importlibrary definition="lsasrv.spec" />
|
||||
<include base="lsasrv">.</include>
|
||||
<include base="lsa_server">.</include>
|
||||
<include base="ReactOS">include/reactos/subsys/lsass</include>
|
||||
<library>lsa_server</library>
|
||||
<library>wine</library>
|
||||
<library>rpcrt4</library>
|
||||
<library>ntdll</library>
|
||||
<library>pseh</library>
|
||||
<file>authport.c</file>
|
||||
<file>lsarpc.c</file>
|
||||
<file>lsasrv.c</file>
|
||||
<file>lsasrv.rc</file>
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
|
||||
#include <ntsecapi.h>
|
||||
|
||||
#define LSASS_MAX_LOGON_PROCESS_NAME_LENGTH 127
|
||||
|
||||
#define LSASS_REQUEST_REGISTER_LOGON_PROCESS (1)
|
||||
#define LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE (2)
|
||||
#define LSASS_REQUEST_DEREGISTER_LOGON_PROCESS (3)
|
||||
|
@ -96,6 +98,16 @@ typedef struct _LSASS_REGISTER_LOGON_PROCESS_REPLY
|
|||
LSA_OPERATIONAL_MODE OperationalMode;
|
||||
} LSASS_REGISTER_LOGON_PROCESS_REPLY, *PLSASS_REGISTER_LOGON_PROCESS_REPLY;
|
||||
|
||||
|
||||
typedef struct _LSASS_CONNECT_DATA
|
||||
{
|
||||
NTSTATUS Status;
|
||||
LSA_OPERATIONAL_MODE OperationalMode;
|
||||
ULONG Length;
|
||||
CHAR LogonProcessNameBuffer[LSASS_MAX_LOGON_PROCESS_NAME_LENGTH + 1];
|
||||
} LSASS_CONNECT_DATA, *PLSASS_CONNECT_DATA;
|
||||
|
||||
|
||||
typedef union _LSASS_REQUEST
|
||||
{
|
||||
PORT_MESSAGE Header;
|
||||
|
|
|
@ -35,7 +35,7 @@ LsaDeregisterLogonProcess(HANDLE LsaHandle)
|
|||
Request.Header.u1.s1.DataLength = 0;
|
||||
Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
|
||||
Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS;
|
||||
Status = NtRequestWaitReplyPort(LsaHandle,
|
||||
Status = ZwRequestWaitReplyPort(LsaHandle,
|
||||
&Request.Header,
|
||||
&Reply.Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -59,7 +59,7 @@ NTSTATUS WINAPI
|
|||
LsaConnectUntrusted(PHANDLE LsaHandle)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
@ -98,7 +98,7 @@ LsaCallAuthenticationPackage(HANDLE LsaHandle,
|
|||
ProtocolSubmitBuffer,
|
||||
SubmitBufferLength);
|
||||
|
||||
Status = NtRequestWaitReplyPort(LsaHandle,
|
||||
Status = ZwRequestWaitReplyPort(LsaHandle,
|
||||
&Request->Header,
|
||||
&Reply->Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -154,7 +154,7 @@ LsaLookupAuthenticationPackage(HANDLE LsaHandle,
|
|||
sizeof(PORT_MESSAGE);
|
||||
Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE;
|
||||
|
||||
Status = NtRequestWaitReplyPort(LsaHandle,
|
||||
Status = ZwRequestWaitReplyPort(LsaHandle,
|
||||
&Request->Header,
|
||||
&Reply.Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -245,7 +245,7 @@ LsaLogonUser(HANDLE LsaHandle,
|
|||
|
||||
Reply = (PLSASS_REPLY)&RawReply;
|
||||
|
||||
Status = NtRequestWaitReplyPort(LsaHandle,
|
||||
Status = ZwRequestWaitReplyPort(LsaHandle,
|
||||
&Request->Header,
|
||||
&Reply->Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -285,26 +285,49 @@ LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
|
|||
PHANDLE Handle,
|
||||
PLSA_OPERATIONAL_MODE OperationalMode)
|
||||
{
|
||||
UNICODE_STRING Portname = RTL_CONSTANT_STRING(L"\\SeLsaCommandPort");
|
||||
UNICODE_STRING PortName; // = RTL_CONSTANT_STRING(L"\\LsaAuthenticationPort");
|
||||
SECURITY_QUALITY_OF_SERVICE SecurityQos;
|
||||
ULONG ConnectInfoLength;
|
||||
NTSTATUS Status;
|
||||
LSASS_REQUEST Request;
|
||||
LSASS_REPLY Reply;
|
||||
LSASS_CONNECT_DATA ConnectInfo;
|
||||
// LSASS_REQUEST Request;
|
||||
// LSASS_REPLY Reply;
|
||||
|
||||
ConnectInfoLength = 0;
|
||||
Status = NtConnectPort(Handle,
|
||||
&Portname,
|
||||
NULL,
|
||||
NULL,
|
||||
/* Check the logon process name length */
|
||||
if (LsaLogonProcessName->Length > LSASS_MAX_LOGON_PROCESS_NAME_LENGTH)
|
||||
return STATUS_NAME_TOO_LONG;
|
||||
|
||||
RtlInitUnicodeString(&PortName,
|
||||
L"\\LsaAuthenticationPort");
|
||||
|
||||
SecurityQos.Length = sizeof (SecurityQos);
|
||||
SecurityQos.ImpersonationLevel = SecurityIdentification;
|
||||
SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
|
||||
SecurityQos.EffectiveOnly = TRUE;
|
||||
|
||||
ConnectInfoLength = sizeof(LSASS_CONNECT_DATA);
|
||||
|
||||
strncpy(ConnectInfo.LogonProcessNameBuffer,
|
||||
LsaLogonProcessName->Buffer,
|
||||
LsaLogonProcessName->Length);
|
||||
ConnectInfo.Length = LsaLogonProcessName->Length;
|
||||
ConnectInfo.LogonProcessNameBuffer[ConnectInfo.Length] = '\0';
|
||||
|
||||
Status = ZwConnectPort(Handle,
|
||||
&PortName,
|
||||
&SecurityQos,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&ConnectInfo,
|
||||
&ConnectInfoLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return Status;
|
||||
}
|
||||
|
||||
return Status;
|
||||
#if 0
|
||||
Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS;
|
||||
Request.Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) -
|
||||
sizeof(PORT_MESSAGE);
|
||||
|
@ -315,26 +338,27 @@ LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
|
|||
LsaLogonProcessName->Buffer,
|
||||
Request.d.RegisterLogonProcessRequest.Length);
|
||||
|
||||
Status = NtRequestWaitReplyPort(*Handle,
|
||||
Status = ZwRequestWaitReplyPort(*Handle,
|
||||
&Request.Header,
|
||||
&Reply.Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
NtClose(*Handle);
|
||||
*Handle = NULL;
|
||||
// NtClose(*Handle);
|
||||
// *Handle = NULL;
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(Reply.Status))
|
||||
{
|
||||
NtClose(*Handle);
|
||||
*Handle = NULL;
|
||||
// NtClose(*Handle);
|
||||
// *Handle = NULL;
|
||||
return Status;
|
||||
}
|
||||
|
||||
*OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode;
|
||||
|
||||
return Reply.Status;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -347,7 +371,7 @@ LsaEnumerateLogonSessions(PULONG LogonSessionCount,
|
|||
PLUID *LogonSessionList)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
@ -360,7 +384,7 @@ LsaGetLogonSessionData(PLUID LogonId,
|
|||
PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
@ -373,7 +397,7 @@ LsaRegisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS Inform
|
|||
HANDLE NotificationEventHandle)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
@ -386,5 +410,5 @@ LsaUnregisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS Info
|
|||
HANDLE NotificationEventHandle)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue