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