{"componentChunkName":"component---src-templates-post-template-js","path":"/a-part-of-anti-virus-3-02","result":{"data":{"markdownRemark":{"id":"c6b104f7-51c5-5f19-b71a-1fb2d16436fd","html":"<p>本章では、前の章で解説した WFP を使用した通信のフィルタリング機能の動作を実際に確認します。</p>\n<p>動作の確認には、指定したレイヤーに様々なフィルターを追加できるユーザーモードプログラムを使用します。</p>\n<p>このサンプルのユーザーモードプログラムのソースコードは以下のリポジトリで公開しています。</p>\n<p>URL: <a href=\"https://github.com/kash1064/book06-wfp-samples\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://github.com/kash1064/book06-wfp-samples</a></p>\n<!-- omit in toc -->\n<h2 id=\"もくじ\" style=\"position:relative;\"><a href=\"#%E3%82%82%E3%81%8F%E3%81%98\" aria-label=\"もくじ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>もくじ</h2>\n<ul>\n<li>\n<p><a href=\"#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E6%A6%82%E8%A6%81\">サンプルプログラムの概要</a></p>\n<ul>\n<li><a href=\"#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B\">プログラムが追加するフィルターを定義する</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#bfe-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B\">BFE を使用してフィルターを登録する</a></p>\n<ul>\n<li><a href=\"#%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%B8%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%96%8B%E3%81%8F\">フィルターエンジンへのセッションを開く</a></li>\n<li><a href=\"#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%99%E3%82%8B\">トランザクションを開始する</a></li>\n<li><a href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B\">カスタムプロバイダーを登録する</a></li>\n<li><a href=\"#%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B\">フィルターを登録する</a></li>\n<li><a href=\"#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%99%E3%82%8B\">トランザクションをコミットする</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E8%AA%BF%E5%81%9C%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\">フィルター調停の動作を確認する</a></p>\n<ul>\n<li><a href=\"#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B\">特定のポート番号への接続をブロックする</a></li>\n<li><a href=\"#%E5%90%8C%E3%81%98%E3%82%B5%E3%83%96%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%86%85%E3%81%A7%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%AE-weight-%E3%81%AE%E5%BD%B1%E9%9F%BF%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\">同じサブレイヤー内でのフィルターの Weight の影響を確認する</a></li>\n<li><a href=\"#%E7%95%B0%E3%81%AA%E3%82%8B%E3%82%B5%E3%83%96%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%AE-weight-%E3%81%AE%E5%BD%B1%E9%9F%BF%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\">異なるサブレイヤーの Weight の影響を確認する</a></li>\n</ul>\n</li>\n<li><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\">まとめ</a></li>\n<li><a href=\"#%E6%9C%AC%E6%9B%B8%E3%81%AE%E3%82%82%E3%81%8F%E3%81%98\">本書のもくじ</a></li>\n</ul>\n<h2 id=\"サンプルプログラムの概要\" style=\"position:relative;\"><a href=\"#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E6%A6%82%E8%A6%81\" aria-label=\"サンプルプログラムの概要 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>サンプルプログラムの概要</h2>\n<p>上記のリポジトリからダウンロードしたサンプルプログラム (UserModeWFPFilter) のコードは、Visual Studio 2022 を使用してビルドできます。</p>\n<p>このプログラムは、以下の 2 つの機能を持ちます。</p>\n<ol>\n<li>プログラムにハードコードされた設定に従い、特定のレイヤーにフィルターを追加する機能</li>\n<li>プログラムで登録したフィルターをすべて削除する機能</li>\n</ol>\n<p>このプログラムで登録されるフィルターはすべて独自の WFP プロバイダーである「Simple WFP User-Mode Provider」に紐づけられます。\nまた、このプロバイダーと紐づくすべてのフィルターを削除することで、設定の復元を行います。</p>\n<p>以下は、このサンプルプログラムを使用してフィルターの追加と削除を実施した際の画面キャプチャです。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 838px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9f8314318c27e798a9baaa4c49ee5270/a1dd2/02-wfp-001.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 65.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABqUlEQVQ4y2WT147CUAxE7yOQUBR6C53QexHi/7/L6IzWWVb7MPLNLePx2Amr1cp2u50RT6eTZVlm4/HYJpOJTadTxTRNtV4sFgLfw+FQqFarFkWRxXEshPl8LsLD4SBsNhuRlMtlK5VK+cVKpaKH7BG/wbnHsFwuRYS6/X5v6/XajsejksxmM5GPRiMpbzabViwW/xHlawgvl4tIAOp47GTb7dZIyLrRaOiMMjlvt9t5BSKMYiG8Xi8DEJ7PZxHc73eRPx4Pez6f2ucb4n6/r4o6nY7UuiVSGkcWOMDkVqulrK6C/cFgIALWlF6v161Wq+We+vpPyXQNf2gOJaKCBN+d9m/uUol3nsSQ/vr50xSagJdEGgOJX0QJHXc1hUJB3jm85HxsUMQM4hEgAab7PGIBpXOPkiEkEf5BSPQ1+4EGXK9XqWN03AKMhxxCFBOxxcslmYN77FFJSJJERP6XQMwFiFF1u93k2/v9FqF/YxETwCSQDDKVDAljgXeUjFqi28AjCFBA8m63q2no9Xr5FOCv+6lfj4d0DHIeUyKAlHOAAvcL4KXje8A/xxpbOdsbCVEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/9f8314318c27e798a9baaa4c49ee5270/8ac56/02-wfp-001.webp 240w,\n/static/9f8314318c27e798a9baaa4c49ee5270/d3be9/02-wfp-001.webp 480w,\n/static/9f8314318c27e798a9baaa4c49ee5270/7820a/02-wfp-001.webp 838w\"\n              sizes=\"(max-width: 838px) 100vw, 838px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/9f8314318c27e798a9baaa4c49ee5270/8ff5a/02-wfp-001.png 240w,\n/static/9f8314318c27e798a9baaa4c49ee5270/e85cb/02-wfp-001.png 480w,\n/static/9f8314318c27e798a9baaa4c49ee5270/a1dd2/02-wfp-001.png 838w\"\n            sizes=\"(max-width: 838px) 100vw, 838px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/9f8314318c27e798a9baaa4c49ee5270/a1dd2/02-wfp-001.png\"\n            alt=\"サンプルプログラムによるフィルターの追加と削除\"\n            title=\"サンプルプログラムによるフィルターの追加と削除\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<h3 id=\"プログラムが追加するフィルターを定義する\" style=\"position:relative;\"><a href=\"#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B\" aria-label=\"プログラムが追加するフィルターを定義する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>プログラムが追加するフィルターを定義する</h3>\n<p>このサンプルプログラムでは、グローバル変数として定義されている <code class=\"language-text\">FILTER_RULES</code> 構造体の配列 rules に要素を追加する形でフィルターを追加することができます。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">struct</span> <span class=\"token class-name\">FILTER_RULES</span>\n<span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">const</span> GUID filterKey<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">const</span> GUID layerKey<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">const</span> GUID subLayerKey<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">const</span> <span class=\"token class-name\">wchar_t</span><span class=\"token operator\">*</span> name<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">const</span> <span class=\"token class-name\">wchar_t</span><span class=\"token operator\">*</span> description<span class=\"token punctuation\">;</span>\n\tUINT16 port<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">const</span> <span class=\"token class-name\">wchar_t</span><span class=\"token operator\">*</span> appPath<span class=\"token punctuation\">;</span>\n\tFWP_ACTION_TYPE action<span class=\"token punctuation\">;</span>\n\tUINT64 weight<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> FILTER_RULES rules<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token punctuation\">{</span> FILTER_KEY_1<span class=\"token punctuation\">,</span> FWPM_LAYER_ALE_AUTH_CONNECT_V4<span class=\"token punctuation\">,</span> FWPM_SUBLAYER_UNIVERSAL<span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Block HTTPS(443)\"</span><span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Block HTTPS(443)\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">443</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> FWP_ACTION_BLOCK<span class=\"token punctuation\">,</span> <span class=\"token number\">0xFFFFFFFFFFFFFFF1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n\t<span class=\"token punctuation\">{</span> FILTER_KEY_2<span class=\"token punctuation\">,</span> FWPM_LAYER_ALE_AUTH_CONNECT_V4<span class=\"token punctuation\">,</span> FWPM_SUBLAYER_UNIVERSAL<span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Allow HTTPS(443)\"</span><span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Allow HTTPS(443)\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">443</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> FWP_ACTION_PERMIT<span class=\"token punctuation\">,</span> <span class=\"token number\">0xFFFFFFFFFFFFFFF2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">FILTER_RULES</code> のメンバーである filterKey や layerKey、subLayerKey などは、\nWFP フィルターに関連づけされる情報である <code class=\"language-text\">FWPM_FILTER0</code> 構造体のメンバーと対応しております。<sup id=\"fnref-1\"><a href=\"#fn-1\" class=\"footnote-ref\">1</a></sup></p>\n<p><code class=\"language-text\">FWPM_FILTER0</code> 構造体は以下の通り定義されており、フィルターの登録に必要な情報が含まれます。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">typedef</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">FWPM_FILTER0_</span> <span class=\"token punctuation\">{</span>\n  GUID                   filterKey<span class=\"token punctuation\">;</span>\n  FWPM_DISPLAY_DATA0     displayData<span class=\"token punctuation\">;</span>\n  UINT32                 flags<span class=\"token punctuation\">;</span>\n  GUID                   <span class=\"token operator\">*</span>providerKey<span class=\"token punctuation\">;</span>\n  FWP_BYTE_BLOB          providerData<span class=\"token punctuation\">;</span>\n  GUID                   layerKey<span class=\"token punctuation\">;</span>\n  GUID                   subLayerKey<span class=\"token punctuation\">;</span>\n  FWP_VALUE0             weight<span class=\"token punctuation\">;</span>\n  UINT32                 numFilterConditions<span class=\"token punctuation\">;</span>\n  FWPM_FILTER_CONDITION0 <span class=\"token operator\">*</span>filterCondition<span class=\"token punctuation\">;</span>\n  FWPM_ACTION0           action<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">union</span> <span class=\"token punctuation\">{</span>\n    UINT64 rawContext<span class=\"token punctuation\">;</span>\n    GUID   providerContextKey<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  GUID                   <span class=\"token operator\">*</span>reserved<span class=\"token punctuation\">;</span>\n  UINT64                 filterId<span class=\"token punctuation\">;</span>\n  FWP_VALUE0             effectiveWeight<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> FWPM_FILTER0<span class=\"token punctuation\">;</span></code></pre></div>\n<p>上記の例では、プログラムにハードコードされている GUID である <code class=\"language-text\">FILTER_KEY_1</code> を filterKey として使用します。\nこの filterKey は、フィルターを一意に識別するために使用されます。</p>\n<p>続くメンバーである layerKey と subLayerKey は、それぞれフィルターを追加するレイヤーとサブレイヤーの GUID を指しています。</p>\n<p>WFP でフィルターを追加できるレイヤーと識別子については公開ドキュメント<sup id=\"fnref-2\"><a href=\"#fn-2\" class=\"footnote-ref\">2</a></sup>で整理されており、\n上記の例で使用している <code class=\"language-text\">FWPM_LAYER_ALE_AUTH_CONNECT_V4</code> は、IPv4 を使用する送信側の TCP 接続要求を監査可能な ALE レイヤーを指定しています。</p>\n<p>また、<code class=\"language-text\">FWPM_SUBLAYER_UNIVERSAL</code> は既定のサブレイヤーの識別子であり、他のどのサブレイヤーにも割り当てられていないすべてのフィルターをホストするサブレイヤーを指定しています。<sup id=\"fnref-3\"><a href=\"#fn-3\" class=\"footnote-ref\">3</a></sup></p>\n<p>name と description メンバーは、どちらもフィルターの displayData に使用する情報です。これは、<code class=\"language-text\">FWPM_DISPLAY_DATA0</code> 構造体として定義されています。<sup id=\"fnref-4\"><a href=\"#fn-4\" class=\"footnote-ref\">4</a></sup></p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">typedef</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">FWPM_DISPLAY_DATA0_</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token class-name\">wchar_t</span> <span class=\"token operator\">*</span>name<span class=\"token punctuation\">;</span>\n  <span class=\"token class-name\">wchar_t</span> <span class=\"token operator\">*</span>description<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> FWPM_DISPLAY_DATA0<span class=\"token punctuation\">;</span></code></pre></div>\n<p>ここで指定した「Block HTTPS(443)」などの名前はフィルター名として登録され、\nWFP Explorer などのツールを用いてフィルターの一覧を参照することで確認できます。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 742px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9bf3b23e36d2edc6559fef4fd4d797dc/0f2bc/02-wfp-002.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 34.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABT0lEQVQoz3WR2Y7bMAxF/f8/0of+RPvWpwIDTNMZ2PEiWfK+TeQkXpJT2sEADdASuBAlEEfkpWdtRlmW5HlOWeQYY6jrmkLuVVUy3+8s68r9duMuObse+b/k5QLJBGqMpRBwEBz3D3RqeXsPWaqKTBnmFVYBTwtcRcv6gG9vz0CX0TcdWVnz7SXlNSnwS0tQdBxSx8+vX5h+f2dIXnjLL6jW8iNIaNoC13dYa2mahi12YKwtSRTTyJhH6TSOFSo1BHbAStcHrYkyi40ClDbY9gPfD8jlbatRcULf9zvsJrZ4YaiZ54nL9cr5OnIeR5xztB9n3MkxuhPlcGI8XzgNA5GydINjWWR8GXtZFqZpFsZDnq+OtFWDTpR4mXPbTP9PbH4Z6bgWXz/Vdf1TjXc8/NoX4r/7hGG0b/TTj7+1xTRNGLHD6BStNFrOLMuf6v8AHdMUblhfcG0AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/9bf3b23e36d2edc6559fef4fd4d797dc/8ac56/02-wfp-002.webp 240w,\n/static/9bf3b23e36d2edc6559fef4fd4d797dc/d3be9/02-wfp-002.webp 480w,\n/static/9bf3b23e36d2edc6559fef4fd4d797dc/28367/02-wfp-002.webp 742w\"\n              sizes=\"(max-width: 742px) 100vw, 742px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/9bf3b23e36d2edc6559fef4fd4d797dc/8ff5a/02-wfp-002.png 240w,\n/static/9bf3b23e36d2edc6559fef4fd4d797dc/e85cb/02-wfp-002.png 480w,\n/static/9bf3b23e36d2edc6559fef4fd4d797dc/0f2bc/02-wfp-002.png 742w\"\n            sizes=\"(max-width: 742px) 100vw, 742px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/9bf3b23e36d2edc6559fef4fd4d797dc/0f2bc/02-wfp-002.png\"\n            alt=\"登録したフィルター名の参照\"\n            title=\"登録したフィルター名の参照\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>port と appPath メンバーは、それぞれフィルターの条件に使用するポート番号やアプリケーションのパス名を指定するために使用します。</p>\n<p>前述の例では、ポート番号 443 のみをフィルターの条件として使用しており、アプリケーションパスについては条件に含まないため appPath には NULL を指定しています。</p>\n<p>最後のメンバーである action と weight は、それぞれフィルターの条件に合致した場合のアクションとフィルターの重みを指定するための値です。</p>\n<p>action はフィルターの条件に合致した場合のアクションを定義した <code class=\"language-text\">FWPM_ACTION0</code> に含まれる <code class=\"language-text\">FWP_ACTION_TYPE</code> 列挙型の値を指定するものであり、<code class=\"language-text\">FWP_ACTION_BLOCK</code> はトラフィックのブロック、<code class=\"language-text\">FWP_ACTION_PERMIT</code> はトラフィックの許可を意味します。<sup id=\"fnref-5\"><a href=\"#fn-5\" class=\"footnote-ref\">5</a></sup></p>\n<p>また、本章で使用するサンプルプログラムでは扱いませんが、Callout ドライバーを使用する場合は <code class=\"language-text\">FWP_ACTION_CALLOUT_TERMINATING</code> や <code class=\"language-text\">FWP_ACTION_CALLOUT_INSPECTION</code>、または <code class=\"language-text\">FWP_ACTION_CALLOUT_UNKNOWN</code> などを type として使用する場合があります。</p>\n<p>weight メンバーは <code class=\"language-text\">FWPM_FILTER0</code> 構造体の weight として使用する値であり、サブレイヤー内でのフィルターの優先度 (重み) を指定します。\nweight には <code class=\"language-text\">FWP_UINT64</code> や <code class=\"language-text\">FWP_UINT8</code> などの型を使用できますが、今回のサンプルプログラムでは <code class=\"language-text\">FWP_UINT64</code> を使用しています。</p>\n<p>本章で使用するサンプルプログラムにおける <code class=\"language-text\">FILTER_RULES</code> 構造体の定義は以上の通りです。</p>\n<p>本章では、WFP によるネットワークトラフィックのフィルタリングの動作確認のために、\n<code class=\"language-text\">FILTER_RULES</code> 構造体の配列 rules にルールの追加や削除を行った後にプログラムを再ビルドすることで様々なフィルターをシステムに登録します。</p>\n<p>例えば、<code class=\"language-text\">FWPM_LAYER_ALE_AUTH_CONNECT_V4</code> レイヤーのサブレイヤー <code class=\"language-text\">FWPM_SUBLAYER_UNIVERSAL</code> に対して、\nMicrosoft Edge によるアウトバウンドアクセスをすべてブロックするようなフィルターを追加したい場合は、rules 配列に以下の要素を追加します。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token punctuation\">{</span> FILTER_KEY_3<span class=\"token punctuation\">,</span> FWPM_LAYER_ALE_AUTH_CONNECT_V4<span class=\"token punctuation\">,</span> FWPM_SUBLAYER_UNIVERSAL<span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Block Edge\"</span><span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Block Edge\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> L<span class=\"token string\">\"C:\\\\Program Files (x86)\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe\"</span><span class=\"token punctuation\">,</span> FWP_ACTION_BLOCK<span class=\"token punctuation\">,</span> <span class=\"token number\">0xFFFFFFFFFFFFFFF1</span> <span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"bfe-を使用してフィルターを登録する\" style=\"position:relative;\"><a href=\"#bfe-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B\" aria-label=\"bfe を使用してフィルターを登録する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>BFE を使用してフィルターを登録する</h2>\n<p>WFP で使用するフィルターの追加や削除は、主にユーザーモードサービスである Base Filtering Engine (BFE) により行われます。</p>\n<p>アプリケーションは、プラットフォームが提供している管理機能をインターフェースとして BFE と通信し、\nフィルターの追加や削除などの様々な操作を行うことができます。<sup id=\"fnref-6\"><a href=\"#fn-6\" class=\"footnote-ref\">6</a></sup></p>\n<p>以下は、本章で使用するサンプルプログラムがフィルターの追加や削除を行う際の一連の操作をまとめたものです。</p>\n<ol>\n<li>FwpmEngineOpen0 関数を使用してフィルターエンジンへのセッションを開きます。</li>\n<li>セッションでトランザクションを開始します。</li>\n<li>カスタムプロバイダーを登録します。</li>\n<li>登録したカスタムプロバイダーと紐づけてフィルターの登録を行います。</li>\n<li>すべてのフィルターを登録したら、トランザクションをコミットして変更を反映します。</li>\n</ol>\n<p>以下に、各ステップの詳細を解説します。</p>\n<h3 id=\"フィルターエンジンへのセッションを開く\" style=\"position:relative;\"><a href=\"#%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%B8%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%96%8B%E3%81%8F\" aria-label=\"フィルターエンジンへのセッションを開く permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>フィルターエンジンへのセッションを開く</h3>\n<p>WFP で通信をフィルタリングするためのフィルターを登録するためにはまず、フィルターエンジンへのセッションを開く必要があります。</p>\n<p>WFP のほとんどの関数呼び出しはセッションのコンテキストの中で実行されます。\nセッションはクライアントが FwpmEngineClose0 関数を呼び出すか、クライアントのプロセスが終了した際に破棄されます。<sup id=\"fnref-7\"><a href=\"#fn-7\" class=\"footnote-ref\">7</a></sup></p>\n<p>フィルターエンジンへのセッションを開く操作は、サンプルプログラム内では OpenFilterEngine 関数として実装しており、\nFwpmEngineOpen0 関数を使用して開いたセッションへのハンドルを engineHandle に保存しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">DWORD <span class=\"token function\">OpenFilterEngine</span><span class=\"token punctuation\">(</span>\n    HANDLE<span class=\"token operator\">*</span> engineHandle\n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>engineHandle <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> ERROR_INVALID_PARAMETER<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token keyword\">return</span> <span class=\"token function\">FwpmEngineOpen0</span><span class=\"token punctuation\">(</span>\n\t\t<span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n\t\tRPC_C_AUTHN_WINNT<span class=\"token punctuation\">,</span>\n\t\t<span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n\t\t<span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span>\n\t\tengineHandle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>FwpmEngineOpen0 関数は、フィルターエンジンへのセッションを開くために使用する関数で、以下の通り定義されています。<sup id=\"fnref-8\"><a href=\"#fn-8\" class=\"footnote-ref\">8</a></sup></p>\n<p>開かれたフィルターエンジンへのセッションのハンドルは engineHandle に返されます。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">DWORD <span class=\"token function\">FwpmEngineOpen0</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">,</span> optional<span class=\"token punctuation\">]</span> <span class=\"token keyword\">const</span> <span class=\"token class-name\">wchar_t</span>             <span class=\"token operator\">*</span>serverName<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">]</span>           UINT32                    authnService<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">,</span> optional<span class=\"token punctuation\">]</span> SEC_WINNT_AUTH_IDENTITY_W <span class=\"token operator\">*</span>authIdentity<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">,</span> optional<span class=\"token punctuation\">]</span> <span class=\"token keyword\">const</span> FWPM_SESSION0       <span class=\"token operator\">*</span>session<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>out<span class=\"token punctuation\">]</span>          HANDLE                    <span class=\"token operator\">*</span>engineHandle\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>2 番目のパラメーターの authnService は、使用する認証サービスを指定するものです。</p>\n<p>また、authIdentity はフィルターエンジンへのアクセスに使用する認証および認可の資格情報を指定可能なパラメーターですが、\nNULL を指定することが可能であり、NULL を指定した場合は呼び出し元のスレッドの資格情報が使用されます。</p>\n<h3 id=\"トランザクションを開始する\" style=\"position:relative;\"><a href=\"#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%99%E3%82%8B\" aria-label=\"トランザクションを開始する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>トランザクションを開始する</h3>\n<p>フィルターエンジンへのセッションを開いたら、FwpmTransactionBegin0 関数を使用して現在のセッション内で明示的にトランザクションを開始します。</p>\n<p>このトランザクションは厳格な ACID 特性（原子性、一貫性、独立性、永続性）を強制するものであり、\nもしトランザクションの実行中にセッションが終了した場合には、そのトランザクションは自動的に中止されます。<sup id=\"fnref-9\"><a href=\"#fn-9\" class=\"footnote-ref\">9</a></sup></p>\n<p>トランザクションを開始する FwpmTransactionBegin0 関数は以下の通り定義されており、\nFwpmEngineOpen0 関数で取得した engineHandle をパラメーターとして受け取って実行します。<sup id=\"fnref-10\"><a href=\"#fn-10\" class=\"footnote-ref\">10</a></sup></p>\n<p>また、第 2 パラメーターの flags は、トランザクションが「読み取り/書き込みトランザクション」か、「読み取り専用トランザクション」かを指定する値です。</p>\n<p>サンプルプログラムでは「読み取り/書き込みトランザクション」を開始するため、flags には 0 を使用しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">DWORD <span class=\"token function\">FwpmTransactionBegin0</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">]</span> HANDLE engineHandle<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">]</span> UINT32 flags\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"カスタムプロバイダーを登録する\" style=\"position:relative;\"><a href=\"#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B\" aria-label=\"カスタムプロバイダーを登録する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>カスタムプロバイダーを登録する</h3>\n<p>このサンプルプログラムでは、「Simple WFP User-Mode Provider」という名前のカスタムプロバイダーを登録します。</p>\n<p>プロバイダーの登録には FwpmProviderAdd0 関数を使用します。<sup id=\"fnref-11\"><a href=\"#fn-11\" class=\"footnote-ref\">11</a></sup>\nこの関数は、<code class=\"language-text\">FWPM_PROVIDER0</code> 構造体で定義されたプロバイダー情報を引数として受け取ります。<sup id=\"fnref-12\"><a href=\"#fn-12\" class=\"footnote-ref\">12</a></sup></p>\n<p>また、3 つ目のパラメーターである sd では、追加するプロバイダーオブジェクトに対するセキュリティディスクリプタを指定できますが、\n今回のサンプルプログラムでは既定のセキュリティディスクリプタを使用する NULL を指定しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">typedef</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">FWPM_PROVIDER0_</span> <span class=\"token punctuation\">{</span>\n  GUID               providerKey<span class=\"token punctuation\">;</span>\n  FWPM_DISPLAY_DATA0 displayData<span class=\"token punctuation\">;</span>\n  UINT32             flags<span class=\"token punctuation\">;</span>\n  FWP_BYTE_BLOB      providerData<span class=\"token punctuation\">;</span>\n  <span class=\"token class-name\">wchar_t</span>            <span class=\"token operator\">*</span>serviceName<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> FWPM_PROVIDER0<span class=\"token punctuation\">;</span>\n\nDWORD <span class=\"token function\">FwpmProviderAdd0</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">]</span>           HANDLE               engineHandle<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">]</span>           <span class=\"token keyword\">const</span> FWPM_PROVIDER0 <span class=\"token operator\">*</span>provider<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">,</span> optional<span class=\"token punctuation\">]</span> PSECURITY_DESCRIPTOR sd\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>以下が、サンプルプログラムにおけるカスタムプロバイダーの登録部分の抜粋箇所です。</p>\n<p>DefineProvider 関数にて、<code class=\"language-text\">FWPM_PROVIDER0</code> 構造体のオブジェクト provider に <code class=\"language-text\">PROVIDER_KEY</code> として定義した GUID やプロバイダー名などの情報を与えています。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> <span class=\"token function\">DefineProvider</span><span class=\"token punctuation\">(</span>FWPM_PROVIDER0<span class=\"token operator\">*</span> provider<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>provider <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\tprovider<span class=\"token operator\">-></span>providerKey <span class=\"token operator\">=</span> PROVIDER_KEY<span class=\"token punctuation\">;</span>\n\tprovider<span class=\"token operator\">-></span>displayData<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">wchar_t</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>L<span class=\"token string\">\"Simple WFP User-Mode Provider\"</span><span class=\"token punctuation\">;</span>\n\tprovider<span class=\"token operator\">-></span>displayData<span class=\"token punctuation\">.</span>description <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">wchar_t</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>L<span class=\"token string\">\"Provider for simple WFP user-mode filter example.\"</span><span class=\"token punctuation\">;</span>\n\tprovider<span class=\"token operator\">-></span>flags <span class=\"token operator\">=</span> FWPM_PROVIDER_FLAG_PERSISTENT<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* 省略 */</span>\n\n<span class=\"token function\">DefineProvider</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>provider<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nresult <span class=\"token operator\">=</span> <span class=\"token function\">FwpmProviderAdd0</span><span class=\"token punctuation\">(</span>engineHandle<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>provider<span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>result <span class=\"token operator\">==</span> FWP_E_ALREADY_EXISTS<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Provider already exists. Continuing...\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\tresult <span class=\"token operator\">=</span> ERROR_SUCCESS<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>result <span class=\"token operator\">!=</span> ERROR_SUCCESS<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Error: ProviderAdd failed (0x%x)\\n\"</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token function\">CleanupWfp</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>engineHandle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"フィルターを登録する\" style=\"position:relative;\"><a href=\"#%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B\" aria-label=\"フィルターを登録する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>フィルターを登録する</h3>\n<p>カスタムプロバイダーの登録が完了したら、前述した <code class=\"language-text\">FILTER_RULES</code> 構造体の配列 rules の情報を元にフィルターを登録します。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">auto</span><span class=\"token operator\">&amp;</span> rule <span class=\"token operator\">:</span> rules<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n   FWPM_FILTER0 filter <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n   FWPM_FILTER_CONDITION0 condition<span class=\"token punctuation\">[</span><span class=\"token number\">9</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n   UINT32 conditionCount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n   <span class=\"token function\">DefineFilterConditions</span><span class=\"token punctuation\">(</span>\n      condition<span class=\"token punctuation\">,</span> \n      rule<span class=\"token punctuation\">.</span>port<span class=\"token punctuation\">,</span> \n      rule<span class=\"token punctuation\">.</span>appPath<span class=\"token punctuation\">,</span> \n      <span class=\"token operator\">&amp;</span>conditionCount\n   <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n   <span class=\"token function\">BuildFilter</span><span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&amp;</span>filter<span class=\"token punctuation\">,</span> \n      condition<span class=\"token punctuation\">,</span> \n      conditionCount<span class=\"token punctuation\">,</span> \n      rule<span class=\"token punctuation\">,</span> \n      PROVIDER_KEY\n   <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n   UINT64 filterId <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n   result <span class=\"token operator\">=</span> <span class=\"token function\">AddFilterObject</span><span class=\"token punctuation\">(</span>\n      engineHandle<span class=\"token punctuation\">,</span> \n      <span class=\"token operator\">&amp;</span>filter<span class=\"token punctuation\">,</span> \n      <span class=\"token operator\">&amp;</span>filterId\n   <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n   <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>result <span class=\"token operator\">!=</span> ERROR_SUCCESS<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Error: FwpmFilterAdd0 failed. Code: 0x%x\\n\"</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n   <span class=\"token function\">FwpmTransactionAbort0</span><span class=\"token punctuation\">(</span>engineHandle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n   <span class=\"token function\">CleanupWfp</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>engineHandle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n   <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n   <span class=\"token punctuation\">}</span>\n\n   <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Added filter '%S' (ID: %llu)\\n\"</span><span class=\"token punctuation\">,</span> rule<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">,</span> filterId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>ループ処理の中で初めに呼び出される DefineFilterConditions 関数では、\nフィルターの条件を定義する <code class=\"language-text\">FWPM_FILTER_CONDITION0</code> 構造体のオブジェクトを作成しています。<sup id=\"fnref-13\"><a href=\"#fn-13\" class=\"footnote-ref\">13</a></sup></p>\n<p>この構造体は以下の通り定義されており、<code class=\"language-text\">FWP_MATCH_TYPE</code> 列挙型<sup id=\"fnref-14\"><a href=\"#fn-14\" class=\"footnote-ref\">14</a></sup>と <code class=\"language-text\">FWP_CONDITION_VALUE0</code> 構造体<sup id=\"fnref-15\"><a href=\"#fn-15\" class=\"footnote-ref\">15</a></sup>をメンバーに含みます。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">typedef</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">FWPM_FILTER_CONDITION0_</span> <span class=\"token punctuation\">{</span>\n  GUID                 fieldKey<span class=\"token punctuation\">;</span>\n  FWP_MATCH_TYPE       matchType<span class=\"token punctuation\">;</span>\n  FWP_CONDITION_VALUE0 conditionValue<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> FWPM_FILTER_CONDITION0<span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">FWPM_FILTER_CONDITION0</code> 構造体の 1 つ目のメンバーである fieldKey には、\n登録するフィルターの条件として使用する GUID を指定します。</p>\n<p>ここで使用可能なキーはフィルター条件識別子として定義されています。<sup id=\"fnref-16\"><a href=\"#fn-16\" class=\"footnote-ref\">16</a></sup></p>\n<p>例えば、宛先のポート番号をフィルター条件に使用する場合は <code class=\"language-text\">FWPM_CONDITION_IP_REMOTE_PORT</code> を、\n通信元のアプリケーションのパスを条件に使用する場合は <code class=\"language-text\">FWPM_CONDITION_ALE_APP_ID</code> を使用できます。</p>\n<p><code class=\"language-text\">FWP_MATCH_TYPE</code> 列挙型はフィルターの条件に使用される様々なマッチングの種類を定義します。</p>\n<p>サンプルプログラムで追加するフィルターでは基本的に <code class=\"language-text\">FWP_MATCH_EQUAL</code> を使用しており、\nシンプルに設定された値が条件と合致するかどうかを判断するフィルターとして機能します。</p>\n<p>フィルター条件に使用する <code class=\"language-text\">FWP_MATCH_TYPE</code> 列挙型によっては、\n値が条件として設定されたものより大きい場合や小さい場合を判断するフィルターなどを柔軟に作成できます。</p>\n<p>一方で <code class=\"language-text\">FWP_CONDITION_VALUE0</code> 構造体には、フィルター条件を照合する際に使用される値の情報が含まれます。</p>\n<p>もし fieldKey に <code class=\"language-text\">FWPM_CONDITION_IP_REMOTE_PORT</code> を使用している場合は、\n以下のように条件に使用する宛先ポート番号の整数値を登録します。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">conditionValue<span class=\"token punctuation\">.</span>type <span class=\"token operator\">=</span> FWP_UINT16<span class=\"token punctuation\">;</span>\nconditionValue<span class=\"token punctuation\">.</span>uint16 <span class=\"token operator\">=</span> remotePort<span class=\"token punctuation\">;</span></code></pre></div>\n<p>フィルターの条件を定義する <code class=\"language-text\">FWPM_FILTER_CONDITION0</code> 構造体のオブジェクトを作成したら、\n続いて <code class=\"language-text\">FWPM_FILTER0</code> 構造体のオブジェクトを作成します。</p>\n<p>この構造体は、フィルターの状態を含むものであり、以下のように定義されています。<sup id=\"fnref-17\"><a href=\"#fn-17\" class=\"footnote-ref\">17</a></sup></p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">typedef</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">FWPM_FILTER0_</span> <span class=\"token punctuation\">{</span>\n  GUID                   filterKey<span class=\"token punctuation\">;</span>\n  FWPM_DISPLAY_DATA0     displayData<span class=\"token punctuation\">;</span>\n  UINT32                 flags<span class=\"token punctuation\">;</span>\n  GUID                   <span class=\"token operator\">*</span>providerKey<span class=\"token punctuation\">;</span>\n  FWP_BYTE_BLOB          providerData<span class=\"token punctuation\">;</span>\n  GUID                   layerKey<span class=\"token punctuation\">;</span>\n  GUID                   subLayerKey<span class=\"token punctuation\">;</span>\n  FWP_VALUE0             weight<span class=\"token punctuation\">;</span>\n  UINT32                 numFilterConditions<span class=\"token punctuation\">;</span>\n  FWPM_FILTER_CONDITION0 <span class=\"token operator\">*</span>filterCondition<span class=\"token punctuation\">;</span>\n  FWPM_ACTION0           action<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">union</span> <span class=\"token punctuation\">{</span>\n    UINT64 rawContext<span class=\"token punctuation\">;</span>\n    GUID   providerContextKey<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  GUID                   <span class=\"token operator\">*</span>reserved<span class=\"token punctuation\">;</span>\n  UINT64                 filterId<span class=\"token punctuation\">;</span>\n  FWP_VALUE0             effectiveWeight<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> FWPM_FILTER0<span class=\"token punctuation\">;</span></code></pre></div>\n<p>サンプルプログラムでは、BuildFilter 関数を用いて <code class=\"language-text\">FWPM_FILTER0</code> 構造体のオブジェクト filter を作成しています。</p>\n<p>ここで登録している値は、フィルターの名前や説明、レイヤーやサブレイヤーの GUID やフィルターのアクションなど、\nほとんどが <code class=\"language-text\">FILTER_RULES</code> のメンバーとしてグローバル変数で定義した値です。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> <span class=\"token function\">BuildFilter</span><span class=\"token punctuation\">(</span>\n\tFWPM_FILTER0<span class=\"token operator\">*</span> filter<span class=\"token punctuation\">,</span>\n\tFWPM_FILTER_CONDITION0<span class=\"token operator\">*</span> condition<span class=\"token punctuation\">,</span>\n\tUINT32 conditionCount<span class=\"token punctuation\">,</span>\n\t<span class=\"token keyword\">const</span> FILTER_RULES<span class=\"token operator\">&amp;</span> rule<span class=\"token punctuation\">,</span>\n\t<span class=\"token keyword\">const</span> GUID<span class=\"token operator\">&amp;</span> providerKey<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>filter <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span> <span class=\"token operator\">||</span> condition <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span> <span class=\"token operator\">||</span> conditionCount <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\tfilter<span class=\"token operator\">-></span>displayData<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">wchar_t</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>rule<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>displayData<span class=\"token punctuation\">.</span>description <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">wchar_t</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>rule<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>filterKey <span class=\"token operator\">=</span> rule<span class=\"token punctuation\">.</span>filterKey<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>providerKey <span class=\"token operator\">=</span> const_cast<span class=\"token operator\">&lt;</span>GUID<span class=\"token operator\">*</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>providerKey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>layerKey <span class=\"token operator\">=</span> rule<span class=\"token punctuation\">.</span>layerKey<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>subLayerKey <span class=\"token operator\">=</span> rule<span class=\"token punctuation\">.</span>subLayerKey<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>action<span class=\"token punctuation\">.</span>type <span class=\"token operator\">=</span> rule<span class=\"token punctuation\">.</span>action<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>weight<span class=\"token punctuation\">.</span>type <span class=\"token operator\">=</span> FWP_UINT64<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>weight<span class=\"token punctuation\">.</span>uint64 <span class=\"token operator\">=</span> const_cast<span class=\"token operator\">&lt;</span>UINT64<span class=\"token operator\">*</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>rule<span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>numFilterConditions <span class=\"token operator\">=</span> conditionCount<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>filterCondition <span class=\"token operator\">=</span> condition<span class=\"token punctuation\">;</span>\n\tfilter<span class=\"token operator\">-></span>flags <span class=\"token operator\">=</span> FWPM_FILTER_FLAG_PERSISTENT<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">FWPM_FILTER0</code> 構造体のオブジェクトを作成したら、最後に FwpmFilterAdd0 関数を使用してフィルターの登録を行います。</p>\n<p>FwpmFilterAdd0 関数は新しいフィルターをシステムに登録するために用意された関数であり、\nセッションへのハンドルと <code class=\"language-text\">FWPM_FILTER0</code> 構造体オブジェクトをパラメーターとして呼び出されます。<sup id=\"fnref-18\"><a href=\"#fn-18\" class=\"footnote-ref\">18</a></sup></p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">DWORD <span class=\"token function\">FwpmFilterAdd0</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">]</span>            HANDLE               engineHandle<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">]</span>            <span class=\"token keyword\">const</span> FWPM_FILTER0   <span class=\"token operator\">*</span>filter<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">,</span> optional<span class=\"token punctuation\">]</span>  PSECURITY_DESCRIPTOR sd<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">[</span>out<span class=\"token punctuation\">,</span> optional<span class=\"token punctuation\">]</span> UINT64               <span class=\"token operator\">*</span>id\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"トランザクションをコミットする\" style=\"position:relative;\"><a href=\"#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%99%E3%82%8B\" aria-label=\"トランザクションをコミットする permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>トランザクションをコミットする</h3>\n<p>すべてのフィルター登録が完了したら、FwpmTransactionCommit0 関数を呼び出して開始したトランザクションをコミットします。<sup id=\"fnref-19\"><a href=\"#fn-19\" class=\"footnote-ref\">19</a></sup></p>\n<p>これで、ユーザーモードプログラムによるフィルターの登録が完了します。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">result <span class=\"token operator\">=</span> <span class=\"token function\">FwpmTransactionCommit0</span><span class=\"token punctuation\">(</span>engineHandle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>result <span class=\"token operator\">!=</span> ERROR_SUCCESS<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Error: Commit failed (0x%x)\\n\"</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token function\">FwpmTransactionAbort0</span><span class=\"token punctuation\">(</span>engineHandle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"SUCCESS: Persistent filters added.\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"フィルター調停の動作を確認する\" style=\"position:relative;\"><a href=\"#%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E8%AA%BF%E5%81%9C%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\" aria-label=\"フィルター調停の動作を確認する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>フィルター調停の動作を確認する</h2>\n<p>ユーザーモードで動作するサンプルプログラムによりフィルターを追加する挙動を確認したので、\nここからは実際にこのサンプルプログラムを使用して様々なフィルタリング動作を確認していきます。</p>\n<h3 id=\"特定のポート番号への接続をブロックする\" style=\"position:relative;\"><a href=\"#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B\" aria-label=\"特定のポート番号への接続をブロックする permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>特定のポート番号への接続をブロックする</h3>\n<p>まずはサンプルプログラムで定義している <code class=\"language-text\">FILTER_RULES</code> にて以下の条件を指定したフィルターを追加します。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token punctuation\">{</span> \n  FILTER_KEY_1<span class=\"token punctuation\">,</span> \n  FWPM_LAYER_ALE_AUTH_CONNECT_V4<span class=\"token punctuation\">,</span> \n  FWPM_SUBLAYER_UNIVERSAL<span class=\"token punctuation\">,</span> \n  L<span class=\"token string\">\"Block HTTPS(443)\"</span><span class=\"token punctuation\">,</span> \n  L<span class=\"token string\">\"Block HTTPS(443)\"</span><span class=\"token punctuation\">,</span> \n  <span class=\"token number\">443</span><span class=\"token punctuation\">,</span> \n  <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> \n  FWP_ACTION_BLOCK<span class=\"token punctuation\">,</span> \n  <span class=\"token number\">0xFFFFFFFFFFFFFFF1</span> \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>このフィルターを登録した際のイベントを wfpdiag で確認してみると、\n以下のようにリモートポート番号 443 への通信をすべてブロックする条件を持つフィルターが\n<code class=\"language-text\">FWPM_LAYER_ALE_AUTH_CONNECT_V4</code> レイヤーに追加されたことを確認できます。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 934px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e3955086711c05348f2c11c0e65119f7/078fe/02-wfp-003.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC8UlEQVQ4y41UaU/bUBDk//+TfkRCqlBLVVFaoAg1DeEmiZ3DV3zfjpM3nbU54hCkPmm1+3zMzp57ea7guoDvtzqK1sjzFGVZUhcoiqKxiyJHVa2wXIJ3hfVaQSkRvGo5e7xCZLFQmEwA16tp+7AsG4Yxx3w+g21b8LwQcbymAEmCjaPeLJp7L57kRRAomCZgUXq9Pi4ve+j3rzEY3NCZDV13oWkLOrIaZ+KEAdCBQpY/M2zp8kGmyEpAQRYVHMdBGFUNqyxbYbWqUdd1o5eMu6oq2iusV6BWlC1A8SLsRJf0mkUpItdHnqSIowhhGDC/IR0GzLXHtCx4T5hPQOogugMoIaepAtOFu3GMs9k1jseXuBj1MZ7oMO2QQDF/zvgdndFJUZRk3RZJitUBFKkqBccGxtMS9wQ4MW5xoJ3geNbDI3MWBSXKiuyzVtbrzaK0le4A0ikZMo+6B284RWyRTSSMEiRxG3bCFAibFux9pTuAcSyFAfNTsYomNF1jZXW2zrzRjc3nrptQfDqRKq86eewAOrbCbAaMRks8PdkYDkdsE43gBqbTaWOLNk2b4vO533SAAEmXFNuANgFJAqZV4653gZsf+xgc7+P25wEezj7jz9EnTB5v4fkSBdiHeJ6QD0JeLsmSHxpGRnZP+HvVhz51YJgJ28VvRo/t1xSP3fdciO74dQDDUEJWjWfbiREQvSSd1OXYBTnY01DrDqH3o7fdNjJ+rquQy0hFOXTtBtp0iNFsgpnHPJrMqzXGyBgiTouGcVFsLIdNwJdF4Xnt1DyMIux/P8Th6Rd8PT/E0e9vOLu+wq+rK5wO+gjitJllqfBOwJdFIUxllel6hfvbCSbaHIG/RNrZMv8RsryUQS/ylqXDlTYeu1xpBZK0daSYxDfZsQ83AaWX/KBll7OnlqttJi8AeCaA1/vOthHABcHmeobrnzZuTi3cnRvQBi7SrF0Cm6C7TgdQfpCGtcwas1EO18wROhliv2yqWddvgB+df94iA+GuPtdDAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/e3955086711c05348f2c11c0e65119f7/8ac56/02-wfp-003.webp 240w,\n/static/e3955086711c05348f2c11c0e65119f7/d3be9/02-wfp-003.webp 480w,\n/static/e3955086711c05348f2c11c0e65119f7/7d4d8/02-wfp-003.webp 934w\"\n              sizes=\"(max-width: 934px) 100vw, 934px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/e3955086711c05348f2c11c0e65119f7/8ff5a/02-wfp-003.png 240w,\n/static/e3955086711c05348f2c11c0e65119f7/e85cb/02-wfp-003.png 480w,\n/static/e3955086711c05348f2c11c0e65119f7/078fe/02-wfp-003.png 934w\"\n            sizes=\"(max-width: 934px) 100vw, 934px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/e3955086711c05348f2c11c0e65119f7/078fe/02-wfp-003.png\"\n            alt=\"フィルターの追加イベント\"\n            title=\"フィルターの追加イベント\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>さらに、このフィルターの filterId である 71431 で処理されたイベントを確認すると、\n様々なアプリケーションによる 443 ポート宛ての通信がこのフィルターでドロップされたことを確認できます。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/13fb775b58a93530e19a1e190a005ac6/b1ffc/02-wfp-004.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 59.583333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABcklEQVQoz5VT2W6DMBDM//9b36omaVpxX8FcBgeDwdPBadK+lSKNWK2s8ezM+jAMC0ph0TUTmlJAlBXqpkbTtBgGg9ttxbrux8Fag6paEfsjvHOI8ylAGKbszahrg2k2WBYDY/bhAFi0LRBFwMdnTrIKaSqpDFSIf38kXCElUBQL0VGVJpHGOCoHpe7oe8l+z/8dA2+71/LZ2+AUKmWR54bKCnjeBUHgw/ci1iEVh+ynyLIS1ys9FiXtqJ4QQjg8aqeQ/iMIgTBqSZIhjpXzT0rN0UdM00Qfd47MYFAWGlncoLq2mG8So+pI0jE1++uohbV/42Bm4D1RePEvOGZHnEWAtPOhhghaG2wX/pD9TexGLhjKK1N+izVOORALuJQ3ggfRHnXfhNtSM5QEuGYKkZ8j8GokScUkZ+gRHP+hboeH1q5MyDIUyxS5zI3hK1nRUXXfW2iSLYvdr1BK41ZGVIZ7t1ANX8c0O/82jKPBPO9/KV9gqKS1hoJi9gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/13fb775b58a93530e19a1e190a005ac6/8ac56/02-wfp-004.webp 240w,\n/static/13fb775b58a93530e19a1e190a005ac6/d3be9/02-wfp-004.webp 480w,\n/static/13fb775b58a93530e19a1e190a005ac6/e46b2/02-wfp-004.webp 960w,\n/static/13fb775b58a93530e19a1e190a005ac6/f992d/02-wfp-004.webp 1440w,\n/static/13fb775b58a93530e19a1e190a005ac6/2ead8/02-wfp-004.webp 1492w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/13fb775b58a93530e19a1e190a005ac6/8ff5a/02-wfp-004.png 240w,\n/static/13fb775b58a93530e19a1e190a005ac6/e85cb/02-wfp-004.png 480w,\n/static/13fb775b58a93530e19a1e190a005ac6/d9199/02-wfp-004.png 960w,\n/static/13fb775b58a93530e19a1e190a005ac6/07a9c/02-wfp-004.png 1440w,\n/static/13fb775b58a93530e19a1e190a005ac6/b1ffc/02-wfp-004.png 1492w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/13fb775b58a93530e19a1e190a005ac6/d9199/02-wfp-004.png\"\n            alt=\"ネットワークトラフィックのドロップイベント\"\n            title=\"ネットワークトラフィックのドロップイベント\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<h3 id=\"同じサブレイヤー内でのフィルターの-weight-の影響を確認する\" style=\"position:relative;\"><a href=\"#%E5%90%8C%E3%81%98%E3%82%B5%E3%83%96%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%86%85%E3%81%A7%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%AE-weight-%E3%81%AE%E5%BD%B1%E9%9F%BF%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\" aria-label=\"同じサブレイヤー内でのフィルターの weight の影響を確認する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>同じサブレイヤー内でのフィルターの Weight の影響を確認する</h3>\n<p>次に、すべての 443 番ポート宛ての通信をブロックする <code class=\"language-text\">Block HTTPS(443)</code> のフィルター設定はそのまま、\n同じ <code class=\"language-text\">FWPM_LAYER_ALE_AUTH_CONNECT_V4</code> レイヤーのサブレイヤー <code class=\"language-text\">FWPM_SUBLAYER_UNIVERSAL</code> に、\nmsedge.exe の通信をすべて許可するフィルターを追加します。</p>\n<p>この時、<code class=\"language-text\">Allow Edge</code> フィルターの Weight は <code class=\"language-text\">Block HTTPS(443)</code> フィルターの Weight よりも 1 小さい値を指定しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token punctuation\">{</span> \n  FILTER_KEY_2<span class=\"token punctuation\">,</span> \n  FWPM_LAYER_ALE_AUTH_CONNECT_V4<span class=\"token punctuation\">,</span> \n  FWPM_SUBLAYER_UNIVERSAL<span class=\"token punctuation\">,</span> \n  L<span class=\"token string\">\"Allow Edge\"</span><span class=\"token punctuation\">,</span> \n  L<span class=\"token string\">\"Allow Edge\"</span><span class=\"token punctuation\">,</span> \n  <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> \n  L<span class=\"token string\">\"C:\\\\Program Files (x86)\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe\"</span><span class=\"token punctuation\">,</span> \n  FWP_ACTION_PERMIT<span class=\"token punctuation\">,</span> \n  <span class=\"token number\">0xFFFFFFFFFFFFFFF0</span> \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>この 2 つのフィルターを登録した場合、<code class=\"language-text\">Allow Edge</code> フィルターは機能せず、\nmsedge.exe による 443 番ポート宛ての通信はすべてブロックされます。</p>\n<p>また、この通信をドロップしたことを示す netEvents 内の terminatingFiltersInfo についてもカウントは増えず、\nサブレイヤー <code class=\"language-text\">FWPM_SUBLAYER_UNIVERSAL</code> 内での評価結果は最も Weight の大きいフィルターである <code class=\"language-text\">FWP_ACTION_BLOCK</code> が適用されたことがわかります。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 823px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/b6f33a9b05e57abbcf387204d131990c/31aff/02-wfp-005.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 58.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABuUlEQVQoz5WTbXOiUAyF/f+/yy92Ott2u92pLwii1reqgCAI3jybAF1t7YfdO3MnQZOTc3KTThwLyyUsFsLbG2w2wukkOCecz07t5YoIzRHM/fisbet3zIsiWK1QYFFgA4XtNmI+D7XIjPlsxjQMNa4gjmEfCfs9dV6SfAbuWFWNZzhUO0dBSt7fS02wpIp97MiNsTQMlagyN/a0/jeAxs73G8lR5DikjkSZHFKo0gI5HHDZkfwgbfKVRq5k0wJaReul9S9VkLxAbUmalUhRwrHA5SXV6RZM5DNoDShtV5NEmEyE6RQG/Rm9Xo9gkuH5J7xxrv/ndfGqgrJsZH8F/QtoAbudaP+ahm82J4JgogVCAn/CeOxrobmCaktU+nbrVIVcvXhjOzYe9qMFLVeNfDvOnfn3I7cMP0CDQAhV8sOPAd1ul6enPnd3Lzw+jri/f2A0MqYLXn71Gfsh6/VW86jVZVnL0ACr6iJ5p5LX6wLP8xRgqCM14PX1N8/PP3UiYo3JdbxSnduMXF/wuqf1YGeZKECzLbsdNdPjkfrarP2XZEu2wQ5D0cajvj0Q7eo1K/h1/W7v5VH+AFiMoiq56/oiAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/b6f33a9b05e57abbcf387204d131990c/8ac56/02-wfp-005.webp 240w,\n/static/b6f33a9b05e57abbcf387204d131990c/d3be9/02-wfp-005.webp 480w,\n/static/b6f33a9b05e57abbcf387204d131990c/7fbc2/02-wfp-005.webp 823w\"\n              sizes=\"(max-width: 823px) 100vw, 823px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/b6f33a9b05e57abbcf387204d131990c/8ff5a/02-wfp-005.png 240w,\n/static/b6f33a9b05e57abbcf387204d131990c/e85cb/02-wfp-005.png 480w,\n/static/b6f33a9b05e57abbcf387204d131990c/31aff/02-wfp-005.png 823w\"\n            sizes=\"(max-width: 823px) 100vw, 823px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/b6f33a9b05e57abbcf387204d131990c/31aff/02-wfp-005.png\"\n            alt=\"ネットワークトラフィックのドロップイベント 2\"\n            title=\"ネットワークトラフィックのドロップイベント 2\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>続いて、<code class=\"language-text\">Allow Edge</code> フィルターの Weight を 0xFFFFFFFFFFFFFFFF に変更後、再度フィルターの登録を行います。</p>\n<p>すると、今度は msedge.exe を使用する場合のみ、443 番ポート宛ての通信が可能になります。</p>\n<p>この動作により、同じサブレイヤー内に競合するフィルターが登録された場合は、\n最も Weight の大きいフィルターのアクションが判定に使用されることがわかります。</p>\n<h3 id=\"異なるサブレイヤーの-weight-の影響を確認する\" style=\"position:relative;\"><a href=\"#%E7%95%B0%E3%81%AA%E3%82%8B%E3%82%B5%E3%83%96%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%AE-weight-%E3%81%AE%E5%BD%B1%E9%9F%BF%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\" aria-label=\"異なるサブレイヤーの weight の影響を確認する permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>異なるサブレイヤーの Weight の影響を確認する</h3>\n<p>次は、同じレイヤーの異なるサブレイヤーに競合するフィルターを登録した場合の動作を確認します。</p>\n<p>まず、サブレイヤーにはフィルターと同様に優先度を表す Weight の値が設定されており、\n特定のレイヤーで検査されるネットワークトラフィックは、そのレイヤーのすべてのサブレイヤーをサブレイヤーの Weight の順に通過します。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/35b07bef451ec8c7f9e668c7593403a4/75a80/02-wfp-006.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 54.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABuklEQVQoz12SiZKjMAxE+f8/hMHYHCYc4U5VGELSqxawO7OqctkG+7mlVnBvWzyWB+Z5xjRN2L43XNG2DYqi0H/jOGIcRp2HYdDB85/PRwc587wgsHGMJE5gYoPEJCdgwfpc0XUdkiRBlmVInUOaZrCyD8NQ/xF0Bdf7viNwArGJhTEGeZbLxRTOOvRdj7quFejlEX6vqhrWWsQiom3vCrhi2zYdQSoHXOJUoTVW1BoBWgz9gKapRVUK7z3yPNeZQD5ChT+BXL9eLwHKz9KXqqa63XArj/F4PPSSc1ZhVK+pywPGxLjffyt8Pp9Y128EsdSjutWSQou2adHUjRab0ff9UYr8gFGhk1ryW/sfsJP9sqgpBj73yKTg5itWYwjSQ6KQIBpFhQc4VVMaEbDvb9qhZxvJ8HTZCCxXFwmrqurXq6xZWXoUmnamTkdRdAL3v07Xcm+RMh1Alx1Oy5pOUuH+2rUPCaRCpppJ/TiH4QF8v/+1DT3QlGkKgUV+piWDDrPZmcalkOkSzH30FWk51nXVVmF4X0jtZwQZX6ZCaZlpnPAzernERr7appSZNaVKuszz43mHHcLO+AO/5jjWtSe6XQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/35b07bef451ec8c7f9e668c7593403a4/8ac56/02-wfp-006.webp 240w,\n/static/35b07bef451ec8c7f9e668c7593403a4/d3be9/02-wfp-006.webp 480w,\n/static/35b07bef451ec8c7f9e668c7593403a4/e46b2/02-wfp-006.webp 960w,\n/static/35b07bef451ec8c7f9e668c7593403a4/3d776/02-wfp-006.webp 1134w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/35b07bef451ec8c7f9e668c7593403a4/8ff5a/02-wfp-006.png 240w,\n/static/35b07bef451ec8c7f9e668c7593403a4/e85cb/02-wfp-006.png 480w,\n/static/35b07bef451ec8c7f9e668c7593403a4/d9199/02-wfp-006.png 960w,\n/static/35b07bef451ec8c7f9e668c7593403a4/75a80/02-wfp-006.png 1134w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/35b07bef451ec8c7f9e668c7593403a4/d9199/02-wfp-006.png\"\n            alt=\"サブレイヤーの一覧\"\n            title=\"サブレイヤーの一覧\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>この時行われる評価は、前項で確認したフィルターの評価と比較して、優先度の高い Weight を持つサブレイヤーの中で条件に合致するフィルターが見つかった場合でも、優先度の小さいサブレイヤーまですべての評価を行う点に大きな違いがあります。</p>\n<p>実際に、サンプルプログラム内の <code class=\"language-text\">FILTER_RULES</code> の設定を以下のように変更してこの動作を確認してみます。</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">const</span> FILTER_RULES rules<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token punctuation\">{</span> FILTER_KEY_1<span class=\"token punctuation\">,</span> FWPM_LAYER_ALE_AUTH_CONNECT_V4<span class=\"token punctuation\">,</span> FWPM_SUBLAYER_MPSSVC_QUARANTINE<span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Block HTTPS(443)\"</span><span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Block HTTPS(443)\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">443</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> FWP_ACTION_BLOCK<span class=\"token punctuation\">,</span> <span class=\"token number\">0xFFFFFFFFFFFFFFF1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\t<span class=\"token punctuation\">{</span> FILTER_KEY_2<span class=\"token punctuation\">,</span> FWPM_LAYER_ALE_AUTH_CONNECT_V4<span class=\"token punctuation\">,</span> FWPM_SUBLAYER_UNIVERSAL<span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Allow Edge\"</span><span class=\"token punctuation\">,</span> L<span class=\"token string\">\"Allow Edge\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> L<span class=\"token string\">\"C:\\\\Program Files (x86)\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe\"</span><span class=\"token punctuation\">,</span> FWP_ACTION_PERMIT<span class=\"token punctuation\">,</span> <span class=\"token number\">0xFFFFFFFFFFFFFFFF</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>ここでは、すべての 443 ポート宛ての通信をブロックする <code class=\"language-text\">Block HTTPS(443)</code> と、\nmsedge.exe による通信を許可する <code class=\"language-text\">Allow Edge</code> のフィルターをそれぞれ同じレイヤーの異なるサブレイヤーに割り当てています。</p>\n<p><code class=\"language-text\">Block HTTPS(443)</code> のフィルターが割り当てられている <code class=\"language-text\">FWPM_SUBLAYER_MPSSVC_QUARANTINE</code> の Weight は 4 です。\nそして、<code class=\"language-text\">Allow Edge</code> のフィルターが割り当てられている <code class=\"language-text\">FWPM_SUBLAYER_UNIVERSAL</code> の Weight は 32768 ですので、\n登録されているサブレイヤーの優先度としては <code class=\"language-text\">Allow Edge</code> のフィルターが割り当てられている <code class=\"language-text\">FWPM_SUBLAYER_UNIVERSAL</code> の方が高いです。</p>\n<p>しかし、この設定でフィルターを登録した場合には、msedge.exe による通信は許可されず、すべての 443 ポート宛ての通信がブロックされます。</p>\n<p>1 章で解説した通り、サブレイヤーの場合は Weight の大きいサブレイヤー内に条件に合致するフィルターが登録されている場合でも、\nレイヤー内のすべてのサブレイヤーの評価を行い最終的なアクションを決定します。</p>\n<p>また、最終的なアクションは WFP のポリシー規則に基づいて判定されるものであり、基本的には「ブロック」は「許可」のアクションをオーバライドします。</p>\n<p>そのため、このテスト結果のように、より Weight の大きいサブレイヤーでトラフィックが「許可」されている場合でも、他のサブレイヤーで「ブロック」された場合には、例外的な状況を除いて最終的な判定は「ブロック」になります。</p>\n<p>実際に、netevents の結果からも、terminatingFiltersInfo 内の評価されたフィルターのカウントが 3 つに増加しており、\n<code class=\"language-text\">Allow Edge</code> のフィルター (filterId:71441) と <code class=\"language-text\">Block HTTPS(443)</code> のフィルター (filterId:71440) の両方のフィルターが評価された結果、\n最終的な判定がトラフィックのドロップとなったことを確認できます。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 916px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/159418229a146ad4120a904a5459c134/59822/02-wfp-007.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 100.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAACy0lEQVQ4y5VUi07bQBDM/39MVYlKIKryEFAhtQhEFXBDU4LjxI6feTm243ins748CJBItbS68+lubnZ29hrDBLBepji0XvCt3cdF18ZV38VVj9H38N31cNnvw0lSzKbAohIAAtHhg69RloI4BsIA6DkThoskrjAeAUX+drsBElmNy9VX4A3dFMcCxxHYdoFeL4fnLeD7QMSLkiGBC6CqDOC7K94sNfQ2ZWfbgq4DMDu02z5arQCWFdXRakW8lCnPgOlUkGWCPN/BUAGVzfOzAezaAec2Gce8JOYYIUkipOkMswwEFTImYLEn5ShSZoIeI+R8SP2iqKSWqPWNWbgoJLtUMJ8bCXamPJkIAqbsesLAMh2TUlEs6sM613UTZm40/QBQUwh5u0dApycYkV1ZVgRJGTMeTpHNUgIYkMVCGKhjb8paFK20RhCWcN0Bw4c3COAHPotRYTQGLxSMOWrsBHRd4OlJQD8TvKgPKVM1shSGSrV4bRvZbxtN26N+WpTJBFBdh6MSi4wCjicohjmKbAUka6CdtlltTBLBYKAFmuP25gccO6QEOZzuFHmtI5b6yRbYa/CGaSO1gxaHzIYatFHbgvPrHPb9FTq3Z+hZP+lFqdmrJApqWlFetaJsGOrGgW8qOJ8vkGcZ/u+TDcNq+YJoT9s20OkUODo5xpfTQxycfMXB6THOry+57qLZ/IPW7w73dVnIFrrdHiuucpkuWjMck6H2sbaVvjJuNIDlPKDlWHjsNuv/kl2S5ZtOEVF3V1uv0JaGvm886boprIdHBIMpvP4MoV9Q35hMhhx9xFHA+aTuGn0wtB3XKWu6K5aasnaNAj/cXKN58Rn3Fwe4O/uEu8sjZpAw7RDPf0PuHdctmaaGjGEsxth5pt2B2uBa5TTlQzBmYVJSqArInKOUe4uxto02ev04uCzIi7GMsi55vpLtYxuLvI8V6D8y9grfdq0QVAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/159418229a146ad4120a904a5459c134/8ac56/02-wfp-007.webp 240w,\n/static/159418229a146ad4120a904a5459c134/d3be9/02-wfp-007.webp 480w,\n/static/159418229a146ad4120a904a5459c134/3fccf/02-wfp-007.webp 916w\"\n              sizes=\"(max-width: 916px) 100vw, 916px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/159418229a146ad4120a904a5459c134/8ff5a/02-wfp-007.png 240w,\n/static/159418229a146ad4120a904a5459c134/e85cb/02-wfp-007.png 480w,\n/static/159418229a146ad4120a904a5459c134/59822/02-wfp-007.png 916w\"\n            sizes=\"(max-width: 916px) 100vw, 916px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/159418229a146ad4120a904a5459c134/59822/02-wfp-007.png\"\n            alt=\"`FWPM_SUBLAYER_MPSSVC_QUARANTINE` のブロック判定が適用されたイベント\"\n            title=\"`FWPM_SUBLAYER_MPSSVC_QUARANTINE` のブロック判定が適用されたイベント\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<h2 id=\"まとめ\" style=\"position:relative;\"><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-label=\"まとめ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>まとめ</h2>\n<p>本章では、ユーザーモードプログラムから BFE を介して WFP フィルターを登録・削除する基本的な操作を確認しました。</p>\n<p>また、<code class=\"language-text\">FWPM_LAYER_ALE_AUTH_CONNECT_V4</code> レイヤーを例に、\n同一サブレイヤー内のフィルターや異なるサブレイヤー内のフィルターによる評価結果の違いを検証し、\nWFP フィルタリングの実際の挙動を確認しました。</p>\n<p>次章では、Callout ドライバーを用いて分類処理を拡張し、\nユーザーモード連携による動的な許可/ブロック制御を扱います。</p>\n<h2 id=\"本書のもくじ\" style=\"position:relative;\"><a href=\"#%E6%9C%AC%E6%9B%B8%E3%81%AE%E3%82%82%E3%81%8F%E3%81%98\" aria-label=\"本書のもくじ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>本書のもくじ</h2>\n<ul>\n<li><a href=\"/a-part-of-anti-virus-3-00\">まえがき</a></li>\n<li><a href=\"/a-part-of-anti-virus-3-01\">1 章 WFP の概要とアーキテクチャ</a></li>\n<li><a href=\"/a-part-of-anti-virus-3-02\">2 章 WFP によるアクセス制御を行うサンプル</a></li>\n<li><a href=\"/a-part-of-anti-virus-3-03\">3 章 Callout ドライバーによるアクセス制御を行うサンプル</a></li>\n</ul>\n<div class=\"footnotes\">\n<hr>\n<ol>\n<li id=\"fn-1\">\n<p><code class=\"language-text\">FWPM_FILTER0</code> structure (fwpmtypes.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_filter0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_filter0</a></p>\n<a href=\"#fnref-1\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-2\">\n<p>Management filtering layer identifiers <a href=\"https://learn.microsoft.com/windows-hardware/drivers/network/management-filtering-layer-identifiers\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/windows-hardware/drivers/network/management-filtering-layer-identifiers</a></p>\n<a href=\"#fnref-2\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-3\">\n<p>Filtering sublayer identifiers <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/fwp/management-filtering-sublayer-identifiers\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/fwp/management-filtering-sublayer-identifiers</a></p>\n<a href=\"#fnref-3\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-4\">\n<p><code class=\"language-text\">FWPM_DISPLAY_DATA0</code> structure (fwptypes.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwptypes/ns-fwptypes-fwpm_display_data0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwptypes/ns-fwptypes-fwpm<em>display</em>data0</a></p>\n<a href=\"#fnref-4\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-5\">\n<p><code class=\"language-text\">FWPM_ACTION0</code> structure (fwpmtypes.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_action0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_action0</a></p>\n<a href=\"#fnref-5\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-6\">\n<p>Management Functions <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/fwp/fwp-mgmt-functions\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/fwp/fwp-mgmt-functions</a></p>\n<a href=\"#fnref-6\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-7\">\n<p>Sessions <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/fwp/object-management#sessions\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/fwp/object-management#sessions</a></p>\n<a href=\"#fnref-7\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-8\">\n<p>FwpmEngineOpen0 function (fwpmu.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmengineopen0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmengineopen0</a></p>\n<a href=\"#fnref-8\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-9\">\n<p>Transactions <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/fwp/object-management#transactions\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/fwp/object-management#transactions</a></p>\n<a href=\"#fnref-9\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-10\">\n<p>FwpmTransactionBegin0 function (fwpmu.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmtransactionbegin0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmtransactionbegin0</a></p>\n<a href=\"#fnref-10\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-11\">\n<p>FwpmProviderAdd0 function (fwpmu.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmprovideradd0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmprovideradd0</a></p>\n<a href=\"#fnref-11\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-12\">\n<p>FwpmProviderAdd0 function (fwpmu.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmprovideradd0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmprovideradd0</a></p>\n<a href=\"#fnref-12\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-13\">\n<p><code class=\"language-text\">FWPM_FILTER_CONDITION0</code> structure (fwpmtypes.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_filter_condition0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm<em>filter</em>condition0</a></p>\n<a href=\"#fnref-13\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-14\">\n<p><code class=\"language-text\">FWP_MATCH_TYPE</code> enumeration (fwptypes.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwptypes/ne-fwptypes-fwp_match_type\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwptypes/ne-fwptypes-fwp<em>match</em>type</a></p>\n<a href=\"#fnref-14\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-15\">\n<p><code class=\"language-text\">FWP_CONDITION_VALUE0</code> structure (fwptypes.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwptypes/ns-fwptypes-fwp_condition_value0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwptypes/ns-fwptypes-fwp<em>condition</em>value0</a></p>\n<a href=\"#fnref-15\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-16\">\n<p>Filtering condition identifiers <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/fwp/filtering-condition-identifiers-\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/fwp/filtering-condition-identifiers-</a></p>\n<a href=\"#fnref-16\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-17\">\n<p><code class=\"language-text\">FWPM_FILTER0</code> structure (fwpmtypes.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_filter0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_filter0</a></p>\n<a href=\"#fnref-17\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-18\">\n<p>FwpmFilterAdd0 function (fwpmu.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmfilteradd0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmfilteradd0</a></p>\n<a href=\"#fnref-18\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-19\">\n<p>FwpmFilterAdd0 function (fwpmu.h) <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmfilteradd0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://learn.microsoft.com/ja-jp/windows/win32/api/fwpmu/nf-fwpmu-fwpmfilteradd0</a></p>\n<a href=\"#fnref-19\" class=\"footnote-backref\">↩</a>\n</li>\n</ol>\n</div>","fields":{"slug":"/a-part-of-anti-virus-3-02","tagSlugs":["/tag/a-part-of-anti-virus-3/","/tag/windows/","/tag/win-dbg/","/tag/anti-virus/"]},"frontmatter":{"date":"2026-04-11","description":"技術書典 20 で頒布した A PART OF ANTI-VIRUS 3 の WEB 版です。","tags":["A PART OF ANTI-VIRUS 3","Windows","WinDbg","AntiVirus"],"title":"A PART OF ANTI-VIRUS 3 - 公開サンプルコードで学ぶ Windows Filtering Platform (WFP) - (WEB 版)【2 章 WFP によるアクセス制御を行うサンプル】","socialImage":{"publicURL":"/static/272acc1e889df0e25d89217e89d5fd13/a-part-of-anti-virus-3.png"}}}},"pageContext":{"slug":"/a-part-of-anti-virus-3-02"}},"staticQueryHashes":["251939775","401334301","825871152"]}