#ifndef _DSGETDC_H
#define _DSGETDC_H

#ifdef __cplusplus
extern "C" {
#endif

#define DS_DOMAIN_IN_FOREST       0x01
#define DS_DOMAIN_DIRECT_OUTBOUND 0x02
#define DS_DOMAIN_TREE_ROOT       0x04
#define DS_DOMAIN_PRIMARY         0x08
#define DS_DOMAIN_NATIVE_MODE     0x10
#define DS_DOMAIN_DIRECT_INBOUND  0x20

typedef struct _DOMAIN_CONTROLLER_INFOA
{
	LPSTR DomainControllerName;
	LPSTR DomainControllerAddress;
	ULONG DomainControllerAddressType;
	GUID DomainGuid;
	LPSTR DomainName;
	LPSTR DnsForestName;
	ULONG Flags;
	LPSTR DcSiteName;
	LPSTR ClientSiteName;
} DOMAIN_CONTROLLER_INFOA, *PDOMAIN_CONTROLLER_INFOA;

typedef struct _DOMAIN_CONTROLLER_INFOW
{
	LPWSTR DomainControllerName;
	LPWSTR DomainControllerAddress;
	ULONG DomainControllerAddressType;
	GUID DomainGuid;
	LPWSTR DomainName;
	LPWSTR DnsForestName;
	ULONG Flags;
	LPWSTR DcSiteName;
	LPWSTR ClientSiteName;
} DOMAIN_CONTROLLER_INFOW, *PDOMAIN_CONTROLLER_INFOW;

typedef struct _DS_DOMAIN_TRUSTSA
{
	LPSTR NetbiosDomainName;
	LPSTR DnsDomainName;
	ULONG Flags;
	ULONG ParentIndex;
	ULONG TrustType;
	ULONG TrustAttributes;
	PSID DomainSid;
	GUID DomainGuid;
} DS_DOMAIN_TRUSTSA, *PDS_DOMAIN_TRUSTSA;

typedef struct _DS_DOMAIN_TRUSTSW
{
	LPWSTR NetbiosDomainName;
	LPWSTR DnsDomainName;
	ULONG Flags;
	ULONG ParentIndex;
	ULONG TrustType;
	ULONG TrustAttributes;
	PSID DomainSid;
	GUID DomainGuid;
} DS_DOMAIN_TRUSTSW, *PDS_DOMAIN_TRUSTSW;

DWORD WINAPI
DsAddressToSiteNamesA(
	LPCSTR ComputerName,
	DWORD EntryCount,
	PSOCKET_ADDRESS SocketAddresses,
	LPSTR **SiteNames);

DWORD WINAPI
DsAddressToSiteNamesW(
	LPCWSTR ComputerName,
	DWORD EntryCount,
	PSOCKET_ADDRESS SocketAddresses,
	LPWSTR **SiteNames);

DWORD WINAPI
DsAddressToSiteNamesExA(
	LPCSTR ComputerName,
	DWORD EntryCount,
	PSOCKET_ADDRESS SocketAddresses,
	LPSTR **SiteNames,
	LPSTR **SubnetNames);

DWORD WINAPI
DsAddressToSiteNamesExW(
	LPCWSTR ComputerName,
	DWORD EntryCount,
	PSOCKET_ADDRESS SocketAddresses,
	LPWSTR **SiteNames,
	LPWSTR **SubnetNames);

DWORD WINAPI
DsDeregisterDnsHostRecordsA(
	LPSTR ServerName,
	LPSTR DnsDomainName,
	GUID *DomainGuid,
	GUID *DsaGuid,
	LPSTR DnsHostName);

DWORD WINAPI
DsDeregisterDnsHostRecordsW(
	LPWSTR ServerName,
	LPWSTR DnsDomainName,
	GUID *DomainGuid,
	GUID *DsaGuid,
	LPWSTR DnsHostName);

DWORD WINAPI
DsEnumerateDomainTrustsA(
	LPSTR ServerName,
	ULONG Flags,
	PDS_DOMAIN_TRUSTSA* Domains,
	PULONG DomainCount);

DWORD WINAPI
DsEnumerateDomainTrustsW(
	LPWSTR ServerName,
	ULONG Flags,
	PDS_DOMAIN_TRUSTSW* Domains,
	PULONG DomainCount);

DWORD WINAPI
DsGetDcNameA(
	LPCSTR ComputerName,
	LPCSTR DomainName,
	GUID* DomainGuid,
	LPCSTR SiteName,
	ULONG Flags,
	PDOMAIN_CONTROLLER_INFOA* DomainControllerInfo);

DWORD WINAPI
DsGetDcNameW(
	LPCWSTR ComputerName,
	LPCWSTR DomainName,
	GUID* DomainGuid,
	LPCWSTR SiteName,
	ULONG Flags,
	PDOMAIN_CONTROLLER_INFOW* DomainControllerInfo);

DWORD WINAPI
DsGetDcSiteCoverageA(
	LPCSTR ServerName,
	PULONG EntryCount,
	LPSTR **SiteNames);

DWORD WINAPI
DsGetDcSiteCoverageW(
	LPCWSTR ServerName,
	PULONG EntryCount,
	LPWSTR **SiteNames);

DWORD WINAPI
DsGetForestTrustInformationW(
	LPCWSTR ServerName,
	LPCWSTR TrustedDomainName,
	DWORD Flags,
	PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo);

DWORD WINAPI
DsGetSiteNameA(
	LPCSTR ComputerName,
	LPSTR *SiteName);

DWORD WINAPI
DsGetSiteNameW(
	LPCWSTR ComputerName,
	LPWSTR *SiteName);

DWORD WINAPI
DsMergeForestTrustInformationW(
	LPCWSTR DomainName,
	PLSA_FOREST_TRUST_INFORMATION NewForestTrustInfo,
	PLSA_FOREST_TRUST_INFORMATION OldForestTrustInfo,
	PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo);

DWORD WINAPI
DsValidateSubnetNameA(
	LPCSTR SubnetName);

DWORD WINAPI
DsValidateSubnetNameW(
	LPCWSTR SubnetName);

#ifdef UNICODE
typedef DOMAIN_CONTROLLER_INFOW DOMAIN_CONTROLLER_INFO, *PDOMAIN_CONTROLLER_INFO;
typedef DS_DOMAIN_TRUSTSW DS_DOMAIN_TRUSTS, *PDS_DOMAIN_TRUSTS;
#define DsAddressToSiteNames DsAddressToSiteNamesW
#define DsAddressToSiteNamesEx DsAddressToSiteNamesExW
#define DsEnumerateDomainTrusts DsEnumerateDomainTrustsW
#define DsGetDcName DsGetDcNameW
#define DsGetDcSiteCoverage DsGetDcSiteCoverageW
#define DsGetSiteName DsGetSiteNameW
#define DsValidateSubnetName DsValidateSubnetNameW
#else
typedef DOMAIN_CONTROLLER_INFOA DOMAIN_CONTROLLER_INFO, *PDOMAIN_CONTROLLER_INFO;
typedef DS_DOMAIN_TRUSTSA DS_DOMAIN_TRUSTS, *PDS_DOMAIN_TRUSTS;
#define DsAddressToSiteNames DsAddressToSiteNamesA
#define DsAddressToSiteNamesEx DsAddressToSiteNamesExA
#define DsEnumerateDomainTrusts DsEnumerateDomainTrustsA
#define DsGetDcName DsGetDcNameA
#define DsGetDcSiteCoverage DsGetDcSiteCoverageA
#define DsGetSiteName DsGetSiteNameA
#define DsValidateSubnetName DsValidateSubnetNameA
#endif

#ifdef __cplusplus
}
#endif
#endif