Synchronize with trunk revision 59636 (just before Alex's CreateProcess revamp).
[reactos.git] / dll / win32 / samsrv / samsrv.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Security Account Manager (LSA) Server
4 * FILE: reactos/dll/win32/samsrv/samsrv.h
5 * PURPOSE: Common header file
6 *
7 * PROGRAMMERS: Eric Kohl
8 */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #define WIN32_NO_STATUS
13 #define _INC_WINDOWS
14 #define COM_NO_WINDOWS_H
15 #include <windef.h>
16 #include <winbase.h>
17 #include <winreg.h>
18 #include <winuser.h>
19 #define NTOS_MODE_USER
20 #include <ndk/cmfuncs.h>
21 #include <ndk/kefuncs.h>
22 #include <ndk/obfuncs.h>
23 #include <ndk/rtlfuncs.h>
24 #include <ddk/ntsam.h>
25 #include <ntsecapi.h>
26 #include <sddl.h>
27
28 #include <samsrv/samsrv.h>
29
30 #include <sam_s.h>
31
32 #include <wine/debug.h>
33
34 #include "resources.h"
35
36 typedef enum _SAM_DB_OBJECT_TYPE
37 {
38 SamDbIgnoreObject,
39 SamDbServerObject,
40 SamDbDomainObject,
41 SamDbAliasObject,
42 SamDbGroupObject,
43 SamDbUserObject
44 } SAM_DB_OBJECT_TYPE;
45
46 typedef struct _SAM_DB_OBJECT
47 {
48 ULONG Signature;
49 SAM_DB_OBJECT_TYPE ObjectType;
50 ULONG RefCount;
51 ACCESS_MASK Access;
52 LPWSTR Name;
53 HANDLE KeyHandle;
54 HANDLE MembersKeyHandle; // only used by Aliases
55 ULONG RelativeId;
56 BOOLEAN Trusted;
57 struct _SAM_DB_OBJECT *ParentObject;
58 } SAM_DB_OBJECT, *PSAM_DB_OBJECT;
59
60 #define SAMP_DB_SIGNATURE 0x87654321
61
62 typedef struct _SAM_ALIAS_FIXED_DATA
63 {
64 ULONG Version;
65 ULONG Reserved;
66 ULONG AliasId;
67 } SAM_ALIAS_FIXED_DATA, *PSAM_ALIAS_FIXED_DATA;
68
69 typedef struct _SAM_DOMAIN_FIXED_DATA
70 {
71 ULONG Version;
72 ULONG Reserved;
73 LARGE_INTEGER CreationTime;
74 LARGE_INTEGER DomainModifiedCount;
75 LARGE_INTEGER MaxPasswordAge; /* relative Time */
76 LARGE_INTEGER MinPasswordAge; /* relative Time */
77 LARGE_INTEGER ForceLogoff; /* relative Time */
78 LARGE_INTEGER LockoutDuration; /* relative Time */
79 LARGE_INTEGER LockoutObservationWindow; /* relative Time */
80 LARGE_INTEGER ModifiedCountAtLastPromotion;
81 ULONG NextRid;
82 ULONG PasswordProperties;
83 USHORT MinPasswordLength;
84 USHORT PasswordHistoryLength;
85 USHORT LockoutThreshold;
86 DOMAIN_SERVER_ENABLE_STATE DomainServerState;
87 DOMAIN_SERVER_ROLE DomainServerRole;
88 BOOLEAN UasCompatibilityRequired;
89 } SAM_DOMAIN_FIXED_DATA, *PSAM_DOMAIN_FIXED_DATA;
90
91 typedef struct _SAM_GROUP_FIXED_DATA
92 {
93 ULONG Version;
94 ULONG Reserved;
95 ULONG GroupId;
96 ULONG Attributes;
97 } SAM_GROUP_FIXED_DATA, *PSAM_GROUP_FIXED_DATA;
98
99 typedef struct _SAM_USER_FIXED_DATA
100 {
101 ULONG Version;
102 ULONG Reserved;
103 LARGE_INTEGER LastLogon;
104 LARGE_INTEGER LastLogoff;
105 LARGE_INTEGER PasswordLastSet;
106 LARGE_INTEGER AccountExpires;
107 LARGE_INTEGER LastBadPasswordTime;
108 ULONG UserId;
109 ULONG PrimaryGroupId;
110 ULONG UserAccountControl;
111 USHORT CountryCode;
112 USHORT CodePage;
113 USHORT BadPasswordCount;
114 USHORT LogonCount;
115 USHORT AdminCount;
116 USHORT OperatorCount;
117 } SAM_USER_FIXED_DATA, *PSAM_USER_FIXED_DATA;
118
119
120 extern PGENERIC_MAPPING pServerMapping;
121 extern ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash;
122 extern ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash;
123
124
125 /* alias.c */
126
127 NTSTATUS
128 SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject,
129 IN ULONG AliasId,
130 IN ACCESS_MASK DesiredAccess,
131 OUT PSAM_DB_OBJECT *AliasObject);
132
133 NTSTATUS
134 SampAddMemberToAlias(IN PSAM_DB_OBJECT AliasObject,
135 IN PRPC_SID MemberId);
136
137 NTSTATUS
138 NTAPI
139 SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject,
140 IN PRPC_SID MemberId);
141
142
143 /* database.c */
144
145 NTSTATUS
146 SampInitDatabase(VOID);
147
148 NTSTATUS
149 SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject,
150 IN LPWSTR ContainerName,
151 IN LPWSTR ObjectName,
152 IN ULONG RelativeId,
153 IN SAM_DB_OBJECT_TYPE ObjectType,
154 IN ACCESS_MASK DesiredAccess,
155 OUT PSAM_DB_OBJECT *DbObject);
156
157 NTSTATUS
158 SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject,
159 IN LPWSTR ContainerName,
160 IN LPWSTR ObjectName,
161 IN ULONG RelativeId,
162 IN SAM_DB_OBJECT_TYPE ObjectType,
163 IN ACCESS_MASK DesiredAccess,
164 OUT PSAM_DB_OBJECT *DbObject);
165
166 NTSTATUS
167 SampValidateDbObject(SAMPR_HANDLE Handle,
168 SAM_DB_OBJECT_TYPE ObjectType,
169 ACCESS_MASK DesiredAccess,
170 PSAM_DB_OBJECT *DbObject);
171
172 NTSTATUS
173 SampCloseDbObject(PSAM_DB_OBJECT DbObject);
174
175 NTSTATUS
176 SampDeleteAccountDbObject(PSAM_DB_OBJECT DbObject);
177
178 NTSTATUS
179 SampSetObjectAttribute(PSAM_DB_OBJECT DbObject,
180 LPWSTR AttributeName,
181 ULONG AttributeType,
182 LPVOID AttributeData,
183 ULONG AttributeSize);
184
185 NTSTATUS
186 SampGetObjectAttribute(PSAM_DB_OBJECT DbObject,
187 LPWSTR AttributeName,
188 PULONG AttributeType,
189 LPVOID AttributeData,
190 PULONG AttributeSize);
191
192 NTSTATUS
193 SampGetObjectAttributeString(PSAM_DB_OBJECT DbObject,
194 LPWSTR AttributeName,
195 RPC_UNICODE_STRING *String);
196
197
198 /* domain.c */
199
200 NTSTATUS
201 SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
202 IN LPCWSTR lpContainerName,
203 IN LPCWSTR lpAccountName,
204 IN ULONG ulRelativeId);
205
206 NTSTATUS
207 SampRemoveAccountNameFromDomain(IN PSAM_DB_OBJECT DomainObject,
208 IN LPCWSTR lpContainerName,
209 IN LPCWSTR lpAccountName);
210
211 NTSTATUS
212 SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
213 IN LPCWSTR lpAccountName);
214
215 NTSTATUS
216 SampRemoveMemberFromAllAliases(IN PSAM_DB_OBJECT DomainObject,
217 IN PRPC_SID MemberSid);
218
219
220 /* group.h */
221
222 NTSTATUS
223 SampOpenGroupObject(IN PSAM_DB_OBJECT DomainObject,
224 IN ULONG GroupId,
225 IN ACCESS_MASK DesiredAccess,
226 OUT PSAM_DB_OBJECT *GroupObject);
227
228 NTSTATUS
229 SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
230 IN ULONG MemberId);
231
232 NTSTATUS
233 SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject,
234 IN ULONG MemberId);
235
236
237 /* registry.h */
238
239 NTSTATUS
240 SampRegCloseKey(IN HANDLE KeyHandle);
241
242 NTSTATUS
243 SampRegCreateKey(IN HANDLE ParentKeyHandle,
244 IN LPCWSTR KeyName,
245 IN ACCESS_MASK DesiredAccess,
246 OUT HANDLE KeyHandle);
247
248 NTSTATUS
249 SampRegDeleteKey(IN HANDLE ParentKeyHandle,
250 IN LPCWSTR KeyName);
251
252 NTSTATUS
253 SampRegEnumerateSubKey(IN HANDLE KeyHandle,
254 IN ULONG Index,
255 IN ULONG Length,
256 OUT LPWSTR Buffer);
257
258 NTSTATUS
259 SampRegOpenKey(IN HANDLE ParentKeyHandle,
260 IN LPCWSTR KeyName,
261 IN ACCESS_MASK DesiredAccess,
262 OUT HANDLE KeyHandle);
263
264 NTSTATUS
265 SampRegQueryKeyInfo(IN HANDLE KeyHandle,
266 OUT PULONG SubKeyCount,
267 OUT PULONG ValueCount);
268
269 NTSTATUS
270 SampRegDeleteValue(IN HANDLE KeyHandle,
271 IN LPCWSTR ValueName);
272
273 NTSTATUS
274 SampRegEnumerateValue(IN HANDLE KeyHandle,
275 IN ULONG Index,
276 OUT LPWSTR Name,
277 IN OUT PULONG NameLength,
278 OUT PULONG Type OPTIONAL,
279 OUT PVOID Data OPTIONAL,
280 IN OUT PULONG DataLength OPTIONAL);
281
282 NTSTATUS
283 SampRegQueryValue(IN HANDLE KeyHandle,
284 IN LPCWSTR ValueName,
285 OUT PULONG Type OPTIONAL,
286 OUT LPVOID Data OPTIONAL,
287 IN OUT PULONG DataLength OPTIONAL);
288
289 NTSTATUS
290 SampRegSetValue(IN HANDLE KeyHandle,
291 IN LPCWSTR ValueName,
292 IN ULONG Type,
293 IN LPVOID Data,
294 IN ULONG DataLength);
295
296
297 /* samspc.c */
298
299 VOID
300 SampStartRpcServer(VOID);
301
302
303 /* security.c */
304
305 NTSTATUS
306 SampCreateServerSD(OUT PSECURITY_DESCRIPTOR *ServerSd,
307 OUT PULONG Size);
308
309 NTSTATUS
310 SampCreateBuiltinDomainSD(OUT PSECURITY_DESCRIPTOR *ServerSd,
311 OUT PULONG Size);
312
313 NTSTATUS
314 SampCreateAccountDomainSD(OUT PSECURITY_DESCRIPTOR *ServerSd,
315 OUT PULONG Size);
316
317
318 /* setup.c */
319
320 BOOL
321 SampInitializeSAM(VOID);
322
323
324 /* user.c */
325
326 NTSTATUS
327 SampOpenUserObject(IN PSAM_DB_OBJECT DomainObject,
328 IN ULONG UserId,
329 IN ACCESS_MASK DesiredAccess,
330 OUT PSAM_DB_OBJECT *UserObject);
331
332 NTSTATUS
333 SampAddGroupMembershipToUser(IN PSAM_DB_OBJECT UserObject,
334 IN ULONG GroupId,
335 IN ULONG Attributes);
336
337 NTSTATUS
338 SampRemoveGroupMembershipFromUser(IN PSAM_DB_OBJECT UserObject,
339 IN ULONG GroupId);
340
341 NTSTATUS
342 SampGetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
343 IN ULONG UserId,
344 IN ULONG GroupId,
345 OUT PULONG GroupAttributes);
346
347 NTSTATUS
348 SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
349 IN ULONG UserId,
350 IN ULONG GroupId,
351 IN ULONG GroupAttributes);
352
353 NTSTATUS
354 SampRemoveUserFromAllGroups(IN PSAM_DB_OBJECT UserObject);
355
356 NTSTATUS
357 SampSetUserPassword(IN PSAM_DB_OBJECT UserObject,
358 IN PENCRYPTED_NT_OWF_PASSWORD NtPassword,
359 IN BOOLEAN NtPasswordPresent,
360 IN PENCRYPTED_LM_OWF_PASSWORD LmPassword,
361 IN BOOLEAN LmPasswordPresent);
362
363 NTSTATUS
364 SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
365 IN OUT PSAMPR_LOGON_HOURS LogonHours);
366
367 NTSTATUS
368 SampSetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
369 IN PSAMPR_LOGON_HOURS LogonHours);
370
371
372 /* utils.c */
373
374 INT
375 SampLoadString(HINSTANCE hInstance,
376 UINT uId,
377 LPWSTR lpBuffer,
378 INT nBufferMax);
379
380 BOOL
381 SampIsSetupRunning(VOID);
382
383 PSID
384 AppendRidToSid(PSID SrcSid,
385 ULONG Rid);
386
387 NTSTATUS
388 SampGetRidFromSid(IN PSID Sid,
389 OUT PULONG Rid);
390
391 NTSTATUS
392 SampCheckAccountName(IN PRPC_UNICODE_STRING AccountName,
393 IN USHORT MaxLength);
394
395
396 /* Undocumented advapi32 functions */
397
398 NTSTATUS
399 WINAPI
400 SystemFunction006(LPCSTR password,
401 LPSTR hash);
402
403 NTSTATUS
404 WINAPI
405 SystemFunction007(PUNICODE_STRING string,
406 LPBYTE hash);
407
408 /* EOF */