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.
 
 
 
 
 
 

172 lines
3.8 KiB

/*++
Copyright (C) 1999 Microsoft Corporation
--*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <wtypes.h>
#include <fcntl.h>
#include <sys/stropts.h>
#include <ctype.h>
#include <windows.h>
#include <tdi.h>
#include <sys\uio.h>
#include <winsock.h>
#include <wsahelp.h>
#include <sockets\resolv.h>
#include <nb30.h>
#include <nbtioctl.h>
#include "winsintf.h"
#include "common.h"
#define MAX_PATH_LEN 100
#define WINSTEST_FOUND 0
#define WINSTEST_NOT_FOUND 1
#define WINSTEST_NO_RESPONSE 2
#define WINSTEST_VERIFIED 0
#define WINSTEST_OUT_OF_MEMORY 3
#define WINSTEST_BAD_IP_ADDRESS 4
#define WINSTEST_HOST_NOT_FOUND 5
#define WINSTEST_NOT_VERIFIED 6
#define WINSTEST_INVALID_ARG 7
#define WINSTEST_OPEN_FAILED 8
#define _WINS_CFG_PULL_KEY TEXT("System\\CurrentControlSet\\Services\\Wins\\Partners\\Pull")
#define _WINS_CFG_PUSH_KEY TEXT("System\\CurrentControlSet\\Services\\Wins\\Partners\\Push")
#define WINSCNF_ONLY_DYN_RECS_NM TEXT("OnlyDynRecs")
#define _NBT_CFG_ADAPTERS_KEY TEXT("System\\CurrentControlSet\\Services\\NetBT\\Adapters")
#define RPL_E_PULL 0
#define RPL_E_PUSH 1
#define RE_QUERY_REGISTRY_COUNT 10
#define MAX_NB_NAMES 1000
#define MAX_SERVERS 1000
#define BUFF_SIZE 650
#define MY_PRINT0(_continuous, _str) { \
MY_FPRINT(_continuous, _str); \
}
#define MY_PRINT1(_continuous, _str, _v1) { \
UCHAR __str[500]; \
sprintf(__str, _str, _v1); \
MY_FPRINT(_continuous, __str); \
}
#define MY_PRINT2(_continuous, _str, _v1, _v2) { \
UCHAR __str[500]; \
sprintf(__str, _str, _v1, _v2); \
MY_FPRINT(_continuous, __str); \
}
#define MY_PRINT3(_continuous, _str, _v1, _v2, _v3) { \
UCHAR __str[500]; \
sprintf(__str, _str, _v1, _v2, _v3); \
MY_FPRINT(_continuous, __str); \
}
#define MY_PRINT4(_continuous, _str, _v1, _v2, _v3, _v4) { \
UCHAR __str[500]; \
sprintf(__str, _str, _v1, _v2, _v3, _v4); \
MY_FPRINT(_continuous, __str); \
}
#define MY_FPRINT(_continuous, __str_) \
if (_continuous) { \
fprintf (fp1, __str_); \
} else { \
fprintf (fp, __str_); \
if (Interactive) { \
printf (__str_); \
}\
}
typedef struct _PUSH_PULL_ENTRY {
ULONG PE_IpAddr;
UCHAR PE_Name[MAX_PATH_LEN];
struct _PUSH_PULL_ENTRY *PE_Next;
} PUSH_PULL_ENTRY, *PPUSH_PULL_ENTRY;
typedef struct _NODE_INFO {
ULONG NI_IpAddr;
UCHAR NI_Name[MAX_PATH_LEN];
PPUSH_PULL_ENTRY NI_Lists[2]; // 0 - RPL_E_PULL - PULL list; 1 - RPL_E_PUSH - PUSH list
struct _NODE_INFO *NI_Next;
struct _NODE_INFO *NI_DoneNext;
} NODE_INFO, *PNODE_INFO;
PNODE_INFO GlobalListHead=NULL;
PNODE_INFO GlobalListTail=NULL;
PNODE_INFO GlobalDoneListHead=NULL;
PNODE_INFO GlobalDoneListTail=NULL;
ULONG LocalIpAddress;
CHAR pScope[128];
#define PUSH_BUT_NOT_PULL_LOCAL 0
#define PULL_BUT_NOT_PUSH 1
#define PUSH_BUT_NOT_PULL 2
#define PULL_BUT_NOT_PUSH_LOCAL 3
#define MAX_WINS 1000
//
// <Server> - <Owner> Table - [SO] Table
//
//LARGE_INTEGER SO_Table[MAX_WINS][MAX_WINS];
LARGE_INTEGER **SO_Table = NULL;
//
// Lookaside table to map IP addrs to the index into the SO_Table
//
UCHAR LA_Table[MAX_WINS][20];
ULONG LA_TableSize;
#define ME_PULL 0x1
#define ME_PUSH 0x2
//
// Push/Pull matrix
//
typedef struct _MATRIX_ENTRY {
BOOLEAN ME_Down; // 0 - UP; 1 - Down
USHORT ME_Entry; // 1 - Pull; 2 - Push
} MATRIX_ENTRY, *PMATRIX_ENTRY;
MATRIX_ENTRY PP_Matrix[MAX_WINS][MAX_WINS];
VOID
DumpSOTable(
IN DWORD MasterOwners,
IN BOOL fFile,
IN FILE * pFile
);
VOID
DumpLATable(
IN DWORD MasterOwners,
IN BOOL fFile,
IN FILE * pFile
);