1 /* 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 7 */ 8 9 /* INCLUDES ****************************************************************/ 10 11 #include "lsasrv.h" 12 13 WINE_DEFAULT_DEBUG_CHANNEL(lsasrv); 14 15 16 /* FUNCTIONS ***************************************************************/ 17 18 NTSTATUS 19 LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle, 20 PLSAPR_POLICY_PRIMARY_DOM_INFO Info) 21 { 22 PUNICODE_STRING Buffer; 23 ULONG Length = 0; 24 NTSTATUS Status; 25 LPWSTR Ptr; 26 27 TRACE("LsarSetPrimaryDomain(%p, %p)\n", PolicyHandle, Info); 28 29 Length = sizeof(UNICODE_STRING) + Info->Name.MaximumLength; 30 Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 31 0, 32 Length); 33 if (Buffer == NULL) 34 return STATUS_INSUFFICIENT_RESOURCES; 35 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); 41 42 Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 43 L"PolPrDmN", 44 Buffer, Length); 45 46 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); 47 48 if (!NT_SUCCESS(Status)) 49 return Status; 50 51 Length = 0; 52 if (Info->Sid != NULL) 53 Length = RtlLengthSid(Info->Sid); 54 55 Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 56 L"PolPrDmS", 57 (LPBYTE)Info->Sid, 58 Length); 59 60 return Status; 61 } 62 63 64 NTSTATUS 65 LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle, 66 PLSAPR_POLICY_ACCOUNT_DOM_INFO Info) 67 { 68 PUNICODE_STRING Buffer; 69 ULONG Length = 0; 70 NTSTATUS Status; 71 LPWSTR Ptr; 72 73 TRACE("LsarSetAccountDomain(%p, %p)\n", PolicyHandle, Info); 74 75 Length = sizeof(UNICODE_STRING) + Info->DomainName.MaximumLength; 76 Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 77 0, 78 Length); 79 if (Buffer == NULL) 80 return STATUS_INSUFFICIENT_RESOURCES; 81 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); 87 88 Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 89 L"PolAcDmN", 90 Buffer, Length); 91 92 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); 93 94 if (!NT_SUCCESS(Status)) 95 return Status; 96 97 Length = 0; 98 if (Info->Sid != NULL) 99 Length = RtlLengthSid(Info->Sid); 100 101 Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 102 L"PolAcDmS", 103 (LPBYTE)Info->Sid, 104 Length); 105 106 return Status; 107 } 108 109 110 NTSTATUS 111 LsarSetDnsDomain(LSAPR_HANDLE PolicyHandle, 112 PLSAPR_POLICY_DNS_DOMAIN_INFO Info) 113 { 114 115 return STATUS_NOT_IMPLEMENTED; 116 } 117 118 119 NTSTATUS 120 LsarQueryAuditEvents(LSAPR_HANDLE PolicyHandle, 121 PLSAPR_POLICY_INFORMATION *PolicyInformation) 122 { 123 PLSAPR_POLICY_AUDIT_EVENTS_INFO p = NULL; 124 125 p = MIDL_user_allocate(sizeof(LSAPR_POLICY_AUDIT_EVENTS_INFO)); 126 if (p == NULL) 127 return STATUS_INSUFFICIENT_RESOURCES; 128 129 p->AuditingMode = FALSE; /* no auditing */ 130 p->EventAuditingOptions = NULL; 131 p->MaximumAuditEventCount = 0; 132 133 *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; 134 135 return STATUS_SUCCESS; 136 } 137 138 139 NTSTATUS 140 LsarQueryPrimaryDomain(LSAPR_HANDLE PolicyHandle, 141 PLSAPR_POLICY_INFORMATION *PolicyInformation) 142 { 143 PLSAPR_POLICY_PRIMARY_DOM_INFO p = NULL; 144 PUNICODE_STRING DomainName; 145 ULONG AttributeSize; 146 NTSTATUS Status; 147 148 *PolicyInformation = NULL; 149 150 p = MIDL_user_allocate(sizeof(LSAPR_POLICY_PRIMARY_DOM_INFO)); 151 if (p == NULL) 152 return STATUS_INSUFFICIENT_RESOURCES; 153 154 /* Domain Name */ 155 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 156 L"PolPrDmN", 157 NULL, 158 &AttributeSize); 159 if (!NT_SUCCESS(Status)) 160 { 161 goto Done; 162 } 163 164 if (AttributeSize > 0) 165 { 166 DomainName = MIDL_user_allocate(AttributeSize); 167 if (DomainName == NULL) 168 { 169 Status = STATUS_INSUFFICIENT_RESOURCES; 170 goto Done; 171 } 172 173 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 174 L"PolPrDmN", 175 DomainName, 176 &AttributeSize); 177 if (Status == STATUS_SUCCESS) 178 { 179 DomainName->Buffer = (LPWSTR)((ULONG_PTR)DomainName + (ULONG_PTR)DomainName->Buffer); 180 181 TRACE("PrimaryDomainName: %wZ\n", DomainName); 182 183 p->Name.Buffer = MIDL_user_allocate(DomainName->MaximumLength); 184 if (p->Name.Buffer == NULL) 185 { 186 MIDL_user_free(DomainName); 187 Status = STATUS_INSUFFICIENT_RESOURCES; 188 goto Done; 189 } 190 191 p->Name.Length = DomainName->Length; 192 p->Name.MaximumLength = DomainName->MaximumLength; 193 memcpy(p->Name.Buffer, 194 DomainName->Buffer, 195 DomainName->MaximumLength); 196 } 197 198 MIDL_user_free(DomainName); 199 } 200 201 /* Domain SID */ 202 AttributeSize = 0; 203 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 204 L"PolPrDmS", 205 NULL, 206 &AttributeSize); 207 if (!NT_SUCCESS(Status)) 208 { 209 goto Done; 210 } 211 212 if (AttributeSize > 0) 213 { 214 p->Sid = MIDL_user_allocate(AttributeSize); 215 if (p->Sid == NULL) 216 { 217 Status = STATUS_INSUFFICIENT_RESOURCES; 218 goto Done; 219 } 220 221 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 222 L"PolPrDmS", 223 p->Sid, 224 &AttributeSize); 225 } 226 227 *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; 228 229 Done: 230 if (!NT_SUCCESS(Status)) 231 { 232 if (p) 233 { 234 if (p->Name.Buffer) 235 MIDL_user_free(p->Name.Buffer); 236 237 if (p->Sid) 238 MIDL_user_free(p->Sid); 239 240 MIDL_user_free(p); 241 } 242 } 243 244 return STATUS_SUCCESS; 245 } 246 247 248 NTSTATUS 249 LsarQueryAccountDomain(LSAPR_HANDLE PolicyHandle, 250 PLSAPR_POLICY_INFORMATION *PolicyInformation) 251 { 252 PLSAPR_POLICY_ACCOUNT_DOM_INFO p = NULL; 253 PUNICODE_STRING DomainName; 254 ULONG AttributeSize; 255 NTSTATUS Status; 256 257 *PolicyInformation = NULL; 258 259 p = MIDL_user_allocate(sizeof(LSAPR_POLICY_ACCOUNT_DOM_INFO)); 260 if (p == NULL) 261 return STATUS_INSUFFICIENT_RESOURCES; 262 263 /* Domain Name */ 264 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 265 L"PolAcDmN", 266 NULL, 267 &AttributeSize); 268 if (!NT_SUCCESS(Status)) 269 { 270 goto Done; 271 } 272 273 if (AttributeSize > 0) 274 { 275 DomainName = MIDL_user_allocate(AttributeSize); 276 if (DomainName == NULL) 277 { 278 Status = STATUS_INSUFFICIENT_RESOURCES; 279 goto Done; 280 } 281 282 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 283 L"PolAcDmN", 284 DomainName, 285 &AttributeSize); 286 if (Status == STATUS_SUCCESS) 287 { 288 DomainName->Buffer = (LPWSTR)((ULONG_PTR)DomainName + (ULONG_PTR)DomainName->Buffer); 289 290 TRACE("AccountDomainName: %wZ\n", DomainName); 291 292 p->DomainName.Buffer = MIDL_user_allocate(DomainName->MaximumLength); 293 if (p->DomainName.Buffer == NULL) 294 { 295 MIDL_user_free(DomainName); 296 Status = STATUS_INSUFFICIENT_RESOURCES; 297 goto Done; 298 } 299 300 p->DomainName.Length = DomainName->Length; 301 p->DomainName.MaximumLength = DomainName->MaximumLength; 302 memcpy(p->DomainName.Buffer, 303 DomainName->Buffer, 304 DomainName->MaximumLength); 305 } 306 307 MIDL_user_free(DomainName); 308 } 309 310 /* Domain SID */ 311 AttributeSize = 0; 312 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 313 L"PolAcDmS", 314 NULL, 315 &AttributeSize); 316 if (!NT_SUCCESS(Status)) 317 { 318 goto Done; 319 } 320 321 if (AttributeSize > 0) 322 { 323 p->Sid = MIDL_user_allocate(AttributeSize); 324 if (p->Sid == NULL) 325 { 326 Status = STATUS_INSUFFICIENT_RESOURCES; 327 goto Done; 328 } 329 330 Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle, 331 L"PolAcDmS", 332 p->Sid, 333 &AttributeSize); 334 } 335 336 *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; 337 338 Done: 339 if (!NT_SUCCESS(Status)) 340 { 341 if (p) 342 { 343 if (p->DomainName.Buffer) 344 MIDL_user_free(p->DomainName.Buffer); 345 346 if (p->Sid) 347 MIDL_user_free(p->Sid); 348 349 MIDL_user_free(p); 350 } 351 } 352 353 return STATUS_SUCCESS; 354 } 355 356 357 NTSTATUS 358 LsarQueryDnsDomain(LSAPR_HANDLE PolicyHandle, 359 PLSAPR_POLICY_INFORMATION *PolicyInformation) 360 { 361 PLSAPR_POLICY_DNS_DOMAIN_INFO p = NULL; 362 363 p = MIDL_user_allocate(sizeof(LSAPR_POLICY_DNS_DOMAIN_INFO)); 364 if (p == NULL) 365 return STATUS_INSUFFICIENT_RESOURCES; 366 367 p->Name.Length = 0; 368 p->Name.MaximumLength = 0; 369 p->Name.Buffer = NULL; 370 #if 0 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) 375 { 376 MIDL_user_free(p); 377 return STATUS_INSUFFICIENT_RESOURCES; 378 } 379 380 wcscpy(p->Name.Buffer, L"COMPUTERNAME"); 381 #endif 382 383 p->DnsDomainName.Length = 0; 384 p->DnsDomainName.MaximumLength = 0; 385 p->DnsDomainName.Buffer = NULL; 386 387 p->DnsForestName.Length = 0; 388 p->DnsForestName.MaximumLength = 0; 389 p->DnsForestName.Buffer = 0; 390 391 memset(&p->DomainGuid, 0, sizeof(GUID)); 392 393 p->Sid = NULL; /* no domain, no workgroup */ 394 395 *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; 396 397 return STATUS_SUCCESS; 398 } 399 400 /* EOF */ 401