mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
526 lines
58 KiB
HTML
526 lines
58 KiB
HTML
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>windows.winobject.system — PythonForWindows 0.5 documentation</title>
|
|
<link rel="stylesheet" href="../../../_static/classic.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../../_static/css/mbasic.css" type="text/css" />
|
|
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
|
|
<script type="text/javascript" src="../../../_static/jquery.js"></script>
|
|
<script type="text/javascript" src="../../../_static/underscore.js"></script>
|
|
<script type="text/javascript" src="../../../_static/doctools.js"></script>
|
|
<link rel="index" title="Index" href="../../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../../search.html" />
|
|
</head><body>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">PythonForWindows 0.5 documentation</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</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="k">import</span> <span class="n">winproxy</span>
|
|
<span class="kn">from</span> <span class="nn">windows</span> <span class="k">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="k">import</span> <span class="n">process</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">network</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">registry</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">exception</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">service</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">volume</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">wmi</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">object_manager</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">handle</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">event_log</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">task_scheduler</span>
|
|
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">system_module</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">windows.generated_def.winstructs</span> <span class="k">import</span> <span class="o">*</span>
|
|
<span class="kn">from</span> <span class="nn">windows.dbgprint</span> <span class="k">import</span> <span class="n">dbgprint</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="sd">"""The state of the current ``Windows`` system ``Python`` is running on"""</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="sd">"""Object of class :class:`windows.winobject.network.Network`"""</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="sd">"""Object of class :class:`windows.winobject.registry.Registry`"""</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="sd">"""The list of running processes</span>
|
|
|
|
<span class="sd"> :type: [:class:`~windows.winobject.process.WinProcess`] -- A list of Process</span>
|
|
<span class="sd"> """</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="sd">"""The list of running threads</span>
|
|
|
|
<span class="sd"> :type: [:class:`~windows.winobject.process.WinThread`] -- A list of Thread</span>
|
|
<span class="sd"> """</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="sd">"""List of logical drives [C:\, ...]</span>
|
|
|
|
<span class="sd"> :type: [:class:`~windows.winobject.volume.LogicalDrive`] -- A list of LogicalDrive</span>
|
|
<span class="sd"> """</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">@property</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="sd">"""The list of services</span>
|
|
|
|
<span class="sd"> :type: [:class:`~windows.winobject.service.ServiceA`] -- A list of Service"""</span>
|
|
<span class="k">return</span> <span class="n">service</span><span class="o">.</span><span class="n">enumerate_services</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="sd">"""The list of system handles</span>
|
|
|
|
<span class="sd"> :type: [:class:`~windows.winobject.handle.Handle`] -- A list of Hanlde"""</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="sd">"""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"> """</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="sd">"""The bitness of the system</span>
|
|
|
|
<span class="sd"> :type: :class:`int` -- 32 or 64</span>
|
|
<span class="sd"> """</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">"PROCESSOR_ARCHITECTURE"</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">"x86"</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="mi">64</span>
|
|
<span class="k">if</span> <span class="s2">"PROCESSOR_ARCHITEW6432"</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">wmi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""An object to perform wmi requests to various namespaces</span>
|
|
|
|
<span class="sd"> :type: :class:`~windows.winobject.wmi.WmiManager`"""</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="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">task_scheduler</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""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"> """</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">"0f87369f-a4e5-4cfc-bd3e-73e6154572dd"</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="sd">"""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"> """</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="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="sd">"""The name of the computer</span>
|
|
|
|
<span class="sd"> :type: :class:`str`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">size</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">c_buffer</span><span class="p">(</span><span class="n">size</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetComputerNameA</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">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="sd">"""The version of the system</span>
|
|
|
|
<span class="sd"> :type: (:class:`int`, :class:`int`) -- (Major, Minor)</span>
|
|
<span class="sd"> """</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">"kernel32"</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">"."</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="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="sd">"""The name of the system version, values are:</span>
|
|
|
|
<span class="sd"> * Windows Server 2016</span>
|
|
<span class="sd"> * Windows 10</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"> * TODO: version (5.2) + is_workstation + bitness == 32 (don'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"> * "Unknow Windows <version={0} | is_workstation={1}>".format(version, is_workstation)</span>
|
|
|
|
<span class="sd"> :type: :class:`str`</span>
|
|
<span class="sd"> """</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">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="p">[</span><span class="s2">"Windows Server 2016"</span><span class="p">,</span> <span class="s2">"Windows 10"</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="s2">"Windows Server 2012 R2"</span><span class="p">,</span> <span class="s2">"Windows 8.1"</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="s2">"Windows Server 2012"</span><span class="p">,</span> <span class="s2">"Windows 8"</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="s2">"Windows Server 2008 R2"</span><span class="p">,</span> <span class="s2">"Windows 7"</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="s2">"Windows Server 2008"</span><span class="p">,</span> <span class="s2">"Windows Vista"</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">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="s2">"Windows XP Professional x64 Edition"</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s2">"TODO: version (5.2) + is_workstation + bitness == 32"</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="s2">"Windows Server 2003 R2"</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s2">"Windows Server 2003"</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="s2">"Windows XP"</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="s2">"Windows 2000"</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s2">"Unknow Windows <version=</span><span class="si">{0}</span><span class="s2"> | is_workstation=</span><span class="si">{1}</span><span class="s2">>"</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">VER_NT_WORKSTATION</span><span class="p">,</span> <span class="n">VER_NT_DOMAIN_CONTROLLER</span><span class="p">,</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="sd">"""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"> """</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">PRODUCT_UNDEFINED</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ULTIMATE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_BASIC</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_PREMIUM</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_BASIC_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_BUSINESS</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STANDARD_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_DATACENTER_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SMALLBUSINESS_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STARTER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_DATACENTER_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STANDARD_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_SERVER_IA64</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_BUSINESS_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_WEB_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_CLUSTER_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_EXPRESS_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_STANDARD_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_WORKGROUP_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_ENTERPRISE_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SERVER_FOR_SMALLBUSINESS</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SMALLBUSINESS_SERVER_PREMIUM</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_PREMIUM_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ULTIMATE_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_WEB_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SERVER_FOUNDATION</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_PREMIUM_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SERVER_FOR_SMALLBUSINESS_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STANDARD_SERVER_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_DATACENTER_SERVER_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_SERVER_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_DATACENTER_SERVER_CORE_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STANDARD_SERVER_CORE_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_SERVER_CORE_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HYPERV</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_EXPRESS_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_STANDARD_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_WORKGROUP_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STARTER_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_PROFESSIONAL</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_PROFESSIONAL_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SB_SOLUTION_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SERVER_FOR_SB_SOLUTIONS</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STANDARD_SERVER_SOLUTIONS</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SB_SOLUTION_SERVER_EM</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SOLUTION_EMBEDDEDSERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SOLUTION_EMBEDDEDSERVER_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_CLUSTER_SERVER_V</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_EMBEDDED</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STARTER_E</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_BASIC_E</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_HOME_PREMIUM_E</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_PROFESSIONAL_E</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_E</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ULTIMATE_E</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_EVALUATION</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_MULTIPOINT_STANDARD_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_MULTIPOINT_PREMIUM_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STANDARD_EVALUATION_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_DATACENTER_EVALUATION_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_ENTERPRISE_N_EVALUATION</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_CORE_ARM</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_CORE_N</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_CORE_COUNTRYSPECIFIC</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_CORE_LANGUAGESPECIFIC</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_CORE</span><span class="p">,</span>
|
|
<span class="n">PRODUCT_PROFESSIONAL_WMC</span><span class="p">,</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">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">PRODUCT_PROFESSIONAL</span>
|
|
<span class="k">return</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">c_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">GetWindowsDirectoryA</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">windows</span><span class="o">.</span><span class="n">generated_def</span><span class="o">.</span><span class="n">OSVERSIONINFOEXA</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">GetVersionExA</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">windows</span><span class="o">.</span><span class="n">generated_def</span><span class="o">.</span><span class="n">OSVERSIONINFOA</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">GetFileVersionInfoSizeA</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">c_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">GetFileVersionInfoA</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">PVOID</span><span class="p">()</span>
|
|
<span class="n">bufsize</span> <span class="o">=</span> <span class="n">UINT</span><span class="p">()</span>
|
|
<span class="n">winproxy</span><span class="o">.</span><span class="n">VerQueryValueA</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="s2">"</span><span class="se">\\</span><span class="s2">VarFileInfo</span><span class="se">\\</span><span class="s2">Translation"</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">LPCSTR</span><span class="p">)</span>
|
|
<span class="n">tup</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s2">"<HH"</span><span class="p">,</span> <span class="n">bufstr</span><span class="o">.</span><span class="n">value</span><span class="p">[:</span><span class="mi">4</span><span class="p">])</span>
|
|
<span class="n">req</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{0:04x}{1:04x}</span><span class="s2">"</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="n">winproxy</span><span class="o">.</span><span class="n">VerQueryValueA</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="s2">"</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"</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">LPCSTR</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">fixedpropety</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="c1"># This returns the last version where ntdll was updated</span>
|
|
<span class="c1"># return self.get_file_version("comctl32")</span>
|
|
|
|
<span class="c1"># Fallback on self.get_file_version("comctl32") is key/values not presents ?</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">"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion"</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">"CurrentMajorVersionNumber"</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">"CurrentMinorVersionNumber"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="n">build</span> <span class="o">=</span> <span class="n">curver_key</span><span class="p">[</span><span class="s2">"CurrentBuildNumber"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="c1"># Update Build Revision</span>
|
|
<span class="n">ubr</span> <span class="o">=</span> <span class="n">curver_key</span><span class="p">[</span><span class="s2">"UBR"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="k">return</span> <span class="s2">"</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">"</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="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">"Enumerating processes with CreateToolhelp32Snapshot"</span><span class="p">,</span> <span class="s2">"SLOW"</span><span class="p">)</span>
|
|
<span class="n">process_entry</span> <span class="o">=</span> <span class="n">PROCESSENTRY32</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">Process32First</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_PROCESSENTRY32</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">Process32Next</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_PROCESSENTRY32</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">"Enumerating threads with CreateToolhelp32Snapshot <generator>"</span><span class="p">,</span> <span class="s2">"SLOW"</span><span class="p">)</span>
|
|
<span class="n">thread_entry</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">"New handle CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD) <generator> | </span><span class="si">{0:#x}</span><span class="s2">"</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">"HANDLE"</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">"CLOSE CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD) <generator> | </span><span class="si">{0:#x}</span><span class="s2">"</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">"HANDLE"</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">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">"Enumerating threads with CreateToolhelp32Snapshot and setup owner"</span><span class="p">,</span> <span class="s2">"SLOW"</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">PROCESSENTRY32</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">Process32First</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_PROCESSENTRY32</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">Process32Next</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_PROCESSENTRY32</span><span class="p">(</span><span class="n">process_entry</span><span class="p">))</span>
|
|
|
|
<span class="c1"># Forge a dict pid -> 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">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>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<div id="searchbox" style="display: none" role="search">
|
|
<h3>Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../../search.html" method="get">
|
|
<input type="text" name="q" />
|
|
<input type="submit" value="Go" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">$('#searchbox').show(0);</script>
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">PythonForWindows 0.5 documentation</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2015, Clement Rouault.
|
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.5.
|
|
</div>
|
|
</body>
|
|
</html> |