NTSTATUS
-LsapSetLogonSessionData(IN PLUID LogonId)
+LsapSetLogonSessionData(
+ _In_ PLUID LogonId,
+ _In_ ULONG LogonType,
+ _In_ PUNICODE_STRING UserName)
{
PLSAP_LOGON_SESSION Session;
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;
}
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))
{
LsapDeleteLogonSession(IN PLUID LogonId)
{
PLSAP_LOGON_SESSION Session;
+ NTSTATUS Status;
TRACE("LsapDeleteLogonSession(%p)\n", 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--;
}
+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)
{
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);
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,
goto done;
}
- MemSize = Length;
+ MemSize = TotalLength;
Status = NtAllocateVirtualMemory(ProcessHandle,
&ClientBaseAddress,
0,
Status = NtWriteVirtualMemory(ProcessHandle,
ClientBaseAddress,
LocalSessionData,
- Length,
+ TotalLength,
NULL);
if (!NT_SUCCESS(Status))
{