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.
20 /* INCLUDES *****************************************************************/
24 WINE_DEFAULT_DEBUG_CHANNEL(samsrv
);
27 /* GLOBALS *******************************************************************/
29 ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash
;
30 ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash
;
33 /* FUNCTIONS *****************************************************************/
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,};
43 /* Calculate the NT hash value of the empty password */
44 Status
= SystemFunction007(&EmptyNtPassword
,
45 (LPBYTE
)&EmptyNtHash
);
46 if (!NT_SUCCESS(Status
))
48 ERR("Calculation of the empty NT hash failed (Status 0x%08lx)\n", Status
);
52 /* Calculate the LM hash value of the empty password */
53 Status
= SystemFunction006(EmptyLmPassword
,
55 if (!NT_SUCCESS(Status
))
57 ERR("Calculation of the empty LM hash failed (Status 0x%08lx)\n", Status
);
66 SamIConnect(IN PSAMPR_SERVER_NAME ServerName
,
67 OUT SAMPR_HANDLE
*ServerHandle
,
68 IN ACCESS_MASK DesiredAccess
,
71 PSAM_DB_OBJECT ServerObject
;
74 TRACE("SamIConnect(%p %p %lx %ld)\n",
75 ServerName
, ServerHandle
, DesiredAccess
, Trusted
);
77 /* Map generic access rights */
78 RtlMapGenericMask(&DesiredAccess
,
81 /* Open the Server Object */
82 Status
= SampOpenDbObject(NULL
,
89 if (NT_SUCCESS(Status
))
91 ServerObject
->Trusted
= Trusted
;
92 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
95 TRACE("SamIConnect done (Status 0x%08lx)\n", Status
);
105 NTSTATUS Status
= STATUS_SUCCESS
;
107 TRACE("SamIInitialize() called\n");
109 Status
= SampInitHashes();
110 if (!NT_SUCCESS(Status
))
113 if (SampIsSetupRunning())
115 Status
= SampInitializeRegistry();
116 if (!NT_SUCCESS(Status
))
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 SamIFree_SAMPR_ENUMERATION_BUFFER(PSAMPR_ENUMERATION_BUFFER Ptr
)
152 if (Ptr
->Buffer
!= NULL
)
154 for (i
= 0; i
< Ptr
->EntriesRead
; i
++)
156 if (Ptr
->Buffer
[i
].Name
.Buffer
!= NULL
)
157 MIDL_user_free(Ptr
->Buffer
[i
].Name
.Buffer
);
160 MIDL_user_free(Ptr
->Buffer
);
170 SamIFree_SAMPR_GET_GROUPS_BUFFER(PSAMPR_GET_GROUPS_BUFFER Ptr
)
174 if (Ptr
->Groups
!= NULL
)
175 MIDL_user_free(Ptr
->Groups
);
184 SamIFree_SAMPR_PSID_ARRAY(PSAMPR_PSID_ARRAY Ptr
)
188 if (Ptr
->Sids
!= NULL
)
190 MIDL_user_free(Ptr
->Sids
);
198 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr
)
204 if (Ptr
->Element
!= NULL
)
206 for (i
= 0; i
< Ptr
->Count
; i
++)
208 if (Ptr
->Element
[i
].Buffer
!= NULL
)
209 MIDL_user_free(Ptr
->Element
[i
].Buffer
);
212 MIDL_user_free(Ptr
->Element
);
222 SamIFree_SAMPR_SR_SECURITY_DESCRIPTOR(PSAMPR_SR_SECURITY_DESCRIPTOR Ptr
)
226 if (Ptr
->SecurityDescriptor
!= NULL
)
227 MIDL_user_free(Ptr
->SecurityDescriptor
);
236 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr
)
240 if (Ptr
->Element
!= NULL
)
242 MIDL_user_free(Ptr
->Element
);
252 SamIFree_SAMPR_USER_INFO_BUFFER(PSAMPR_USER_INFO_BUFFER Ptr
,
253 USER_INFORMATION_CLASS InformationClass
)
258 switch (InformationClass
)
260 case UserGeneralInformation
:
261 if (Ptr
->General
.UserName
.Buffer
!= NULL
)
262 MIDL_user_free(Ptr
->General
.UserName
.Buffer
);
264 if (Ptr
->General
.FullName
.Buffer
!= NULL
)
265 MIDL_user_free(Ptr
->General
.FullName
.Buffer
);
267 if (Ptr
->General
.AdminComment
.Buffer
!= NULL
)
268 MIDL_user_free(Ptr
->General
.AdminComment
.Buffer
);
270 if (Ptr
->General
.UserComment
.Buffer
!= NULL
)
271 MIDL_user_free(Ptr
->General
.UserComment
.Buffer
);
274 case UserPreferencesInformation
:
275 if (Ptr
->Preferences
.UserComment
.Buffer
!= NULL
)
276 MIDL_user_free(Ptr
->Preferences
.UserComment
.Buffer
);
278 if (Ptr
->Preferences
.Reserved1
.Buffer
!= NULL
)
279 MIDL_user_free(Ptr
->Preferences
.Reserved1
.Buffer
);
282 case UserLogonInformation
:
283 if (Ptr
->Logon
.UserName
.Buffer
!= NULL
)
284 MIDL_user_free(Ptr
->Logon
.UserName
.Buffer
);
286 if (Ptr
->Logon
.FullName
.Buffer
!= NULL
)
287 MIDL_user_free(Ptr
->Logon
.FullName
.Buffer
);
289 if (Ptr
->Logon
.HomeDirectory
.Buffer
!= NULL
)
290 MIDL_user_free(Ptr
->Logon
.HomeDirectory
.Buffer
);
292 if (Ptr
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
293 MIDL_user_free(Ptr
->Logon
.HomeDirectoryDrive
.Buffer
);
295 if (Ptr
->Logon
.ScriptPath
.Buffer
!= NULL
)
296 MIDL_user_free(Ptr
->Logon
.ScriptPath
.Buffer
);
298 if (Ptr
->Logon
.ProfilePath
.Buffer
!= NULL
)
299 MIDL_user_free(Ptr
->Logon
.ProfilePath
.Buffer
);
301 if (Ptr
->Logon
.WorkStations
.Buffer
!= NULL
)
302 MIDL_user_free(Ptr
->Logon
.WorkStations
.Buffer
);
304 if (Ptr
->Logon
.LogonHours
.LogonHours
!= NULL
)
305 MIDL_user_free(Ptr
->Logon
.LogonHours
.LogonHours
);
308 case UserLogonHoursInformation
:
309 if (Ptr
->LogonHours
.LogonHours
.LogonHours
!= NULL
)
310 MIDL_user_free(Ptr
->LogonHours
.LogonHours
.LogonHours
);
313 case UserAccountInformation
:
314 if (Ptr
->Account
.UserName
.Buffer
!= NULL
)
315 MIDL_user_free(Ptr
->Account
.UserName
.Buffer
);
317 if (Ptr
->Account
.FullName
.Buffer
!= NULL
)
318 MIDL_user_free(Ptr
->Account
.FullName
.Buffer
);
320 if (Ptr
->Account
.HomeDirectory
.Buffer
!= NULL
)
321 MIDL_user_free(Ptr
->Account
.HomeDirectory
.Buffer
);
323 if (Ptr
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
324 MIDL_user_free(Ptr
->Account
.HomeDirectoryDrive
.Buffer
);
326 if (Ptr
->Account
.ScriptPath
.Buffer
!= NULL
)
327 MIDL_user_free(Ptr
->Account
.ScriptPath
.Buffer
);
329 if (Ptr
->Account
.ProfilePath
.Buffer
!= NULL
)
330 MIDL_user_free(Ptr
->Account
.ProfilePath
.Buffer
);
332 if (Ptr
->Account
.AdminComment
.Buffer
!= NULL
)
333 MIDL_user_free(Ptr
->Account
.AdminComment
.Buffer
);
335 if (Ptr
->Account
.WorkStations
.Buffer
!= NULL
)
336 MIDL_user_free(Ptr
->Account
.WorkStations
.Buffer
);
338 if (Ptr
->Account
.LogonHours
.LogonHours
!= NULL
)
339 MIDL_user_free(Ptr
->Account
.LogonHours
.LogonHours
);
342 case UserNameInformation
:
343 if (Ptr
->Name
.UserName
.Buffer
!= NULL
)
344 MIDL_user_free(Ptr
->Name
.UserName
.Buffer
);
346 if (Ptr
->Name
.FullName
.Buffer
!= NULL
)
347 MIDL_user_free(Ptr
->Name
.FullName
.Buffer
);
350 case UserAccountNameInformation
:
351 if (Ptr
->AccountName
.UserName
.Buffer
!= NULL
)
352 MIDL_user_free(Ptr
->AccountName
.UserName
.Buffer
);
355 case UserFullNameInformation
:
356 if (Ptr
->FullName
.FullName
.Buffer
!= NULL
)
357 MIDL_user_free(Ptr
->FullName
.FullName
.Buffer
);
360 case UserPrimaryGroupInformation
:
363 case UserHomeInformation
:
364 if (Ptr
->Home
.HomeDirectory
.Buffer
!= NULL
)
365 MIDL_user_free(Ptr
->Home
.HomeDirectory
.Buffer
);
367 if (Ptr
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
368 MIDL_user_free(Ptr
->Home
.HomeDirectoryDrive
.Buffer
);
371 case UserScriptInformation
:
372 if (Ptr
->Script
.ScriptPath
.Buffer
!= NULL
)
373 MIDL_user_free(Ptr
->Script
.ScriptPath
.Buffer
);
375 case UserProfileInformation
:
376 if (Ptr
->Profile
.ProfilePath
.Buffer
!= NULL
)
377 MIDL_user_free(Ptr
->Profile
.ProfilePath
.Buffer
);
379 case UserAdminCommentInformation
:
380 if (Ptr
->AdminComment
.AdminComment
.Buffer
!= NULL
)
381 MIDL_user_free(Ptr
->AdminComment
.AdminComment
.Buffer
);
384 case UserWorkStationsInformation
:
385 if (Ptr
->WorkStations
.WorkStations
.Buffer
!= NULL
)
386 MIDL_user_free(Ptr
->WorkStations
.WorkStations
.Buffer
);
389 case UserSetPasswordInformation
:
390 ERR("Information class UserSetPasswordInformation cannot be queried!\n");
393 case UserControlInformation
:
396 case UserExpiresInformation
:
399 case UserInternal1Information
:
402 case UserInternal2Information
:
405 case UserParametersInformation
:
406 if (Ptr
->Parameters
.Parameters
.Buffer
!= NULL
)
407 MIDL_user_free(Ptr
->Parameters
.Parameters
.Buffer
);
410 case UserAllInformation
:
411 if (Ptr
->All
.UserName
.Buffer
!= NULL
)
412 MIDL_user_free(Ptr
->All
.UserName
.Buffer
);
414 if (Ptr
->All
.FullName
.Buffer
!= NULL
)
415 MIDL_user_free(Ptr
->All
.FullName
.Buffer
);
417 if (Ptr
->All
.HomeDirectory
.Buffer
!= NULL
)
418 MIDL_user_free(Ptr
->All
.HomeDirectory
.Buffer
);
420 if (Ptr
->All
.HomeDirectoryDrive
.Buffer
!= NULL
)
421 MIDL_user_free(Ptr
->All
.HomeDirectoryDrive
.Buffer
);
423 if (Ptr
->All
.ScriptPath
.Buffer
!= NULL
)
424 MIDL_user_free(Ptr
->All
.ScriptPath
.Buffer
);
426 if (Ptr
->All
.ProfilePath
.Buffer
!= NULL
)
427 MIDL_user_free(Ptr
->All
.ProfilePath
.Buffer
);
429 if (Ptr
->All
.AdminComment
.Buffer
!= NULL
)
430 MIDL_user_free(Ptr
->All
.AdminComment
.Buffer
);
432 if (Ptr
->All
.WorkStations
.Buffer
!= NULL
)
433 MIDL_user_free(Ptr
->All
.WorkStations
.Buffer
);
435 if (Ptr
->All
.UserComment
.Buffer
!= NULL
)
436 MIDL_user_free(Ptr
->All
.UserComment
.Buffer
);
438 if (Ptr
->All
.Parameters
.Buffer
!= NULL
)
439 MIDL_user_free(Ptr
->All
.Parameters
.Buffer
);
441 if (Ptr
->All
.LmOwfPassword
.Buffer
!= NULL
)
442 MIDL_user_free(Ptr
->All
.LmOwfPassword
.Buffer
);
444 if (Ptr
->All
.NtOwfPassword
.Buffer
!= NULL
)
445 MIDL_user_free(Ptr
->All
.NtOwfPassword
.Buffer
);
447 if (Ptr
->All
.PrivateData
.Buffer
!= NULL
)
448 MIDL_user_free(Ptr
->All
.PrivateData
.Buffer
);
450 if (Ptr
->All
.SecurityDescriptor
.SecurityDescriptor
!= NULL
)
451 MIDL_user_free(Ptr
->All
.SecurityDescriptor
.SecurityDescriptor
);
453 if (Ptr
->All
.LogonHours
.LogonHours
!= NULL
)
454 MIDL_user_free(Ptr
->All
.LogonHours
.LogonHours
);
458 FIXME("Unsupported information class: %lu\n", InformationClass
);