[SAMSRV]
[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
145 /* database.c */
146
147 NTSTATUS
148 SampInitDatabase(VOID);
149
150 NTSTATUS
151 SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject,
152 IN LPWSTR ContainerName,
153 IN LPWSTR ObjectName,
154 IN ULONG RelativeId,
155 IN SAM_DB_OBJECT_TYPE ObjectType,
156 IN ACCESS_MASK DesiredAccess,
157 OUT PSAM_DB_OBJECT *DbObject);
158
159 NTSTATUS
160 SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject,
161 IN LPWSTR ContainerName,
162 IN LPWSTR ObjectName,
163 IN ULONG RelativeId,
164 IN SAM_DB_OBJECT_TYPE ObjectType,
165 IN ACCESS_MASK DesiredAccess,
166 OUT PSAM_DB_OBJECT *DbObject);
167
168 NTSTATUS
169 SampValidateDbObject(SAMPR_HANDLE Handle,
170 SAM_DB_OBJECT_TYPE ObjectType,
171 ACCESS_MASK DesiredAccess,
172 PSAM_DB_OBJECT *DbObject);
173
174 NTSTATUS
175 SampCloseDbObject(PSAM_DB_OBJECT DbObject);
176
177 NTSTATUS
178 SampDeleteAccountDbObject(PSAM_DB_OBJECT DbObject);
179
180 NTSTATUS
181 SampSetObjectAttribute(PSAM_DB_OBJECT DbObject,
182 LPWSTR AttributeName,
183 ULONG AttributeType,
184 LPVOID AttributeData,
185 ULONG AttributeSize);
186
187 NTSTATUS
188 SampGetObjectAttribute(PSAM_DB_OBJECT DbObject,
189 LPWSTR AttributeName,
190 PULONG AttributeType,
191 LPVOID AttributeData,
192 PULONG AttributeSize);
193
194 NTSTATUS
195 SampGetObjectAttributeString(PSAM_DB_OBJECT DbObject,
196 LPWSTR AttributeName,
197 RPC_UNICODE_STRING *String);
198
199
200 /* domain.c */
201
202 NTSTATUS
203 SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
204 IN LPCWSTR lpContainerName,
205 IN LPCWSTR lpAccountName,
206 IN ULONG ulRelativeId);
207
208 NTSTATUS
209 SampRemoveAccountNameFromDomain(IN PSAM_DB_OBJECT DomainObject,
210 IN LPCWSTR lpContainerName,
211 IN LPCWSTR lpAccountName);
212
213 NTSTATUS
214 SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
215 IN LPCWSTR lpAccountName);
216
217 NTSTATUS
218 SampRemoveMemberFromAllAliases(IN PSAM_DB_OBJECT DomainObject,
219 IN PRPC_SID MemberSid);
220
221
222 /* group.h */
223
224 NTSTATUS
225 SampOpenGroupObject(IN PSAM_DB_OBJECT DomainObject,
226 IN ULONG GroupId,
227 IN ACCESS_MASK DesiredAccess,
228 OUT PSAM_DB_OBJECT *GroupObject);
229
230 NTSTATUS
231 SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
232 IN ULONG MemberId);
233
234 NTSTATUS
235 SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject,
236 IN ULONG MemberId);
237
238
239 /* registry.h */
240
241 NTSTATUS
242 SampRegCloseKey(IN OUT PHANDLE KeyHandle);
243
244 NTSTATUS
245 SampRegCreateKey(IN HANDLE ParentKeyHandle,
246 IN LPCWSTR KeyName,
247 IN ACCESS_MASK DesiredAccess,
248 OUT PHANDLE KeyHandle);
249
250 NTSTATUS
251 SampRegDeleteKey(IN HANDLE ParentKeyHandle,
252 IN LPCWSTR KeyName);
253
254 NTSTATUS
255 SampRegEnumerateSubKey(IN HANDLE KeyHandle,
256 IN ULONG Index,
257 IN ULONG Length,
258 OUT LPWSTR Buffer);
259
260 NTSTATUS
261 SampRegOpenKey(IN HANDLE ParentKeyHandle,
262 IN LPCWSTR KeyName,
263 IN ACCESS_MASK DesiredAccess,
264 OUT PHANDLE KeyHandle);
265
266 NTSTATUS
267 SampRegQueryKeyInfo(IN HANDLE KeyHandle,
268 OUT PULONG SubKeyCount,
269 OUT PULONG ValueCount);
270
271 NTSTATUS
272 SampRegDeleteValue(IN HANDLE KeyHandle,
273 IN LPCWSTR ValueName);
274
275 NTSTATUS
276 SampRegEnumerateValue(IN HANDLE KeyHandle,
277 IN ULONG Index,
278 OUT LPWSTR Name,
279 IN OUT PULONG NameLength,
280 OUT PULONG Type OPTIONAL,
281 OUT PVOID Data OPTIONAL,
282 IN OUT PULONG DataLength OPTIONAL);
283
284 NTSTATUS
285 SampRegQueryValue(IN HANDLE KeyHandle,
286 IN LPCWSTR ValueName,
287 OUT PULONG Type OPTIONAL,
288 OUT LPVOID Data OPTIONAL,
289 IN OUT PULONG DataLength OPTIONAL);
290
291 NTSTATUS
292 SampRegSetValue(IN HANDLE KeyHandle,
293 IN LPCWSTR ValueName,
294 IN ULONG Type,
295 IN LPVOID Data,
296 IN ULONG DataLength);
297
298
299 /* samspc.c */
300
301 VOID
302 SampStartRpcServer(VOID);
303
304
305 /* security.c */
306
307 NTSTATUS
308 SampCreateServerSD(OUT PSECURITY_DESCRIPTOR *ServerSd,
309 OUT PULONG Size);
310
311 NTSTATUS
312 SampCreateBuiltinDomainSD(OUT PSECURITY_DESCRIPTOR *ServerSd,
313 OUT PULONG Size);
314
315 NTSTATUS
316 SampCreateAccountDomainSD(OUT PSECURITY_DESCRIPTOR *ServerSd,
317 OUT PULONG Size);
318
319
320 /* setup.c */
321
322 BOOL
323 SampInitializeSAM(VOID);
324
325
326 /* user.c */
327
328 NTSTATUS
329 SampOpenUserObject(IN PSAM_DB_OBJECT DomainObject,
330 IN ULONG UserId,
331 IN ACCESS_MASK DesiredAccess,
332 OUT PSAM_DB_OBJECT *UserObject);
333
334 NTSTATUS
335 SampAddGroupMembershipToUser(IN PSAM_DB_OBJECT UserObject,
336 IN ULONG GroupId,
337 IN ULONG Attributes);
338
339 NTSTATUS
340 SampRemoveGroupMembershipFromUser(IN PSAM_DB_OBJECT UserObject,
341 IN ULONG GroupId);
342
343 NTSTATUS
344 SampGetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
345 IN ULONG UserId,
346 IN ULONG GroupId,
347 OUT PULONG GroupAttributes);
348
349 NTSTATUS
350 SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
351 IN ULONG UserId,
352 IN ULONG GroupId,
353 IN ULONG GroupAttributes);
354
355 NTSTATUS
356 SampRemoveUserFromAllGroups(IN PSAM_DB_OBJECT UserObject);
357
358 NTSTATUS
359 SampSetUserPassword(IN PSAM_DB_OBJECT UserObject,
360 IN PENCRYPTED_NT_OWF_PASSWORD NtPassword,
361 IN BOOLEAN NtPasswordPresent,
362 IN PENCRYPTED_LM_OWF_PASSWORD LmPassword,
363 IN BOOLEAN LmPasswordPresent);
364
365 NTSTATUS
366 SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
367 IN OUT PSAMPR_LOGON_HOURS LogonHours);
368
369 NTSTATUS
370 SampSetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
371 IN PSAMPR_LOGON_HOURS LogonHours);
372
373
374 /* utils.c */
375
376 INT
377 SampLoadString(HINSTANCE hInstance,
378 UINT uId,
379 LPWSTR lpBuffer,
380 INT nBufferMax);
381
382 BOOL
383 SampIsSetupRunning(VOID);
384
385 PSID
386 AppendRidToSid(PSID SrcSid,
387 ULONG Rid);
388
389 NTSTATUS
390 SampGetRidFromSid(IN PSID Sid,
391 OUT PULONG Rid);
392
393 NTSTATUS
394 SampCheckAccountName(IN PRPC_UNICODE_STRING AccountName,
395 IN USHORT MaxLength);
396
397
398 /* Undocumented advapi32 functions */
399
400 NTSTATUS
401 WINAPI
402 SystemFunction006(LPCSTR password,
403 LPSTR hash);
404
405 NTSTATUS
406 WINAPI
407 SystemFunction007(PUNICODE_STRING string,
408 LPBYTE hash);
409
410 /* EOF */