487 lines
12 KiB
C
487 lines
12 KiB
C
#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;
|
||
}
|