// netwatch.cpp // // Copyright 2000 Microsoft Corporation, all rights reserved // // Created 2-00 anbrad // #include "netwatch.h" #include #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 ); }