2 * PROJECT: Local Security Authority Server DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/samsrv/group.c
5 * PURPOSE: Group specific helper functions
6 * COPYRIGHT: Copyright 2013 Eric Kohl
11 /* FUNCTIONS ***************************************************************/
14 SampOpenGroupObject(IN PSAM_DB_OBJECT DomainObject
,
16 IN ACCESS_MASK DesiredAccess
,
17 OUT PSAM_DB_OBJECT
*GroupObject
)
21 TRACE("(%p %lu %lx %p)\n",
22 DomainObject
, GroupId
, DesiredAccess
, GroupObject
);
24 /* Convert the RID into a string (hex) */
25 swprintf(szRid
, L
"%08lX", GroupId
);
27 /* Create the user object */
28 return SampOpenDbObject(DomainObject
,
39 SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject
,
42 PULONG MembersBuffer
= NULL
;
43 ULONG MembersCount
= 0;
48 Status
= SampGetObjectAttribute(GroupObject
,
53 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
56 MembersBuffer
= midl_user_allocate(Length
+ sizeof(ULONG
));
57 if (MembersBuffer
== NULL
)
59 Status
= STATUS_INSUFFICIENT_RESOURCES
;
63 if (Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
65 Status
= SampGetObjectAttribute(GroupObject
,
70 if (!NT_SUCCESS(Status
))
73 MembersCount
= Length
/ sizeof(ULONG
);
76 for (i
= 0; i
< MembersCount
; i
++)
78 if (MembersBuffer
[i
] == MemberId
)
80 Status
= STATUS_MEMBER_IN_GROUP
;
85 MembersBuffer
[MembersCount
] = MemberId
;
86 Length
+= sizeof(ULONG
);
88 Status
= SampSetObjectAttribute(GroupObject
,
95 if (MembersBuffer
!= NULL
)
96 midl_user_free(MembersBuffer
);
103 SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject
,
106 PULONG MembersBuffer
= NULL
;
107 ULONG MembersCount
= 0;
112 SampGetObjectAttribute(GroupObject
,
119 return STATUS_MEMBER_NOT_IN_GROUP
;
121 MembersBuffer
= midl_user_allocate(Length
);
122 if (MembersBuffer
== NULL
)
124 Status
= STATUS_INSUFFICIENT_RESOURCES
;
128 Status
= SampGetObjectAttribute(GroupObject
,
133 if (!NT_SUCCESS(Status
))
136 Status
= STATUS_MEMBER_NOT_IN_GROUP
;
138 MembersCount
= Length
/ sizeof(ULONG
);
139 for (i
= 0; i
< MembersCount
; i
++)
141 if (MembersBuffer
[i
] == MemberId
)
143 Length
-= sizeof(ULONG
);
144 Status
= STATUS_SUCCESS
;
146 if (MembersCount
- i
- 1 > 0)
148 CopyMemory(&MembersBuffer
[i
],
149 &MembersBuffer
[i
+ 1],
150 (MembersCount
- i
- 1) * sizeof(ULONG
));
157 if (!NT_SUCCESS(Status
))
160 Status
= SampSetObjectAttribute(GroupObject
,
167 if (MembersBuffer
!= NULL
)
168 midl_user_free(MembersBuffer
);