mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 13:34:53 +00:00
[LSASRV]
Add beginning of the user mode part of the SRM server. svn path=/branches/kernel-fun/; revision=62293
This commit is contained in:
parent
c2f355e9b8
commit
d7aa49ecc2
|
@ -6,7 +6,39 @@
|
|||
* COPYRIGHT: Copyright 2006-2009 Eric Kohl
|
||||
*/
|
||||
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include "lsasrv.h"
|
||||
#include <ndk/ntndk.h>
|
||||
|
||||
typedef struct _LSAP_RM_API_MESSAGE
|
||||
{
|
||||
PORT_MESSAGE Header;
|
||||
ULONG ApiNumber;
|
||||
union
|
||||
{
|
||||
UCHAR Fill[PORT_MAXIMUM_MESSAGE_LENGTH - sizeof(PORT_MESSAGE)];
|
||||
struct
|
||||
{
|
||||
ULONG Info1;
|
||||
} WriteLog;
|
||||
|
||||
} u;
|
||||
} LSAP_RM_API_MESSAGE, *PLSAP_RM_API_MESSAGE;
|
||||
|
||||
enum _LSAP_API_NUMBER
|
||||
{
|
||||
LsapAdtWriteLogApi = 1,
|
||||
LsapComponentTestApi,
|
||||
LsapAsyncApi
|
||||
};
|
||||
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
HANDLE SeLsaCommandPort;
|
||||
HANDLE SeRmCommandPort;
|
||||
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
|
@ -128,6 +160,230 @@ LsaIFree_LSAPR_PRIVILEGE_SET(IN PLSAPR_PRIVILEGE_SET Ptr)
|
|||
}
|
||||
|
||||
|
||||
VOID
|
||||
WINAPI
|
||||
LsapComponentTest(
|
||||
PLSAP_RM_API_MESSAGE Message)
|
||||
{
|
||||
ERR("Security: LSA Component Test Command Received\n");
|
||||
|
||||
}
|
||||
|
||||
VOID
|
||||
WINAPI
|
||||
LsapAdtWriteLog(
|
||||
PLSAP_RM_API_MESSAGE Message)
|
||||
{
|
||||
ERR("LsapAdtWriteLog\n");
|
||||
}
|
||||
|
||||
VOID
|
||||
WINAPI
|
||||
LsapAsync(
|
||||
PLSAP_RM_API_MESSAGE Message)
|
||||
{
|
||||
ERR("LsapAsync\n");
|
||||
}
|
||||
|
||||
DWORD
|
||||
WINAPI
|
||||
LsapRmServerThread(
|
||||
PVOID StartContext)
|
||||
{
|
||||
LSAP_RM_API_MESSAGE Message;
|
||||
PPORT_MESSAGE ReplyMessage;
|
||||
REMOTE_PORT_VIEW RemotePortView;
|
||||
HANDLE MessagePort, DummyPortHandle;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Initialize the port message */
|
||||
Message.Header.u1.s1.TotalLength = sizeof(Message);
|
||||
Message.Header.u1.s1.DataLength = 0;
|
||||
|
||||
/* Listen on the LSA command port */
|
||||
Status = NtListenPort(SeLsaCommandPort, &Message.Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmServerThread - Port Listen failed 0x%lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Setup the Port View Structure */
|
||||
RemotePortView.Length = sizeof(REMOTE_PORT_VIEW);
|
||||
RemotePortView.ViewSize = 0;
|
||||
RemotePortView.ViewBase = NULL;
|
||||
|
||||
/* Accept the connection */
|
||||
Status = NtAcceptConnectPort(&MessagePort,
|
||||
0,
|
||||
&Message.Header,
|
||||
TRUE,
|
||||
NULL,
|
||||
&RemotePortView);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmServerThread - Port Accept Connect failed 0x%lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Complete the connection */
|
||||
Status = NtCompleteConnectPort(MessagePort);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmServerThread - Port Complete Connect failed 0x%lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* No reply yet */
|
||||
ReplyMessage = NULL;
|
||||
|
||||
/* Start looping */
|
||||
while (TRUE)
|
||||
{
|
||||
/* Wait for a message */
|
||||
Status = NtReplyWaitReceivePort(MessagePort,
|
||||
NULL,
|
||||
ReplyMessage,
|
||||
&Message.Header);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmServerThread - Failed to get message: 0x%lx", Status);
|
||||
ReplyMessage = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if this is a connection request */
|
||||
if (Message.Header.u2.s2.Type == LPC_CONNECTION_REQUEST)
|
||||
{
|
||||
/* Reject connection request */
|
||||
NtAcceptConnectPort(&DummyPortHandle,
|
||||
NULL,
|
||||
&Message.Header,
|
||||
FALSE,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
/* Start over */
|
||||
ReplyMessage = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if this is an actual request */
|
||||
if (Message.Header.u2.s2.Type == LPC_REQUEST)
|
||||
{
|
||||
ReplyMessage = &Message.Header;
|
||||
|
||||
switch (Message.ApiNumber)
|
||||
{
|
||||
case LsapAdtWriteLogApi:
|
||||
LsapAdtWriteLog(&Message);
|
||||
break;
|
||||
|
||||
case LsapAsyncApi:
|
||||
LsapAsync(&Message);
|
||||
break;
|
||||
|
||||
case LsapComponentTestApi:
|
||||
LsapComponentTest(&Message);
|
||||
break;
|
||||
|
||||
default:
|
||||
ERR("LsapRmServerThread - invalid API number: 0x%lx\n",
|
||||
Message.ApiNumber);
|
||||
ReplyMessage = NULL;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
ERR("LsapRmServerThread - unexpected message type: 0x%lx\n",
|
||||
Message.Header.u2.s2.Type);
|
||||
|
||||
/* Start over */
|
||||
ReplyMessage = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
WINAPI
|
||||
LsapRmInitializeServer(
|
||||
VOID)
|
||||
{
|
||||
UNICODE_STRING Name;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
SECURITY_QUALITY_OF_SERVICE SecurityQos;
|
||||
HANDLE InitEvent;
|
||||
HANDLE ThreadHandle;
|
||||
DWORD ThreadId;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Create the LSA command port */
|
||||
RtlInitUnicodeString(&Name, L"\\SeLsaCommandPort");
|
||||
InitializeObjectAttributes(&ObjectAttributes, &Name, 0, NULL, NULL);
|
||||
Status = NtCreatePort(&SeLsaCommandPort,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
PORT_MAXIMUM_MESSAGE_LENGTH,
|
||||
2 * PAGE_SIZE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmInitializeServer - Port Create failed 0x%lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Open the LSA init event */
|
||||
RtlInitUnicodeString(&Name, L"\\SeLsaInitEvent");
|
||||
InitializeObjectAttributes(&ObjectAttributes, &Name, 0, NULL, NULL);
|
||||
Status = NtOpenEvent(&InitEvent, 2, &ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmInitializeServer - Lsa Init Event Open failed 0x%lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Signal the kernel, that we are ready */
|
||||
Status = NtSetEvent(InitEvent, 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmInitializeServer - Set Init Event failed 0x%lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Setup the QoS structure */
|
||||
SecurityQos.ImpersonationLevel = SecurityIdentification;
|
||||
SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
|
||||
SecurityQos.EffectiveOnly = TRUE;
|
||||
|
||||
/* Connect to the kernel server */
|
||||
RtlInitUnicodeString(&Name, L"\\SeRmCommandPort");
|
||||
Status = NtConnectPort(&SeRmCommandPort,
|
||||
&Name,
|
||||
&SecurityQos,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmInitializeServer - Connect to Rm Command Port failed 0x%lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Create the server thread */
|
||||
ThreadHandle = CreateThread(NULL, 0, LsapRmServerThread, NULL, 0, &ThreadId);
|
||||
if (ThreadHandle == NULL)
|
||||
{
|
||||
ERR("LsapRmInitializeServer - Create Thread failed 0x%lx\n", Status);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* Close the server thread handle */
|
||||
CloseHandle(ThreadHandle);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS WINAPI
|
||||
LsapInitLsa(VOID)
|
||||
{
|
||||
|
@ -140,6 +396,14 @@ LsapInitLsa(VOID)
|
|||
/* Initialize the well known SIDs */
|
||||
LsapInitSids();
|
||||
|
||||
/* Initialize the SRM server */
|
||||
Status = LsapRmInitializeServer();
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("LsapRmInitializeServer() failed (Status 0x%08lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Initialize the LSA database */
|
||||
LsapInitDatabase();
|
||||
|
||||
|
|
Loading…
Reference in a new issue