[LSASRV]
[reactos.git] / reactos / dll / win32 / lsasrv / session.c
index 90e0342..def8fe7 100644 (file)
@@ -64,7 +64,10 @@ LsapGetLogonSession(IN PLUID LogonId)
 
 
 NTSTATUS
-LsapSetLogonSessionData(IN PLUID LogonId)
+LsapSetLogonSessionData(
+    _In_ PLUID LogonId,
+    _In_ ULONG LogonType,
+    _In_ PUNICODE_STRING UserName)
 {
     PLSAP_LOGON_SESSION Session;
 
@@ -74,6 +77,17 @@ LsapSetLogonSessionData(IN PLUID LogonId)
     if (Session == NULL)
         return STATUS_NO_SUCH_LOGON_SESSION;
 
+    TRACE("LogonType %lu\n", LogonType);
+    Session->LogonType = LogonType;
+
+    TRACE("UserName %wZ\n", UserName);
+    Session->UserName.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, UserName->MaximumLength);
+    if (Session->UserName.Buffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Session->UserName.Length = UserName->Length;
+    Session->UserName.MaximumLength = UserName->MaximumLength;
+    RtlCopyMemory(Session->UserName.Buffer, UserName->Buffer, UserName->MaximumLength);
 
     return STATUS_SUCCESS;
 }
@@ -105,6 +119,7 @@ LsapCreateLogonSession(IN PLUID LogonId)
     TRACE("LsapCreateLogonSession(<0x%lx,0x%lx>)\n",
           LogonId->HighPart, LogonId->LowPart);
 
