381 lines
9.3 KiB
C++
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 );
|
|
}
|
|
|