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