1031 lines
20 KiB
C
1031 lines
20 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1999-2001 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
config.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Domain Name System (DNS) API
|
|||
|
|
|||
|
Configuration routines.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Gilroy (jamesg) September 1999
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include "local.h"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Config mapping table.
|
|||
|
//
|
|||
|
// Maps config IDs into corresponding registry lookups.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _ConfigMapping
|
|||
|
{
|
|||
|
DWORD ConfigId;
|
|||
|
DWORD RegId;
|
|||
|
BOOLEAN fAdapterAllowed;
|
|||
|
BOOLEAN fAdapterRequired;
|
|||
|
BYTE CharSet;
|
|||
|
//BYTE Reserved;
|
|||
|
}
|
|||
|
CONFIG_MAPPING, *PCONFIG_MAPPING;
|
|||
|
|
|||
|
//
|
|||
|
// Mapping table
|
|||
|
//
|
|||
|
|
|||
|
CONFIG_MAPPING ConfigMappingArray[] =
|
|||
|
{
|
|||
|
// In Win2K
|
|||
|
|
|||
|
DnsConfigPrimaryDomainName_W,
|
|||
|
RegIdPrimaryDomainName,
|
|||
|
0,
|
|||
|
0,
|
|||
|
DnsCharSetUnicode,
|
|||
|
|
|||
|
DnsConfigPrimaryDomainName_A,
|
|||
|
RegIdPrimaryDomainName,
|
|||
|
0,
|
|||
|
0,
|
|||
|
DnsCharSetAnsi,
|
|||
|
|
|||
|
DnsConfigPrimaryDomainName_UTF8,
|
|||
|
RegIdPrimaryDomainName,
|
|||
|
0,
|
|||
|
0,
|
|||
|
DnsCharSetUtf8,
|
|||
|
|
|||
|
// Not available
|
|||
|
|
|||
|
DnsConfigAdapterDomainName_W,
|
|||
|
RegIdAdapterDomainName,
|
|||
|
1,
|
|||
|
1,
|
|||
|
DnsCharSetUnicode,
|
|||
|
|
|||
|
DnsConfigAdapterDomainName_A,
|
|||
|
RegIdAdapterDomainName,
|
|||
|
1,
|
|||
|
1,
|
|||
|
DnsCharSetAnsi,
|
|||
|
|
|||
|
DnsConfigAdapterDomainName_UTF8,
|
|||
|
RegIdAdapterDomainName,
|
|||
|
1,
|
|||
|
1,
|
|||
|
DnsCharSetUtf8,
|
|||
|
|
|||
|
// In Win2K
|
|||
|
|
|||
|
DnsConfigDnsServerList,
|
|||
|
RegIdDnsServers,
|
|||
|
1, // adapter allowed
|
|||
|
0, // not required
|
|||
|
0,
|
|||
|
|
|||
|
// Not available
|
|||
|
|
|||
|
DnsConfigSearchList,
|
|||
|
RegIdSearchList,
|
|||
|
0, // adapter allowed
|
|||
|
0, // not required
|
|||
|
0,
|
|||
|
|
|||
|
DnsConfigAdapterInfo,
|
|||
|
0, // no reg mapping
|
|||
|
0, // adapter allowed
|
|||
|
0, // not required
|
|||
|
0,
|
|||
|
|
|||
|
// In Win2K
|
|||
|
|
|||
|
DnsConfigPrimaryHostNameRegistrationEnabled,
|
|||
|
RegIdRegisterPrimaryName,
|
|||
|
1, // adapter allowed
|
|||
|
0, // not required
|
|||
|
0,
|
|||
|
DnsConfigAdapterHostNameRegistrationEnabled,
|
|||
|
RegIdRegisterAdapterName,
|
|||
|
1, // adapter allowed
|
|||
|
0, // adapter note required
|
|||
|
0,
|
|||
|
DnsConfigAddressRegistrationMaxCount,
|
|||
|
RegIdRegistrationMaxAddressCount,
|
|||
|
1, // adapter allowed
|
|||
|
0, // not required
|
|||
|
0,
|
|||
|
|
|||
|
// In WindowsXP
|
|||
|
|
|||
|
DnsConfigHostName_W,
|
|||
|
RegIdHostName,
|
|||
|
0,
|
|||
|
0,
|
|||
|
DnsCharSetUnicode,
|
|||
|
|
|||
|
DnsConfigHostName_A,
|
|||
|
RegIdHostName,
|
|||
|
0,
|
|||
|
0,
|
|||
|
DnsCharSetAnsi,
|
|||
|
|
|||
|
DnsConfigHostName_UTF8,
|
|||
|
RegIdHostName,
|
|||
|
0,
|
|||
|
0,
|
|||
|
DnsCharSetUtf8,
|
|||
|
|
|||
|
// In WindowsXP
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// System Public -- Windows XP
|
|||
|
//
|
|||
|
|
|||
|
DnsConfigRegistrationEnabled,
|
|||
|
RegIdRegistrationEnabled,
|
|||
|
1, // adapter allowed
|
|||
|
0, // not required
|
|||
|
0,
|
|||
|
|
|||
|
DnsConfigWaitForNameErrorOnAll,
|
|||
|
RegIdWaitForNameErrorOnAll,
|
|||
|
0, // no adapter
|
|||
|
0, // not required
|
|||
|
0,
|
|||
|
|
|||
|
// These exist in system-public space but are
|
|||
|
// not DWORDs and table is never used for them
|
|||
|
//
|
|||
|
// DnsConfigNetworkInformation:
|
|||
|
// DnsConfigSearchInformation:
|
|||
|
// DnsConfigNetInfo:
|
|||
|
};
|
|||
|
|
|||
|
#define LAST_CONFIG_MAPPED (DnsConfigHostName_UTF8)
|
|||
|
|
|||
|
#define CONFIG_TABLE_LENGTH (sizeof(ConfigMappingArray) / sizeof(CONFIG_MAPPING))
|
|||
|
|
|||
|
|
|||
|
|
|||
|
PCONFIG_MAPPING
|
|||
|
GetConfigToRegistryMapping(
|
|||
|
IN DNS_CONFIG_TYPE ConfigId,
|
|||
|
IN PCWSTR pwsAdapterName,
|
|||
|
IN BOOL fCheckAdapter
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Get registry enum type for config enum type.
|
|||
|
|
|||
|
Purpose of this is to do mapping -- thus hiding internal
|
|||
|
registry implemenation -- AND to do check on whether
|
|||
|
adapter info is allowed or required for the config type.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ConfigId -- config type
|
|||
|
|
|||
|
pwsAdapterName -- adapter name
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Ptr to config to registry mapping -- if found.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DWORD iter = 0;
|
|||
|
PCONFIG_MAPPING pfig;
|
|||
|
|
|||
|
//
|
|||
|
// find config
|
|||
|
//
|
|||
|
// note, using loop through config IDs; this allows
|
|||
|
// use to have gap in config table allowing private
|
|||
|
// ids well separated from public id space
|
|||
|
//
|
|||
|
|
|||
|
while ( iter < CONFIG_TABLE_LENGTH )
|
|||
|
{
|
|||
|
pfig = & ConfigMappingArray[ iter ];
|
|||
|
if ( pfig->ConfigId != (DWORD)ConfigId )
|
|||
|
{
|
|||
|
iter++;
|
|||
|
continue;
|
|||
|
}
|
|||
|
goto Found;
|
|||
|
}
|
|||
|
goto Invalid;
|
|||
|
|
|||
|
|
|||
|
Found:
|
|||
|
|
|||
|
//
|
|||
|
// verify adapter info is appropriate to config type
|
|||
|
//
|
|||
|
|
|||
|
if ( fCheckAdapter )
|
|||
|
{
|
|||
|
if ( pwsAdapterName )
|
|||
|
{
|
|||
|
if ( !pfig->fAdapterAllowed )
|
|||
|
{
|
|||
|
goto Invalid;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if ( pfig->fAdapterRequired )
|
|||
|
{
|
|||
|
goto Invalid;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return pfig;
|
|||
|
|
|||
|
|
|||
|
Invalid:
|
|||
|
|
|||
|
DNS_ASSERT( FALSE );
|
|||
|
SetLastError( ERROR_INVALID_PARAMETER );
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DNS_STATUS
|
|||
|
LookupDwordConfigValue(
|
|||
|
OUT PDWORD pResult,
|
|||
|
IN DNS_CONFIG_TYPE ConfigId,
|
|||
|
IN PWSTR pwsAdapter
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Get registry enum type for config enum type.
|
|||
|
|
|||
|
Purpose of this is to do mapping -- thus hiding internal
|
|||
|
registry implemenation -- AND to do check on whether
|
|||
|
adapter info is allowed or required for the config type.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pResult -- address to recv DWORD result
|
|||
|
|
|||
|
ConfigId -- config type
|
|||
|
|
|||
|
pwsAdapter -- adapter name
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_SUCCESS on successful read.
|
|||
|
ErrorCode on failure.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PCONFIG_MAPPING pfig;
|
|||
|
DNS_STATUS status;
|
|||
|
|
|||
|
//
|
|||
|
// verify config is known and mapped
|
|||
|
//
|
|||
|
|
|||
|
pfig = GetConfigToRegistryMapping(
|
|||
|
ConfigId,
|
|||
|
pwsAdapter,
|
|||
|
TRUE // check adapter validity
|
|||
|
);
|
|||
|
if ( !pfig )
|
|||
|
{
|
|||
|
return ERROR_INVALID_PARAMETER;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// lookup in registry
|
|||
|
//
|
|||
|
|
|||
|
status = Reg_GetDword(
|
|||
|
NULL, // no session
|
|||
|
NULL, // no key given
|
|||
|
pwsAdapter,
|
|||
|
pfig->RegId, // reg id for config type
|
|||
|
pResult );
|
|||
|
#if DBG
|
|||
|
if ( status != NO_ERROR )
|
|||
|
{
|
|||
|
DNSDBG( ANY, (
|
|||
|
"Reg_GetDword() failed for config lookup!\n"
|
|||
|
"\tstatus = %d\n"
|
|||
|
"\tConfigId = %d\n"
|
|||
|
"\tRedId = %d\n"
|
|||
|
"\tpwsAdapter = %S\n",
|
|||
|
status,
|
|||
|
ConfigId,
|
|||
|
pfig->RegId,
|
|||
|
pwsAdapter ));
|
|||
|
|
|||
|
ASSERT( status == NO_ERROR );
|
|||
|
}
|
|||
|
#endif
|
|||
|
return( status );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Public Configuration API
|
|||
|
//
|
|||
|
|
|||
|
DNS_STATUS
|
|||
|
DnsQueryConfig(
|
|||
|
IN DNS_CONFIG_TYPE ConfigId,
|
|||
|
IN DWORD Flag,
|
|||
|
IN PWSTR pwsAdapterName,
|
|||
|
IN PVOID pReserved,
|
|||
|
OUT PVOID pBuffer,
|
|||
|
IN OUT PDWORD pBufferLength
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Get DNS configuration info.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ConfigId -- type of config info desired
|
|||
|
|
|||
|
Flag -- flags to query
|
|||
|
|
|||
|
pAdapterName -- name of adapter; NULL if no specific adapter
|
|||
|
|
|||
|
pReserved -- reserved parameter, should be NULL
|
|||
|
|
|||
|
pBuffer -- buffer to receive config info
|
|||
|
|
|||
|
pBufferLength -- addr of DWORD containing buffer length; on return
|
|||
|
contains length
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_SUCCESS -- if query successful
|
|||
|
ERROR_MORE_DATA -- if not enough space in buffer
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DNS_STATUS status = ERROR_SUCCESS;
|
|||
|
DWORD bufLength = 0;
|
|||
|
DWORD resultLength = 0;
|
|||
|
PBYTE presult;
|
|||
|
PBYTE pallocResult = NULL;
|
|||
|
BOOL boolData;
|
|||
|
DWORD dwordData;
|
|||
|
|
|||
|
|
|||
|
DNSDBG( TRACE, (
|
|||
|
"DnsQueryConfig()\n"
|
|||
|
"\tconfig = %d\n"
|
|||
|
"\tflag = %08x\n"
|
|||
|
"\tadapter = %S\n"
|
|||
|
"\tpBuffer = %p\n",
|
|||
|
ConfigId,
|
|||
|
Flag,
|
|||
|
pwsAdapterName,
|
|||
|
pBuffer
|
|||
|
));
|
|||
|
|
|||
|
//
|
|||
|
// check out param setup
|
|||
|
//
|
|||
|
|
|||
|
if ( !pBufferLength )
|
|||
|
{
|
|||
|
return ERROR_INVALID_PARAMETER;
|
|||
|
}
|
|||
|
if ( pBuffer )
|
|||
|
{
|
|||
|
bufLength = *pBufferLength;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// find specific configuration data requested
|
|||
|
//
|
|||
|
|
|||
|
switch( ConfigId )
|
|||
|
{
|
|||
|
|
|||
|
case DnsConfigPrimaryDomainName_W:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetPrimaryDomainName( DnsCharSetUnicode );
|
|||
|
goto WideString;
|
|||
|
|
|||
|
case DnsConfigPrimaryDomainName_A:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetPrimaryDomainName( DnsCharSetAnsi );
|
|||
|
goto NarrowString;
|
|||
|
|
|||
|
case DnsConfigPrimaryDomainName_UTF8:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetPrimaryDomainName( DnsCharSetUtf8 );
|
|||
|
goto NarrowString;
|
|||
|
|
|||
|
|
|||
|
case DnsConfigDnsServerList:
|
|||
|
|
|||
|
presult = (PBYTE) GetDnsServerList(
|
|||
|
TRUE // force registry read
|
|||
|
);
|
|||
|
if ( !presult )
|
|||
|
{
|
|||
|
status = GetLastError();
|
|||
|
if ( status == NO_ERROR )
|
|||
|
{
|
|||
|
DNS_ASSERT( FALSE );
|
|||
|
status = DNS_ERROR_NO_DNS_SERVERS;
|
|||
|
}
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
pallocResult = presult;
|
|||
|
resultLength = Dns_SizeofIpArray( (PIP_ARRAY)presult );
|
|||
|
goto Process;
|
|||
|
|
|||
|
|
|||
|
case DnsConfigPrimaryHostNameRegistrationEnabled:
|
|||
|
case DnsConfigAdapterHostNameRegistrationEnabled:
|
|||
|
case DnsConfigAddressRegistrationMaxCount:
|
|||
|
|
|||
|
goto Dword;
|
|||
|
|
|||
|
//case DnsConfigAdapterDomainName:
|
|||
|
//case DnsConfigAdapterInfo:
|
|||
|
//case DnsConfigSearchList:
|
|||
|
|
|||
|
case DnsConfigHostName_W:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetHostName( DnsCharSetUnicode );
|
|||
|
goto WideString;
|
|||
|
|
|||
|
case DnsConfigHostName_A:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetHostName( DnsCharSetAnsi );
|
|||
|
goto NarrowString;
|
|||
|
|
|||
|
case DnsConfigHostName_UTF8:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetHostName( DnsCharSetUtf8 );
|
|||
|
goto NarrowString;
|
|||
|
|
|||
|
case DnsConfigFullHostName_W:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetFullHostName( DnsCharSetUnicode );
|
|||
|
goto WideString;
|
|||
|
|
|||
|
case DnsConfigFullHostName_A:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetFullHostName( DnsCharSetAnsi );
|
|||
|
goto NarrowString;
|
|||
|
|
|||
|
case DnsConfigFullHostName_UTF8:
|
|||
|
|
|||
|
presult = (PBYTE) Reg_GetFullHostName( DnsCharSetUtf8 );
|
|||
|
goto NarrowString;
|
|||
|
|
|||
|
default:
|
|||
|
|
|||
|
return ERROR_INVALID_PARAMETER;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// setup return info for common types
|
|||
|
//
|
|||
|
// this just avoids code duplication above
|
|||
|
//
|
|||
|
|
|||
|
Dword:
|
|||
|
|
|||
|
status = LookupDwordConfigValue(
|
|||
|
& dwordData,
|
|||
|
ConfigId,
|
|||
|
pwsAdapterName );
|
|||
|
|
|||
|
if ( status != NO_ERROR )
|
|||
|
{
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
presult = (PBYTE) &dwordData;
|
|||
|
resultLength = sizeof(DWORD);
|
|||
|
goto Process;
|
|||
|
|
|||
|
|
|||
|
NarrowString:
|
|||
|
|
|||
|
if ( !presult )
|
|||
|
{
|
|||
|
status = DNS_ERROR_NO_MEMORY;
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
pallocResult = presult;
|
|||
|
resultLength = strlen( (PSTR)presult ) + 1;
|
|||
|
goto Process;
|
|||
|
|
|||
|
|
|||
|
WideString:
|
|||
|
|
|||
|
if ( !presult )
|
|||
|
{
|
|||
|
status = DNS_ERROR_NO_MEMORY;
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
pallocResult = presult;
|
|||
|
resultLength = (wcslen( (PWSTR)presult ) + 1) * sizeof(WCHAR);
|
|||
|
goto Process;
|
|||
|
|
|||
|
|
|||
|
Process:
|
|||
|
|
|||
|
//
|
|||
|
// return results -- three basic programs
|
|||
|
// - no buffer => only return length required
|
|||
|
// - allocate => return allocated result
|
|||
|
// - supplied buffer => copy result into buffer
|
|||
|
//
|
|||
|
// note, this section only handles simple flag datablobs to aVOID
|
|||
|
// duplicating code for specific config types above;
|
|||
|
// when we add config types that require nested pointers, they must
|
|||
|
// roll their own return-results code and jump to Done
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// no buffer
|
|||
|
// - no-op, length is set below
|
|||
|
|
|||
|
if ( !pBuffer )
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// allocated result
|
|||
|
// - return buffer gets ptr
|
|||
|
// - allocate copy of result if not allocated
|
|||
|
//
|
|||
|
|
|||
|
else if ( Flag & DNS_CONFIG_FLAG_ALLOC )
|
|||
|
{
|
|||
|
PBYTE pheap;
|
|||
|
|
|||
|
if ( bufLength < sizeof(PVOID) )
|
|||
|
{
|
|||
|
resultLength = sizeof(PVOID);
|
|||
|
status = ERROR_MORE_DATA;
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
|
|||
|
// create local alloc buffer
|
|||
|
|
|||
|
pheap = LocalAlloc( 0, resultLength );
|
|||
|
if ( !pheap )
|
|||
|
{
|
|||
|
status = DNS_ERROR_NO_MEMORY;
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
RtlCopyMemory(
|
|||
|
pheap,
|
|||
|
presult,
|
|||
|
resultLength );
|
|||
|
|
|||
|
// return ptr to allocated result
|
|||
|
|
|||
|
* (PVOID*) pBuffer = pheap;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// allocated result -- but dnsapi alloc
|
|||
|
//
|
|||
|
|
|||
|
else if ( Flag & DNS_CONFIG_FLAG_DNSAPI_ALLOC )
|
|||
|
{
|
|||
|
if ( bufLength < sizeof(PVOID) )
|
|||
|
{
|
|||
|
resultLength = sizeof(PVOID);
|
|||
|
status = ERROR_MORE_DATA;
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
|
|||
|
// if result not allocated, alloc and copy it
|
|||
|
|
|||
|
if ( ! pallocResult )
|
|||
|
{
|
|||
|
pallocResult = ALLOCATE_HEAP( resultLength );
|
|||
|
if ( !pallocResult )
|
|||
|
{
|
|||
|
status = DNS_ERROR_NO_MEMORY;
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
|
|||
|
RtlCopyMemory(
|
|||
|
pallocResult,
|
|||
|
presult,
|
|||
|
resultLength );
|
|||
|
}
|
|||
|
|
|||
|
// return ptr to allocated result
|
|||
|
|
|||
|
* (PVOID*) pBuffer = pallocResult;
|
|||
|
|
|||
|
// clear pallocResult, so not freed in generic cleanup
|
|||
|
|
|||
|
pallocResult = NULL;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// copy result to caller buffer
|
|||
|
//
|
|||
|
|
|||
|
else
|
|||
|
{
|
|||
|
if ( bufLength < resultLength )
|
|||
|
{
|
|||
|
status = ERROR_MORE_DATA;
|
|||
|
goto Done;
|
|||
|
}
|
|||
|
RtlCopyMemory(
|
|||
|
pBuffer,
|
|||
|
presult,
|
|||
|
resultLength );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Done:
|
|||
|
|
|||
|
//
|
|||
|
// set result length
|
|||
|
// cleanup any allocated (but not returned) data
|
|||
|
//
|
|||
|
|
|||
|
*pBufferLength = resultLength;
|
|||
|
|
|||
|
if ( pallocResult )
|
|||
|
{
|
|||
|
FREE_HEAP( pallocResult );
|
|||
|
}
|
|||
|
|
|||
|
return( status );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// System Public Configuration API
|
|||
|
//
|
|||
|
|
|||
|
PVOID
|
|||
|
WINAPI
|
|||
|
DnsQueryConfigAllocEx(
|
|||
|
IN DNS_CONFIG_TYPE ConfigId,
|
|||
|
IN PWSTR pwsAdapterName,
|
|||
|
IN BOOL fLocalAlloc
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Get DNS configuration info.
|
|||
|
|
|||
|
Allocate DNS configuration info.
|
|||
|
This is the cover API both handling the system public API
|
|||
|
DnsQueryConfigAlloc() below and the backward compatible
|
|||
|
macros for the old hostname and PDN alloc routines (see dnsapi.h)
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ConfigId -- type of config info desired
|
|||
|
|
|||
|
pAdapterName -- name of adapter; NULL if no specific adapter
|
|||
|
|
|||
|
fLocalAlloc -- allocate with LocalAlloc
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_SUCCESS -- if query successful
|
|||
|
ERROR_MORE_DATA -- if not enough space in buffer
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DNS_STATUS status = ERROR_SUCCESS;
|
|||
|
DWORD bufLength = sizeof(PVOID);
|
|||
|
PBYTE presult = NULL;
|
|||
|
|
|||
|
DNSDBG( TRACE, (
|
|||
|
"DnsQueryConfigAllocEx()\n"
|
|||
|
"\tconfig = %d\n"
|
|||
|
"\tadapter = %S\n"
|
|||
|
"\tflocal = %d\n",
|
|||
|
ConfigId,
|
|||
|
pwsAdapterName,
|
|||
|
fLocalAlloc
|
|||
|
));
|
|||
|
|
|||
|
//
|
|||
|
// SDK-public types
|
|||
|
//
|
|||
|
|
|||
|
if ( ConfigId < DnsConfigSystemBase )
|
|||
|
{
|
|||
|
//
|
|||
|
// DCR: could screen here for alloc types
|
|||
|
//
|
|||
|
// DnsConfigPrimaryDomainName_W:
|
|||
|
// DnsConfigPrimaryDomainName_A:
|
|||
|
// DnsConfigPrimaryDomainName_UTF8:
|
|||
|
// DnsConfigHostname_W:
|
|||
|
// DnsConfigHostname_A:
|
|||
|
// DnsConfigHostname_UTF8:
|
|||
|
// DnsConfigDnsServerList:
|
|||
|
//
|
|||
|
|
|||
|
status = DnsQueryConfig(
|
|||
|
ConfigId,
|
|||
|
fLocalAlloc
|
|||
|
? DNS_CONFIG_FLAG_LOCAL_ALLOC
|
|||
|
: DNS_CONFIG_FLAG_DNSAPI_ALLOC,
|
|||
|
pwsAdapterName,
|
|||
|
NULL, // reserved
|
|||
|
& presult,
|
|||
|
& bufLength );
|
|||
|
|
|||
|
if ( status != NO_ERROR )
|
|||
|
{
|
|||
|
SetLastError( status );
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
return presult;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// System public types
|
|||
|
//
|
|||
|
|
|||
|
if ( fLocalAlloc )
|
|||
|
{
|
|||
|
goto Invalid;
|
|||
|
}
|
|||
|
|
|||
|
switch ( ConfigId )
|
|||
|
{
|
|||
|
case DnsConfigNetworkInformation:
|
|||
|
|
|||
|
return GetNetworkInformation();
|
|||
|
|
|||
|
case DnsConfigSearchInformation:
|
|||
|
|
|||
|
return GetSearchInformation();
|
|||
|
|
|||
|
case DnsConfigNetInfo:
|
|||
|
|
|||
|
return NetInfo_Get(
|
|||
|
TRUE, // force
|
|||
|
TRUE // include IP addresses
|
|||
|
);
|
|||
|
|
|||
|
case DnsConfigIp4AddressArray:
|
|||
|
|
|||
|
return LocalIp_GetIp4Array();
|
|||
|
|
|||
|
// unknown falls through to invalid
|
|||
|
}
|
|||
|
|
|||
|
Invalid:
|
|||
|
|
|||
|
DNS_ASSERT( FALSE );
|
|||
|
SetLastError( ERROR_INVALID_PARAMETER );
|
|||
|
return( NULL );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// DWORD system-public config
|
|||
|
//
|
|||
|
|
|||
|
DWORD
|
|||
|
DnsQueryConfigDword(
|
|||
|
IN DNS_CONFIG_TYPE ConfigId,
|
|||
|
IN PWSTR pwsAdapter
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Get DNS DWORD configuration value.
|
|||
|
|
|||
|
This is system public routine.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ConfigId -- type of config info desired
|
|||
|
|
|||
|
pwsAdapter -- name of adapter; NULL if no specific adapter
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
DWORD config value.
|
|||
|
Zero if no such config.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DNS_STATUS status;
|
|||
|
DWORD value = 0;
|
|||
|
|
|||
|
DNSDBG( TRACE, (
|
|||
|
"DnsQueryConfigDword()\n"
|
|||
|
"\tconfig = %d\n"
|
|||
|
"\tadapter = %S\n",
|
|||
|
ConfigId,
|
|||
|
pwsAdapter
|
|||
|
));
|
|||
|
|
|||
|
status = LookupDwordConfigValue(
|
|||
|
& value,
|
|||
|
ConfigId,
|
|||
|
pwsAdapter );
|
|||
|
|
|||
|
#if DBG
|
|||
|
if ( status != NO_ERROR )
|
|||
|
{
|
|||
|
DNSDBG( ANY, (
|
|||
|
"LookupDwordConfigValue() failed for config lookup!\n"
|
|||
|
"\tstatus = %d\n"
|
|||
|
"\tConfigId = %d\n"
|
|||
|
"\tpwsAdapter = %S\n",
|
|||
|
status,
|
|||
|
ConfigId,
|
|||
|
pwsAdapter ));
|
|||
|
|
|||
|
DNS_ASSERT( status == NO_ERROR );
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
return( value );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DNS_STATUS
|
|||
|
DnsSetConfigDword(
|
|||
|
IN DNS_CONFIG_TYPE ConfigId,
|
|||
|
IN PWSTR pwsAdapter,
|
|||
|
IN DWORD NewValue
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Set DNS DWORD configuration value.
|
|||
|
|
|||
|
This is system public routine.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ConfigId -- type of config info desired
|
|||
|
|
|||
|
pwsAdapter -- name of adapter; NULL if no specific adapter
|
|||
|
|
|||
|
NewValue -- new value for parameter
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
DWORD config value.
|
|||
|
Zero if no such config.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PCONFIG_MAPPING pfig;
|
|||
|
|
|||
|
DNSDBG( TRACE, (
|
|||
|
"DnsSetConfigDword()\n"
|
|||
|
"\tconfig = %d\n"
|
|||
|
"\tadapter = %S\n"
|
|||
|
"\tvalue = %d (%08x)\n",
|
|||
|
ConfigId,
|
|||
|
pwsAdapter,
|
|||
|
NewValue, NewValue
|
|||
|
));
|
|||
|
|
|||
|
//
|
|||
|
// verify config is known and mapped
|
|||
|
//
|
|||
|
|
|||
|
pfig = GetConfigToRegistryMapping(
|
|||
|
ConfigId,
|
|||
|
pwsAdapter,
|
|||
|
TRUE // check adapter validity
|
|||
|
);
|
|||
|
if ( !pfig )
|
|||
|
{
|
|||
|
return ERROR_INVALID_PARAMETER;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// set in registry
|
|||
|
//
|
|||
|
|
|||
|
return Reg_SetDwordPropertyAndAlertCache(
|
|||
|
pwsAdapter, // adapter name key (if any)
|
|||
|
pfig->RegId,
|
|||
|
NewValue );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Config data free
|
|||
|
//
|
|||
|
|
|||
|
VOID
|
|||
|
WINAPI
|
|||
|
DnsFreeConfigStructure(
|
|||
|
IN OUT PVOID pData,
|
|||
|
IN DNS_CONFIG_TYPE ConfigId
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Free config data
|
|||
|
|
|||
|
This routine simply handles the mapping between config IDs
|
|||
|
and the free type.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pData -- data to free
|
|||
|
|
|||
|
ConfigId -- config id
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DNS_FREE_TYPE freeType = DnsFreeFlat;
|
|||
|
|
|||
|
DNSDBG( TRACE, (
|
|||
|
"DnsFreeConfigStructure( %p, %d )\n",
|
|||
|
pData,
|
|||
|
ConfigId ));
|
|||
|
|
|||
|
//
|
|||
|
// find any unflat config types
|
|||
|
//
|
|||
|
// note: currently all config types that are not flat
|
|||
|
// are system-public only and the config ID is also
|
|||
|
// the free type (for convenience); if we start
|
|||
|
// exposing some of these bringing them into the low
|
|||
|
// space, then this will change
|
|||
|
//
|
|||
|
// unfortunately these types can NOT be identical because
|
|||
|
// the space conflicts in shipped Win2K (FreeType==1 is
|
|||
|
// record list)
|
|||
|
//
|
|||
|
|
|||
|
if ( ConfigId > DnsConfigSystemBase &&
|
|||
|
( ConfigId == DnsConfigNetworkInformation ||
|
|||
|
ConfigId == DnsConfigSearchInformation ||
|
|||
|
ConfigId == DnsConfigAdapterInformation ||
|
|||
|
ConfigId == DnsConfigNetInfo ) )
|
|||
|
{
|
|||
|
freeType = (DNS_FREE_TYPE) ConfigId;
|
|||
|
}
|
|||
|
|
|||
|
DnsFree(
|
|||
|
pData,
|
|||
|
freeType );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// End config.c
|
|||
|
//
|