Skip to content

Commit dbad45a

Browse files
committed
[MSV1_0] Implement the MsV1_0EnumerateUsers message in LsaApCallPackage
1 parent 3bb1e64 commit dbad45a

File tree

2 files changed

+159
-0
lines changed

2 files changed

+159
-0
lines changed

dll/win32/msv1_0/msv1_0.c

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@
1212

1313
WINE_DEFAULT_DEBUG_CHANNEL(msv1_0);
1414

15+
typedef struct _LOGON_LIST_ENTRY
16+
{
17+
LIST_ENTRY ListEntry;
18+
LUID LogonId;
19+
ULONG EnumHandle;
20+
} LOGON_LIST_ENTRY, *PLOGON_LIST_ENTRY;
21+
22+
/* GLOBALS *****************************************************************/
23+
24+
BOOL PackageInitialized = FALSE;
25+
LIST_ENTRY LogonListHead;
26+
ULONG EnumCounter;
1527

1628
/* FUNCTIONS ***************************************************************/
1729

@@ -819,6 +831,125 @@ MsvpChangePassword(IN PLSA_CLIENT_REQUEST ClientRequest,
819831
}
820832

821833

834+
static
835+
NTSTATUS
836+
MsvpEnumerateUsers(
837+
_In_ PLSA_CLIENT_REQUEST ClientRequest,
838+
_In_ PVOID ProtocolSubmitBuffer,
839+
_In_ PVOID ClientBufferBase,
840+
_In_ ULONG SubmitBufferLength,
841+
_Out_ PVOID *ProtocolReturnBuffer,
842+
_Out_ PULONG ReturnBufferLength,
843+
_Out_ PNTSTATUS ProtocolStatus)
844+
{
845+
PMSV1_0_ENUMUSERS_RESPONSE LocalBuffer = NULL;
846+
PVOID ClientBaseAddress = NULL;
847+
ULONG BufferLength;
848+
PLIST_ENTRY CurrentEntry;
849+
PLOGON_LIST_ENTRY LogonEntry;
850+
ULONG LogonCount = 0;
851+
PLUID LuidPtr;
852+
PULONG EnumPtr;
853+
NTSTATUS Status = STATUS_SUCCESS;
854+
855+
TRACE("MsvpEnumerateUsers()\n");
856+
857+
/* Count the currently logged-on users */
858+
CurrentEntry = LogonListHead.Flink;
859+
while (CurrentEntry != &LogonListHead)
860+
{
861+
LogonEntry = CONTAINING_RECORD(CurrentEntry,
862+
LOGON_LIST_ENTRY,
863+
ListEntry);
864+
865+
TRACE("Logon %lu: 0x%08lx\n", LogonCount, LogonEntry->LogonId.LowPart);
866+
LogonCount++;
867+
868+
CurrentEntry = CurrentEntry->Flink;
869+
}
870+
871+
TRACE("LogonCount %lu\n", LogonCount);
872+
873+
BufferLength = sizeof(MSV1_0_ENUMUSERS_RESPONSE) +
874+
(LogonCount * sizeof(LUID)) +
875+
(LogonCount * sizeof(ULONG));
876+
877+
LocalBuffer = DispatchTable.AllocateLsaHeap(BufferLength);
878+
if (LocalBuffer == NULL)
879+
{
880+
ERR("Failed to allocate the local buffer!\n");
881+
Status = STATUS_INSUFFICIENT_RESOURCES;
882+
goto done;
883+
}
884+
885+
Status = DispatchTable.AllocateClientBuffer(ClientRequest,
886+
BufferLength,
887+
&ClientBaseAddress);
888+
if (!NT_SUCCESS(Status))
889+
{
890+
ERR("DispatchTable.AllocateClientBuffer failed (Status 0x%08lx)\n", Status);
891+
goto done;
892+
}
893+
894+
TRACE("ClientBaseAddress: %p\n", ClientBaseAddress);
895+
896+
/* Fill the local buffer */
897+
LocalBuffer->MessageType = MsV1_0EnumerateUsers;
898+
LocalBuffer->NumberOfLoggedOnUsers = LogonCount;
899+
900+
LuidPtr = (PLUID)((ULONG_PTR)LocalBuffer + sizeof(MSV1_0_ENUMUSERS_RESPONSE));
901+
EnumPtr = (PULONG)((ULONG_PTR)LuidPtr + LogonCount * sizeof(LUID));
902+
903+
LocalBuffer->LogonIds = (PLUID)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)LuidPtr - (ULONG_PTR)LocalBuffer);
904+
LocalBuffer->EnumHandles = (PULONG)((ULONG_PTR)ClientBaseAddress + (ULONG_PTR)EnumPtr - (ULONG_PTR)LocalBuffer);
905+
906+
/* Copy the LogonIds and EnumHandles into the local buffer */
907+
CurrentEntry = LogonListHead.Flink;
908+
while (CurrentEntry != &LogonListHead)
909+
{
910+
LogonEntry = CONTAINING_RECORD(CurrentEntry,
911+
LOGON_LIST_ENTRY,
912+
ListEntry);
913+
914+
TRACE("Logon: 0x%08lx %lu\n", LogonEntry->LogonId.LowPart, LogonEntry->EnumHandle);
915+
RtlCopyMemory(LuidPtr, &LogonEntry->LogonId, sizeof(LUID));
916+
LuidPtr++;
917+
918+
*EnumPtr = LogonEntry->EnumHandle;
919+
EnumPtr++;
920+
921+
CurrentEntry = CurrentEntry->Flink;
922+
}
923+
924+
Status = DispatchTable.CopyToClientBuffer(ClientRequest,
925+
BufferLength,
926+
ClientBaseAddress,
927+
LocalBuffer);
928+
if (!NT_SUCCESS(Status))
929+
{
930+
ERR("DispatchTable.CopyToClientBuffer failed (Status 0x%08lx)\n", Status);
931+
goto done;
932+
}
933+
934+
*ProtocolReturnBuffer = (PMSV1_0_INTERACTIVE_PROFILE)ClientBaseAddress;
935+
*ReturnBufferLength = BufferLength;
936+
*ProtocolStatus = STATUS_SUCCESS;
937+
938+
done:
939+
if (LocalBuffer != NULL)
940+
DispatchTable.FreeLsaHeap(LocalBuffer);
941+
942+
if (!NT_SUCCESS(Status))
943+
{
944+
if (ClientBaseAddress != NULL)
945+
DispatchTable.FreeClientBuffer(ClientRequest,
946+
ClientBaseAddress);
947+
}
948+
949+
return STATUS_SUCCESS;
950+
}
951+
952+
822953
/*
823954
* @unimplemented
824955
*/
@@ -853,6 +984,15 @@ LsaApCallPackage(IN PLSA_CLIENT_REQUEST ClientRequest,
853984
break;
854985

855986
case MsV1_0EnumerateUsers:
987+
Status = MsvpEnumerateUsers(ClientRequest,
988+
ProtocolSubmitBuffer,
989+
ClientBufferBase,
990+
SubmitBufferLength,
991+
ProtocolReturnBuffer,
992+
ReturnBufferLength,
993+
ProtocolStatus);
994+
break;
995+
856996
case MsV1_0GetUserInfo:
857997
case MsV1_0ReLogonUsers:
858998
Status = STATUS_INVALID_PARAMETER;
@@ -962,6 +1102,13 @@ LsaApInitializePackage(IN ULONG AuthenticationPackageId,
9621102
AuthenticationPackageId, LsaDispatchTable, Database,
9631103
Confidentiality, AuthenticationPackageName);
9641104

1105+
if (!PackageInitialized)
1106+
{
1107+
InitializeListHead(&LogonListHead);
1108+
EnumCounter = 0;
1109+
PackageInitialized = TRUE;
1110+
}
1111+
9651112
/* Get the dispatch table entries */
9661113
DispatchTable.CreateLogonSession = LsaDispatchTable->CreateLogonSession;
9671114
DispatchTable.DeleteLogonSession = LsaDispatchTable->DeleteLogonSession;
@@ -1134,6 +1281,7 @@ LsaApLogonUserEx2(IN PLSA_CLIENT_REQUEST ClientRequest,
11341281
BOOL SpecialAccount = FALSE;
11351282
UCHAR LogonPassHash;
11361283
PUNICODE_STRING ErasePassword = NULL;
1284+
PLOGON_LIST_ENTRY LogonEntry = NULL;
11371285

11381286
TRACE("LsaApLogonUserEx2()\n");
11391287

@@ -1329,6 +1477,16 @@ LsaApLogonUserEx2(IN PLSA_CLIENT_REQUEST ClientRequest,
13291477

13301478
SessionCreated = TRUE;
13311479

1480+
LogonEntry = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOGON_LIST_ENTRY));
1481+
if (LogonEntry)
1482+
{
1483+
RtlCopyMemory(&LogonEntry->LogonId, LogonId, sizeof(LUID));
1484+
LogonEntry->EnumHandle = EnumCounter;
1485+
EnumCounter++;
1486+
1487+
InsertTailList(&LogonListHead, &LogonEntry->ListEntry);
1488+
}
1489+
13321490
if (LogonType == Interactive || LogonType == Batch || LogonType == Service)
13331491
{
13341492
/* Build and fill the interactive profile buffer */

dll/win32/msv1_0/precomp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include <samsrv/samsrv.h>
3232
//#include <lsass/lsasrv.h>
33+
#include <msv1_0p.h>
3334

3435
#include "ntlm/global.h"
3536
#include "ntlm/protocol.h"

0 commit comments

Comments
 (0)