{"componentChunkName":"component---src-templates-post-template-js","path":"/rust-winapi-createfilepapping-en","result":{"data":{"markdownRemark":{"id":"e051b360-f3d1-5f3e-a195-8b036d746e47","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/rust-winapi-createfilepapping\">original page</a>.</p>\n</blockquote>\n<p>Continuing from the <a href=\"/tag/rust-win-api\">previous articles</a>, this time I tried implementing a program in Rust that uses APIs such as CreateFileMapping through the <code class=\"language-text\">windows</code> crate.</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><a href=\"#the-code-i-created\">The code I created</a></li>\n<li><a href=\"#loaded-modules\">Loaded modules</a></li>\n<li><a href=\"#receiving-standard-input\">Receiving standard input</a></li>\n<li>\n<p><a href=\"#using-the-createfilemappingw-api\">Using the CreateFileMappingW API</a></p>\n<ul>\n<li><a href=\"#creating-a-page-file-mapping\">Creating a page-file mapping</a></li>\n<li><a href=\"#mapping-a-file-into-memory\">Mapping a file into memory</a></li>\n</ul>\n</li>\n<li><a href=\"#loading-the-file-mapping-into-process-memory-with-mapviewoffile\">Loading the file mapping into process memory with MapViewOfFile</a></li>\n<li><a href=\"#writing-data-to-the-mapped-memory\">Writing data to the mapped memory</a></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>In the following program, I create file-mapping objects in process memory using both the paging file and a text file, and then write data to them.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// cargo run --bin CreateFileMap</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\">Foundation</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span> <span class=\"token constant\">HANDLE</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">INVALID_HANDLE_VALUE</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">CloseHandle</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\">Memory</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span> <span class=\"token class-name\">CreateFileMappingW</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">MapViewOfFile</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">UnmapViewOfFile</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">FILE_MAP_ALL_ACCESS</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">PAGE_READWRITE</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span></span><span class=\"token punctuation\">{</span>\n    <span class=\"token namespace\">fs<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">OpenOptions</span><span class=\"token punctuation\">,</span>\n    <span class=\"token namespace\">io<span class=\"token punctuation\">::</span></span>stdin<span class=\"token punctuation\">,</span>\n    <span class=\"token namespace\">os<span class=\"token punctuation\">::</span>windows<span class=\"token punctuation\">::</span>io<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">AsRawHandle</span><span class=\"token punctuation\">,</span>\n    <span class=\"token namespace\">ptr<span class=\"token punctuation\">::</span></span><span class=\"token punctuation\">{</span> copy_nonoverlapping<span class=\"token punctuation\">,</span> null_mut <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">get_input</span><span class=\"token punctuation\">(</span>input_string<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">str</span><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\">\"{}\"</span><span class=\"token punctuation\">,</span> input_string<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> input <span class=\"token operator\">=</span> <span class=\"token class-name\">String</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">stdin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read_line</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> input<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to read input.\"</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<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">create_memory_mapping</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 keyword\">let</span> size<span class=\"token punctuation\">:</span> <span class=\"token keyword\">usize</span> <span class=\"token operator\">=</span> <span class=\"token number\">1024</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">let</span> h_mapping <span class=\"token operator\">=</span> <span class=\"token class-name\">CreateFileMappingW</span><span class=\"token punctuation\">(</span>\n            <span class=\"token constant\">INVALID_HANDLE_VALUE</span><span class=\"token punctuation\">,</span>\n            <span class=\"token class-name\">Some</span><span class=\"token punctuation\">(</span><span class=\"token function\">null_mut</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 constant\">PAGE_READWRITE</span><span class=\"token punctuation\">,</span>\n            <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n            size <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n            <span class=\"token class-name\">None</span><span class=\"token punctuation\">,</span>\n        <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\n        <span class=\"token keyword\">if</span> h_mapping <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\">\"CreateFileMappingW failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Mapping handle created: {:?}.\"</span><span class=\"token punctuation\">,</span> h_mapping<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token function\">get_input</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Please enter the key...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">let</span> p_view <span class=\"token operator\">=</span> <span class=\"token class-name\">MapViewOfFile</span><span class=\"token punctuation\">(</span>h_mapping<span class=\"token punctuation\">,</span> <span class=\"token constant\">FILE_MAP_ALL_ACCESS</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> p_view<span class=\"token punctuation\">.</span><span class=\"token class-name\">Value</span><span class=\"token punctuation\">.</span><span class=\"token function\">is_null</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MapViewOfFile failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MapViewOfFile created: {:?}.\"</span><span class=\"token punctuation\">,</span> p_view<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token function\">get_input</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Please enter the key...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">let</span> data <span class=\"token operator\">=</span> <span class=\"token string\">b\"Hello from Rust!\"</span><span class=\"token punctuation\">;</span>\n        <span class=\"token namespace\">std<span class=\"token punctuation\">::</span>ptr<span class=\"token punctuation\">::</span></span><span class=\"token function\">copy_nonoverlapping</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">as_ptr</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> p_view<span class=\"token punctuation\">.</span><span class=\"token class-name\">Value</span> <span class=\"token keyword\">as</span> <span class=\"token operator\">*</span><span class=\"token keyword\">mut</span> <span class=\"token keyword\">u8</span><span class=\"token punctuation\">,</span> data<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 macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Data written to shared memory: {:?}\"</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token function\">get_input</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"create_memory_mapping finished.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">let</span> _ <span class=\"token operator\">=</span> <span class=\"token class-name\">UnmapViewOfFile</span><span class=\"token punctuation\">(</span>p_view<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">let</span> _ <span class=\"token operator\">=</span> <span class=\"token class-name\">CloseHandle</span><span class=\"token punctuation\">(</span>h_mapping<span class=\"token punctuation\">)</span><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>\n\n\n<span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">read_file_and_create_file_maipping</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">let</span> size<span class=\"token punctuation\">:</span> <span class=\"token keyword\">usize</span> <span class=\"token operator\">=</span> <span class=\"token number\">32</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> path <span class=\"token operator\">=</span> <span class=\"token string\">\"C:\\\\Users\\\\kash1064\\\\Documents\\\\Dev\\\\WinAPITest\\\\test.txt\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> file <span class=\"token operator\">=</span> <span class=\"token class-name\">OpenOptions</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>path<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 comment\">// let file_size = file.metadata().unwrap().len();</span>\n    <span class=\"token keyword\">let</span> h_file <span class=\"token operator\">=</span> <span class=\"token constant\">HANDLE</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">.</span><span class=\"token function\">as_raw_handle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">unsafe</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">let</span> h_mapping <span class=\"token operator\">=</span> <span class=\"token class-name\">CreateFileMappingW</span><span class=\"token punctuation\">(</span>\n            h_file<span class=\"token punctuation\">,</span>\n            <span class=\"token class-name\">Some</span><span class=\"token punctuation\">(</span><span class=\"token function\">null_mut</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 constant\">PAGE_READWRITE</span><span class=\"token punctuation\">,</span>\n            <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n            size <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n            <span class=\"token class-name\">None</span><span class=\"token punctuation\">,</span>\n        <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\n        <span class=\"token keyword\">if</span> h_mapping <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\">\"CreateFileMappingW failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Mapping handle created: {:?}.\"</span><span class=\"token punctuation\">,</span> h_mapping<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n\n        <span class=\"token function\">get_input</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Please enter the key...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">let</span> p_view <span class=\"token operator\">=</span> <span class=\"token class-name\">MapViewOfFile</span><span class=\"token punctuation\">(</span>h_mapping<span class=\"token punctuation\">,</span> <span class=\"token constant\">FILE_MAP_ALL_ACCESS</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> p_view<span class=\"token punctuation\">.</span><span class=\"token class-name\">Value</span><span class=\"token punctuation\">.</span><span class=\"token function\">is_null</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MapViewOfFile failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MapViewOfFile created: {:?}.\"</span><span class=\"token punctuation\">,</span> p_view<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token function\">get_input</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Please enter the key...\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">let</span> data <span class=\"token operator\">=</span> <span class=\"token string\">b\"Hello from Rust!\"</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">copy_nonoverlapping</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">as_ptr</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> p_view<span class=\"token punctuation\">.</span><span class=\"token class-name\">Value</span> <span class=\"token keyword\">as</span> <span class=\"token operator\">*</span><span class=\"token keyword\">mut</span> <span class=\"token keyword\">u8</span><span class=\"token punctuation\">,</span> data<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 macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Data written to shared memory: {:?}\"</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token function\">get_input</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"read_file_and_create_file_maipping finished.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n        <span class=\"token keyword\">let</span> _ <span class=\"token operator\">=</span> <span class=\"token class-name\">UnmapViewOfFile</span><span class=\"token punctuation\">(</span>p_view<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">let</span> _ <span class=\"token operator\">=</span> <span class=\"token class-name\">CloseHandle</span><span class=\"token punctuation\">(</span>h_mapping<span class=\"token punctuation\">)</span><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<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\n    <span class=\"token function\">create_memory_mapping</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">read_file_and_create_file_maipping</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><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<h2 id=\"loaded-modules\" style=\"position:relative;\"><a href=\"#loaded-modules\" aria-label=\"loaded 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>Loaded modules</h2>\n<p>For this example, I load the following modules.</p>\n<p>I also use several standard library 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\">Foundation</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span> <span class=\"token constant\">HANDLE</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">INVALID_HANDLE_VALUE</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">CloseHandle</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\">Memory</span><span class=\"token punctuation\">::</span><span class=\"token punctuation\">{</span> <span class=\"token class-name\">CreateFileMappingW</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">MapViewOfFile</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">UnmapViewOfFile</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">FILE_MAP_ALL_ACCESS</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">PAGE_READWRITE</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">std<span class=\"token punctuation\">::</span></span><span class=\"token punctuation\">{</span>\n    <span class=\"token namespace\">fs<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">OpenOptions</span><span class=\"token punctuation\">,</span>\n    <span class=\"token namespace\">io<span class=\"token punctuation\">::</span></span>stdin<span class=\"token punctuation\">,</span>\n    <span class=\"token namespace\">os<span class=\"token punctuation\">::</span>windows<span class=\"token punctuation\">::</span>io<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">AsRawHandle</span><span class=\"token punctuation\">,</span>\n    <span class=\"token namespace\">ptr<span class=\"token punctuation\">::</span></span>null_mut\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"receiving-standard-input\" style=\"position:relative;\"><a href=\"#receiving-standard-input\" aria-label=\"receiving standard input 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>Receiving standard input</h2>\n<p>For this example, I created the following function to receive standard input.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">get_input</span><span class=\"token punctuation\">(</span>input_string<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">str</span><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\">\"{}\"</span><span class=\"token punctuation\">,</span> input_string<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> input <span class=\"token operator\">=</span> <span class=\"token class-name\">String</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">stdin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read_line</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> input<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to read input.\"</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>My impression was that Rust requires slightly more code than other languages to receive standard input.</p>\n<p>I wanted to do something like Python’s <code class=\"language-text\">input(\"Please input: \")</code>, but there did not seem to be a library function that could be used with exactly the same feel, so I defined it myself as the <code class=\"language-text\">get_input</code> function.</p>\n<p>The input itself is received with <code class=\"language-text\">stdin().read_line(&amp;mut input)</code>.</p>\n<p>Because this returns <code class=\"language-text\">Result&lt;usize></code>, I use <code class=\"language-text\">expect</code> to customize the error message when a panic occurs.</p>\n<p>Reference: <a href=\"https://doc.rust-lang.org/std/io/struct.Stdin.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Stdin in std::io - Rust</a></p>\n<h2 id=\"using-the-createfilemappingw-api\" style=\"position:relative;\"><a href=\"#using-the-createfilemappingw-api\" aria-label=\"using the createfilemappingw api 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>Using the CreateFileMappingW API</h2>\n<p>In this program, I created two functions that use the CreateFileMappingW API.</p>\n<p>One sets the first argument of the CreateFileMappingW function to <code class=\"language-text\">INVALID_HANDLE_VALUE</code> and uses the paging file, while the other uses a file named test.txt in local storage.</p>\n<p>Reference: <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CreateFileMappingW function (memoryapi.h) - Win32 apps | Microsoft Learn</a></p>\n<p>Reference: <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/memory/creating-named-shared-memory\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Creating Named Shared Memory - Win32 apps | Microsoft Learn</a></p>\n<h3 id=\"creating-a-page-file-mapping\" style=\"position:relative;\"><a href=\"#creating-a-page-file-mapping\" aria-label=\"creating a page file mapping 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>Creating a page-file mapping</h3>\n<p>In the <code class=\"language-text\">create_memory_mapping</code> function, I implemented the following code.</p>\n<p>The <code class=\"language-text\">CreateFileMappingW</code> function in the <code class=\"language-text\">windows</code> crate returns <code class=\"language-text\">Result&lt;HANDLE></code>, so I use <code class=\"language-text\">unwrap()</code> to obtain the <code class=\"language-text\">HANDLE</code> object.</p>\n<p>Also, because <code class=\"language-text\">INVALID_HANDLE_VALUE</code> is specified for the first argument at this point, the returned <code class=\"language-text\">HANDLE</code> should be a handle to a paging file mapped into memory.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">let</span> size<span class=\"token punctuation\">:</span> <span class=\"token keyword\">usize</span> <span class=\"token operator\">=</span> <span class=\"token number\">1024</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> h_mapping <span class=\"token operator\">=</span> <span class=\"token class-name\">CreateFileMappingW</span><span class=\"token punctuation\">(</span>\n    <span class=\"token constant\">INVALID_HANDLE_VALUE</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">Some</span><span class=\"token punctuation\">(</span><span class=\"token function\">null_mut</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 constant\">PAGE_READWRITE</span><span class=\"token punctuation\">,</span>\n    <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    size <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">None</span><span class=\"token punctuation\">,</span>\n<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\n<span class=\"token keyword\">if</span> h_mapping <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\">\"CreateFileMappingW failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Mapping handle created: {:?}.\"</span><span class=\"token punctuation\">,</span> h_mapping<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The second argument to <code class=\"language-text\">CreateFileMappingW</code> must be an <code class=\"language-text\">LPSECURITY_ATTRIBUTES</code> that specifies whether child processes can inherit the returned handle, but that is unnecessary here, so I specify NULL.</p>\n<p>In the <code class=\"language-text\">windows</code> crate, <code class=\"language-text\">CreateFileMappingW</code> expects this argument as <code class=\"language-text\">Option&lt;*const SECURITY_ATTRIBUTES></code>, so to pass a NULL pointer as an <code class=\"language-text\">Option</code>, I wrap the standard library function <code class=\"language-text\">null_mut()</code> in <code class=\"language-text\">Some()</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: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/beebb3dab1407555b3b9681425845560/4d383/image-20250412111548164.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: 39.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABDElEQVQoz52R20rGMBCE8zb+SRt6SDanHtPCjyAiCOL7P8m4qRUU7Y0XH0taMjszEW8vd7y/PmJ/StieEzLj7glmT4gpgqyFJYIt84TO8zAM8N4jxgjnHFJKEDENCHFA7x26QOiiQ58+IUfH5Sv2fT9Ep2nCOI7Ytg3CmJ7VCebc7i3Bk0N0HrbvUVfVb+r6EqG1xjxPGHIGLTOII7gQoNmxZheybSBZWHbtMRUbqFhUSvknoqguy4I9bxjXFZRX1NyF5IuqCPD/H2hGqUtE2ZbZXWbBwOV2xQ27Vg83yNsNird+58vJpWDpLXBEw1FrspD8sQgdU8nLaJeRm6ZB27b8IAaOOysVFNf/5QMpg/seb0aAlAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/beebb3dab1407555b3b9681425845560/8ac56/image-20250412111548164.webp 240w,\n/static/beebb3dab1407555b3b9681425845560/d3be9/image-20250412111548164.webp 480w,\n/static/beebb3dab1407555b3b9681425845560/e46b2/image-20250412111548164.webp 960w,\n/static/beebb3dab1407555b3b9681425845560/2ccb3/image-20250412111548164.webp 1195w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/beebb3dab1407555b3b9681425845560/8ff5a/image-20250412111548164.png 240w,\n/static/beebb3dab1407555b3b9681425845560/e85cb/image-20250412111548164.png 480w,\n/static/beebb3dab1407555b3b9681425845560/d9199/image-20250412111548164.png 960w,\n/static/beebb3dab1407555b3b9681425845560/4d383/image-20250412111548164.png 1195w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/beebb3dab1407555b3b9681425845560/d9199/image-20250412111548164.png\"\n            alt=\"image-20250412111548164\"\n            title=\"image-20250412111548164\"\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/Memory/fn.CreateFileMappingW.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CreateFileMappingW in windows::Win32::System::Memory - Rust</a></p>\n<h3 id=\"mapping-a-file-into-memory\" style=\"position:relative;\"><a href=\"#mapping-a-file-into-memory\" aria-label=\"mapping a file into memory 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>Mapping a file into memory</h3>\n<p>In the other function, <code class=\"language-text\">read_file_and_create_file_maipping</code>, I obtain a file handle for test.txt located at <code class=\"language-text\">C:\\Folder\\test.txt</code> on the local machine, and use <code class=\"language-text\">CreateFileMappingW</code> to create a mapping for it in process memory.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">let</span> size<span class=\"token punctuation\">:</span> <span class=\"token keyword\">usize</span> <span class=\"token operator\">=</span> <span class=\"token number\">32</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> path <span class=\"token operator\">=</span> <span class=\"token string\">\"C:\\\\Folder\\\\test.txt\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> file <span class=\"token operator\">=</span> <span class=\"token class-name\">OpenOptions</span><span class=\"token punctuation\">::</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span>path<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 comment\">// let file_size = file.metadata().unwrap().len();</span>\n<span class=\"token keyword\">let</span> h_file <span class=\"token operator\">=</span> <span class=\"token constant\">HANDLE</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">.</span><span class=\"token function\">as_raw_handle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">let</span> h_mapping <span class=\"token operator\">=</span> <span class=\"token class-name\">CreateFileMappingW</span><span class=\"token punctuation\">(</span>\n    h_file<span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">Some</span><span class=\"token punctuation\">(</span><span class=\"token function\">null_mut</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 constant\">PAGE_READWRITE</span><span class=\"token punctuation\">,</span>\n    <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    size <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n    <span class=\"token class-name\">None</span><span class=\"token punctuation\">,</span>\n<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\n<span class=\"token keyword\">if</span> h_mapping <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\">\"CreateFileMappingW failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Mapping handle created: {:?}.\"</span><span class=\"token punctuation\">,</span> h_mapping<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>To obtain the file handle, I use the standard library functions <code class=\"language-text\">std::fs::OpenOptions</code> and <code class=\"language-text\">std::os::windows::io::AsRawHandle</code>.</p>\n<p>With <code class=\"language-text\">OpenOptions</code>, you can open a file after specifying options as in the following example.</p>\n<p>Because <code class=\"language-text\">OpenOptions::new().open(path)</code> returns <code class=\"language-text\">Result&lt;File></code>, I use <code class=\"language-text\">unwrap()</code> to extract the <code class=\"language-text\">File</code> object.</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/c03af1cf2f9b0882cf1a662a54f3c39d/4dba2/image-20250412112519369.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: 47.08333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA9UlEQVQoz6WRXW6EMAyEOQ4EEvJHAoFNoI9difvfZmqn3VVbtdJu+/DJUmxP7HHzer3iPE+UUjDP87+IMaJJa0JKCdu2YVkWWGvhnPszjZIjrLEwxsBPE0IIGMcRbdui67qH4fq+79Ho0dzVl7RUwYmEq7j3iPTRFCZoK6CNgFQSvehr83eklGjKXrDvO3LONR7HUf3ciUu+IJf8Jb+u690Wjp+pK/OE3nl4mibEgEjm8vpCiB+n+A2urxOyh1obQtfjRF7XOyilnvKQqR7e1DmudOkXOr2TCi0V8PujsOAwDO+C3UdzIn9StPCG1qBk94ToTfAN2tcaPZjCIIEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/c03af1cf2f9b0882cf1a662a54f3c39d/8ac56/image-20250412112519369.webp 240w,\n/static/c03af1cf2f9b0882cf1a662a54f3c39d/d3be9/image-20250412112519369.webp 480w,\n/static/c03af1cf2f9b0882cf1a662a54f3c39d/e46b2/image-20250412112519369.webp 960w,\n/static/c03af1cf2f9b0882cf1a662a54f3c39d/ee998/image-20250412112519369.webp 1151w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/c03af1cf2f9b0882cf1a662a54f3c39d/8ff5a/image-20250412112519369.png 240w,\n/static/c03af1cf2f9b0882cf1a662a54f3c39d/e85cb/image-20250412112519369.png 480w,\n/static/c03af1cf2f9b0882cf1a662a54f3c39d/d9199/image-20250412112519369.png 960w,\n/static/c03af1cf2f9b0882cf1a662a54f3c39d/4dba2/image-20250412112519369.png 1151w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/c03af1cf2f9b0882cf1a662a54f3c39d/d9199/image-20250412112519369.png\"\n            alt=\"image-20250412112519369\"\n            title=\"image-20250412112519369\"\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://doc.rust-lang.org/std/fs/struct.OpenOptions.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">OpenOptions in std::fs - Rust</a></p>\n<p>Next, from the <code class=\"language-text\">File</code> object obtained here, I use <code class=\"language-text\">AsRawHandle</code> to obtain a <code class=\"language-text\">HANDLE</code> object. This is a function available only on Windows.</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/8fa7b826c07a86d7f4cb7919facf462a/e9d87/image-20250412112908732.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: 32.916666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA50lEQVQoz42R0WrDIBSGfZxookaNSYo1uoZ1WcegsDIGu9j7P8W/E8vGLsqai4+DR8/vJ7K35wWX5QWP6YQYHtD3Hl3X3WUYBozjCO89zfS/sEM64inPSGFG2MXSXA/9xxqYcsI800zYI8aInDNySmDOGfjOUFAH5yykVFCKkPKKUjfRWqNt21J/MMaA9aQe6IYwRcQ0lQ0hBLhswBuC85tUVVX4u67rGkxKAaGoqTk02Trn0JCBoFpbW8K3sIY2JMDc/gg/LbC7Aynb8gxL6rY110qhW1ll2OvlE+ePL5zO7/AbPuQe384U396NuPNeAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/8fa7b826c07a86d7f4cb7919facf462a/8ac56/image-20250412112908732.webp 240w,\n/static/8fa7b826c07a86d7f4cb7919facf462a/d3be9/image-20250412112908732.webp 480w,\n/static/8fa7b826c07a86d7f4cb7919facf462a/e46b2/image-20250412112908732.webp 960w,\n/static/8fa7b826c07a86d7f4cb7919facf462a/c9586/image-20250412112908732.webp 1176w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/8fa7b826c07a86d7f4cb7919facf462a/8ff5a/image-20250412112908732.png 240w,\n/static/8fa7b826c07a86d7f4cb7919facf462a/e85cb/image-20250412112908732.png 480w,\n/static/8fa7b826c07a86d7f4cb7919facf462a/d9199/image-20250412112908732.png 960w,\n/static/8fa7b826c07a86d7f4cb7919facf462a/e9d87/image-20250412112908732.png 1176w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/8fa7b826c07a86d7f4cb7919facf462a/d9199/image-20250412112908732.png\"\n            alt=\"image-20250412112908732\"\n            title=\"image-20250412112908732\"\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://doc.rust-lang.org/std/os/windows/io/trait.AsRawHandle.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">AsRawHandle in std::os::windows::io - Rust</a></p>\n<p>This <code class=\"language-text\">HANDLE</code> object can be used as-is as an argument to the <code class=\"language-text\">CreateFileMappingW</code> function in the <code class=\"language-text\">windows</code> crate, so I use it to obtain a handle to the mapping object for test.txt.</p>\n<h2 id=\"loading-the-file-mapping-into-process-memory-with-mapviewoffile\" style=\"position:relative;\"><a href=\"#loading-the-file-mapping-into-process-memory-with-mapviewoffile\" aria-label=\"loading the file mapping into process memory with mapviewoffile 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 the file mapping into process memory with MapViewOfFile</h2>\n<p>Using the handle to the file-mapping object obtained in the code above as an argument, I load it into process memory with <code class=\"language-text\">MapViewOfFile</code> and obtain its address.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">let</span> p_view <span class=\"token operator\">=</span> <span class=\"token class-name\">MapViewOfFile</span><span class=\"token punctuation\">(</span>h_mapping<span class=\"token punctuation\">,</span> <span class=\"token constant\">FILE_MAP_ALL_ACCESS</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> p_view<span class=\"token punctuation\">.</span><span class=\"token class-name\">Value</span><span class=\"token punctuation\">.</span><span class=\"token function\">is_null</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token macro property\">eprintln!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MapViewOfFile failed\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MapViewOfFile created: {:?}.\"</span><span class=\"token punctuation\">,</span> p_view<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://microsoft.github.io/windows-docs-rs/doc/windows/Win32/System/Memory/fn.MapViewOfFile.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">MapViewOfFile in windows::Win32::System::Memory - Rust</a></p>\n<p>For the access rights, I specify <code class=\"language-text\">FILE_MAP_ALL_ACCESS</code>, which allows reading and writing.</p>\n<p>Reference: <a href=\"https://learn.microsoft.com/ja-jp/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffile\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">MapViewOfFile function (memoryapi.h) - Win32 apps | Microsoft Learn</a></p>\n<h2 id=\"writing-data-to-the-mapped-memory\" style=\"position:relative;\"><a href=\"#writing-data-to-the-mapped-memory\" aria-label=\"writing data to the mapped memory 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>Writing data to the mapped memory</h2>\n<p>Finally, I write data to the region mapped into process memory with <code class=\"language-text\">copy_nonoverlapping</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token keyword\">let</span> data <span class=\"token operator\">=</span> <span class=\"token string\">b\"Hello from Rust!\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">copy_nonoverlapping</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">as_ptr</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> p_view<span class=\"token punctuation\">.</span><span class=\"token class-name\">Value</span> <span class=\"token keyword\">as</span> <span class=\"token operator\">*</span><span class=\"token keyword\">mut</span> <span class=\"token keyword\">u8</span><span class=\"token punctuation\">,</span> data<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 macro property\">println!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Data written to shared memory: {:?}\"</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">copy_nonoverlapping</code> function copies an arbitrary amount of data to a specified address, so it can perform an operation equivalent to C’s <code class=\"language-text\">memcpy</code>.</p>\n<p>Therefore, I write data into process memory by passing the pointer to the hard-coded text and the pointer address obtained by casting the <code class=\"language-text\">*mut c_void</code> extracted with <code class=\"language-text\">.Value</code> from the <code class=\"language-text\">MEMORY_MAPPED_VIEW_ADDRESS</code> returned by <code class=\"language-text\">MapViewOfFile</code> to <code class=\"language-text\">*mut u8</code>.</p>\n<p>Reference: <a href=\"https://doc.rust-lang.org/std/ptr/fn.copy_nonoverlapping.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">copy_nonoverlapping in std::ptr - Rust</a></p>\n<p>By running this code, the specified text is written to the mapped region of process memory.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 528px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/1d294bf9f08cd8fb67ffee6d313ca91c/4af8e/image-20250412114915594.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: 21.666666666666668%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAw0lEQVQY011Py47DIBDL/39hVbWpVG0CzADhFZJL4k6mqz3sARnsGdsM9/ENYwzmacL0M4G9BxHBOffl5xkhRli5W+vA7HEcB87zVPx/hloayHmM40uXUsooOSMtCTmVX8xYYvrTSqnKxbhgXZvyIURsfcPAFPB8vKShUWNrCUxeGrK0CXDGwV9oWXUSPvioekoJva9orUlIwb7vGK6h++0hC5dRhJnlW8KpgYTpmy5jFhOvc99gRs4F29ax9o5aqxp+AGg5LmkSvMU8AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/1d294bf9f08cd8fb67ffee6d313ca91c/8ac56/image-20250412114915594.webp 240w,\n/static/1d294bf9f08cd8fb67ffee6d313ca91c/d3be9/image-20250412114915594.webp 480w,\n/static/1d294bf9f08cd8fb67ffee6d313ca91c/83811/image-20250412114915594.webp 528w\"\n              sizes=\"(max-width: 528px) 100vw, 528px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/1d294bf9f08cd8fb67ffee6d313ca91c/8ff5a/image-20250412114915594.png 240w,\n/static/1d294bf9f08cd8fb67ffee6d313ca91c/e85cb/image-20250412114915594.png 480w,\n/static/1d294bf9f08cd8fb67ffee6d313ca91c/4af8e/image-20250412114915594.png 528w\"\n            sizes=\"(max-width: 528px) 100vw, 528px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/1d294bf9f08cd8fb67ffee6d313ca91c/4af8e/image-20250412114915594.png\"\n            alt=\"image-20250412114915594\"\n            title=\"image-20250412114915594\"\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>Also, by writing data to the region mapped from the test.txt file, you can confirm that 32 bytes of data including <code class=\"language-text\">Hello from Rust!</code> are written to the target file.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 837px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/c0ea959f5f7be56cb42ec3d2356e16bc/ddc81/image-20250412115025521.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: 13.333333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAf0lEQVQI14WMSw6EMAxDuQhtQf3QzrL/FsT9T+VRIoFmN4snJ07sxVqH8zxRSkHvHWMMtNZ4nnPy/vg5Z8QYcd83ruuC9x5SSmzb9rL48EGtFSklDlAx6S9UQndSYwy01sy+73DOsWetZV2OwyOEwO308A8KKqWwriuEEK8+fAEadVoz3ryJHAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/c0ea959f5f7be56cb42ec3d2356e16bc/8ac56/image-20250412115025521.webp 240w,\n/static/c0ea959f5f7be56cb42ec3d2356e16bc/d3be9/image-20250412115025521.webp 480w,\n/static/c0ea959f5f7be56cb42ec3d2356e16bc/a6125/image-20250412115025521.webp 837w\"\n              sizes=\"(max-width: 837px) 100vw, 837px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/c0ea959f5f7be56cb42ec3d2356e16bc/8ff5a/image-20250412115025521.png 240w,\n/static/c0ea959f5f7be56cb42ec3d2356e16bc/e85cb/image-20250412115025521.png 480w,\n/static/c0ea959f5f7be56cb42ec3d2356e16bc/ddc81/image-20250412115025521.png 837w\"\n            sizes=\"(max-width: 837px) 100vw, 837px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/c0ea959f5f7be56cb42ec3d2356e16bc/ddc81/image-20250412115025521.png\"\n            alt=\"image-20250412115025521\"\n            title=\"image-20250412115025521\"\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=\"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>I am using various Windows APIs while also learning Rust.</p>\n<p>I am happy that they are gradually starting to feel more familiar.</p>","fields":{"slug":"/rust-winapi-createfilepapping-en","tagSlugs":["/tag/rust/","/tag/windows/","/tag/rust-win-api/","/tag/english/"]},"frontmatter":{"date":"2025-04-12","description":"I used Windows APIs in Rust to perform file mapping.","tags":["Rust","Windows","Rust-WinAPI","English"],"title":"Using Windows APIs for File Mapping in Rust","socialImage":{"publicURL":"/static/526bc59ae3199973998e54d34d91ac6d/rust-winapi-createfilepapping.png"}}}},"pageContext":{"slug":"/rust-winapi-createfilepapping-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}