{"componentChunkName":"component---src-templates-post-template-js","path":"/rust-winapi-process-enum-en","result":{"data":{"markdownRemark":{"id":"6810c39b-fede-5c59-9d7a-ea0e16b7f46f","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/rust-winapi-process-enum\">original page</a>.</p>\n</blockquote>\n<p>Following on from the <a href=\"/tag/rust-win-api\">previous articles</a>, I wanted to keep trying to build various programs in Rust that call Windows APIs.</p>\n<p>This time, I wanted to build a program that enumerates process information in the system using CreateToolhelp32Snapshot and Process32First/Process32Next, which I had also implemented previously in the article below.</p>\n<p>](/win32api-getprocesslist)</p>\n<p>The detailed API explanations are already covered there, so this time I am simply aiming to reimplement that code in Rust.</p>\n<!-- omit in toc -->\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents 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>Table of Contents</h2>\n<ul>\n<li>\n<p><a href=\"#the-code-i-created\">The Code I Created</a></p>\n<ul>\n<li><a href=\"#adding-dependencies\">Adding Dependencies</a></li>\n<li><a href=\"#loading-modules\">Loading Modules</a></li>\n<li><a href=\"#obtaining-a-handle-with-createtoolhelp32snapshot\">Obtaining a Handle with CreateToolhelp32Snapshot</a></li>\n<li><a href=\"#handling-unused-variables\">Handling Unused Variables</a></li>\n<li><a href=\"#declaring-mutable-variables\">Declaring Mutable Variables</a></li>\n<li><a href=\"#implementing-the-loop\">Implementing the Loop</a></li>\n<li><a href=\"#closing-the-handle\">Closing the Handle</a></li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n<h2 id=\"the-code-i-created\" style=\"position:relative;\"><a href=\"#the-code-i-created\" aria-label=\"the code i created 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>The Code I Created</h2>\n<p>The final code I created is shown below.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// cargo run --bin EnumProcess.rs</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">windows<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Win32</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">System</span><span class=\"token punctuation\">::</span><span class=\"token class-name\">Diagnostics</span><span class=\"token punctuation\">::</span><span class=\"token class-name\">ToolHelp</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">CreateToolhelp32Snapshot</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Process32FirstW</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Process32NextW</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">PROCESSENTRY32W</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">TH32CS_SNAPPROCESS</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">Foundation</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span><span class=\"token class-name\">CloseHandle</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">INVALID_HANDLE_VALUE</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">unsafe</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//HANDLE CreateToolhelp32Snapshot(</span>\n        <span class=\"token comment\">//[in] DWORD dwFlags,</span>\n        <span class=\"token comment\">//[in] DWORD th32ProcessID</span>\n        <span class=\"token comment\">//);</span>\n\n        <span class=\"token comment\">// Result&lt;HANDLE> を返すため unwrap で HANDLE を取得</span>\n        <span class=\"token keyword\">let</span> h_toolhelp32_snapshot <span class=\"token operator\">=</span> <span class=\"token class-name\">CreateToolhelp32Snapshot</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TH32CS_SNAPPROCESS</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">unwrap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> h_toolhelp32_snapshot <span class=\"token operator\">==</span> <span class=\"token constant\">INVALID_HANDLE_VALUE</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ERROR: Could not get a Toolhelp32Snapshot\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        \n        \n        <span class=\"token comment\">//typedef struct tagPROCESSENTRY32</span>\n        <span class=\"token comment\">//{</span>\n        <span class=\"token comment\">//DWORD   dwSize;</span>\n        <span class=\"token comment\">//DWORD   cntUsage;</span>\n        <span class=\"token comment\">//DWORD   th32ProcessID;</span>\n        <span class=\"token comment\">//ULONG_PTR th32DefaultHeapID;</span>\n        <span class=\"token comment\">//DWORD   th32ModuleID;</span>\n        <span class=\"token comment\">//DWORD   cntThreads;</span>\n        <span class=\"token comment\">//DWORD   th32ParentProcessID;</span>\n        <span class=\"token comment\">//LONG    pcPriClassBase;</span>\n        <span class=\"token comment\">//DWORD   dwFlags;</span>\n        <span class=\"token comment\">//CHAR    szExeFile[MAX_PATH];</span>\n        <span class=\"token comment\">//} PROCESSENTRY32;</span>\n\n        <span class=\"token comment\">// BOOL Process32First(</span>\n        <span class=\"token comment\">//     [in]      HANDLE           hSnapshot,</span>\n        <span class=\"token comment\">//     [in, out] LPPROCESSENTRY32 lppe</span>\n        <span class=\"token comment\">// );</span>\n\n        <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> pe32 <span class=\"token operator\">=</span> <span class=\"token constant\">PROCESSENTRY32W</span> <span class=\"token punctuation\">{</span>\n            dwSize<span class=\"token punctuation\">:</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>mem<span class=\"token punctuation\">::</span></span><span class=\"token function\">size_of</span><span class=\"token punctuation\">::</span><span class=\"token operator\">&lt;</span><span class=\"token constant\">PROCESSENTRY32W</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">..</span><span class=\"token class-name\">Default</span><span class=\"token punctuation\">::</span><span class=\"token function\">default</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">match</span> <span class=\"token class-name\">Process32FirstW</span><span class=\"token punctuation\">(</span>h_toolhelp32_snapshot<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> pe32<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Got process snapshot.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                \n                <span class=\"token keyword\">loop</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token keyword\">let</span> exe_file <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token keyword\">let</span> len <span class=\"token operator\">=</span> pe32<span class=\"token punctuation\">.</span>szExeFile<span class=\"token punctuation\">.</span><span class=\"token function\">iter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                                                        <span class=\"token punctuation\">.</span><span class=\"token function\">position</span><span class=\"token punctuation\">(</span><span class=\"token closure-params\"><span class=\"token closure-punctuation punctuation\">|</span><span class=\"token operator\">&amp;</span>c<span class=\"token closure-punctuation punctuation\">|</span></span> c <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n                                                        <span class=\"token punctuation\">.</span><span class=\"token function\">unwrap_or</span><span class=\"token punctuation\">(</span>pe32<span class=\"token punctuation\">.</span>szExeFile<span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                        <span class=\"token class-name\">String</span><span class=\"token punctuation\">::</span><span class=\"token function\">from_utf16_lossy</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>pe32<span class=\"token punctuation\">.</span>szExeFile<span class=\"token punctuation\">[</span><span class=\"token punctuation\">..</span>len<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n                    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Process name: {}\"</span><span class=\"token punctuation\">,</span> exe_file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=====> PID: {}\"</span><span class=\"token punctuation\">,</span> pe32<span class=\"token punctuation\">.</span>th32ProcessID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=====> Threads count: {}\"</span><span class=\"token punctuation\">,</span> pe32<span class=\"token punctuation\">.</span>cntThreads<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n                    <span class=\"token keyword\">match</span> <span class=\"token class-name\">Process32NextW</span><span class=\"token punctuation\">(</span>h_toolhelp32_snapshot<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> pe32<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>_e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token comment\">// eprintln!(\"Failed to get next process: {}\", e);</span>\n                            <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span> \n                        <span class=\"token punctuation\">}</span>\n                    <span class=\"token punctuation\">}</span>\n\n                <span class=\"token punctuation\">}</span>\n\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to get first process: {}\"</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// Close h_toolhelp32_snapshot handle.</span>\n        <span class=\"token keyword\">let</span> handle_name <span class=\"token operator\">=</span> <span class=\"token string\">\"h_toolhelp32_snapshot\"</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">match</span> <span class=\"token class-name\">CloseHandle</span><span class=\"token punctuation\">(</span>h_toolhelp32_snapshot<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Handle closed: {}\"</span><span class=\"token punctuation\">,</span> handle_name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to close handle:{} {}\"</span><span class=\"token punctuation\">,</span> handle_name<span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>When I built and ran this code, I was able to enumerate the process information in the system just like the code I had written in C.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 253px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/16d0ef176608885bd487ab2e623f67b4/88c73/image-20250404234949034.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: 207.91666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAqCAYAAACz+XvQAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHC0lEQVRIx2VX91byeBDlAb5VKYKitFASUkiF0ENo6p49297/XWbvnRjUs3/kBEOY38zcMmPFmtqSLlMZjUYynpgy82fi2I5M8dxxbOmOBjJ1puLPZuK5rqTpQuIowXuePD89SavVkhbunU5H2u22VFy8uN/v5PX1ReI4kTAKZZ4kEkWRBMFMXl9eJAwD2W93cjkeESzEFYs3c+Wp1ZQnBHt8fJR6vS6NRkMqEYKs1itZpqksFrjSOU571Wze3z7k+vYuz89PqGCC99aSLOaSrlLJ86MkyRzPNrLdbWS9XOnnSq/XE2NoiGVZMplMUOoUn02Z46D1aiW248p4PBZjYOh3NtowHk/Ewme2qdvtimEMxDItxBlKxTCG4nme2PZUHNcR05yg1ECy3U583GsohSe3UF6tVpOHhwepVh/0zlIfHxso9VHL5d8VNtMwDL2GOMEYDPS+Rnk+AJqhx3EcyxBZ8J3ZzBPX9bS/z8/PMjFN6aD/BIf9rPQRYDq1UMZITJQ9Gg2li0NWKNf1XFnM53LYZ/rOaDiSDACm6F0UBdJ+aYMZE7z/Ks1mAVAlmS+QzeqGbDJPpD/ogTq2XC9X2WcHLcucOmj+Vjzfl91+I5vNTpqPTQ1UZse7ZjiejDWA4zi3Ps6RhZYdhGiBIb1eH2X6ChAz97yZtJotLZvXj4A2gjEIUTRRQoAsMvAuRMZVNJv0aCHLarWmFwG5v7/XIASjWq0qIFpyB7Czb8xiNBqj+QU47CEz5mEJQcH3A1CH/HRAJWbLjGwAlGWZ0q6F8itEzkZm5CAf8ofk1hpUoQxJ+MN+L1NwcwxQdtuNLGKCEsoTCO/5gZzPZ1RoIvN7qcT4cr1ZQU6RlpZCKf1+Tw85ny5ygCJaT00FJTtkEoGbcyBPOjHTJSqJk0j7nR9y9LA/UMY72kdLlcB+JlDKdrtFloG2YIjsWH4J3gC9J1Akv6oLF/n5qRRXH/JFghLiJZYZhKHcofkpdDrzHLm7u1MACApVQ8rwc2kMvH9TSqEQnjxExisN4ukhzJbAsRpaGq3NBb1IF2/mq3V9KaVfKmWsoIwpeLywYbmQGUE55bkaxhgsyJD5Ol2qLzLDGH3vw2BuSuGD5WqpoAQgcRRHN1CO+QmBdyinLrMgwt85vDGUWRhDURGsbgG/bN84qMRmD02c7oJfvOg8EyiH9rVDMPol/x7BsmLIk2iWQnBRAQ8vs7uVTOv6rhQFZbdHsFhBeXv/EB+g/Pr1mzwAlFqtqoppAAQC8UPLnU63sC0qBP0rwUnRO0UdhA1AnRIUtsIyp8oMzhACxLKbJSiDT6Xwh5Za1FDo4js1WB/WvtTeWahgiPbQvtYpyIxeN9A7mkf/u32xRwSFZUYYPvN5jIBdRTw/HGFfmdJjgIPy4wngBDIw4DxhBDvbqbk2voPCDGmSFD17SGsiCAmCZzDWECOT3KTWl+AmgSOFWCpV8vrNrW8lF8Es7Rl/SGrkCKZKeajK5fomv398aGm/QS1UCRVDQEiZ/4GiSkEWhiqlr9pOMVJ5EHvrwx8LUPropYlDTU2AoPDdF4DyTSl9/ZJlUuBUSg/2tUeGCgrc5HI66zsmAh0PB9ks1+DjUoGYYstgH5vN1hcolBFB8aFLbgkk6xSgsIfL1Rr21SqcBf5IMtu2JT0ksgC1IrSlLFcDDqHPKYg9w4zgnOCPOAFpCAcMqAV0y5awzBkAo705OuzHEoL4dO42WPCj5IKHhVIKUAIFJQTSVMYVSvnjz7/E6HYwSwq7IjC8c+j/0PKXUgZqoqVSOI+pWTadqPPAAQ5nZlxFKFeCQlPmaLhlyMHDLwtuTVUpffQrQ7kBMt2gh2dsXQw4QaBjXoCyWCSYKc9ogy8uOFmHwWpAlkVQuP8V9hViSHWULnsYxBaOww2BOk8hQy4DzHiFg9Rx0Pf1Zq3sIOoVvkiZ+Tp0HJ10E5RFf8yh4Tn42MEBHEgLbBV6sE82RFqNDa7GSawc1YAs2UUgBmXPyEdS4ZgVSuHMOEMp//7ztxL/7lMp5fbFz+V8KQZ9qRTjp1IICg8iCFzv2GNaPRXDpck0xwoKDbp9W0daXDhLpRS0IQd73Z4cDrnSZ4uBfz1fdNCbY1NOx1y2q43O8hYGvQ+vbAKQ2qfRVtiLBdZcXcph/yS22hfosN1sldhciftoDbcFD0phK/g9NU4nousk6ONL+1kq3Pwd11ZX9v1CeiyL9nXE1rDabFSKtDiuetzOdFDhcCKuGy+S4jbxwv8Cev2vki1VSgFKnmXF9lWrS346QS3vN6WUQDTqxXCvf5stn4N+oGCwwbxTKdy4LGuqdAh03bAUFJaokxKZEQgCSnBuBksesm8cOlyA+EO+dLlcdDScUPYV25WN5zYU8XbFArXLsMGulfD8V4R2V9LmP9n1zrX+kHhuAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/16d0ef176608885bd487ab2e623f67b4/8ac56/image-20250404234949034.webp 240w,\n/static/16d0ef176608885bd487ab2e623f67b4/15c27/image-20250404234949034.webp 253w\"\n              sizes=\"(max-width: 253px) 100vw, 253px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/16d0ef176608885bd487ab2e623f67b4/8ff5a/image-20250404234949034.png 240w,\n/static/16d0ef176608885bd487ab2e623f67b4/88c73/image-20250404234949034.png 253w\"\n            sizes=\"(max-width: 253px) 100vw, 253px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/16d0ef176608885bd487ab2e623f67b4/88c73/image-20250404234949034.png\"\n            alt=\"image-20250404234949034\"\n            title=\"image-20250404234949034\"\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=\"adding-dependencies\" style=\"position:relative;\"><a href=\"#adding-dependencies\" aria-label=\"adding dependencies 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>Adding Dependencies</h3>\n<p>To implement the code above with the Windows Crate, I added a setting to Cargo.toml that specifies <code class=\"language-text\">Win32_System_Diagnostics_ToolHelp</code> in <code class=\"language-text\">features</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"toml\"><pre class=\"language-toml\"><code class=\"language-toml\"><span class=\"token punctuation\">[</span><span class=\"token table class-name\">dependencies</span><span class=\"token punctuation\">]</span>\n<span class=\"token key property\">windows</span> <span class=\"token punctuation\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token key property\">version</span> <span class=\"token punctuation\">=</span> <span class=\"token string\">\"0.60.0\"</span><span class=\"token punctuation\">,</span> <span class=\"token key property\">features</span> <span class=\"token punctuation\">=</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token string\">\"Win32_System_Diagnostics_ToolHelp\"</span>\n<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"loading-modules\" style=\"position:relative;\"><a href=\"#loading-modules\" aria-label=\"loading modules 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>Loading Modules</h3>\n<p>To call the Windows APIs required for process enumeration, I loaded the following modules.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">use</span> <span class=\"token namespace\">windows<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Win32</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">System</span><span class=\"token punctuation\">::</span><span class=\"token class-name\">Diagnostics</span><span class=\"token punctuation\">::</span><span class=\"token class-name\">ToolHelp</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">CreateToolhelp32Snapshot</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Process32FirstW</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Process32NextW</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">PROCESSENTRY32W</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">TH32CS_SNAPPROCESS</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">Foundation</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span><span class=\"token class-name\">CloseHandle</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">INVALID_HANDLE_VALUE</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>Since the three APIs CreateToolhelp32Snapshot and Process32FirstW/Process32NextW appeared to exist under <code class=\"language-text\">windows::Win32::System::Diagnostics::ToolHelp</code> in the Windows Crate, I loaded that module.</p>\n<p>Reference: <a href=\"https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/System/Diagnostics/ToolHelp/index.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">windows::Win32::System::Diagnostics::ToolHelp - Rust</a></p>\n<p>I also loaded CloseHandle so that I could close the handle that gets created.</p>\n<p>Reference: <a href=\"https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/Foundation/fn.CloseHandle.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CloseHandle in windows::Win32::Foundation - Rust</a></p>\n<h3 id=\"obtaining-a-handle-with-createtoolhelp32snapshot\" style=\"position:relative;\"><a href=\"#obtaining-a-handle-with-createtoolhelp32snapshot\" aria-label=\"obtaining a handle with createtoolhelp32snapshot 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>Obtaining a Handle with CreateToolhelp32Snapshot</h3>\n<p>Inside the <code class=\"language-text\">unsafe</code> block in <code class=\"language-text\">main</code>, I first call the CreateToolhelp32Snapshot API to obtain a handle to the process snapshot.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">//HANDLE CreateToolhelp32Snapshot(</span>\n<span class=\"token comment\">//[in] DWORD dwFlags,</span>\n<span class=\"token comment\">//[in] DWORD th32ProcessID</span>\n<span class=\"token comment\">//);</span>\n\n<span class=\"token comment\">// Result&lt;HANDLE> を返すため unwrap で HANDLE を取得</span>\n<span class=\"token keyword\">let</span> h_toolhelp32_snapshot <span class=\"token operator\">=</span> <span class=\"token class-name\">CreateToolhelp32Snapshot</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TH32CS_SNAPPROCESS</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">unwrap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> h_toolhelp32_snapshot <span class=\"token operator\">==</span> <span class=\"token constant\">INVALID_HANDLE_VALUE</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ERROR: Could not get a Toolhelp32Snapshot\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>One difference from the C implementation is that CreateToolhelp32Snapshot in the Windows Crate returns a value of type <code class=\"language-text\">Result&lt;HANDLE></code> rather than <code class=\"language-text\">HANDLE</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: 565px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e5dec69d35c4b85983b134be795d3468/07eba/image-20250404235702290.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: 51.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnklEQVQoz4WR/W6bMBTFeZo0gA0BbCAQsA1lVdMoarutk7Zok9q9/yucHQxqJ3XV/vjpfvhyfHwJ7oYCR5vgNCrcDRq3NsNxrHB2KW5Zn0aNh2mH08C+U7gZSp+fXYZaF1BKQc+UGlprBN9/XHC5/MSv52f8fnnBeH9Ecj4g/zoge7TIPpMnt/CNvS+sH5Z+zjp/Yu+mgbMObdsiaJoGXdeh73tP1dRQTQnVVkv8O+94dpjzaon9OluXKMtycThbLoriFW9f6X9TqI9rvT45TVMkSfIhcuWtlmtPvjubCXZZBjc4VFUF5yyM6aGrEns+vTu0rC2scbDWwDrD2QEj5y0Zx4HfOKQU2l5dIQxDBFJKRFFEwRrTp8kP1RTfcicRL4jrPcS+QWx7CIpKXiJMB0FBOY0QdY14T2hEzA7jOMZms4GiwCw243+QMXRnkOQ5Qv49oQqEnA2FQCjFW74SUyxmDJJ5h3SZc8HX0zWf16PtDXYUTgeLlG798Cyw3fpnvY9rToJlmdIvtKBoQUfJbocozzySF4oo9oKCDv7HH1JcRrT+XelAAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/e5dec69d35c4b85983b134be795d3468/8ac56/image-20250404235702290.webp 240w,\n/static/e5dec69d35c4b85983b134be795d3468/d3be9/image-20250404235702290.webp 480w,\n/static/e5dec69d35c4b85983b134be795d3468/acb73/image-20250404235702290.webp 565w\"\n              sizes=\"(max-width: 565px) 100vw, 565px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/e5dec69d35c4b85983b134be795d3468/8ff5a/image-20250404235702290.png 240w,\n/static/e5dec69d35c4b85983b134be795d3468/e85cb/image-20250404235702290.png 480w,\n/static/e5dec69d35c4b85983b134be795d3468/07eba/image-20250404235702290.png 565w\"\n            sizes=\"(max-width: 565px) 100vw, 565px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/e5dec69d35c4b85983b134be795d3468/07eba/image-20250404235702290.png\"\n            alt=\"image-20250404235702290\"\n            title=\"image-20250404235702290\"\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>Reference: <a href=\"https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/System/Diagnostics/ToolHelp/fn.CreateToolhelp32Snapshot.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CreateToolhelp32Snapshot in windows::Win32::System::Diagnostics::ToolHelp - Rust</a></p>\n<p>A <code class=\"language-text\">Result</code> like this seems to be a special type prepared for error handling in Rust.</p>\n<p>Basically, <code class=\"language-text\">Result</code> is an enum with two variants, <code class=\"language-text\">Ok</code> and <code class=\"language-text\">Err</code>, and it seems to let you implement different actions depending on the returned value.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">enum</span> <span class=\"token type-definition class-name\">Result</span><span class=\"token operator\">&lt;</span><span class=\"token class-name\">T</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">E</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">T</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">E</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Recoverable Errors with Result - The Rust Programming Language</a></p>\n<p>Reference: <a href=\"https://zenn.dev/hakoten/articles/8ae9dd0d3a2080\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RustによるResult型のエラーハンドリング入門</a></p>\n<p>There seem to be several ways to extract a return value from a <code class=\"language-text\">Result</code>, but this time I used <code class=\"language-text\">unwrap</code>.</p>\n<p>When you use <code class=\"language-text\">unwrap</code>, if the <code class=\"language-text\">Result</code> value is <code class=\"language-text\">Ok</code>, it extracts the function’s return value, and if it is <code class=\"language-text\">Err</code>, it seems to crash the program with <code class=\"language-text\">panic!</code>.</p>\n<p>This stores the obtained handle in the <code class=\"language-text\">_h_toolhelp32_snapshot</code> variable.</p>\n<p>Also, when I tried to use a variable named <code class=\"language-text\">hToolhelp32Snapshot</code> at this point, the compiler scolded me for not using a snake_case variable name.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 846px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/0eeaa5f0d402d6b4e715d74a21ba86a3/5b481/image-20250404224723643.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: 6.666666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAATUlEQVQI1w2LWwqAIBAAO0dJ1JoZpWA+kLz/vab9GJiPmckYg/cbMVpCEJ5b1FdyFmq1ykHvjjEc6RVKsXzfqY2Q0k5rq36L9obrmvkBm2gd5FIcVjMAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/0eeaa5f0d402d6b4e715d74a21ba86a3/8ac56/image-20250404224723643.webp 240w,\n/static/0eeaa5f0d402d6b4e715d74a21ba86a3/d3be9/image-20250404224723643.webp 480w,\n/static/0eeaa5f0d402d6b4e715d74a21ba86a3/47c32/image-20250404224723643.webp 846w\"\n              sizes=\"(max-width: 846px) 100vw, 846px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/0eeaa5f0d402d6b4e715d74a21ba86a3/8ff5a/image-20250404224723643.png 240w,\n/static/0eeaa5f0d402d6b4e715d74a21ba86a3/e85cb/image-20250404224723643.png 480w,\n/static/0eeaa5f0d402d6b4e715d74a21ba86a3/5b481/image-20250404224723643.png 846w\"\n            sizes=\"(max-width: 846px) 100vw, 846px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/0eeaa5f0d402d6b4e715d74a21ba86a3/5b481/image-20250404224723643.png\"\n            alt=\"image-20250404224723643\"\n            title=\"image-20250404224723643\"\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>It seems possible to suppress this warning with a setting in Cargo.toml, but for now I decided to follow Rust’s coding conventions and use snake_case.</p>\n<p>Reference: <a href=\"https://makandat.wordpress.com/2022/02/05/rust-%E3%81%AE%E5%8B%89%E5%BC%B7-snake-case-name/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rust の勉強: snake case name ? | Jura-Zakki 樹羅雑記</a></p>\n<h3 id=\"handling-unused-variables\" style=\"position:relative;\"><a href=\"#handling-unused-variables\" aria-label=\"handling unused variables 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>Handling Unused Variables</h3>\n<p>In this code, I had to define some variables that are not actually used, such as the <code class=\"language-text\">T</code> in <code class=\"language-text\">Ok(T)</code>, and when I implemented it as-is, the compiler warned me during the build.</p>\n<p>After looking for a workaround, I found information saying that by prefixing a variable name with <code class=\"language-text\">_</code>, you can suppress warnings about unused variables, and by using <code class=\"language-text\">_</code> alone as the variable name, you can indicate that the variable itself will not be used.</p>\n<p>Reference: <a href=\"https://rs.nkmk.me/rust-underscore-variable/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rustの変数名におけるアンダースコアの意味 | rs.nkmk.me</a></p>\n<p>So in this code, I used underscores for unused variables such as <code class=\"language-text\">Ok(_)</code> to avoid the warning.</p>\n<h3 id=\"declaring-mutable-variables\" style=\"position:relative;\"><a href=\"#declaring-mutable-variables\" aria-label=\"declaring mutable variables 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>Declaring Mutable Variables</h3>\n<p>In Rust, variables declared with <code class=\"language-text\">let</code> seem to be treated as mutable variables by default, and changing a variable’s value causes an error.</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/00536fc218d5b6fec852ef6674a42996/d2f5c/image-20250405113856888.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: 42.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA+ElEQVQoz41RiY6FIBDz/39TjQceEQU5xC7lrYb43GQnaaoZ6LRDMSwSylhYHz44AlwAjLXY9x3HcYB1nmdC/v1ECAGFVApKKthFw2kL4zx4bds2DIPAuq7w3sM59wUOe6Kw0YnbDUIUC8bdjlQcVFUV2rbFOI5RfMA0TRBCpH+CQ3kuR4E/is15npOI0hrGGOjIOXiGojmKt12weEHKNQn2XYcuggO4AuLN3e3wTZBNKWWKytjdryjB2Muy3A5zvgWfL3lFvnZ3MXdHZi+P/eXwKchDdEJHFOt7kZiuGZlMUfK/HDJSWZZomgZ1XafYBEXYux7sKfgDnAC50sJsj2UAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/00536fc218d5b6fec852ef6674a42996/8ac56/image-20250405113856888.webp 240w,\n/static/00536fc218d5b6fec852ef6674a42996/d3be9/image-20250405113856888.webp 480w,\n/static/00536fc218d5b6fec852ef6674a42996/e46b2/image-20250405113856888.webp 960w,\n/static/00536fc218d5b6fec852ef6674a42996/8ae64/image-20250405113856888.webp 1363w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/00536fc218d5b6fec852ef6674a42996/8ff5a/image-20250405113856888.png 240w,\n/static/00536fc218d5b6fec852ef6674a42996/e85cb/image-20250405113856888.png 480w,\n/static/00536fc218d5b6fec852ef6674a42996/d9199/image-20250405113856888.png 960w,\n/static/00536fc218d5b6fec852ef6674a42996/d2f5c/image-20250405113856888.png 1363w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/00536fc218d5b6fec852ef6674a42996/d9199/image-20250405113856888.png\"\n            alt=\"image-20250405113856888\"\n            title=\"image-20250405113856888\"\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>Therefore, when declaring a variable whose value will be changed later, it seems you need to use <code class=\"language-text\">mut</code> and declare it as an immutable variable.</p>\n<p>So the <code class=\"language-text\">pe32</code> variable that stores the PROCESSENTRY32 structure is declared as <code class=\"language-text\">let mut pe32</code>, as shown below.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">//typedef struct tagPROCESSENTRY32</span>\n<span class=\"token comment\">//{</span>\n<span class=\"token comment\">//DWORD   dwSize;</span>\n<span class=\"token comment\">//DWORD   cntUsage;</span>\n<span class=\"token comment\">//DWORD   th32ProcessID;</span>\n<span class=\"token comment\">//ULONG_PTR th32DefaultHeapID;</span>\n<span class=\"token comment\">//DWORD   th32ModuleID;</span>\n<span class=\"token comment\">//DWORD   cntThreads;</span>\n<span class=\"token comment\">//DWORD   th32ParentProcessID;</span>\n<span class=\"token comment\">//LONG    pcPriClassBase;</span>\n<span class=\"token comment\">//DWORD   dwFlags;</span>\n<span class=\"token comment\">//CHAR    szExeFile[MAX_PATH];</span>\n<span class=\"token comment\">//} PROCESSENTRY32;</span>\n\n<span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> pe32 <span class=\"token operator\">=</span> <span class=\"token constant\">PROCESSENTRY32W</span> <span class=\"token punctuation\">{</span>\n    dwSize<span class=\"token punctuation\">:</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>mem<span class=\"token punctuation\">::</span></span><span class=\"token function\">size_of</span><span class=\"token punctuation\">::</span><span class=\"token operator\">&lt;</span><span class=\"token constant\">PROCESSENTRY32W</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">..</span><span class=\"token class-name\">Default</span><span class=\"token punctuation\">::</span><span class=\"token function\">default</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>At that time, you also need to specify the size of the structure in <code class=\"language-text\">dwSize</code> and initialize the structure members.</p>\n<p>It seems you can also implement initialization of the structure members by specifying them explicitly as shown below, but this time I used <code class=\"language-text\">..Default::default()</code> to set the other structure members to their default values.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// Initialise a process entry. In order to use `Process32First`, you need to set `dwSize`.</span>\n<span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> process_entry <span class=\"token punctuation\">:</span> <span class=\"token constant\">PROCESSENTRY32W</span> <span class=\"token operator\">=</span> <span class=\"token constant\">PROCESSENTRY32W</span> <span class=\"token punctuation\">{</span>\n    dwSize<span class=\"token punctuation\">:</span> <span class=\"token namespace\">mem<span class=\"token punctuation\">::</span></span><span class=\"token function\">size_of</span><span class=\"token punctuation\">::</span><span class=\"token operator\">&lt;</span><span class=\"token constant\">PROCESSENTRY32W</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n    cntUsage<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    th32ProcessID<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    th32DefaultHeapID<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    th32ModuleID<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    cntThreads<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    th32ParentProcessID<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    pcPriClassBase<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    dwFlags<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    szExeFile<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> <span class=\"token constant\">MAX_PATH</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>Reference: <a href=\"https://users.rust-lang.org/t/comparing-a-string-to-an-array-of-i8/5120/5\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Comparing a string to an array of i8 - help - The Rust Programming Language Forum</a></p>\n<p>This kind of initialization seems to be usable with structs that provide the <code class=\"language-text\">Default</code> trait.</p>\n<p>Reference: <a href=\"https://www.utam0k.jp/blog/2018/05/28/rust_std_default/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rustのstd::default::Default – うたもく</a></p>\n<p>For <code class=\"language-text\">PROCESSENTRY32W</code>, it appears that you can use the <code class=\"language-text\">Default</code> trait as described below (probably).</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 510px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/311a8458983e2fced3860e0a1e744fd8/0abdd/image-20250405114942672.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: 25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPElEQVQY002QSU4CQRiFWZpooibGhSsXGkPiAFQVPaSboaHppqEbGWQwMV4BbgBHcNixMagn0BUb48k+CyTRxcur1P+q3pc/ZRgGURQxGt3jV6o8Px3w+bHP99c2D4+HhPVrWnGTTBAgRkNEu4UY9hE3XUSvg0hixKCP9MqoXI6UUhLDsKhWbG5H54zHJ0wmp7rgUhddYVkGjmNjWhZKl6t8/p/Ur6/v9VlKUqaZp1pt0u8JXhZbvL7vsHjbJY5LpNMlpPRJkgFhUCOXzSI0hRBi41JLbVzqrFoRqnVgRRGGDr5vEgQOFc/RpGfMZsfc3V1o0oLOOBSKBWzbxnVdbE3vWvqtJdcyDfn3Ybnk0Ura1GohUZjQiHzm8yOWyz2m0zSNRlfPfOpRXXtAu93RayqSeBnqpRyxl8VzBD+MCLR0+SgrXgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/311a8458983e2fced3860e0a1e744fd8/8ac56/image-20250405114942672.webp 240w,\n/static/311a8458983e2fced3860e0a1e744fd8/d3be9/image-20250405114942672.webp 480w,\n/static/311a8458983e2fced3860e0a1e744fd8/b7235/image-20250405114942672.webp 510w\"\n              sizes=\"(max-width: 510px) 100vw, 510px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/311a8458983e2fced3860e0a1e744fd8/8ff5a/image-20250405114942672.png 240w,\n/static/311a8458983e2fced3860e0a1e744fd8/e85cb/image-20250405114942672.png 480w,\n/static/311a8458983e2fced3860e0a1e744fd8/0abdd/image-20250405114942672.png 510w\"\n            sizes=\"(max-width: 510px) 100vw, 510px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/311a8458983e2fced3860e0a1e744fd8/0abdd/image-20250405114942672.png\"\n            alt=\"image-20250405114942672\"\n            title=\"image-20250405114942672\"\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=\"implementing-the-loop\" style=\"position:relative;\"><a href=\"#implementing-the-loop\" aria-label=\"implementing the loop 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>Implementing the Loop</h3>\n<p>Once all the operations up to this point are complete, all that remains is to use the Process32FirstW/Process32NextW APIs to retrieve process information in order from the snapshot handle.</p>\n<p>Both Process32FirstW and Process32NextW in the Windows Crate return an empty(?) <code class=\"language-text\">Result</code> as their return value.</p>\n<p>So this time I used <code class=\"language-text\">match</code> rather than <code class=\"language-text\">unwrap</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">match</span> <span class=\"token class-name\">Process32FirstW</span><span class=\"token punctuation\">(</span>h_toolhelp32_snapshot<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> pe32<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Got process snapshot.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">loop</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">let</span> exe_file <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">let</span> len <span class=\"token operator\">=</span> pe32<span class=\"token punctuation\">.</span>szExeFile<span class=\"token punctuation\">.</span><span class=\"token function\">iter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                                                <span class=\"token punctuation\">.</span><span class=\"token function\">position</span><span class=\"token punctuation\">(</span><span class=\"token closure-params\"><span class=\"token closure-punctuation punctuation\">|</span><span class=\"token operator\">&amp;</span>c<span class=\"token closure-punctuation punctuation\">|</span></span> c <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n                                                <span class=\"token punctuation\">.</span><span class=\"token function\">unwrap_or</span><span class=\"token punctuation\">(</span>pe32<span class=\"token punctuation\">.</span>szExeFile<span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token class-name\">String</span><span class=\"token punctuation\">::</span><span class=\"token function\">from_utf16_lossy</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>pe32<span class=\"token punctuation\">.</span>szExeFile<span class=\"token punctuation\">[</span><span class=\"token punctuation\">..</span>len<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Process name: {}\"</span><span class=\"token punctuation\">,</span> exe_file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=====> PID: {}\"</span><span class=\"token punctuation\">,</span> pe32<span class=\"token punctuation\">.</span>th32ProcessID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"=====> Threads count: {}\"</span><span class=\"token punctuation\">,</span> pe32<span class=\"token punctuation\">.</span>cntThreads<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token keyword\">match</span> <span class=\"token class-name\">Process32NextW</span><span class=\"token punctuation\">(</span>h_toolhelp32_snapshot<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> pe32<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>_e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token comment\">// eprintln!(\"Failed to get next process: {}\", e);</span>\n                    <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span> \n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span>\n\n        <span class=\"token punctuation\">}</span>\n\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to get first process: {}\"</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>When you use <code class=\"language-text\">match</code> with <code class=\"language-text\">Result</code>, you can implement the handling for both cases where <code class=\"language-text\">Ok</code> and <code class=\"language-text\">Err</code> are returned.</p>\n<p>In the example above, within the processing that succeeds in retrieving information using Process32FirstW, I perform loop processing with a <code class=\"language-text\">loop</code> block and keep outputting process information until retrieving information with Process32NextW fails.</p>\n<h3 id=\"closing-the-handle\" style=\"position:relative;\"><a href=\"#closing-the-handle\" aria-label=\"closing the handle 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>Closing the Handle</h3>\n<p>After all processing is complete, I close the handle to the process snapshot that I obtained using CloseHandle.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// Close h_toolhelp32_snapshot handle.</span>\n<span class=\"token keyword\">let</span> handle_name <span class=\"token operator\">=</span> <span class=\"token string\">\"h_toolhelp32_snapshot\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">match</span> <span class=\"token class-name\">CloseHandle</span><span class=\"token punctuation\">(</span>h_toolhelp32_snapshot<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Ok</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Handle closed: {}\"</span><span class=\"token punctuation\">,</span> handle_name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">Err</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to close handle:{} {}\"</span><span class=\"token punctuation\">,</span> handle_name<span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary 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>Summary</h2>\n<p>Rust seems to have quite a few quirks, but it is quite fun to write.</p>","fields":{"slug":"/rust-winapi-process-enum-en","tagSlugs":["/tag/rust/","/tag/windows/","/tag/rust-win-api/","/tag/english/"]},"frontmatter":{"date":"2025-04-05","description":"Enumerating process information with Windows APIs in Rust","tags":["Rust","Windows","Rust-WinAPI","English"],"title":"Enumerating Process Information with Windows APIs in Rust","socialImage":{"publicURL":"/static/f6d8b1a54ce1b9da10d734a48a8a0ca8/rust-winapi-process-enum.png"}}}},"pageContext":{"slug":"/rust-winapi-process-enum-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}