windows-nt/Source/XPSP1/NT/net/diagnostics/netwatch/netwatch.cpp
2020-09-26 16:20:57 +08:00

381 lines
9.3 KiB
C++

// netwatch.cpp
//
// Copyright 2000 Microsoft Corporation, all rights reserved
//
// Created 2-00 anbrad
//
#include "netwatch.h"
#include <shlwapi.h>
#include "main.h"
#include "dsubmit.h"
// NETMON includes
#include "blob.h"
#include "irtc.h"
#include "idelaydc.h"
#include "nmerr.h"
#include "adapter.h" // CAdapter
static DWORD AddressOffsetTable[] = { 0, 0, 2, 1 };
DWORD WINAPI StatusCallbackProc( UPDATE_EVENT Event );
DWORD m_dwAdapters;
CAdapter* m_pAdapters;
HRESULT StartListening(HWND hwndParent)
{
HRESULT rc;
HBLOB FilterBlob = 0;
PBLOB_TABLE pBlobTable;
//
// Create a netmon blob
//
CreateBlob(&FilterBlob);
//
// We want realtime data
//
if (NOERROR != (rc = SetBoolInBlob( FilterBlob,
OWNER_NPP,
CATEGORY_CONFIG,
TAG_INTERFACE_DELAYED_CAPTURE,
TRUE)))
{
return E_FAIL;
}
//
// Get the table of devices we can use
//
if (NOERROR != GetNPPBlobTable(
FilterBlob,
&pBlobTable))
{
return E_FAIL;
}
if (pBlobTable->dwNumBlobs < 0)
return E_FAIL;
m_dwAdapters = pBlobTable->dwNumBlobs;
m_pAdapters = new CAdapter[m_dwAdapters];
if (!m_pAdapters)
return E_FAIL;
for (CAdapter* pAdapter = m_pAdapters;
pAdapter < m_pAdapters + m_dwAdapters;
++pAdapter)
{
// Grab the first one.
pAdapter->m_hBlob = pBlobTable->hBlobs[pAdapter - m_pAdapters];
if (!SUCCEEDED(rc = CreateNPPInterface(pAdapter->m_hBlob,
IID_IDelaydC,
(LPVOID*) &pAdapter->m_pRtc)))
{
return E_FAIL;
}
const char* MacType;
if (NMERR_SUCCESS != GetStringFromBlob(pAdapter->m_hBlob,
OWNER_NPP,
CATEGORY_NETWORKINFO,
TAG_MACTYPE,
&MacType))
{
return E_FAIL;
}
//
// Grab the Mac Address
//
if (NMERR_SUCCESS != GetMacAddressFromBlob(pAdapter->m_hBlob,
OWNER_NPP,
CATEGORY_LOCATION,
TAG_MACADDRESS,
pAdapter->MacAddress))
{
return E_FAIL;
}
}
// Start the capture
StartCapture();
return S_OK;
}
void StartCapture()
{
DWORD rc;
NETWORKINFO NetworkInfo;
HBLOB hErrorBlob;
BOOL WantProtocolInfo = TRUE;
DWORD Value = 1;
BOOL bRas;
// initialize the error blob
CreateBlob(&hErrorBlob);
for (CAdapter* pAdapter = m_pAdapters;
pAdapter < m_pAdapters + m_dwAdapters;
++pAdapter)
{
pAdapter->m_dwFrames = 0;
pAdapter->m_qBytes = 0;
rc = GetBoolFromBlob(
pAdapter->m_hBlob,
OWNER_NPP,
CATEGORY_LOCATION,
TAG_RAS,
&bRas);
if( rc != NMERR_SUCCESS )
{
goto START_FAILURE;
}
if (bRas)
continue;
//
// get the networkinfo from the blob that we may need
//
rc = GetNetworkInfoFromBlob(pAdapter->m_hBlob,
&NetworkInfo);
pAdapter->m_dwLinkSpeed = NetworkInfo.LinkSpeed;
pAdapter->m_dwHeaderOffset = AddressOffsetTable[NetworkInfo.MacType];
//
// Set the WantProtocolInfo
//
rc = SetBoolInBlob( pAdapter->m_hBlob,
OWNER_NPP,
CATEGORY_CONFIG,
TAG_WANT_PROTOCOL_INFO,
WantProtocolInfo);
if( rc != NMERR_SUCCESS )
{
goto START_FAILURE;
}
//
// connect to and configure the specified network
//
rc = HRESULT_TO_NMERR(pAdapter->m_pRtc->Connect(
pAdapter->m_hBlob,
StatusCallbackProc,
(LPVOID)pAdapter,
hErrorBlob));
if( rc != NMERR_SUCCESS )
{
// the connect failed
goto START_FAILURE;
}
//
// start the capture
//
rc = HRESULT_TO_NMERR(pAdapter->m_pRtc->Start(pAdapter->m_szCaptureFile));
if( rc != NMERR_SUCCESS )
{
// the start failed
goto START_FAILURE;
}
} // for each adapter
START_FAILURE:
DestroyBlob(hErrorBlob);
}
void SaveCapture()
{
DWORD rc;
TCHAR szScratch[MAX_PATH];
TCHAR szMachine[MAX_COMPUTERNAME_LENGTH+1];
DWORD dwMachine = MAX_COMPUTERNAME_LENGTH+1;
TCHAR szFileName[MAX_PATH];
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD dwWritten;
HBLOB hErrorBlob = NULL;
CreateBlob(&hErrorBlob);
ZeroMemory(szMachine, sizeof(szMachine));
GetComputerName(szMachine, &dwMachine);
for (CAdapter* pAdapter = m_pAdapters;
pAdapter < m_pAdapters + m_dwAdapters;
++pAdapter)
{
if (_tcslen(pAdapter->m_szCaptureFile) == 0)
continue;
//
// copy capture file to
// \\scratch\scratch\anbrad\user:MACHINE1 1234.cap
//
_tcscpy (szFileName, pAdapter->m_szCaptureFile);
PathStripPath(szFileName);
_tcscpy (szScratch, "\\\\scratch\\scratch\\anbrad\\");
_tcscat (szScratch, g_szName);
_tcscat (szScratch, " - ");
_tcscat (szScratch, szMachine);
_tcscat (szScratch, " ");
_tcscat (szScratch, szFileName);
if (!CopyFile(pAdapter->m_szCaptureFile, szScratch, FALSE))
{
DWORD dw = GetLastError();
goto Error;
}
//
// Save the problem
//
PathRemoveExtension(szScratch);
PathAddExtension(szScratch, TEXT(".txt"));
hFile = CreateFile(
szScratch,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
goto Error;
if (!WriteFile(hFile, g_szProblem, _tcslen(g_szProblem), &dwWritten, NULL))
goto Error;
rc = HRESULT_TO_NMERR(pAdapter->m_pRtc->Configure(
pAdapter->m_hBlob,
hErrorBlob));
if( rc != NMERR_SUCCESS )
{
// the start failed
goto Error;
}
//
// start the capture
//
rc = HRESULT_TO_NMERR(pAdapter->m_pRtc->Start(pAdapter->m_szCaptureFile));
if( rc != NMERR_SUCCESS )
{
// the start failed
goto Error;
}
}
Error:
if (hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);
if (hErrorBlob)
DestroyBlob(hErrorBlob);
return;
}
void EndCapture()
{
DWORD rc;
STATISTICS stats;
for (CAdapter* pAdapter = m_pAdapters;
pAdapter < m_pAdapters + m_dwAdapters;
++pAdapter)
{
//
// stop capturing
//
pAdapter->m_pRtc->Stop(&stats);
// disconnect from the network
rc = HRESULT_TO_NMERR(pAdapter->m_pRtc->Disconnect());
if( rc != NMERR_SUCCESS )
{
//TRACE("NPPDisconnect failed: %d\n", rc);
}
}
}
void StopCapture()
{
STATISTICS stats;
for (CAdapter* pAdapter = m_pAdapters;
pAdapter < m_pAdapters + m_dwAdapters;
++pAdapter)
{
//
// stop capturing
//
pAdapter->m_pRtc->Stop(&stats);
}
}
void RestartCapture()
{
DWORD rc;
HBLOB hErrorBlob = NULL;
CreateBlob(&hErrorBlob);
for (CAdapter* pAdapter = m_pAdapters;
pAdapter < m_pAdapters + m_dwAdapters;
++pAdapter)
{
rc = HRESULT_TO_NMERR(pAdapter->m_pRtc->Configure(
pAdapter->m_hBlob,
hErrorBlob));
if( rc != NMERR_SUCCESS )
{
// the start failed
goto Error;
}
//
// start the capture
//
rc = HRESULT_TO_NMERR(pAdapter->m_pRtc->Start(pAdapter->m_szCaptureFile));
if( rc != NMERR_SUCCESS )
{
// the start failed
goto Error;
}
}
Error:
if (hErrorBlob)
DestroyBlob(hErrorBlob);
}
// ----------------------------------------------------------------------------
DWORD WINAPI StatusCallbackProc( UPDATE_EVENT Event )
{
CAdapter* pAdapter = (CAdapter*) Event.lpUserContext;
// we could do stuff here, but what?
return( NMERR_SUCCESS );
}