|
|
/*++
Copyright (c) 2002-2002 Microsoft Corporation
Module Name:
netinfo.c
Abstract:
Domain Name System (DNS) API
Public DNS network info routines.
Author:
Jim Gilroy (jamesg) April 2002
Revision History:
--*/
#include "local.h"
//
// Private protos
//
PDNS_SEARCH_LIST DnsSearchList_CreateFromPrivate( IN PDNS_NETINFO pNetInfo, IN DNS_CHARSET CharSet );
//
// Character set for old DNS_NETWORK_INFORMATION
//
// DCR: netdiag should move to new routine and unicode
//
#define NICHARSET DnsCharSetUtf8
//
// Routines for the old public structures:
// DNS_NETWORK_INFORMATION
// DNS_SEARCH_INFORMATION
// DNS_ADAPTER_INFORMATION
//
//
// Adapter Information
//
VOID DnsAdapterInformation_Free( IN OUT PDNS_ADAPTER_INFORMATION pAdapter ) /*++
Routine Description:
Free public adapter info struct.
Arguments:
pAdapter -- adapter info to free
Return Value:
None
--*/ { if ( pAdapter ) { FREE_HEAP( pAdapter->pszAdapterGuidName ); FREE_HEAP( pAdapter->pszDomain ); FREE_HEAP( pAdapter->pIPAddresses ); FREE_HEAP( pAdapter->pIPSubnetMasks ); FREE_HEAP( pAdapter ); } }
PDNS_ADAPTER_INFORMATION DnsAdapterInformation_CreateFromPrivate( IN PDNS_ADAPTER pAdapter ) /*++
Routine Description:
Create public DNS adapter info.
Arguments:
pAdapter -- private adapter info.
Return Value:
None.
--*/ { PDNS_ADAPTER_INFORMATION pnew = NULL; PDNS_ADDR_ARRAY pserverArray; DWORD iter; DWORD count = 0; PWSTR pnameIn; PSTR pname; DWORD serverCount;
//
// validate and unpack
//
if ( ! pAdapter ) { return NULL; }
pserverArray = pAdapter->pDnsAddrs; serverCount = 0; if ( pserverArray ) { serverCount = pserverArray->AddrCount; }
//
// alloc
//
pnew = (PDNS_ADAPTER_INFORMATION) ALLOCATE_HEAP_ZERO( sizeof(DNS_ADAPTER_INFORMATION) - sizeof(DNS_SERVER_INFORMATION) + ( sizeof(DNS_SERVER_INFORMATION) * serverCount ) ); if ( !pnew ) { return NULL; }
//
// copy flags and names
//
pnew->InfoFlags = pAdapter->InfoFlags;
pnameIn = pAdapter->pszAdapterGuidName; if ( pnameIn ) { pname = Dns_NameCopyAllocate( (PSTR) pnameIn, 0, DnsCharSetUnicode, NICHARSET ); if ( !pname ) { goto Failed; } pnew->pszAdapterGuidName = pname; }
pnameIn = pAdapter->pszAdapterDomain; if ( pnameIn ) { pname = Dns_NameCopyAllocate( (PSTR) pnameIn, 0, DnsCharSetUnicode, NICHARSET ); if ( !pname ) { goto Failed; } pnew->pszDomain = pname; }
// address info
pnew->pIPAddresses = DnsAddrArray_CreateIp4Array( pAdapter->pLocalAddrs ); pnew->pIPSubnetMasks = NULL;
//
// server info
//
for ( iter=0; iter < serverCount; iter++ ) { PDNS_ADDR pserver = &pserverArray->AddrArray[iter];
if ( DnsAddr_IsIp4( pserver ) ) { pnew->aipServers[iter].ipAddress = DnsAddr_GetIp4( pserver ); pnew->aipServers[iter].Priority = pserver->Priority; count++; } }
pnew->cServerCount = count;
return pnew;
Failed:
DnsAdapterInformation_Free( pnew ); return NULL; }
//
// Search List
//
VOID DnsSearchInformation_Free( IN PDNS_SEARCH_INFORMATION pSearchInfo ) /*++
Routine Description:
Free public search list struct.
Arguments:
pSearchInfo -- search list to free
Return Value:
None
--*/ { DWORD iter;
if ( pSearchInfo ) { FREE_HEAP( pSearchInfo->pszPrimaryDomainName );
for ( iter=0; iter < pSearchInfo->cNameCount; iter++ ) { FREE_HEAP( pSearchInfo->aSearchListNames[iter] ); } FREE_HEAP( pSearchInfo ); } }
#if 0
PDNS_SEARCH_INFORMATION DnsSearchInformation_CreateFromPrivate( IN PSEARCH_LIST pSearchList ) /*++
Routine Description:
Create public search list from private.
Arguments:
pSearchList -- private search list
Return Value:
Ptr to new search list, if successful. NULL on error.
--*/ { PDNS_SEARCH_INFORMATION pnew; DWORD iter; DWORD nameCount; PWSTR pname; PSTR pnewName;
if ( !pSearchList ) { return NULL; } nameCount = pSearchList->NameCount;
//
// alloc
//
pnew = (PDNS_SEARCH_INFORMATION) ALLOCATE_HEAP_ZERO( sizeof( DNS_SEARCH_INFORMATION ) - sizeof(PSTR) + ( sizeof(PSTR) * nameCount ) ); if ( !pnew ) { return NULL; }
//
// copy name
//
pname = pSearchList->pszDomainOrZoneName; if ( pname ) { pnewName = Dns_NameCopyAllocate( (PSTR) pname, 0, DnsCharSetUnicode, NICHARSET ); if ( !pnewName ) { goto Failed; } pnew->pszPrimaryDomainName = pnewName; }
//
// copy search names
//
for ( iter=0; iter < nameCount; iter++ ) { pname = pSearchList->SearchNameArray[iter].pszName;
if ( pname ) { pnewName = Dns_NameCopyAllocate( (PSTR) pname, 0, DnsCharSetUnicode, NICHARSET ); if ( !pnewName ) { goto Failed; } pnew->aSearchListNames[iter] = pnewName; pnew->cNameCount++; } }
return pnew;
Failed:
DnsSearchInformation_Free( pnew ); return NULL; } #endif
PDNS_SEARCH_INFORMATION DnsSearchInformation_CreateFromPrivate( IN PDNS_NETINFO pNetInfo ) /*++
Routine Description:
Create public search list from private.
Arguments:
pNetInfo -- private netinfo
Return Value:
Ptr to new search list, if successful. NULL on error.
--*/ { //
// call new function -- specifying ANSI char set
//
// DCR: note this assumes mapping with DNS_SEARCH_LIST
// note UTF8 -- so this only relevant to netdiag and ipconfig
//
return (PDNS_SEARCH_INFORMATION) DnsSearchList_CreateFromPrivate( pNetInfo, NICHARSET ); }
PDNS_SEARCH_INFORMATION DnsSearchInformation_Get( VOID ) /*++
Routine Description:
Get search list info.
Arguments:
None
Return Value:
Ptr to search list. NULL on error.
--*/ { PDNS_NETINFO pnetInfo = GetNetworkInfo(); PDNS_SEARCH_INFORMATION pnew;
DNSDBG( TRACE, ( "DnsSearchInformation_Get()\n" ));
if ( !pnetInfo ) { return NULL; }
pnew = DnsSearchInformation_CreateFromPrivate( pnetInfo );
NetInfo_Free( pnetInfo );
return pnew; }
//
// Network Information
//
VOID DnsNetworkInformation_Free( IN OUT PDNS_NETWORK_INFORMATION pNetInfo ) /*++
Routine Description:
Free network info blob.
Arguments:
pNetInfo -- blob to free
Return Value:
None
--*/ { DWORD iter;
DNSDBG( TRACE, ( "DnsNetworkInformation_Free()\n" ));
if ( pNetInfo ) { DnsSearchInformation_Free( pNetInfo->pSearchInformation );
for ( iter = 0; iter < pNetInfo->cAdapterCount; iter++ ) { DnsAdapterInformation_Free( pNetInfo->aAdapterInfoList[iter] ); }
FREE_HEAP( pNetInfo ); } }
PDNS_NETWORK_INFORMATION DnsNetworkInformation_CreateFromPrivate( IN PDNS_NETINFO pNetInfo, IN BOOL fSearchList ) /*++
Routine Description:
Create public DNS_NETWORK_INFORMATION from private DNS_NETINFO.
Arguments:
pNetInfo -- private blob
fSearchList -- TRUE to force search list; FALSE otherwise
Return Value:
Ptr to new network info, if successful. Null on error -- allocation failure.
--*/ { PDNS_NETWORK_INFORMATION pnew = NULL; PSEARCH_LIST psearchList; DWORD iter;
DNSDBG( TRACE, ( "DnsNetworkInformation_CreateFromPrivate()\n" ));
if ( !pNetInfo ) { return NULL; }
//
// alloc
//
pnew = (PDNS_NETWORK_INFORMATION) ALLOCATE_HEAP_ZERO( sizeof( DNS_NETWORK_INFORMATION) - sizeof( PDNS_ADAPTER_INFORMATION) + ( sizeof(PDNS_ADAPTER_INFORMATION) * pNetInfo->AdapterCount ) ); if ( !pnew ) { goto Failed; }
//
// no search list if neither name or count
//
if ( fSearchList ) { PDNS_SEARCH_INFORMATION psearch;
psearch = DnsSearchInformation_CreateFromPrivate( pNetInfo ); if ( !psearch ) { goto Failed; } pnew->pSearchInformation = psearch; }
//
// copy adapter blobs
//
for ( iter = 0; iter < pNetInfo->AdapterCount; iter++ ) { PDNS_ADAPTER_INFORMATION padapter;
padapter = DnsAdapterInformation_CreateFromPrivate( & pNetInfo->AdapterArray[iter] ); if ( !padapter ) { goto Failed; } pnew->aAdapterInfoList[iter] = padapter; pnew->cAdapterCount++; } return pnew;
Failed:
DnsNetworkInformation_Free( pnew ); return NULL; }
PDNS_NETWORK_INFORMATION DnsNetworkInformation_Get( VOID ) /*++
Routine Description:
Get DNS network info.
Arguments:
None.
Return Value:
Ptr to DNS network info, if successful. NULL on error.
--*/ { PDNS_NETWORK_INFORMATION pnew = NULL; PDNS_NETINFO pnetInfo;
DNSDBG( TRACE, ( "DnsNetworkInformation_Get()\n" ));
// grab current network info
pnetInfo = GetNetworkInfo(); if ( !pnetInfo ) { return NULL; }
// copy to public structure
pnew = DnsNetworkInformation_CreateFromPrivate( pnetInfo, TRUE // include search list
);
NetInfo_Free( pnetInfo ); return pnew; }
//
// Netdiag public network info routines
//
DNS_STATUS DnsNetworkInformation_CreateFromFAZ( IN PCSTR pszName, IN DWORD dwFlags, IN PIP4_ARRAY pIp4Servers, OUT PDNS_NETWORK_INFORMATION * ppNetworkInformation ) /*++
Routine Description:
Get network info blob result from FAZ
EXPORTED function. (Used in netdiag.exe)
Arguments:
Return Value:
--*/ { PDNS_NETWORK_INFORMATION pnew = NULL; PDNS_ADDR_ARRAY parray = NULL; PDNS_NETINFO pnetInfo = NULL; PWSTR pname = NULL; DNS_STATUS status;
DNSDBG( TRACE, ( "DnsNetworkInformation_CreateFromFAZ()\n" "\tpszName = %s\n" "\tFlags = %08x\n" "\tpIp4Servers = %p\n" "\tppResults = %p\n", pszName, dwFlags, pIp4Servers, ppNetworkInformation ));
// convert to DNS_ADDR_ARRAY
if ( pIp4Servers ) { parray = DnsAddrArray_CreateFromIp4Array( pIp4Servers ); if ( !parray ) { status = DNS_ERROR_NO_MEMORY; goto Done; } }
// convert name to unicode
// DCR: remove when netdiag unicode
pname = Dns_StringCopyAllocate( (PCHAR) pszName, 0, // null terminated
NICHARSET, DnsCharSetUnicode ); // FAZ
status = Faz_Private( (PWSTR) pname, dwFlags, parray, & pnetInfo );
if ( status != ERROR_SUCCESS ) { goto Done; }
// convert FAZ results to DNS_NETWORK_INFORMATION
pnew = DnsNetworkInformation_CreateFromPrivate( pnetInfo, TRUE // include search list
); if ( !pnew ) { status = DNS_ERROR_NO_MEMORY; } else if ( !pnew->pSearchInformation || !pnew->pSearchInformation->pszPrimaryDomainName || pnew->cAdapterCount != 1 || !pnew->aAdapterInfoList[0] ) { DNS_ASSERT( FALSE ); DnsNetworkInformation_Free( pnew ); pnew = NULL; status = DNS_ERROR_NO_MEMORY; }
Done:
*ppNetworkInformation = pnew;
NetInfo_Free( pnetInfo ); DnsAddrArray_Free( parray ); Dns_Free( pname );
DNSDBG( TRACE, ( "Leave DnsNetworkInformation_CreateFromFAZ()\n" "\tstatus = %d\n" "\tpNetInfo = %p\n", status, pnew )); return status; }
//
// Routines for the new public structures:
// DNS_SEARCH_LIST
// DNS_NETWORK_INFO
// DNS_ADAPTER_INFO
//
//
// Adapter Info
//
VOID DnsAdapterInfo_Free( IN OUT PDNS_ADAPTER_INFO pAdapter, IN BOOL fFreeAdapter ) /*++
Routine Description:
Free public adapter info struct.
Arguments:
pAdapter -- adapter info to free
Return Value:
None
--*/ { if ( pAdapter ) { FREE_HEAP( pAdapter->pszAdapterGuidName ); FREE_HEAP( pAdapter->pszAdapterDomain ); DnsAddrArray_Free( pAdapter->pIpAddrs ); DnsAddrArray_Free( pAdapter->pDnsAddrs );
if ( fFreeAdapter ) { FREE_HEAP( pAdapter ); } else { RtlZeroMemory( pAdapter, sizeof(*pAdapter) ); } } }
BOOL DnsAdapterInfo_CopyFromPrivate( IN PDNS_ADAPTER_INFO pCopy, IN PDNS_ADAPTER pAdapter, IN DNS_CHARSET CharSet ) /*++
Routine Description:
Create public DNS adapter info.
Arguments:
pAdapter -- private adapter info.
CharSet -- desired char set
Return Value:
None.
--*/ { DWORD iter; DWORD count = 0; PWSTR pnameIn; PWSTR pname; DWORD serverCount; PDNS_ADDR_ARRAY parray;
//
// validate and clear
//
if ( !pAdapter || !pCopy ) { return FALSE; }
RtlZeroMemory( pCopy, sizeof( *pCopy ) );
//
// copy flags and names
//
pCopy->Flags = pAdapter->InfoFlags;
pnameIn = pAdapter->pszAdapterGuidName; if ( pnameIn ) { pname = (PWSTR) Dns_NameCopyAllocate( (PSTR) pnameIn, 0, DnsCharSetUnicode, CharSet ); if ( !pname ) { goto Failed; } pCopy->pszAdapterGuidName = pname; }
pnameIn = pAdapter->pszAdapterDomain; if ( pnameIn ) { pname = (PWSTR) Dns_NameCopyAllocate( (PSTR) pnameIn, 0, DnsCharSetUnicode, CharSet ); if ( !pname ) { goto Failed; } pCopy->pszAdapterDomain = pname; }
//
// address info
//
parray = DnsAddrArray_CreateCopy( pAdapter->pLocalAddrs ); if ( !parray && pAdapter->pLocalAddrs ) { goto Failed; } pCopy->pIpAddrs = parray;
//
// server info
//
parray = DnsAddrArray_CreateCopy( pAdapter->pDnsAddrs ); if ( !parray && pAdapter->pDnsAddrs ) { goto Failed; } pCopy->pDnsAddrs = parray;
return TRUE;
Failed:
DnsAdapterInfo_Free( pCopy, FALSE // don't free struct
); return FALSE; }
PDNS_ADAPTER_INFO DnsAdapterInfo_CreateFromPrivate( IN PDNS_ADAPTER pAdapter, IN DNS_CHARSET CharSet ) /*++
Routine Description:
Create public DNS adapter info.
Arguments:
pAdapter -- private adapter info.
CharSet -- desired char set
Return Value:
None.
--*/ { PDNS_ADAPTER_INFO pnew = NULL;
//
// validate and unpack
//
if ( ! pAdapter ) { return NULL; }
//
// alloc
//
pnew = (PDNS_ADAPTER_INFO) ALLOCATE_HEAP_ZERO( sizeof(DNS_ADAPTER_INFO) ); if ( !pnew ) { return NULL; }
//
// copy adapter info
//
if ( !DnsAdapterInfo_CopyFromPrivate( pnew, pAdapter, CharSet ) ) { goto Failed; }
return pnew;
Failed:
DnsAdapterInfo_Free( pnew, TRUE ); return NULL; }
//
// Search List
//
VOID DnsSearchList_Free( IN PDNS_SEARCH_LIST pSearchList ) /*++
Routine Description:
Free public search list struct.
Arguments:
pSearchList -- search list to free
Return Value:
None
--*/ { DWORD iter;
if ( pSearchList ) { FREE_HEAP( pSearchList->pszPrimaryDomainName );
for ( iter=0; iter < pSearchList->NameCount; iter++ ) { FREE_HEAP( pSearchList->SearchNameArray[iter] ); } FREE_HEAP( pSearchList ); } }
BOOL dnsSearchList_AddName( IN OUT PDNS_SEARCH_LIST pSearchList, IN DWORD MaxCount, IN PWSTR pName, IN DNS_CHARSET CharSet, IN BOOL fDupCheck ) /*++
Routine Description:
Add name to search list.
Private util for building search list.
Arguments:
pSearchList -- new search list
MaxCount -- OPTIONAL count of max entries in list; if zero assume adequate space
pName -- name to add
CharSet -- desired char set
fDupCheck -- check if duplicate
Return Value:
TRUE if successful or space constraint. FALSE only on allocation failure. NULL on error.
--*/ { PWSTR pnewName; DWORD nameCount;
//
// validity test
//
// note, failing ONLY on memory allocation failure
// as that's the ONLY failure that results in failed build
//
nameCount = pSearchList->NameCount;
if ( !pName || ( MaxCount!=0 && MaxCount<=nameCount ) ) { return TRUE; }
//
// copy into desired char set
// - then place in search list
//
pnewName = Dns_NameCopyAllocate( (PSTR) pName, 0, DnsCharSetUnicode, CharSet ); if ( !pnewName ) { return FALSE; }
//
// duplicate check
//
if ( fDupCheck ) { DWORD iter;
for ( iter=0; iter < nameCount; iter++ ) { if ( Dns_NameComparePrivate( (PCSTR) pnewName, (PCSTR) pSearchList->SearchNameArray[iter], CharSet ) ) { FREE_HEAP( pnewName ); return TRUE; } } }
//
// put new name in list
//
pSearchList->SearchNameArray[nameCount] = pnewName; pSearchList->NameCount = ++nameCount;
return TRUE; }
PDNS_SEARCH_LIST DnsSearchList_CreateFromPrivate( IN PDNS_NETINFO pNetInfo, IN DNS_CHARSET CharSet ) /*++
Routine Description:
Create public search list from private.
Arguments:
pSearchList -- private search list
CharSet -- desired char set
Return Value:
Ptr to new search list, if successful. NULL on error.
--*/ { PDNS_SEARCH_LIST pnew = NULL; DWORD iter; DWORD nameCount; PWSTR pname; PWSTR pdn = pNetInfo->pszDomainName; PSEARCH_LIST psearch = NULL;
DNSDBG( TRACE, ( "DnsSearchList_CreateFromPrivate( %p, %d )\n", pNetInfo, CharSet ));
//
// count names
// - real search list -- done
// - dummy list -- must add in adapter names
//
nameCount = MAX_SEARCH_LIST_ENTRIES;
if ( !(pNetInfo->InfoFlags & NINFO_FLAG_DUMMY_SEARCH_LIST) && (psearch = pNetInfo->pSearchList) ) { nameCount = psearch->NameCount; }
//
// alloc
//
pnew = (PDNS_SEARCH_LIST) ALLOCATE_HEAP_ZERO( sizeof( DNS_SEARCH_LIST ) - sizeof(PSTR) + ( sizeof(PSTR) * nameCount ) ); if ( !pnew ) { return NULL; }
//
// copy existing search list
//
if ( psearch ) { #if 0
// primary\zone name
// note: this is used only for update netinfo
// only current public customer is netdiag.exe
pname = psearch->pszDomainName; if ( pname ) { pnewName = Dns_NameCopyAllocate( (PSTR) pName, 0, DnsCharSetUnicode, CharSet ); if ( !pnewName ) { goto Failed; } pnew->pszPrimaryDomainName = pnewName; } #endif
for ( iter=0; iter < nameCount; iter++ ) { if ( !dnsSearchList_AddName( pnew, 0, // adequate space
psearch->SearchNameArray[iter].pszName, CharSet, FALSE // no duplicate check
) ) { goto Failed; } } }
//
// otherwise build search list
//
else { PDNS_ADAPTER padapter;
//
// use PDN in first search list slot
//
if ( pdn ) { if ( !dnsSearchList_AddName( pnew, 0, // adequate space
pdn, CharSet, FALSE // no duplicate check
) ) { goto Failed; } }
//
// add adapter domain names
//
// note: currently presence of adapter name signals it's
// use in queries
//
NetInfo_AdapterLoopStart( pNetInfo );
while ( padapter = NetInfo_GetNextAdapter( pNetInfo ) ) { pname = padapter->pszAdapterDomain; if ( pname ) { if ( !dnsSearchList_AddName( pnew, nameCount, pname, CharSet, TRUE // duplicate check
) ) { goto Failed; } } }
//
// add devolved primary name
// - must have following label
// do NOT include TLDs in search list
//
if ( pdn && g_UseNameDevolution ) { PWSTR pnext;
pname = Dns_GetDomainNameW( pdn );
while ( pname && (pnext = Dns_GetDomainNameW(pname)) ) { if ( !dnsSearchList_AddName( pnew, nameCount, pname, CharSet, FALSE // no duplicate check
) ) { goto Failed; } pname = pnext; } } }
//
// copy PDN
//
// currently required
// - netdiag references it (as zone for update check)
// - ipconfig may use it, not sure
//
if ( pdn ) { pname = Dns_NameCopyAllocate( (PSTR) pdn, 0, DnsCharSetUnicode, CharSet ); if ( !pname ) { goto Failed; } pnew->pszPrimaryDomainName = pname; }
return pnew;
Failed:
DnsSearchList_Free( pnew ); return NULL; }
PDNS_SEARCH_LIST DnsSearchList_Get( IN DNS_CHARSET CharSet ) /*++
Routine Description:
Get search list info.
Arguments:
CharSet -- desired char set
Return Value:
Ptr to search list. NULL on error.
--*/ { PDNS_NETINFO pnetInfo = GetNetworkInfo(); PDNS_SEARCH_LIST pnew;
if ( !pnetInfo ) { return NULL; }
pnew = DnsSearchList_CreateFromPrivate( pnetInfo, CharSet );
NetInfo_Free( pnetInfo );
return pnew; }
//
// Network Info
//
VOID DnsNetworkInfo_Free( IN OUT PDNS_NETWORK_INFO pNetInfo ) /*++
Routine Description:
Free network info blob.
Arguments:
pNetInfo -- blob to free
Return Value:
None
--*/ { DWORD iter;
if ( pNetInfo ) { DnsSearchList_Free( pNetInfo->pSearchList ); FREE_HEAP( pNetInfo->pszPrimaryDomainName ); FREE_HEAP( pNetInfo->pszHostName );
for ( iter = 0; iter < pNetInfo->AdapterCount; iter++ ) { DnsAdapterInfo_Free( & pNetInfo->AdapterArray[iter], FALSE // don't free structure
); } FREE_HEAP( pNetInfo ); } }
PDNS_NETWORK_INFO DnsNetworkInfo_CreateFromPrivate( IN PDNS_NETINFO pNetInfo, IN DNS_CHARSET CharSet, IN BOOL fSearchList ) /*++
Routine Description:
Create public DNS_NETWORK_INFO from private DNS_NETINFO.
Arguments:
pNetInfo -- private blob
CharSet -- char set of results
fSearchList -- TRUE to include search list; FALSE otherwise
Return Value:
Ptr to new network info, if successful. Null on error -- allocation failure.
--*/ { PDNS_NETWORK_INFO pnew = NULL; PSEARCH_LIST psearchList; DWORD iter; PSTR pnewName; PWSTR pname;
if ( !pNetInfo ) { return NULL; }
//
// alloc
//
pnew = (PDNS_NETWORK_INFO) ALLOCATE_HEAP_ZERO( sizeof( DNS_NETWORK_INFO ) - sizeof( DNS_ADAPTER_INFO ) + ( sizeof(DNS_ADAPTER_INFO) * pNetInfo->AdapterCount ) ); if ( !pnew ) { goto Failed; }
//
// hostname and PDN
//
pname = pNetInfo->pszHostName; if ( pname ) { pnewName = Dns_NameCopyAllocate( (PSTR) pname, 0, DnsCharSetUnicode, CharSet ); if ( !pnewName ) { goto Failed; } pnew->pszHostName = (PWSTR) pnewName; }
pname = pNetInfo->pszDomainName; if ( pname ) { pnewName = Dns_NameCopyAllocate( (PSTR) pname, 0, DnsCharSetUnicode, CharSet ); if ( !pnewName ) { goto Failed; } pnew->pszPrimaryDomainName = (PWSTR) pnewName; }
//
// search list
//
if ( fSearchList ) { PDNS_SEARCH_LIST psearch;
psearch = DnsSearchList_CreateFromPrivate( pNetInfo, CharSet ); if ( !psearch ) { goto Failed; } pnew->pSearchList = psearch; }
//
// copy adapter blobs
//
for ( iter = 0; iter < pNetInfo->AdapterCount; iter++ ) { if ( ! DnsAdapterInfo_CopyFromPrivate( & pnew->AdapterArray[iter], & pNetInfo->AdapterArray[iter], CharSet ) ) { goto Failed; } pnew->AdapterCount++; } return pnew;
Failed:
DnsNetworkInfo_Free( pnew ); return NULL; }
PDNS_NETWORK_INFO DnsNetworkInfo_Get( IN DNS_CHARSET CharSet ) /*++
Routine Description:
Get DNS network info.
Arguments:
None.
Return Value:
Ptr to DNS network info, if successful. NULL on error.
--*/ { PDNS_NETWORK_INFO pnew = NULL; PDNS_NETINFO pnetInfo;
// grab current network info
pnetInfo = GetNetworkInfo(); if ( !pnetInfo ) { return NULL; }
// copy to public structure
pnew = DnsNetworkInfo_CreateFromPrivate( pnetInfo, CharSet, TRUE // include search list
);
NetInfo_Free( pnetInfo ); return pnew; }
//
// Netdiag public network info routines
//
#if 1
//
// This routine can be brought in when netdiag can be brought
// onto new structures.
// Currently netdiag uses the old structure DNS_NETWORK_INFORMATION
// and uses the routine above.
//
DNS_STATUS DnsNetworkInfo_CreateFromFAZ( //IN PCWSTR pszName,
IN PCSTR pszName, IN DWORD dwFlags, IN PIP4_ARRAY pIp4Servers, IN DNS_CHARSET CharSet, OUT PDNS_NETWORK_INFOA * ppNetworkInfo ) /*++
Routine Description:
Get network info blob result from FAZ
EXPORTED function. (Used in netdiag.exe)
Arguments:
Return Value:
--*/ { DNS_STATUS status; PDNS_ADDR_ARRAY parray = NULL; PDNS_NETINFO pnetInfo = NULL; PDNS_NETWORK_INFO pnew = NULL; PWSTR pname = NULL; PWSTR pnameAlloc = NULL;
DNSDBG( TRACE, ( "DnsNetworkInfo_CreateFromFAZ( %s )\n", pszName ));
// convert to DNS_ADDR_ARRAY
if ( pIp4Servers ) { parray = DnsAddrArray_CreateFromIp4Array( pIp4Servers ); if ( !parray ) { status = DNS_ERROR_NO_MEMORY; goto Done; } }
// convert name to unicode
// DCR: remove when netdiag unicode
pname = (PWSTR) pszName;
if ( CharSet != DnsCharSetUnicode ) { pname = Dns_StringCopyAllocate( (PCHAR) pszName, 0, // null terminated
CharSet, DnsCharSetUnicode ); pnameAlloc = pname; }
// FAZ
status = Faz_Private( (PWSTR) pname, dwFlags, parray, & pnetInfo );
if ( status != ERROR_SUCCESS ) { goto Done; }
// convert FAZ results to DNS_NETWORK_INFO
pnew = DnsNetworkInfo_CreateFromPrivate( pnetInfo, CharSet, FALSE // no search list built
); if ( !pnew ) { status = DNS_ERROR_NO_MEMORY; } else if ( !pnew->pszPrimaryDomainName || pnew->AdapterCount != 1 || !pnew->AdapterArray[0].pszAdapterDomain ) { DNS_ASSERT( FALSE ); DnsNetworkInfo_Free( pnew ); pnew = NULL; status = DNS_ERROR_NO_MEMORY; }
Done:
// DCR: remove cast once netdiag is in unicode
*ppNetworkInfo = (PDNS_NETWORK_INFOA) pnew;
NetInfo_Free( pnetInfo ); DnsAddrArray_Free( parray ); Dns_Free( pnameAlloc );
return status; } #endif
//
// End netpub.c
//
|