reactos/dll/win32/samsrv/display.c
Eric Kohl fb8edf90a0 [SAMSRV] Start work on the display cache
Initialize the cache and fill it on demand
2021-07-04 12:45:19 +02:00

203 lines
5.2 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: Security Account Manager (SAM) Server
* FILE: reactos/dll/win32/samsrv/display.c
* PURPOSE: Display cache
*
* PROGRAMMERS: Eric Kohl
*/
#include "samsrv.h"
#include <winuser.h>
/* GLOBALS *****************************************************************/
typedef struct _USER_ENTRY
{
LIST_ENTRY ListEntry;
SAMPR_DOMAIN_DISPLAY_USER User;
} USER_ENTRY, *PUSER_ENTRY;
static LIST_ENTRY UserListHead;
static BOOLEAN UserListFilled = FALSE;
static ULONG UserListCount = 0;
//static LIST_HEAD MachineListHead;
//static LIST_HEAD GroupListHead;
/* FUNCTIONS ***************************************************************/
static
NTSTATUS
SampFillUserDisplayCache(
_In_ PSAM_DB_OBJECT DomainObject)
{
HANDLE UsersKeyHandle = NULL;
WCHAR UserKeyName[64];
ULONG EnumIndex;
ULONG NameLength;
ULONG Rid;
PSAM_DB_OBJECT UserObject;
SAM_USER_FIXED_DATA FixedUserData;
ULONG Size;
ULONG DataType;
PUSER_ENTRY UserEntry;
NTSTATUS Status;
FIXME("SampFillUserDisplayCache(%p)\n", DomainObject);
if (UserListFilled)
{
FIXME("Already filled!\n");
return STATUS_SUCCESS;
}
Status = SampRegOpenKey(DomainObject->KeyHandle,
L"Users",
KEY_ALL_ACCESS, /* FIXME */
&UsersKeyHandle);
if (!NT_SUCCESS(Status))
goto done;
for (EnumIndex = 0; ; EnumIndex++)
{
FIXME("EnumIndex: %lu\n", EnumIndex);
NameLength = 64 * sizeof(WCHAR);
Status = SampRegEnumerateSubKey(UsersKeyHandle,
EnumIndex,
NameLength,
UserKeyName);
if (!NT_SUCCESS(Status))
{
if (Status == STATUS_NO_MORE_ENTRIES)
Status = STATUS_SUCCESS;
break;
}
FIXME("User name: %S\n", UserKeyName);
FIXME("Name length: %lu\n", NameLength);
Rid = wcstoul(UserKeyName, NULL, 16);
if (Rid == 0 || Rid == ULONG_MAX)
continue;
FIXME("Rid: 0x%lx\n", Rid);
Status = SampOpenDbObject(DomainObject,
L"Users",
UserKeyName,
Rid,
SamDbUserObject,
0,
&UserObject);
if (NT_SUCCESS(Status))
{
Size = sizeof(SAM_USER_FIXED_DATA);
Status = SampGetObjectAttribute(UserObject,
L"F",
&DataType,
(LPVOID)&FixedUserData,
&Size);
if (NT_SUCCESS(Status))
{
FIXME("Account control: 0x%lx\n", FixedUserData.UserAccountControl);
if (FixedUserData.UserAccountControl & USER_NORMAL_ACCOUNT)
{
UserEntry = RtlAllocateHeap(RtlGetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(USER_ENTRY));
if (UserEntry != NULL)
{
UserEntry->User.Rid = Rid;
UserEntry->User.AccountControl = FixedUserData.UserAccountControl;
/* FIXME: Add remaining attributes */
InsertTailList(&UserListHead, &UserEntry->ListEntry);
UserListCount++;
}
}
}
SampCloseDbObject(UserObject);
}
}
done:
if (Status == STATUS_SUCCESS)
UserListFilled = TRUE;
FIXME("SampFillUserDisplayCache() done (Status 0x%08lx)\n", Status);
return Status;
}
NTSTATUS
SampInitializeDisplayCache(VOID)
{
TRACE("SampInitializeDisplayCache()\n");
InitializeListHead(&UserListHead);
UserListFilled = FALSE;
UserListCount = 0;
// InitializeListHead(&MachineListHead);
// MachineListFilled = FALSE;
// MachineListCount = 0;
// InitializeListHead(&GroupListHead);
// GroupListFilled = FALSE;
// GroupListCount = 0;
return STATUS_SUCCESS;
}
NTSTATUS
SampShutdownDisplayCache(VOID)
{
TRACE("SampShutdownDisplayCache()\n");
return STATUS_SUCCESS;
}
NTSTATUS
SampFillDisplayCache(
_In_ PSAM_DB_OBJECT DomainObject,
_In_ DOMAIN_DISPLAY_INFORMATION DisplayInformationClass)
{
NTSTATUS Status;
TRACE("SampFillDisplayCache()\n");
switch (DisplayInformationClass)
{
case DomainDisplayUser:
Status = SampFillUserDisplayCache(DomainObject);
break;
/*
case DomainDisplayMachine:
Status = SampFillMachineDisplayCache(DomainObject);
break;
case DomainDisplayGroup:
Status = SampFillGroupDisplayCache(DomainObject);
break;
*/
default:
Status = STATUS_INVALID_INFO_CLASS;
break;
}
return Status;
}
/* EOF */