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(PLSA_DB_OBJECT PolicyObject
,
20 PLSAPR_POLICY_PRIMARY_DOM_INFO Info
)
22 PUNICODE_STRING Buffer
;
27 TRACE("LsarSetPrimaryDomain(%p, %p)\n", PolicyObject
, 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(PolicyObject
,
47 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
49 if (!NT_SUCCESS(Status
))
53 if (Info
->Sid
!= NULL
)
54 Length
= RtlLengthSid(Info
->Sid
);
56 Status
= LsapSetObjectAttribute(PolicyObject
,
66 LsarSetAccountDomain(PLSA_DB_OBJECT PolicyObject
,
67 PLSAPR_POLICY_ACCOUNT_DOM_INFO Info
)
69 PUNICODE_STRING Buffer
;
74 TRACE("LsarSetAccountDomain(%p, %p)\n", PolicyObject
, Info
);
76 Length
= sizeof(UNICODE_STRING
) + Info
->DomainName
.MaximumLength
;
77 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(),
81 return STATUS_INSUFFICIENT_RESOURCES
;
83 Buffer
->Length
= Info
->DomainName
.Length
;
84 Buffer
->MaximumLength
= Info
->DomainName
.MaximumLength
;
85 Buffer
->Buffer
= (LPWSTR
)sizeof(UNICODE_STRING
);
86 Ptr
= (LPWSTR
)((ULONG_PTR
)Buffer
+ sizeof(UNICODE_STRING
));
87 memcpy(Ptr
, Info
->DomainName
.Buffer
, Info
->DomainName
.MaximumLength
);
89 Status
= LsapSetObjectAttribute(PolicyObject
,
94 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
96 if (!NT_SUCCESS(Status
))
100 if (Info
->Sid
!= NULL
)
101 Length
= RtlLengthSid(Info
->Sid
);
103 Status
= LsapSetObjectAttribute(PolicyObject
,
113 LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject
,
114 PLSAPR_POLICY_DNS_DOMAIN_INFO Info
)
117 return STATUS_NOT_IMPLEMENTED
;
122 LsarQueryAuditEvents(PLSA_DB_OBJECT PolicyObject
,
123 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
125 PLSAPR_POLICY_AUDIT_EVENTS_INFO p
= NULL
;
127 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_AUDIT_EVENTS_INFO
));
129 return STATUS_INSUFFICIENT_RESOURCES
;
131 p
->AuditingMode
= FALSE
; /* no auditing */
132 p
->EventAuditingOptions
= NULL
;
133 p
->MaximumAuditEventCount
= 0;
135 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
137 return STATUS_SUCCESS
;
142 LsarQueryPrimaryDomain(PLSA_DB_OBJECT PolicyObject
,
143 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
145 PLSAPR_POLICY_PRIMARY_DOM_INFO p
= NULL
;
146 PUNICODE_STRING DomainName
;
150 *PolicyInformation
= NULL
;
152 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_PRIMARY_DOM_INFO
));
154 return STATUS_INSUFFICIENT_RESOURCES
;
158 Status
= LsapGetObjectAttribute(PolicyObject
,
162 if (!NT_SUCCESS(Status
))
167 if (AttributeSize
> 0)
169 DomainName
= MIDL_user_allocate(AttributeSize
);
170 if (DomainName
== NULL
)
172 Status
= STATUS_INSUFFICIENT_RESOURCES
;
176 Status
= LsapGetObjectAttribute(PolicyObject
,
180 if (Status
== STATUS_SUCCESS
)
182 DomainName
->Buffer
= (LPWSTR
)((ULONG_PTR
)DomainName
+ (ULONG_PTR
)DomainName
->Buffer
);
184 TRACE("PrimaryDomainName: %wZ\n", DomainName
);
186 p
->Name
.Buffer
= MIDL_user_allocate(DomainName
->MaximumLength
);
187 if (p
->Name
.Buffer
== NULL
)
189 MIDL_user_free(DomainName
);
190 Status
= STATUS_INSUFFICIENT_RESOURCES
;
194 p
->Name
.Length
= DomainName
->Length
;
195 p
->Name
.MaximumLength
= DomainName
->MaximumLength
;
196 memcpy(p
->Name
.Buffer
,
198 DomainName
->MaximumLength
);
201 MIDL_user_free(DomainName
);
206 Status
= LsapGetObjectAttribute(PolicyObject
,
210 if (!NT_SUCCESS(Status
))
215 if (AttributeSize
> 0)
217 p
->Sid
= MIDL_user_allocate(AttributeSize
);
220 Status
= STATUS_INSUFFICIENT_RESOURCES
;
224 Status
= LsapGetObjectAttribute(PolicyObject
,
230 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
233 if (!NT_SUCCESS(Status
))
238 MIDL_user_free(p
->Name
.Buffer
);
241 MIDL_user_free(p
->Sid
);
252 LsarQueryAccountDomain(PLSA_DB_OBJECT PolicyObject
,
253 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
255 PLSAPR_POLICY_ACCOUNT_DOM_INFO p
= NULL
;
256 PUNICODE_STRING DomainName
;
257 ULONG AttributeSize
= 0;
260 *PolicyInformation
= NULL
;
262 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_ACCOUNT_DOM_INFO
));
264 return STATUS_INSUFFICIENT_RESOURCES
;
267 Status
= LsapGetObjectAttribute(PolicyObject
,
271 if (!NT_SUCCESS(Status
))
276 if (AttributeSize
> 0)
278 DomainName
= MIDL_user_allocate(AttributeSize
);
279 if (DomainName
== NULL
)
281 Status
= STATUS_INSUFFICIENT_RESOURCES
;
285 Status
= LsapGetObjectAttribute(PolicyObject
,
289 if (Status
== STATUS_SUCCESS
)
291 DomainName
->Buffer
= (LPWSTR
)((ULONG_PTR
)DomainName
+ (ULONG_PTR
)DomainName
->Buffer
);
293 TRACE("AccountDomainName: %wZ\n", DomainName
);
295 p
->DomainName
.Buffer
= MIDL_user_allocate(DomainName
->MaximumLength
);
296 if (p
->DomainName
.Buffer
== NULL
)
298 MIDL_user_free(DomainName
);
299 Status
= STATUS_INSUFFICIENT_RESOURCES
;
303 p
->DomainName
.Length
= DomainName
->Length
;
304 p
->DomainName
.MaximumLength
= DomainName
->MaximumLength
;
305 memcpy(p
->DomainName
.Buffer
,
307 DomainName
->MaximumLength
);
310 MIDL_user_free(DomainName
);
315 Status
= LsapGetObjectAttribute(PolicyObject
,
319 if (!NT_SUCCESS(Status
))
324 if (AttributeSize
> 0)
326 p
->Sid
= MIDL_user_allocate(AttributeSize
);
329 Status
= STATUS_INSUFFICIENT_RESOURCES
;
333 Status
= LsapGetObjectAttribute(PolicyObject
,
339 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
342 if (!NT_SUCCESS(Status
))
346 if (p
->DomainName
.Buffer
)
347 MIDL_user_free(p
->DomainName
.Buffer
);
350 MIDL_user_free(p
->Sid
);
361 LsarQueryDefaultQuota(PLSA_DB_OBJECT PolicyObject
,
362 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
364 PPOLICY_DEFAULT_QUOTA_INFO QuotaInfo
= NULL
;
368 *PolicyInformation
= NULL
;
370 AttributeSize
= sizeof(POLICY_DEFAULT_QUOTA_INFO
);
371 QuotaInfo
= MIDL_user_allocate(AttributeSize
);
372 if (QuotaInfo
== NULL
)
373 return STATUS_INSUFFICIENT_RESOURCES
;
375 Status
= LsapGetObjectAttribute(PolicyObject
,
379 if (!NT_SUCCESS(Status
))
381 MIDL_user_free(QuotaInfo
);
385 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)QuotaInfo
;
393 LsarQueryDnsDomain(PLSA_DB_OBJECT PolicyObject
,
394 PLSAPR_POLICY_INFORMATION
*PolicyInformation
)
396 PLSAPR_POLICY_DNS_DOMAIN_INFO p
= NULL
;
398 p
= MIDL_user_allocate(sizeof(LSAPR_POLICY_DNS_DOMAIN_INFO
));
400 return STATUS_INSUFFICIENT_RESOURCES
;
403 p
->Name
.MaximumLength
= 0;
404 p
->Name
.Buffer
= NULL
;
406 p
->Name
.Length
= wcslen(L
"COMPUTERNAME");
407 p
->Name
.MaximumLength
= p
->Name
.Length
+ sizeof(WCHAR
);
408 p
->Name
.Buffer
= MIDL_user_allocate(p
->Name
.MaximumLength
);
409 if (p
->Name
.Buffer
== NULL
)
412 return STATUS_INSUFFICIENT_RESOURCES
;
415 wcscpy(p
->Name
.Buffer
, L
"COMPUTERNAME");
418 p
->DnsDomainName
.Length
= 0;
419 p
->DnsDomainName
.MaximumLength
= 0;
420 p
->DnsDomainName
.Buffer
= NULL
;
422 p
->DnsForestName
.Length
= 0;
423 p
->DnsForestName
.MaximumLength
= 0;
424 p
->DnsForestName
.Buffer
= 0;
426 memset(&p
->DomainGuid
, 0, sizeof(GUID
));
428 p
->Sid
= NULL
; /* no domain, no workgroup */
430 *PolicyInformation
= (PLSAPR_POLICY_INFORMATION
)p
;
432 return STATUS_SUCCESS
;