ReactOS  0.4.14-dev-52-g6116262
display.c
Go to the documentation of this file.
1 /*
2  * PROJECT: NetAPI DLL
3  * LICENSE: GPL-2.0 (https://spdx.org/licenses/GPL-2.0)
4  * PURPOSE: SAM service interface code
5  * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
6  */
7 
8 /* INCLUDES ******************************************************************/
9 
10 #include "netapi32.h"
11 
13 
14 /* FUNCTIONS *****************************************************************/
15 
16 /* PUBLIC FUNCTIONS **********************************************************/
17 
19 WINAPI
21  _In_ LPCWSTR ServerName,
24  _In_ DWORD EntriesRequested,
25  _In_ DWORD PreferredMaximumLength,
26  _Out_ LPDWORD ReturnedEntryCount,
27  _Out_ PVOID *SortedBuffer)
28 {
29  UNICODE_STRING ServerNameString;
30  SAM_HANDLE ServerHandle = NULL;
31  SAM_HANDLE DomainHandle = NULL;
32  DOMAIN_DISPLAY_INFORMATION DisplayInformation;
33  DWORD LocalTotalBytesAvailable;
34  DWORD LocalTotalBytesReturned;
35  DWORD LocalReturnedEntryCount;
36  PVOID LocalSortedBuffer;
37  NET_API_STATUS ApiStatus = NERR_Success;
39 
40  TRACE("NetQueryDisplayInformation(%s, %ld, %ld, %ld, %ld, %p, %p)\n",
41  debugstr_w(ServerName), Level, Index, EntriesRequested,
42  PreferredMaximumLength, ReturnedEntryCount, SortedBuffer);
43 
44  *ReturnedEntryCount = 0;
45  *SortedBuffer = NULL;
46 
47  switch (Level)
48  {
49  case 1:
50  DisplayInformation = DomainDisplayUser;
51  break;
52 
53  case 2:
54  DisplayInformation = DomainDisplayMachine;
55  break;
56 
57  case 3:
58  DisplayInformation = DomainDisplayGroup;
59  break;
60 
61  default:
62  return ERROR_INVALID_LEVEL;
63  }
64 
65  if (ServerName != NULL)
66  RtlInitUnicodeString(&ServerNameString, ServerName);
67 
68  /* Connect to the SAM Server */
69  Status = SamConnect((ServerName != NULL) ? &ServerNameString : NULL,
70  &ServerHandle,
72  NULL);
73  if (!NT_SUCCESS(Status))
74  {
75  ERR("SamConnect failed (Status %08lx)\n", Status);
76  ApiStatus = NetpNtStatusToApiStatus(Status);
77  goto done;
78  }
79 
80  /* Open the Account Domain */
81  Status = OpenAccountDomain(ServerHandle,
82  (ServerName != NULL) ? &ServerNameString : NULL,
84  &DomainHandle);
85  if (!NT_SUCCESS(Status))
86  {
87  ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
88  ApiStatus = NetpNtStatusToApiStatus(Status);
89  goto done;
90  }
91 
92  /* Query the information */
93  Status = SamQueryDisplayInformation(DomainHandle,
94  DisplayInformation,
95  Index,
96  EntriesRequested,
97  PreferredMaximumLength,
98  &LocalTotalBytesAvailable,
99  &LocalTotalBytesReturned,
100  &LocalReturnedEntryCount,
101  &LocalSortedBuffer);
102  if (!NT_SUCCESS(Status))
103  {
104  ERR("SamQueryDisplayInformation failed (Status %08lx)\n", Status);
105  ApiStatus = NetpNtStatusToApiStatus(Status);
106  goto done;
107  }
108 
109  /* FIXME */
110 
111 done:
112  if (DomainHandle != NULL)
113  SamCloseHandle(DomainHandle);
114 
115  if (ServerHandle != NULL)
116  SamCloseHandle(ServerHandle);
117 
118  return ApiStatus;
119 }
120 
121 
123 WINAPI
125  _In_ LPCWSTR ServerName,
126  _In_ DWORD Level,
129 {
130  UNICODE_STRING ServerNameString, PrefixString;
131  SAM_HANDLE ServerHandle = NULL;
132  SAM_HANDLE DomainHandle = NULL;
133  DOMAIN_DISPLAY_INFORMATION DisplayInformation;
134  NET_API_STATUS ApiStatus = NERR_Success;
136 
137  TRACE("NetGetDisplayInformationIndex(%s %ld %s %p)\n",
138  debugstr_w(ServerName), Level, debugstr_w(Prefix), Index);
139 
140  switch (Level)
141  {
142  case 1:
143  DisplayInformation = DomainDisplayUser;
144  break;
145 
146  case 2:
147  DisplayInformation = DomainDisplayMachine;
148  break;
149 
150  case 3:
151  DisplayInformation = DomainDisplayGroup;
152  break;
153 
154  default:
155  return ERROR_INVALID_LEVEL;
156  }
157 
158  if (ServerName != NULL)
159  RtlInitUnicodeString(&ServerNameString, ServerName);
160 
161  /* Connect to the SAM Server */
162  Status = SamConnect((ServerName != NULL) ? &ServerNameString : NULL,
163  &ServerHandle,
165  NULL);
166  if (!NT_SUCCESS(Status))
167  {
168  ERR("SamConnect failed (Status %08lx)\n", Status);
169  ApiStatus = NetpNtStatusToApiStatus(Status);
170  goto done;
171  }
172 
173  /* Open the Account Domain */
174  Status = OpenAccountDomain(ServerHandle,
175  (ServerName != NULL) ? &ServerNameString : NULL,
177  &DomainHandle);
178  if (!NT_SUCCESS(Status))
179  {
180  ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
181  ApiStatus = NetpNtStatusToApiStatus(Status);
182  goto done;
183  }
184 
185  RtlInitUnicodeString(&PrefixString, Prefix);
186 
187  /* Get the index */
188  Status = SamGetDisplayEnumerationIndex(DomainHandle,
189  DisplayInformation,
190  &PrefixString,
191  Index);
192  if (!NT_SUCCESS(Status))
193  {
194  ERR("SamGetDisplayEnumerationIndex failed (Status %08lx)\n", Status);
195  ApiStatus = NetpNtStatusToApiStatus(Status);
196  }
197 
198 done:
199  if (DomainHandle != NULL)
200  SamCloseHandle(DomainHandle);
201 
202  if (ServerHandle != NULL)
203  SamCloseHandle(ServerHandle);
204 
205  return ApiStatus;
206 }
207 
208 /* EOF */
NTSTATUS NTAPI SamCloseHandle(IN SAM_HANDLE SamHandle)
Definition: samlib.c:476
#define SAM_SERVER_CONNECT
Definition: ntsam.h:99
enum _DOMAIN_DISPLAY_INFORMATION DOMAIN_DISPLAY_INFORMATION
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1631
NTSTATUS NTAPI SamGetDisplayEnumerationIndex(IN SAM_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformation, IN PUNICODE_STRING Prefix, OUT PULONG Index)
Definition: samlib.c:1025
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
NTSTATUS NTAPI SamQueryDisplayInformation(IN SAM_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformation, IN ULONG Index, IN ULONG EntryCount, IN ULONG PreferredMaximumLength, OUT PULONG TotalAvailable, OUT PULONG TotalReturned, OUT PULONG ReturnedEntryCount, OUT PVOID *SortedBuffer)
Definition: samlib.c:1528
LONG NTSTATUS
Definition: precomp.h:26
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:55
NTSTATUS OpenAccountDomain(IN SAM_HANDLE ServerHandle, IN PUNICODE_STRING ServerName, IN ULONG DesiredAccess, OUT PSAM_HANDLE DomainHandle)
Definition: utils.c:113
#define NERR_Success
Definition: lmerr.h:5
#define debugstr_w
Definition: kernel32.h:32
smooth NULL
Definition: ftsmooth.c:416
#define _Out_
Definition: no_sal2.h:323
#define SAM_SERVER_LOOKUP_DOMAIN
Definition: ntsam.h:104
DWORD NET_API_STATUS
Definition: ms-dtyp.idl:91
#define TRACE(s)
Definition: solgame.cpp:4
NET_API_STATUS WINAPI NetGetDisplayInformationIndex(_In_ LPCWSTR ServerName, _In_ DWORD Level, _In_ LPCWSTR Prefix, _Out_ LPDWORD Index)
Definition: display.c:124
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
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)
Definition: display.c:20
#define WINAPI
Definition: msvc.h:8
static const UCHAR Index[8]
Definition: usbohci.c:18
unsigned long DWORD
Definition: ntddk_ex.h:95
NET_API_STATUS WINAPI NetpNtStatusToApiStatus(_In_ NTSTATUS Status)
Definition: misc.c:289
WINE_DEFAULT_DEBUG_CHANNEL(netapi32)
Status
Definition: gdiplustypes.h:24
#define ERR(fmt,...)
Definition: debug.h:109
#define _In_
Definition: no_sal2.h:204
#define DOMAIN_LIST_ACCOUNTS
Definition: ntsam.h:41
uint32_t * LPDWORD
Definition: typedefs.h:57
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define ERROR_INVALID_LEVEL
Definition: winerror.h:196
NTSTATUS NTAPI SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL, OUT PSAM_HANDLE ServerHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: samlib.c:498