/*++ Copyright (C) 1999 Microsoft Corporation --*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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 // // - 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 );