Files
2025-05-15 09:32:55 +02:00

759 lines
96 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-content_root="../../../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>windows.winobject.system &#8212; PythonForWindows 1.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../../_static/classic.css?v=def86cc0" />
<link rel="stylesheet" type="text/css" href="../../../_static/css/mbasic.css?v=957880af" />
<script src="../../../_static/documentation_options.js?v=baaebd52"></script>
<script src="../../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../../_static/sphinx_highlight.js?v=dc90522c"></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 1.0.3 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">windows.winobject.system</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for windows.winobject.system</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">import</span> <span class="nn">struct</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">from</span> <span class="nn">windows</span> <span class="kn">import</span> <span class="n">winproxy</span>
<span class="kn">from</span> <span class="nn">windows</span> <span class="kn">import</span> <span class="n">utils</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">windows.winobject</span> <span class="kn">import</span> <span class="n">process</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">network</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">registry</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">exception</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">service</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">volume</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">wmi</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">object_manager</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">device_manager</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">handle</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">event_log</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">event_trace</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">task_scheduler</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">system_module</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="kn">import</span> <span class="n">bits</span>
<span class="kn">from</span> <span class="nn">windows.dbgprint</span> <span class="kn">import</span> <span class="n">dbgprint</span>
<span class="k">class</span> <span class="nc">UnicodeEnvironment</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">UnicodeEnvironment</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">upper</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">SetEnvironmentVariableW</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">UnicodeEnvironment</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__delitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">UnicodeEnvironment</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__contains__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># SetEnvironmentVariableW</span>
<span class="c1"># If this parameter is NULL, the variable is deleted from the current process&#39;s environment.</span>
<span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">return</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">upper</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">SetEnvironmentVariableW</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">UnicodeEnvironment</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__setitem__</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">dict</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="bp">self</span><span class="p">[</span><span class="n">k</span><span class="o">.</span><span class="n">upper</span><span class="p">()]</span> <span class="o">=</span> <span class="n">v</span>
<span class="c1"># Setitem -&gt; SetEnvironmement variable</span>
<div class="viewcode-block" id="System">
<a class="viewcode-back" href="../../../windows.html#windows.winobject.system.System">[docs]</a>
<span class="k">class</span> <span class="nc">System</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The state of the current ``Windows`` system ``Python`` is running on&quot;&quot;&quot;</span>
<span class="c1"># Setup these in a fixedproperty ?</span>
<span class="n">network</span> <span class="o">=</span> <span class="n">network</span><span class="o">.</span><span class="n">Network</span><span class="p">()</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Object of class :class:`windows.winobject.network.Network`&quot;&quot;&quot;</span>
<span class="n">registry</span> <span class="o">=</span> <span class="n">registry</span><span class="o">.</span><span class="n">Registry</span><span class="p">()</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Object of class :class:`windows.winobject.registry.Registry`&quot;&quot;&quot;</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">processes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The list of running processes</span>
<span class="sd"> :type: [:class:`~windows.winobject.process.WinProcess`] -- A list of Process</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">enumerate_processes</span><span class="p">()</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">threads</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The list of running threads</span>
<span class="sd"> :type: [:class:`~windows.winobject.process.WinThread`] -- A list of Thread</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">enumerate_threads_setup_owners</span><span class="p">()</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">logicaldrives</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;List of logical drives [C:\\, ...]</span>
<span class="sd"> :type: [:class:`~windows.winobject.volume.LogicalDrive`] -- A list of LogicalDrive</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">volume</span><span class="o">.</span><span class="n">enum_logical_drive</span><span class="p">()</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">services</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An object to query, list and explore services</span>
<span class="sd"> :type: :class:`~windows.winobject.service.ServiceManager`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">service</span><span class="o">.</span><span class="n">ServiceManager</span><span class="p">()</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">handles</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The list of system handles</span>
<span class="sd"> :type: [:class:`~windows.winobject.handle.Handle`] -- A list of Hanlde&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">handle</span><span class="o">.</span><span class="n">enumerate_handles</span><span class="p">()</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">modules</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The list of system modules</span>
<span class="sd"> :type: [:class:`~windows.winobject.system_module.SystemModule`] -- A list of :class:`~windows.winobject.system_module.SystemModule` or :class:`~windows.winobject.system_module.SystemModuleWow64`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">system_module</span><span class="o">.</span><span class="n">enumerate_kernel_modules</span><span class="p">()</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">bitness</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The bitness of the system</span>
<span class="sd"> :type: :class:`int` -- 32 or 64</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;PROCESSOR_ARCHITECTURE&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s2">&quot;x86&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="mi">64</span>
<span class="k">if</span> <span class="s2">&quot;PROCESSOR_ARCHITEW6432&quot;</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
<span class="k">return</span> <span class="mi">64</span>
<span class="k">return</span> <span class="mi">32</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">environ</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A unicode version of os.environ</span>
<span class="sd"> Same as os.environ on py3</span>
<span class="sd"> Custom dict built on GetEnvironmentStringsW() on py2</span>
<span class="sd"> :type: :class:`dict` -- {:class:`unicode`: :class:`unicode`}</span>
<span class="sd"> &quot;&quot;&quot;</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="p">:</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span> <span class="c1"># Py3 environ is already unicode</span>
<span class="c1"># Create a unicode wrapper environment</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_unicode_environ_dict</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_create_unicode_environ_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">rawdictenv</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">curenv</span> <span class="o">=</span> <span class="n">envptr</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">GetEnvironmentStringsW</span><span class="p">()</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">envstr</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_wchar_p</span><span class="p">(</span><span class="n">curenv</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">envstr</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">envstr</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="c1"># No =</span>
<span class="k">pass</span>
<span class="n">rawdictenv</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">upper</span><span class="p">()]</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">curenv</span> <span class="o">+=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">envstr</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">FreeEnvironmentStringsW</span><span class="p">(</span><span class="n">envptr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">UnicodeEnvironment</span><span class="p">(</span><span class="n">rawdictenv</span><span class="p">)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">wmi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sa">r</span><span class="sd">&quot;&quot;&quot;An object to perform wmi requests to various namespaces</span>
<span class="sd"> :type: :class:`~windows.winobject.wmi.WmiManager`&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">wmi</span><span class="o">.</span><span class="n">WmiManager</span><span class="p">()</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">event_log</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An object to open Event channel/publisher and evtx file</span>
<span class="sd"> :type: :class:`~windows.winobject.event_log.EvtlogManager`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">event_log</span><span class="o">.</span><span class="n">EvtlogManager</span><span class="p">()</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">etw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An object to interact with ETW (Event Tracing for Windows)</span>
<span class="sd"> :type: :class:`~windows.winobject.event_trace.EtwManager`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">event_trace</span><span class="o">.</span><span class="n">EtwManager</span><span class="p">()</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">task_scheduler</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An object able to manage scheduled tasks on the local system</span>
<span class="sd"> :type: :class:`~windows.winobject.task_scheduler.TaskService`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">windows</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<span class="n">clsid_task_scheduler</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IID</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="s2">&quot;0f87369f-a4e5-4cfc-bd3e-73e6154572dd&quot;</span><span class="p">)</span>
<span class="n">task_service</span> <span class="o">=</span> <span class="n">task_scheduler</span><span class="o">.</span><span class="n">TaskService</span><span class="p">()</span>
<span class="c1"># What is non-implemented (WinXP)</span>
<span class="c1"># Raise (NotImplementedError?) ? Return NotImplemented ?</span>
<span class="n">windows</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">create_instance</span><span class="p">(</span><span class="n">clsid_task_scheduler</span><span class="p">,</span> <span class="n">task_service</span><span class="p">)</span>
<span class="n">task_service</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
<span class="k">return</span> <span class="n">task_service</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">object_manager</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An object to query the objects in the kernel object manager.</span>
<span class="sd"> :type: :class:`~windows.winobject.object_manager.ObjectManager`</span>
<span class="sd"> &quot;&quot;&quot;</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">object_manager</span><span class="o">.</span><span class="n">ObjectManager</span><span class="p">()</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">device_manager</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An object to query the device&amp;driver configured on the computer.</span>
<span class="sd"> :type: :class:`~windows.winobject.device_manager.DeviceManager`</span>
<span class="sd"> &quot;&quot;&quot;</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">device_manager</span><span class="o">.</span><span class="n">DeviceManager</span><span class="p">()</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">bits</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">bits</span><span class="o">.</span><span class="n">create_manager</span><span class="p">()</span>
<span class="c1">#TODO: use GetComputerNameExA ? and recover other names ?</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">computer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The name of the computer</span>
<span class="sd"> :type: :class:`str`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">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="mh">0x1000</span><span class="p">)</span>
<span class="n">buf</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="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetComputerNameW</span><span class="p">(</span><span class="n">buf</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">size</span><span class="p">))</span>
<span class="k">return</span> <span class="n">buf</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">_computer_name_ex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nametype</span><span class="p">):</span>
<span class="n">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="mi">0</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetComputerNameExW</span><span class="p">(</span><span class="n">nametype</span><span class="p">,</span> <span class="kc">None</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">size</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="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ERROR_MORE_DATA</span><span class="p">:</span>
<span class="k">raise</span>
<span class="n">buf</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="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetComputerNameExW</span><span class="p">(</span><span class="n">nametype</span><span class="p">,</span> <span class="n">buf</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">size</span><span class="p">))</span>
<span class="k">return</span> <span class="n">buf</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="nd">@utils</span><span class="o">.</span><span class="n">fixedproperty</span>
<span class="k">def</span> <span class="nf">domain</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># [WIP] name of the domain joined by the computer, None is no domain joined</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_computer_name_ex</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">ComputerNameDnsDomain</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">None</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The version of the system</span>
<span class="sd"> :type: (:class:`int`, :class:`int`) -- (Major, Minor)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_version</span><span class="p">()</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">dwMajorVersion</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">dwMinorVersion</span>
<span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="mi">2</span><span class="p">):</span>
<span class="n">result_str</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_file_version</span><span class="p">(</span><span class="s2">&quot;kernel32&quot;</span><span class="p">)</span>
<span class="n">result_tup</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">result_str</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)]</span>
<span class="n">result</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">result_tup</span><span class="p">[:</span><span class="mi">2</span><span class="p">])</span>
<span class="k">return</span> <span class="n">result</span>
<span class="c1"># Based on:</span>
<span class="c1"># https://jrsoftware.org/ishelp/index.php?topic=winvernotes</span>
<span class="c1"># https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions</span>
<span class="n">WINDOWS_10_BUILD_NUMBER_VERSION</span> <span class="o">=</span> <span class="p">{</span>
<span class="c1"># (build_number, is_workstation): &quot;version_name&quot;</span>
<span class="p">(</span><span class="mi">10240</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1507&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">10586</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1511&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">14393</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1607&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">15063</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1703&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">16299</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1709&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">17134</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1803&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">17763</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1809&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">18362</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1903&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">18363</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 1909&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">19041</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 2004&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">19042</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 20H2&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">19043</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 21H1&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">19044</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 21H2&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">19045</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 10 Version 22H2&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">22000</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 11 Version 21H2&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">22621</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 11 Version 22H2&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">22631</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 11 Version 23H2&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">26100</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows 11 Version 24H2&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">14393</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows Server 2016&quot;</span><span class="p">,</span>
<span class="c1"># 16299 : Windows Server, version 1709 ?</span>
<span class="c1"># 17134 : Windows Server, version 1803 ?</span>
<span class="c1"># 17134 : Windows Server, version 1803 ?</span>
<span class="p">(</span><span class="mi">17763</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows Server 2019&quot;</span><span class="p">,</span>
<span class="c1"># 18362 : Windows Server, version 1903 ?</span>
<span class="c1"># 18363 : Windows Server, version 1909 ?</span>
<span class="c1"># 19041 : Windows Server, version 2004 ?</span>
<span class="c1"># 19042 : Windows Server, version 20H2 ?</span>
<span class="p">(</span><span class="mi">20348</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows Server 2022&quot;</span><span class="p">,</span>
<span class="c1"># 25398 : Windows Server, version 23H2 ?</span>
<span class="p">(</span><span class="mi">26100</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span> <span class="sa">u</span><span class="s2">&quot;Windows Server 2025&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">_get_version_name_for_10_build</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">build_number</span><span class="p">,</span> <span class="n">is_workstation</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">WINDOWS_10_BUILD_NUMBER_VERSION</span><span class="p">[(</span><span class="n">build_number</span><span class="p">,</span> <span class="n">is_workstation</span><span class="p">)]</span>
<span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Unknown Windows 10+ &lt;versionstr=</span><span class="si">{0}</span><span class="s2"> | is_workstation=</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="bp">self</span><span class="o">.</span><span class="n">versionstr</span><span class="p">,</span> <span class="n">is_workstation</span><span class="p">)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">version_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The name of the system version, values are:</span>
<span class="sd"> * Windows Server 2025</span>
<span class="sd"> * Windows 11 Version 24H2</span>
<span class="sd"> * Windows 11 Version 23H2</span>
<span class="sd"> * Windows 11 Version 22H2</span>
<span class="sd"> * Windows 11 Version 21H2</span>
<span class="sd"> * Windows 10 Version 22H2</span>
<span class="sd"> * Windows 10 Version 21H2</span>
<span class="sd"> * Windows Server 2022</span>
<span class="sd"> * Windows 10 Version 21H1</span>
<span class="sd"> * Windows 10 Version 20H2</span>
<span class="sd"> * Windows 10 Version 2004</span>
<span class="sd"> * Windows 10 Version 1909</span>
<span class="sd"> * Windows 10 Version 1903</span>
<span class="sd"> * Windows Server 2019</span>
<span class="sd"> * Windows 10 Version 1809</span>
<span class="sd"> * Windows 10 Version 1803</span>
<span class="sd"> * Windows 10 Version 1709</span>
<span class="sd"> * Windows 10 Version 1703</span>
<span class="sd"> * Windows 10 Version 1607</span>
<span class="sd"> * Windows 10 Version 1511</span>
<span class="sd"> * Windows 10 Version 1507</span>
<span class="sd"> * Windows Server 2016</span>
<span class="sd"> * Windows Server 2012 R2</span>
<span class="sd"> * Windows 8.1</span>
<span class="sd"> * Windows Server 2012</span>
<span class="sd"> * Windows 8</span>
<span class="sd"> * Windows Server 2008</span>
<span class="sd"> * Windows 7</span>
<span class="sd"> * Windows Server 2008</span>
<span class="sd"> * Windows Vista</span>
<span class="sd"> * Windows XP Professional x64 Edition</span>
<span class="sd"> * Unknown: version (5.2) + is_workstation + bitness == 32 (don&#39;t even know if possible..)</span>
<span class="sd"> * Windows Server 2003 R2</span>
<span class="sd"> * Windows Server 2003</span>
<span class="sd"> * Windows XP</span>
<span class="sd"> * Windows 2000</span>
<span class="sd"> * &quot;Unknown Windows 10+ &lt;versionstr={0} | is_workstation={1}&gt;&quot;.format(self.versionstr, is_workstation)</span>
<span class="sd"> * &quot;Unknown Windows &lt;version={0} | is_workstation={1}&gt;&quot;.format(version, is_workstation)</span>
<span class="sd"> :type: :class:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span>
<span class="n">is_workstation</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">product_type</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">VER_NT_WORKSTATION</span>
<span class="k">if</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_version_name_for_10_build</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">build_number</span><span class="p">,</span> <span class="n">is_workstation</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="sa">u</span><span class="s2">&quot;Windows Server 2012 R2&quot;</span><span class="p">,</span> <span class="sa">u</span><span class="s2">&quot;Windows 8.1&quot;</span><span class="p">][</span><span class="n">is_workstation</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="sa">u</span><span class="s2">&quot;Windows Server 2012&quot;</span><span class="p">,</span> <span class="sa">u</span><span class="s2">&quot;Windows 8&quot;</span><span class="p">][</span><span class="n">is_workstation</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="sa">u</span><span class="s2">&quot;Windows Server 2008 R2&quot;</span><span class="p">,</span> <span class="sa">u</span><span class="s2">&quot;Windows 7&quot;</span><span class="p">][</span><span class="n">is_workstation</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="sa">u</span><span class="s2">&quot;Windows Server 2008&quot;</span><span class="p">,</span> <span class="sa">u</span><span class="s2">&quot;Windows Vista&quot;</span><span class="p">][</span><span class="n">is_workstation</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span>
<span class="n">metric</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetSystemMetrics</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SM_SERVERR2</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_workstation</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">64</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Windows XP Professional x64 Edition&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Unknown: version (5.2) + is_workstation + bitness == 32&quot;</span>
<span class="k">elif</span> <span class="n">metric</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Windows Server 2003 R2&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Windows Server 2003&quot;</span>
<span class="k">elif</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Windows XP&quot;</span>
<span class="k">elif</span> <span class="n">version</span> <span class="o">==</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Windows 2000&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;Unknown Windows &lt;version=</span><span class="si">{0}</span><span class="s2"> | is_workstation=</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">version</span><span class="p">,</span> <span class="n">is_workstation</span><span class="p">)</span>
<span class="n">VERSION_MAPPER</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="n">gdef</span><span class="o">.</span><span class="n">VER_NT_WORKSTATION</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">VER_NT_DOMAIN_CONTROLLER</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">VER_NT_SERVER</span><span class="p">)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">product_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The product type, value might be:</span>
<span class="sd"> * VER_NT_WORKSTATION(0x1L)</span>
<span class="sd"> * VER_NT_DOMAIN_CONTROLLER(0x2L)</span>
<span class="sd"> * VER_NT_SERVER(0x3L)</span>
<span class="sd"> :type: :class:`long` or :class:`int` (or subclass)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_version</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">VERSION_MAPPER</span><span class="p">[</span><span class="n">version</span><span class="o">.</span><span class="n">wProductType</span><span class="p">]</span>
<span class="n">EDITION_MAPPER</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="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_UNDEFINED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ULTIMATE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_BASIC</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_PREMIUM</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_BASIC_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_BUSINESS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STANDARD_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_DATACENTER_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SMALLBUSINESS_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STARTER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_DATACENTER_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STANDARD_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_SERVER_IA64</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_BUSINESS_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_WEB_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_CLUSTER_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_EXPRESS_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_STANDARD_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_WORKGROUP_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_ENTERPRISE_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SERVER_FOR_SMALLBUSINESS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SMALLBUSINESS_SERVER_PREMIUM</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_PREMIUM_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ULTIMATE_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_WEB_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SERVER_FOUNDATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_PREMIUM_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SERVER_FOR_SMALLBUSINESS_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STANDARD_SERVER_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_DATACENTER_SERVER_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_SERVER_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_DATACENTER_SERVER_CORE_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STANDARD_SERVER_CORE_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_SERVER_CORE_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HYPERV</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_EXPRESS_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_STANDARD_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_WORKGROUP_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STARTER_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_PROFESSIONAL</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_PROFESSIONAL_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SB_SOLUTION_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SERVER_FOR_SB_SOLUTIONS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STANDARD_SERVER_SOLUTIONS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SB_SOLUTION_SERVER_EM</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SOLUTION_EMBEDDEDSERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SOLUTION_EMBEDDEDSERVER_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_CLUSTER_SERVER_V</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_EMBEDDED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STARTER_E</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_BASIC_E</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_PREMIUM_E</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_PROFESSIONAL_E</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_E</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ULTIMATE_E</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_EVALUATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_MULTIPOINT_STANDARD_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_MULTIPOINT_PREMIUM_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STANDARD_EVALUATION_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_DATACENTER_EVALUATION_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_ENTERPRISE_N_EVALUATION</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_CORE_ARM</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_CORE_N</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_CORE_COUNTRYSPECIFIC</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_CORE_LANGUAGESPECIFIC</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_CORE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_PROFESSIONAL_WMC</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_UNLICENSED</span><span class="p">)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">edition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Find a better name ?</span>
<span class="n">version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_version</span><span class="p">()</span>
<span class="n">edition</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="k">try</span><span class="p">:</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetProductInfo</span><span class="p">(</span><span class="n">version</span><span class="o">.</span><span class="n">dwMajorVersion</span><span class="p">,</span>
<span class="n">version</span><span class="o">.</span><span class="n">dwMinorVersion</span><span class="p">,</span>
<span class="n">version</span><span class="o">.</span><span class="n">wServicePackMajor</span><span class="p">,</span>
<span class="n">version</span><span class="o">.</span><span class="n">wServicePackMinor</span><span class="p">,</span>
<span class="n">edition</span><span class="p">)</span>
<span class="k">except</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">ExportNotFound</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="c1"># Windows XP does not implem GetProductInfo</span>
<span class="k">assert</span> <span class="n">version</span><span class="o">.</span><span class="n">dwMajorVersion</span><span class="p">,</span> <span class="n">version</span><span class="o">.</span><span class="n">dwMinorVersion</span> <span class="o">==</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_edition_windows_xp</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">EDITION_MAPPER</span><span class="p">[</span><span class="n">edition</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">_edition_windows_xp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Emulate standard response from IsOS(gdef.OS_PROFESSIONAL)</span>
<span class="k">if</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">IsOS</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">OS_PROFESSIONAL</span><span class="p">):</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_PROFESSIONAL</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PRODUCT_HOME_BASIC</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">windir</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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="mh">0x100</span><span class="p">)</span>
<span class="n">reslen</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetWindowsDirectoryW</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">reslen</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">get_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">OSVERSIONINFOEXW</span><span class="p">()</span>
<span class="n">data</span><span class="o">.</span><span class="n">dwOSVersionInfoSize</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">data</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetVersionExW</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">cast</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">data</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">gdef</span><span class="o">.</span><span class="n">OSVERSIONINFOW</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">data</span>
<span class="k">def</span> <span class="nf">get_file_version</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetFileVersionInfoSizeW</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">buf</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">winproxy</span><span class="o">.</span><span class="n">GetFileVersionInfoW</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
<span class="n">bufptr</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PVOID</span><span class="p">()</span>
<span class="n">bufsize</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">UINT</span><span class="p">()</span>
<span class="c1"># Return binary data : the W is only or the input string in this case</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">VerQueryValueW</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="sa">u</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">VarFileInfo</span><span class="se">\\</span><span class="s2">Translation&quot;</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">bufptr</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">bufsize</span><span class="p">))</span>
<span class="n">tup</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">gdef</span><span class="o">.</span><span class="n">USHORT</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">bufptr</span><span class="o">.</span><span class="n">value</span><span class="p">)[:]</span>
<span class="n">req</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{0:04x}{1:04x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="n">tup</span><span class="p">)</span>
<span class="k">del</span> <span class="n">tup</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">VerQueryValueW</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="sa">u</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">StringFileInfo</span><span class="se">\\</span><span class="si">{0}</span><span class="se">\\</span><span class="s2">ProductVersion&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">req</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">bufptr</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">bufsize</span><span class="p">))</span>
<span class="n">bufstr</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">bufptr</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPWSTR</span><span class="p">)</span>
<span class="k">return</span> <span class="n">bufstr</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedproperty</span>
<span class="k">def</span> <span class="nf">build_number</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `CurrentBuildNumber`&quot;&quot;&quot;</span>
<span class="c1"># Will only work on Windows 10 ?</span>
<span class="n">build</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">kuser_shared_data</span><span class="o">.</span><span class="n">NtBuildNumber</span>
<span class="k">if</span> <span class="n">build</span><span class="p">:</span> <span class="c1"># 0 before windows 10</span>
<span class="k">return</span> <span class="n">build</span>
<span class="n">key</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="s2">&quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">key</span><span class="p">[</span><span class="s2">&quot;CurrentBuildNumber&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedproperty</span>
<span class="k">def</span> <span class="nf">display_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the `DisplayVersion` (22H2, 23H2, ...) is it exists, else None&quot;&quot;&quot;</span>
<span class="n">key</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="s2">&quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">key</span><span class="p">[</span><span class="s2">&quot;DisplayVersion&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</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="k">if</span> <span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ERROR_FILE_NOT_FOUND</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedproperty</span>
<span class="k">def</span> <span class="nf">versionstr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Best effort. use get_file_version if registry code fails</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Does not works on Win7..</span>
<span class="c1"># Missing CurrentMajorVersionNumber/CurrentMinorVersionNumber/UBR</span>
<span class="c1"># We have CurrentVersion instead</span>
<span class="c1"># Use this code and get_file_version as a backup ?</span>
<span class="n">curver_key</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="s2">&quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">major</span> <span class="o">=</span> <span class="n">curver_key</span><span class="p">[</span><span class="s2">&quot;CurrentMajorVersionNumber&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="n">minor</span> <span class="o">=</span> <span class="n">curver_key</span><span class="p">[</span><span class="s2">&quot;CurrentMinorVersionNumber&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</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="n">version</span> <span class="o">=</span> <span class="n">curver_key</span><span class="p">[</span><span class="s2">&quot;CurrentVersion&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="c1"># May raise ValueError if no &quot;.&quot;</span>
<span class="n">major</span><span class="p">,</span> <span class="n">minor</span> <span class="o">=</span> <span class="n">version</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="n">build</span> <span class="o">=</span> <span class="n">curver_key</span><span class="p">[</span><span class="s2">&quot;CurrentBuildNumber&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="c1"># Update Build Revision</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">ubr</span> <span class="o">=</span> <span class="n">curver_key</span><span class="p">[</span><span class="s2">&quot;UBR&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</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="n">ubr</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Not present on Win7</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2">.</span><span class="si">{1}</span><span class="s2">.</span><span class="si">{2}</span><span class="s2">.</span><span class="si">{3}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">major</span><span class="p">,</span> <span class="n">minor</span><span class="p">,</span> <span class="n">build</span><span class="p">,</span> <span class="n">ubr</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">WindowsError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_file_version</span><span class="p">(</span><span class="s2">&quot;ntdll&quot;</span><span class="p">)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">kuser_shared_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># For now we only returns a &quot;common-group&quot; KUSER which only contains the</span>
<span class="c1"># 0x300 first bytes.</span>
<span class="c1"># These are the part that do not move much between XP &amp; Win10</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PFW_MINIMAL_KUSER_SHARED_DATA</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">MM_SHARED_USER_DATA_VA</span><span class="p">)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedproperty</span>
<span class="k">def</span> <span class="nf">architecture</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Retrieve system processor architecture</span>
<span class="c1"># It&#39;s not that easy as x64-on-ARM64 will lie on most API except IsWow64Process2</span>
<span class="c1"># EX: GetNativeSystemInfo will returns PROCESSOR_ARCHITECTURE_AMD64</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">is_implemented</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">IsWow64Process2</span><span class="p">):</span>
<span class="n">process_machine</span><span class="p">,</span> <span class="n">native_machine</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">is_wow_64_2</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">utils</span><span class="o">.</span><span class="n">image_file_machine_to_processor_architecture</span><span class="p">(</span><span class="n">native_machine</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown IsWow64Process2(native_machine:#x) -&gt; </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">native_machine</span><span class="p">))</span>
<span class="c1"># No IsWow64Process2 -&gt; assert it cannot be ARM64 and thus GetNativeSystemInfo will not lie ?</span>
<span class="n">sysinfo</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_INFO</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">GetNativeSystemInfo</span><span class="p">(</span><span class="n">sysinfo</span><span class="p">)</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PROCESSOR_ARCHITECTURE_MAPPER</span><span class="p">[</span><span class="n">sysinfo</span><span class="o">.</span><span class="n">wProcessorArchitecture</span><span class="p">]</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">enumerate_processes</span><span class="p">():</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;Enumerating processes with CreateToolhelp32Snapshot&quot;</span><span class="p">,</span> <span class="s2">&quot;SLOW&quot;</span><span class="p">)</span>
<span class="n">process_entry</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PROCESSENTRY32W</span><span class="p">()</span>
<span class="n">process_entry</span><span class="o">.</span><span class="n">dwSize</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">process_entry</span><span class="p">)</span>
<span class="n">snap</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CreateToolhelp32Snapshot</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TH32CS_SNAPPROCESS</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">Process32FirstW</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">process_entry</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="o">.</span><span class="n">_from_PROCESSENTRY32W</span><span class="p">(</span><span class="n">process_entry</span><span class="p">))</span>
<span class="k">while</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">Process32NextW</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">process_entry</span><span class="p">):</span>
<span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="o">.</span><span class="n">_from_PROCESSENTRY32W</span><span class="p">(</span><span class="n">process_entry</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">snap</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">enumerate_threads_generator</span><span class="p">():</span>
<span class="c1"># Ptet dangereux, parce que on yield la meme THREADENTRY32 a chaque fois</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;Enumerating threads with CreateToolhelp32Snapshot &lt;generator&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;SLOW&quot;</span><span class="p">)</span>
<span class="n">thread_entry</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">THREADENTRY32</span><span class="p">()</span>
<span class="n">thread_entry</span><span class="o">.</span><span class="n">dwSize</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">thread_entry</span><span class="p">)</span>
<span class="n">snap</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CreateToolhelp32Snapshot</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TH32CS_SNAPTHREAD</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;New handle CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD) &lt;generator&gt; | </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">snap</span><span class="p">),</span> <span class="s2">&quot;HANDLE&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">Thread32First</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">thread_entry</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">thread_entry</span>
<span class="k">while</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">Thread32Next</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">thread_entry</span><span class="p">):</span>
<span class="k">yield</span> <span class="n">thread_entry</span>
<span class="k">finally</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">snap</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;CLOSE CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD) &lt;generator&gt; | </span><span class="si">{0:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">snap</span><span class="p">),</span> <span class="s2">&quot;HANDLE&quot;</span><span class="p">)</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">enumerate_threads</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[</span><span class="n">process</span><span class="o">.</span><span class="n">WinThread</span><span class="o">.</span><span class="n">_from_THREADENTRY32</span><span class="p">(</span><span class="n">th</span><span class="p">)</span> <span class="k">for</span> <span class="n">th</span> <span class="ow">in</span> <span class="n">System</span><span class="o">.</span><span class="n">enumerate_threads_generator</span><span class="p">()]</span>
<span class="k">def</span> <span class="nf">enumerate_threads_setup_owners</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Enumerating threads is a special operation concerning the owner process.</span>
<span class="c1"># We may not be able to retrieve the name of the owning process by normal way</span>
<span class="c1"># (as we need to get a handle on the process)</span>
<span class="c1"># So, this implementation of enumerate_thread also setup the owner with the result of enumerate_processes</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;Enumerating threads with CreateToolhelp32Snapshot and setup owner&quot;</span><span class="p">,</span> <span class="s2">&quot;SLOW&quot;</span><span class="p">)</span>
<span class="c1"># One snap for both enum to be prevent race</span>
<span class="n">snap</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CreateToolhelp32Snapshot</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TH32CS_SNAPTHREAD</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">TH32CS_SNAPPROCESS</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">process_entry</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PROCESSENTRY32W</span><span class="p">()</span>
<span class="n">process_entry</span><span class="o">.</span><span class="n">dwSize</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">process_entry</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">Process32FirstW</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">process_entry</span><span class="p">)</span>
<span class="n">processes</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">processes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="o">.</span><span class="n">_from_PROCESSENTRY32W</span><span class="p">(</span><span class="n">process_entry</span><span class="p">))</span>
<span class="k">while</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">Process32NextW</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">process_entry</span><span class="p">):</span>
<span class="n">processes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="o">.</span><span class="n">_from_PROCESSENTRY32W</span><span class="p">(</span><span class="n">process_entry</span><span class="p">))</span>
<span class="c1"># Forge a dict pid -&gt; process</span>
<span class="n">proc_dict</span> <span class="o">=</span> <span class="p">{</span><span class="n">proc</span><span class="o">.</span><span class="n">pid</span><span class="p">:</span> <span class="n">proc</span> <span class="k">for</span> <span class="n">proc</span> <span class="ow">in</span> <span class="n">processes</span><span class="p">}</span>
<span class="n">thread_entry</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">THREADENTRY32</span><span class="p">()</span>
<span class="n">thread_entry</span><span class="o">.</span><span class="n">dwSize</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">thread_entry</span><span class="p">)</span>
<span class="n">threads</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">Thread32First</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">thread_entry</span><span class="p">)</span>
<span class="n">parent</span> <span class="o">=</span> <span class="n">proc_dict</span><span class="p">[</span><span class="n">thread_entry</span><span class="o">.</span><span class="n">th32OwnerProcessID</span><span class="p">]</span>
<span class="n">threads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">WinThread</span><span class="o">.</span><span class="n">_from_THREADENTRY32</span><span class="p">(</span><span class="n">thread_entry</span><span class="p">,</span> <span class="n">owner</span><span class="o">=</span><span class="n">parent</span><span class="p">))</span>
<span class="k">while</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">Thread32Next</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="n">thread_entry</span><span class="p">):</span>
<span class="n">parent</span> <span class="o">=</span> <span class="n">proc_dict</span><span class="p">[</span><span class="n">thread_entry</span><span class="o">.</span><span class="n">th32OwnerProcessID</span><span class="p">]</span>
<span class="n">threads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">WinThread</span><span class="o">.</span><span class="n">_from_THREADENTRY32</span><span class="p">(</span><span class="n">thread_entry</span><span class="p">,</span> <span class="n">owner</span><span class="o">=</span><span class="n">parent</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">snap</span><span class="p">)</span>
<span class="k">return</span> <span class="n">threads</span></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</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 1.0.3 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">windows.winobject.system</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2015-2020, Clement Rouault.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
</div>
</body>
</html>