3 * Copyright (C) 2005 Eric Kohl
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.
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.
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.
22 #include <samsrv/samsrv.h>
24 /* GLOBALS *******************************************************************/
26 ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash
;
27 ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash
;
28 RTL_RESOURCE SampResource
;
31 /* FUNCTIONS *****************************************************************/
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,};
41 /* Calculate the NT hash value of the empty password */
42 Status
= SystemFunction007(&EmptyNtPassword
,
43 (LPBYTE
)&EmptyNtHash
);
44 if (!NT_SUCCESS(Status
))
46 ERR("Calculation of the empty NT hash failed (Status 0x%08lx)\n", Status
);
50 /* Calculate the LM hash value of the empty password */
51 Status
= SystemFunction006(EmptyLmPassword
,
53 if (!NT_SUCCESS(Status
))
55 ERR("Calculation of the empty LM hash failed (Status 0x%08lx)\n", Status
);
64 SamIConnect(IN PSAMPR_SERVER_NAME ServerName
,
65 OUT SAMPR_HANDLE
*ServerHandle
,
66 IN ACCESS_MASK DesiredAccess
,
69 PSAM_DB_OBJECT ServerObject
;
72 TRACE("SamIConnect(%p %p %lx %ld)\n",
73 ServerName
, ServerHandle
, DesiredAccess
, Trusted
);
75 /* Map generic access rights */
76 RtlMapGenericMask(&DesiredAccess
,
79 /* Open the Server Object */
80 Status
= SampOpenDbObject(NULL
,
87 if (NT_SUCCESS(Status
))
89 ServerObject
->Trusted
= Trusted
;
90 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
93 TRACE("SamIConnect done (Status 0x%08lx)\n", Status
);
103 NTSTATUS Status
= STATUS_SUCCESS
;
105 TRACE("SamIInitialize() called\n");
107 Status
= SampInitHashes();
108 if (!NT_SUCCESS(Status
))
111 if (SampIsSetupRunning())
113 Status
= SampInitializeRegistry();
114 if (!NT_SUCCESS(Status
))
118 RtlInitializeResource(&SampResource
);
120 /* Initialize the SAM database */
121 Status
= SampInitDatabase();
122 if (!NT_SUCCESS(Status
))
125 /* Start the RPC server */
126 SampStartRpcServer();
134 SampInitializeRegistry(VOID
)
136 TRACE("SampInitializeRegistry() called\n");
140 return STATUS_SUCCESS
;
146 SamIFreeVoid(PVOID Ptr
)
154 SamIFree_SAMPR_ENUMERATION_BUFFER(PSAMPR_ENUMERATION_BUFFER Ptr
)
160 if (Ptr
->Buffer
!= NULL
)
162 for (i
= 0; i
< Ptr
->EntriesRead
; i
++)
164 if (Ptr
->Buffer
[i
].Name
.Buffer
!= NULL
)
165 MIDL_user_free(Ptr
->Buffer
[i
].Name
.Buffer
);
168 MIDL_user_free(Ptr
->Buffer
);
178 SamIFree_SAMPR_GET_GROUPS_BUFFER(PSAMPR_GET_GROUPS_BUFFER Ptr
)
182 if (Ptr
->Groups
!= NULL
)
183 MIDL_user_free(Ptr
->Groups
);
192 SamIFree_SAMPR_GET_MEMBERS_BUFFER(PSAMPR_GET_MEMBERS_BUFFER Ptr
)
196 if (Ptr
->Members
!= NULL
)
197 MIDL_user_free(Ptr
->Members
);
199 if (Ptr
->Attributes
!= NULL
)
200 MIDL_user_free(Ptr
->Attributes
);
209 SamIFree_SAMPR_PSID_ARRAY(PSAMPR_PSID_ARRAY Ptr
)
213 if (Ptr
->Sids
!= NULL
)
215 MIDL_user_free(Ptr
->Sids
);
223 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr
)
229 if (Ptr
->Element
!= NULL
)
231 for (i
= 0; i
< Ptr
->Count
; i
++)
233 if (Ptr
->Element
[i
].Buffer
!= NULL
)
234 MIDL_user_free(Ptr
->Element
[i
].Buffer
);
237 MIDL_user_free(Ptr
->Element
);
247 SamIFree_SAMPR_SR_SECURITY_DESCRIPTOR(PSAMPR_SR_SECURITY_DESCRIPTOR Ptr
)
251 if (Ptr
->SecurityDescriptor
!= NULL
)
252 MIDL_user_free(Ptr
->SecurityDescriptor
);
261 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr
)
265 if (Ptr
->Element
!= NULL
)
267 MIDL_user_free(Ptr
->Element
);
277 SamIFree_SAMPR_USER_INFO_BUFFER(PSAMPR_USER_INFO_BUFFER Ptr
,
278 USER_INFORMATION_CLASS InformationClass
)
283 switch (InformationClass
)
285 case UserGeneralInformation
:
286 if (Ptr
->General
.UserName
.Buffer
!= NULL
)
287 MIDL_user_free(Ptr
->General
.UserName
.Buffer
);
289 if (Ptr
->General
.FullName
.Buffer
!= NULL
)
290 MIDL_user_free(Ptr
->General
.FullName
.Buffer
);
292 if (Ptr
->General
.AdminComment
.Buffer
!= NULL
)
293 MIDL_user_free(Ptr
->General
.AdminComment
.Buffer
);
295 if (Ptr
->General
.UserComment
.Buffer
!= NULL
)
296 MIDL_user_free(Ptr
->General
.UserComment
.Buffer
);
299 case UserPreferencesInformation
:
300 if (Ptr
->Preferences
.UserComment
.Buffer
!= NULL
)
301 MIDL_user_free(Ptr
->Preferences
.UserComment
.Buffer
);
303 if (Ptr
->Preferences
.Reserved1
.Buffer
!= NULL
)
304 MIDL_user_free(Ptr
->Preferences
.Reserved1
.Buffer
);
307 case UserLogonInformation
:
308 if (Ptr
->Logon
.UserName
.Buffer
!= NULL
)
309 MIDL_user_free(Ptr
->Logon
.UserName
.Buffer
);
311 if (Ptr
->Logon
.FullName
.Buffer
!= NULL
)
312 MIDL_user_free(Ptr
->Logon
.FullName
.Buffer
);
314 if (Ptr
->Logon
.HomeDirectory
.Buffer
!= NULL
)
315 MIDL_user_free(Ptr
->Logon
.HomeDirectory
.Buffer
);
317 if (Ptr
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
318 MIDL_user_free(Ptr
->Logon
.HomeDirectoryDrive
.Buffer
);
320 if (Ptr
->Logon
.ScriptPath
.Buffer
!= NULL
)
321 MIDL_user_free(Ptr
->Logon
.ScriptPath
.Buffer
);
323 if (Ptr
->Logon
.ProfilePath
.Buffer
!= NULL
)
324 MIDL_user_free(Ptr
->Logon
.ProfilePath
.Buffer
);
326 if (Ptr
->Logon
.WorkStations
.Buffer
!= NULL
)
327 MIDL_user_free(Ptr
->Logon
.WorkStations
.Buffer
);
329 if (Ptr
->Logon
.LogonHours
.LogonHours
!= NULL
)
330 MIDL_user_free(Ptr
->Logon
.LogonHours
.LogonHours
);
333 case UserLogonHoursInformation
:
334 if (Ptr
->LogonHours
.LogonHours
.LogonHours
!= NULL
)
335 MIDL_user_free(Ptr
->LogonHours
.LogonHours
.LogonHours
);
338 case UserAccountInformation
:
339 if (Ptr
->Account
.UserName
.Buffer
!= NULL
)
340 MIDL_user_free(Ptr
->Account
.UserName
.Buffer
);
342 if (Ptr
->Account
.FullName
.Buffer
!= NULL
)
343 MIDL_user_free(Ptr
->Account
.FullName
.Buffer
);
345 if (Ptr
->Account
.HomeDirectory
.Buffer
!= NULL
)
346 MIDL_user_free(Ptr
->Account
.HomeDirectory
.Buffer
);
348 if (Ptr
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
349 MIDL_user_free(Ptr
->Account
.HomeDirectoryDrive
.Buffer
);
351 if (Ptr
->Account
.ScriptPath
.Buffer
!= NULL
)
352 MIDL_user_free(Ptr
->Account
.ScriptPath
.Buffer
);
354 if (Ptr
->Account
.ProfilePath
.Buffer
!= NULL
)
355 MIDL_user_free(Ptr
->Account
.ProfilePath
.Buffer
);
357 if (Ptr
->Account
.AdminComment
.Buffer
!= NULL
)
358 MIDL_user_free(Ptr
->Account
.AdminComment
.Buffer
);
360 if (Ptr
->Account
.WorkStations
.Buffer
!= NULL
)
361 MIDL_user_free(Ptr
->Account
.WorkStations
.Buffer
);
363 if (Ptr
->Account
.LogonHours
.LogonHours
!= NULL
)
364 MIDL_user_free(Ptr
->Account
.LogonHours
.LogonHours
);
367 case UserNameInformation
:
368 if (Ptr
->Name
.UserName
.Buffer
!= NULL
)
369 MIDL_user_free(Ptr
->Name
.UserName
.Buffer
);
371 if (Ptr
->Name
.FullName
.Buffer
!= NULL
)
372 MIDL_user_free(Ptr
->Name
.FullName
.Buffer
);
375 case UserAccountNameInformation
:
376 if (Ptr
->AccountName
.UserName
.Buffer
!= NULL
)
377 MIDL_user_free(Ptr
->AccountName
.UserName
.Buffer
);
380 case UserFullNameInformation
:
381 if (Ptr
->FullName
.FullName
.Buffer
!= NULL
)
382 MIDL_user_free(Ptr
->FullName
.FullName
.Buffer
);
385 case UserPrimaryGroupInformation
:
388 case UserHomeInformation
:
389 if (Ptr
->Home
.HomeDirectory
.Buffer
!= NULL
)
390 MIDL_user_free(Ptr
->Home
.HomeDirectory
.Buffer
);
392 if (Ptr
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
393 MIDL_user_free(Ptr
->Home
.HomeDirectoryDrive
.Buffer
);
396 case UserScriptInformation
:
397 if (Ptr
->Script
.ScriptPath
.Buffer
!= NULL
)
398 MIDL_user_free(Ptr
->Script
.ScriptPath
.Buffer
);
400 case UserProfileInformation
:
401 if (Ptr
->Profile
.ProfilePath
.Buffer
!= NULL
)
402 MIDL_user_free(Ptr
->Profile
.ProfilePath
.Buffer
);
404 case UserAdminCommentInformation
:
405 if (Ptr
->AdminComment
.AdminComment
.Buffer
!= NULL
)
406 MIDL_user_free(Ptr
->AdminComment
.AdminComment
.Buffer
);
409 case UserWorkStationsInformation
:
410 if (Ptr
->WorkStations
.WorkStations
.Buffer
!= NULL
)
411 MIDL_user_free(Ptr
->WorkStations
.WorkStations
.Buffer
);
414 case UserSetPasswordInformation
:
415 ERR("Information class UserSetPasswordInformation cannot be queried!\n");
418 case UserControlInformation
:
421 case UserExpiresInformation
:
424 case UserInternal1Information
:
427 case UserInternal2Information
:
430 case UserParametersInformation
:
431 if (Ptr
->Parameters
.Parameters
.Buffer
!= NULL
)
432 MIDL_user_free(Ptr
->Parameters
.Parameters
.Buffer
);
435 case UserAllInformation
:
436 if (Ptr
->All
.UserName
.Buffer
!= NULL
)
437 MIDL_user_free(Ptr
->All
.UserName
.Buffer
);
439 if (Ptr
->All
.FullName
.Buffer
!= NULL
)
440 MIDL_user_free(Ptr
->All
.FullName
.Buffer
);
442 if (Ptr
->All
.HomeDirectory
.Buffer
!= NULL
)
443 MIDL_user_free(Ptr
->All
.HomeDirectory
.Buffer
);
445 if (Ptr
->All
.HomeDirectoryDrive
.Buffer
!= NULL
)
446 MIDL_user_free(Ptr
->All
.HomeDirectoryDrive
.Buffer
);
448 if (Ptr
->All
.ScriptPath
.Buffer
!= NULL
)
449 MIDL_user_free(Ptr
->All
.ScriptPath
.Buffer
);
451 if (Ptr
->All
.ProfilePath
.Buffer
!= NULL
)
452 MIDL_user_free(Ptr
->All
.ProfilePath
.Buffer
);
454 if (Ptr
->All
.AdminComment
.Buffer
!= NULL
)
455 MIDL_user_free(Ptr
->All
.AdminComment
.Buffer
);
457 if (Ptr
->All
.WorkStations
.Buffer
!= NULL
)
458 MIDL_user_free(Ptr
->All
.WorkStations
.Buffer
);
460 if (Ptr
->All
.UserComment
.Buffer
!= NULL
)
461 MIDL_user_free(Ptr
->All
.UserComment
.Buffer
);
463 if (Ptr
->All
.Parameters
.Buffer
!= NULL
)
464 MIDL_user_free(Ptr
->All
.Parameters
.Buffer
);
466 if (Ptr
->All
.LmOwfPassword
.Buffer
!= NULL
)
467 MIDL_user_free(Ptr
->All
.LmOwfPassword
.Buffer
);
469 if (Ptr
->All
.NtOwfPassword
.Buffer
!= NULL
)
470 MIDL_user_free(Ptr
->All
.NtOwfPassword
.Buffer
);
472 if (Ptr
->All
.PrivateData
.Buffer
!= NULL
)
473 MIDL_user_free(Ptr
->All
.PrivateData
.Buffer
);
475 if (Ptr
->All
.SecurityDescriptor
.SecurityDescriptor
!= NULL
)
476 MIDL_user_free(Ptr
->All
.SecurityDescriptor
.SecurityDescriptor
);
478 if (Ptr
->All
.LogonHours
.LogonHours
!= NULL
)
479 MIDL_user_free(Ptr
->All
.LogonHours
.LogonHours
);
483 FIXME("Unsupported information class: %lu\n", InformationClass
);