Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

804 lines
21 KiB

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <dnsapi.h>
BOOL
PrepareRecords(
IN LPWSTR lpDomainName,
OUT PDNS_RECORD * ppCurrentRecord1,
OUT PDNS_RECORD * ppCurrentRecord2,
OUT PDNS_RECORD * ppCurrentRecord3,
OUT PDNS_RECORD * ppNewRecord1,
OUT PDNS_RECORD * ppNewRecord2,
OUT PDNS_RECORD * ppNewRecord3,
OUT PDNS_RECORD * ppNewRecord4 );
_cdecl
main(int argc, char **argv)
{
WCHAR DomainName[] = L"glennc_test.ntdev.microsoft.com";
DWORD Status = NO_ERROR;
PDNS_RECORD pCurrentRecordSet = NULL;
PDNS_RECORD pNewRecordSet = NULL;
PDNS_RECORD pCurrentRecord1 = NULL;
PDNS_RECORD pCurrentRecord2 = NULL;
PDNS_RECORD pCurrentRecord3 = NULL;
PDNS_RECORD pNewRecord1 = NULL;
PDNS_RECORD pNewRecord2 = NULL;
PDNS_RECORD pNewRecord3 = NULL;
PDNS_RECORD pNewRecord4 = NULL;
HANDLE hContext = NULL;
DWORD dwFlags = 0;
Status = DnsAcquireContextHandle( 0, NULL, &hContext );
if ( Status )
{
printf( "DnsAcquireContextHandle call failed.\n" );
return(-1);
}
if ( !PrepareRecords( DomainName,
&pCurrentRecord1,
&pCurrentRecord2,
&pCurrentRecord3,
&pNewRecord1,
&pNewRecord2,
&pNewRecord3,
&pNewRecord4 ) )
{
printf( "PrepareRecords call failed.\n" );
return(-1);
}
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pCurrentRecordSet = pCurrentRecord1;
pCurrentRecord1->pNext = pCurrentRecord2;
pCurrentRecord2->pNext = pCurrentRecord3;
pCurrentRecord3->pNext = NULL;
//
// Test 1
//
// Current = 1, 2, 3
// New = 1, 2, 3
// Server = 1, 2, 3
//
//
// Preset server to have ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = pNewRecord3;
pNewRecord3->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2, 3\n" );
printf( " New = 1, 2, 3\n" );
printf( " Server = 1, 2, 3\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 2
//
// Current = 1, 2, 3
// New = 1, 2, 3, 4
// Server = 1, 2, 3
//
//
// Preset server to have ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3, 4.4.4.4 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = pNewRecord3;
pNewRecord3->pNext = pNewRecord4;
pNewRecord4->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2, 3\n" );
printf( " New = 1, 2, 3, 4\n" );
printf( " Server = 1, 2, 3\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 3
//
// Current = 1, 2, 3
// New = 1, 2
// Server = 1, 2, 3
//
//
// Preset server to have ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2, 3\n" );
printf( " New = 1, 2\n" );
printf( " Server = 1, 2, 3\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 4
//
// Current = 1, 2, 3
// New = 1, 2, 4
// Server = 1, 2, 3
//
//
// Preset server to have ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2, 4.4.4.4 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = pNewRecord4;
pNewRecord4->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2, 3\n" );
printf( " New = 1, 2, 4\n" );
printf( " Server = 1, 2, 3\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 5
//
// Current = 1, 2, 3
// New = 1, 2, 3, 4
// Server = 1, 2
//
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pCurrentRecordSet = pCurrentRecord1;
pCurrentRecord1->pNext = pCurrentRecord2;
pCurrentRecord2->pNext = NULL;
//
// Preset server to have ( 1.1.1.1, 2.2.2.2 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pCurrentRecord2->pNext = pCurrentRecord3;
pCurrentRecord3->pNext = NULL;
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3, 4.4.4.4 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = pNewRecord3;
pNewRecord3->pNext = pNewRecord4;
pNewRecord4->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2, 3\n" );
printf( " New = 1, 2, 3, 4\n" );
printf( " Server = 1, 2\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 6
//
// Current = 1, 2, 3
// New = 1, 2
// Server = 1, 2
//
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pCurrentRecordSet = pCurrentRecord1;
pCurrentRecord1->pNext = pCurrentRecord2;
pCurrentRecord2->pNext = NULL;
//
// Preset server to have ( 1.1.1.1, 2.2.2.2 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pCurrentRecord2->pNext = pCurrentRecord3;
pCurrentRecord3->pNext = NULL;
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2, 3\n" );
printf( " New = 1, 2\n" );
printf( " Server = 1, 2\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 7
//
// Current = 1, 2, 3
// New = 1, 2, 4
// Server = 1, 2
//
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pCurrentRecordSet = pCurrentRecord1;
pCurrentRecord1->pNext = pCurrentRecord2;
pCurrentRecord2->pNext = NULL;
//
// Preset server to have ( 1.1.1.1, 2.2.2.2 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pCurrentRecord2->pNext = pCurrentRecord3;
pCurrentRecord3->pNext = NULL;
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2, 4.4.4.4 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = pNewRecord4;
pNewRecord4->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2, 3\n" );
printf( " New = 1, 2, 4\n" );
printf( " Server = 1, 2\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 8
//
// Current = 1, 2
// New = 1, 2, 3
// Server = 1, 2, 3
//
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pCurrentRecordSet = pCurrentRecord1;
pCurrentRecord1->pNext = pCurrentRecord2;
pCurrentRecord2->pNext = pCurrentRecord3;
pCurrentRecord3->pNext = NULL;
//
// Preset server to have ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pCurrentRecord2->pNext = NULL;
//
// Set up pNewRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = pNewRecord3;
pNewRecord3->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2\n" );
printf( " New = 1, 2, 3\n" );
printf( " Server = 1, 2, 3\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
//
// Test 9
//
// Current = 1, 2
// New = 1
// Server = 1, 2, 3
//
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pCurrentRecordSet = pCurrentRecord1;
pCurrentRecord1->pNext = pCurrentRecord2;
pCurrentRecord2->pNext = pCurrentRecord3;
pCurrentRecord3->pNext = NULL;
//
// Preset server to have ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pCurrentRecord2->pNext = NULL;
//
// Set up pNewRecordSet ( 1.1.1.1 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2\n" );
printf( " New = 1\n" );
printf( " Server = 1, 2, 3\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status == DNS_ERROR_NOT_UNIQUE )
{
printf( "DnsModifyRecordSet call succeeded!\n" );
}
else
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Test 10
//
// Current = 1, 2
// New = 1, 3
// Server = 1, 2, 3
//
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
pCurrentRecordSet = pCurrentRecord1;
pCurrentRecord1->pNext = pCurrentRecord2;
pCurrentRecord2->pNext = pCurrentRecord3;
pCurrentRecord3->pNext = NULL;
//
// Preset server to have ( 1.1.1.1, 2.2.2.2, 3.3.3.3 )
//
Status = DnsReplaceRecordSet( hContext, pCurrentRecordSet, dwFlags, NULL );
if ( Status )
{
printf( "DnsReplaceRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
system( "pause" );
//
// Set up pCurrentRecordSet ( 1.1.1.1, 2.2.2.2 )
//
pCurrentRecord2->pNext = NULL;
//
// Set up pNewRecordSet ( 1.1.1.1, 3.3.3.3 )
//
pNewRecordSet = pNewRecord1;
pNewRecord1->pNext = pNewRecord2;
pNewRecord2->pNext = pNewRecord3;
pNewRecord3->pNext = NULL;
printf( "DnsModifyRecordSet( Current = 1, 2\n" );
printf( " New = 1, 3\n" );
printf( " Server = 1, 2, 3\n" );
printf( " dwFlags ); ...\n" );
Status = DnsModifyRecordSet( hContext,
pCurrentRecordSet,
pNewRecordSet,
dwFlags,
NULL );
if ( Status )
{
printf( "DnsModifyRecordSet call failed with error: 0x%.8X\n",
Status );
return(-1);
}
printf( "DnsModifyRecordSet call succeeded!\n" );
system( "pause" );
DnsReleaseContextHandle( hContext );
return(0);
}
BOOL
PrepareRecords(
IN LPWSTR lpDomainName,
OUT PDNS_RECORD * ppCurrentRecord1,
OUT PDNS_RECORD * ppCurrentRecord2,
OUT PDNS_RECORD * ppCurrentRecord3,
OUT PDNS_RECORD * ppNewRecord1,
OUT PDNS_RECORD * ppNewRecord2,
OUT PDNS_RECORD * ppNewRecord3,
OUT PDNS_RECORD * ppNewRecord4 )
{
*ppCurrentRecord1 = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if ( !*ppCurrentRecord1 )
{
return FALSE;
}
*ppCurrentRecord2 = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if ( !*ppCurrentRecord2 )
{
return FALSE;
}
*ppCurrentRecord3 = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if ( !*ppCurrentRecord3 )
{
return FALSE;
}
*ppNewRecord1 = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if ( !*ppNewRecord1 )
{
return FALSE;
}
*ppNewRecord2 = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if ( !*ppNewRecord2 )
{
return FALSE;
}
*ppNewRecord3 = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if ( !*ppNewRecord3 )
{
return FALSE;
}
*ppNewRecord4 = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if ( !*ppNewRecord4 )
{
return FALSE;
}
(*ppCurrentRecord1)->pNext = NULL;
(*ppCurrentRecord1)->nameOwner = (DNS_NAME) lpDomainName;
(*ppCurrentRecord1)->wType = DNS_TYPE_A;
(*ppCurrentRecord1)->wDataLength = sizeof( DNS_A_DATA );
// (*ppCurrentRecord1)->wReserved = 0;
// (*ppCurrentRecord1)->Flags.W = 0;
// (*ppCurrentRecord1)->dwTtl = 0;
(*ppCurrentRecord1)->Data.A.ipAddress = (IP_ADDRESS) 0x01010101; // 1.1.1.1
(*ppCurrentRecord2)->pNext = NULL;
(*ppCurrentRecord2)->nameOwner = (DNS_NAME) lpDomainName;
(*ppCurrentRecord2)->wType = DNS_TYPE_A;
(*ppCurrentRecord2)->wDataLength = sizeof( DNS_A_DATA );
// (*ppCurrentRecord2)->wReserved = 0;
// (*ppCurrentRecord2)->Flags.W = 0;
// (*ppCurrentRecord2)->dwTtl = 0;
(*ppCurrentRecord2)->Data.A.ipAddress = (IP_ADDRESS) 0x02020202; // 2.2.2.2
(*ppCurrentRecord3)->pNext = NULL;
(*ppCurrentRecord3)->nameOwner = (DNS_NAME) lpDomainName;
(*ppCurrentRecord3)->wType = DNS_TYPE_A;
(*ppCurrentRecord3)->wDataLength = sizeof( DNS_A_DATA );
// (*ppCurrentRecord3)->wReserved = 0;
// (*ppCurrentRecord3)->Flags.W = 0;
// (*ppCurrentRecord3)->dwTtl = 0;
(*ppCurrentRecord3)->Data.A.ipAddress = (IP_ADDRESS) 0x03030303; // 3.3.3.3
(*ppNewRecord1)->pNext = NULL;
(*ppNewRecord1)->nameOwner = (DNS_NAME) lpDomainName;
(*ppNewRecord1)->wType = DNS_TYPE_A;
(*ppNewRecord1)->wDataLength = sizeof( DNS_A_DATA );
// (*ppNewRecord1)->wReserved = 0;
// (*ppNewRecord1)->Flags.W = 0;
// (*ppNewRecord1)->dwTtl = 0;
(*ppNewRecord1)->Data.A.ipAddress = (IP_ADDRESS) 0x01010101; // 1.1.1.1
(*ppNewRecord2)->pNext = NULL;
(*ppNewRecord2)->nameOwner = (DNS_NAME) lpDomainName;
(*ppNewRecord2)->wType = DNS_TYPE_A;
(*ppNewRecord2)->wDataLength = sizeof( DNS_A_DATA );
// (*ppNewRecord2)->wReserved = 0;
// (*ppNewRecord2)->Flags.W = 0;
// (*ppNewRecord2)->dwTtl = 0;
(*ppNewRecord2)->Data.A.ipAddress = (IP_ADDRESS) 0x02020202; // 2.2.2.2
(*ppNewRecord3)->pNext = NULL;
(*ppNewRecord3)->nameOwner = (DNS_NAME) lpDomainName;
(*ppNewRecord3)->wType = DNS_TYPE_A;
(*ppNewRecord3)->wDataLength = sizeof( DNS_A_DATA );
// (*ppNewRecord3)->wReserved = 0;
// (*ppNewRecord3)->Flags.W = 0;
// (*ppNewRecord3)->dwTtl = 0;
(*ppNewRecord3)->Data.A.ipAddress = (IP_ADDRESS) 0x03030303; // 3.3.3.3
(*ppNewRecord4)->pNext = NULL;
(*ppNewRecord4)->nameOwner = (DNS_NAME) lpDomainName;
(*ppNewRecord4)->wType = DNS_TYPE_A;
(*ppNewRecord4)->wDataLength = sizeof( DNS_A_DATA );
// (*ppNewRecord4)->wReserved = 0;
// (*ppNewRecord4)->Flags.W = 0;
// (*ppNewRecord4)->dwTtl = 0;
(*ppNewRecord4)->Data.A.ipAddress = (IP_ADDRESS) 0x04040404; // 4.4.4.4
return TRUE;
}