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 12 WINE_DEFAULT_DEBUG_CHANNEL(netapi32); 13 14 /* FUNCTIONS *****************************************************************/ 15 16 /* PUBLIC FUNCTIONS **********************************************************/ 17 18 NET_API_STATUS 19 WINAPI 20 NetQueryDisplayInformation( 21 _In_ LPCWSTR ServerName, 22 _In_ DWORD Level, 23 _In_ DWORD Index, 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; 38 NTSTATUS Status; 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, 71 SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN, 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, 83 DOMAIN_LIST_ACCOUNTS, 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 122 NET_API_STATUS 123 WINAPI 124 NetGetDisplayInformationIndex( 125 _In_ LPCWSTR ServerName, 126 _In_ DWORD Level, 127 _In_ LPCWSTR Prefix, 128 _Out_ LPDWORD Index) 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; 135 NTSTATUS Status; 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, 164 SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN, 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, 176 DOMAIN_LIST_ACCOUNTS, 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 */ 209