Files
hakril-PythonForWindows/docs/build/html/_modules/windows/utils/winutils.html
T

700 lines
106 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>windows.utils.winutils &#8212; PythonForWindows 0.6 documentation</title>
<link rel="stylesheet" href="../../../_static/classic.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../../_static/css/mbasic.css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">PythonForWindows 0.6 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for windows.utils.winutils</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">msvcrt</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">code</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">namedtuple</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">from</span> <span class="nn">windows.dbgprint</span> <span class="kn">import</span> <span class="n">dbgprint</span>
<span class="kn">import</span> <span class="nn">windows.generated_def</span> <span class="k">as</span> <span class="nn">gdef</span>
<span class="kn">from</span> <span class="nn">..</span> <span class="kn">import</span> <span class="n">winproxy</span>
<span class="kn">from</span> <span class="nn">..generated_def.winstructs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="c1"># Function resolution !</span>
<span class="c1"># should be in winproxy ?</span>
<span class="k">def</span> <span class="nf">get_func_addr</span><span class="p">(</span><span class="n">dll_name</span><span class="p">,</span> <span class="n">func_name</span><span class="p">):</span>
<span class="c1"># Load the DLL</span>
<span class="n">ctypes</span><span class="o">.</span><span class="n">WinDLL</span><span class="p">(</span><span class="n">dll_name</span><span class="p">)</span>
<span class="n">modules</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">peb</span><span class="o">.</span><span class="n">modules</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">dll_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;.dll&quot;</span><span class="p">):</span>
<span class="n">dll_name</span> <span class="o">+=</span> <span class="s2">&quot;.dll&quot;</span>
<span class="n">mod</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">modules</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">dll_name</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">mod</span><span class="o">.</span><span class="n">pe</span><span class="o">.</span><span class="n">exports</span><span class="p">[</span><span class="n">func_name</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">get_remote_func_addr</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">dll_name</span><span class="p">,</span> <span class="n">func_name</span><span class="p">):</span>
<span class="n">name_modules</span> <span class="o">=</span> <span class="p">[</span><span class="n">m</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">target</span><span class="o">.</span><span class="n">peb</span><span class="o">.</span><span class="n">modules</span> <span class="k">if</span> <span class="n">m</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">dll_name</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="n">name_modules</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Module &lt;</span><span class="si">{0}</span><span class="s2">&gt; not loaded in target &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">dll_name</span><span class="p">,</span> <span class="n">target</span><span class="p">))</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">name_modules</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">mod</span><span class="o">.</span><span class="n">pe</span><span class="o">.</span><span class="n">exports</span><span class="p">[</span><span class="n">func_name</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">is_wow_64</span><span class="p">(</span><span class="n">hProcess</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">fnIsWow64Process</span> <span class="o">=</span> <span class="n">get_func_addr</span><span class="p">(</span><span class="s2">&quot;kernel32.dll&quot;</span><span class="p">,</span> <span class="s2">&quot;IsWow64Process&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">WinproxyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">IsWow64Process</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="n">BOOL</span><span class="p">,</span> <span class="n">HANDLE</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">POINTER</span><span class="p">(</span><span class="n">BOOL</span><span class="p">))(</span><span class="n">fnIsWow64Process</span><span class="p">)</span>
<span class="n">Wow64Process</span> <span class="o">=</span> <span class="n">BOOL</span><span class="p">()</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">IsWow64Process</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">Wow64Process</span><span class="p">))</span>
<span class="k">if</span> <span class="n">res</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">Wow64Process</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WinError</span><span class="p">()</span>
<div class="viewcode-block" id="create_file_from_handle"><a class="viewcode-back" href="../../../utils.html#windows.utils.create_file_from_handle">[docs]</a><span class="k">def</span> <span class="nf">create_file_from_handle</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;r&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return a Python :class:`file` around a ``Windows`` HANDLE&quot;&quot;&quot;</span>
<span class="n">flags</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">O_BINARY</span> <span class="k">if</span> <span class="s2">&quot;b&quot;</span> <span class="ow">in</span> <span class="n">mode</span> <span class="k">else</span> <span class="n">os</span><span class="o">.</span><span class="n">O_TEXT</span>
<span class="n">fd</span> <span class="o">=</span> <span class="n">msvcrt</span><span class="o">.</span><span class="n">open_osfhandle</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">is_py3</span> <span class="ow">and</span> <span class="n">flags</span> <span class="o">==</span> <span class="n">os</span><span class="o">.</span><span class="n">O_TEXT</span><span class="p">:</span>
<span class="c1"># Buffering, encoding</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Buffering</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)</span>
<span class="c1"># In py2 os.fdopen do not accept kwargs</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">fdopen</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
<div class="viewcode-block" id="get_handle_from_file"><a class="viewcode-back" href="../../../utils.html#windows.utils.get_handle_from_file">[docs]</a><span class="k">def</span> <span class="nf">get_handle_from_file</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get the ``Windows`` HANDLE of a python :class:`file`&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">msvcrt</span><span class="o">.</span><span class="n">get_osfhandle</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span></div>
<div class="viewcode-block" id="create_console"><a class="viewcode-back" href="../../../utils.html#windows.utils.create_console">[docs]</a><span class="k">def</span> <span class="nf">create_console</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;Create a new console displaying STDOUT.</span>
<span class="sd"> Useful in injection of GUI process&quot;&quot;&quot;</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">AllocConsole</span><span class="p">()</span>
<span class="n">stdout_handle</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetStdHandle</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">STD_OUTPUT_HANDLE</span><span class="p">)</span>
<span class="n">console_stdout</span> <span class="o">=</span> <span class="n">create_file_from_handle</span><span class="p">(</span><span class="n">stdout_handle</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">console_stdout</span>
<span class="n">stdin_handle</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetStdHandle</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">STD_INPUT_HANDLE</span><span class="p">)</span>
<span class="n">console_stdin</span> <span class="o">=</span> <span class="n">create_file_from_handle</span><span class="p">(</span><span class="n">stdin_handle</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdin</span> <span class="o">=</span> <span class="n">console_stdin</span>
<span class="n">stderr_handle</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetStdHandle</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">STD_ERROR_HANDLE</span><span class="p">)</span>
<span class="n">console_stderr</span> <span class="o">=</span> <span class="n">create_file_from_handle</span><span class="p">(</span><span class="n">stderr_handle</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">console_stderr</span></div>
<div class="viewcode-block" id="create_process"><a class="viewcode-back" href="../../../utils.html#windows.utils.create_process">[docs]</a><span class="k">def</span> <span class="nf">create_process</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dwCreationFlags</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">show_windows</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A convenient wrapper arround :func:`windows.winproxy.CreateProcessA`&quot;&quot;&quot;</span>
<span class="n">proc_info</span> <span class="o">=</span> <span class="n">PROCESS_INFORMATION</span><span class="p">()</span>
<span class="n">lpStartupInfo</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">show_windows</span><span class="p">:</span>
<span class="n">StartupInfo</span> <span class="o">=</span> <span class="n">STARTUPINFOW</span><span class="p">()</span>
<span class="n">StartupInfo</span><span class="o">.</span><span class="n">cb</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">StartupInfo</span><span class="p">)</span>
<span class="n">StartupInfo</span><span class="o">.</span><span class="n">dwFlags</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">lpStartupInfo</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">StartupInfo</span><span class="p">)</span>
<span class="n">lpCommandLine</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="n">unicode_args</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
<span class="n">arg</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
<span class="n">unicode_args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="n">lpCommandLine</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">unicode_args</span><span class="p">))</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateProcessW</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">lpCommandLine</span><span class="o">=</span><span class="n">lpCommandLine</span><span class="p">,</span> <span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">dwCreationFlags</span><span class="p">,</span> <span class="n">lpProcessInformation</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">proc_info</span><span class="p">),</span> <span class="n">lpStartupInfo</span><span class="o">=</span><span class="n">lpStartupInfo</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;CreateProcessW new process handle </span><span class="si">{:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hProcess</span><span class="p">),</span> <span class="s2">&quot;HANDLE&quot;</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;CreateProcessW new thread handle </span><span class="si">{:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hThread</span><span class="p">),</span> <span class="s2">&quot;HANDLE&quot;</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;Automatic close of thread handle </span><span class="si">{:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hThread</span><span class="p">),</span> <span class="s2">&quot;HANDLE&quot;</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CloseHandle</span><span class="p">(</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hThread</span><span class="p">)</span> <span class="c1"># Give access to a WinThread in addition of the WinProcess ?</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hProcess</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">device_io_control</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">iocode</span><span class="p">,</span> <span class="n">buffer</span><span class="p">):</span>
<span class="n">outbuffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">returned_size</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">DeviceIoControl</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">iocode</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">lpOutBuffer</span><span class="o">=</span><span class="n">outbuffer</span><span class="p">,</span> <span class="n">lpBytesReturned</span><span class="o">=</span><span class="n">returned_size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">outbuffer</span><span class="p">[:</span><span class="n">returned_size</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">tmp_cp_as</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
<span class="n">proc_info</span> <span class="o">=</span> <span class="n">PROCESS_INFORMATION</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateProcessAsUserA</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">lpCommandLine</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">CREATE_NEW_CONSOLE</span><span class="p">,</span> <span class="n">lpProcessInformation</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">proc_info</span><span class="p">),</span> <span class="n">lpStartupInfo</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hProcess</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">find_handle</span><span class="p">(</span><span class="n">proc</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">h</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">handles</span> <span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">dwProcessId</span> <span class="o">==</span> <span class="n">proc</span><span class="o">.</span><span class="n">pid</span> <span class="ow">and</span> <span class="n">h</span><span class="o">.</span><span class="n">wValue</span> <span class="o">==</span> <span class="n">value</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">lookup_privilege_value</span><span class="p">(</span><span class="n">privilege_name</span><span class="p">):</span>
<span class="n">luid</span> <span class="o">=</span> <span class="n">LUID</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">LookupPrivilegeValueA</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">privilege_name</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">luid</span><span class="p">))</span>
<span class="k">return</span> <span class="n">luid</span>
<span class="k">def</span> <span class="nf">lookup_privilege_name</span><span class="p">(</span><span class="n">privilege_value</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">privilege_value</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">luid</span> <span class="o">=</span> <span class="n">LUID</span><span class="p">(</span><span class="n">privilege_value</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">privilege_value</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">privilege_value</span> <span class="o">=</span> <span class="n">luid</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">(</span><span class="mh">0x100</span><span class="p">)</span>
<span class="n">buff</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">size</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">LookupPrivilegeNameA</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">privilege_value</span><span class="p">,</span> <span class="n">buff</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buff</span><span class="p">[:</span><span class="n">size</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">lookup_sid</span><span class="p">(</span><span class="n">psid</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Retrieves the name of the Computer/Domain and the name of the Account for a given SID</span>
<span class="sd"> :returns: (:class:`unicode`, :class:`unicode`) - A tuple of two unicode strings</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">usernamesize</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">computernamesize</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">username</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_unicode_buffer</span><span class="p">(</span><span class="n">usernamesize</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">computername</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_unicode_buffer</span><span class="p">(</span><span class="n">computernamesize</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">peUse</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SID_NAME_USE</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">LookupAccountSidW</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">psid</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">usernamesize</span><span class="p">,</span> <span class="n">computername</span><span class="p">,</span> <span class="n">computernamesize</span><span class="p">,</span> <span class="n">peUse</span><span class="p">)</span>
<span class="k">return</span> <span class="n">computername</span><span class="p">[:</span><span class="n">computernamesize</span><span class="o">.</span><span class="n">value</span><span class="p">],</span> <span class="n">username</span><span class="p">[:</span><span class="n">usernamesize</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<div class="viewcode-block" id="enable_privilege"><a class="viewcode-back" href="../../../utils.html#windows.utils.enable_privilege">[docs]</a><span class="k">def</span> <span class="nf">enable_privilege</span><span class="p">(</span><span class="n">lpszPrivilege</span><span class="p">,</span> <span class="n">bEnablePrivilege</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Enable or disable a privilege::</span>
<span class="sd"> enable_privilege(SE_DEBUG_NAME, True)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tp</span> <span class="o">=</span> <span class="n">TOKEN_PRIVILEGES</span><span class="p">()</span>
<span class="n">luid</span> <span class="o">=</span> <span class="n">LUID</span><span class="p">()</span>
<span class="n">hToken</span> <span class="o">=</span> <span class="n">HANDLE</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">OpenProcessToken</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">GetCurrentProcess</span><span class="p">(),</span> <span class="n">TOKEN_ALL_ACCESS</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">hToken</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">LookupPrivilegeValueA</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">lpszPrivilege</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">luid</span><span class="p">))</span>
<span class="n">tp</span><span class="o">.</span><span class="n">PrivilegeCount</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">tp</span><span class="o">.</span><span class="n">Privileges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Luid</span> <span class="o">=</span> <span class="n">luid</span>
<span class="k">if</span> <span class="n">bEnablePrivilege</span><span class="p">:</span>
<span class="n">tp</span><span class="o">.</span><span class="n">Privileges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Attributes</span> <span class="o">=</span> <span class="n">SE_PRIVILEGE_ENABLED</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">tp</span><span class="o">.</span><span class="n">Privileges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Attributes</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">AdjustTokenPrivileges</span><span class="p">(</span><span class="n">hToken</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">tp</span><span class="p">),</span> <span class="n">sizeof</span><span class="p">(</span><span class="n">TOKEN_PRIVILEGES</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CloseHandle</span><span class="p">(</span><span class="n">hToken</span><span class="p">)</span>
<span class="k">if</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetLastError</span><span class="p">()</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ERROR_NOT_ALL_ASSIGNED</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Failed to get privilege </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lpszPrivilege</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="check_is_elevated"><a class="viewcode-back" href="../../../utils.html#windows.utils.check_is_elevated">[docs]</a><span class="k">def</span> <span class="nf">check_is_elevated</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;Return ``True`` if process is Admin&quot;&quot;&quot;</span>
<span class="n">hToken</span> <span class="o">=</span> <span class="n">HANDLE</span><span class="p">()</span>
<span class="n">elevation</span> <span class="o">=</span> <span class="n">TOKEN_ELEVATION</span><span class="p">()</span>
<span class="n">cbsize</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">OpenProcessToken</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">GetCurrentProcess</span><span class="p">(),</span> <span class="n">TOKEN_ALL_ACCESS</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">hToken</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetTokenInformation</span><span class="p">(</span><span class="n">hToken</span><span class="p">,</span> <span class="n">TokenElevation</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">elevation</span><span class="p">),</span> <span class="n">sizeof</span><span class="p">(</span><span class="n">elevation</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">cbsize</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CloseHandle</span><span class="p">(</span><span class="n">hToken</span><span class="p">)</span>
<span class="k">return</span> <span class="n">elevation</span><span class="o">.</span><span class="n">TokenIsElevated</span></div>
<div class="viewcode-block" id="check_debug"><a class="viewcode-back" href="../../../utils.html#windows.utils.check_debug">[docs]</a><span class="k">def</span> <span class="nf">check_debug</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;Check that kernel is in debug mode (beware of NOUMEX):</span>
<span class="sd"> https://msdn.microsoft.com/en-us/library/windows/hardware/ff556253(v=vs.85).aspx#_______noumex______</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">registry</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control&#39;</span><span class="p">)[</span><span class="s1">&#39;SystemStartOptions&#39;</span><span class="p">]</span>
<span class="n">control</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">value</span>
<span class="k">if</span> <span class="s2">&quot;DEBUG&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">control</span><span class="p">:</span>
<span class="c1"># print &quot;[-] Enable debug boot!&quot;</span>
<span class="c1"># print &quot;&gt; bcdedit /debug on&quot;</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="s2">&quot;DEBUG=NOUMEX&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">control</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1"># print &quot;[*] Warning noumex not set!&quot;</span>
<span class="c1"># print &quot;&gt; bcdedit /set noumex on&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<span class="n">UNIX_EPOCH</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">1970</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">WINDOWS_EPOCH</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">1601</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1"># https://docs.microsoft.com/en-us/cpp/atl-mfc-shared/date-type?view=vs-2019</span>
<span class="c1"># Why keep it simple and have only one epoch ? :D</span>
<span class="c1"># I don&#39;t want to name this &quot;DATE_EPOCH&quot; as everything is a DATE</span>
<span class="c1"># So let&#39;s go with COMDATE as this structure seems very related to COM/AUTOMATION</span>
<span class="n">COMDATE_EPOCH</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">1899</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">WIN_TO_UNIX_EPOCH_SECOND</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">UNIX_EPOCH</span> <span class="o">-</span> <span class="n">WINDOWS_EPOCH</span><span class="p">)</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">())</span>
<span class="n">WIN_TICK_PER_SECOND_INT</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="mi">7</span>
<span class="n">WIN_TICK_PER_SECOND_FLOAT</span> <span class="o">=</span> <span class="mf">10.0</span><span class="o">**</span><span class="mi">7</span>
<span class="n">WIN_TO_UNIX_EPOCH_WIN_TICKS</span> <span class="o">=</span> <span class="n">WIN_TO_UNIX_EPOCH_SECOND</span> <span class="o">*</span> <span class="n">WIN_TICK_PER_SECOND_INT</span>
<span class="c1"># TODO: look in python stblib how filetime -&gt; unix timestamp translation is down (os.stat code ?)</span>
<span class="k">def</span> <span class="nf">unix_timestamp_from_filetime</span><span class="p">(</span><span class="n">filetime</span><span class="p">):</span>
<span class="c1"># Round the filetime</span>
<span class="n">last_number</span> <span class="o">=</span> <span class="p">(</span><span class="n">filetime</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span>
<span class="c1"># We do some sort of &quot;manual rounding cause of py2 vs py3</span>
<span class="c1"># PY2: round(0.5) == 1</span>
<span class="c1"># PY3: round(0.5) == 0</span>
<span class="k">if</span> <span class="n">last_number</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">last_number</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">)</span>
<span class="n">round_win_ticks</span> <span class="o">=</span> <span class="p">((</span><span class="n">filetime</span> <span class="o">//</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">rounding</span><span class="p">))</span> <span class="o">*</span> <span class="mi">10</span>
<span class="k">return</span> <span class="nb">round</span><span class="p">((</span><span class="n">round_win_ticks</span> <span class="o">-</span> <span class="n">WIN_TO_UNIX_EPOCH_WIN_TICKS</span><span class="p">)</span> <span class="o">/</span> <span class="n">WIN_TICK_PER_SECOND_FLOAT</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">datetime_from_filetime</span><span class="p">(</span><span class="n">filetime</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;return a :class:`datetime.datetime` from a ``windows`` FILETIME int&quot;&quot;&quot;</span>
<span class="c1"># Manual non-approx rounding as filetime will not have a perfect representation as Python float</span>
<span class="c1"># We do some sort of &quot;manual rounding cause of py2 vs py3</span>
<span class="c1"># PY2: round(0.5) == 1</span>
<span class="c1"># PY3: round(0.5) == 0</span>
<span class="n">last_number</span> <span class="o">=</span> <span class="p">(</span><span class="n">filetime</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span>
<span class="k">if</span> <span class="n">last_number</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">last_number</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">)</span>
<span class="n">round_microsecond</span> <span class="o">=</span> <span class="p">(</span><span class="n">filetime</span> <span class="o">//</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">rounding</span><span class="p">)</span>
<span class="k">return</span> <span class="n">WINDOWS_EPOCH</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">microseconds</span><span class="o">=</span><span class="n">round_microsecond</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">filetime_from_datetime</span><span class="p">(</span><span class="n">dtime</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the FILETIME value from a :class:`datetime.datetime` in a python :class:`int`&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">((</span><span class="n">dtime</span> <span class="o">-</span> <span class="n">WINDOWS_EPOCH</span><span class="p">)</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">())</span> <span class="o">*</span> <span class="n">WIN_TICK_PER_SECOND_INT</span>
<span class="k">def</span> <span class="nf">datetime_from_comdate</span><span class="p">(</span><span class="n">comtime</span><span class="p">):</span>
<span class="c1"># Hour values are expressed as the absolute value of the fractional part of the number.</span>
<span class="k">if</span> <span class="n">comtime</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># The date timeline becomes discontinuous for date values less than 0 (before 30 December 1899). This is because the whole-number portion of the date value is treated as signed, while the fractional part is treated as unsigned.</span>
<span class="c1"># other words, the whole-number part of the date value may be positive or negative, while the fractional part of the date value is always added to the overall logical date.</span>
<span class="c1"># WTF :D</span>
<span class="n">dec</span><span class="p">,</span> <span class="n">nb</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">modf</span><span class="p">(</span><span class="n">comtime</span><span class="p">)</span>
<span class="n">final_delta</span> <span class="o">=</span> <span class="n">nb</span> <span class="o">+</span> <span class="nb">abs</span><span class="p">(</span><span class="n">dec</span><span class="p">)</span>
<span class="k">return</span> <span class="n">COMDATE_EPOCH</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">final_delta</span><span class="p">)</span>
<span class="k">return</span> <span class="n">COMDATE_EPOCH</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">comtime</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">FixedInteractiveConsole</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">InteractiveConsole</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">raw_input</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prompt</span><span class="o">=</span><span class="s2">&quot;&gt;&gt;&gt;&quot;</span><span class="p">):</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
<span class="k">return</span> <span class="n">raw_input</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="pop_shell"><a class="viewcode-back" href="../../../utils.html#windows.utils.pop_shell">[docs]</a><span class="k">def</span> <span class="nf">pop_shell</span><span class="p">(</span><span class="n">locs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Pop a console with an InterativeConsole&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">locs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locs</span> <span class="o">=</span> <span class="nb">globals</span><span class="p">()</span>
<span class="n">create_console</span><span class="p">()</span>
<span class="n">FixedInteractiveConsole</span><span class="p">(</span><span class="n">locs</span><span class="p">)</span><span class="o">.</span><span class="n">interact</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">get_kernel_modules</span><span class="p">():</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;get_kernel_modules() will be removed: use windows.system.modules instead&quot;</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">modules</span>
<span class="k">class</span> <span class="nc">FileStreamInformation</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_STREAM_INFORMATION</span><span class="p">):</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPWSTR</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">StreamName</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="bp">self</span><span class="p">:</span>
<span class="k">yield</span> <span class="bp">self</span>
<span class="bp">self</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&lt;ADS name=&#39;</span><span class="si">{0}</span><span class="s2">&#39;&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">ntqueryinformationfile_info_structs</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileAccessInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_ACCESS_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileAlignmentInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_ALIGNMENT_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileAllInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_ALL_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileAttributeTagInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_ATTRIBUTE_TAG_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileBasicInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_BASIC_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileEaInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_EA_INFORMATION</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileInternalInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_INTERNAL_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileIoPriorityHintInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_IO_PRIORITY_HINT_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileModeInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_MODE_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileNetworkOpenInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_NETWORK_OPEN_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileNameInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_NAME_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FilePositionInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_POSITION_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileStandardInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_STANDARD_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileIsRemoteDeviceInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_IS_REMOTE_DEVICE_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileStreamInformation</span><span class="p">:</span> <span class="n">FileStreamInformation</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">query_file_information</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">file_info_class</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">int_types</span><span class="p">):</span>
<span class="n">file_or_handle</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_handle_from_file</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">)</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">file_or_handle</span>
<span class="n">io_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IO_STATUS_BLOCK</span><span class="p">()</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">ntqueryinformationfile_info_structs</span><span class="p">[</span><span class="n">file_info_class</span><span class="p">]()</span>
<span class="c1"># Do helper for &#39;is_pointer&#39; / get pointed_size &amp; co ? (useful for winproxy)</span>
<span class="n">pinfo</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">pointer</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryInformationFile</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">pinfo</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">info</span><span class="p">),</span> <span class="n">FileInformationClass</span><span class="o">=</span><span class="n">file_info_class</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">STATUS_BUFFER_OVERFLOW</span><span class="p">:</span>
<span class="k">raise</span>
<span class="c1"># STATUS_BUFFER_OVERFLOW -&gt; Guess we have a FILE_NAME_INFORMATION somewhere that need a bigger buffer</span>
<span class="k">if</span> <span class="n">file_info_class</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FileNameInformation</span><span class="p">:</span>
<span class="n">file_name_length</span> <span class="o">=</span> <span class="n">pinfo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">FileNameLength</span>
<span class="k">elif</span> <span class="n">file_info_class</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FileAllInformation</span><span class="p">:</span>
<span class="n">file_name_length</span> <span class="o">=</span> <span class="n">pinfo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">NameInformation</span><span class="o">.</span><span class="n">FileNameLength</span>
<span class="k">elif</span> <span class="n">file_info_class</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FileStreamInformation</span><span class="p">:</span>
<span class="n">file_name_length</span> <span class="o">=</span> <span class="mh">0x10000</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="n">full_size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">info</span><span class="p">)</span> <span class="o">+</span> <span class="n">file_name_length</span> <span class="c1"># We add a little too much size for the sake of simplicity</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">full_size</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryInformationFile</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">full_size</span><span class="p">,</span> <span class="n">FileInformationClass</span><span class="o">=</span><span class="n">file_info_class</span><span class="p">)</span>
<span class="n">pinfo</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">POINTER</span><span class="p">(</span><span class="n">ntqueryinformationfile_info_structs</span><span class="p">[</span><span class="n">file_info_class</span><span class="p">]))</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">pinfo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># return list of ADS if FileStreamInformation ?</span>
<span class="k">return</span> <span class="n">info</span>
<span class="k">class</span> <span class="nc">EAInfo</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FULL_EA_INFORMATION</span><span class="p">):</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPCSTR</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">EaName</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">value_addr</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">EaName</span><span class="o">.</span><span class="n">offset</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">EaNameLength</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># +1 -&gt; Name \x00</span>
<span class="k">return</span> <span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_char</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">EaValueLength</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">value_addr</span><span class="p">)[:]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># NextEntryOffset is Relative to our current offset</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># First entry</span>
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_b_base_</span><span class="o">.</span><span class="n">_raw_buffer_</span>
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_buffer_</span>
<span class="n">curoffset</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_raw_buffer_offset_&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">new</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">,</span> <span class="n">curoffset</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span><span class="p">)</span>
<span class="c1"># Keep the underlying buffer easily accessible</span>
<span class="n">new</span><span class="o">.</span><span class="n">_raw_buffer_</span> <span class="o">=</span> <span class="n">raw_buffer</span>
<span class="n">new</span><span class="o">.</span><span class="n">_raw_buffer_offset_</span> <span class="o">=</span> <span class="n">curoffset</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span>
<span class="k">return</span> <span class="n">new</span>
<span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="bp">self</span><span class="p">:</span>
<span class="k">yield</span> <span class="bp">self</span>
<span class="bp">self</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> name=&quot;</span><span class="si">{1}</span><span class="s1">&quot;&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">MAXIMUM_EA_SIZE</span> <span class="o">=</span> <span class="mh">0x0000ffff</span>
<span class="k">def</span> <span class="nf">query_extended_attributes</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
<span class="n">file_or_handle</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_handle_from_file</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">)</span>
<span class="c1"># Check EaSize</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">query_file_information</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FileEaInformation</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">EaSize</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">io_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IO_STATUS_BLOCK</span><span class="p">()</span>
<span class="c1"># Handle Win10 / Win7</span>
<span class="c1"># Saw on Win10 -&gt; EaSize &gt; MAXIMUM_EA_SIZE</span>
<span class="c1"># Saw on Win7 -&gt; EaSize not enought (STATUS_BUFFER_OVERFLOW)</span>
<span class="n">buffsize</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">MAXIMUM_EA_SIZE</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">EaSize</span><span class="p">)</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">EAInfo</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">buffsize</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryEaFile</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">buffsize</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">ntqueryvolumeinformationfile_info_structs</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsAttributeInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_ATTRIBUTE_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsControlInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_CONTROL_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsDeviceInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_DEVICE_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsDriverPathInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_DRIVER_PATH_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsFullSizeInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_FULL_SIZE_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsObjectIdInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_OBJECTID_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsSizeInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_SIZE_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsVolumeInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_VOLUME_INFORMATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">FileFsSectorSizeInformation</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FS_SECTOR_SIZE_INFORMATION</span><span class="p">,</span>
<span class="p">}</span>
<span class="c1"># TODO: FileFsDriverPathInformation</span>
<span class="c1"># TODO: Extended FILE_FS_VOLUME_INFORMATION that can read the real value of &#39;VolumeLabel&#39;</span>
<span class="k">def</span> <span class="nf">query_volume_information</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">volume_info_class</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">int_types</span><span class="p">):</span>
<span class="n">file_or_handle</span> <span class="o">=</span> <span class="n">get_handle_from_file</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">)</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">file_or_handle</span>
<span class="n">io_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IO_STATUS_BLOCK</span><span class="p">()</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">ntqueryvolumeinformationfile_info_structs</span><span class="p">[</span><span class="n">volume_info_class</span><span class="p">]()</span>
<span class="c1"># Do helper for &#39;is_pointer&#39; / get pointed_size &amp; co ? (useful for winproxy)</span>
<span class="n">pinfo</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">pointer</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryVolumeInformationFile</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">pinfo</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">info</span><span class="p">),</span> <span class="n">FsInformationClass</span><span class="o">=</span><span class="n">volume_info_class</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">STATUS_BUFFER_OVERFLOW</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">if</span> <span class="n">volume_info_class</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FileFsAttributeInformation</span><span class="p">:</span>
<span class="n">file_name_length</span> <span class="o">=</span> <span class="n">pinfo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">FileSystemNameLength</span>
<span class="k">elif</span> <span class="n">volume_info_class</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FileFsVolumeInformation</span><span class="p">:</span>
<span class="c1"># Well VolumeLabelLength is clearly broken (after testing..) so we are adding some bytes to it..</span>
<span class="n">file_name_length</span> <span class="o">=</span> <span class="n">pinfo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">VolumeLabelLength</span> <span class="o">+</span> <span class="mh">0x100</span> <span class="c1"># I have seen cases where the VolumeLabelLength is not even enough..</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="n">full_size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">info</span><span class="p">)</span> <span class="o">+</span> <span class="n">file_name_length</span> <span class="c1"># We add a little too much size for the sake of simplicity</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">full_size</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryVolumeInformationFile</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">full_size</span><span class="p">,</span> <span class="n">FsInformationClass</span><span class="o">=</span><span class="n">volume_info_class</span><span class="p">)</span>
<span class="n">pinfo</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">POINTER</span><span class="p">(</span><span class="n">ntqueryvolumeinformationfile_info_structs</span><span class="p">[</span><span class="n">volume_info_class</span><span class="p">]))</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">pinfo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">info</span>
<span class="k">return</span> <span class="n">info</span>
<span class="c1"># String stuff</span>
<span class="k">def</span> <span class="nf">ntstatus</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">generated_def</span><span class="o">.</span><span class="n">ntstatus</span><span class="o">.</span><span class="n">NtStatusException</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
<span class="n">_WINERROR_BY_VALUE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">winerror</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
<span class="k">global</span> <span class="n">_WINERROR_BY_VALUE</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_WINERROR_BY_VALUE</span><span class="p">:</span> <span class="c1"># Lazy init</span>
<span class="n">_WINERROR_BY_VALUE</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FlagMapper</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">gdef</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span> <span class="k">for</span> <span class="n">error</span> <span class="ow">in</span> <span class="n">gdef</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">errors</span><span class="p">))</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">_WINERROR_BY_VALUE</span><span class="p">[</span><span class="n">code</span><span class="p">]</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="n">code</span><span class="p">:</span> <span class="c1"># Not found</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">_WINERROR_BY_VALUE</span><span class="p">[</span><span class="n">code</span> <span class="o">&amp;</span> <span class="mh">0xffff</span><span class="p">]</span> <span class="c1"># Hresult: extract code (https://en.wikipedia.org/wiki/HRESULT)</span>
<span class="k">return</span> <span class="n">val</span>
<div class="viewcode-block" id="get_long_path"><a class="viewcode-back" href="../../../utils.html#windows.utils.get_long_path">[docs]</a><span class="k">def</span> <span class="nf">get_long_path</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the long path form for ``path``.</span>
<span class="sd"> :raise: :class:`~windows.winproxy.WinproxyError` if ``path`` does not exists</span>
<span class="sd"> :param path: a valid Windows path</span>
<span class="sd"> :type path: :class:`str` | :obj:`unicode`</span>
<span class="sd"> :returns: :class:`str` | :obj:`unicode` -- same type as ``path`` parameter</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_unicode_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetLongPathNameW</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">rsize</span><span class="p">]</span></div>
<div class="viewcode-block" id="get_short_path"><a class="viewcode-back" href="../../../utils.html#windows.utils.get_short_path">[docs]</a><span class="k">def</span> <span class="nf">get_short_path</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the short path form for ``path``</span>
<span class="sd"> :raise: :class:`~windows.winproxy.WinproxyError` if ``path`` does not exists</span>
<span class="sd"> :param path: a valid Windows path</span>
<span class="sd"> :type path: :class:`str` | :obj:`unicode`</span>
<span class="sd"> :returns: :class:`str` | :obj:`unicode` -- same type as ``path`` parameter</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_unicode_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetShortPathNameW</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">rsize</span><span class="p">]</span></div>
<span class="k">def</span> <span class="nf">dospath_to_ntpath</span><span class="p">(</span><span class="n">dospath</span><span class="p">):</span>
<span class="n">ustring</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">UNICODE_STRING</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">RtlDosPathNameToNtPathName_U</span><span class="p">(</span><span class="n">dospath</span><span class="p">,</span> <span class="n">ustring</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ustring</span><span class="o">.</span><span class="n">str</span>
<span class="k">def</span> <span class="nf">get_shared_mapping</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">INVALID_HANDLE_VALUE</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mh">0x1000</span><span class="p">):</span>
<span class="c1"># TODO: real code</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateFileMappingA</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">dwMaximumSizeLow</span><span class="o">=</span><span class="n">size</span><span class="p">,</span> <span class="n">lpName</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">MapViewOfFile</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="n">dwNumberOfBytesToMap</span><span class="o">=</span><span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">addr</span>
<span class="k">def</span> <span class="nf">create_file</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">access</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">GENERIC_READ</span><span class="p">,</span> <span class="n">share</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_SHARE_READ</span><span class="p">,</span> <span class="n">security</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">creation</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">OPEN_EXISTING</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_ATTRIBUTE_NORMAL</span><span class="p">):</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateFileA</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">access</span><span class="p">,</span> <span class="n">share</span><span class="p">,</span> <span class="n">security</span><span class="p">,</span> <span class="n">creation</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1">#def mapfile(file):</span>
<span class="c1"># fhandle = get_handle_from_file(file)</span>
<span class="c1"># h = windows.winproxy.CreateFileMappingA(fhandle, None, PAGE_READONLY, 0, 1, None)</span>
<span class="c1"># addr = windows.winproxy.MapViewOfFile(h, dwDesiredAccess=FILE_MAP_READ, dwNumberOfBytesToMap=1)</span>
<span class="c1"># return addr</span>
<span class="k">def</span> <span class="nf">decompress_buffer</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">comptype</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">COMPRESSION_FORMAT_LZNT1</span><span class="p">,</span> <span class="n">uncompress_size</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">uncompress_size</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">uncompress_size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span>
<span class="n">result_size</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">uncompressed</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">uncompress_size</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">RtlDecompressBuffer</span><span class="p">(</span><span class="n">comptype</span><span class="p">,</span> <span class="n">uncompressed</span><span class="p">,</span> <span class="n">uncompress_size</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">buffer</span><span class="p">),</span> <span class="n">result_size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">uncompressed</span><span class="p">[:</span><span class="n">result_size</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">compress_buffer</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">comptype</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">COMPRESSION_FORMAT_LZNT1</span><span class="p">):</span>
<span class="n">uncompress_size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="n">CompressedBufferSize</span> <span class="o">=</span> <span class="n">uncompress_size</span> <span class="o">+</span> <span class="mh">0x1000</span>
<span class="n">CompressedBuffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">CompressedBufferSize</span><span class="p">)</span>
<span class="n">chunk</span> <span class="o">=</span> <span class="mi">4096</span>
<span class="n">final_size</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">work_space_size</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">()</span>
<span class="n">ignore_data</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">RtlGetCompressionWorkSpaceSize</span><span class="p">(</span><span class="n">comptype</span><span class="p">,</span> <span class="n">work_space_size</span><span class="p">,</span> <span class="n">ignore_data</span><span class="p">)</span>
<span class="n">work_space</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">work_space_size</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">RtlCompressBuffer</span><span class="p">(</span><span class="n">comptype</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">uncompress_size</span><span class="p">,</span> <span class="n">CompressedBuffer</span><span class="p">,</span> <span class="n">CompressedBufferSize</span><span class="p">,</span> <span class="n">chunk</span><span class="p">,</span> <span class="n">final_size</span><span class="p">,</span> <span class="n">work_space</span><span class="p">)</span>
<span class="k">return</span> <span class="n">CompressedBuffer</span><span class="p">[:</span><span class="n">final_size</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="c1"># sid.py + real SID type ?</span>
<span class="k">def</span> <span class="nf">get_known_sid</span><span class="p">(</span><span class="n">sid_type</span><span class="p">):</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateWellKnownSid</span><span class="p">(</span><span class="n">sid_type</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">WindowsError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">size</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateWellKnownSid</span><span class="p">(</span><span class="n">sid_type</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">PSID</span><span class="p">)</span>
<span class="n">UnloadEventTraceInfo</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;UnloadEventTraceInfo&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;size&quot;</span><span class="p">,</span> <span class="s2">&quot;nb_elt&quot;</span><span class="p">,</span> <span class="s2">&quot;array_ptr&quot;</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">get_unload_event_trace</span><span class="p">():</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">PULONG</span><span class="p">()</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">PULONG</span><span class="p">()</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">PVOID</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">RtlGetUnloadEventTraceEx</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="k">return</span> <span class="n">UnloadEventTraceInfo</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">y</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">z</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<div class="viewcode-block" id="VirtualProtected"><a class="viewcode-back" href="../../../utils.html#windows.utils.VirtualProtected">[docs]</a><span class="k">class</span> <span class="nc">VirtualProtected</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A context manager usable like `VirtualProtect` that will restore the old protection at exit ::</span>
<span class="sd"> with utils.VirtualProtected(IATentry.addr, ctypes.sizeof(PVOID), gdef.PAGE_EXECUTE_READWRITE):</span>
<span class="sd"> IATentry.value = 0x42424242</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">new_protect</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">addr</span> <span class="o">%</span> <span class="mh">0x1000</span><span class="p">):</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span> <span class="o">-</span> <span class="n">addr</span> <span class="o">%</span> <span class="mh">0x1000</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">size</span>
<span class="bp">self</span><span class="o">.</span><span class="n">new_protect</span> <span class="o">=</span> <span class="n">new_protect</span>
<span class="k">def</span> <span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">old_protect</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">VirtualProtect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">addr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_protect</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">old_protect</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">VirtualProtect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">addr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_protect</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">old_protect</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="DisableWow64FsRedirection"><a class="viewcode-back" href="../../../utils.html#windows.utils.DisableWow64FsRedirection">[docs]</a><span class="k">class</span> <span class="nc">DisableWow64FsRedirection</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A context manager that disable the SysWow64 Filesystem Redirection ::</span>
<span class="sd"> if is_process_32_bits:</span>
<span class="sd"> def pop_calc_64():</span>
<span class="sd"> with windows.utils.DisableWow64FsRedirection():</span>
<span class="sd"> return windows.utils.create_process(r&quot;C:\Windows\system32\calc.exe&quot;, True)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">64</span> <span class="ow">or</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">32</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="bp">self</span><span class="o">.</span><span class="n">OldValue</span> <span class="o">=</span> <span class="n">PVOID</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">Wow64DisableWow64FsRedirection</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">OldValue</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">64</span> <span class="ow">or</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">32</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">Wow64RevertWow64FsRedirection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">OldValue</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">PythonForWindows 0.6 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2015-2020, Clement Rouault.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
</div>
</body>
</html>