2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: reactos/dll/win32/netapi32/misc.c
5 * PURPOSE: Helper functions
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ******************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
16 /* GLOBALS *******************************************************************/
18 static SID_IDENTIFIER_AUTHORITY NtAuthority
= {SECURITY_NT_AUTHORITY
};
20 /* FUNCTIONS *****************************************************************/
23 GetAccountDomainSid(IN PUNICODE_STRING ServerName
,
24 OUT PSID
*AccountDomainSid
)
26 PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomainInfo
= NULL
;
27 LSA_OBJECT_ATTRIBUTES ObjectAttributes
;
28 LSA_HANDLE PolicyHandle
= NULL
;
32 memset(&ObjectAttributes
, 0, sizeof(LSA_OBJECT_ATTRIBUTES
));
34 Status
= LsaOpenPolicy(ServerName
,
36 POLICY_VIEW_LOCAL_INFORMATION
,
38 if (!NT_SUCCESS(Status
))
40 ERR("LsaOpenPolicy failed (Status %08lx)\n", Status
);
44 Status
= LsaQueryInformationPolicy(PolicyHandle
,
45 PolicyAccountDomainInformation
,
46 (PVOID
*)&AccountDomainInfo
);
47 if (!NT_SUCCESS(Status
))
49 ERR("LsaQueryInformationPolicy failed (Status %08lx)\n", Status
);
53 Length
= RtlLengthSid(AccountDomainInfo
->DomainSid
);
55 *AccountDomainSid
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Length
);
56 if (*AccountDomainSid
== NULL
)
58 ERR("Failed to allocate SID\n");
59 Status
= STATUS_INSUFFICIENT_RESOURCES
;
63 memcpy(*AccountDomainSid
, AccountDomainInfo
->DomainSid
, Length
);
66 if (AccountDomainInfo
!= NULL
)
67 LsaFreeMemory(AccountDomainInfo
);
69 LsaClose(PolicyHandle
);
76 GetBuiltinDomainSid(OUT PSID
*BuiltinDomainSid
)
80 NTSTATUS Status
= STATUS_SUCCESS
;
82 *BuiltinDomainSid
= NULL
;
84 Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
86 RtlLengthRequiredSid(1));
88 return STATUS_INSUFFICIENT_RESOURCES
;
90 Status
= RtlInitializeSid(Sid
,
93 if (!NT_SUCCESS(Status
))
96 Ptr
= RtlSubAuthoritySid(Sid
, 0);
97 *Ptr
= SECURITY_BUILTIN_DOMAIN_RID
;
99 *BuiltinDomainSid
= Sid
;
102 if (!NT_SUCCESS(Status
))
105 RtlFreeHeap(RtlGetProcessHeap(), 0, Sid
);
113 OpenAccountDomain(IN SAM_HANDLE ServerHandle
,
114 IN PUNICODE_STRING ServerName
,
115 IN ULONG DesiredAccess
,
116 OUT PSAM_HANDLE DomainHandle
)
118 PSID DomainSid
= NULL
;
121 Status
= GetAccountDomainSid(ServerName
,
123 if (!NT_SUCCESS(Status
))
125 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
129 Status
= SamOpenDomain(ServerHandle
,
134 RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid
);
136 if (!NT_SUCCESS(Status
))
138 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
146 OpenBuiltinDomain(IN SAM_HANDLE ServerHandle
,
147 IN ULONG DesiredAccess
,
148 OUT PSAM_HANDLE DomainHandle
)
150 PSID DomainSid
= NULL
;
153 Status
= GetBuiltinDomainSid(&DomainSid
);
154 if (!NT_SUCCESS(Status
))
156 ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status
);
160 Status
= SamOpenDomain(ServerHandle
,
165 RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid
);
167 if (!NT_SUCCESS(Status
))
169 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
177 BuildSidFromSidAndRid(IN PSID SrcSid
,
186 NET_API_STATUS ApiStatus
= NERR_Success
;
188 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
190 return ERROR_INVALID_PARAMETER
;
192 DstSidSize
= RtlLengthRequiredSid(RidCount
+ 1);
194 ApiStatus
= NetApiBufferAllocate(DstSidSize
,
196 if (ApiStatus
!= NERR_Success
)
199 RtlInitializeSid(DstSid
,
200 RtlIdentifierAuthoritySid(SrcSid
),
203 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
205 p
= RtlSubAuthoritySid(SrcSid
, i
);
206 q
= RtlSubAuthoritySid(DstSid
, i
);
210 q
= RtlSubAuthoritySid(DstSid
, (ULONG
)RidCount
);