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.
1711 lines
47 KiB
1711 lines
47 KiB
#include "diagnostics.h"
|
|
//#include <netsh.h>
|
|
#include <netshp.h>
|
|
#include "Dglogs.h"
|
|
#include "DglogsCom.h"
|
|
#include "Commdlg.h"
|
|
#include "oe.h"
|
|
|
|
extern PrintMessage22 PrintMessage2;
|
|
|
|
#undef PrintMessage
|
|
#define PrintMessage PrintMessage2
|
|
|
|
|
|
// Wbem Repositories
|
|
//
|
|
#define TXT_WBEM_REP_CIMV2 L"root\\cimv2"
|
|
|
|
// Wbem Namespaces
|
|
//
|
|
#define TXT_WBEM_NS_COMPUTER L"win32_computersystem"
|
|
#define TXT_WBEM_NS_OS L"win32_operatingsystem"
|
|
#define TXT_WBEM_NS_NETWORK L"win32_networkadapterconfiguration"
|
|
#define TXT_WBEM_NS_NETWORK2 L"win32_networkadapter"
|
|
#define TXT_WBEM_NS_CLIENT L"win32_networkclient"
|
|
#define TXT_WBEM_NS_WMI L"win32_wmisetting"
|
|
#define TXT_WBEM_NS_NETDIAG L"netdiagnostics"
|
|
#define TXT_WBEM_NS_MODEM L"win32_potsmodem"
|
|
|
|
// Captions for the different catagories
|
|
//
|
|
#define TXT_ADAPTER_CAPTION L"Caption"
|
|
#define TXT_CLIENT_CAPTION L"Name"
|
|
#define TXT_MAIL_CAPTION L"InBoundMailServer"
|
|
#define TXT_NEWS_CAPTION L"NewsServer"
|
|
#define TXT_PROXY_CAPTION L"IEProxy"
|
|
#define TXT_COMPUTER_CAPTION L"Caption"
|
|
#define TXT_OS_CAPTION L"Caption"
|
|
#define TXT_VERSION_CAPTION L"Version"
|
|
#define TXT_MODEM_CAPTION L"Caption"
|
|
#define TXT_LOOPBACK_CAPTION L"Loopback"
|
|
|
|
|
|
enum MAIL_TYPE
|
|
{
|
|
MAIL_NONE,
|
|
MAIL_SMTP,
|
|
MAIL_SMTP2,
|
|
MAIL_IMAP,
|
|
MAIL_POP3,
|
|
MAIL_HTTP,
|
|
};
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
The worker thread uses this function to check if the main thread has canceled the worker thread.
|
|
i.e. the work thread should abort what ever it is doing, clean up and terminate.
|
|
|
|
Arguments
|
|
none
|
|
|
|
Return Value
|
|
TRUE the worker thread has been terminated
|
|
FALSE the worker thread has not been terminated
|
|
|
|
--*/
|
|
inline BOOL CDiagnostics::ShouldTerminate()
|
|
{
|
|
if( m_bTerminate )
|
|
{
|
|
// The worker thread already has been canceled.
|
|
//
|
|
return TRUE;
|
|
}
|
|
|
|
if (WaitForSingleObject(m_hTerminateThread, 0) == WAIT_OBJECT_0)
|
|
{
|
|
// Worker thread has been canceled
|
|
//
|
|
m_bTerminate = FALSE;
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
// Worker thread has not yet been canceled.
|
|
//
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Initialize the Diagnostics Object
|
|
|
|
Arguments
|
|
none
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
CDiagnostics::CDiagnostics()
|
|
{
|
|
m_bFlags = 0;
|
|
m_bInterface = NO_INTERFACE;
|
|
lstrcpy(m_szwStatusReport,L"");
|
|
m_bReportStatus = FALSE;
|
|
m_lWorkDone = 0;
|
|
m_lTotalWork = 0;
|
|
ClearQuery();
|
|
// Max sure that these strings are always NULL terminated
|
|
m_szwCategory[MAX_PATH] = L'\0';
|
|
m_szwHeader[MAX_PATH] = L'\0';
|
|
m_pszwCatagory = NULL;
|
|
m_bWinsockInit = FALSE;
|
|
m_bDiagInit = FALSE;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Uniniailize the Diagnostics object
|
|
|
|
Arguments
|
|
none
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
CDiagnostics::~CDiagnostics()
|
|
{
|
|
// Close the winsock
|
|
//
|
|
if( m_bWinsockInit )
|
|
{
|
|
WSACleanup();
|
|
m_bWinsockInit = FALSE;
|
|
}
|
|
if( m_pszwCatagory )
|
|
{
|
|
HeapFree(GetProcessHeap(),0,m_pszwCatagory);
|
|
m_pszwCatagory = NULL;
|
|
}
|
|
m_bDiagInit = FALSE;
|
|
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Set the interface i.e. Netsh or COM
|
|
|
|
Arguments
|
|
bInterface -- Interface used to access the data
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
void CDiagnostics::SetInterface(INTERFACE_TYPE bInterface)
|
|
{
|
|
m_bInterface = bInterface;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Iniatilze the Diagnostics object
|
|
|
|
Arguments
|
|
|
|
|
|
Return Value
|
|
TRUE -- Successfully
|
|
else FALSE
|
|
--*/
|
|
BOOLEAN CDiagnostics::Initialize(INTERFACE_TYPE bInterface)
|
|
{
|
|
int iRetVal;
|
|
WSADATA wsa;
|
|
|
|
m_bInterface = bInterface;
|
|
|
|
// Initialize the WmiGateway object
|
|
//
|
|
if( FALSE == m_WmiGateway.WbemInitialize(bInterface) )
|
|
{
|
|
m_bDiagInit = FALSE;
|
|
return FALSE;
|
|
}
|
|
|
|
if( !m_bWinsockInit )
|
|
{
|
|
// Initialize Winsock
|
|
//
|
|
iRetVal = WSAStartup(MAKEWORD(2,1), &wsa);
|
|
if( iRetVal )
|
|
{
|
|
m_bDiagInit = FALSE;
|
|
return FALSE;
|
|
}
|
|
m_bWinsockInit = TRUE;
|
|
}
|
|
|
|
m_bDiagInit = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Sends an event to client informing the client of its progress.
|
|
|
|
Arguments
|
|
pszwStatusReport -- Message telling the client what it CDiagnostics is currently doing
|
|
lPercent -- A percentage indicating its progress.
|
|
|
|
Return Value
|
|
error code
|
|
|
|
--*/
|
|
void CDiagnostics::EventCall(LPCTSTR pszwStatusReport, LONG lPercent)
|
|
{
|
|
if( m_pDglogsCom )
|
|
{
|
|
// Alocate memory for the message and send it to the client
|
|
//
|
|
BSTR bstrResult = SysAllocString(pszwStatusReport);
|
|
m_pDglogsCom->Fire_ProgressReport(&bstrResult,lPercent);
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Sends an event to client informing the client of its progress.
|
|
|
|
Arguments
|
|
pszwMsg -- Message telling the client what it CDiagnostics is currently doing
|
|
lValue -- A percentage indicating its progress.
|
|
|
|
Return Value
|
|
void
|
|
|
|
Note:
|
|
If lValue is -1 then send the finished message
|
|
|
|
--*/
|
|
void CDiagnostics::ReportStatus(LPCTSTR pszwMsg, LONG lValue)
|
|
{
|
|
// Check if the client requested the Status report option
|
|
//
|
|
if( m_bReportStatus )
|
|
{
|
|
if( lValue == -1 )
|
|
{
|
|
// Send the finished message. 100% complete and the final XML result
|
|
//
|
|
EventCall(ids(IDS_FINISHED_STATUS), 100);
|
|
EventCall(pszwMsg, lValue);
|
|
m_lWorkDone = 0;
|
|
m_lTotalWork = 0;
|
|
}
|
|
else
|
|
{
|
|
// Compute the total percentage completed. Make sure we never go over 100%
|
|
//
|
|
m_lWorkDone += m_lWorkDone+lValue < 100?lValue:0;
|
|
EventCall(pszwMsg, m_lWorkDone);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Counts the occurance of chars in a string
|
|
|
|
Arguments
|
|
pszw -- String to search
|
|
c -- Char to count the occurnce of
|
|
|
|
Return Value
|
|
number of time c occured in pszw
|
|
|
|
Note:
|
|
If lValue is -1 then send the finished message
|
|
|
|
--*/
|
|
int wcscount(LPCWSTR pszw, WCHAR c)
|
|
{
|
|
int n =0;
|
|
for(int i=0; pszw[i]!=L'\0'; i++)
|
|
{
|
|
if( pszw[i] == c )
|
|
{
|
|
if( i > 0 && pszw[i-1]!=c) n++;
|
|
}
|
|
}
|
|
return n;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Set the query information
|
|
|
|
Arguments
|
|
pszwCatagory -- Catagory
|
|
bFlag -- Flags (Show, PING, Connect)
|
|
pszwParam1 -- Instance | iphost
|
|
pszwParam2 -- Port number
|
|
|
|
Return Value
|
|
void
|
|
|
|
--*/
|
|
void CDiagnostics::SetQuery(WCHAR *pszwCatagory, BOOL bFlag, WCHAR *pszwParam1, WCHAR *pszwParam2)
|
|
{
|
|
if( pszwCatagory )
|
|
{
|
|
// Set the catagory. Need to make a copy of the Catagory since the string might disapper i.e. threads
|
|
//
|
|
LONG Length = wcslen(pszwCatagory);
|
|
if( m_pszwCatagory )
|
|
{
|
|
HeapFree(GetProcessHeap(),0,m_pszwCatagory);
|
|
m_pszwCatagory = NULL;
|
|
}
|
|
|
|
// If this memory allocation fails m_pszwCatagory will be Null and the catagory will not be displayed
|
|
m_pszwCatagory = (LPWSTR)HeapAlloc(GetProcessHeap(),0,(Length+1)*sizeof(WCHAR));
|
|
if( m_pszwCatagory )
|
|
{
|
|
wcscpy(m_pszwCatagory,pszwCatagory);
|
|
}
|
|
}
|
|
|
|
if( bFlag )
|
|
{
|
|
m_bFlags = bFlag;
|
|
}
|
|
|
|
if( pszwParam1 )
|
|
{
|
|
m_pszwParam1 = pszwParam1;
|
|
}
|
|
|
|
if( pszwParam2 )
|
|
{
|
|
m_pszwParam2 = pszwParam2;
|
|
}
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Clears the Set query information
|
|
|
|
Arguments
|
|
void
|
|
|
|
Return Value
|
|
void
|
|
|
|
--*/
|
|
void CDiagnostics::ClearQuery()
|
|
{
|
|
|
|
m_pszwCatagory = NULL;
|
|
m_bFlags = NULL;
|
|
m_pszwParam1 = NULL;
|
|
m_pszwParam2 = NULL;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description
|
|
Execute the query
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
void
|
|
|
|
--*/
|
|
BOOL GetIEProxy(LPWSTR pwszProxy, LONG ProxyLen, LPDWORD pdwPort, LPDWORD pdwEnabled);
|
|
BOOLEAN CDiagnostics::ExecQuery(WCHAR *pszwCatagory, BOOL bFlags, WCHAR *pszwParam1, WCHAR *pszwParam2)
|
|
{
|
|
WCHAR *pszw;
|
|
BOOL bAll = FALSE;
|
|
|
|
SetQuery(pszwCatagory,bFlags,pszwParam1,pszwParam2);
|
|
m_WmiGateway.SetCancelOption(m_hTerminateThread);
|
|
|
|
m_WmiGateway.m_wstrWbemError = L"";
|
|
m_bTerminate = FALSE;
|
|
m_lWorkDone = 0;
|
|
m_lTotalWork = 0;
|
|
|
|
m_bstrCaption = L"";
|
|
|
|
if( m_pszwParam1 && !wcsstr(m_pszwParam1,L"*") )
|
|
{
|
|
if( m_bFlags & FLAG_VERBOSE_LOW )
|
|
{
|
|
m_bFlags &= ~FLAG_VERBOSE_LOW;
|
|
m_bFlags |= FLAG_VERBOSE_MEDIUM;
|
|
}
|
|
}
|
|
|
|
if( !m_pszwCatagory )
|
|
{
|
|
ClearQuery();
|
|
return FALSE;
|
|
}
|
|
|
|
// the 3 is the start percentage indicating that something is happening!
|
|
ReportStatus(ids(IDS_COLLECTINGINFO_STATUS),3);
|
|
|
|
if( wcsstr(m_pszwCatagory,L"test") )
|
|
{
|
|
if( (m_bFlags & FLAG_VERBOSE_LOW) )
|
|
{
|
|
m_bFlags &= ~FLAG_CMD_SHOW;
|
|
}
|
|
else
|
|
{
|
|
m_bFlags |= FLAG_CMD_SHOW;
|
|
}
|
|
if( m_bFlags & FLAG_VERBOSE_LOW )
|
|
{
|
|
m_bFlags &= ~FLAG_VERBOSE_LOW;
|
|
m_bFlags |= FLAG_VERBOSE_MEDIUM;
|
|
}
|
|
m_bFlags |= FLAG_CMD_PING | FLAG_CMD_CONNECT;
|
|
bAll = TRUE;
|
|
}
|
|
|
|
if( wcsstr(m_pszwCatagory,L"all") )
|
|
{
|
|
bAll = TRUE;
|
|
}
|
|
|
|
pszw = new WCHAR[lstrlen(m_pszwCatagory) + 3];
|
|
if( !pszw )
|
|
{
|
|
ClearQuery();
|
|
return FALSE;
|
|
}
|
|
|
|
wsprintf(pszw,L";%s;",m_pszwCatagory);
|
|
ToLowerStr(pszw);
|
|
|
|
m_nCatagoriesRequested = wcscount(pszw,L';') - 1;
|
|
|
|
XMLNetdiag(TRUE);
|
|
NetShNetdiag(TRUE);
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( wcsstr(pszw,L";iphost;") )
|
|
{
|
|
ExecIPHost(m_pszwParam1,m_pszwParam2);
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";mail;") )
|
|
{
|
|
ExecMailQuery();
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";news;") )
|
|
{
|
|
ExecNewsQuery();
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";ieproxy;") )
|
|
{
|
|
ExecProxyQuery();
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";loopback;") )
|
|
{
|
|
ExecLoopbackQuery();
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";computer;") )
|
|
{
|
|
ExecComputerQuery();
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";os;") )
|
|
{
|
|
ExecOSQuery();
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";version;") )
|
|
{
|
|
ExecVersionQuery();
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";modem;") )
|
|
{
|
|
ExecModemQuery(m_pszwParam1);
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";adapter;") )
|
|
{
|
|
ExecAdapterQuery(m_pszwParam1);
|
|
}
|
|
|
|
{
|
|
BOOL bFlagSave = m_bFlags;
|
|
m_bFlags &= ~FLAG_VERBOSE_LOW;
|
|
m_bFlags &= ~FLAG_VERBOSE_HIGH;
|
|
m_bFlags |= FLAG_VERBOSE_MEDIUM;
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( wcsstr(pszw,L";dns;") )
|
|
{
|
|
ExecDNSQuery(m_pszwParam1);
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( wcsstr(pszw,L";gateway;") )
|
|
{
|
|
ExecGatewayQuery(m_pszwParam1);
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( wcsstr(pszw,L";dhcp;") )
|
|
{
|
|
ExecDhcpQuery(m_pszwParam1);
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( wcsstr(pszw,L";ip;") )
|
|
{
|
|
ExecIPQuery(m_pszwParam1);
|
|
}
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( wcsstr(pszw,L";wins;") )
|
|
{
|
|
ExecWinsQuery(m_pszwParam1);
|
|
}
|
|
m_bFlags = bFlagSave;
|
|
}
|
|
|
|
|
|
if( ShouldTerminate() ) goto End;
|
|
if( bAll || wcsstr(pszw,L";client;") )
|
|
{
|
|
ExecClientQuery(m_pszwParam1);
|
|
}
|
|
|
|
|
|
End:
|
|
delete [] pszw;
|
|
|
|
if( ShouldTerminate() ) return FALSE;
|
|
|
|
XMLNetdiag(FALSE);
|
|
NetShNetdiag(FALSE);
|
|
|
|
Sleep(50);
|
|
ReportStatus(m_wstrXML.c_str(),-1);
|
|
|
|
ClearQuery();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// Escaoes special XML chars
|
|
wstring &CDiagnostics::Escape(LPCTSTR pszw)
|
|
{
|
|
|
|
m_wstrEscapeXml = L"";
|
|
|
|
if( !pszw )
|
|
{
|
|
return m_wstrEscapeXml;
|
|
}
|
|
|
|
for(int i=0; pszw[i]!=L'\0'; i++)
|
|
{
|
|
switch(pszw[i])
|
|
{
|
|
case L'&':
|
|
m_wstrEscapeXml += L"&";
|
|
break;
|
|
case L'\'':
|
|
m_wstrEscapeXml += L"'";
|
|
break;
|
|
case L'\"':
|
|
m_wstrEscapeXml += L""";
|
|
break;
|
|
case L'<':
|
|
m_wstrEscapeXml += L"<";
|
|
break;
|
|
case L'>':
|
|
m_wstrEscapeXml += L">";
|
|
break;
|
|
default:
|
|
m_wstrEscapeXml += pszw[i];
|
|
|
|
}
|
|
}
|
|
|
|
return m_wstrEscapeXml;
|
|
}
|
|
|
|
// Creates the XML start tag
|
|
// <Netdiag>
|
|
// <Status Value = _____ ></Status>
|
|
// ______
|
|
// </Netdiag>
|
|
void CDiagnostics::XMLNetdiag(BOOLEAN bStartTag, LPCTSTR pszwValue)
|
|
{
|
|
if( m_bInterface == COM_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
m_wstrXML = wstring(L"<Netdiag Name = \"Network Diagnostics\">\n");
|
|
}
|
|
else
|
|
{
|
|
m_wstrXML += wstring(L"<Status Value = \"") + Escape(pszwValue) + wstring(L"\"> </Status>\n");
|
|
m_wstrXML += wstring(L"</Netdiag>\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Creates a the diagnostics header
|
|
// <Container Name = "_____" Category = "_____" Caption = "_____">
|
|
// <Status Value = _____ ></Status>
|
|
// </Container>
|
|
void CDiagnostics::XMLHeader(BOOLEAN bStartTag, WCHAR *pszwHeader, WCHAR *pszwCaption, WCHAR *pszwCategory)
|
|
{
|
|
if( m_bInterface == COM_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
m_wstrXML += wstring(L"<Container Name = \"") + Escape(pszwHeader) + wstring(L"\" ");
|
|
m_wstrXML += wstring(L"Category = \"") + Escape(pszwCategory) + wstring(L"\" ");
|
|
m_wstrXML += wstring(L"Caption = \"") + Escape(pszwCaption) + wstring(L"\">\n");
|
|
}
|
|
else
|
|
{
|
|
m_wstrXML += wstring(L"<Status Value = \"") + Escape(pszwHeader) + wstring(L"\"> </Status>\n");
|
|
m_wstrXML += wstring(L"</Container>");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Creates the Caption string
|
|
// <ClassObjectEnum Name = "_____">
|
|
// <Status Value = _____ > </Status>
|
|
// </ClassObjectEnum>
|
|
//
|
|
void CDiagnostics::XMLCaption(BOOLEAN bStartTag, WCHAR *pszwCaption)
|
|
{
|
|
if( m_bInterface == COM_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
pszwCaption = (m_nInstance == 1)?NULL:pszwCaption;
|
|
if( m_bCaptionDisplayed == FALSE )
|
|
{
|
|
m_wstrXML += wstring(L"<ClassObjectEnum Name = \"") + Escape(pszwCaption) + wstring(L"\">\n");
|
|
m_bCaptionDisplayed = TRUE;
|
|
m_IsPropertyListDisplayed = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( m_IsPropertyListDisplayed )
|
|
{
|
|
m_wstrXML += wstring(L"<Status Value = \"") + Escape(pszwCaption) + wstring(L"\"> </Status>\n");
|
|
m_wstrXML += wstring(L"</ClassObjectEnum>\n");
|
|
}
|
|
m_IsPropertyListDisplayed = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Creates a field tag
|
|
// <Property Name = "_____" >
|
|
// <Status Value = _____ > </Status>
|
|
// </Property>
|
|
void CDiagnostics::XMLField(BOOLEAN bStartTag, WCHAR *pszwField)
|
|
{
|
|
if( m_bInterface == COM_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
m_wstrXML += wstring(L"<Property Name = \"") + Escape(pszwField) + wstring(L"\">\n");
|
|
}
|
|
else
|
|
{
|
|
m_wstrXML += wstring(L"<Status Value = \"") + Escape(pszwField) + wstring(L"\"> </Status>\n");
|
|
m_wstrXML += wstring(L"</Property>\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Creates a property
|
|
// <PropertyValue Value = "_____" Data = "_____" Comment = "_____" >
|
|
void CDiagnostics::XMLProperty(BOOLEAN bStartTag, WCHAR *pszwProperty, LPCTSTR pszwData, LPCTSTR pszwComment)
|
|
{
|
|
if( m_bInterface == COM_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
m_wstrXML += wstring(L"<PropertyValue ");
|
|
m_wstrXML += wstring(L"Value = \"") + Escape(pszwProperty) + wstring(L"\" ");
|
|
m_wstrXML += wstring(L"Data = \"") + Escape(pszwData) + wstring(L"\" ");
|
|
m_wstrXML += wstring(L"Comment = \"") + Escape(pszwComment) + wstring(L"\" ");
|
|
m_wstrXML += wstring(L">\n");
|
|
|
|
}
|
|
else
|
|
{
|
|
m_wstrXML += Escape(pszwProperty);
|
|
m_wstrXML += wstring(L"</PropertyValue>\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Ensurse that the property is valid and should be displayed
|
|
BOOLEAN CDiagnostics::Filter(_variant_t &vValue, BOOLEAN bFlags)
|
|
{
|
|
BOOLEAN retVal;
|
|
BOOLEAN bShow = (m_bFlags & FLAG_CMD_SHOW);
|
|
BOOLEAN bPing = (m_bFlags & FLAG_CMD_PING) && (bFlags & TYPE_PING);
|
|
BOOLEAN bConnect = (m_bFlags & FLAG_CMD_CONNECT) && (bFlags & TYPE_CONNECT);
|
|
|
|
if( m_bFlags & FLAG_VERBOSE_LOW )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if( bFlags & TYPE_HIDE )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if( (m_bFlags & FLAG_VERBOSE_HIGH)==0 && (retVal = IsVariantEmpty(vValue)) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if( (bFlags & TYPE_IP) && !m_bAdaterHasIPAddress )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if( !bShow )
|
|
{
|
|
if( bPing || bConnect)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get a entry from the link list stack
|
|
template<class t>
|
|
_variant_t *Get(list<t> &l, WCHAR *pszwName, DWORD nInstance)
|
|
{
|
|
list<t>::iterator iter;
|
|
if( l.empty() )
|
|
{
|
|
return NULL;
|
|
}
|
|
for( iter = l.begin(); iter != l.end(); iter++)
|
|
{
|
|
if( lstrcmp(iter->pszwName,pszwName) == 0 )
|
|
{
|
|
if( nInstance < iter->Value.size() )
|
|
{
|
|
return &iter->Value[nInstance];
|
|
}
|
|
else
|
|
{
|
|
return NULL;
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
// Remove a entry from the list link stack
|
|
template<class t>
|
|
BOOLEAN RemoveInstance(list<t> &l, DWORD nInstance)
|
|
{
|
|
list<t>::iterator iter;
|
|
for( iter = l.begin(); iter != l.end(); iter++)
|
|
{
|
|
iter->Value.erase(&iter->Value[nInstance]);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
// Add/modify an entry in the link list stack
|
|
template<class t>
|
|
void Set(list<t> &l, WCHAR *pszwName, BOOLEAN bFlags, _variant_t &vValue)
|
|
{
|
|
list<t>::iterator iter;
|
|
|
|
for( iter = l.begin(); iter != l.end(); iter++)
|
|
{
|
|
if( lstrcmp(iter->pszwName,pszwName) == 0 )
|
|
{
|
|
iter->Value.push_back(vValue);
|
|
return;
|
|
}
|
|
}
|
|
l.push_back(Property(pszwName,bFlags));
|
|
iter = l.end();
|
|
iter--;
|
|
iter->Value.push_back(vValue);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
// Formats the ping data
|
|
//
|
|
BOOLEAN CDiagnostics::FormatPing(WCHAR * pszwText)
|
|
{
|
|
if( m_bInterface == NETSH_INTERFACE )
|
|
{
|
|
if( pszwText )
|
|
{
|
|
LONG nIndent = m_IsNetdiagDisplayed + m_IsContainerDisplayed + m_IsPropertyListDisplayed + m_IsPropertyDisplayed + m_IsValueDisplayed;
|
|
DisplayMessageT(L"%1!s!%2!s!\n",Indent(nIndent),pszwText);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if( m_bInterface == COM_INTERFACE )
|
|
{
|
|
if( !pszwText )
|
|
{
|
|
m_wstrPing.erase(m_wstrPing.begin(),m_wstrPing.end());
|
|
}
|
|
else if( m_wstrPing.empty() )
|
|
{
|
|
m_wstrPing = pszwText;
|
|
}
|
|
else
|
|
{
|
|
m_wstrPing += wstring(L"|") + pszwText;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOLEAN CDiagnostics::ExecClientQuery(WCHAR *pszwInstance)
|
|
{
|
|
if( !(m_bFlags & FLAG_CMD_SHOW) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_CLIENT_CAPTION;
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_NETWORKADAPTERS),MAX_PATH);
|
|
wcsncpy(m_szwHeader,ids(IDS_CLIENT_HEADER),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(NULL,0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_CLIENT));
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOLEAN CDiagnostics::ExecModemQuery(WCHAR *pszwInstance)
|
|
{
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_MODEM_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_MODEM_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_MODEM),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(NULL,0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_MODEM));
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Removes adapters that are not present
|
|
// It checks the Win32_Netwokadapter NetConnectionStatus field to see if the adapter is valid or not
|
|
BOOLEAN CDiagnostics::RemoveInvalidAdapters(EnumWbemProperty & PropList)
|
|
{
|
|
INT i = 0;
|
|
_variant_t *pvIPEnabled;
|
|
_variant_t *pvIndex1;
|
|
_variant_t *pvIndex2;
|
|
_variant_t *pvAdapterStatus;
|
|
|
|
|
|
|
|
// Get the Win32_Networkadapter class so we can determine if the adapters in the Win32_Networkadapterconfiguration are valid(Present)
|
|
EnumWbemProperty Win32NetworkAdpterList;
|
|
Win32NetworkAdpterList.push_back(WbemProperty(NULL,0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK2));
|
|
m_WmiGateway.GetWbemProperties(Win32NetworkAdpterList);
|
|
|
|
// With WMI you can not Union tables so we need to get both tables (Win32_NetwokAdapterConfiguration and Win32_NetwokAdapter) and walk
|
|
// through each entry. Entries with the same index are the same adapter. The NetConnectionStatus says if the adapter is valid.
|
|
do
|
|
{
|
|
pvIPEnabled = Get(PropList,L"IPEnabled",i);
|
|
if( pvIPEnabled )
|
|
{
|
|
DWORD j;
|
|
pvIndex1 = Get(PropList,L"Index",i);
|
|
if( pvIndex1 )
|
|
{
|
|
j = 0;
|
|
do
|
|
{
|
|
pvIndex2 = Get(Win32NetworkAdpterList,L"Index",j);
|
|
if( pvIndex2 && pvIndex2->ulVal == pvIndex1->ulVal )
|
|
{
|
|
pvAdapterStatus = Get(Win32NetworkAdpterList,L"NetConnectionStatus",j);
|
|
if( pvAdapterStatus != NULL && (pvAdapterStatus->ulVal != 2 && pvAdapterStatus->ulVal != 9) )
|
|
{
|
|
RemoveInstance(PropList,(DWORD)i);
|
|
pvIndex2 = NULL;
|
|
i--;
|
|
}
|
|
}
|
|
j++;
|
|
}
|
|
while(pvIndex2);
|
|
}
|
|
i++;
|
|
}
|
|
|
|
|
|
}
|
|
while(pvIPEnabled);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Gets all of the adapter info from Win32_NetworkAdapterConfiguration
|
|
// Sets flags for some of the properties and values it recives (i.e. Ping and IP)
|
|
// These flags indicate how to display he data process the data.
|
|
BOOLEAN CDiagnostics::ExecAdapterQuery(WCHAR *pszwInstance)
|
|
{
|
|
EnumWbemProperty PropList;
|
|
EnumWbemProperty::iterator iter;
|
|
|
|
m_pszwCaption = TXT_ADAPTER_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_ADAPTER_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_NETWORKADAPTERS),MAX_PATH);
|
|
PropList.push_back(WbemProperty(NULL,0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
|
|
for(iter = PropList.begin(); iter != PropList.end(); iter++)
|
|
{
|
|
if( 0 == lstrcmp(iter->pszwName, L"DNSServerSearchOrder") ||
|
|
0 == lstrcmp(iter->pszwName, L"IPAddress") ||
|
|
0 == lstrcmp(iter->pszwName, L"WINSPrimaryServer") ||
|
|
0 == lstrcmp(iter->pszwName, L"WINSSecondaryServer") ||
|
|
0 == lstrcmp(iter->pszwName, L"DHCPServer") )
|
|
{
|
|
iter->bFlags = TYPE_PING | TYPE_IP;
|
|
}
|
|
|
|
if( 0 == lstrcmp(iter->pszwName, L"DefaultIPGateway") )
|
|
{
|
|
iter->bFlags = TYPE_PING | TYPE_SUBNET | TYPE_IP;
|
|
}
|
|
}
|
|
|
|
if( !(m_bFlags & FLAG_VERBOSE_HIGH) )
|
|
{
|
|
RemoveInvalidAdapters(PropList);
|
|
}
|
|
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get the DNS data from Win32_NetworkAdapter
|
|
BOOLEAN CDiagnostics::ExecDNSQuery(WCHAR *pszwInstance)
|
|
{
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_ADAPTER_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_DNS_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_NETWORKADAPTERS),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(L"DNSServerSearchOrder",TYPE_PING | TYPE_IP ,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(m_pszwCaption,TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPAddress",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPEnabled",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
|
|
if( !(m_bFlags & FLAG_VERBOSE_HIGH) )
|
|
{
|
|
RemoveInvalidAdapters(PropList);
|
|
}
|
|
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get the IP data from Win32_NetworkAdapter
|
|
BOOLEAN CDiagnostics::ExecIPQuery(WCHAR *pszwInstance)
|
|
{
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_ADAPTER_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_IP_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_NETWORKADAPTERS),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(L"IPAddress",TYPE_PING | TYPE_IP,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(m_pszwCaption,TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPAddress",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPEnabled",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
|
|
if( !(m_bFlags & FLAG_VERBOSE_HIGH) )
|
|
{
|
|
RemoveInvalidAdapters(PropList);
|
|
}
|
|
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get the WINS data from Win32_NetworkAdapter
|
|
BOOLEAN CDiagnostics::ExecWinsQuery(WCHAR *pszwInstance)
|
|
{
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_ADAPTER_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_WINS_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_NETWORKADAPTERS),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(L"WINSPrimaryServer",TYPE_PING | TYPE_IP,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"WINSSecondaryServer",TYPE_PING | TYPE_IP,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(m_pszwCaption,TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPAddress",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPEnabled",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
|
|
if( !(m_bFlags & FLAG_VERBOSE_HIGH) )
|
|
{
|
|
RemoveInvalidAdapters(PropList);
|
|
}
|
|
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get the Gateway data from Win32_NetworkAdapter
|
|
BOOLEAN CDiagnostics::ExecGatewayQuery(WCHAR *pszwInstance)
|
|
{
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_ADAPTER_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_GATEWAY_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_NETWORKADAPTERS),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(L"DefaultIPGateway",TYPE_PING | TYPE_IP | TYPE_SUBNET,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPAddress",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPSubnet",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(m_pszwCaption,TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPEnabled",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
|
|
if( !(m_bFlags & FLAG_VERBOSE_HIGH) )
|
|
{
|
|
RemoveInvalidAdapters(PropList);
|
|
}
|
|
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get the DHCP data from Win32_NetworkAdapter
|
|
BOOLEAN CDiagnostics::ExecDhcpQuery(WCHAR *pszwInstance)
|
|
{
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_ADAPTER_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_DHCP_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_NETWORKADAPTERS),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(L"DHCPServer",TYPE_PING | TYPE_IP,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(m_pszwCaption,TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
PropList.push_back(WbemProperty(L"IPAddress",TYPE_HIDE,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_NETWORK));
|
|
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
|
|
if( !(m_bFlags & FLAG_VERBOSE_HIGH) )
|
|
{
|
|
RemoveInvalidAdapters(PropList);
|
|
}
|
|
|
|
FormatEnum(PropList,pszwInstance);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get the Computer info data from Win32_ComputerSystem
|
|
BOOLEAN CDiagnostics::ExecComputerQuery()
|
|
{
|
|
if( !(m_bFlags & FLAG_CMD_SHOW) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_COMPUTER_CAPTION;
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_SYSTEMINFO),MAX_PATH);
|
|
wcsncpy(m_szwHeader,ids(IDS_COMPUTER_HEADER),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(NULL,0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_COMPUTER));
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
FormatEnum(PropList);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Gets the system info data from Win32_SystemInformation
|
|
BOOLEAN CDiagnostics::ExecOSQuery()
|
|
{
|
|
if( !(m_bFlags & FLAG_CMD_SHOW) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_OS_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_OS_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_SYSTEMINFO),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(NULL,0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_OS));
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
FormatEnum(PropList);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Gets the Version info data from Win32_SystemInformation
|
|
BOOLEAN CDiagnostics::ExecVersionQuery()
|
|
{
|
|
if( !(m_bFlags & FLAG_CMD_SHOW) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
EnumWbemProperty PropList;
|
|
|
|
m_pszwCaption = TXT_VERSION_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_VERSION_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_SYSTEMINFO),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(L"Version",0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_OS));
|
|
PropList.push_back(WbemProperty(L"BuildVersion",0,TXT_WBEM_REP_CIMV2,TXT_WBEM_NS_WMI));
|
|
m_WmiGateway.GetWbemProperties(PropList);
|
|
FormatEnum(PropList);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Converts a port number into a string
|
|
LPWSTR GetMailType(DWORD dwType)
|
|
{
|
|
switch(dwType)
|
|
{
|
|
case MAIL_SMTP:
|
|
return ids(IDS_SMTP);
|
|
case MAIL_SMTP2:
|
|
return ids(IDS_SMTP);
|
|
case MAIL_POP3:
|
|
return ids(IDS_POP3);
|
|
case MAIL_IMAP:
|
|
return ids(IDS_IMAP);
|
|
case MAIL_HTTP:
|
|
return ids(IDS_HTTP);
|
|
default:
|
|
return ids(IDS_UNKNOWN);
|
|
}
|
|
}
|
|
|
|
|
|
//Gets the news and data and formats the results. performs the pings and connects
|
|
BOOLEAN CDiagnostics::ExecNewsQuery()
|
|
{
|
|
HRESULT hr;
|
|
INETSERVER rNewsServer;
|
|
EnumProperty PropList;
|
|
BOOLEAN bConnect = 2;
|
|
|
|
m_pszwCaption = TXT_NEWS_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_NEWS_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_INTERNET),MAX_PATH);
|
|
|
|
hr = GetOEDefaultNewsServer2(rNewsServer);
|
|
|
|
if( SUCCEEDED(hr) )
|
|
{
|
|
if( strcmp(rNewsServer.szServerName,"") != 0 )
|
|
{
|
|
Property Prop;
|
|
|
|
m_bstrCaption = rNewsServer.szServerName;
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"NewsNNTPPort",TYPE_CONNECT);
|
|
Prop.Value.push_back(_variant_t((LONG)rNewsServer.dwPort));
|
|
PropList.push_back(Prop);
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"NewsServer",TYPE_PING | TYPE_CONNECT);
|
|
Prop.Value.push_back(_variant_t(rNewsServer.szServerName));
|
|
PropList.push_back(Prop);
|
|
|
|
if( (m_bFlags & FLAG_CMD_CONNECT) )
|
|
{
|
|
WCHAR wszConnect[MAX_PATH+1];
|
|
_bstr_t bstrServer = rNewsServer.szServerName;
|
|
|
|
|
|
if( Connect((LPWSTR)bstrServer,rNewsServer.dwPort) )
|
|
{
|
|
//L"Successfully connected to %hs port %d"
|
|
_snwprintf(wszConnect,MAX_PATH,ids(IDS_CONNECTEDTOSERVERSUCCESS),rNewsServer.szServerName,rNewsServer.dwPort);
|
|
bConnect = TRUE;
|
|
}
|
|
else
|
|
{
|
|
|
|
//"Unable to connect to %hs port %d"
|
|
_snwprintf(wszConnect,MAX_PATH,ids(IDS_CONNECTEDTOSERVERFAILED),rNewsServer.szServerName,rNewsServer.dwPort);
|
|
bConnect = FALSE;
|
|
}
|
|
|
|
PropList.push_back(Property(wszConnect,TYPE_TEXT | TYPE_CONNECT));
|
|
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_bstrCaption = ids(IDS_NOTCONFIGURED);
|
|
PropList.push_back(Property((WCHAR*)m_bstrCaption,TYPE_TEXT));
|
|
}
|
|
|
|
FormatEnum(PropList, NULL, bConnect);
|
|
|
|
m_bstrCaption = L"";
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// Get and format the Mail server and port number. This uses the OEACCTMGR not WMI.
|
|
// OEACCTMGR does not work if it is run as a provider
|
|
BOOLEAN CDiagnostics::ExecMailQuery()
|
|
{
|
|
EnumProperty PropList;
|
|
INETSERVER rInBoundMailServer;
|
|
INETSERVER rOutBoundMailServer;
|
|
DWORD dwInBoundMailType;
|
|
DWORD dwOutBoundMailType;
|
|
HRESULT hr;
|
|
BOOLEAN bConnect = 2;
|
|
BOOLEAN bMailConfigured = FALSE;
|
|
|
|
|
|
|
|
// Set the caption, header and category information (describes this object)
|
|
//
|
|
m_pszwCaption = TXT_MAIL_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_MAIL_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_INTERNET),MAX_PATH);
|
|
|
|
hr = GetOEDefaultMailServer2(rInBoundMailServer,
|
|
dwInBoundMailType,
|
|
rOutBoundMailServer,
|
|
dwOutBoundMailType);
|
|
|
|
if( SUCCEEDED(hr) )
|
|
{
|
|
if( strcmp(rInBoundMailServer.szServerName,"") != 0 )
|
|
{
|
|
Property Prop;
|
|
_variant_t varValue;
|
|
|
|
m_bstrCaption = rInBoundMailServer.szServerName;
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"InBoundMailPort",TYPE_CONNECT);
|
|
Prop.Value.push_back(_variant_t((LONG)rInBoundMailServer.dwPort));
|
|
PropList.push_back(Prop);
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"InBoundMailServer",TYPE_CONNECT | (dwInBoundMailType!=MAIL_HTTP ? TYPE_PING : 0));
|
|
Prop.Value.push_back(_variant_t(rInBoundMailServer.szServerName));
|
|
PropList.push_back(Prop);
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"InBoundMailType",0);
|
|
Prop.Value.push_back(_variant_t(GetMailType(dwInBoundMailType)));
|
|
PropList.push_back(Prop);
|
|
|
|
if( (m_bFlags & FLAG_CMD_CONNECT) && dwInBoundMailType != MAIL_HTTP)
|
|
{
|
|
_bstr_t bstrServer = rInBoundMailServer.szServerName;
|
|
WCHAR wszConnect[MAX_PATH+1];
|
|
|
|
if( Connect((LPWSTR)bstrServer,rInBoundMailServer.dwPort) )
|
|
{
|
|
_snwprintf(wszConnect,MAX_PATH,ids(IDS_CONNECTEDTOSERVERSUCCESS),rInBoundMailServer.szServerName,rInBoundMailServer.dwPort);
|
|
bConnect = TRUE;
|
|
}
|
|
else
|
|
{
|
|
_snwprintf(wszConnect,MAX_PATH,ids(IDS_CONNECTEDTOSERVERFAILED),rInBoundMailServer.szServerName,rInBoundMailServer.dwPort);
|
|
bConnect = FALSE;
|
|
}
|
|
|
|
PropList.push_back(Property(wszConnect,TYPE_TEXT | TYPE_CONNECT));
|
|
|
|
}
|
|
|
|
bMailConfigured = TRUE;
|
|
}
|
|
|
|
if( strcmp(rOutBoundMailServer.szServerName,"") != 0 )
|
|
{
|
|
|
|
Property Prop;
|
|
_variant_t varValue;
|
|
|
|
if( bMailConfigured )
|
|
{
|
|
m_bstrCaption += L" / ";
|
|
}
|
|
|
|
m_bstrCaption += rOutBoundMailServer.szServerName;
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"OutBoundMailPort",TYPE_CONNECT);
|
|
Prop.Value.push_back(_variant_t((LONG)rOutBoundMailServer.dwPort));
|
|
PropList.push_back(Prop);
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"OutBoundMailServer",TYPE_PING | TYPE_CONNECT);
|
|
Prop.Value.push_back(_variant_t(rOutBoundMailServer.szServerName));
|
|
PropList.push_back(Prop);
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"OutBoundMailType",0);
|
|
Prop.Value.push_back(_variant_t(GetMailType(dwOutBoundMailType)));
|
|
PropList.push_back(Prop);
|
|
|
|
if( (m_bFlags & FLAG_CMD_CONNECT) && dwOutBoundMailType != MAIL_HTTP)
|
|
{
|
|
_bstr_t bstrServer = rOutBoundMailServer.szServerName;
|
|
WCHAR wszConnect[MAX_PATH+1];
|
|
|
|
if( Connect((LPWSTR)bstrServer,rOutBoundMailServer.dwPort) )
|
|
{
|
|
_snwprintf(wszConnect,MAX_PATH,ids(IDS_CONNECTEDTOSERVERSUCCESS),rOutBoundMailServer.szServerName,rOutBoundMailServer.dwPort);
|
|
bConnect = TRUE;
|
|
}
|
|
else
|
|
{
|
|
_snwprintf(wszConnect,MAX_PATH,ids(IDS_CONNECTEDTOSERVERFAILED),rOutBoundMailServer.szServerName,rOutBoundMailServer.dwPort);
|
|
bConnect = FALSE;
|
|
}
|
|
|
|
PropList.push_back(Property(wszConnect,TYPE_TEXT | TYPE_CONNECT));
|
|
|
|
}
|
|
|
|
bMailConfigured = TRUE;
|
|
}
|
|
|
|
if( !bMailConfigured )
|
|
{
|
|
m_bstrCaption = ids(IDS_NOTCONFIGURED);
|
|
PropList.push_back(Property((WCHAR*)m_bstrCaption,TYPE_TEXT));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_bstrCaption = ids(IDS_NOTCONFIGURED);
|
|
PropList.push_back(Property((WCHAR*)m_bstrCaption,TYPE_TEXT));
|
|
}
|
|
FormatEnum(PropList, NULL, bConnect);
|
|
|
|
m_bstrCaption = L"";
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
// Get IE's proxy settings and process the data
|
|
BOOLEAN CDiagnostics::ExecProxyQuery()
|
|
{
|
|
|
|
WCHAR wszProxy[MAX_PATH];
|
|
DWORD dwPort;
|
|
DWORD dwEnabled;
|
|
EnumProperty PropList;
|
|
BOOLEAN bConnectPass = 2;
|
|
WCHAR szw[MAX_PATH+1];
|
|
|
|
wcsncpy(m_szwHeader,ids(IDS_PROXY_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_INTERNET),MAX_PATH);
|
|
|
|
if( GetIEProxy(wszProxy,MAX_PATH,&dwPort,&dwEnabled) )
|
|
{
|
|
m_bstrCaption = wszProxy;
|
|
|
|
if( dwEnabled )
|
|
{
|
|
Property Prop;
|
|
WCHAR szwConnect[MAX_PATH+1];
|
|
LONG nConnect = 0;
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"IEProxy",TYPE_PING | TYPE_CONNECT);
|
|
Prop.Value.push_back(_variant_t(wszProxy));
|
|
PropList.push_back(Prop);
|
|
|
|
Prop.Clear();
|
|
Prop.SetProperty(L"IEProxyPort",TYPE_CONNECT);
|
|
Prop.Value.push_back(_variant_t((LONG)dwPort));
|
|
PropList.push_back(Prop);
|
|
|
|
if( (m_bFlags & FLAG_CMD_CONNECT) )
|
|
{
|
|
// Connecting to %s port %d
|
|
_snwprintf(szw,MAX_PATH,ids(IDS_CONNECTINGTOSERVER_STATUS),wszProxy,dwPort);
|
|
|
|
ReportStatus(szw,0);
|
|
|
|
_snwprintf(szwConnect,MAX_PATH,ids(IDS_SERVERCONNECTSTART));
|
|
if( Connect(wszProxy,dwPort) )
|
|
{
|
|
_snwprintf(szwConnect,MAX_PATH,L"%s%s%d",szwConnect,nConnect?L",":L"",dwPort);
|
|
nConnect++;
|
|
}
|
|
if( !nConnect )
|
|
{
|
|
_snwprintf(szwConnect,MAX_PATH,L"%s%s",szwConnect,ids(IDS_NONE));
|
|
bConnectPass = FALSE;
|
|
}
|
|
else
|
|
{
|
|
bConnectPass = TRUE;
|
|
}
|
|
|
|
_snwprintf(szwConnect,MAX_PATH,L"%s%s",szwConnect,ids(IDS_SERVERCONNECTEND));
|
|
PropList.push_back(WbemProperty(szwConnect,TYPE_TEXT | TYPE_CONNECT));
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
HideAll(PropList);
|
|
lstrcpy(szw,ids(IDS_IEPROXYNOTUSED));
|
|
m_pszwCaption = szw;
|
|
m_bstrCaption = ids(IDS_IEPROXYNOTUSED); //IDS_NOTCONFIGURED
|
|
}
|
|
|
|
}
|
|
|
|
FormatEnum(PropList,NULL, bConnectPass);
|
|
m_bstrCaption = L"";
|
|
return TRUE;
|
|
}
|
|
|
|
// Get teh loopback adapter
|
|
BOOLEAN CDiagnostics::ExecLoopbackQuery()
|
|
{
|
|
EnumWbemProperty PropList;
|
|
EnumWbemProperty::iterator iter;
|
|
|
|
_variant_t vLoopback = L"127.0.0.1";
|
|
|
|
m_pszwCaption = TXT_LOOPBACK_CAPTION;
|
|
wcsncpy(m_szwHeader,ids(IDS_LOOPBACK_HEADER),MAX_PATH);
|
|
wcsncpy(m_szwCategory,ids(IDS_CATEGORY_INTERNET),MAX_PATH);
|
|
|
|
PropList.push_back(WbemProperty(L"Loopback",TYPE_PING));
|
|
|
|
iter = PropList.begin();
|
|
iter->Value.push_back(vLoopback);
|
|
|
|
FormatEnum(PropList);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// ping or connect to a specified IP host name or IP address
|
|
BOOLEAN CDiagnostics::ExecIPHost(WCHAR *pszwHostName,WCHAR *pszwHostPort)
|
|
{
|
|
EnumProperty PropList;
|
|
WCHAR szw[MAX_PATH+1];
|
|
BOOL bFlag;
|
|
|
|
m_pszwCaption = L"IPHost";
|
|
lstrcpy(m_szwHeader,L"IPHost");
|
|
|
|
Set(PropList, L"IPHost",TYPE_CONNECT | TYPE_PING,_variant_t(pszwHostName));
|
|
|
|
if( m_bFlags & FLAG_CMD_CONNECT )
|
|
{
|
|
WCHAR szw[MAX_PATH+1];
|
|
WCHAR szwConnect[MAX_PATH+1];
|
|
|
|
Set(PropList, L"Port",TYPE_CONNECT,_variant_t(pszwHostPort));
|
|
_snwprintf(szw,MAX_PATH,L"Connecting to %s port %s",pszwHostName,pszwHostPort);
|
|
ReportStatus(szw,0);
|
|
_snwprintf(szwConnect,MAX_PATH,ids(IDS_SERVERCONNECTSTART));
|
|
if( IsNumber(pszwHostPort) && Connect(pszwHostName,wcstol(pszwHostPort,NULL,10)) )
|
|
{
|
|
_snwprintf(szwConnect,MAX_PATH,L"%s%s",szwConnect,pszwHostPort);
|
|
}
|
|
else
|
|
{
|
|
_snwprintf(szwConnect,MAX_PATH,L"%s%s",szwConnect,ids(IDS_NONE));
|
|
}
|
|
|
|
_snwprintf(szwConnect,MAX_PATH,L"%s%s",szwConnect,ids(IDS_SERVERCONNECTEND));
|
|
PropList.push_back(Property(szwConnect,TYPE_TEXT | TYPE_CONNECT));
|
|
}
|
|
|
|
FormatEnum(PropList);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Init the netsh interface
|
|
void CDiagnostics::NetShNetdiag(BOOLEAN bStartTag, LPCTSTR pszwValue)
|
|
{
|
|
if( m_bInterface == NETSH_INTERFACE )
|
|
{
|
|
m_nIndent = 0;
|
|
m_IsNetdiagDisplayed = FALSE;
|
|
}
|
|
}
|
|
|
|
// Format the netsh header
|
|
void CDiagnostics::NetShHeader(BOOLEAN bStartTag,LPCTSTR pszwValue,LPCTSTR pszwCaption)
|
|
{
|
|
if( m_bInterface == NETSH_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
DisplayMessageT(L"\n");
|
|
if( pszwValue )
|
|
{
|
|
LONG nIndent = m_IsNetdiagDisplayed;
|
|
DisplayMessageT(L"%1!s!%2!s!",Indent(nIndent),pszwValue);
|
|
if( pszwCaption )
|
|
{
|
|
DisplayMessageT(L" (%1!s!)",pszwCaption);
|
|
}
|
|
DisplayMessageT(L"\n");
|
|
m_IsContainerDisplayed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
m_IsContainerDisplayed = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_IsContainerDisplayed = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Format the netsh caption
|
|
void CDiagnostics::NetShCaption(BOOLEAN bStartTag,LPCTSTR pszwValue)
|
|
{
|
|
if( m_bInterface == NETSH_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
if( m_nInstance > 1 )
|
|
{
|
|
if( m_bCaptionDisplayed == FALSE )
|
|
{
|
|
if( pszwValue )
|
|
{
|
|
LONG nIndent = m_IsNetdiagDisplayed + m_IsContainerDisplayed;
|
|
DisplayMessageT(L"%1!s!%2!2d!. %3!s!\n",Indent(nIndent),m_nIndex, pszwValue);
|
|
m_IsPropertyListDisplayed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
m_IsPropertyListDisplayed = FALSE;
|
|
}
|
|
|
|
m_bCaptionDisplayed = TRUE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_IsPropertyListDisplayed = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDiagnostics::NetShField(BOOLEAN bStartTag,LPCTSTR pszwValue)
|
|
{
|
|
if( m_bInterface == NETSH_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
m_nPropertyLegth = 0;
|
|
|
|
LONG nIndent = m_IsNetdiagDisplayed + m_IsContainerDisplayed + m_IsPropertyListDisplayed;
|
|
if( pszwValue )
|
|
{
|
|
m_nPropertyLegth = DisplayMessageT(L"%1!s!%2!s! = ",Indent(nIndent),pszwValue);
|
|
}
|
|
else
|
|
{
|
|
m_nPropertyLegth = DisplayMessageT(L"%1!s!",Indent(nIndent));
|
|
}
|
|
m_nValueIndex = 0;
|
|
m_IsPropertyDisplayed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
m_IsPropertyDisplayed = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDiagnostics::NetShProperty(BOOLEAN bStartTag,LPCTSTR pszwValue,LPCTSTR pszwComment,BOOL bFlags)
|
|
{
|
|
if( m_bInterface == NETSH_INTERFACE )
|
|
{
|
|
if( bStartTag )
|
|
{
|
|
if( (bFlags & TYPE_PING) )
|
|
{
|
|
LONG nIndent = m_IsNetdiagDisplayed + m_IsContainerDisplayed + m_IsPropertyListDisplayed + m_IsPropertyDisplayed;
|
|
if( m_nValueIndex == 0 )
|
|
{
|
|
DisplayMessageT(L"\n");
|
|
}
|
|
DisplayMessageT(L"%1!s!%2!s! %3!s!\n",Indent(nIndent),pszwValue?pszwValue:L"",pszwComment?pszwComment:L"");
|
|
m_nValueIndex++;
|
|
}
|
|
else
|
|
{
|
|
DisplayMessageT(L"%1!s!%2!s! %3!s!\n",m_nValueIndex++?Space(m_nPropertyLegth):L"",pszwValue?pszwValue:L"",pszwComment?pszwComment:L"");
|
|
}
|
|
m_IsValueDisplayed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
m_IsValueDisplayed = FALSE;
|
|
}
|
|
}
|
|
}
|