+ PSAM_DB_OBJECT AliasObject;
+ LPWSTR MemberIdString = NULL;
+ HANDLE MembersKeyHandle = NULL;
+ HANDLE MemberKeyHandle = NULL;
+ ULONG ulValueCount;
+ NTSTATUS Status;
+
+ TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
+ AliasHandle, MemberId);
+
+ /* Validate the alias handle */
+ Status = SampValidateDbObject(AliasHandle,
+ SamDbAliasObject,
+ ALIAS_REMOVE_MEMBER,
+ &AliasObject);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ ConvertSidToStringSidW(MemberId, &MemberIdString);
+ TRACE("Member SID: %S\n", MemberIdString);
+
+ Status = SampRegOpenKey(AliasObject->MembersKeyHandle,
+ MemberIdString,
+ KEY_WRITE | KEY_QUERY_VALUE,
+ &MemberKeyHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+
+ Status = SampRegDeleteValue(MemberKeyHandle,
+ AliasObject->Name);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+
+ Status = SampRegQueryKeyInfo(MemberKeyHandle,
+ NULL,
+ &ulValueCount);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+
+ if (ulValueCount == 0)
+ {
+ SampRegCloseKey(MemberKeyHandle);
+ MemberKeyHandle = NULL;
+
+ Status = SampRegDeleteKey(AliasObject->MembersKeyHandle,
+ MemberIdString);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+ }
+
+ Status = SampRegOpenKey(AliasObject->KeyHandle,
+ L"Members",
+ KEY_WRITE | KEY_QUERY_VALUE,
+ &MembersKeyHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+
+ Status = SampRegDeleteValue(MembersKeyHandle,
+ MemberIdString);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+
+ Status = SampRegQueryKeyInfo(MembersKeyHandle,
+ NULL,
+ &ulValueCount);
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+
+ if (ulValueCount == 0)
+ {
+ SampRegCloseKey(MembersKeyHandle);
+ MembersKeyHandle = NULL;
+
+ Status = SampRegDeleteKey(AliasObject->KeyHandle,
+ L"Members");
+ if (!NT_SUCCESS(Status))
+ {
+ TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status);
+ goto done;
+ }
+ }
+
+done:
+ if (MemberKeyHandle != NULL)
+ SampRegCloseKey(MemberKeyHandle);
+
+ if (MembersKeyHandle != NULL)
+ SampRegCloseKey(MembersKeyHandle);
+
+ if (MemberIdString != NULL)
+ LocalFree(MemberIdString);
+
+ return Status;