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