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.
486 lines
12 KiB
486 lines
12 KiB
#define NL_MAX_DNS_LABEL_LENGTH 63
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <ntddbrow.h>
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <lmcons.h>
|
|
#include <winsock2.h>
|
|
#include <nlsite.h>
|
|
#include <dsgetdc.h>
|
|
#include <nlcommon.h>
|
|
|
|
#define MAX_PRINTF_LEN 1024 // Arbitrary.
|
|
VOID
|
|
NlPrintRoutine(
|
|
IN DWORD DebugFlag,
|
|
IN LPSTR Format,
|
|
...
|
|
)
|
|
{
|
|
va_list arglist;
|
|
char OutputBuffer[MAX_PRINTF_LEN];
|
|
|
|
//
|
|
// Put a the information requested by the caller onto the line
|
|
//
|
|
|
|
va_start(arglist, Format);
|
|
(VOID) vsprintf(OutputBuffer, Format, arglist);
|
|
va_end(arglist);
|
|
|
|
printf( "%s", OutputBuffer );
|
|
return;
|
|
UNREFERENCED_PARAMETER( DebugFlag );
|
|
}
|
|
|
|
VOID
|
|
NlAssertFailed(
|
|
IN PVOID FailedAssertion,
|
|
IN PVOID FileName,
|
|
IN ULONG LineNumber,
|
|
IN PCHAR Message OPTIONAL
|
|
)
|
|
{
|
|
printf( "\n*** Assertion failed: %s%s\n*** Source File: %s, line %ld\n\n",
|
|
Message ? Message : "",
|
|
FailedAssertion,
|
|
FileName,
|
|
LineNumber
|
|
);
|
|
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
NlBrowserSendDatagram(
|
|
IN PVOID ContextDomainInfo,
|
|
IN ULONG IpAddress,
|
|
IN LPWSTR UnicodeDestinationName,
|
|
IN DGRECEIVER_NAME_TYPE NameType,
|
|
IN LPWSTR TransportName,
|
|
IN LPSTR OemMailslotName,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Send the specified mailslot message to the specified mailslot on the
|
|
specified server on the specified transport..
|
|
|
|
Arguments:
|
|
|
|
DomainInfo - Hosted domain sending the datagram
|
|
|
|
IpAddress - IpAddress of the machine to send the pind to.
|
|
If zero, UnicodeDestinationName must be specified.
|
|
|
|
UnicodeDestinationName -- Name of the server to send to.
|
|
|
|
NameType -- Type of name represented by UnicodeDestinationName.
|
|
|
|
TransportName -- Name of the transport to send on.
|
|
Use NULL to send on all transports.
|
|
|
|
OemMailslotName -- Name of the mailslot to send to.
|
|
|
|
Buffer -- Specifies a pointer to the mailslot message to send.
|
|
|
|
BufferSize -- Size in bytes of the mailslot message
|
|
|
|
Return Value:
|
|
|
|
Status of the operation.
|
|
|
|
--*/
|
|
{
|
|
return STATUS_INTERNAL_ERROR;
|
|
// If this routine is ever needed, copy it from logonsrv\client\getdcnam.c
|
|
|
|
UNREFERENCED_PARAMETER(ContextDomainInfo);
|
|
UNREFERENCED_PARAMETER(IpAddress);
|
|
UNREFERENCED_PARAMETER(UnicodeDestinationName);
|
|
UNREFERENCED_PARAMETER(NameType);
|
|
UNREFERENCED_PARAMETER(TransportName);
|
|
UNREFERENCED_PARAMETER(OemMailslotName);
|
|
UNREFERENCED_PARAMETER(Buffer);
|
|
UNREFERENCED_PARAMETER(BufferSize);
|
|
}
|
|
|
|
NET_API_STATUS
|
|
NlGetLocalPingResponse(
|
|
IN LPCWSTR NetbiosDomainName OPTIONAL,
|
|
IN LPCWSTR DnsDomainName OPTIONAL,
|
|
IN GUID *DomainGuid OPTIONAL,
|
|
IN PSID DomainSid OPTIONAL,
|
|
IN BOOL PdcOnly,
|
|
IN LPCWSTR UnicodeComputerName,
|
|
IN LPCWSTR UnicodeUserName OPTIONAL,
|
|
IN ULONG AllowableAccountControlBits,
|
|
IN ULONG NtVersion,
|
|
IN ULONG NtVersionFlags,
|
|
OUT PSOCKET_ADDRESS *ResponseDcAddress,
|
|
OUT PVOID *Message,
|
|
OUT PULONG MessageSize
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Build the message to ping a DC to see if it exists.
|
|
|
|
Arguments:
|
|
|
|
NetbiosDomainName - Netbios Domain Name of the domain to query.
|
|
|
|
DnsDomainName - DNS Domain Name of the domain to query.
|
|
|
|
PdcOnly - True if only the PDC should respond.
|
|
|
|
UnicodeComputerName - Netbios computer name of the machine to respond to.
|
|
|
|
UnicodeUserName - Account name of the user being pinged.
|
|
If NULL, DC will always respond affirmatively.
|
|
|
|
AllowableAccountControlBits - Mask of allowable account types for UnicodeUserName.
|
|
|
|
NtVersion - Version of the message
|
|
|
|
NtVersionFlags - Version of the message.
|
|
0: For backward compatibility.
|
|
NETLOGON_NT_VERSION_5: for NT 5.0 message.
|
|
|
|
Message - Returns the message to be sent to the DC in question.
|
|
Buffer must be free using NetpMemoryFree().
|
|
|
|
MessageSize - Returns the size (in bytes) of the returned message
|
|
|
|
|
|
Return Value:
|
|
|
|
NO_ERROR - Operation completed successfully;
|
|
|
|
ERROR_NO_SUCH_DOMAIN - If the machine isn't a DC for the requested domain.
|
|
|
|
ERROR_NOT_ENOUGH_MEMORY - The message could not be allocated.
|
|
|
|
--*/
|
|
{
|
|
// This stub routine simply does nothing harmful
|
|
return ERROR_NO_SUCH_DOMAIN;
|
|
UNREFERENCED_PARAMETER( NetbiosDomainName );
|
|
UNREFERENCED_PARAMETER( DnsDomainName );
|
|
UNREFERENCED_PARAMETER( DomainGuid );
|
|
UNREFERENCED_PARAMETER( DomainSid );
|
|
UNREFERENCED_PARAMETER( PdcOnly );
|
|
UNREFERENCED_PARAMETER( UnicodeComputerName );
|
|
UNREFERENCED_PARAMETER( UnicodeUserName );
|
|
UNREFERENCED_PARAMETER( AllowableAccountControlBits );
|
|
UNREFERENCED_PARAMETER( NtVersion );
|
|
UNREFERENCED_PARAMETER( NtVersionFlags );
|
|
UNREFERENCED_PARAMETER( ResponseDcAddress );
|
|
UNREFERENCED_PARAMETER( Message );
|
|
UNREFERENCED_PARAMETER( MessageSize );
|
|
}
|
|
|
|
|
|
VOID
|
|
NlpDumpBuffer(
|
|
IN DWORD DebugFlag,
|
|
PVOID Buffer,
|
|
DWORD BufferSize
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps the buffer content on to the debugger output.
|
|
|
|
Arguments:
|
|
|
|
DebugFlag: Debug flag to pass on to NlPrintRoutine
|
|
|
|
Buffer: buffer pointer.
|
|
|
|
BufferSize: size of the buffer.
|
|
|
|
Return Value:
|
|
|
|
none
|
|
|
|
--*/
|
|
{
|
|
#define NUM_CHARS 16
|
|
|
|
DWORD i, limit;
|
|
CHAR TextBuffer[NUM_CHARS + 1];
|
|
LPBYTE BufferPtr = Buffer;
|
|
|
|
//
|
|
// Hex dump of the bytes
|
|
//
|
|
limit = ((BufferSize - 1) / NUM_CHARS + 1) * NUM_CHARS;
|
|
|
|
for (i = 0; i < limit; i++) {
|
|
|
|
if (i < BufferSize) {
|
|
|
|
printf("%02x ", BufferPtr[i]);
|
|
|
|
if (BufferPtr[i] < 31 ) {
|
|
TextBuffer[i % NUM_CHARS] = '.';
|
|
} else if (BufferPtr[i] == '\0') {
|
|
TextBuffer[i % NUM_CHARS] = ' ';
|
|
} else {
|
|
TextBuffer[i % NUM_CHARS] = (CHAR) BufferPtr[i];
|
|
}
|
|
|
|
} else {
|
|
|
|
printf(0," ");
|
|
TextBuffer[i % NUM_CHARS] = ' ';
|
|
|
|
}
|
|
|
|
if ((i + 1) % NUM_CHARS == 0) {
|
|
TextBuffer[NUM_CHARS] = 0;
|
|
printf(" %s\n", TextBuffer);
|
|
}
|
|
|
|
}
|
|
|
|
UNREFERENCED_PARAMETER( DebugFlag );
|
|
}
|
|
|
|
VOID
|
|
DoAdd(
|
|
IN LPWSTR SubnetName,
|
|
IN LPWSTR SiteName
|
|
)
|
|
{
|
|
ULONG SubnetAddress;
|
|
ULONG SubnetMask;
|
|
BYTE SubnetBitCount;
|
|
NET_API_STATUS NetStatus;
|
|
|
|
|
|
NetStatus = NlParseSubnetString( SubnetName,
|
|
&SubnetAddress,
|
|
&SubnetMask,
|
|
&SubnetBitCount );
|
|
|
|
if ( NetStatus != NO_ERROR ) {
|
|
return;
|
|
}
|
|
|
|
printf( "Doing %ws %8.8lX %8.8lX %ld\n",
|
|
SubnetName, SubnetAddress, SubnetMask, SubnetBitCount );
|
|
|
|
NetStatus = NlSitesAddSubnet( SiteName, SubnetName );
|
|
|
|
if ( NetStatus != NO_ERROR ) {
|
|
printf("Cannot add site %ws %ws %ld\n", SiteName, SubnetName, NetStatus );
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
VOID
|
|
DoLook(
|
|
IN LPWSTR IpAddress
|
|
)
|
|
{
|
|
INT WsaStatus;
|
|
SOCKADDR SockAddr;
|
|
INT SockAddrSize;
|
|
PNL_SITE_ENTRY SiteEntry;
|
|
|
|
//
|
|
// Convert the address to a sockaddr
|
|
//
|
|
|
|
SockAddrSize = sizeof(SockAddr);
|
|
WsaStatus = WSAStringToAddressW( IpAddress,
|
|
AF_INET,
|
|
NULL,
|
|
(PSOCKADDR)&SockAddr,
|
|
&SockAddrSize );
|
|
if ( WsaStatus != 0 ) {
|
|
WsaStatus = WSAGetLastError();
|
|
printf("DoLook: %ws: Wsa Error %ld\n", IpAddress, WsaStatus );
|
|
return;
|
|
}
|
|
|
|
if ( SockAddr.sa_family != AF_INET ) {
|
|
printf("DoLook: %ws: address not AF_INET\n", IpAddress );
|
|
return;
|
|
}
|
|
|
|
|
|
SiteEntry = NlFindSiteEntryBySockAddr( &SockAddr );
|
|
|
|
if ( SiteEntry == NULL ) {
|
|
printf("DoLook: %ws: address cannot be found\n", IpAddress );
|
|
return;
|
|
}
|
|
|
|
printf("%ws is in site %ws\n", IpAddress, SiteEntry->SiteName );
|
|
|
|
NlDerefSiteEntry( SiteEntry );
|
|
|
|
}
|
|
|
|
__cdecl main (int argc, char *argv[])
|
|
{
|
|
NET_API_STATUS NetStatus;
|
|
PNL_SITE_ENTRY Site1;
|
|
PNL_SITE_ENTRY Site2;
|
|
PNL_SITE_ENTRY Site3;
|
|
|
|
WORD wVersionRequested;
|
|
WSADATA wsaData;
|
|
int err;
|
|
|
|
//
|
|
// Initialize winsock.
|
|
//
|
|
|
|
wVersionRequested = MAKEWORD( 1, 1 );
|
|
|
|
NetStatus = WSAStartup( wVersionRequested, &wsaData );
|
|
if ( NetStatus != 0 ) {
|
|
printf( "NETAPI32.DLL: Cannot initialize winsock %ld.\n", NetStatus );
|
|
return NetStatus;
|
|
}
|
|
|
|
if ( LOBYTE( wsaData.wVersion ) != 1 ||
|
|
HIBYTE( wsaData.wVersion ) != 1 ) {
|
|
WSACleanup();
|
|
printf( "NETAPI32.DLL: Wrong winsock version %ld.\n", wsaData.wVersion );
|
|
return WSANOTINITIALISED;
|
|
}
|
|
|
|
|
|
//
|
|
// Init
|
|
NetStatus = NlSiteInitialize();
|
|
|
|
if ( NetStatus != NO_ERROR ) {
|
|
printf( "Cannot NlSiteInitialize %ld\n", NetStatus );
|
|
return 1;
|
|
}
|
|
|
|
#ifdef notdef
|
|
//
|
|
// Add some sites.
|
|
//
|
|
|
|
Site1 = NlFindSiteEntry( L"Site 1" );
|
|
|
|
if ( Site1 == NULL ) {
|
|
printf( "Cannot Create Site1\n");
|
|
return 1;
|
|
}
|
|
printf( "%lx: %ws\n", Site1, Site1->SiteName );
|
|
|
|
Site2 = NlFindSiteEntry( L"Site 1" );
|
|
|
|
if ( Site2 == NULL ) {
|
|
printf( "Cannot Create Site2\n");
|
|
return 2;
|
|
}
|
|
printf( "%lx: %ws\n", Site2, Site2->SiteName );
|
|
|
|
Site3 = NlFindSiteEntry( L"Site 3" );
|
|
|
|
if ( Site3 == NULL ) {
|
|
printf( "Cannot Create Site3\n");
|
|
return 3;
|
|
}
|
|
printf( "%lx: %ws\n", Site3, Site3->SiteName );
|
|
|
|
|
|
NlDerefSiteEntry( Site1 );
|
|
NlDerefSiteEntry( Site2 );
|
|
NlDerefSiteEntry( Site3 );
|
|
#endif // notdef
|
|
|
|
//
|
|
// Test invalid subnet strings
|
|
//
|
|
#ifdef notdef
|
|
DoAdd( L"999.0.0.0/1", L"Site 1" );
|
|
DoAdd( L"1.0.0.0/0", L"Site 1" );
|
|
DoAdd( L"1.0.0.0/1", L"Site 1" );
|
|
DoAdd( L"1.0.0.0/33", L"Site 1" );
|
|
DoAdd( L"1.0.0.0/1p", L"Site 1" );
|
|
DoAdd( L"1.0.0.0", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/1", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/2", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/3", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/4", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/5", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/6", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/7", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/8", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/9", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/10", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/11", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/12", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/13", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/14", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/15", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/16", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/17", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/18", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/19", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/20", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/21", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/22", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/23", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/24", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/25", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/26", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/27", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/28", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/29", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/30", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/31", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/32", L"Site 1" );
|
|
#endif // notdef
|
|
|
|
{
|
|
ULONG i;
|
|
for ( i=0; i<2; i++ ) {
|
|
DoAdd( L"128.0.0.0/8", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/7", L"Site 2" );
|
|
DoAdd( L"128.0.0.0/8", L"Site 3" );
|
|
// DoAdd( L"128.0.0.0/1", L"Site 4" );
|
|
DoAdd( L"157.55.0.0/16", L"Site 5" );
|
|
DoAdd( L"157.55.80.0/20", L"Site 6" );
|
|
|
|
|
|
NlSitesEndSubnetEnum();
|
|
}
|
|
}
|
|
DoLook( L"157.55.95.68" );
|
|
DoLook( L"157.55.24.68" );
|
|
|
|
#ifdef notdef
|
|
DoAdd( L"157.55.0.0/16", L"Site 1" );
|
|
DoAdd( L"157.55.240.0/20", L"Site 1" );
|
|
DoAdd( L"128.0.0.0/1", L"Site 1" );
|
|
#endif // notdef
|
|
|
|
//
|
|
// Done.
|
|
//
|
|
NlSiteTerminate();
|
|
printf( "Done\n" );
|
|
return 0;
|
|
}
|