|  | /* | 
|  | * Copyright 2005 Paul Vriens | 
|  | * | 
|  | * netapi32 directory service functions | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
|  | */ | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #include "ntstatus.h" | 
|  | #define WIN32_NO_STATUS | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "winerror.h" | 
|  | #include "ntsecapi.h" | 
|  | #include "wine/debug.h" | 
|  | #include "dsrole.h" | 
|  | #include "dsgetdc.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(ds); | 
|  |  | 
|  | DWORD WINAPI DsGetDcNameW(LPCWSTR ComputerName, LPCWSTR AvoidDCName, | 
|  | GUID* DomainGuid, LPCWSTR SiteName, ULONG Flags, | 
|  | PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo) | 
|  | { | 
|  | FIXME("(%s, %s, %s, %s, %08x, %p): stub\n", debugstr_w(ComputerName), | 
|  | debugstr_w(AvoidDCName), debugstr_guid(DomainGuid), | 
|  | debugstr_w(SiteName), Flags, DomainControllerInfo); | 
|  | return ERROR_CALL_NOT_IMPLEMENTED; | 
|  | } | 
|  |  | 
|  | DWORD WINAPI DsGetDcNameA(LPCSTR ComputerName, LPCSTR AvoidDCName, | 
|  | GUID* DomainGuid, LPCSTR SiteName, ULONG Flags, | 
|  | PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo) | 
|  | { | 
|  | FIXME("(%s, %s, %s, %s, %08x, %p): stub\n", debugstr_a(ComputerName), | 
|  | debugstr_a(AvoidDCName), debugstr_guid(DomainGuid), | 
|  | debugstr_a(SiteName), Flags, DomainControllerInfo); | 
|  | return ERROR_CALL_NOT_IMPLEMENTED; | 
|  | } | 
|  |  | 
|  | DWORD WINAPI DsGetSiteNameW(LPCWSTR ComputerName, LPWSTR *SiteName) | 
|  | { | 
|  | FIXME("(%s, %p): stub\n", debugstr_w(ComputerName), SiteName); | 
|  | return ERROR_CALL_NOT_IMPLEMENTED; | 
|  | } | 
|  |  | 
|  | DWORD WINAPI DsGetSiteNameA(LPCSTR ComputerName, LPSTR *SiteName) | 
|  | { | 
|  | FIXME("(%s, %p): stub\n", debugstr_a(ComputerName), SiteName); | 
|  | return ERROR_CALL_NOT_IMPLEMENTED; | 
|  | } | 
|  |  | 
|  | /************************************************************ | 
|  | *  DsRoleFreeMemory (NETAPI32.@) | 
|  | * | 
|  | * PARAMS | 
|  | *  Buffer [I] Pointer to the to-be-freed buffer. | 
|  | * | 
|  | * RETURNS | 
|  | *  Nothing | 
|  | */ | 
|  | VOID WINAPI DsRoleFreeMemory(PVOID Buffer) | 
|  | { | 
|  | TRACE("(%p)\n", Buffer); | 
|  | HeapFree(GetProcessHeap(), 0, Buffer); | 
|  | } | 
|  |  | 
|  | /************************************************************ | 
|  | *  DsRoleGetPrimaryDomainInformation  (NETAPI32.@) | 
|  | * | 
|  | * PARAMS | 
|  | *  lpServer  [I] Pointer to UNICODE string with ComputerName | 
|  | *  InfoLevel [I] Type of data to retrieve | 
|  | *  Buffer    [O] Pointer to to the requested data | 
|  | * | 
|  | * RETURNS | 
|  | * | 
|  | * NOTES | 
|  | *  When lpServer is NULL, use the local computer | 
|  | */ | 
|  | DWORD WINAPI DsRoleGetPrimaryDomainInformation( | 
|  | LPCWSTR lpServer, DSROLE_PRIMARY_DOMAIN_INFO_LEVEL InfoLevel, | 
|  | PBYTE* Buffer) | 
|  | { | 
|  | DWORD ret; | 
|  |  | 
|  | FIXME("(%p, %d, %p) stub\n", lpServer, InfoLevel, Buffer); | 
|  |  | 
|  | /* Check some input parameters */ | 
|  |  | 
|  | if (!Buffer) return ERROR_INVALID_PARAMETER; | 
|  | if ((InfoLevel < DsRolePrimaryDomainInfoBasic) || (InfoLevel > DsRoleOperationState)) return ERROR_INVALID_PARAMETER; | 
|  |  | 
|  | *Buffer = NULL; | 
|  | switch (InfoLevel) | 
|  | { | 
|  | case DsRolePrimaryDomainInfoBasic: | 
|  | { | 
|  | LSA_OBJECT_ATTRIBUTES ObjectAttributes; | 
|  | LSA_HANDLE PolicyHandle; | 
|  | PPOLICY_ACCOUNT_DOMAIN_INFO DomainInfo; | 
|  | NTSTATUS NtStatus; | 
|  | int logon_domain_sz; | 
|  | DWORD size; | 
|  | PDSROLE_PRIMARY_DOMAIN_INFO_BASIC basic; | 
|  |  | 
|  | ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes)); | 
|  | NtStatus = LsaOpenPolicy(NULL, &ObjectAttributes, | 
|  | POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle); | 
|  | if (NtStatus != STATUS_SUCCESS) | 
|  | { | 
|  | TRACE("LsaOpenPolicyFailed with NT status %x\n", | 
|  | LsaNtStatusToWinError(NtStatus)); | 
|  | return ERROR_OUTOFMEMORY; | 
|  | } | 
|  | LsaQueryInformationPolicy(PolicyHandle, | 
|  | PolicyAccountDomainInformation, (PVOID*)&DomainInfo); | 
|  | logon_domain_sz = lstrlenW(DomainInfo->DomainName.Buffer) + 1; | 
|  | LsaClose(PolicyHandle); | 
|  |  | 
|  | size = sizeof(DSROLE_PRIMARY_DOMAIN_INFO_BASIC) + | 
|  | logon_domain_sz * sizeof(WCHAR); | 
|  | basic = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); | 
|  | if (basic) | 
|  | { | 
|  | basic->MachineRole = DsRole_RoleStandaloneWorkstation; | 
|  | basic->DomainNameFlat = (LPWSTR)((LPBYTE)basic + | 
|  | sizeof(DSROLE_PRIMARY_DOMAIN_INFO_BASIC)); | 
|  | lstrcpyW(basic->DomainNameFlat, DomainInfo->DomainName.Buffer); | 
|  | ret = ERROR_SUCCESS; | 
|  | } | 
|  | else | 
|  | ret = ERROR_OUTOFMEMORY; | 
|  | *Buffer = (PBYTE)basic; | 
|  | LsaFreeMemory(DomainInfo); | 
|  | } | 
|  | break; | 
|  | default: | 
|  | ret = ERROR_CALL_NOT_IMPLEMENTED; | 
|  | } | 
|  | return ret; | 
|  | } |