Windows Firewall interfaces, INetFwProducts, and InetFwProduct.
Jeff here again. Today I have samples of the Windows Firewall interfaces, INetFwProducts, and InetFwProduct.
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <netfw.h>
#pragma comment( lib, "ole32.lib" )
// Forward declarations
HRESULT FWProductsCOMInitialize(INetFwProducts** ppFwProducts);
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hrComInit = S_OK;
HRESULT hr = S_OK;
long cnt = 0;
INetFwProduct *pFwProduct = NULL;
INetFwProducts *pFwProducts = NULL;
// Initialize COM.
hrComInit = CoInitializeEx(0, COINIT_APARTMENTTHREADED );
if (hrComInit != RPC_E_CHANGED_MODE)
{
if (FAILED(hrComInit))
{
printf("CoInitializeEx failed: 0x%08lx\n", hrComInit);
goto Cleanup;
}
}
hr = FWProductsCOMInitialize(&pFwProducts);
if (FAILED(hr))
{
goto Cleanup;
}
hr = pFwProducts->get_Count(&cnt);
if (SUCCEEDED(hr))
{
printf("get_Count: %d\n",cnt);
hr = pFwProducts->Item(cnt - 1 , &pFwProduct);
if (SUCCEEDED(hr))
{
BSTR bsDisplayName = NULL;
hr = pFwProduct->get_DisplayName(&bsDisplayName);
if (SUCCEEDED(hr))
{
printf("Display name: %S\n", bsDisplayName);
SysFreeString(bsDisplayName);
}
BSTR bsExe = NULL;
hr = pFwProduct->get_PathToSignedProductExe(&bsExe);
if (SUCCEEDED(hr))
{
printf("Path to signed exe: %S\n", bsExe);
SysFreeString(bsExe);
}
IUnknown *pUnkNewEnum;
hr = pFwProducts->get__NewEnum(&pUnkNewEnum);
if (SUCCEEDED(hr))
{
IEnumVARIANT*pUnkVariant;
hr = pUnkNewEnum->QueryInterface(IID_IEnumVARIANT,(void**) &pUnkVariant);
if (SUCCEEDED(hr))
{
do
{
ULONG celt=1;
VARIANT var1[1];
VariantInit(&var1[0]);
ULONG CeltReturned=0;
hr = pUnkVariant->Next(celt,&var1[0],&CeltReturned);
if (SUCCEEDED(hr))
{
if(S_FALSE==hr)
{
//noop possible
}
else
{
switch (var1[0].vt)
{
case VT_UNKNOWN:
case VT_DISPATCH:
{
INetFwProduct *pFwProductQI = NULL;
HRESULT hrQI;
hrQI =var1[0].punkVal->QueryInterface(IID_INetFwProduct, (void**)&pFwProductQI);
if(SUCCEEDED(hrQI))
{
HRESULT hrDisplayName;
BSTR displayNameEnum;
hrDisplayName = pFwProductQI->get_DisplayName(&displayNameEnum);
if(SUCCEEDED(hrQI))
{
printf("\nEnum Display Name: %S\n", displayNameEnum);
//clean-up
SysFreeString(displayNameEnum);
VariantClear(&var1[0]);
}
}
}
break;
default:
break;
}
}
}
}
while(hr !=S_FALSE && !FAILED(hr));
}
}
}
}
Cleanup:
// Release INetFwPolicy2
if (pFwProduct != NULL)
{
pFwProduct->Release();
}
// Uninitialize COM.
if (SUCCEEDED(hrComInit))
{
CoUninitialize();
}
return 0;
}
HRESULT FWProductsCOMInitialize(INetFwProducts** ppFwProducts)
{
HRESULT hr = S_OK;
hr = CoCreateInstance( __uuidof(NetFwProducts),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(INetFwProducts),
(void**)ppFwProducts);
if (FAILED(hr))
{
printf("CoCreateInstance for INetFwProducts failed: 0x%08lx\n", hr);
goto Cleanup;
}
Cleanup:
return hr;
}
For these APIs to work, the Windows Firewall Service needs to be running, otherwise get_Count() returns a bogus number. These APIs only work with 3rd party firewalls, they won’t return the Microsoft firewall.
Follow us on Twitter, www.twitter.com/WindowsSDK.
/Jeff