+ *bufptr = NULL;
+
+ if (resumehandle != NULL && *resumehandle != 0)
+ {
+ EnumContext = (PENUM_CONTEXT)resumehandle;
+ }
+ else
+ {
+ ApiStatus = NetApiBufferAllocate(sizeof(ENUM_CONTEXT), (PVOID*)&EnumContext);
+ if (ApiStatus != NERR_Success)
+ goto done;
+
+ EnumContext->EnumerationContext = 0;
+ EnumContext->EnumBuffer = NULL;
+ EnumContext->EnumReturned = 0;
+
+ Status = SamConnect(NULL,
+ &EnumContext->ServerHandle,
+ SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamConnect failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ Status = GetAccountDomainSid(&DomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ Status = SamOpenDomain(EnumContext->ServerHandle,
+ DOMAIN_LIST_ACCOUNTS,
+ DomainSid,
+ &EnumContext->AccountDomainHandle);
+
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ Status = GetBuiltinDomainSid(&DomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ Status = SamOpenDomain(EnumContext->ServerHandle,
+ DOMAIN_LIST_ACCOUNTS,
+ DomainSid,
+ &EnumContext->BuiltinDomainHandle);
+
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+ }
+
+ while (TRUE)
+ {
+ Status = SamEnumerateAliasesInDomain(EnumContext->BuiltinDomainHandle,
+ &EnumContext->EnumerationContext,
+ (PVOID *)&EnumContext->EnumBuffer,
+ prefmaxlen,
+ &EnumContext->EnumReturned);
+
+ TRACE("SamEnumerateAliasesInDomain returned (Status %08lx)\n", Status);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamEnumerateAliasesInDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ TRACE("EnumContext: %lu\n", EnumContext);
+ TRACE("EnumReturned: %lu\n", EnumContext->EnumReturned);
+ TRACE("EnumBuffer: %p\n", EnumContext->EnumBuffer);
+
+ for (i = 0; i < EnumContext->EnumReturned; i++)
+ {
+ TRACE("RID: %lu\n", EnumContext->EnumBuffer[i].RelativeId);
+ TRACE("Name: %p\n", EnumContext->EnumBuffer[i].Name.Buffer);
+ TRACE("Name: %S\n", EnumContext->EnumBuffer[i].Name.Buffer);
+ if (EnumContext->EnumBuffer[i].Name.Buffer != NULL)
+ {
+ TRACE("Name: %hx\n", EnumContext->EnumBuffer[i].Name.Buffer[0]);
+ }
+ }
+
+ if (Status != STATUS_MORE_ENTRIES)
+ break;
+ }
+
+
+done:
+ if (resumehandle == NULL || ApiStatus != ERROR_MORE_DATA)
+ {
+ if (EnumContext != NULL)
+ {
+ if (EnumContext->BuiltinDomainHandle != NULL)
+ SamCloseHandle(EnumContext->BuiltinDomainHandle);
+
+ if (EnumContext->AccountDomainHandle != NULL)
+ SamCloseHandle(EnumContext->AccountDomainHandle);
+
+ if (EnumContext->ServerHandle != NULL)
+ SamCloseHandle(EnumContext->ServerHandle);
+
+ if (EnumContext->EnumBuffer != NULL)
+ {
+ for (i = 0; i < EnumContext->EnumReturned; i++)
+ {
+ SamFreeMemory(EnumContext->EnumBuffer[i].Name.Buffer);
+ }
+
+ SamFreeMemory(EnumContext->EnumBuffer);
+ }
+
+ NetApiBufferFree(EnumContext);
+ EnumContext = NULL;
+ }
+ }
+
+
+ if (resumehandle != NULL)
+ *resumehandle = (DWORD_PTR)EnumContext;
+
+ return ApiStatus;