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