* PROGRAMMERS: Eric Kohl
*/
+#ifndef _SAMSRV_PCH_
+#define _SAMSRV_PCH_
+
#include <stdio.h>
+#include <stdlib.h>
+
#define WIN32_NO_STATUS
-#include <windows.h>
+#define _INC_WINDOWS
+#define COM_NO_WINDOWS_H
+
+#include <windef.h>
+#include <winbase.h>
+#include <winreg.h>
#define NTOS_MODE_USER
-#include <ndk/cmfuncs.h>
#include <ndk/kefuncs.h>
-#include <ndk/obfuncs.h>
#include <ndk/rtlfuncs.h>
-#include <ndk/umtypes.h>
#include <ddk/ntsam.h>
-#include <ntsecapi.h>
#include <sddl.h>
-
-#include <samsrv/samsrv.h>
-
-#include "sam_s.h"
+#include <sam_s.h>
#include <wine/debug.h>
+WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
typedef enum _SAM_DB_OBJECT_TYPE
{
SamDbIgnoreObject,
- SamDbContainerObject,
SamDbServerObject,
SamDbDomainObject,
SamDbAliasObject,
ACCESS_MASK Access;
LPWSTR Name;
HANDLE KeyHandle;
- HANDLE MembersKeyHandle; // only used by Aliases and Groups
+ HANDLE MembersKeyHandle; // only used by Aliases
+ ULONG RelativeId;
+ BOOLEAN Trusted;
struct _SAM_DB_OBJECT *ParentObject;
} SAM_DB_OBJECT, *PSAM_DB_OBJECT;
ULONG Reserved;
LARGE_INTEGER CreationTime;
LARGE_INTEGER DomainModifiedCount;
- LARGE_INTEGER MaxPasswordAge;
- LARGE_INTEGER MinPasswordAge;
- LARGE_INTEGER ForceLogoff;
- LARGE_INTEGER LockoutDuration;
- LARGE_INTEGER LockoutObservationWindow;
+ LARGE_INTEGER MaxPasswordAge; /* relative Time */
+ LARGE_INTEGER MinPasswordAge; /* relative Time */
+ LARGE_INTEGER ForceLogoff; /* relative Time */
+ LARGE_INTEGER LockoutDuration; /* relative Time */
+ LARGE_INTEGER LockoutObservationWindow; /* relative Time */
LARGE_INTEGER ModifiedCountAtLastPromotion;
ULONG NextRid;
ULONG PasswordProperties;
USHORT OperatorCount;
} SAM_USER_FIXED_DATA, *PSAM_USER_FIXED_DATA;
+
+extern PGENERIC_MAPPING pServerMapping;
+extern ENCRYPTED_NT_OWF_PASSWORD EmptyNtHash;
+extern ENCRYPTED_LM_OWF_PASSWORD EmptyLmHash;
+extern RTL_RESOURCE SampResource;
+
+
+/* alias.c */
+
+NTSTATUS
+SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject,
+ IN ULONG AliasId,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PSAM_DB_OBJECT *AliasObject);
+
+NTSTATUS
+SampAddMemberToAlias(IN PSAM_DB_OBJECT AliasObject,
+ IN PRPC_SID MemberId);
+
+NTSTATUS
+NTAPI
+SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject,
+ IN PRPC_SID MemberId);
+
+NTSTATUS
+SampGetMembersInAlias(IN PSAM_DB_OBJECT AliasObject,
+ OUT PULONG MemberCount,
+ OUT PSAMPR_SID_INFORMATION *MemberArray);
+
+NTSTATUS
+SampRemoveAllMembersFromAlias(IN PSAM_DB_OBJECT AliasObject);
+
+
/* database.c */
NTSTATUS
SampCreateDbObject(IN PSAM_DB_OBJECT ParentObject,
IN LPWSTR ContainerName,
IN LPWSTR ObjectName,
+ IN ULONG RelativeId,
IN SAM_DB_OBJECT_TYPE ObjectType,
IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *DbObject);
SampOpenDbObject(IN PSAM_DB_OBJECT ParentObject,
IN LPWSTR ContainerName,
IN LPWSTR ObjectName,
+ IN ULONG RelativeId,
IN SAM_DB_OBJECT_TYPE ObjectType,
IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *DbObject);
SampCloseDbObject(PSAM_DB_OBJECT DbObject);
NTSTATUS
-SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
- IN LPWSTR lpAccountName);
-
-NTSTATUS
-SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
- IN LPCWSTR lpContainerName,
- IN LPCWSTR lpAccountName,
- IN ULONG ulRelativeId);
+SampDeleteAccountDbObject(PSAM_DB_OBJECT DbObject);
NTSTATUS
SampSetObjectAttribute(PSAM_DB_OBJECT DbObject,
NTSTATUS
SampGetObjectAttributeString(PSAM_DB_OBJECT DbObject,
LPWSTR AttributeName,
- RPC_UNICODE_STRING *String);
+ PRPC_UNICODE_STRING String);
+
+NTSTATUS
+SampSetObjectAttributeString(PSAM_DB_OBJECT DbObject,
+ LPWSTR AttributeName,
+ PRPC_UNICODE_STRING String);
+
+/* domain.c */
+
+NTSTATUS
+SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
+ IN LPCWSTR lpContainerName,
+ IN LPCWSTR lpAccountName,
+ IN ULONG ulRelativeId);
+
+NTSTATUS
+SampRemoveAccountNameFromDomain(IN PSAM_DB_OBJECT DomainObject,
+ IN LPCWSTR lpContainerName,
+ IN LPCWSTR lpAccountName);
+
+NTSTATUS
+SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
+ IN LPCWSTR lpAccountName);
+
+NTSTATUS
+SampRemoveMemberFromAllAliases(IN PSAM_DB_OBJECT DomainObject,
+ IN PRPC_SID MemberSid);
+
+NTSTATUS
+SampCreateAccountSid(IN PSAM_DB_OBJECT DomainObject,
+ IN ULONG ulRelativeId,
+ IN OUT PSID *AccountSid);
+
+/* group.h */
+
+NTSTATUS
+SampOpenGroupObject(IN PSAM_DB_OBJECT DomainObject,
+ IN ULONG GroupId,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PSAM_DB_OBJECT *GroupObject);
+
+NTSTATUS
+SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
+ IN ULONG MemberId);
+
+NTSTATUS
+SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject,
+ IN ULONG MemberId);
+
/* registry.h */
+
NTSTATUS
-SampRegCloseKey(IN HANDLE KeyHandle);
+SampRegCloseKey(IN OUT PHANDLE KeyHandle);
NTSTATUS
SampRegCreateKey(IN HANDLE ParentKeyHandle,
IN LPCWSTR KeyName,
IN ACCESS_MASK DesiredAccess,
- OUT HANDLE KeyHandle);
+ OUT PHANDLE KeyHandle);
NTSTATUS
SampRegDeleteKey(IN HANDLE ParentKeyHandle,
SampRegOpenKey(IN HANDLE ParentKeyHandle,
IN LPCWSTR KeyName,
IN ACCESS_MASK DesiredAccess,
- OUT HANDLE KeyHandle);
+ OUT PHANDLE KeyHandle);
NTSTATUS
SampRegQueryKeyInfo(IN HANDLE KeyHandle,
NTSTATUS
SampRegDeleteValue(IN HANDLE KeyHandle,
- IN LPWSTR ValueName);
+ IN LPCWSTR ValueName);
NTSTATUS
SampRegEnumerateValue(IN HANDLE KeyHandle,
NTSTATUS
SampRegQueryValue(IN HANDLE KeyHandle,
- IN LPWSTR ValueName,
+ IN LPCWSTR ValueName,
OUT PULONG Type OPTIONAL,
OUT LPVOID Data OPTIONAL,
IN OUT PULONG DataLength OPTIONAL);
NTSTATUS
SampRegSetValue(IN HANDLE KeyHandle,
- IN LPWSTR ValueName,
+ IN LPCWSTR ValueName,
IN ULONG Type,
IN LPVOID Data,
IN ULONG DataLength);
+
/* samspc.c */
-VOID SampStartRpcServer(VOID);
+
+VOID
+SampStartRpcServer(VOID);
+
+
+/* security.c */
+
+NTSTATUS
+SampCreateServerSD(OUT PSECURITY_DESCRIPTOR *ServerSd,
+ OUT PULONG Size);
+
+NTSTATUS
+SampCreateBuiltinDomainSD(OUT PSECURITY_DESCRIPTOR *DomainSd,
+ OUT PULONG Size);
+
+NTSTATUS
+SampCreateAccountDomainSD(OUT PSECURITY_DESCRIPTOR *DomainSd,
+ OUT PULONG Size);
+
+NTSTATUS
+SampCreateAliasSD(OUT PSECURITY_DESCRIPTOR *AliasSd,
+ OUT PULONG Size);
+
+NTSTATUS
+SampCreateGroupSD(OUT PSECURITY_DESCRIPTOR *GroupSd,
+ OUT PULONG Size);
+
+NTSTATUS
+SampCreateUserSD(IN PSID UserSid,
+ OUT PSECURITY_DESCRIPTOR *UserSd,
+ OUT PULONG Size);
/* setup.c */
-BOOL SampIsSetupRunning(VOID);
-BOOL SampInitializeSAM(VOID);
\ No newline at end of file
+
+BOOL
+SampInitializeSAM(VOID);
+
+
+/* user.c */
+
+NTSTATUS
+SampOpenUserObject(IN PSAM_DB_OBJECT DomainObject,
+ IN ULONG UserId,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PSAM_DB_OBJECT *UserObject);
+
+NTSTATUS
+SampAddGroupMembershipToUser(IN PSAM_DB_OBJECT UserObject,
+ IN ULONG GroupId,
+ IN ULONG Attributes);
+
+NTSTATUS
+SampRemoveGroupMembershipFromUser(IN PSAM_DB_OBJECT UserObject,
+ IN ULONG GroupId);
+
+NTSTATUS
+SampGetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
+ IN ULONG UserId,
+ IN ULONG GroupId,
+ OUT PULONG GroupAttributes);
+
+NTSTATUS
+SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
+ IN ULONG UserId,
+ IN ULONG GroupId,
+ IN ULONG GroupAttributes);
+
+NTSTATUS
+SampRemoveUserFromAllGroups(IN PSAM_DB_OBJECT UserObject);
+
+NTSTATUS
+SampRemoveUserFromAllAliases(IN PSAM_DB_OBJECT UserObject);
+
+NTSTATUS
+SampSetUserPassword(IN PSAM_DB_OBJECT UserObject,
+ IN PENCRYPTED_NT_OWF_PASSWORD NtPassword,
+ IN BOOLEAN NtPasswordPresent,
+ IN PENCRYPTED_LM_OWF_PASSWORD LmPassword,
+ IN BOOLEAN LmPasswordPresent);
+
+NTSTATUS
+SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
+ IN OUT PSAMPR_LOGON_HOURS LogonHours);
+
+NTSTATUS
+SampSetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
+ IN PSAMPR_LOGON_HOURS LogonHours);
+
+
+/* utils.c */
+
+INT
+SampLoadString(HINSTANCE hInstance,
+ UINT uId,
+ LPWSTR lpBuffer,
+ INT nBufferMax);
+
+BOOL
+SampIsSetupRunning(VOID);
+
+PSID
+AppendRidToSid(PSID SrcSid,
+ ULONG Rid);
+
+NTSTATUS
+SampGetRidFromSid(IN PSID Sid,
+ OUT PULONG Rid);
+
+NTSTATUS
+SampCheckAccountName(IN PRPC_UNICODE_STRING AccountName,
+ IN USHORT MaxLength);
+
+
+/* Undocumented advapi32 functions */
+
+NTSTATUS
+WINAPI
+SystemFunction006(LPCSTR password,
+ LPSTR hash);
+
+NTSTATUS
+WINAPI
+SystemFunction007(PUNICODE_STRING string,
+ LPBYTE hash);
+
+NTSTATUS
+WINAPI
+SystemFunction013(const BYTE *in,
+ const BYTE *key,
+ LPBYTE out);
+
+#endif /* _SAMSRV_PCH_ */