[NETAPI]
[reactos.git] / reactos / dll / win32 / netapi32 / display.c
diff --git a/reactos/dll/win32/netapi32/display.c b/reactos/dll/win32/netapi32/display.c
new file mode 100644 (file)
index 0000000..8747eb5
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * PROJECT:     NetAPI DLL
+ * LICENSE:     GPL-2.0 (https://spdx.org/licenses/GPL-2.0)
+ * PURPOSE:     SAM service interface code
+ * COPYRIGHT:   Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "netapi32.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
+
+/* FUNCTIONS *****************************************************************/
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+NET_API_STATUS
+WINAPI
+NetQueryDisplayInformation(
+    _In_ LPCWSTR ServerName,
+    _In_ DWORD Level,
+    _In_ DWORD Index,
+    _In_ DWORD EntriesRequested,
+    _In_ DWORD PreferredMaximumLength,
+    _Out_ LPDWORD ReturnedEntryCount,
+    _Out_ PVOID *SortedBuffer)
+{
+    UNICODE_STRING ServerNameString;
+    SAM_HANDLE ServerHandle = NULL;
+    SAM_HANDLE DomainHandle = NULL;
+    DOMAIN_DISPLAY_INFORMATION DisplayInformation;
+    DWORD LocalTotalBytesAvailable;
+    DWORD LocalTotalBytesReturned;
+    DWORD LocalReturnedEntryCount;
+    PVOID LocalSortedBuffer;
+    NET_API_STATUS ApiStatus = NERR_Success;
+    NTSTATUS Status;
+
+    TRACE("NetQueryDisplayInformation(%s, %ld, %ld, %ld, %ld, %p, %p)\n",
+          debugstr_w(ServerName), Level, Index, EntriesRequested,
+          PreferredMaximumLength, ReturnedEntryCount, SortedBuffer);
+
+    *ReturnedEntryCount = 0;
+    *SortedBuffer = NULL;
+
+    switch (Level)
+    {
+        case 1:
+            DisplayInformation = DomainDisplayUser;
+            break;
+
+        case 2:
+            DisplayInformation = DomainDisplayMachine;
+            break;
+
+        case 3:
+            DisplayInformation = DomainDisplayGroup;
+            break;
+
+        default:
+            return ERROR_INVALID_LEVEL;
+    }
+
+    if (ServerName != NULL)
+        RtlInitUnicodeString(&ServerNameString, ServerName);
+
+    /* Connect to the SAM Server */
+    Status = SamConnect((ServerName != NULL) ? &ServerNameString : NULL,
+                        &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;
+    }
+
+    /* Open the Account Domain */
+    Status = OpenAccountDomain(ServerHandle,
+                               (ServerName != NULL) ? &ServerNameString : NULL,
+                               DOMAIN_LIST_ACCOUNTS,
+                               &DomainHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
+        ApiStatus = NetpNtStatusToApiStatus(Status);
+        goto done;
+    }
+
+    /* Query the information */
+    Status = SamQueryDisplayInformation(DomainHandle,
+                                        DisplayInformation,
+                                        Index,
+                                        EntriesRequested,
+                                        PreferredMaximumLength,
+                                        &LocalTotalBytesAvailable,
+                                        &LocalTotalBytesReturned,
+                                        &LocalReturnedEntryCount,
+                                        &LocalSortedBuffer);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("SamQueryDisplayInformation failed (Status %08lx)\n", Status);
+        ApiStatus = NetpNtStatusToApiStatus(Status);
+        goto done;
+    }
+
+    /* FIXME */
+
+done:
+    if (DomainHandle != NULL)
+        SamCloseHandle(DomainHandle);
+
+    if (ServerHandle != NULL)
+        SamCloseHandle(ServerHandle);
+
+    return ApiStatus;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetGetDisplayInformationIndex(
+    _In_ LPCWSTR ServerName,
+    _In_ DWORD Level,
+    _In_ LPCWSTR Prefix,
+    _Out_ LPDWORD Index)
+{
+    UNICODE_STRING ServerNameString, PrefixString;
+    SAM_HANDLE ServerHandle = NULL;
+    SAM_HANDLE DomainHandle = NULL;
+    DOMAIN_DISPLAY_INFORMATION DisplayInformation;
+    NET_API_STATUS ApiStatus = NERR_Success;
+    NTSTATUS Status;
+
+    TRACE("NetGetDisplayInformationIndex(%s %ld %s %p)\n",
+          debugstr_w(ServerName), Level, debugstr_w(Prefix), Index);
+
+    switch (Level)
+    {
+        case 1:
+            DisplayInformation = DomainDisplayUser;
+            break;
+
+        case 2:
+            DisplayInformation = DomainDisplayMachine;
+            break;
+
+        case 3:
+            DisplayInformation = DomainDisplayGroup;
+            break;
+
+        default:
+            return ERROR_INVALID_LEVEL;
+    }
+
+    if (ServerName != NULL)
+        RtlInitUnicodeString(&ServerNameString, ServerName);
+
+    /* Connect to the SAM Server */
+    Status = SamConnect((ServerName != NULL) ? &ServerNameString : NULL,
+                        &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;
+    }
+
+    /* Open the Account Domain */
+    Status = OpenAccountDomain(ServerHandle,
+                               (ServerName != NULL) ? &ServerNameString : NULL,
+                               DOMAIN_LIST_ACCOUNTS,
+                               &DomainHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
+        ApiStatus = NetpNtStatusToApiStatus(Status);
+        goto done;
+    }
+
+    RtlInitUnicodeString(&PrefixString, Prefix);
+
+    /* Get the index */
+    Status = SamGetDisplayEnumerationIndex(DomainHandle,
+                                           DisplayInformation,
+                                           &PrefixString,
+                                           Index);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("SamGetDisplayEnumerationIndex failed (Status %08lx)\n", Status);
+        ApiStatus = NetpNtStatusToApiStatus(Status);
+    }
+
+done:
+    if (DomainHandle != NULL)
+        SamCloseHandle(DomainHandle);
+
+    if (ServerHandle != NULL)
+        SamCloseHandle(ServerHandle);
+
+    return ApiStatus;
+}
+
+/* EOF */