2 * PROJECT: Local Security Authority Server DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/lsasrv/policy.c
5 * PURPOSE: Policy object routines
6 * COPYRIGHT: Copyright 2011 Eric Kohl
9 /* INCLUDES ****************************************************************/
13 WINE_DEFAULT_DEBUG_CHANNEL(lsasrv
);
16 /* FUNCTIONS ***************************************************************/
19 LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle
,
20 PLSAPR_POLICY_PRIMARY_DOM_INFO Info
)
22 PUNICODE_STRING Buffer
;
27 TRACE("LsarSetPrimaryDomain(%p, %p)\n", PolicyHandle
, Info
);
29 Length
= sizeof(UNICODE_STRING
) + Info
->Name
.MaximumLength
;
30 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(),
34 return STATUS_INSUFFICIENT_RESOURCES
;
36 Buffer
->Length
= Info
->Name
.Length
;
37 Buffer
->MaximumLength
= Info
->Name
.MaximumLength
;
38 Buffer
->Buffer
= (LPWSTR
)sizeof(UNICODE_STRING
);
39 Ptr
= (LPWSTR
)((ULONG_PTR
)Buffer
+ sizeof(UNICODE_STRING
));
40 memcpy(Ptr
, Info
->Name
.Buffer
, Info
->Name
.MaximumLength
);
42 Status
= LsapSetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
46 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
48 if (!NT_SUCCESS(Status
))
52 if (Info
->Sid
!= NULL
)
53 Length
= RtlLengthSid(Info
->Sid
);
55 Status
= LsapSetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
65 LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle
,
66 PLSAPR_POLICY_ACCOUNT_DOM_INFO Info
)
68 PUNICODE_STRING Buffer
;
73 TRACE("LsarSetAccountDomain(%p, %p)\n", PolicyHandle
, Info
);
75 Length
= sizeof(UNICODE_STRING
) + Info
->DomainName
.MaximumLength
;
76 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(),
80 return STATUS_INSUFFICIENT_RESOURCES
;
82 Buffer
->Length
= Info
->DomainName
.Length
;
83 Buffer
->MaximumLength
= Info
->DomainName
.MaximumLength
;
84 Buffer
->Buffer
= (LPWSTR
)sizeof(UNICODE_STRING
);
85 Ptr
= (LPWSTR
)((ULONG_PTR
)Buffer
+ sizeof(UNICODE_STRING
));
86 memcpy(Ptr
, Info
->DomainName
.Buffer
, Info
->DomainName
.MaximumLength
);
88 Status
= LsapSetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
92 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
94 if (!NT_SUCCESS(Status
))
98 if (Info
->Sid
!= NULL
)
99 Length
= RtlLengthSid(Info
->Sid
);
101 Status
= LsapSetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
111 LsarSetDnsDomain(LSAPR_HANDLE PolicyHandle
,
112 PLSAPR_POLICY_DNS_DOMAIN_INFO Info
)
115 return STATUS_NOT_IMPLEMENTED
;
120 LsarQueryAuditEvents(LSAPR_HANDLE PolicyHandle
,
121 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
123 PLSAPR_POLICY_AUDIT_EVENTS_INFO p
= NULL
;
125 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_AUDIT_EVENTS_INFO
));
127 return STATUS_INSUFFICIENT_RESOURCES
;
129 p
->AuditingMode
= FALSE
; /* no auditing */
130 p
->EventAuditingOptions
= NULL
;
131 p
->MaximumAuditEventCount
= 0;
133 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
135 return STATUS_SUCCESS
;
140 LsarQueryPrimaryDomain(LSAPR_HANDLE PolicyHandle
,
141 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
143 PLSAPR_POLICY_PRIMARY_DOM_INFO p
= NULL
;
144 PUNICODE_STRING DomainName
;
148 *PolicyInformation
= NULL
;
150 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_PRIMARY_DOM_INFO
));
152 return STATUS_INSUFFICIENT_RESOURCES
;
155 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
159 if (!NT_SUCCESS(Status
))
164 if (AttributeSize
> 0)
166 DomainName
= MIDL_user_allocate(AttributeSize
);
167 if (DomainName
== NULL
)
169 Status
= STATUS_INSUFFICIENT_RESOURCES
;
173 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
177 if (Status
== STATUS_SUCCESS
)
179 DomainName
->Buffer
= (LPWSTR
)((ULONG_PTR
)DomainName
+ (ULONG_PTR
)DomainName
->Buffer
);
181 TRACE("PrimaryDomainName: %wZ\n", DomainName
);
183 p
->Name
.Buffer
= MIDL_user_allocate(DomainName
->MaximumLength
);
184 if (p
->Name
.Buffer
== NULL
)
186 MIDL_user_free(DomainName
);
187 Status
= STATUS_INSUFFICIENT_RESOURCES
;
191 p
->Name
.Length
= DomainName
->Length
;
192 p
->Name
.MaximumLength
= DomainName
->MaximumLength
;
193 memcpy(p
->Name
.Buffer
,
195 DomainName
->MaximumLength
);
198 MIDL_user_free(DomainName
);
203 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
207 if (!NT_SUCCESS(Status
))
212 if (AttributeSize
> 0)
214 p
->Sid
= MIDL_user_allocate(AttributeSize
);
217 Status
= STATUS_INSUFFICIENT_RESOURCES
;
221 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
227 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
230 if (!NT_SUCCESS(Status
))
235 MIDL_user_free(p
->Name
.Buffer
);
238 MIDL_user_free(p
->Sid
);
244 return STATUS_SUCCESS
;
249 LsarQueryAccountDomain(LSAPR_HANDLE PolicyHandle
,
250 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
252 PLSAPR_POLICY_ACCOUNT_DOM_INFO p
= NULL
;
253 PUNICODE_STRING DomainName
;
257 *PolicyInformation
= NULL
;
259 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_ACCOUNT_DOM_INFO
));
261 return STATUS_INSUFFICIENT_RESOURCES
;
264 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
268 if (!NT_SUCCESS(Status
))
273 if (AttributeSize
> 0)
275 DomainName
= MIDL_user_allocate(AttributeSize
);
276 if (DomainName
== NULL
)
278 Status
= STATUS_INSUFFICIENT_RESOURCES
;
282 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
286 if (Status
== STATUS_SUCCESS
)
288 DomainName
->Buffer
= (LPWSTR
)((ULONG_PTR
)DomainName
+ (ULONG_PTR
)DomainName
->Buffer
);
290 TRACE("AccountDomainName: %wZ\n", DomainName
);
292 p
->DomainName
.Buffer
= MIDL_user_allocate(DomainName
->MaximumLength
);
293 if (p
->DomainName
.Buffer
== NULL
)
295 MIDL_user_free(DomainName
);
296 Status
= STATUS_INSUFFICIENT_RESOURCES
;
300 p
->DomainName
.Length
= DomainName
->Length
;
301 p
->DomainName
.MaximumLength
= DomainName
->MaximumLength
;
302 memcpy(p
->DomainName
.Buffer
,
304 DomainName
->MaximumLength
);
307 MIDL_user_free(DomainName
);
312 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
316 if (!NT_SUCCESS(Status
))
321 if (AttributeSize
> 0)
323 p
->Sid
= MIDL_user_allocate(AttributeSize
);
326 Status
= STATUS_INSUFFICIENT_RESOURCES
;
330 Status
= LsapGetObjectAttribute((PLSA_DB_OBJECT
)PolicyHandle
,
336 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
339 if (!NT_SUCCESS(Status
))
343 if (p
->DomainName
.Buffer
)
344 MIDL_user_free(p
->DomainName
.Buffer
);
347 MIDL_user_free(p
->Sid
);
353 return STATUS_SUCCESS
;
358 LsarQueryDnsDomain(LSAPR_HANDLE PolicyHandle
,
359 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
361 PLSAPR_POLICY_DNS_DOMAIN_INFO p
= NULL
;
363 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_DNS_DOMAIN_INFO
));
365 return STATUS_INSUFFICIENT_RESOURCES
;
368 p
->Name
.MaximumLength
= 0;
369 p
->Name
.Buffer
= NULL
;
371 p
->Name
.Length
= wcslen(L
"COMPUTERNAME");
372 p
->Name
.MaximumLength
= p
->Name
.Length
+ sizeof(WCHAR
);
373 p
->Name
.Buffer
= MIDL_user_allocate(p
->Name
.MaximumLength
);
374 if (p
->Name
.Buffer
== NULL
)
377 return STATUS_INSUFFICIENT_RESOURCES
;
380 wcscpy(p
->Name
.Buffer
, L
"COMPUTERNAME");
383 p
->DnsDomainName
.Length
= 0;
384 p
->DnsDomainName
.MaximumLength
= 0;
385 p
->DnsDomainName
.Buffer
= NULL
;
387 p
->DnsForestName
.Length
= 0;
388 p
->DnsForestName
.MaximumLength
= 0;
389 p
->DnsForestName
.Buffer
= 0;
391 memset(&p
->DomainGuid
, 0, sizeof(GUID
));
393 p
->Sid
= NULL
; /* no domain, no workgroup */
395 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
397 return STATUS_SUCCESS
;