mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:23:01 +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
9 changed files with 367 additions and 22 deletions
|
@ -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
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamOpenDomain(IN SAM_HANDLE ServerHandle,
|
SamOpenDomain(IN SAM_HANDLE ServerHandle,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
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,
|
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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue