powertool

enumwfp

Nov 7th, 2013
599
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.66 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <Fwpmu.h>
  4.  
  5.  
  6. HMODULE fwdll = NULL;
  7.  
  8. typedef DWORD (WINAPI *PFNFWPMENGINEOPEN0)(
  9.   _In_opt_  const wchar_t *serverName,
  10.   _In_      UINT32 authnService,
  11.   _In_opt_  SEC_WINNT_AUTH_IDENTITY_W *authIdentity,
  12.   _In_opt_  const FWPM_SESSION0 *session,
  13.   _Out_     HANDLE *engineHandle
  14. );
  15.  
  16. typedef DWORD (WINAPI *PFNFWPMENGINECLOSE0)(
  17.   _In_  HANDLE engineHandle
  18. );
  19.  
  20. typedef DWORD (WINAPI *PFNFWPMCALLOUTCREATEENUMHANDLE0) (
  21.   _In_      HANDLE engineHandle,
  22.   _In_opt_  const FWPM_CALLOUT_ENUM_TEMPLATE0 *enumTemplate,
  23.   _Out_     HANDLE *enumHandle
  24. );
  25.  
  26. typedef DWORD (WINAPI *PFNFWPMCALLOUTDESTROYENUMHANDLE0) (
  27.   _In_  HANDLE engineHandle,
  28.   _In_  HANDLE enumHandle
  29. );
  30.  
  31. typedef DWORD (WINAPI *PFNFWPMCALLOUTENUM0) (
  32.   _In_   HANDLE engineHandle,
  33.   _In_   HANDLE enumHandle,
  34.   _In_   UINT32 numEntriesRequested,
  35.   _Out_  FWPM_CALLOUT0 ***entries,
  36.   _Out_  UINT32 *numEntriesReturned
  37. );
  38.  
  39. typedef void (WINAPI *PFNFWPMFREEMEMORY0)(
  40.   _Inout_  void **p
  41. );
  42.  
  43. typedef DWORD (WINAPI *PFNFWPMCALLOUTDELETEBYKEY0)(
  44.   _In_  HANDLE engineHandle,
  45.   _In_  const GUID *key
  46. );
  47.  
  48.  
  49. PFNFWPMENGINEOPEN0                  pfnFwpmEngineOpen0 = NULL;
  50. PFNFWPMENGINECLOSE0                 pfnFwpmEngineClose0 = NULL;
  51. PFNFWPMCALLOUTCREATEENUMHANDLE0     pfnFwpmCalloutCreateEnumHandle0 = NULL;
  52. PFNFWPMCALLOUTDESTROYENUMHANDLE0    pfnFwpmCalloutDestroyEnumHandle0 = NULL;
  53. PFNFWPMCALLOUTENUM0                 pfnFwpmCalloutEnum0 = NULL;
  54. PFNFWPMFREEMEMORY0                  pfnFwpmFreeMemory0 = NULL;
  55. PFNFWPMCALLOUTDELETEBYKEY0          pfnFwpmCalloutDeleteByKey0 = NULL;
  56.  
  57. BOOLEAN LoadAPI()
  58. {
  59.     fwdll = LoadLibrary(_T("Fwpuclnt.dll"));
  60.     if(fwdll) {
  61.         pfnFwpmEngineOpen0 = (PFNFWPMENGINEOPEN0)GetProcAddress(fwdll,"FwpmEngineOpen0");
  62.         pfnFwpmEngineClose0 = (PFNFWPMENGINECLOSE0)GetProcAddress(fwdll,"FwpmEngineClose0");
  63.         pfnFwpmCalloutCreateEnumHandle0 = (PFNFWPMCALLOUTCREATEENUMHANDLE0)GetProcAddress(fwdll,"FwpmCalloutCreateEnumHandle0");
  64.         pfnFwpmCalloutDestroyEnumHandle0 = (PFNFWPMCALLOUTDESTROYENUMHANDLE0)GetProcAddress(fwdll,"FwpmCalloutDestroyEnumHandle0");
  65.         pfnFwpmCalloutEnum0 = (PFNFWPMCALLOUTENUM0)GetProcAddress(fwdll,"FwpmCalloutEnum0");
  66.         pfnFwpmFreeMemory0  = (PFNFWPMFREEMEMORY0)GetProcAddress(fwdll,"FwpmFreeMemory0");
  67.        
  68.         pfnFwpmCalloutDeleteByKey0 = (PFNFWPMCALLOUTDELETEBYKEY0)GetProcAddress(fwdll,"FwpmCalloutDeleteByKey0");
  69.  
  70.         if(pfnFwpmEngineOpen0 &&
  71.             pfnFwpmEngineClose0 &&
  72.             pfnFwpmCalloutCreateEnumHandle0 &&
  73.             pfnFwpmCalloutDestroyEnumHandle0 &&
  74.             pfnFwpmCalloutEnum0 &&
  75.             pfnFwpmFreeMemory0 &&
  76.             pfnFwpmCalloutDeleteByKey0
  77.             ) {
  78.  
  79.             return TRUE;
  80.         }
  81.        
  82.     }
  83.    
  84.    
  85.     return FALSE;
  86. }
  87.  
  88. void UnLoadAPI()
  89. {
  90.     if(fwdll)
  91.         FreeLibrary(fwdll);
  92.     return;
  93. }
  94.  
  95. HANDLE          engineHandle = NULL;
  96. DWORD           result = ERROR_SUCCESS;
  97. HANDLE          enumHandle = 0;
  98. FWPM_CALLOUT0** ppCallouts = 0;
  99. UINT32          numEntries = 0;
  100.  
  101. BOOLEAN HlprFwpmLayerIsUserMode(_In_ const GUID* pLayerKey)
  102. {
  103.    BOOLEAN isUserMode = FALSE;
  104.    
  105.    if(*pLayerKey == FWPM_LAYER_IPSEC_KM_DEMUX_V4 ||
  106.       *pLayerKey == FWPM_LAYER_IPSEC_KM_DEMUX_V6 ||
  107.       *pLayerKey == FWPM_LAYER_IPSEC_V4 ||
  108.       *pLayerKey == FWPM_LAYER_IPSEC_V6 ||
  109.       *pLayerKey == FWPM_LAYER_IKEEXT_V4 ||
  110.       *pLayerKey == FWPM_LAYER_IKEEXT_V6 ||
  111.       *pLayerKey == FWPM_LAYER_RPC_UM ||
  112.       *pLayerKey == FWPM_LAYER_RPC_EPMAP ||
  113.       *pLayerKey == FWPM_LAYER_RPC_EP_ADD ||
  114.       *pLayerKey == FWPM_LAYER_RPC_PROXY_CONN ||
  115.       *pLayerKey == FWPM_LAYER_RPC_PROXY_IF
  116. #if 0
  117. #if(NTDDI_VERSION >= NTDDI_WIN7)
  118.  
  119.       ||
  120.       *pLayerKey == FWPM_LAYER_KM_AUTHORIZATION
  121.  
  122. #endif /// (NTDDI_VERSION >= NTDDI_WIN7)
  123. #endif
  124.     ) {
  125.      isUserMode = TRUE;
  126.    }
  127.  
  128.    return isUserMode;
  129. }
  130.  
  131. UINT32 HlprFwpmCalloutDeleteByKey(_In_ const HANDLE engineHandle,
  132.                                   _In_ const GUID* pCalloutKey)
  133. {
  134.     UINT32 status = NO_ERROR;
  135.  
  136.     if(engineHandle && pCalloutKey) {
  137.  
  138.         status = pfnFwpmCalloutDeleteByKey0(engineHandle, pCalloutKey);
  139.  
  140.         if(status != NO_ERROR) {
  141.  
  142.             if(status != FWP_E_IN_USE &&
  143.                 status != FWP_E_BUILTIN_OBJECT &&
  144.                 status != FWP_E_CALLOUT_NOT_FOUND) {
  145.                
  146.                 //printf("HlprFwpmCalloutDeleteByKey status :%x\n",status);
  147.             } else {
  148.                
  149.                 status = NO_ERROR;
  150.             }
  151.         } else {
  152.  
  153.         }
  154.     } else {
  155.         status = ERROR_INVALID_PARAMETER;
  156.     }
  157.  
  158.     return status;
  159. }
  160.  
  161. #include <locale.h>
  162. BOOLEAN     gbDeleteAll = FALSE;
  163.  
  164. int _tmain(int argc, _TCHAR* argv[])
  165. {
  166.     // Is WinVista or Later Version ?
  167.  
  168.     setlocale(LC_ALL, "");
  169.  
  170.     if(argc == 2) {
  171.         //printf("%s file set\n",argv[1]);
  172.         if(!_tcsicmp(argv[1],_T("-da")) ) {
  173.             gbDeleteAll = TRUE;
  174.         }
  175.     }
  176.  
  177.     if(!LoadAPI()){
  178.         printf("Fwpuclnt.dll load fail\n");
  179.         return 0;
  180.     }
  181.  
  182.        
  183.     printf("Opening the filter engine.\n");
  184.        
  185.     result = pfnFwpmEngineOpen0(
  186.                         NULL,
  187.                         RPC_C_AUTHN_WINNT,
  188.                         NULL,
  189.                         NULL,
  190.                         &engineHandle );
  191.  
  192.     if (result != ERROR_SUCCESS) {
  193.         printf("FwpmEngineOpen0 failed. Return value: %d.\n", result);
  194.         UnLoadAPI();
  195.         return 0;
  196.     } else {
  197.         printf("Filter engine opened successfully.\n");
  198.     }
  199.  
  200.    
  201.  
  202.     result = pfnFwpmCalloutCreateEnumHandle0(engineHandle,
  203.                                             NULL,
  204.                                             &enumHandle);
  205.     if(result != NO_ERROR) {
  206.         enumHandle = 0;
  207.         printf(" FwpmCalloutCreateEnumHandle() [result: %#x]", result);
  208.         pfnFwpmEngineClose0(engineHandle);
  209.         UnLoadAPI();
  210.         return 0;
  211.     }
  212.    
  213.     result = pfnFwpmCalloutEnum0(engineHandle,
  214.                            enumHandle,
  215.                            0xFFFFFFFF,
  216.                            &ppCallouts,
  217.                            &numEntries);
  218.  
  219.     if(result != NO_ERROR) {
  220.         enumHandle = 0;
  221.         printf(" FwpmCalloutEnum() [result: %#x]", result);
  222.         pfnFwpmCalloutDestroyEnumHandle0(engineHandle, enumHandle);
  223.         pfnFwpmEngineClose0(engineHandle);
  224.         UnLoadAPI();
  225.         return 0;
  226.     }
  227.  
  228.     for(UINT32 calloutIndex = 0 ; calloutIndex < numEntries; calloutIndex++) {
  229.        
  230.         if(HlprFwpmLayerIsUserMode(&(ppCallouts[calloutIndex]->applicableLayer))) {
  231.             continue;
  232.         }
  233.         printf(" Callouts[%d] : %S desc:%S\n", calloutIndex, ppCallouts[calloutIndex]->displayData.name,ppCallouts[calloutIndex]->displayData.description);
  234. #if 0      
  235.         if(gbDeleteAll) {
  236.             result = HlprFwpmCalloutDeleteByKey(engineHandle,
  237.                                     &(ppCallouts[calloutIndex]->calloutKey));
  238.             if(result != NO_ERROR) {
  239.                 printf("HlprFwpmCalloutDeleteByKey error status :%x\n",result);
  240.             } else {
  241.                 printf("HlprFwpmCalloutDeleteByKey success status :%x\n",result);
  242.             }
  243.         }
  244. #endif
  245.  
  246.     }
  247.    
  248.     if(ppCallouts)
  249.         pfnFwpmFreeMemory0((void**)&ppCallouts);
  250.  
  251.     pfnFwpmCalloutDestroyEnumHandle0(engineHandle, enumHandle);
  252.    
  253.     printf("enumHandle closed.\n");
  254.  
  255.     pfnFwpmEngineClose0(engineHandle);
  256.    
  257.     printf("Filter engine Handle closed.\n");
  258.  
  259.     UnLoadAPI();
  260.     return 1;
  261. }
Advertisement
Add Comment
Please, Sign In to add comment