- 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:
Eric Kohl 2012-06-01 18:03:25 +00:00
parent a6e90fb6f8
commit f023556a30
9 changed files with 367 additions and 22 deletions

View file

@ -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 */

View file

@ -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 NTSTATUS
NTAPI NTAPI
SamOpenDomain(IN SAM_HANDLE ServerHandle, SamOpenDomain(IN SAM_HANDLE ServerHandle,

View file

@ -18,14 +18,14 @@
@ stub SamEnumerateDomainsInSamServer @ stub SamEnumerateDomainsInSamServer
@ stub SamEnumerateGroupsInDomain @ stub SamEnumerateGroupsInDomain
@ stub SamEnumerateUsersInDomain @ stub SamEnumerateUsersInDomain
@ stub SamFreeMemory @ stdcall SamFreeMemory(ptr)
@ stub SamGetAliasMembership @ stub SamGetAliasMembership
@ stub SamGetCompatibilityMode @ stub SamGetCompatibilityMode
@ stub SamGetDisplayEnumerationIndex @ stub SamGetDisplayEnumerationIndex
@ stub SamGetGroupsForUser @ stub SamGetGroupsForUser
@ stub SamGetMembersInAlias @ stub SamGetMembersInAlias
@ stub SamGetMembersInGroup @ stub SamGetMembersInGroup
@ stub SamLookupDomainInSamServer @ stdcall SamLookupDomainInSamServer(ptr ptr ptr)
@ stub SamLookupIdsInDomain @ stub SamLookupIdsInDomain
@ stub SamLookupNamesInDomain @ stub SamLookupNamesInDomain
@ stub SamOpenAlias @ stub SamOpenAlias

View file

@ -9,6 +9,7 @@ spec2def(samsrv.dll samsrv.spec ADD_IMPORTLIB)
list(APPEND SOURCE list(APPEND SOURCE
database.c database.c
registry.c
samrpc.c samrpc.c
samsrv.c samsrv.c
setup.c setup.c

View 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;
}

View file

@ -161,8 +161,106 @@ SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle,
IN PRPC_UNICODE_STRING Name, IN PRPC_UNICODE_STRING Name,
OUT PRPC_SID *DomainId) OUT PRPC_SID *DomainId)
{ {
UNIMPLEMENTED; PSAM_DB_OBJECT ServerObject;
return STATUS_NOT_IMPLEMENTED; 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 */ /* Function 6 */

View file

@ -103,6 +103,35 @@ SampGetObjectAttribute(PSAM_DB_OBJECT DbObject,
LPVOID AttributeData, LPVOID AttributeData,
PULONG AttributeSize); 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 */ /* samspc.c */
VOID SampStartRpcServer(VOID); VOID SampStartRpcServer(VOID);

View file

@ -112,6 +112,7 @@ SampCreateUserAccount(HKEY hDomainKey,
static BOOL static BOOL
SampCreateDomain(IN HKEY hDomainsKey, SampCreateDomain(IN HKEY hDomainsKey,
IN LPCWSTR lpKeyName,
IN LPCWSTR lpDomainName, IN LPCWSTR lpDomainName,
IN PSID lpDomainSid, IN PSID lpDomainSid,
OUT PHKEY lpDomainKey) OUT PHKEY lpDomainKey)
@ -127,7 +128,7 @@ SampCreateDomain(IN HKEY hDomainsKey,
*lpDomainKey = NULL; *lpDomainKey = NULL;
if (RegCreateKeyExW(hDomainsKey, if (RegCreateKeyExW(hDomainsKey,
lpDomainName, lpKeyName,
0, 0,
NULL, NULL,
REG_OPTION_NON_VOLATILE, REG_OPTION_NON_VOLATILE,
@ -139,6 +140,13 @@ SampCreateDomain(IN HKEY hDomainsKey,
if (lpDomainSid != NULL) if (lpDomainSid != NULL)
{ {
RegSetValueEx(hDomainKey,
L"Name",
0,
REG_SZ,
(LPVOID)lpDomainName,
(wcslen(lpDomainName) + 1) * sizeof(WCHAR));
RegSetValueEx(hDomainKey, RegSetValueEx(hDomainKey,
L"SID", L"SID",
0, 0,
@ -331,6 +339,7 @@ SampInitializeSAM(VOID)
/* Create the Builtin domain */ /* Create the Builtin domain */
if (SampCreateDomain(hDomainsKey, if (SampCreateDomain(hDomainsKey,
L"Builtin",
L"Builtin", L"Builtin",
pBuiltinSid, pBuiltinSid,
&hDomainKey)) &hDomainKey))
@ -342,7 +351,8 @@ SampInitializeSAM(VOID)
/* Create the Account domain */ /* Create the Account domain */
if (SampCreateDomain(hDomainsKey, if (SampCreateDomain(hDomainsKey,
L"Account", L"Account",
AccountDomainInfo->DomainSid, //NULL, L"",
AccountDomainInfo->DomainSid,
&hDomainKey)) &hDomainKey))
{ {
SampCreateUserAccount(hDomainKey, SampCreateUserAccount(hDomainKey,

View file

@ -98,6 +98,16 @@ SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
OUT PSAM_HANDLE UserHandle, OUT PSAM_HANDLE UserHandle,
OUT PULONG RelativeId); OUT PULONG RelativeId);
NTSTATUS
NTAPI
SamFreeMemory(IN PVOID Buffer);
NTSTATUS
NTAPI
SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle,
IN PUNICODE_STRING Name,
OUT PSID *DomainId);
NTSTATUS NTSTATUS
NTAPI NTAPI
SamOpenDomain(IN SAM_HANDLE ServerHandle, SamOpenDomain(IN SAM_HANDLE ServerHandle,