201d116a57fac6395137c0f33704f80787f5f0c6
[reactos.git] / reactos / dll / win32 / samsrv / samsrv.c
1 /*
2 * SAM Server DLL
3 * Copyright (C) 2005 Eric Kohl
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "samsrv.h"
21
22 #include <samsrv/samsrv.h>
23
24 /* GLOBALS *******************************************************************/
25
26 ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash;
27 ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash;
28 RTL_RESOURCE SampResource;
29
30
31 /* FUNCTIONS *****************************************************************/
32
33 static
34 NTSTATUS
35 SampInitHashes(VOID)
36 {
37 UNICODE_STRING EmptyNtPassword = {0, 0, NULL};
38 CHAR EmptyLmPassword[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
39 NTSTATUS Status;
40
41 /* Calculate the NT hash value of the empty password */
42 Status = SystemFunction007(&EmptyNtPassword,
43 (LPBYTE)&EmptyNtHash);
44 if (!NT_SUCCESS(Status))
45 {
46 ERR("Calculation of the empty NT hash failed (Status 0x%08lx)\n", Status);
47 return Status;
48 }
49
50 /* Calculate the LM hash value of the empty password */
51 Status = SystemFunction006(EmptyLmPassword,
52 (LPSTR)&EmptyLmHash);
53 if (!NT_SUCCESS(Status))
54 {
55 ERR("Calculation of the empty LM hash failed (Status 0x%08lx)\n", Status);
56 }
57
58 return Status;
59 }
60
61
62 NTSTATUS
63 NTAPI
64 SamIConnect(IN PSAMPR_SERVER_NAME ServerName,
65 OUT SAMPR_HANDLE *ServerHandle,
66 IN ACCESS_MASK DesiredAccess,
67 IN BOOLEAN Trusted)
68 {
69 PSAM_DB_OBJECT ServerObject;
70 NTSTATUS Status;
71
72 TRACE("SamIConnect(%p %p %lx %ld)\n",
73 ServerName, ServerHandle, DesiredAccess, Trusted);
74
75 /* Map generic access rights */
76 RtlMapGenericMask(&DesiredAccess,
77 pServerMapping);
78
79 /* Open the Server Object */
80 Status = SampOpenDbObject(NULL,
81 NULL,
82 L"SAM",
83 0,
84 SamDbServerObject,
85 DesiredAccess,
86 &ServerObject);
87 if (NT_SUCCESS(Status))
88 {
89 ServerObject->Trusted = Trusted;
90 *ServerHandle = (SAMPR_HANDLE)ServerObject;
91 }
92
93 TRACE("SamIConnect done (Status 0x%08lx)\n", Status);
94
95 return Status;
96 }
97
98
99 NTSTATUS
100 NTAPI
101 SamIInitialize(VOID)
102 {
103 NTSTATUS Status = STATUS_SUCCESS;
104
105 TRACE("SamIInitialize() called\n");
106
107 Status = SampInitHashes();
108 if (!NT_SUCCESS(Status))
109 return Status;
110
111 if (SampIsSetupRunning())
112 {
113 Status = SampInitializeRegistry();
114 if (!NT_SUCCESS(Status))
115 return Status;
116 }
117
118 RtlInitializeResource(&SampResource);
119
120 /* Initialize the SAM database */
121 Status = SampInitDatabase();
122 if (!NT_SUCCESS(Status))
123 return Status;
124
125 /* Start the RPC server */
126 SampStartRpcServer();
127
128 return Status;
129 }
130
131
132 NTSTATUS
133 NTAPI
134 SampInitializeRegistry(VOID)
135 {
136 TRACE("SampInitializeRegistry() called\n");
137
138 SampInitializeSAM();
139
140 return STATUS_SUCCESS;
141 }
142
143
144 VOID
145 NTAPI
146 SamIFree_SAMPR_ENUMERATION_BUFFER(PSAMPR_ENUMERATION_BUFFER Ptr)
147 {
148 ULONG i;
149
150 if (Ptr != NULL)
151 {
152 if (Ptr->Buffer != NULL)
153 {
154 for (i = 0; i < Ptr->EntriesRead; i++)
155 {
156 if (Ptr->Buffer[i].Name.Buffer != NULL)
157 MIDL_user_free(Ptr->Buffer[i].Name.Buffer);
158 }
159
160 MIDL_user_free(Ptr->Buffer);
161 }
162
163 MIDL_user_free(Ptr);
164 }
165 }
166
167
168 VOID
169 NTAPI
170 SamIFree_SAMPR_GET_GROUPS_BUFFER(PSAMPR_GET_GROUPS_BUFFER Ptr)
171 {
172 if (Ptr != NULL)
173 {
174 if (Ptr->Groups != NULL)
175 MIDL_user_free(Ptr->Groups);
176
177 MIDL_user_free(Ptr);
178 }
179 }
180
181
182 VOID
183 NTAPI
184 SamIFree_SAMPR_GET_MEMBERS_BUFFER(PSAMPR_GET_MEMBERS_BUFFER Ptr)
185 {
186 if (Ptr != NULL)
187 {
188 if (Ptr->Members != NULL)
189 MIDL_user_free(Ptr->Members);
190
191 if (Ptr->Attributes != NULL)
192 MIDL_user_free(Ptr->Attributes);
193
194 MIDL_user_free(Ptr);
195 }
196 }
197
198
199 VOID
200 NTAPI
201 SamIFree_SAMPR_PSID_ARRAY(PSAMPR_PSID_ARRAY Ptr)
202 {
203 if (Ptr != NULL)
204 {
205 if (Ptr->Sids != NULL)
206 {
207 MIDL_user_free(Ptr->Sids);
208 }
209 }
210 }
211
212
213 VOID
214 NTAPI
215 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr)
216 {
217 ULONG i;
218
219 if (Ptr != NULL)
220 {
221 if (Ptr->Element != NULL)
222 {
223 for (i = 0; i < Ptr->Count; i++)
224 {
225 if (Ptr->Element[i].Buffer != NULL)
226 MIDL_user_free(Ptr->Element[i].Buffer);
227 }
228
229 MIDL_user_free(Ptr->Element);
230 Ptr->Element = NULL;
231 Ptr->Count = 0;
232 }
233 }
234 }
235
236
237 VOID
238 NTAPI
239 SamIFree_SAMPR_SR_SECURITY_DESCRIPTOR(PSAMPR_SR_SECURITY_DESCRIPTOR Ptr)
240 {
241 if (Ptr != NULL)
242 {
243 if (Ptr->SecurityDescriptor != NULL)
244 MIDL_user_free(Ptr->SecurityDescriptor);
245
246 MIDL_user_free(Ptr);
247 }
248 }
249
250
251 VOID
252 NTAPI
253 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr)
254 {
255 if (Ptr != NULL)
256 {
257 if (Ptr->Element != NULL)
258 {
259 MIDL_user_free(Ptr->Element);
260 Ptr->Element = NULL;
261 Ptr->Count = 0;
262 }
263 }
264 }
265
266
267 VOID
268 NTAPI
269 SamIFree_SAMPR_USER_INFO_BUFFER(PSAMPR_USER_INFO_BUFFER Ptr,
270 USER_INFORMATION_CLASS InformationClass)
271 {
272 if (Ptr == NULL)
273 return;
274
275 switch (InformationClass)
276 {
277 case UserGeneralInformation:
278 if (Ptr->General.UserName.Buffer != NULL)
279 MIDL_user_free(Ptr->General.UserName.Buffer);
280
281 if (Ptr->General.FullName.Buffer != NULL)
282 MIDL_user_free(Ptr->General.FullName.Buffer);
283
284 if (Ptr->General.AdminComment.Buffer != NULL)
285 MIDL_user_free(Ptr->General.AdminComment.Buffer);
286
287 if (Ptr->General.UserComment.Buffer != NULL)
288 MIDL_user_free(Ptr->General.UserComment.Buffer);
289 break;
290
291 case UserPreferencesInformation:
292 if (Ptr->Preferences.UserComment.Buffer != NULL)
293 MIDL_user_free(Ptr->Preferences.UserComment.Buffer);
294
295 if (Ptr->Preferences.Reserved1.Buffer != NULL)
296 MIDL_user_free(Ptr->Preferences.Reserved1.Buffer);
297 break;
298
299 case UserLogonInformation:
300 if (Ptr->Logon.UserName.Buffer != NULL)
301 MIDL_user_free(Ptr->Logon.UserName.Buffer);
302
303 if (Ptr->Logon.FullName.Buffer != NULL)
304 MIDL_user_free(Ptr->Logon.FullName.Buffer);
305
306 if (Ptr->Logon.HomeDirectory.Buffer != NULL)
307 MIDL_user_free(Ptr->Logon.HomeDirectory.Buffer);
308
309 if (Ptr->Logon.HomeDirectoryDrive.Buffer != NULL)
310 MIDL_user_free(Ptr->Logon.HomeDirectoryDrive.Buffer);
311
312 if (Ptr->Logon.ScriptPath.Buffer != NULL)
313 MIDL_user_free(Ptr->Logon.ScriptPath.Buffer);
314
315 if (Ptr->Logon.ProfilePath.Buffer != NULL)
316 MIDL_user_free(Ptr->Logon.ProfilePath.Buffer);
317
318 if (Ptr->Logon.WorkStations.Buffer != NULL)
319 MIDL_user_free(Ptr->Logon.WorkStations.Buffer);
320
321 if (Ptr->Logon.LogonHours.LogonHours != NULL)
322 MIDL_user_free(Ptr->Logon.LogonHours.LogonHours);
323 break;
324
325 case UserLogonHoursInformation:
326 if (Ptr->LogonHours.LogonHours.LogonHours != NULL)
327 MIDL_user_free(Ptr->LogonHours.LogonHours.LogonHours);
328 break;
329
330 case UserAccountInformation:
331 if (Ptr->Account.UserName.Buffer != NULL)
332 MIDL_user_free(Ptr->Account.UserName.Buffer);
333
334 if (Ptr->Account.FullName.Buffer != NULL)
335 MIDL_user_free(Ptr->Account.FullName.Buffer);
336
337 if (Ptr->Account.HomeDirectory.Buffer != NULL)
338 MIDL_user_free(Ptr->Account.HomeDirectory.Buffer);
339
340 if (Ptr->Account.HomeDirectoryDrive.Buffer != NULL)
341 MIDL_user_free(Ptr->Account.HomeDirectoryDrive.Buffer);
342
343 if (Ptr->Account.ScriptPath.Buffer != NULL)
344 MIDL_user_free(Ptr->Account.ScriptPath.Buffer);
345
346 if (Ptr->Account.ProfilePath.Buffer != NULL)
347 MIDL_user_free(Ptr->Account.ProfilePath.Buffer);
348
349 if (Ptr->Account.AdminComment.Buffer != NULL)
350 MIDL_user_free(Ptr->Account.AdminComment.Buffer);
351
352 if (Ptr->Account.WorkStations.Buffer != NULL)
353 MIDL_user_free(Ptr->Account.WorkStations.Buffer);
354
355 if (Ptr->Account.LogonHours.LogonHours != NULL)
356 MIDL_user_free(Ptr->Account.LogonHours.LogonHours);
357 break;
358
359 case UserNameInformation:
360 if (Ptr->Name.UserName.Buffer != NULL)
361 MIDL_user_free(Ptr->Name.UserName.Buffer);
362
363 if (Ptr->Name.FullName.Buffer != NULL)
364 MIDL_user_free(Ptr->Name.FullName.Buffer);
365 break;
366
367 case UserAccountNameInformation:
368 if (Ptr->AccountName.UserName.Buffer != NULL)
369 MIDL_user_free(Ptr->AccountName.UserName.Buffer);
370 break;
371
372 case UserFullNameInformation:
373 if (Ptr->FullName.FullName.Buffer != NULL)
374 MIDL_user_free(Ptr->FullName.FullName.Buffer);
375 break;
376
377 case UserPrimaryGroupInformation:
378 break;
379
380 case UserHomeInformation:
381 if (Ptr->Home.HomeDirectory.Buffer != NULL)
382 MIDL_user_free(Ptr->Home.HomeDirectory.Buffer);
383
384 if (Ptr->Home.HomeDirectoryDrive.Buffer != NULL)
385 MIDL_user_free(Ptr->Home.HomeDirectoryDrive.Buffer);
386 break;
387
388 case UserScriptInformation:
389 if (Ptr->Script.ScriptPath.Buffer != NULL)
390 MIDL_user_free(Ptr->Script.ScriptPath.Buffer);
391
392 case UserProfileInformation:
393 if (Ptr->Profile.ProfilePath.Buffer != NULL)
394 MIDL_user_free(Ptr->Profile.ProfilePath.Buffer);
395
396 case UserAdminCommentInformation:
397 if (Ptr->AdminComment.AdminComment.Buffer != NULL)
398 MIDL_user_free(Ptr->AdminComment.AdminComment.Buffer);
399 break;
400
401 case UserWorkStationsInformation:
402 if (Ptr->WorkStations.WorkStations.Buffer != NULL)
403 MIDL_user_free(Ptr->WorkStations.WorkStations.Buffer);
404 break;
405
406 case UserSetPasswordInformation:
407 ERR("Information class UserSetPasswordInformation cannot be queried!\n");
408 break;
409
410 case UserControlInformation:
411 break;
412
413 case UserExpiresInformation:
414 break;
415
416 case UserInternal1Information:
417 break;
418
419 case UserInternal2Information:
420 break;
421
422 case UserParametersInformation:
423 if (Ptr->Parameters.Parameters.Buffer != NULL)
424 MIDL_user_free(Ptr->Parameters.Parameters.Buffer);
425 break;
426
427 case UserAllInformation:
428 if (Ptr->All.UserName.Buffer != NULL)
429 MIDL_user_free(Ptr->All.UserName.Buffer);
430
431 if (Ptr->All.FullName.Buffer != NULL)
432 MIDL_user_free(Ptr->All.FullName.Buffer);
433
434 if (Ptr->All.HomeDirectory.Buffer != NULL)
435 MIDL_user_free(Ptr->All.HomeDirectory.Buffer);
436
437 if (Ptr->All.HomeDirectoryDrive.Buffer != NULL)
438 MIDL_user_free(Ptr->All.HomeDirectoryDrive.Buffer);
439
440 if (Ptr->All.ScriptPath.Buffer != NULL)
441 MIDL_user_free(Ptr->All.ScriptPath.Buffer);
442
443 if (Ptr->All.ProfilePath.Buffer != NULL)
444 MIDL_user_free(Ptr->All.ProfilePath.Buffer);
445
446 if (Ptr->All.AdminComment.Buffer != NULL)
447 MIDL_user_free(Ptr->All.AdminComment.Buffer);
448
449 if (Ptr->All.WorkStations.Buffer != NULL)
450 MIDL_user_free(Ptr->All.WorkStations.Buffer);
451
452 if (Ptr->All.UserComment.Buffer != NULL)
453 MIDL_user_free(Ptr->All.UserComment.Buffer);
454
455 if (Ptr->All.Parameters.Buffer != NULL)
456 MIDL_user_free(Ptr->All.Parameters.Buffer);
457
458 if (Ptr->All.LmOwfPassword.Buffer != NULL)
459 MIDL_user_free(Ptr->All.LmOwfPassword.Buffer);
460
461 if (Ptr->All.NtOwfPassword.Buffer != NULL)
462 MIDL_user_free(Ptr->All.NtOwfPassword.Buffer);
463
464 if (Ptr->All.PrivateData.Buffer != NULL)
465 MIDL_user_free(Ptr->All.PrivateData.Buffer);
466
467 if (Ptr->All.SecurityDescriptor.SecurityDescriptor != NULL)
468 MIDL_user_free(Ptr->All.SecurityDescriptor.SecurityDescriptor);
469
470 if (Ptr->All.LogonHours.LogonHours != NULL)
471 MIDL_user_free(Ptr->All.LogonHours.LogonHours);
472 break;
473
474 default:
475 FIXME("Unsupported information class: %lu\n", InformationClass);
476 break;
477 }
478
479 MIDL_user_free(Ptr);
480 }
481
482 /* EOF */