//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: results.h // //-------------------------------------------------------------------------- #ifndef HEADER_RESULTS #define HEADER_RESULTS #ifdef _DEBUG #define DebugMessage(str) printf(str) #define DebugMessage2(format, arg) printf(format, arg) #define DebugMessage3(format, arg1, arg2) printf(format, arg1, arg2) #else #define DebugMessage(str) #define DebugMessage2(format, arg) #define DebugMessage3(format, arg1, arg2) #endif #ifdef _SHOW_GURU #define PrintGuru(status, guru) _PrintGuru(status, guru) #define PrintGuruMessage printf #define PrintGuruMessage2 printf #define PrintGuruMessage3 printf #else #define PrintGuru(status, guru) #define PrintGuruMessage( str ) #define PrintGuruMessage2( format, arg ) #define PrintGuruMessage3(format, arg1, arg2) #endif #define NETCARD_CONNECTED 0 #define NETCARD_DISCONNECTED 1 #define NETCARD_STATUS_UNKNOWN 2 /*--------------------------------------------------------------------------- Struct: HotFixInfo This structure holds the information about a single Hotfix. ---------------------------------------------------------------------------*/ typedef struct { BOOL fInstalled; LPTSTR pszName; // use Free() to free } HotFixInfo; /*--------------------------------------------------------------------------- NdMessage This provides for an easier way to pass messages along. ---------------------------------------------------------------------------*/ typedef enum { Nd_Quiet = 0, // i.e. always print Nd_Verbose = 1, Nd_ReallyVerbose = 2, Nd_DebugVerbose = 3, } NdVerbose; typedef struct { NdVerbose ndVerbose; // possible combinations // uMessageId == 0, pszMessage == NULL -- assume not set // uMessageId != 0, pszMessage == NULL -- use string id // uMessageId == 0, pszMessage != NULL -- use string // uMessageId != 0, pszMessage != NULL -- use string id // // Note: the maximum size for a string loaded through this is 4096! UINT uMessageId; LPTSTR pszMessage; } NdMessage; typedef struct ND_MESSAGE_LIST { LIST_ENTRY listEntry; NdMessage msg; }NdMessageList; void SetMessageId(NdMessage *pNdMsg, NdVerbose ndv, UINT uMessageId); void SetMessage(NdMessage *pNdMsg, NdVerbose ndv, UINT uMessageId, ...); void SetMessageSz(NdMessage *pNdMsg, NdVerbose ndv, LPCTSTR pszMessage); void ClearMessage(NdMessage *pNdMsg); void PrintNdMessage(NETDIAG_PARAMS *pParams, NdMessage *pNdMsg); void AddIMessageToList(PLIST_ENTRY plistHead, NdVerbose ndv, int nIndent, UINT uMessageId, ...); void AddIMessageToListSz(PLIST_ENTRY plistHead, NdVerbose ndv, int nIndent, LPCTSTR pszMsg); void AddMessageToList(PLIST_ENTRY plistHead, NdVerbose ndv, UINT uMessageId, ...); void AddMessageToListSz(PLIST_ENTRY plistHead, NdVerbose ndv, LPCTSTR pszMsg); void AddMessageToListId(PLIST_ENTRY plistHead, NdVerbose ndv, UINT uMessageId); void PrintMessageList(NETDIAG_PARAMS *pParams, PLIST_ENTRY plistHead); void MessageListCleanUp(PLIST_ENTRY plistHead); // These functions are for status messages (the messages that appear at the // top). void PrintStatusMessage(NETDIAG_PARAMS *pParams, int iIndent, UINT uMessageId, ...); void PrintStatusMessageSz(NETDIAG_PARAMS *pParams, int iIndent, LPCTSTR pszMessage); // Use this for printing debug messages (messages that require fDebugVerbose) void PrintDebug(NETDIAG_PARAMS *pParams, int nIndent, UINT uMessageId, ...); void PrintDebugSz(NETDIAG_PARAMS *pParams, int nIndent, LPCTSTR pszMessage, ...); /*--------------------------------------------------------------------------- Struct: GLOBAL_RESULT ---------------------------------------------------------------------------*/ typedef struct { WCHAR swzNetBiosName[MAX_COMPUTERNAME_LENGTH+1]; TCHAR szDnsHostName[DNS_MAX_NAME_LENGTH+1]; LPTSTR pszDnsDomainName; // this points to a string in szDnsHostName WSADATA wsaData; // NetBT parameters DWORD dwLMHostsEnabled; // TRUE, FALSE, or HRESULT on error to read DWORD dwDnsForWINS; // TRUE, FALSE, or HRESULT on error to read // Server/OS information (such as version, build no, etc...) LPTSTR pszCurrentVersion; LPTSTR pszCurrentBuildNumber; LPTSTR pszCurrentType; LPTSTR pszProcessorInfo; LPTSTR pszServerType; int cHotFixes; HotFixInfo * pHotFixes; // List of domains to be tested LIST_ENTRY listTestedDomains; // Domain member information // the primary domain info got by using DsRoleGetPrimaryDomainInformation() PDSROLE_PRIMARY_DOMAIN_INFO_BASIC pPrimaryDomainInfo; PTESTED_DOMAIN pMemberDomain; //the primary domain info in the TESTED_DOMAIN struct BOOL fNetlogonIsRunning; HRESULT hrMemberTestResult; // result of the test // Logon information (who we're logged on as) PUNICODE_STRING pLogonUser; PUNICODE_STRING pLogonDomainName; PTESTED_DOMAIN pLogonDomain; BOOL fLogonWithCachedCredentials; LPWSTR pswzLogonServer; BOOL fKerberosIsWorking; BOOL fSysVolNotReady; // Is there any interfaces that are NetBT enabled BOOL fHasNbtEnabledInterface; } GLOBAL_RESULT; /*--------------------------------------------------------------------------- Struct: GLOBAL_IPCONFIG ---------------------------------------------------------------------------*/ typedef struct { // set to TRUE if InitIpconfig has been run BOOL fInitIpconfigCalled; // Is IPX actually up and running? BOOL fEnabled; // // IP-related info (non-DHCP related) // FIXED_INFO * pFixedInfo; // // This is a pointer to the beginning of the adapter list // (Use this to free up the list of interfaces) // IP_ADAPTER_INFO * pAdapterInfoList; // Is DHCP enabled? (on any adapter) BOOL fDhcpEnabled; } GLOBAL_IPCONFIG; /*--------------------------------------------------------------------------- Struct: IPCONFIG_TST ---------------------------------------------------------------------------*/ typedef struct { // IP is active on this interface BOOL fActive; // // Pointer to the IP adapter info for this interface // Do NOT free this up! (free up the entire list by freeing // up GLOBAL_IPCONFIG::pAdapterInfoList // IP_ADAPTER_INFO * pAdapterInfo; TCHAR szDhcpClassID[MAX_DOMAIN_NAME_LEN]; // Is autoconfiguration possible? DWORD fAutoconfigEnabled; // is the adapter currently autoconfigured? DWORD fAutoconfigActive; // WINS node type? UINT uNodeType; TCHAR szDomainName[MAX_DOMAIN_NAME_LEN+1]; IP_ADDR_STRING DnsServerList; // Can we ping the DHCP server? HRESULT hrPingDhcpServer; NdMessage msgPingDhcpServer; // Can we ping the WINS servers? HRESULT hrPingPrimaryWinsServer; NdMessage msgPingPrimaryWinsServer; HRESULT hrPingSecondaryWinsServer; NdMessage msgPingSecondaryWinsServer; // hrOK if the default gateway is on the same subnet as the ip address HRESULT hrDefGwSubnetCheck; // Test result HRESULT hr; } IPCONFIG_TST; /*--------------------------------------------------------------------------- Struct: GLOBAL_LOOPBACK ---------------------------------------------------------------------------*/ typedef struct { NdMessage msgLoopBack; HRESULT hr; } GLOBAL_LOOPBACK; /*--------------------------------------------------------------------------- Struct: GLOBAL_IPX ---------------------------------------------------------------------------*/ typedef struct { // TRUE if IPX is installed, FALSE otherwise BOOL fInstalled; // Is IPX actually up and running? BOOL fEnabled; // Handle to IPX HANDLE hIsnIpxFd; HRESULT hr; } GLOBAL_IPX; /*--------------------------------------------------------------------------- Struct: GLOBAL_NETBT_TRANSPORTS ---------------------------------------------------------------------------*/ typedef struct { LONG cTransportCount; LIST_ENTRY Transports; HRESULT hr; BOOL fPerformed; //FALSE: there are no inerfaces that are NetBT enabled. Test skipped. NdMessage msgTestResult; } GLOBAL_NETBT_TRANSPORTS; /*--------------------------------------------------------------------------- Struct: GLOBAL_DEFGW ---------------------------------------------------------------------------*/ typedef struct { // S_FALSE if no default gateways were reachable // S_OK if at least one default gateway was reached HRESULT hrReachable; } GLOBAL_DEFGW; /*--------------------------------------------------------------------------- Struct: GLOBAL_AUTONET ---------------------------------------------------------------------------*/ typedef struct { BOOL fAllAutoConfig; } GLOBAL_AUTONET; /*--------------------------------------------------------------------------- Struct: GLOBAL_NETBTNM ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgGlobalOutput; HRESULT hrTestResult; } GLOBAL_NBTNM; /*--------------------------------------------------------------------------- Struct: GLOBAL_BROWSER ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgOutput; HRESULT hrTestResult; BOOL fPerformed; //test will be skipped if no interfaces have NetBT enabled } GLOBAL_BROWSER; /*--------------------------------------------------------------------------- Struct: GLOBAL_BINDINGS ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgOutput; HRESULT hrTestResult; } GLOBAL_BINDINGS; /*--------------------------------------------------------------------------- Struct: GLOBAL_WAN ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgOutput; HRESULT hr; BOOL fPerformed; //FALSE: there are no active RAS connections. Test skipped. } GLOBAL_WAN; /*--------------------------------------------------------------------------- Struct: GLOBAL_WINSOCK ---------------------------------------------------------------------------*/ typedef struct { UINT idsContext;// str ID of context, which has %s to take the cause of failure HRESULT hr; // 0: success, otherwise failed DWORD dwMaxUDP; // max size of UDP packets, 0 DWORD dwProts; // number of protocols providers LPWSAPROTOCOL_INFO pProtInfo; // information on the providers } GLOBAL_WINSOCK; typedef struct { DWORD dwNumRoutes; LIST_ENTRY lmsgRoute; DWORD dwNumPersistentRoutes; LIST_ENTRY lmsgPersistentRoute; HRESULT hrTestResult; } GLOBAL_ROUTE; typedef struct { LIST_ENTRY lmsgOutput; HRESULT hrTestResult; } GLOBAL_NDIS; typedef struct { LIST_ENTRY lmsgGlobalOutput; LIST_ENTRY lmsgInterfaceOutput; //Interface statistics LIST_ENTRY lmsgConnectionGlobalOutput; LIST_ENTRY lmsgTcpConnectionOutput; LIST_ENTRY lmsgUdpConnectionOutput; LIST_ENTRY lmsgIpOutput; // IP statistics LIST_ENTRY lmsgTcpOutput; // TCP statistics LIST_ENTRY lmsgUdpOutput; // UDP statistics LIST_ENTRY lmsgIcmpOutput; // ICMP statistics HRESULT hrTestResult; } GLOBAL_NETSTAT; /*--------------------------------------------------------------------------- Struct: GLOBAL_IPSEC ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgGlobalOutput; LIST_ENTRY lmsgAdditOutput; } GLOBAL_IPSEC; /*--------------------------------------------------------------------------- Struct: GLOBAL_DNS ---------------------------------------------------------------------------*/ typedef struct { HRESULT hr; BOOL fOutput; LIST_ENTRY lmsgOutput; } GLOBAL_DNS; /*--------------------------------------------------------------------------- Struct: GLOBAL_NETWARE ---------------------------------------------------------------------------*/ typedef struct { LPTSTR pszUser; LPTSTR pszServer; LPTSTR pszTree; LPTSTR pszContext; BOOL fConnStatus; BOOL fNds; DWORD dwConnType; LIST_ENTRY lmsgOutput; HRESULT hr; } GLOBAL_NETWARE; /*--------------------------------------------------------------------------- Struct: MODEM_DEVICE ---------------------------------------------------------------------------*/ typedef struct { DWORD dwNegotiatedSpeed; DWORD dwModemOptions; DWORD dwDeviceID; LPTSTR pszPort; LPTSTR pszName; } MODEM_DEVICE; /*--------------------------------------------------------------------------- Struct: GLOBAL_MODEM ---------------------------------------------------------------------------*/ typedef struct { NdMessage ndOutput; int cModems; MODEM_DEVICE * pModemDevice; HRESULT hr; BOOL fPerformed; //FALSE: the machine has no line device, test skipped } GLOBAL_MODEM; /*--------------------------------------------------------------------------- Struct: GLOBAL_DCLIST ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgOutput; BOOL fPerformed; //FALSE: the machine is not a member machine, nor a DC, test skipped NdMessage msgErr; HRESULT hr; } GLOBAL_DCLIST; /*--------------------------------------------------------------------------- Struct: GLOBAL_TRUST ---------------------------------------------------------------------------*/ typedef struct { LPTSTR pszContext; // context of failure HRESULT hr; // 0: success, otherwise failed BOOL fPerformed; //FALSE: the machine is not a member machine, nor a DC, test skipped LIST_ENTRY lmsgOutput; } GLOBAL_TRUST; /*--------------------------------------------------------------------------- Struct: GLOBAL_KERBEROS ---------------------------------------------------------------------------*/ typedef struct { UINT idsContext;// str ID of context, which has %s to take the cause of failure HRESULT hr; // 0: success, otherwise failed BOOL fPerformed; //FALSE: the machine is not a member machine, nor a DC, test skipped LIST_ENTRY lmsgOutput; } GLOBAL_KERBEROS; /*--------------------------------------------------------------------------- Struct: GLOBAL_LDAP ---------------------------------------------------------------------------*/ typedef struct { UINT idsContext;// str ID of context, which has %s to take the cause of failure HRESULT hr; // 0: success, otherwise failed BOOL fPerformed; //FALSE: the machine is not a member machine, nor a DC, test skipped LIST_ENTRY lmsgOutput; } GLOBAL_LDAP; typedef struct { HRESULT hr; BOOL fPerformed; //FALSE: the machine is not a member machine, nor a DC, test skipped LIST_ENTRY lmsgOutput; } GLOBAL_DSGETDC; /*--------------------------------------------------------------------------- Struct: AUTONET_TST ---------------------------------------------------------------------------*/ typedef struct { BOOL fAutoNet; } AUTONET_TST; /*--------------------------------------------------------------------------- Struct: DEF_GW_TST ---------------------------------------------------------------------------*/ typedef struct { BOOL dwNumReachable; LIST_ENTRY lmsgOutput; } DEF_GW_TST; /*--------------------------------------------------------------------------- Struct: NBT_NM_TST ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgOutput; BOOL fActive; //used for additional Nbt interfaces whose pResults->fActive == FALSE BOOL fQuietOutput; } NBT_NM_TST; /*--------------------------------------------------------------------------- Struct: WINS_TST ---------------------------------------------------------------------------*/ typedef struct { LIST_ENTRY lmsgPrimary; LIST_ENTRY lmsgSecondary; // Test result HRESULT hr; BOOL fPerformed; //if FALSE: there is no WINS servier configured for this interface, test skipped }WINS_TST; /*--------------------------------------------------------------------------- Struct: DNS_TST ---------------------------------------------------------------------------*/ typedef struct { // Set to TRUE if there is non-verbose output (i.e. errors) BOOL fOutput; LIST_ENTRY lmsgOutput; } DNS_TST; typedef struct { int garbage; } NDIS_TST; typedef struct ___IPX_TEST_FRAME__ { // returns 0-3 ULONG uFrameType; // returns virtual net if NicId = 0 ULONG uNetworkNumber; // adapter's MAC address UCHAR Node[6]; LIST_ENTRY list_entry; } IPX_TEST_FRAME; /*--------------------------------------------------------------------------- Struct: IPX_TST ---------------------------------------------------------------------------*/ typedef struct { // Is this interface enabled for IPX? BOOL fActive; // passed into various functions USHORT uNicId; // Returns TRUE if set BOOL fBindingSet; // 1 = lan, 2 = up wan, 3 = down wan UCHAR uType; // to support more than one FRAME type LIST_ENTRY list_entry_Frames; // it's ZeroMemoryed during init } IPX_TST; /*--------------------------------------------------------------------------- Struct: INTERFACE_RESULT ---------------------------------------------------------------------------*/ typedef struct { // If this is set to TRUE, show the data for this interface BOOL fActive; // The media-sense status of this card DWORD dwNetCardStatus; // Name (or ID) of this adapter (typically a GUID) LPTSTR pszName; // Friendly name for this adapter LPTSTR pszFriendlyName; //if NetBT is enabled BOOL fNbtEnabled; IPCONFIG_TST IpConfig; AUTONET_TST AutoNet; DEF_GW_TST DefGw; NBT_NM_TST NbtNm; WINS_TST Wins; DNS_TST Dns; NDIS_TST Ndis; IPX_TST Ipx; } INTERFACE_RESULT; /*--------------------------------------------------------------------------- Struct: NETDIAG_RESULT ---------------------------------------------------------------------------*/ typedef struct { GLOBAL_RESULT Global; GLOBAL_IPCONFIG IpConfig; GLOBAL_LOOPBACK LoopBack; GLOBAL_NETBT_TRANSPORTS NetBt; GLOBAL_DEFGW DefGw; GLOBAL_AUTONET AutoNet; GLOBAL_NBTNM NbtNm; GLOBAL_BROWSER Browser; GLOBAL_BINDINGS Bindings; GLOBAL_WINSOCK Winsock; GLOBAL_WAN Wan; GLOBAL_IPX Ipx; GLOBAL_DNS Dns; GLOBAL_ROUTE Route; GLOBAL_NDIS Ndis; GLOBAL_NETSTAT Netstat; GLOBAL_NETWARE Netware; GLOBAL_TRUST Trust; GLOBAL_MODEM Modem; GLOBAL_KERBEROS Kerberos; GLOBAL_DCLIST DcList; GLOBAL_LDAP LDAP; GLOBAL_DSGETDC DsGetDc; GLOBAL_IPSEC IPSec; LONG cNumInterfaces; LONG cNumInterfacesAllocated; INTERFACE_RESULT* pArrayInterface; } NETDIAG_RESULT; void ResultsInit(NETDIAG_RESULT* pResults); void PrintGlobalResults(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults); void PrintPerInterfaceResults(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults, INTERFACE_RESULT *pIfRes); void FindInterface(NETDIAG_RESULT *pResult, INTERFACE_RESULT **ppIf); void ResultsCleanup(NETDIAG_PARAMS *pParams, NETDIAG_RESULT* pResults); void PrintWaitDots(NETDIAG_PARAMS *pParams); #endif