// // Purpose: // Entry point for the process // // Parameters: // None // // Return value: // None // void __cdecl main() { DWORD result = NO_ERROR; HRESULT hr = S_OK; INetFwProduct* product = NULL; INetFwProducts* products = NULL; IUnknown* registration = NULL; BSTR displayName = NULL; VARIANT varCategories = { VT_EMPTY }; long count=0; BOOL comInit = FALSE; displayName = SysAllocString(L"@RegisterWithoutCategoryOwnership.exe,-127"); BAIL_ON_ALLOC_FAILURE(displayName, SysAllocString); hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hr)) { //COM initialize failed wprintf(L"CoInitialize failed: 0x%08lx\n", hr); goto CLEANUP; } comInit = TRUE; hr = CoCreateInstance(__uuidof(NetFwProduct),NULL,CLSCTX_INPROC_SERVER,__uuidof(INetFwProduct),(void**)&product ); if (FAILED(hr)) { //CoCreateInstance Failed wprintf(L"CoCreateInstance for INetFwProduct failed: 0x%08lx\n", hr); goto CLEANUP; } hr = product->put_DisplayName(displayName); if (FAILED(hr)) { //Put_displayName failed wprintf(L"put_DisplayName for INetFwProduct failed Error: 0x%08lx\n", hr); goto CLEANUP; } hr = product->put_RuleCategories(varCategories); if (FAILED(hr)) { //Put_rulecategories failed wprintf(L"put_RuleCategories failed for INetFwProduct Error: 0x%08lx\n", hr); goto CLEANUP; } hr = CoCreateInstance(__uuidof(NetFwProducts),NULL,CLSCTX_INPROC_SERVER,__uuidof(INetFwProducts),(void**)&products ); if (FAILED(hr)) { //CoCreateInstance Failed wprintf(L"CoCreateInstance for INetFwProducts failed: 0x%08lx\n", hr); goto CLEANUP; } hr = products->Register(product, ®istration); if (FAILED(hr)) { //Failed to Register Products wprintf(L"Register failed: 0x%08lx\n", hr); goto CLEANUP; } hr = products->get_Count( &count); if (FAILED(hr)) { //Failed to get Count of Products wprintf(L"Get count failed: 0x%08lx\n", hr); goto CLEANUP; } wprintf(L"INetFwProducts_Count returned %ld.\n", count); wprintf(L"Hit any key to unregister.\n"); _getch(); CLEANUP: if (registration != NULL) { registration->Release(); } if (products != NULL) { products->Release(); } if (product != NULL) { product->Release(); } if (comInit) { CoUninitialize(); } SysFreeString(displayName); VariantClear(&varCategories); return; }
UINT32 WindowsFirewallAcquireFirewallCategory() { UINT32 status = NO_ERROR; if(HlprServiceQueryState(L"MPSSvc") == SERVICE_RUNNING) { BSTR pProductName = SysAllocString(g_pServiceName); INetFwProduct* pNetFwProduct = 0; INetFwProducts* pNetFwProducts = 0; SAFEARRAY* pFirewallCategory = 0; SAFEARRAY* pBootTimeCategory = 0; SAFEARRAYBOUND boundary = {0}; VARIANT firewallCategory = {0}; VARIANT boottimeCategory = {0}; if(pProductName == 0) { status = ERROR_GEN_FAILURE; ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : SysAllocString()", status); HLPR_BAIL; } boundary.lLbound = 0; boundary.cElements = 1; pBootTimeCategory = SafeArrayCreate(VT_VARIANT, 1, &boundary); if(pBootTimeCategory == 0) { status = ERROR_GEN_FAILURE; ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : SafeArrayCreate()", status); HLPR_BAIL; } V_VT((VARIANT*)pBootTimeCategory->pvData) = VT_I4; V_I4((VARIANT*)pBootTimeCategory->pvData) = NET_FW_RULE_CATEGORY_BOOT; VariantInit(&firewallCategory); V_VT(&boottimeCategory) = VT_ARRAY | VT_VARIANT; V_ARRAY(&boottimeCategory) = pBootTimeCategory; pFirewallCategory = SafeArrayCreate(VT_VARIANT, 1, &boundary); if(pFirewallCategory == 0) { status = ERROR_GEN_FAILURE; ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : SafeArrayCreate()", status); HLPR_BAIL; } V_VT((VARIANT*)pFirewallCategory->pvData) = VT_I4; V_I4((VARIANT*)pFirewallCategory->pvData) = NET_FW_RULE_CATEGORY_FIREWALL; VariantInit(&firewallCategory); V_VT(&firewallCategory) = VT_ARRAY | VT_VARIANT; V_ARRAY(&firewallCategory) = pFirewallCategory; /// Initialize the COM library if(!g_isCOMInitialized) { status = CoInitializeEx(0, COINIT_MULTITHREADED); if(FAILED(status)) { ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : CoInitializeEx()", status); HLPR_BAIL; } g_isCOMInitialized = TRUE; } /// Create an instance of the NetFwProduct class status = CoCreateInstance(__uuidof(NetFwProduct), 0, CLSCTX_INPROC_SERVER, __uuidof(INetFwProduct), (LPVOID*)&pNetFwProduct); if(FAILED(status)) { ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : CoCreateInstance()", status); HLPR_BAIL; } /// Set the DisplayName status = pNetFwProduct->put_DisplayName(pProductName); if(FAILED(status)) { ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : INetFwProduct::put_DisplayName()", status); HLPR_BAIL; } /// Take the category status = pNetFwProduct->put_RuleCategories(boottimeCategory); if(FAILED(status)) { ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : INetFwProduct::put_RuleCategories()", status); HLPR_BAIL; } status = pNetFwProduct->put_RuleCategories(firewallCategory); if(FAILED(status)) { ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : INetFwProduct::put_RuleCategories()", status); HLPR_BAIL; } /// Create an instance of the NetFwProducts class status = CoCreateInstance(__uuidof(NetFwProducts), 0, CLSCTX_INPROC_SERVER, __uuidof(INetFwProducts), (LPVOID*)&pNetFwProducts); if(FAILED(status)) { ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : CoCreateInstance()", status); HLPR_BAIL; } /// Register as a Firewall Product if(pFirewallRegistrationHandle == 0) { status = pNetFwProducts->Register(pNetFwProduct, &pFirewallRegistrationHandle); if(FAILED(status)) { ServiceEventLogError(L"WindowsFirewallAcquireFirewallCategory : INetFwProducts::Register()", status); HLPR_BAIL; } } status = NO_ERROR; HLPR_BAIL_LABEL: if(FAILED(status)) WindowsFirewallReleaseFirewallCategory(); if(pNetFwProducts) pNetFwProducts->Release(); if(pNetFwProduct) pNetFwProduct->Release(); if(pProductName) SysFreeString(pProductName); } else { HLPR_NEW(pWFNotifyThread, THREAD_DATA); if(pWFNotifyThread) { pWFNotifyThread->threadStartRoutine = (LPTHREAD_START_ROUTINE)WindowsFirewallNotifyThreadStartRoutine; status = HlprThreadStart(pWFNotifyThread); } else status = ERROR_OUTOFMEMORY; } if(HlprServiceQueryState(L"WFPSampler") == SERVICE_START_PENDING) ServiceStatusReportToSCM(SERVICE_START_PENDING, status, 2500); return status; }