mirror of
https://github.com/reactos/reactos.git
synced 2024-07-04 11:44:33 +00:00
[SAMLIB]
- Implement SamFreeMemory and SamLookupDomainInSamServer. - Remove unused file debug.h. [SAMSRV] - Implement SamrLookupDomainInSamServer. - Add registry helper functions. - Store the domain name in a new Name attribute which is used by Sam(r)LookupDomainInSamServer. svn path=/trunk/; revision=56685
This commit is contained in:
parent
a6e90fb6f8
commit
f023556a30
|
@ -1,16 +0,0 @@
|
|||
#ifdef NDEBUG
|
||||
#define DPRINT(...)
|
||||
#define CHECKPOINT
|
||||
#else
|
||||
#define DPRINT(...) do { DebugPrint("(SAMLIB:%s:%d) ",__FILE__,__LINE__); DebugPrint(__VA_ARGS__); } while(0)
|
||||
#define CHECKPOINT do { DebugPrint("(SAMLIB:%s:%d) Checkpoint\n",__FILE__,__LINE__); } while(0)
|
||||
#endif
|
||||
|
||||
#define DPRINT1(...) do { DebugPrint("(SAMLIB:%s:%d) ",__FILE__,__LINE__); DebugPrint(__VA_ARGS__); } while(0)
|
||||
#define CHECKPOINT1 do { DebugPrint("(SAMLIB:%s:%d) Checkpoint\n",__FILE__,__LINE__); } while(0)
|
||||
|
||||
|
||||
void
|
||||
DebugPrint(char* fmt,...);
|
||||
|
||||
/* EOF */
|
|
@ -184,6 +184,44 @@ SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
|
|||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SamFreeMemory(IN PVOID Buffer)
|
||||
{
|
||||
if (Buffer!= NULL)
|
||||
midl_user_free(Buffer);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle,
|
||||
IN PUNICODE_STRING Name,
|
||||
OUT PSID *DomainId)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
TRACE("SamLookupDomainInSamServer(%p,%p,%p)\n",
|
||||
ServerHandle, Name, DomainId);
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
Status = SamrLookupDomainInSamServer((SAMPR_HANDLE)ServerHandle,
|
||||
(PRPC_UNICODE_STRING)Name,
|
||||
(PRPC_SID *)DomainId);
|
||||
}
|
||||
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||
}
|
||||
RpcEndExcept;
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SamOpenDomain(IN SAM_HANDLE ServerHandle,
|
||||
|
|
|
@ -18,14 +18,14 @@
|
|||
@ stub SamEnumerateDomainsInSamServer
|
||||
@ stub SamEnumerateGroupsInDomain
|
||||
@ stub SamEnumerateUsersInDomain
|
||||
@ stub SamFreeMemory
|
||||
@ stdcall SamFreeMemory(ptr)
|
||||
@ stub SamGetAliasMembership
|
||||
@ stub SamGetCompatibilityMode
|
||||
@ stub SamGetDisplayEnumerationIndex
|
||||
@ stub SamGetGroupsForUser
|
||||
@ stub SamGetMembersInAlias
|
||||
@ stub SamGetMembersInGroup
|
||||
@ stub SamLookupDomainInSamServer
|
||||
@ stdcall SamLookupDomainInSamServer(ptr ptr ptr)
|
||||
@ stub SamLookupIdsInDomain
|
||||
@ stub SamLookupNamesInDomain
|
||||
@ stub SamOpenAlias
|
||||
|
|
|
@ -9,6 +9,7 @@ spec2def(samsrv.dll samsrv.spec ADD_IMPORTLIB)
|
|||
|
||||
list(APPEND SOURCE
|
||||
database.c
|
||||
registry.c
|
||||
samrpc.c
|
||||
samsrv.c
|
||||
setup.c
|
||||
|
|
175
reactos/dll/win32/samsrv/registry.c
Normal file
175
reactos/dll/win32/samsrv/registry.c
Normal file
|
@ -0,0 +1,175 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: Security Account Manager (SAM) Server
|
||||
* FILE: reactos/dll/win32/samsrv/registry.c
|
||||
* PURPOSE: Registry helper functions
|
||||
*
|
||||
* PROGRAMMERS: Eric Kohl
|
||||
*/
|
||||
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include "samsrv.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SampRegEnumerateSubKey(IN HANDLE KeyHandle,
|
||||
IN ULONG Index,
|
||||
IN ULONG Length,
|
||||
OUT LPWSTR Buffer)
|
||||
{
|
||||
PKEY_BASIC_INFORMATION KeyInfo = NULL;
|
||||
ULONG BufferLength = 0;
|
||||
ULONG ReturnedLength;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Check if we have a name */
|
||||
if (Length)
|
||||
{
|
||||
/* Allocate a buffer for it */
|
||||
BufferLength = sizeof(KEY_BASIC_INFORMATION) + Length * sizeof(WCHAR);
|
||||
|
||||
KeyInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength);
|
||||
if (KeyInfo == NULL)
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Enumerate the key */
|
||||
Status = ZwEnumerateKey(KeyHandle,
|
||||
Index,
|
||||
KeyBasicInformation,
|
||||
KeyInfo,
|
||||
BufferLength,
|
||||
&ReturnedLength);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* Check if the name fits */
|
||||
if (KeyInfo->NameLength < (Length * sizeof(WCHAR)))
|
||||
{
|
||||
/* Copy it */
|
||||
RtlMoveMemory(Buffer,
|
||||
KeyInfo->Name,
|
||||
KeyInfo->NameLength);
|
||||
|
||||
/* Terminate the string */
|
||||
Buffer[KeyInfo->NameLength / sizeof(WCHAR)] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise, we ran out of buffer space */
|
||||
Status = STATUS_BUFFER_OVERFLOW;
|
||||
}
|
||||
}
|
||||
|
||||
/* Free the buffer and return status */
|
||||
if (KeyInfo)
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SampRegOpenKey(IN HANDLE ParentKeyHandle,
|
||||
IN LPCWSTR KeyName,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
OUT HANDLE KeyHandle)
|
||||
{
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING Name;
|
||||
|
||||
RtlInitUnicodeString(&Name, KeyName);
|
||||
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&Name,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
ParentKeyHandle,
|
||||
NULL);
|
||||
|
||||
return NtOpenKey(KeyHandle,
|
||||
DesiredAccess,
|
||||
&ObjectAttributes);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
SampRegSetValue(HANDLE KeyHandle,
|
||||
LPWSTR ValueName,
|
||||
ULONG Type,
|
||||
LPVOID Data,
|
||||
ULONG DataLength)
|
||||
{
|
||||
UNICODE_STRING Name;
|
||||
|
||||
RtlInitUnicodeString(&Name,
|
||||
ValueName);
|
||||
|
||||
return ZwSetValueKey(KeyHandle,
|
||||
&Name,
|
||||
0,
|
||||
Type,
|
||||
Data,
|
||||
DataLength);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
SampRegQueryValue(HANDLE KeyHandle,
|
||||
LPWSTR ValueName,
|
||||
PULONG Type OPTIONAL,
|
||||
LPVOID Data OPTIONAL,
|
||||
PULONG DataLength OPTIONAL)
|
||||
{
|
||||
PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
|
||||
UNICODE_STRING Name;
|
||||
ULONG BufferLength = 0;
|
||||
NTSTATUS Status;
|
||||
|
||||
RtlInitUnicodeString(&Name,
|
||||
ValueName);
|
||||
|
||||
if (DataLength != NULL)
|
||||
BufferLength = *DataLength;
|
||||
|
||||
BufferLength += FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data);
|
||||
|
||||
/* Allocate memory for the value */
|
||||
ValueInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength);
|
||||
if (ValueInfo == NULL)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
/* Query the value */
|
||||
Status = ZwQueryValueKey(KeyHandle,
|
||||
&Name,
|
||||
KeyValuePartialInformation,
|
||||
ValueInfo,
|
||||
BufferLength,
|
||||
&BufferLength);
|
||||
if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
|
||||
{
|
||||
if (Type != NULL)
|
||||
*Type = ValueInfo->Type;
|
||||
|
||||
if (DataLength != NULL)
|
||||
*DataLength = ValueInfo->DataLength;
|
||||
}
|
||||
|
||||
/* Check if the caller wanted data back, and we got it */
|
||||
if ((NT_SUCCESS(Status)) && (Data != NULL))
|
||||
{
|
||||
/* Copy it */
|
||||
RtlMoveMemory(Data,
|
||||
ValueInfo->Data,
|
||||
ValueInfo->DataLength);
|
||||
}
|
||||
|
||||
/* Free the memory and return status */
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo);
|
||||
|
||||
return Status;
|
||||
}
|
|
@ -161,8 +161,106 @@ SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle,
|
|||
IN PRPC_UNICODE_STRING Name,
|
||||
OUT PRPC_SID *DomainId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
PSAM_DB_OBJECT ServerObject;
|
||||
HANDLE DomainsKeyHandle = NULL;
|
||||
HANDLE DomainKeyHandle = NULL;
|
||||
WCHAR DomainKeyName[64];
|
||||
ULONG Index;
|
||||
WCHAR DomainNameString[MAX_COMPUTERNAME_LENGTH + 1];
|
||||
UNICODE_STRING DomainName;
|
||||
ULONG Length;
|
||||
BOOL Found = FALSE;
|
||||
NTSTATUS Status;
|
||||
|
||||
TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
|
||||
ServerHandle, Name, DomainId);
|
||||
|
||||
/* Validate the server handle */
|
||||
Status = SampValidateDbObject(ServerHandle,
|
||||
SamDbServerObject,
|
||||
SAM_SERVER_LOOKUP_DOMAIN,
|
||||
&ServerObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
*DomainId = NULL;
|
||||
|
||||
Status = SampRegOpenKey(ServerObject->KeyHandle,
|
||||
L"Domains",
|
||||
KEY_READ,
|
||||
&DomainsKeyHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
Index = 0;
|
||||
while (Found == FALSE)
|
||||
{
|
||||
Status = SampRegEnumerateSubKey(DomainsKeyHandle,
|
||||
Index,
|
||||
64,
|
||||
DomainKeyName);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
if (Status == STATUS_NO_MORE_ENTRIES)
|
||||
Status = STATUS_NO_SUCH_DOMAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
TRACE("Domain key name: %S\n", DomainKeyName);
|
||||
|
||||
Status = SampRegOpenKey(DomainsKeyHandle,
|
||||
DomainKeyName,
|
||||
KEY_READ,
|
||||
&DomainKeyHandle);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Length = (MAX_COMPUTERNAME_LENGTH + 1) * sizeof(WCHAR);
|
||||
Status = SampRegQueryValue(DomainKeyHandle,
|
||||
L"Name",
|
||||
NULL,
|
||||
(PVOID)&DomainNameString,
|
||||
&Length);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
TRACE("Domain name: %S\n", DomainNameString);
|
||||
|
||||
RtlInitUnicodeString(&DomainName,
|
||||
DomainNameString);
|
||||
if (RtlEqualUnicodeString(&DomainName, (PUNICODE_STRING)Name, TRUE))
|
||||
{
|
||||
TRACE("Found it!\n");
|
||||
Found = TRUE;
|
||||
|
||||
Status = SampRegQueryValue(DomainKeyHandle,
|
||||
L"SID",
|
||||
NULL,
|
||||
NULL,
|
||||
&Length);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
*DomainId = midl_user_allocate(Length);
|
||||
|
||||
SampRegQueryValue(DomainKeyHandle,
|
||||
L"SID",
|
||||
NULL,
|
||||
(PVOID)*DomainId,
|
||||
&Length);
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NtClose(DomainKeyHandle);
|
||||
}
|
||||
|
||||
Index++;
|
||||
}
|
||||
|
||||
NtClose(DomainsKeyHandle);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Function 6 */
|
||||
|
|
|
@ -103,6 +103,35 @@ SampGetObjectAttribute(PSAM_DB_OBJECT DbObject,
|
|||
LPVOID AttributeData,
|
||||
PULONG AttributeSize);
|
||||
|
||||
/* registry.h */
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SampRegEnumerateSubKey(IN HANDLE KeyHandle,
|
||||
IN ULONG Index,
|
||||
IN ULONG Length,
|
||||
OUT LPWSTR Buffer);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SampRegOpenKey(IN HANDLE ParentKeyHandle,
|
||||
IN LPCWSTR KeyName,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
OUT HANDLE KeyHandle);
|
||||
|
||||
NTSTATUS
|
||||
SampRegQueryValue(IN HANDLE KeyHandle,
|
||||
IN LPWSTR ValueName,
|
||||
OUT PULONG Type OPTIONAL,
|
||||
OUT LPVOID Data OPTIONAL,
|
||||
IN OUT PULONG DataLength OPTIONAL);
|
||||
|
||||
NTSTATUS
|
||||
SampRegSetValue(IN HANDLE KeyHandle,
|
||||
IN LPWSTR ValueName,
|
||||
IN ULONG Type,
|
||||
IN LPVOID Data,
|
||||
IN ULONG DataLength);
|
||||
|
||||
/* samspc.c */
|
||||
VOID SampStartRpcServer(VOID);
|
||||
|
||||
|
|
|
@ -112,6 +112,7 @@ SampCreateUserAccount(HKEY hDomainKey,
|
|||
|
||||
static BOOL
|
||||
SampCreateDomain(IN HKEY hDomainsKey,
|
||||
IN LPCWSTR lpKeyName,
|
||||
IN LPCWSTR lpDomainName,
|
||||
IN PSID lpDomainSid,
|
||||
OUT PHKEY lpDomainKey)
|
||||
|
@ -127,7 +128,7 @@ SampCreateDomain(IN HKEY hDomainsKey,
|
|||
*lpDomainKey = NULL;
|
||||
|
||||
if (RegCreateKeyExW(hDomainsKey,
|
||||
lpDomainName,
|
||||
lpKeyName,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
|
@ -139,6 +140,13 @@ SampCreateDomain(IN HKEY hDomainsKey,
|
|||
|
||||
if (lpDomainSid != NULL)
|
||||
{
|
||||
RegSetValueEx(hDomainKey,
|
||||
L"Name",
|
||||
0,
|
||||
REG_SZ,
|
||||
(LPVOID)lpDomainName,
|
||||
(wcslen(lpDomainName) + 1) * sizeof(WCHAR));
|
||||
|
||||
RegSetValueEx(hDomainKey,
|
||||
L"SID",
|
||||
0,
|
||||
|
@ -331,6 +339,7 @@ SampInitializeSAM(VOID)
|
|||
|
||||
/* Create the Builtin domain */
|
||||
if (SampCreateDomain(hDomainsKey,
|
||||
L"Builtin",
|
||||
L"Builtin",
|
||||
pBuiltinSid,
|
||||
&hDomainKey))
|
||||
|
@ -342,7 +351,8 @@ SampInitializeSAM(VOID)
|
|||
/* Create the Account domain */
|
||||
if (SampCreateDomain(hDomainsKey,
|
||||
L"Account",
|
||||
AccountDomainInfo->DomainSid, //NULL,
|
||||
L"",
|
||||
AccountDomainInfo->DomainSid,
|
||||
&hDomainKey))
|
||||
{
|
||||
SampCreateUserAccount(hDomainKey,
|
||||
|
|
|
@ -98,6 +98,16 @@ SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
|
|||
OUT PSAM_HANDLE UserHandle,
|
||||
OUT PULONG RelativeId);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SamFreeMemory(IN PVOID Buffer);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle,
|
||||
IN PUNICODE_STRING Name,
|
||||
OUT PSID *DomainId);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
SamOpenDomain(IN SAM_HANDLE ServerHandle,
|
||||
|
|
Loading…
Reference in a new issue