advapi32: LsaFreeMemory returns NTSTATUS.
[wine] / dlls / advapi32 / lsa.c
1 /*
2  * Implementation of the Local Security Authority API
3  *
4  * Copyright 1999 Juergen Schmied
5  * Copyright 2002 Andriy Palamarchuk
6  * Copyright 2004 Mike McCormack
7  * Copyright 2005 Hans Leidekker
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 #include <stdarg.h>
25
26 #include "ntstatus.h"
27 #define WIN32_NO_STATUS
28 #include "windef.h"
29 #include "winbase.h"
30 #include "winreg.h"
31 #include "winternl.h"
32 #include "ntsecapi.h"
33 #include "advapi32_misc.h"
34
35 #include "wine/debug.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(advapi);
38
39 #define ADVAPI_ForceLocalComputer(ServerName, FailureCode) \
40     if (!ADVAPI_IsLocalComputer(ServerName)) \
41 { \
42         FIXME("Action Implemented for local computer only. " \
43               "Requested for server %s\n", debugstr_w(ServerName)); \
44         return FailureCode; \
45 }
46
47 static void dumpLsaAttributes(const LSA_OBJECT_ATTRIBUTES *oa)
48 {
49     if (oa)
50     {
51         TRACE("\n\tlength=%u, rootdir=%p, objectname=%s\n\tattr=0x%08x, sid=%s qos=%p\n",
52               oa->Length, oa->RootDirectory,
53               oa->ObjectName?debugstr_w(oa->ObjectName->Buffer):"null",
54               oa->Attributes, debugstr_sid(oa->SecurityDescriptor),
55               oa->SecurityQualityOfService);
56     }
57 }
58
59 static void* ADVAPI_GetDomainName(unsigned sz, unsigned ofs)
60 {
61     HKEY key;
62     LONG ret;
63     BYTE* ptr = NULL;
64     UNICODE_STRING* ustr;
65
66     static const WCHAR wVNETSUP[] = {
67         'S','y','s','t','e','m','\\',
68         'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
69         'S','e','r','v','i','c','e','s','\\',
70         'V','x','D','\\','V','N','E','T','S','U','P','\0'};
71
72     ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wVNETSUP, 0, KEY_READ, &key);
73     if (ret == ERROR_SUCCESS)
74     {
75         DWORD size = 0;
76         static const WCHAR wg[] = { 'W','o','r','k','g','r','o','u','p',0 };
77
78         ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size);
79         if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
80         {
81             ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz + size);
82             if (!ptr) return NULL;
83             ustr = (UNICODE_STRING*)(ptr + ofs);
84             ustr->MaximumLength = size;
85             ustr->Buffer = (WCHAR*)(ptr + sz);
86             ret = RegQueryValueExW(key, wg, NULL, NULL, (LPBYTE)ustr->Buffer, &size);
87             if (ret != ERROR_SUCCESS)
88             {
89                 HeapFree(GetProcessHeap(), 0, ptr);
90                 ptr = NULL;
91             }   
92             else ustr->Length = size - sizeof(WCHAR);
93         }
94         RegCloseKey(key);
95     }
96     if (!ptr)
97     {
98         static const WCHAR wDomain[] = {'D','O','M','A','I','N','\0'};
99         ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
100                         sz + sizeof(wDomain));
101         if (!ptr) return NULL;
102         ustr = (UNICODE_STRING*)(ptr + ofs);
103         ustr->MaximumLength = sizeof(wDomain);
104         ustr->Buffer = (WCHAR*)(ptr + sz);
105         ustr->Length = sizeof(wDomain) - sizeof(WCHAR);
106         memcpy(ustr->Buffer, wDomain, sizeof(wDomain));
107     }
108     return ptr;
109 }
110
111 /******************************************************************************
112  * LsaAddAccountRights [ADVAPI32.@]
113  *
114  */
115 NTSTATUS WINAPI LsaAddAccountRights(
116     LSA_HANDLE policy,
117     PSID sid,
118     PLSA_UNICODE_STRING rights,
119     ULONG count)
120 {
121     FIXME("(%p,%p,%p,0x%08x) stub\n", policy, sid, rights, count);
122     return STATUS_OBJECT_NAME_NOT_FOUND;
123 }
124
125 /******************************************************************************
126  * LsaClose [ADVAPI32.@]
127  *
128  * Closes a handle to a Policy or TrustedDomain.
129  *
130  * PARAMS
131  *  ObjectHandle [I] Handle to a Policy or TrustedDomain.
132  *
133  * RETURNS
134  *  Success: STATUS_SUCCESS.
135  *  Failure: NTSTATUS code.
136  */
137 NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle)
138 {
139     FIXME("(%p) stub\n", ObjectHandle);
140     return STATUS_SUCCESS;
141 }
142
143 /******************************************************************************
144  * LsaCreateTrustedDomainEx [ADVAPI32.@]
145  *
146  */
147 NTSTATUS WINAPI LsaCreateTrustedDomainEx(
148     LSA_HANDLE policy,
149     PTRUSTED_DOMAIN_INFORMATION_EX domain_info,
150     PTRUSTED_DOMAIN_AUTH_INFORMATION auth_info,
151     ACCESS_MASK access,
152     PLSA_HANDLE domain)
153 {
154     FIXME("(%p,%p,%p,0x%08x,%p) stub\n", policy, domain_info, auth_info,
155           access, domain);
156     return STATUS_SUCCESS;
157 }
158
159 /******************************************************************************
160  * LsaDeleteTrustedDomain [ADVAPI32.@]
161  *
162  */
163 NTSTATUS WINAPI LsaDeleteTrustedDomain(LSA_HANDLE policy, PSID sid)
164 {
165     FIXME("(%p,%p) stub\n", policy, sid);
166     return STATUS_SUCCESS;
167 }
168
169 /******************************************************************************
170  * LsaEnumerateAccountRights [ADVAPI32.@]
171  *
172  */
173 NTSTATUS WINAPI LsaEnumerateAccountRights(
174     LSA_HANDLE policy,
175     PSID sid,
176     PLSA_UNICODE_STRING *rights,
177     PULONG count)
178 {
179     FIXME("(%p,%p,%p,%p) stub\n", policy, sid, rights, count);
180     *rights = 0;
181     *count = 0;
182     return STATUS_OBJECT_NAME_NOT_FOUND;
183 }
184
185 /******************************************************************************
186  * LsaEnumerateAccountsWithUserRight [ADVAPI32.@]
187  *
188  */
189 NTSTATUS WINAPI LsaEnumerateAccountsWithUserRight(
190     LSA_HANDLE policy,
191     PLSA_UNICODE_STRING rights,
192     PVOID *buffer,
193     PULONG count)
194 {
195     FIXME("(%p,%p,%p,%p) stub\n", policy, rights, buffer, count);
196     return STATUS_NO_MORE_ENTRIES;
197 }
198
199 /******************************************************************************
200  * LsaEnumerateTrustedDomains [ADVAPI32.@]
201  *
202  * Returns the names and SIDs of trusted domains.
203  *
204  * PARAMS
205  *  PolicyHandle          [I] Handle to a Policy object.
206  *  EnumerationContext    [I] Pointer to an enumeration handle.
207  *  Buffer                [O] Contains the names and SIDs of trusted domains.
208  *  PreferredMaximumLength[I] Preferred maximum size in bytes of Buffer.
209  *  CountReturned         [O] Number of elements in Buffer.
210  *
211  * RETURNS
212  *  Success: STATUS_SUCCESS,
213  *           STATUS_MORE_ENTRIES,
214  *           STATUS_NO_MORE_ENTRIES
215  *  Failure: NTSTATUS code.
216  *
217  * NOTES
218  *  LsaEnumerateTrustedDomains can be called multiple times to enumerate
219  *  all trusted domains.
220  */
221 NTSTATUS WINAPI LsaEnumerateTrustedDomains(
222     IN LSA_HANDLE PolicyHandle,
223     IN PLSA_ENUMERATION_HANDLE EnumerationContext,
224     OUT PVOID* Buffer,
225     IN ULONG PreferredMaximumLength,
226     OUT PULONG CountReturned)
227 {
228     FIXME("(%p,%p,%p,0x%08x,%p) stub\n", PolicyHandle, EnumerationContext,
229           Buffer, PreferredMaximumLength, CountReturned);
230
231     if (CountReturned) *CountReturned = 0;
232     return STATUS_SUCCESS;
233 }
234
235 /******************************************************************************
236  * LsaEnumerateTrustedDomainsEx [ADVAPI32.@]
237  *
238  */
239 NTSTATUS WINAPI LsaEnumerateTrustedDomainsEx(
240     LSA_HANDLE policy,
241     PLSA_ENUMERATION_HANDLE context,
242     PVOID *buffer,
243     ULONG length,
244     PULONG count)
245 {
246     FIXME("(%p,%p,%p,0x%08x,%p) stub\n", policy, context, buffer, length, count);
247
248     if (count) *count = 0;
249     return STATUS_SUCCESS;
250 }
251
252 /******************************************************************************
253  * LsaFreeMemory [ADVAPI32.@]
254  *
255  * Frees memory allocated by a LSA function.
256  *
257  * PARAMS
258  *  Buffer [I] Memory buffer to free.
259  *
260  * RETURNS
261  *  Success: STATUS_SUCCESS.
262  *  Failure: NTSTATUS code.
263  */
264 NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer)
265 {
266     TRACE("(%p)\n", Buffer);
267
268     HeapFree(GetProcessHeap(), 0, Buffer);
269     return STATUS_SUCCESS;
270 }
271
272 /******************************************************************************
273  * LsaLookupNames [ADVAPI32.@]
274  *
275  * Returns the SIDs of an array of user, group, or local group names.
276  *
277  * PARAMS
278  *  PolicyHandle      [I] Handle to a Policy object.
279  *  Count             [I] Number of names in Names.
280  *  Names             [I] Array of names to lookup.
281  *  ReferencedDomains [O] Array of domains where the names were found.
282  *  Sids              [O] Array of SIDs corresponding to Names.
283  *
284  * RETURNS
285  *  Success: STATUS_SUCCESS,
286  *           STATUS_SOME_NOT_MAPPED
287  *  Failure: STATUS_NONE_MAPPED or NTSTATUS code.
288  */
289 NTSTATUS WINAPI LsaLookupNames(
290     IN LSA_HANDLE PolicyHandle,
291     IN ULONG Count,
292     IN PLSA_UNICODE_STRING Names,
293     OUT PLSA_REFERENCED_DOMAIN_LIST* ReferencedDomains,
294     OUT PLSA_TRANSLATED_SID* Sids)
295 {
296     FIXME("(%p,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Count, Names,
297           ReferencedDomains, Sids);
298
299     return STATUS_NONE_MAPPED;
300 }
301
302 /******************************************************************************
303  * LsaLookupNames2 [ADVAPI32.@]
304  *
305  */
306 NTSTATUS WINAPI LsaLookupNames2(
307     LSA_HANDLE policy,
308     ULONG flags,
309     ULONG count,
310     PLSA_UNICODE_STRING names,
311     PLSA_REFERENCED_DOMAIN_LIST *domains,
312     PLSA_TRANSLATED_SID2 *sids)
313 {
314     FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", policy, flags, count, names, domains, sids);
315     return STATUS_NONE_MAPPED;
316 }
317
318 /******************************************************************************
319  * LsaLookupSids [ADVAPI32.@]
320  *
321  * Looks up the names that correspond to an array of SIDs.
322  *
323  * PARAMS
324  *  PolicyHandle      [I] Handle to a Policy object.
325  *  Count             [I] Number of SIDs in the Sids array.
326  *  Sids              [I] Array of SIDs to lookup.
327  *  ReferencedDomains [O] Array of domains where the sids were found.
328  *  Names             [O] Array of names corresponding to Sids.
329  *
330  * RETURNS
331  *  Success: STATUS_SUCCESS,
332  *           STATUS_SOME_NOT_MAPPED
333  *  Failure: STATUS_NONE_MAPPED or NTSTATUS code.
334  */
335 NTSTATUS WINAPI LsaLookupSids(
336     IN LSA_HANDLE PolicyHandle,
337     IN ULONG Count,
338     IN PSID *Sids,
339     OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains,
340     OUT PLSA_TRANSLATED_NAME *Names )
341 {
342     FIXME("(%p,%u,%p,%p,%p) stub\n", PolicyHandle, Count, Sids,
343           ReferencedDomains, Names);
344
345     return STATUS_NONE_MAPPED;
346 }
347
348 /******************************************************************************
349  * LsaNtStatusToWinError [ADVAPI32.@]
350  *
351  * Converts an LSA NTSTATUS code to a Windows error code.
352  *
353  * PARAMS
354  *  Status [I] NTSTATUS code.
355  *
356  * RETURNS
357  *  Success: Corresponding Windows error code.
358  *  Failure: ERROR_MR_MID_NOT_FOUND.
359  */
360 ULONG WINAPI LsaNtStatusToWinError(NTSTATUS Status)
361 {
362     return RtlNtStatusToDosError(Status);
363 }
364
365 /******************************************************************************
366  * LsaOpenPolicy [ADVAPI32.@]
367  *
368  * Opens a handle to the Policy object on a local or remote system.
369  *
370  * PARAMS
371  *  SystemName       [I] Name of the target system.
372  *  ObjectAttributes [I] Connection attributes.
373  *  DesiredAccess    [I] Requested access rights.
374  *  PolicyHandle     [I/O] Handle to the Policy object.
375  *
376  * RETURNS
377  *  Success: STATUS_SUCCESS.
378  *  Failure: NTSTATUS code.
379  *
380  * NOTES
381  *  Set SystemName to NULL to open the local Policy object.
382  */
383 NTSTATUS WINAPI LsaOpenPolicy(
384     IN PLSA_UNICODE_STRING SystemName,
385     IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes,
386     IN ACCESS_MASK DesiredAccess,
387     IN OUT PLSA_HANDLE PolicyHandle)
388 {
389     FIXME("(%s,%p,0x%08x,%p) stub\n",
390           SystemName?debugstr_w(SystemName->Buffer):"(null)",
391           ObjectAttributes, DesiredAccess, PolicyHandle);
392
393     ADVAPI_ForceLocalComputer(SystemName ? SystemName->Buffer : NULL,
394                               STATUS_ACCESS_VIOLATION);
395     dumpLsaAttributes(ObjectAttributes);
396
397     if(PolicyHandle) *PolicyHandle = (LSA_HANDLE)0xcafe;
398     return STATUS_SUCCESS;
399 }
400
401 /******************************************************************************
402  * LsaOpenTrustedDomainByName [ADVAPI32.@]
403  *
404  */
405 NTSTATUS WINAPI LsaOpenTrustedDomainByName(
406     LSA_HANDLE policy,
407     PLSA_UNICODE_STRING name,
408     ACCESS_MASK access,
409     PLSA_HANDLE handle)
410 {
411     FIXME("(%p,%p,0x%08x,%p) stub\n", policy, name, access, handle);
412     return STATUS_OBJECT_NAME_NOT_FOUND;
413 }
414
415 /******************************************************************************
416  * LsaQueryInformationPolicy [ADVAPI32.@]
417  *
418  * Returns information about a Policy object.
419  *
420  * PARAMS
421  *  PolicyHandle     [I] Handle to a Policy object.
422  *  InformationClass [I] Type of information to retrieve.
423  *  Buffer           [O] Pointer to the requested information.
424  *
425  * RETURNS
426  *  Success: STATUS_SUCCESS.
427  *  Failure: NTSTATUS code.
428  */
429 NTSTATUS WINAPI LsaQueryInformationPolicy(
430     IN LSA_HANDLE PolicyHandle,
431     IN POLICY_INFORMATION_CLASS InformationClass,
432     OUT PVOID *Buffer)
433 {
434     TRACE("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer);
435
436     if(!Buffer) return STATUS_INVALID_PARAMETER;
437     switch (InformationClass)
438     {
439         case PolicyAuditEventsInformation: /* 2 */
440         {
441             PPOLICY_AUDIT_EVENTS_INFO p = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
442                                                     sizeof(POLICY_AUDIT_EVENTS_INFO));
443             p->AuditingMode = FALSE; /* no auditing */
444             *Buffer = p;
445         }
446         break;
447         case PolicyPrimaryDomainInformation: /* 3 */
448         {
449             /* Only the domain name is valid for the local computer.
450              * All other fields are zero.
451              */
452             PPOLICY_PRIMARY_DOMAIN_INFO pinfo;
453
454             pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), offsetof(POLICY_PRIMARY_DOMAIN_INFO, Name));
455
456             TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
457
458             *Buffer = pinfo;
459         }
460         break;
461         case PolicyAccountDomainInformation: /* 5 */
462         {
463             struct di
464             {
465                 POLICY_ACCOUNT_DOMAIN_INFO info;
466                 SID sid;
467                 DWORD padding[3];
468                 WCHAR domain[MAX_COMPUTERNAME_LENGTH + 1];
469             };
470
471             DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
472             struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
473
474             xdi->info.DomainName.MaximumLength = dwSize * sizeof(WCHAR);
475             xdi->info.DomainName.Buffer = xdi->domain;
476             if (GetComputerNameW(xdi->info.DomainName.Buffer, &dwSize))
477                 xdi->info.DomainName.Length = dwSize * sizeof(WCHAR);
478
479             TRACE("setting name to %s\n", debugstr_w(xdi->info.DomainName.Buffer));
480
481             xdi->info.DomainSid = &xdi->sid;
482
483             /* read the computer SID from the registry */
484             if (!ADVAPI_GetComputerSid(&xdi->sid))
485             {
486                 HeapFree(GetProcessHeap(), 0, xdi);
487
488                 WARN("Computer SID not found\n");
489
490                 return STATUS_UNSUCCESSFUL;
491             }
492
493             TRACE("setting SID to %s\n", debugstr_sid(&xdi->sid));
494
495             *Buffer = xdi;
496         }
497         break;
498         case  PolicyDnsDomainInformation:       /* 12 (0xc) */
499         {
500             /* Only the domain name is valid for the local computer.
501              * All other fields are zero.
502              */
503             PPOLICY_DNS_DOMAIN_INFO pinfo;
504
505             pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), offsetof(POLICY_DNS_DOMAIN_INFO, Name));
506
507             TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
508
509             *Buffer = pinfo;
510         }
511         break;
512         case  PolicyAuditLogInformation:
513         case  PolicyPdAccountInformation:
514         case  PolicyLsaServerRoleInformation:
515         case  PolicyReplicaSourceInformation:
516         case  PolicyDefaultQuotaInformation:
517         case  PolicyModificationInformation:
518         case  PolicyAuditFullSetInformation:
519         case  PolicyAuditFullQueryInformation:
520         {
521             FIXME("category %d not implemented\n", InformationClass);
522             return STATUS_UNSUCCESSFUL;
523         }
524     }
525     return STATUS_SUCCESS;
526 }
527
528 /******************************************************************************
529  * LsaQueryTrustedDomainInfo [ADVAPI32.@]
530  *
531  */
532 NTSTATUS WINAPI LsaQueryTrustedDomainInfo(
533     LSA_HANDLE policy,
534     PSID sid,
535     TRUSTED_INFORMATION_CLASS class,
536     PVOID *buffer)
537 {
538     FIXME("(%p,%p,%d,%p) stub\n", policy, sid, class, buffer);
539     return STATUS_OBJECT_NAME_NOT_FOUND;
540 }
541
542 /******************************************************************************
543  * LsaQueryTrustedDomainInfoByName [ADVAPI32.@]
544  *
545  */
546 NTSTATUS WINAPI LsaQueryTrustedDomainInfoByName(
547     LSA_HANDLE policy,
548     PLSA_UNICODE_STRING name,
549     TRUSTED_INFORMATION_CLASS class,
550     PVOID *buffer)
551 {
552     FIXME("(%p,%p,%d,%p) stub\n", policy, name, class, buffer);
553     return STATUS_OBJECT_NAME_NOT_FOUND;
554 }
555
556 /******************************************************************************
557  * LsaRegisterPolicyChangeNotification [ADVAPI32.@]
558  *
559  */
560 NTSTATUS WINAPI LsaRegisterPolicyChangeNotification(
561     POLICY_NOTIFICATION_INFORMATION_CLASS class,
562     HANDLE event)
563 {
564     FIXME("(%d,%p) stub\n", class, event);
565     return STATUS_UNSUCCESSFUL;
566 }
567
568 /******************************************************************************
569  * LsaRemoveAccountRights [ADVAPI32.@]
570  *
571  */
572 NTSTATUS WINAPI LsaRemoveAccountRights(
573     LSA_HANDLE policy,
574     PSID sid,
575     BOOLEAN all,
576     PLSA_UNICODE_STRING rights,
577     ULONG count)
578 {
579     FIXME("(%p,%p,%d,%p,0x%08x) stub\n", policy, sid, all, rights, count);
580     return STATUS_SUCCESS;
581 }
582
583 /******************************************************************************
584  * LsaRetrievePrivateData [ADVAPI32.@]
585  *
586  * Retrieves data stored by LsaStorePrivateData.
587  *
588  * PARAMS
589  *  PolicyHandle [I] Handle to a Policy object.
590  *  KeyName      [I] Name of the key where the data is stored.
591  *  PrivateData  [O] Pointer to the private data.
592  *
593  * RETURNS
594  *  Success: STATUS_SUCCESS.
595  *  Failure: STATUS_OBJECT_NAME_NOT_FOUND or NTSTATUS code.
596  */
597 NTSTATUS WINAPI LsaRetrievePrivateData(
598     IN LSA_HANDLE PolicyHandle,
599     IN PLSA_UNICODE_STRING KeyName,
600     OUT PLSA_UNICODE_STRING* PrivateData)
601 {
602     FIXME("(%p,%p,%p) stub\n", PolicyHandle, KeyName, PrivateData);
603     return STATUS_OBJECT_NAME_NOT_FOUND;
604 }
605
606 /******************************************************************************
607  * LsaSetInformationPolicy [ADVAPI32.@]
608  *
609  * Modifies information in a Policy object.
610  *
611  * PARAMS
612  *  PolicyHandle     [I] Handle to a Policy object.
613  *  InformationClass [I] Type of information to set.
614  *  Buffer           [I] Pointer to the information to set.
615  *
616  * RETURNS
617  *  Success: STATUS_SUCCESS.
618  *  Failure: NTSTATUS code.
619  */
620 NTSTATUS WINAPI LsaSetInformationPolicy(
621     IN LSA_HANDLE PolicyHandle,
622     IN POLICY_INFORMATION_CLASS InformationClass,
623     IN PVOID Buffer)
624 {
625     FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle, InformationClass, Buffer);
626
627     return STATUS_UNSUCCESSFUL;
628 }
629
630 /******************************************************************************
631  * LsaSetSecret [ADVAPI32.@]
632  *
633  * Set old and new values on a secret handle
634  *
635  * PARAMS
636  *  SecretHandle          [I] Handle to a secret object.
637  *  EncryptedCurrentValue [I] Pointer to encrypted new value, can be NULL
638  *  EncryptedOldValue     [I] Pointer to encrypted old value, can be NULL
639  *
640  * RETURNS
641  *  Success: STATUS_SUCCESS
642  *  Failure: NTSTATUS code.
643  */
644 NTSTATUS WINAPI LsaSetSecret(
645     IN LSA_HANDLE SecretHandle,
646     IN PLSA_UNICODE_STRING EncryptedCurrentValue,
647     IN PLSA_UNICODE_STRING EncryptedOldValue)
648 {
649     FIXME("(%p,%p,%p) stub\n", SecretHandle, EncryptedCurrentValue,
650             EncryptedOldValue);
651     return STATUS_SUCCESS;
652 }
653
654 /******************************************************************************
655  * LsaSetTrustedDomainInfoByName [ADVAPI32.@]
656  *
657  */
658 NTSTATUS WINAPI LsaSetTrustedDomainInfoByName(
659     LSA_HANDLE policy,
660     PLSA_UNICODE_STRING name,
661     TRUSTED_INFORMATION_CLASS class,
662     PVOID buffer)
663 {
664     FIXME("(%p,%p,%d,%p) stub\n", policy, name, class, buffer);
665     return STATUS_SUCCESS;
666 }
667
668 /******************************************************************************
669  * LsaSetTrustedDomainInformation [ADVAPI32.@]
670  *
671  */
672 NTSTATUS WINAPI LsaSetTrustedDomainInformation(
673     LSA_HANDLE policy,
674     PSID sid,
675     TRUSTED_INFORMATION_CLASS class,
676     PVOID buffer)
677 {
678     FIXME("(%p,%p,%d,%p) stub\n", policy, sid, class, buffer);
679     return STATUS_SUCCESS;
680 }
681
682 /******************************************************************************
683  * LsaStorePrivateData [ADVAPI32.@]
684  *
685  * Stores or deletes a Policy object's data under the specified reg key.
686  *
687  * PARAMS
688  *  PolicyHandle [I] Handle to a Policy object.
689  *  KeyName      [I] Name of the key where the data will be stored.
690  *  PrivateData  [O] Pointer to the private data.
691  *
692  * RETURNS
693  *  Success: STATUS_SUCCESS.
694  *  Failure: STATUS_OBJECT_NAME_NOT_FOUND or NTSTATUS code.
695  */
696 NTSTATUS WINAPI LsaStorePrivateData(
697     IN LSA_HANDLE PolicyHandle,
698     IN PLSA_UNICODE_STRING KeyName,
699     IN PLSA_UNICODE_STRING PrivateData)
700 {
701     FIXME("(%p,%p,%p) stub\n", PolicyHandle, KeyName, PrivateData);
702     return STATUS_OBJECT_NAME_NOT_FOUND;
703 }
704
705 /******************************************************************************
706  * LsaUnregisterPolicyChangeNotification [ADVAPI32.@]
707  *
708  */
709 NTSTATUS WINAPI LsaUnregisterPolicyChangeNotification(
710     POLICY_NOTIFICATION_INFORMATION_CLASS class,
711     HANDLE event)
712 {
713     FIXME("(%d,%p) stub\n", class, event);
714     return STATUS_SUCCESS;
715 }