+    /* Tell ntoskrnl to create a new logon session */
     Status = LsapRmCreateLogonSession(LogonId);
     if (!NT_SUCCESS(Status))
     {
@@ -125,6 +140,7 @@ NTAPI
 LsapDeleteLogonSession(IN PLUID LogonId)
 {
     PLSAP_LOGON_SESSION Session;
+    NTSTATUS Status;
 
     TRACE("LsapDeleteLogonSession(%p)\n", LogonId);
 
@@ -133,6 +149,14 @@ LsapDeleteLogonSession(IN PLUID LogonId)
     if (Session == NULL)
         return STATUS_NO_SUCH_LOGON_SESSION;
 
+    TRACE("LsapDeleteLogonSession(<0x%lx,0x%lx>)\n",
+          LogonId->HighPart, LogonId->LowPart);
+
+    /* Tell ntoskrnl to delete the logon session */
+    Status = LsapRmDeleteLogonSession(LogonId);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
     /* Remove the session entry from the list */
     RemoveEntryList(&Session->Entry);
     SessionCount--;
@@ -166,6 +190,47 @@ LsapDeleteLogonSession(IN PLUID LogonId)
 }
 
 
+NTSTATUS
+NTAPI
+LsapAddCredential(
+    _In_ PLUID LogonId,
+    _In_ ULONG AuthenticationPackage,
+    _In_ PLSA_STRING PrimaryKeyValue,
+    _In_ PLSA_STRING Credential)
+{
+
+    return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+NTAPI
+LsapGetCredentials(
+    _In_ PLUID LogonId,
+    _In_ ULONG AuthenticationPackage,
+    _Inout_ PULONG QueryContext,
+    _In_ BOOLEAN RetrieveAllCredentials,
+    _Inout_ PLSA_STRING PrimaryKeyValue,
+    _Out_ PULONG PrimaryKeyLength,
+    _Out_ PLSA_STRING Credentials)
+{
+
+    return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+NTAPI
+LsapDeleteCredential(
+    _In_ PLUID LogonId,
+    _In_ ULONG AuthenticationPackage,
+    _In_ PLSA_STRING PrimaryKeyValue)
+{
+
+    return STATUS_SUCCESS;
+}
+
+
 NTSTATUS
 LsapEnumLogonSessions(IN OUT PLSA_API_MSG RequestMsg)
 {
@@ -269,8 +334,8 @@ LsapGetLogonSessionData(IN OUT PLSA_API_MSG RequestMsg)
     PLSAP_LOGON_SESSION Session;
     PSECURITY_LOGON_SESSION_DATA LocalSessionData;
     PVOID ClientBaseAddress = NULL;
-    ULONG Length, MemSize;
-    LPWSTR Ptr;
+    ULONG TotalLength, MemSize, SidLength = 0;
+    PUCHAR Ptr;
     NTSTATUS Status;
 
     TRACE("LsapGetLogonSessionData(%p)\n", RequestMsg);
@@ -280,35 +345,120 @@ LsapGetLogonSessionData(IN OUT PLSA_API_MSG RequestMsg)
     if (Session == NULL)
         return STATUS_NO_SUCH_LOGON_SESSION;
 
-    Length = sizeof(SECURITY_LOGON_SESSION_DATA);
-/*
-             Session->UserName.MaximumLength +
-             Session->LogonDomain.MaximumLength +
-             Session->AuthenticationPackage.MaximumLength +
-             Session->LogonServer.MaximumLength +
-             Session->DnsDomainName.MaximumLength +
-             Session->Upn.MaximumLength;
-
+    /* Calculate the required buffer size */
+    TotalLength = sizeof(SECURITY_LOGON_SESSION_DATA) +
+                  Session->UserName.MaximumLength +
+                  Session->LogonDomain.MaximumLength +
+                  Session->AuthenticationPackage.MaximumLength +
+                  Session->LogonServer.MaximumLength +
+                  Session->DnsDomainName.MaximumLength +
+                  Session->Upn.MaximumLength;
     if (Session->Sid != NULL)
-        RtlLengthSid(Session->Sid);
-*/
-
-    TRACE("Length: %lu\n", Length);
+    {
+        SidLength = RtlLengthSid(Session->Sid);
+        TotalLength += SidLength;
+    }
+    TRACE("TotalLength: %lu\n", TotalLength);
 
+    /* Allocate the buffer */
     LocalSessionData = RtlAllocateHeap(RtlGetProcessHeap(),
                                        HEAP_ZERO_MEMORY,
-                                       Length);
+                                       TotalLength);
     if (LocalSessionData == NULL)
         return STATUS_INSUFFICIENT_RESOURCES;
 
-    Ptr = (LPWSTR)((ULONG_PTR)LocalSessionData + sizeof(SECURITY_LOGON_SESSION_DATA));
+    Ptr = (PUCHAR)((ULONG_PTR)LocalSessionData + sizeof(SECURITY_LOGON_SESSION_DATA));
     TRACE("LocalSessionData: %p  Ptr: %p\n", LocalSessionData, Ptr);
 
     LocalSessionData->Size = sizeof(SECURITY_LOGON_SESSION_DATA);
 
+    /* Copy the LogonId */
     RtlCopyLuid(&LocalSessionData->LogonId,
                 &RequestMsg->GetLogonSessionData.Request.LogonId);
 
+    /* Copy the UserName string*/
+    LocalSessionData->UserName.Length = Session->UserName.Length;
+    LocalSessionData->UserName.MaximumLength = Session->UserName.MaximumLength;
+
+    if (Session->UserName.MaximumLength != 0)
+    {
+        RtlCopyMemory(Ptr, Session->UserName.Buffer, Session->UserName.MaximumLength);
+        LocalSessionData->UserName.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
+
+        Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->UserName.MaximumLength);
+    }
+
+    /* Copy the LogonDomain string */
+    LocalSessionData->LogonDomain.Length = Session->LogonDomain.Length;
+    LocalSessionData->LogonDomain.MaximumLength = Session->LogonDomain.MaximumLength;
+    if (Session->LogonDomain.MaximumLength != 0)
+    {
+        RtlCopyMemory(Ptr, Session->LogonDomain.Buffer, Session->LogonDomain.MaximumLength);
+        LocalSessionData->LogonDomain.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
+
+        Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->LogonDomain.MaximumLength);
+    }
+
+    /* Copy the AuthenticationPackage string */
+    LocalSessionData->AuthenticationPackage.Length = Session->AuthenticationPackage.Length;
+    LocalSessionData->AuthenticationPackage.MaximumLength = Session->AuthenticationPackage.MaximumLength;
+    if (Session->AuthenticationPackage.MaximumLength != 0)
+    {
+        RtlCopyMemory(Ptr, Session->AuthenticationPackage.Buffer, Session->AuthenticationPackage.MaximumLength);
+        LocalSessionData->AuthenticationPackage.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
+
+        Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->AuthenticationPackage.MaximumLength);
+    }
+
+    LocalSessionData->LogonType = Session->LogonType;
+    LocalSessionData->Session = 0;
+
+    /* Sid */
+    if (Session->Sid != NULL)
+    {
+        RtlCopyMemory(Ptr, Session->Sid, SidLength);
+        LocalSessionData->Sid = (PSID)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
+
+        Ptr = (PUCHAR)((ULONG_PTR)Ptr + SidLength);
+    }
+
+    /* LogonTime */
+    LocalSessionData->LogonTime.QuadPart = Session->LogonTime.QuadPart;
+
+    /* Copy the LogonServer string */
+    LocalSessionData->LogonServer.Length = Session->LogonServer.Length;
+    LocalSessionData->LogonServer.MaximumLength = Session->LogonServer.MaximumLength;
+    if (Session->LogonServer.MaximumLength != 0)
+    {
+        RtlCopyMemory(Ptr, Session->LogonServer.Buffer, Session->LogonServer.MaximumLength);
+        LocalSessionData->LogonServer.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
+
+        Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->LogonServer.MaximumLength);
+    }
+
+    /* Copy the DnsDomainName string */
+    LocalSessionData->DnsDomainName.Length = Session->DnsDomainName.Length;
+    LocalSessionData->DnsDomainName.MaximumLength = Session->DnsDomainName.MaximumLength;
+    if (Session->DnsDomainName.MaximumLength != 0)
+    {
+        RtlCopyMemory(Ptr, Session->DnsDomainName.Buffer, Session->DnsDomainName.MaximumLength);
+        LocalSessionData->DnsDomainName.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
+
+        Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->DnsDomainName.MaximumLength);
+    }
+
+    /* Copy the Upn string */
+    LocalSessionData->Upn.Length = Session->Upn.Length;
+    LocalSessionData->Upn.MaximumLength = Session->Upn.MaximumLength;
+    if (Session->Upn.MaximumLength != 0)
+    {
+        RtlCopyMemory(Ptr, Session->Upn.Buffer, Session->Upn.MaximumLength);
+        LocalSessionData->Upn.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
+
+        Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->Upn.MaximumLength);
+    }
+
+
     InitializeObjectAttributes(&ObjectAttributes,
                                NULL,
                                0,
@@ -325,7 +475,7 @@ LsapGetLogonSessionData(IN OUT PLSA_API_MSG RequestMsg)
         goto done;
     }
 
-    MemSize = Length;
+    MemSize = TotalLength;
     Status = NtAllocateVirtualMemory(ProcessHandle,
                                      &ClientBaseAddress,
                                      0,
@@ -344,7 +494,7 @@ LsapGetLogonSessionData(IN OUT PLSA_API_MSG RequestMsg)
     Status = NtWriteVirtualMemory(ProcessHandle,
                                   ClientBaseAddress,
                                   LocalSessionData,
-                                  Length,
+                                  TotalLength,
                                   NULL);
     if (!NT_SUCCESS(Status))
     {