889 lines
15 KiB
C
889 lines
15 KiB
C
/*++
|
||
|
||
Copyright (c) 1997-2001 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
export.c
|
||
|
||
Abstract:
|
||
|
||
Domain Name System (DNS) API
|
||
|
||
Covering functions for exported routines that are actually in
|
||
dnslib.lib.
|
||
|
||
Author:
|
||
|
||
Jim Gilroy (jamesg) November, 1997
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "local.h"
|
||
|
||
|
||
//
|
||
// SDK routines
|
||
//
|
||
|
||
//
|
||
// Name comparison
|
||
//
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsNameCompare_A(
|
||
IN LPSTR pName1,
|
||
IN LPSTR pName2
|
||
)
|
||
{
|
||
return Dns_NameCompare_A( pName1, pName2 );
|
||
}
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsNameCompare_UTF8(
|
||
IN LPSTR pName1,
|
||
IN LPSTR pName2
|
||
)
|
||
{
|
||
return Dns_NameCompare_UTF8( pName1, pName2 );
|
||
}
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsNameCompare_W(
|
||
IN LPWSTR pName1,
|
||
IN LPWSTR pName2
|
||
)
|
||
{
|
||
return Dns_NameCompare_W( pName1, pName2 );
|
||
}
|
||
|
||
|
||
DNS_NAME_COMPARE_STATUS
|
||
DnsNameCompareEx_A(
|
||
IN LPCSTR pszLeftName,
|
||
IN LPCSTR pszRightName,
|
||
IN DWORD dwReserved
|
||
)
|
||
{
|
||
return Dns_NameCompareEx(
|
||
pszLeftName,
|
||
pszRightName,
|
||
dwReserved,
|
||
DnsCharSetAnsi );
|
||
}
|
||
|
||
DNS_NAME_COMPARE_STATUS
|
||
DnsNameCompareEx_UTF8(
|
||
IN LPCSTR pszLeftName,
|
||
IN LPCSTR pszRightName,
|
||
IN DWORD dwReserved
|
||
)
|
||
{
|
||
return Dns_NameCompareEx(
|
||
pszLeftName,
|
||
pszRightName,
|
||
dwReserved,
|
||
DnsCharSetUtf8 );
|
||
}
|
||
|
||
DNS_NAME_COMPARE_STATUS
|
||
DnsNameCompareEx_W(
|
||
IN LPCWSTR pszLeftName,
|
||
IN LPCWSTR pszRightName,
|
||
IN DWORD dwReserved
|
||
)
|
||
{
|
||
return Dns_NameCompareEx(
|
||
(LPSTR) pszLeftName,
|
||
(LPSTR) pszRightName,
|
||
dwReserved,
|
||
DnsCharSetUnicode );
|
||
}
|
||
|
||
|
||
//
|
||
// Name validation
|
||
//
|
||
|
||
DNS_STATUS
|
||
DnsValidateName_UTF8(
|
||
IN LPCSTR pszName,
|
||
IN DNS_NAME_FORMAT Format
|
||
)
|
||
{
|
||
return Dns_ValidateName_UTF8( pszName, Format );
|
||
}
|
||
|
||
|
||
DNS_STATUS
|
||
DnsValidateName_W(
|
||
IN LPCWSTR pszName,
|
||
IN DNS_NAME_FORMAT Format
|
||
)
|
||
{
|
||
return Dns_ValidateName_W( pszName, Format );
|
||
}
|
||
|
||
DNS_STATUS
|
||
DnsValidateName_A(
|
||
IN LPCSTR pszName,
|
||
IN DNS_NAME_FORMAT Format
|
||
)
|
||
{
|
||
return Dns_ValidateName_A( pszName, Format );
|
||
}
|
||
|
||
|
||
//
|
||
// Record List
|
||
//
|
||
|
||
BOOL
|
||
DnsRecordCompare(
|
||
IN PDNS_RECORD pRecord1,
|
||
IN PDNS_RECORD pRecord2
|
||
)
|
||
{
|
||
return Dns_RecordCompare(
|
||
pRecord1,
|
||
pRecord2 );
|
||
}
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsRecordSetCompare(
|
||
IN OUT PDNS_RECORD pRR1,
|
||
IN OUT PDNS_RECORD pRR2,
|
||
OUT PDNS_RECORD * ppDiff1,
|
||
OUT PDNS_RECORD * ppDiff2
|
||
)
|
||
{
|
||
return Dns_RecordSetCompare(
|
||
pRR1,
|
||
pRR2,
|
||
ppDiff1,
|
||
ppDiff2
|
||
);
|
||
}
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordCopyEx(
|
||
IN PDNS_RECORD pRecord,
|
||
IN DNS_CHARSET CharSetIn,
|
||
IN DNS_CHARSET CharSetOut
|
||
)
|
||
{
|
||
return Dns_RecordCopyEx( pRecord, CharSetIn, CharSetOut );
|
||
}
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordSetCopyEx(
|
||
IN PDNS_RECORD pRecordSet,
|
||
IN DNS_CHARSET CharSetIn,
|
||
IN DNS_CHARSET CharSetOut
|
||
)
|
||
{
|
||
return Dns_RecordSetCopyEx( pRecordSet, CharSetIn, CharSetOut );
|
||
}
|
||
|
||
|
||
VOID
|
||
WINAPI
|
||
DnsRecordListFree(
|
||
IN OUT PDNS_RECORD pRecordList,
|
||
IN DNS_FREE_TYPE FreeType
|
||
)
|
||
{
|
||
Dns_RecordListFreeEx(
|
||
pRecordList,
|
||
(BOOL)FreeType );
|
||
}
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordSetDetach(
|
||
IN OUT PDNS_RECORD pRR
|
||
)
|
||
{
|
||
return Dns_RecordSetDetach( pRR );
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Timer (timer.c)
|
||
//
|
||
|
||
DWORD
|
||
GetCurrentTimeInSeconds(
|
||
VOID
|
||
)
|
||
{
|
||
return Dns_GetCurrentTimeInSeconds();
|
||
}
|
||
|
||
|
||
|
||
|
||
//
|
||
// Resource record type utilities (record.c)
|
||
//
|
||
|
||
BOOL _fastcall
|
||
DnsIsAMailboxType(
|
||
IN WORD wType
|
||
)
|
||
{
|
||
return Dns_IsAMailboxType( wType );
|
||
}
|
||
|
||
WORD
|
||
DnsRecordTypeForName(
|
||
IN PCHAR pszName,
|
||
IN INT cchNameLength
|
||
)
|
||
{
|
||
return Dns_RecordTypeForName( pszName, cchNameLength );
|
||
}
|
||
|
||
PCHAR
|
||
DnsRecordStringForType(
|
||
IN WORD wType
|
||
)
|
||
{
|
||
return Dns_RecordStringForType( wType );
|
||
}
|
||
|
||
PCHAR
|
||
DnsRecordStringForWritableType(
|
||
IN WORD wType
|
||
)
|
||
{
|
||
return Dns_RecordStringForWritableType( wType );
|
||
}
|
||
|
||
BOOL
|
||
DnsIsStringCountValidForTextType(
|
||
IN WORD wType,
|
||
IN WORD StringCount )
|
||
{
|
||
return Dns_IsStringCountValidForTextType( wType, StringCount );
|
||
}
|
||
|
||
|
||
//
|
||
// DCR_CLEANUP: these probably don't need exporting
|
||
//
|
||
|
||
DWORD
|
||
DnsWinsRecordFlagForString(
|
||
IN PCHAR pchName,
|
||
IN INT cchNameLength
|
||
)
|
||
{
|
||
return Dns_WinsRecordFlagForString( pchName, cchNameLength );
|
||
}
|
||
|
||
PCHAR
|
||
DnsWinsRecordFlagString(
|
||
IN DWORD dwFlag,
|
||
IN OUT PCHAR pchFlag
|
||
)
|
||
{
|
||
return Dns_WinsRecordFlagString( dwFlag, pchFlag );
|
||
}
|
||
|
||
|
||
|
||
|
||
//
|
||
// DNS utilities (dnsutil.c)
|
||
//
|
||
// DCR_DELETE: DnsStatusString routines should be able to use win32 API
|
||
//
|
||
|
||
//
|
||
// Remove marco definitions so we can compile
|
||
// The idea here is we can have the entry points in the Dll
|
||
// for any old code, BUT the macros (dnsapi.h) point at new entry points
|
||
// for freshly built modules.
|
||
//
|
||
|
||
#ifdef DnsStatusToErrorString_A
|
||
#undef DnsStatusToErrorString_A
|
||
#endif
|
||
|
||
LPSTR
|
||
_fastcall
|
||
DnsStatusString(
|
||
IN DNS_STATUS Status
|
||
)
|
||
{
|
||
return Dns_StatusString( Status );
|
||
}
|
||
|
||
|
||
DNS_STATUS
|
||
_fastcall
|
||
DnsMapRcodeToStatus(
|
||
IN BYTE ResponseCode
|
||
)
|
||
{
|
||
return Dns_MapRcodeToStatus( ResponseCode );
|
||
}
|
||
|
||
BYTE
|
||
_fastcall
|
||
DnsIsStatusRcode(
|
||
IN DNS_STATUS Status
|
||
)
|
||
{
|
||
return Dns_IsStatusRcode( Status );
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Name routines (string.c and dnsutil.c)
|
||
//
|
||
|
||
LPSTR _fastcall
|
||
DnsGetDomainName(
|
||
IN LPSTR pszName
|
||
)
|
||
{
|
||
return Dns_GetDomainName( pszName );
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// String routines (string.c)
|
||
//
|
||
|
||
LPSTR
|
||
DnsCreateStringCopy(
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString
|
||
)
|
||
{
|
||
return Dns_CreateStringCopy(
|
||
pchString,
|
||
cchString );
|
||
}
|
||
|
||
DWORD
|
||
DnsGetBufferLengthForStringCopy(
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN BOOL fUnicodeIn,
|
||
IN BOOL fUnicodeOut
|
||
)
|
||
{
|
||
return (WORD) Dns_GetBufferLengthForStringCopy(
|
||
pchString,
|
||
cchString,
|
||
fUnicodeIn ? DnsCharSetUnicode : DnsCharSetUtf8,
|
||
fUnicodeOut ? DnsCharSetUnicode : DnsCharSetUtf8
|
||
);
|
||
}
|
||
|
||
//
|
||
// Need to
|
||
// - get this unexported or
|
||
// - real verions or
|
||
// - explicit UTF8-unicode converter if thats what's desired
|
||
//
|
||
|
||
PVOID
|
||
DnsCopyStringEx(
|
||
OUT PBYTE pBuffer,
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN BOOL fUnicodeIn,
|
||
IN BOOL fUnicodeOut
|
||
)
|
||
{
|
||
DWORD resultLength;
|
||
|
||
resultLength =
|
||
Dns_StringCopy(
|
||
pBuffer,
|
||
NULL,
|
||
pchString,
|
||
cchString,
|
||
fUnicodeIn ? DnsCharSetUnicode : DnsCharSetUtf8,
|
||
fUnicodeOut ? DnsCharSetUnicode : DnsCharSetUtf8
|
||
);
|
||
|
||
return( pBuffer + resultLength );
|
||
}
|
||
|
||
PVOID
|
||
DnsStringCopyAllocateEx(
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN BOOL fUnicodeIn,
|
||
IN BOOL fUnicodeOut
|
||
)
|
||
{
|
||
return Dns_StringCopyAllocate(
|
||
pchString,
|
||
cchString,
|
||
fUnicodeIn ? DnsCharSetUnicode : DnsCharSetUtf8,
|
||
fUnicodeOut ? DnsCharSetUnicode : DnsCharSetUtf8
|
||
);
|
||
}
|
||
|
||
//
|
||
// The new and improved string copy routines . . .
|
||
//
|
||
|
||
DWORD
|
||
DnsNameCopy(
|
||
OUT PBYTE pBuffer,
|
||
IN OUT PDWORD pdwBufLength,
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN DNS_CHARSET CharSetIn,
|
||
IN DNS_CHARSET CharSetOut
|
||
)
|
||
{
|
||
return Dns_NameCopy( pBuffer,
|
||
pdwBufLength,
|
||
pchString,
|
||
cchString,
|
||
CharSetIn,
|
||
CharSetOut );
|
||
}
|
||
|
||
PVOID
|
||
DnsNameCopyAllocate(
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN DNS_CHARSET CharSetIn,
|
||
IN DNS_CHARSET CharSetOut
|
||
)
|
||
{
|
||
return Dns_NameCopyAllocate ( pchString,
|
||
cchString,
|
||
CharSetIn,
|
||
CharSetOut );
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// String\Address mapping
|
||
//
|
||
// DCR: eliminate these exports
|
||
// DCR: fix these to SDK the real deal
|
||
//
|
||
// DCR: probably shouldn't expose alloc -- easy workaround for caller
|
||
//
|
||
|
||
PCHAR
|
||
DnsWriteReverseNameStringForIpAddress(
|
||
OUT PCHAR pBuffer,
|
||
IN IP4_ADDRESS Ip4Addr
|
||
)
|
||
{
|
||
return Dns_Ip4AddressToReverseName_A(
|
||
pBuffer,
|
||
Ip4Addr );
|
||
}
|
||
|
||
PCHAR
|
||
DnsCreateReverseNameStringForIpAddress(
|
||
IN IP4_ADDRESS Ip4Addr
|
||
)
|
||
{
|
||
return Dns_Ip4AddressToReverseNameAlloc_A( Ip4Addr );
|
||
}
|
||
|
||
|
||
//
|
||
// DCR_CLEANUP: pull these in favor of winsock IPv6 string routines
|
||
//
|
||
|
||
BOOL
|
||
DnsIpv6StringToAddress(
|
||
OUT PIP6_ADDRESS pIp6Addr,
|
||
IN PCHAR pchString,
|
||
IN DWORD dwStringLength
|
||
)
|
||
{
|
||
return Dns_Ip6StringToAddressEx_A(
|
||
pIp6Addr,
|
||
pchString,
|
||
dwStringLength );
|
||
}
|
||
|
||
VOID
|
||
DnsIpv6AddressToString(
|
||
OUT PCHAR pchString,
|
||
IN PIP6_ADDRESS pIp6Addr
|
||
)
|
||
{
|
||
Dns_Ip6AddressToString_A(
|
||
pchString,
|
||
pIp6Addr );
|
||
}
|
||
|
||
|
||
|
||
DNS_STATUS
|
||
DnsValidateDnsString_UTF8(
|
||
IN LPCSTR pszName
|
||
)
|
||
{
|
||
return Dns_ValidateDnsString_UTF8( pszName );
|
||
}
|
||
|
||
DNS_STATUS
|
||
DnsValidateDnsString_W(
|
||
IN LPCWSTR pszName
|
||
)
|
||
{
|
||
return Dns_ValidateDnsString_W( pszName );
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Resource record utilities (rr*.c)
|
||
//
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsAllocateRecord(
|
||
IN WORD wBufferLength
|
||
)
|
||
{
|
||
return Dns_AllocateRecord( wBufferLength );
|
||
}
|
||
|
||
|
||
PDNS_RECORD
|
||
DnsRecordBuild_UTF8(
|
||
IN OUT PDNS_RRSET pRRSet,
|
||
IN LPSTR pszOwner,
|
||
IN WORD wType,
|
||
IN BOOL fAdd,
|
||
IN UCHAR Section,
|
||
IN INT Argc,
|
||
IN PCHAR * Argv
|
||
)
|
||
{
|
||
return Dns_RecordBuild_A(
|
||
pRRSet,
|
||
pszOwner,
|
||
wType,
|
||
fAdd,
|
||
Section,
|
||
Argc,
|
||
Argv );
|
||
}
|
||
|
||
PDNS_RECORD
|
||
DnsRecordBuild_W(
|
||
IN OUT PDNS_RRSET pRRSet,
|
||
IN LPWSTR pszOwner,
|
||
IN WORD wType,
|
||
IN BOOL fAdd,
|
||
IN UCHAR Section,
|
||
IN INT Argc,
|
||
IN PWCHAR * Argv
|
||
)
|
||
{
|
||
return Dns_RecordBuild_W(
|
||
pRRSet,
|
||
pszOwner,
|
||
wType,
|
||
fAdd,
|
||
Section,
|
||
Argc,
|
||
Argv );
|
||
}
|
||
|
||
//
|
||
// Message processing
|
||
//
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsExtractRecordsFromMessage_W(
|
||
IN PDNS_MESSAGE_BUFFER pDnsBuffer,
|
||
IN WORD wMessageLength,
|
||
OUT PDNS_RECORD * ppRecord
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
None.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
return Dns_ExtractRecordsFromBuffer(
|
||
pDnsBuffer,
|
||
wMessageLength,
|
||
TRUE,
|
||
ppRecord );
|
||
}
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsExtractRecordsFromMessage_UTF8(
|
||
IN PDNS_MESSAGE_BUFFER pDnsBuffer,
|
||
IN WORD wMessageLength,
|
||
OUT PDNS_RECORD * ppRecord
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
None.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
return Dns_ExtractRecordsFromBuffer(
|
||
pDnsBuffer,
|
||
wMessageLength,
|
||
FALSE,
|
||
ppRecord );
|
||
}
|
||
|
||
|
||
//
|
||
// Debug sharing
|
||
//
|
||
|
||
PDNS_DEBUG_INFO
|
||
DnsApiSetDebugGlobals(
|
||
IN OUT PDNS_DEBUG_INFO pInfo
|
||
)
|
||
{
|
||
return Dns_SetDebugGlobals( pInfo );
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Config UI, ipconfig backcompat
|
||
//
|
||
// DCR_CLEANUP: Backcompat query config stuff -- yank once clean cycle
|
||
//
|
||
|
||
|
||
//
|
||
// DCR: Questionable exports
|
||
//
|
||
|
||
LPSTR
|
||
DnsCreateStandardDnsNameCopy(
|
||
IN PCHAR pchName,
|
||
IN DWORD cchName,
|
||
IN DWORD dwFlag
|
||
)
|
||
{
|
||
return Dns_CreateStandardDnsNameCopy(
|
||
pchName,
|
||
cchName,
|
||
dwFlag );
|
||
}
|
||
|
||
|
||
//
|
||
// DCR_CLEANUP: who is using this?
|
||
//
|
||
|
||
DWORD
|
||
DnsDowncaseDnsNameLabel(
|
||
OUT PCHAR pchResult,
|
||
IN PCHAR pchLabel,
|
||
IN DWORD cchLabel,
|
||
IN DWORD dwFlags
|
||
)
|
||
{
|
||
return Dns_DowncaseNameLabel(
|
||
pchResult,
|
||
pchLabel,
|
||
cchLabel,
|
||
dwFlags );
|
||
}
|
||
|
||
//
|
||
// DCR_CLEANUP: who is using my direct UTF8 conversions AS API!
|
||
//
|
||
|
||
DWORD
|
||
_fastcall
|
||
DnsUnicodeToUtf8(
|
||
IN PWCHAR pwUnicode,
|
||
IN DWORD cchUnicode,
|
||
OUT PCHAR pchResult,
|
||
IN DWORD cchResult
|
||
)
|
||
{
|
||
return Dns_UnicodeToUtf8(
|
||
pwUnicode,
|
||
cchUnicode,
|
||
pchResult,
|
||
cchResult );
|
||
}
|
||
|
||
DWORD
|
||
_fastcall
|
||
DnsUtf8ToUnicode(
|
||
IN PCHAR pchUtf8,
|
||
IN DWORD cchUtf8,
|
||
OUT PWCHAR pwResult,
|
||
IN DWORD cwResult
|
||
)
|
||
{
|
||
return Dns_Utf8ToUnicode(
|
||
pchUtf8,
|
||
cchUtf8,
|
||
pwResult,
|
||
cwResult );
|
||
}
|
||
|
||
DNS_STATUS
|
||
DnsValidateUtf8Byte(
|
||
IN BYTE chUtf8,
|
||
IN OUT PDWORD pdwTrailCount
|
||
)
|
||
{
|
||
return Dns_ValidateUtf8Byte(
|
||
chUtf8,
|
||
pdwTrailCount );
|
||
}
|
||
|
||
|
||
//
|
||
// Old cluster call
|
||
//
|
||
// DCR: cleanup -- remove once cluster fixed up
|
||
//
|
||
|
||
VOID
|
||
DnsNotifyResolverClusterIp(
|
||
IN IP_ADDRESS ClusterIp,
|
||
IN BOOL fAdd
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Notify resolver of cluster IP coming on\offline.
|
||
|
||
Arguments:
|
||
|
||
ClusterIp -- cluster IP
|
||
|
||
fAdd -- TRUE if coming online; FALSE if offline.
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
{
|
||
SOCKADDR_IN sockaddrIn;
|
||
|
||
DNSDBG( TRACE, (
|
||
"DnsNotifyResolverClusterIp( %08x, %d )\n",
|
||
ClusterIp,
|
||
fAdd ));
|
||
|
||
sockaddrIn.sin_family = AF_INET;
|
||
sockaddrIn.sin_addr.s_addr = ClusterIp;
|
||
|
||
DnsRegisterClusterAddress(
|
||
0xd734453d,
|
||
NULL, // no name
|
||
(PSOCKADDR) & sockaddrIn,
|
||
fAdd
|
||
? DNS_CLUSTER_ADD
|
||
: DNS_CLUSTER_DELETE_IP
|
||
);
|
||
}
|
||
|
||
//
|
||
// backcompat for macros
|
||
// - DNS server list
|
||
//
|
||
// this is called without dnsapi.h include somewhere in IIS
|
||
//
|
||
|
||
#undef DnsGetDnsServerList
|
||
|
||
DWORD
|
||
DnsGetDnsServerList(
|
||
OUT PIP4_ARRAY * ppDnsArray
|
||
)
|
||
{
|
||
*ppDnsArray = GetDnsServerList( TRUE );
|
||
|
||
// if no servers read, return
|
||
|
||
if ( !*ppDnsArray )
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
return( (*ppDnsArray)->AddrCount );
|
||
}
|
||
|
||
//
|
||
// Config UI, ipconfig backcompat
|
||
//
|
||
// DCR_CLEANUP: this is called without dnsapi.h include somewhere in DHCP
|
||
//
|
||
|
||
#undef DnsGetPrimaryDomainName_A
|
||
|
||
#define PrivateQueryConfig( Id ) DnsQueryConfigAllocEx( Id, NULL, FALSE )
|
||
|
||
PSTR
|
||
WINAPI
|
||
DnsGetPrimaryDomainName_A(
|
||
VOID
|
||
)
|
||
{
|
||
return PrivateQueryConfig( DnsConfigPrimaryDomainName_A );
|
||
}
|
||
|
||
//
|
||
// End export.c
|
||
//
|