d8f5cb653e5c51994ab870189abbca5b3971db84
[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 /* INCLUDES *****************************************************************/
21
22 #include "samsrv.h"
23
24 WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
25
26
27 /* GLOBALS *******************************************************************/
28
29 ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash;
30 ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash;
31
32
33 /* FUNCTIONS *****************************************************************/
34
35 static
36 NTSTATUS
37 SampInitHashes(VOID)
38 {
39 UNICODE_STRING EmptyNtPassword = {0, 0, NULL};
40 CHAR EmptyLmPassword[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
41 NTSTATUS Status;
42
43 /* Calculate the NT hash value of the empty password */
44 Status = SystemFunction007(&EmptyNtPassword,
45 (LPBYTE)&EmptyNtHash);
46 if (!NT_SUCCESS(Status))
47 {
48 ERR("Calculation of the empty NT hash failed (Status 0x%08lx)\n", Status);
49 return Status;
50 }
51
52 /* Calculate the LM hash value of the empty password */
53 Status = SystemFunction006(EmptyLmPassword,
54 (LPSTR)&EmptyLmHash);
55 if (!NT_SUCCESS(Status))
56 {
57 ERR("Calculation of the empty LM hash failed (Status 0x%08lx)\n", Status);
58 }
59
60 return Status;
61 }
62
63
64 NTSTATUS
65 NTAPI
66 SamIConnect(IN PSAMPR_SERVER_NAME ServerName,
67 OUT SAMPR_HANDLE *ServerHandle,
68 IN ACCESS_MASK DesiredAccess,
69 IN BOOLEAN Trusted)
70 {
71 PSAM_DB_OBJECT ServerObject;
72 NTSTATUS Status;
73
74 TRACE("SamIConnect(%p %p %lx %ld)\n",
75 ServerName, ServerHandle, DesiredAccess, Trusted);
76
77 /* Map generic access rights */
78 RtlMapGenericMask(&DesiredAccess,
79 pServerMapping);
80
81 /* Open the Server Object */
82 Status = SampOpenDbObject(NULL,
83 NULL,
84 L"SAM",
85 0,
86 SamDbServerObject,
87 DesiredAccess,
88 &ServerObject);
89 if (NT_SUCCESS(Status))
90 {
91 ServerObject->Trusted = Trusted;
92 *ServerHandle = (SAMPR_HANDLE)ServerObject;
93 }
94
95 TRACE("SamIConnect done (Status 0x%08lx)\n", Status);
96
97 return Status;
98 }
99
100
101 NTSTATUS
102 NTAPI
103 SamIInitialize(VOID)
104 {
105 NTSTATUS Status = STATUS_SUCCESS;
106
107 TRACE("SamIInitialize() called\n");
108
109 Status = SampInitHashes();
110 if (!NT_SUCCESS(Status))
111 return Status;
112
113 if (SampIsSetupRunning())
114 {
115 Status = SampInitializeRegistry();
116 if (!NT_SUCCESS(Status))
117 return Status;
118 }
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_PSID_ARRAY(PSAMPR_PSID_ARRAY Ptr)
185 {
186 if (Ptr != NULL)
187 {
188 if (Ptr->Sids != NULL)
189 {
190 MIDL_user_free(Ptr->Sids);
191 }
192 }
193 }
194
195
196 VOID
197 NTAPI
198 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr)
199 {
200 ULONG i;
201
202 if (Ptr != NULL)
203 {
204 if (Ptr->Element != NULL)
205 {
206 for (i = 0; i < Ptr->Count; i++)
207 {
208 if (Ptr->Element[i].Buffer != NULL)
209 MIDL_user_free(Ptr->Element[i].Buffer);
210 }
211
212 MIDL_user_free(Ptr->Element);
213 Ptr->Element = NULL;
214 Ptr->Count = 0;
215 }
216 }
217 }
218
219
220 VOID
221 NTAPI
222 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr)
223 {
224 if (Ptr != NULL)
225 {
226 if (Ptr->Element != NULL)
227 {
228 MIDL_user_free(Ptr->Element);
229 Ptr->Element = NULL;
230 Ptr->Count = 0;
231 }
232 }
233 }
234
235
236 VOID
237 NTAPI
238 SamIFree_SAMPR_USER_INFO_BUFFER(PSAMPR_USER_INFO_BUFFER Ptr,
239 USER_INFORMATION_CLASS InformationClass)
240 {
241 if (Ptr == NULL)
242 return;
243
244 switch (InformationClass)
245 {
246 case UserGeneralInformation:
247 if (Ptr->General.UserName.Buffer != NULL)
248 MIDL_user_free(Ptr->General.UserName.Buffer);
249
250 if (Ptr->General.FullName.Buffer != NULL)
251 MIDL_user_free(Ptr->General.FullName.Buffer);
252
253 if (Ptr->General.AdminComment.Buffer != NULL)
254 MIDL_user_free(Ptr->General.AdminComment.Buffer);
255
256 if (Ptr->General.UserComment.Buffer != NULL)
257 MIDL_user_free(Ptr->General.UserComment.Buffer);
258 break;
259
260 case UserPreferencesInformation:
261 if (Ptr->Preferences.UserComment.Buffer != NULL)
262 MIDL_user_free(Ptr->Preferences.UserComment.Buffer);
263
264 if (Ptr->Preferences.Reserved1.Buffer != NULL)
265 MIDL_user_free(Ptr->Preferences.Reserved1.Buffer);
266 break;
267
268 case UserLogonInformation:
269 if (Ptr->Logon.UserName.Buffer != NULL)
270 MIDL_user_free(Ptr->Logon.UserName.Buffer);
271
272 if (Ptr->Logon.FullName.Buffer != NULL)
273 MIDL_user_free(Ptr->Logon.FullName.Buffer);
274
275 if (Ptr->Logon.HomeDirectory.Buffer != NULL)
276 MIDL_user_free(Ptr->Logon.HomeDirectory.Buffer);
277
278 if (Ptr->Logon.HomeDirectoryDrive.Buffer != NULL)
279 MIDL_user_free(Ptr->Logon.HomeDirectoryDrive.Buffer);
280
281 if (Ptr->Logon.ScriptPath.Buffer != NULL)
282 MIDL_user_free(Ptr->Logon.ScriptPath.Buffer);
283
284 if (Ptr->Logon.ProfilePath.Buffer != NULL)
285 MIDL_user_free(Ptr->Logon.ProfilePath.Buffer);
286
287 if (Ptr->Logon.WorkStations.Buffer != NULL)
288 MIDL_user_free(Ptr->Logon.WorkStations.Buffer);
289
290 if (Ptr->Logon.LogonHours.LogonHours != NULL)
291 MIDL_user_free(Ptr->Logon.LogonHours.LogonHours);
292 break;
293
294 case UserLogonHoursInformation:
295 if (Ptr->LogonHours.LogonHours.LogonHours != NULL)
296 MIDL_user_free(Ptr->LogonHours.LogonHours.LogonHours);
297 break;
298
299 case UserAccountInformation:
300 if (Ptr->Account.UserName.Buffer != NULL)
301 MIDL_user_free(Ptr->Account.UserName.Buffer);
302
303 if (Ptr->Account.FullName.Buffer != NULL)
304 MIDL_user_free(Ptr->Account.FullName.Buffer);
305
306 if (Ptr->Account.HomeDirectory.Buffer != NULL)
307 MIDL_user_free(Ptr->Account.HomeDirectory.Buffer);
308
309 if (Ptr->Account.HomeDirectoryDrive.Buffer != NULL)
310 MIDL_user_free(Ptr->Account.HomeDirectoryDrive.Buffer);
311
312 if (Ptr->Account.ScriptPath.Buffer != NULL)
313 MIDL_user_free(Ptr->Account.ScriptPath.Buffer);
314
315 if (Ptr->Account.ProfilePath.Buffer != NULL)
316 MIDL_user_free(Ptr->Account.ProfilePath.Buffer);
317
318 if (Ptr->Account.AdminComment.Buffer != NULL)
319 MIDL_user_free(Ptr->Account.AdminComment.Buffer);
320
321 if (Ptr->Account.WorkStations.Buffer != NULL)
322 MIDL_user_free(Ptr->Account.WorkStations.Buffer);
323
324 if (Ptr->Account.LogonHours.LogonHours != NULL)
325 MIDL_user_free(Ptr->Account.LogonHours.LogonHours);
326 break;
327
328 case UserNameInformation:
329 if (Ptr->Name.UserName.Buffer != NULL)
330 MIDL_user_free(Ptr->Name.UserName.Buffer);
331
332 if (Ptr->Name.FullName.Buffer != NULL)
333 MIDL_user_free(Ptr->Name.FullName.Buffer);
334 break;
335
336 case UserAccountNameInformation:
337 if (Ptr->AccountName.UserName.Buffer != NULL)
338 MIDL_user_free(Ptr->AccountName.UserName.Buffer);
339 break;
340
341 case UserFullNameInformation:
342 if (Ptr->FullName.FullName.Buffer != NULL)
343 MIDL_user_free(Ptr->FullName.FullName.Buffer);
344 break;
345
346 case UserPrimaryGroupInformation:
347 break;
348
349 case UserHomeInformation:
350 if (Ptr->Home.HomeDirectory.Buffer != NULL)
351 MIDL_user_free(Ptr->Home.HomeDirectory.Buffer);
352
353 if (Ptr->Home.HomeDirectoryDrive.Buffer != NULL)
354 MIDL_user_free(Ptr->Home.HomeDirectoryDrive.Buffer);
355 break;
356
357 case UserScriptInformation:
358 if (Ptr->Script.ScriptPath.Buffer != NULL)
359 MIDL_user_free(Ptr->Script.ScriptPath.Buffer);
360
361 case UserProfileInformation:
362 if (Ptr->Profile.ProfilePath.Buffer != NULL)
363 MIDL_user_free(Ptr->Profile.ProfilePath.Buffer);
364
365 case UserAdminCommentInformation:
366 if (Ptr->AdminComment.AdminComment.Buffer != NULL)
367 MIDL_user_free(Ptr->AdminComment.AdminComment.Buffer);
368 break;
369
370 case UserWorkStationsInformation:
371 if (Ptr->WorkStations.WorkStations.Buffer != NULL)
372 MIDL_user_free(Ptr->WorkStations.WorkStations.Buffer);
373 break;
374
375 case UserSetPasswordInformation:
376 ERR("Information class UserSetPasswordInformation cannot be queried!\n");
377 break;
378
379 case UserControlInformation:
380 break;
381
382 case UserExpiresInformation:
383 break;
384
385 case UserInternal1Information:
386 break;
387
388 case UserInternal2Information:
389 break;
390
391 case UserParametersInformation:
392 if (Ptr->Parameters.Parameters.Buffer != NULL)
393 MIDL_user_free(Ptr->Parameters.Parameters.Buffer);
394 break;
395
396 case UserAllInformation:
397 if (Ptr->All.UserName.Buffer != NULL)
398 MIDL_user_free(Ptr->All.UserName.Buffer);
399
400 if (Ptr->All.FullName.Buffer != NULL)
401 MIDL_user_free(Ptr->All.FullName.Buffer);
402
403 if (Ptr->All.HomeDirectory.Buffer != NULL)
404 MIDL_user_free(Ptr->All.HomeDirectory.Buffer);
405
406 if (Ptr->All.HomeDirectoryDrive.Buffer != NULL)
407 MIDL_user_free(Ptr->All.HomeDirectoryDrive.Buffer);
408
409 if (Ptr->All.ScriptPath.Buffer != NULL)
410 MIDL_user_free(Ptr->All.ScriptPath.Buffer);
411
412 if (Ptr->All.ProfilePath.Buffer != NULL)
413 MIDL_user_free(Ptr->All.ProfilePath.Buffer);
414
415 if (Ptr->All.AdminComment.Buffer != NULL)
416 MIDL_user_free(Ptr->All.AdminComment.Buffer);
417
418 if (Ptr->All.WorkStations.Buffer != NULL)
419 MIDL_user_free(Ptr->All.WorkStations.Buffer);
420
421 if (Ptr->All.UserComment.Buffer != NULL)
422 MIDL_user_free(Ptr->All.UserComment.Buffer);
423
424 if (Ptr->All.Parameters.Buffer != NULL)
425 MIDL_user_free(Ptr->All.Parameters.Buffer);
426
427 if (Ptr->All.LmOwfPassword.Buffer != NULL)
428 MIDL_user_free(Ptr->All.LmOwfPassword.Buffer);
429
430 if (Ptr->All.NtOwfPassword.Buffer != NULL)
431 MIDL_user_free(Ptr->All.NtOwfPassword.Buffer);
432
433 if (Ptr->All.PrivateData.Buffer != NULL)
434 MIDL_user_free(Ptr->All.PrivateData.Buffer);
435
436 if (Ptr->All.SecurityDescriptor.SecurityDescriptor != NULL)
437 MIDL_user_free(Ptr->All.SecurityDescriptor.SecurityDescriptor);
438
439 if (Ptr->All.LogonHours.LogonHours != NULL)
440 MIDL_user_free(Ptr->All.LogonHours.LogonHours);
441 break;
442
443 default:
444 FIXME("Unsupported information class: %lu\n", InformationClass);
445 break;
446 }
447
448 MIDL_user_free(Ptr);
449 }
450
451 /* EOF */