Update generated def + documentation

This commit is contained in:
hakril
2020-03-29 22:14:29 +02:00
parent 9485ceef05
commit 578b4d9193
77 changed files with 122135 additions and 34035 deletions
+6 -2
View File
@@ -354,16 +354,20 @@ class WinErrorCtypesGenerator(DefineCtypesGenerator):
# TEST Documentation generator
class DefineDocGenerator(NoTemplatedGenerator):
DOCNAME = "WinDef"
def copy_template(self):
self.emitline(".. currentmodule:: windows.generated_def")
self.emitline("")
self.emitline("Windef")
self.emitline(self.DOCNAME)
self.emitline("------")
def generate_for_file(self, file):
for define in file.data:
self.emitline(".. autodata:: {define.name}".format(define=define))
class WinErrorDocGenerator(DefineDocGenerator):
DOCNAME = "WinError"
class NtStatusCtypesGenerator(CtypesGenerator):
def generate_for_file(self, file):
@@ -750,7 +754,7 @@ ntstatus_module_generator.generate()
ntstatus_module_generator.generate_doc(from_here(r"..\docs\source\ntstatus_generated.rst"))
print("== Generating WinError ==")
winerror_module_generator = ModuleGenerator(WINERROR_MODULE, DefinitionParsedFile, WinErrorCtypesGenerator, DefineDocGenerator, from_here(r"definitions\winerror.txt"))
winerror_module_generator = ModuleGenerator(WINERROR_MODULE, DefinitionParsedFile, WinErrorCtypesGenerator, WinErrorDocGenerator, from_here(r"definitions\winerror.txt"))
# Hardcoded template file (no dir for ntstatus) -- Need one dir ?
winerror_module_generator.get_template_filename = lambda : from_here(r"definitions\winerror_template.py")
winerror_module_generator.generate()
+7 -11
View File
@@ -128,11 +128,6 @@
<span class="p">]</span>
<span class="n">_SetConsoleTitleW</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">BOOL</span>
<span class="n">handles</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">STDOUT</span><span class="p">:</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">STDOUT</span><span class="p">),</span>
<span class="n">STDERR</span><span class="p">:</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">STDERR</span><span class="p">),</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">_winapi_test</span><span class="p">(</span><span class="n">handle</span><span class="p">):</span>
<span class="n">csbi</span> <span class="o">=</span> <span class="n">CONSOLE_SCREEN_BUFFER_INFO</span><span class="p">()</span>
<span class="n">success</span> <span class="o">=</span> <span class="n">_GetConsoleScreenBufferInfo</span><span class="p">(</span>
@@ -140,17 +135,18 @@
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">success</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">winapi_test</span><span class="p">():</span>
<span class="k">return</span> <span class="nb">any</span><span class="p">(</span><span class="n">_winapi_test</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">handles</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
<span class="k">return</span> <span class="nb">any</span><span class="p">(</span><span class="n">_winapi_test</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span>
<span class="p">(</span><span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">STDOUT</span><span class="p">),</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">STDERR</span><span class="p">)))</span>
<span class="k">def</span> <span class="nf">GetConsoleScreenBufferInfo</span><span class="p">(</span><span class="n">stream_id</span><span class="o">=</span><span class="n">STDOUT</span><span class="p">):</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">handles</span><span class="p">[</span><span class="n">stream_id</span><span class="p">]</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">stream_id</span><span class="p">)</span>
<span class="n">csbi</span> <span class="o">=</span> <span class="n">CONSOLE_SCREEN_BUFFER_INFO</span><span class="p">()</span>
<span class="n">success</span> <span class="o">=</span> <span class="n">_GetConsoleScreenBufferInfo</span><span class="p">(</span>
<span class="n">handle</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">csbi</span><span class="p">))</span>
<span class="k">return</span> <span class="n">csbi</span>
<span class="k">def</span> <span class="nf">SetConsoleTextAttribute</span><span class="p">(</span><span class="n">stream_id</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">handles</span><span class="p">[</span><span class="n">stream_id</span><span class="p">]</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">stream_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">_SetConsoleTextAttribute</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">attrs</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">SetConsoleCursorPosition</span><span class="p">(</span><span class="n">stream_id</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">adjust</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
@@ -168,11 +164,11 @@
<span class="n">adjusted_position</span><span class="o">.</span><span class="n">Y</span> <span class="o">+=</span> <span class="n">sr</span><span class="o">.</span><span class="n">Top</span>
<span class="n">adjusted_position</span><span class="o">.</span><span class="n">X</span> <span class="o">+=</span> <span class="n">sr</span><span class="o">.</span><span class="n">Left</span>
<span class="c1"># Resume normal processing</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">handles</span><span class="p">[</span><span class="n">stream_id</span><span class="p">]</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">stream_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">_SetConsoleCursorPosition</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">adjusted_position</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">FillConsoleOutputCharacter</span><span class="p">(</span><span class="n">stream_id</span><span class="p">,</span> <span class="n">char</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">start</span><span class="p">):</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">handles</span><span class="p">[</span><span class="n">stream_id</span><span class="p">]</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">stream_id</span><span class="p">)</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">c_char</span><span class="p">(</span><span class="n">char</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
<span class="n">length</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
<span class="n">num_written</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
@@ -183,7 +179,7 @@
<span class="k">def</span> <span class="nf">FillConsoleOutputAttribute</span><span class="p">(</span><span class="n">stream_id</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">start</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39; FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &amp;cCharsWritten )&#39;&#39;&#39;</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">handles</span><span class="p">[</span><span class="n">stream_id</span><span class="p">]</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">_GetStdHandle</span><span class="p">(</span><span class="n">stream_id</span><span class="p">)</span>
<span class="n">attribute</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">WORD</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="n">length</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
<span class="n">num_written</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+16 -10
View File
@@ -44,6 +44,7 @@
<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">generated_def</span> <span class="k">as</span> <span class="n">gdef</span>
<span class="kn">import</span> <span class="nn">windows.pycompat</span>
<span class="c1">## For 64b python</span>
@@ -60,7 +61,7 @@
<span class="c1"># PORT_MESSAGE + MessageAttribute</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg_or_size</span><span class="o">=</span><span class="mh">0x1000</span><span class="p">,</span> <span class="n">attributes</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># Init the PORT_MESSAGE</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_or_size</span><span class="p">,</span> <span class="p">(</span><span class="n">long</span><span class="p">,</span> <span class="nb">int</span><span class="p">)):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_or_size</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">int_types</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">port_message_buffer_size</span> <span class="o">=</span> <span class="n">msg_or_size</span>
<span class="bp">self</span><span class="o">.</span><span class="n">port_message_raw_buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">msg_or_size</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">port_message</span> <span class="o">=</span> <span class="n">AlpcMessagePort</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">port_message_raw_buffer</span><span class="p">)</span>
@@ -331,7 +332,7 @@
<span class="n">AlpcSection</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;AlpcSection&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;handle&quot;</span><span class="p">,</span> <span class="s2">&quot;size&quot;</span><span class="p">])</span>
<span class="k">class</span> <span class="nc">AlpcTransportBase</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">send_receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alpc_message</span><span class="p">,</span> <span class="n">receive_msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MSGFLG_SYNC_REQUEST</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">send_receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alpc_message</span><span class="p">,</span> <span class="n">receive_msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MSGFLG_SYNC_REQUEST</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Send and receive a message with ``flags``.</span>
<span class="sd"> :param alpc_message: The message to send. If ``alpc_message`` is a :class:`str` it build an AlpcMessage with the message as data.</span>
@@ -340,15 +341,17 @@
<span class="sd"> :type receive_msg: AlpcMessage or None</span>
<span class="sd"> :param int flags: The flags for :func:`NtAlpcSendWaitReceivePort`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">anybuff</span><span class="p">):</span>
<span class="n">raw_alpc_message</span> <span class="o">=</span> <span class="n">alpc_message</span>
<span class="n">alpc_message</span> <span class="o">=</span> <span class="n">AlpcMessage</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">)))</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mh">0x1000</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">pdb</span><span class="p">;</span><span class="n">pdb</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span>
<span class="n">alpc_message</span> <span class="o">=</span> <span class="n">AlpcMessage</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">)</span> <span class="o">+</span> <span class="mh">0x200</span><span class="p">))</span>
<span class="n">alpc_message</span><span class="o">.</span><span class="n">port_message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">raw_alpc_message</span>
<span class="k">if</span> <span class="n">receive_msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">receive_msg</span> <span class="o">=</span> <span class="n">AlpcMessage</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">receive_size</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SIZE_T</span><span class="p">(</span><span class="n">receive_msg</span><span class="o">.</span><span class="n">port_message_buffer_size</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtAlpcSendWaitReceivePort</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">alpc_message</span><span class="o">.</span><span class="n">port_message</span><span class="p">,</span> <span class="n">alpc_message</span><span class="o">.</span><span class="n">attributes</span><span class="p">,</span> <span class="n">receive_msg</span><span class="o">.</span><span class="n">port_message</span><span class="p">,</span> <span class="n">receive_size</span><span class="p">,</span> <span class="n">receive_msg</span><span class="o">.</span><span class="n">attributes</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtAlpcSendWaitReceivePort</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">alpc_message</span><span class="o">.</span><span class="n">port_message</span><span class="p">,</span> <span class="n">alpc_message</span><span class="o">.</span><span class="n">attributes</span><span class="p">,</span> <span class="n">receive_msg</span><span class="o">.</span><span class="n">port_message</span><span class="p">,</span> <span class="n">receive_size</span><span class="p">,</span> <span class="n">receive_msg</span><span class="o">.</span><span class="n">attributes</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
<span class="k">return</span> <span class="n">receive_msg</span>
<span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alpc_message</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
@@ -358,7 +361,7 @@
<span class="sd"> :type alpc_message: AlpcMessage or str</span>
<span class="sd"> :param int flags: The flags for :func:`NtAlpcSendWaitReceivePort`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">anybuff</span><span class="p">):</span>
<span class="n">raw_alpc_message</span> <span class="o">=</span> <span class="n">alpc_message</span>
<span class="n">alpc_message</span> <span class="o">=</span> <span class="n">AlpcMessage</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">alpc_message</span><span class="p">)))</span>
<span class="n">alpc_message</span><span class="o">.</span><span class="n">port_message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">raw_alpc_message</span>
@@ -385,7 +388,7 @@
<div class="viewcode-block" id="AlpcClient"><a class="viewcode-back" href="../../alpc.html#windows.alpc.AlpcClient">[docs]</a><span class="k">class</span> <span class="nc">AlpcClient</span><span class="p">(</span><span class="n">AlpcTransportBase</span><span class="p">):</span>
<span class="s2">&quot;An ALPC client able to connect to a port and send/receive messages&quot;</span>
<span class="n">DEFAULT_MAX_MESSAGE_LENGTH</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="n">DEFAULT_MAX_MESSAGE_LENGTH</span> <span class="o">=</span> <span class="mh">0x9000</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">port_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Init the :class:`AlpcClient` automatically connect to ``port_name`` using default values if given&quot;&quot;&quot;</span>
@@ -435,7 +438,7 @@
<span class="n">send_msg</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">send_msg_attr</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">buffersize</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">anybuff</span><span class="p">):</span>
<span class="n">buffersize</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="nb">len</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span> <span class="o">+</span> <span class="mh">0x1000</span><span class="p">)</span>
<span class="n">send_msg</span> <span class="o">=</span> <span class="n">AlpcMessagePort</span><span class="o">.</span><span class="n">from_buffer_size</span><span class="p">(</span><span class="n">buffersize</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">send_msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">connect_message</span>
@@ -471,7 +474,8 @@
<span class="k">return</span> <span class="n">view_attributes</span>
<span class="k">def</span> <span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_port</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_port</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
@@ -485,6 +489,7 @@
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">port_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">port_name</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">communication_port_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handle</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">port_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_port</span><span class="p">(</span><span class="n">port_name</span><span class="p">)</span>
@@ -564,7 +569,8 @@
<span class="k">return</span> <span class="n">msg</span></div>
<span class="k">def</span> <span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_port</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_port</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="k">for</span> <span class="n">com_port_handle</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">communication_port_list</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_port</span><span class="p">(</span><span class="n">com_port_handle</span><span class="p">)</span>
+54 -6
View File
@@ -37,7 +37,8 @@
<div class="body" role="main">
<h1>Source code for windows.com</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">struct</span>
<span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">struct</span>
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">functools</span>
<span class="kn">from</span> <span class="nn">ctypes</span> <span class="k">import</span> <span class="n">HRESULT</span><span class="p">,</span> <span class="n">byref</span><span class="p">,</span> <span class="n">cast</span>
@@ -51,6 +52,11 @@
<span class="kn">from</span> <span class="nn">windows.generated_def</span> <span class="k">import</span> <span class="n">interfaces</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.interfaces</span> <span class="k">import</span> <span class="n">generate_IID</span><span class="p">,</span> <span class="n">IID</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">int_types</span><span class="p">,</span> <span class="n">basestring</span>
<span class="c1"># We have windows.com.COMImplementation</span>
<span class="c1"># So we need windows.com.COMInterface</span>
<span class="n">COMInterface</span> <span class="o">=</span> <span class="n">interfaces</span><span class="o">.</span><span class="n">COMInterface</span>
<span class="c1"># Simple raw -&gt; UUID</span>
<span class="c1"># &quot;-&quot;.join(&quot;{:02X}&quot;.format(c) for c in struct.unpack(&quot;&lt;IHHHBBBBBB&quot;, x))</span>
@@ -62,18 +68,54 @@
<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">t</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span>
<span class="k">if</span> <span class="n">t</span><span class="p">:</span>
<span class="k">return</span> <span class="n">t</span>
<span class="k">return</span> <span class="n">t</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span>
<span class="k">return</span> <span class="n">initsecurity</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">initsecurity</span><span class="p">():</span> <span class="c1"># Should take some parameters..</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CoInitializeSecurity</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">RPC_C_IMP_LEVEL_IMPERSONATE</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Dispatch</span><span class="p">(</span><span class="n">interfaces</span><span class="o">.</span><span class="n">IDispatch</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">TypeInfoCount</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">count</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="bp">self</span><span class="o">.</span><span class="n">GetTypeInfoCount</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
<span class="k">return</span> <span class="n">count</span>
<span class="k">def</span> <span class="nf">type_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
<span class="n">type_info</span> <span class="o">=</span> <span class="n">TypeInfo</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetTypeInfo</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">type_info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">type_info</span>
<span class="k">class</span> <span class="nc">TypeInfo</span><span class="p">(</span><span class="n">interfaces</span><span class="o">.</span><span class="n">ITypeInfo</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPFUNCDESC</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetFuncDesc</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">attr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPTYPEATTR</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetTypeAttr</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">names</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memid</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">UINT</span><span class="p">()</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span> <span class="o">*</span> <span class="mi">10</span><span class="p">)(</span><span class="o">*</span><span class="nb">tuple</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetNames</span><span class="p">(</span><span class="n">memid</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">x</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">docu</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetDocumentation</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">res</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span>
<div class="viewcode-block" id="create_instance"><a class="viewcode-back" href="../../com.html#windows.com.create_instance">[docs]</a><span class="k">def</span> <span class="nf">create_instance</span><span class="p">(</span><span class="n">clsiid</span><span class="p">,</span> <span class="n">targetinterface</span><span class="p">,</span> <span class="n">custom_iid</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">CLSCTX_INPROC_SERVER</span> <span class="o">|</span> <span class="n">CLSCTX_LOCAL_SERVER</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A simple wrapper around ``CoCreateInstance &lt;https://msdn.microsoft.com/en-us/library/windows/desktop/ms686615(v=vs.85).aspx&gt;``&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">custom_iid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">custom_iid</span> <span class="o">=</span> <span class="n">targetinterface</span><span class="o">.</span><span class="n">IID</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CoCreateInstance</span><span class="p">(</span><span class="n">byref</span><span class="p">(</span><span class="n">clsiid</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">custom_iid</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">targetinterface</span><span class="p">))</span></div>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">clsiid</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="n">clsiid</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="n">clsiid</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CoCreateInstance</span><span class="p">(</span><span class="n">byref</span><span class="p">(</span><span class="n">clsiid</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">custom_iid</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">targetinterface</span><span class="p">))</span>
<span class="k">return</span> <span class="n">targetinterface</span></div>
<span class="k">def</span> <span class="nf">resolve_progid</span><span class="p">(</span><span class="n">progid</span><span class="p">):</span>
@@ -142,11 +184,11 @@
<span class="k">def</span> <span class="nf">check_type_i4</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># 31 ? as we may want to keep sign :)</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">))</span> <span class="ow">and</span> <span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="mi">32</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="mi">32</span>
<span class="k">def</span> <span class="nf">check_type_i8</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># 63 ? as we may want to keep sign :)</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">))</span> <span class="ow">and</span> <span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="mi">64</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="mi">64</span>
<span class="k">def</span> <span class="nf">check_type_bstr</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span>
@@ -226,6 +268,12 @@
<span class="n">attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">QUICK_CHECK_TYPE</span><span class="p">[</span><span class="n">rawvt</span><span class="p">]</span>
<span class="k">if</span> <span class="n">attr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="s2">&quot;punkVal&quot;</span><span class="p">:</span>
<span class="c1"># Quick hack for COM interface type</span>
<span class="c1"># Do something clean with CHECK_TYPE ?</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IUnknown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">punkVal</span><span class="p">)</span>
<span class="n">x</span><span class="o">.</span><span class="n">AddRef</span><span class="p">()</span>
<span class="k">return</span> <span class="n">x</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">guess_type_and_set_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
@@ -332,7 +380,7 @@
<div class="viewcode-block" id="COMImplementation.QueryInterface"><a class="viewcode-back" href="../../com.html#windows.com.COMImplementation.QueryInterface">[docs]</a> <span class="k">def</span> <span class="nf">QueryInterface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">this</span><span class="p">,</span> <span class="n">piid</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Default ``QueryInterface`` implementation that returns ``self`` if piid is the implemented interface&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">piid</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="n">IUnknown</span><span class="o">.</span><span class="n">IID</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">IMPLEMENT</span><span class="o">.</span><span class="n">IID</span><span class="p">):</span>
<span class="k">if</span> <span class="n">piid</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">IUnknown</span><span class="o">.</span><span class="n">IID</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">IMPLEMENT</span><span class="o">.</span><span class="n">IID</span><span class="p">):</span>
<span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">this</span>
<span class="k">return</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">E_NOINTERFACE</span></div>
+9 -3
View File
@@ -137,7 +137,7 @@
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_signers_and_certs_generator</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> &quot;</span><span class="si">{1}</span><span class="s1">&quot; content_type=</span><span class="si">{2}</span><span class="s1">&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">content_type</span><span class="p">)</span></div>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> &quot;</span><span class="si">{1}</span><span class="s1">&quot; content_type=</span><span class="si">{2!r}</span><span class="s1">&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">content_type</span><span class="p">)</span></div>
<span class="c1"># https://msdn.microsoft.com/en-us/library/windows/desktop/aa382037(v=vs.85).aspx</span>
@@ -213,7 +213,10 @@
<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">&amp;</span> <span class="mh">0xffffffff</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">CRYPT_E_NOT_FOUND</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="n">Certificate</span><span class="o">.</span><span class="n">from_pointer</span><span class="p">(</span><span class="n">rawcertcontext</span><span class="p">)</span></div></div>
<span class="k">return</span> <span class="n">Certificate</span><span class="o">.</span><span class="n">from_pointer</span><span class="p">(</span><span class="n">rawcertcontext</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CertCloseStore</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span></div>
<span class="c1"># PKCS12_NO_PERSIST_KEY -&gt; do not save it in a key container on disk</span>
@@ -228,6 +231,7 @@
<span class="c1"># By forcing PKCS12_ALWAYS_CNG_KSP we remove this as the key are directly linked to the correct CNG_KSP in the CertStore</span>
<span class="c1"># Look like it&#39;s based on this part of the PFX:</span>
<span class="c1"># Microsoft CSP Name: Microsoft Enhanced Cryptographic Provider v1.0</span>
<span class="c1"># BUT this will not allow to decrypt RSA_RC4 ?</span>
<div class="viewcode-block" id="import_pfx"><a class="viewcode-back" href="../../../crypto.html#windows.crypto.import_pfx">[docs]</a><span class="k">def</span> <span class="nf">import_pfx</span><span class="p">(</span><span class="n">pfx</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">CRYPT_USER_KEYSET</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PKCS12_NO_PERSIST_KEY</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PKCS12_ALWAYS_CNG_KSP</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Import the file ``pfx`` with the ``password``.</span>
@@ -238,7 +242,7 @@
<span class="sd"> :return: :class:`CertificateStore`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pfx</span><span class="p">,</span> <span class="p">(</span><span class="n">basestring</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">)):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pfx</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">anybuff</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pfx</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">):</span>
<span class="n">pfx</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">CRYPT_DATA_BLOB</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">pfx</span><span class="p">)</span>
<span class="n">cert_store</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">PFXImportCertStore</span><span class="p">(</span><span class="n">pfx</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
<span class="k">return</span> <span class="n">CertificateStore</span><span class="p">(</span><span class="n">cert_store</span><span class="p">)</span></div>
@@ -522,6 +526,8 @@
<span class="c1"># class CertficateChain(object):</span>
<span class="c1"># def __init__(self, pc_chain_context):</span>
<span class="c1"># self.chain = pc_chain_context[0]</span>
+30 -1
View File
@@ -139,7 +139,36 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">recipients</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;TODO: DOC&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">get_recipient_data</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nb_recipient</span><span class="p">)]</span></div>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">get_recipient_data</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nb_recipient</span><span class="p">)]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">content</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_param</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">CMSG_CONTENT_PARAM</span><span class="p">)[:]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">content_type</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="bp">self</span><span class="o">.</span><span class="n">get_param</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">CMSG_INNER_CONTENT_TYPE_PARAM</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;CMSG_INNER_CONTENT_TYPE_PARAM not NULL TERMINATED&quot;</span>
<span class="k">return</span> <span class="n">data</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</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="n">blob</span><span class="p">,</span> <span class="n">final</span><span class="p">):</span>
<span class="c1"># Test isinstance string ?</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">blob</span><span class="p">,</span> <span class="p">(</span><span class="n">basestring</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">)):</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BYTE</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">blob</span><span class="p">)</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CryptMsgUpdate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">blob</span><span class="p">),</span> <span class="n">final</span><span class="p">)</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CryptMsgUpdate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">blob</span><span class="o">.</span><span class="n">pbData</span><span class="p">,</span> <span class="n">blob</span><span class="o">.</span><span class="n">cbData</span><span class="p">,</span> <span class="n">final</span><span class="p">)</span>
<span class="c1"># constructor</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">hmsg</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CryptMsgOpenToDecode</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">DEFAULT_ENCODING</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">newmsg</span> <span class="o">=</span> <span class="n">CryptMessage</span><span class="p">(</span><span class="n">hmsg</span><span class="p">)</span>
<span class="n">newmsg</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">final</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">newmsg</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CryptMsgClose</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
</pre></div>
</div>
@@ -87,7 +87,7 @@
<span class="sd"> :return: :class:`bytearray`: The encrypted message</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">alg_ident</span> <span class="o">=</span> <span class="n">CRYPT_ALGORITHM_IDENTIFIER</span><span class="p">()</span>
<span class="n">alg_ident</span><span class="o">.</span><span class="n">pszObjId</span> <span class="o">=</span> <span class="n">algo</span>
<span class="n">alg_ident</span><span class="o">.</span><span class="n">pszObjId</span> <span class="o">=</span> <span class="n">algo</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
<span class="c1"># We want to have automatique translation of Certificate -&gt; PCERT_CONTEXT</span>
<span class="c1"># In order to simple create the &#39;PCERT_CONTEXT[] certs&#39;</span>
<span class="c1"># For that we need a tuple of X * 1-item-tuple</span>
@@ -153,9 +153,9 @@
<span class="n">dcryptsize</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CryptDecryptMessage</span><span class="p">(</span><span class="n">dparam</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">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="n">dcryptsize</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="c1">#Decrypt the msg</span>
<span class="n">dcryptbuff</span> <span class="o">=</span> <span class="p">(</span><span class="n">BYTE</span> <span class="o">*</span> <span class="n">dcryptsize</span><span class="o">.</span><span class="n">value</span><span class="p">)()</span>
<span class="n">dcryptbuff</span> <span class="o">=</span> <span class="p">(</span><span class="n">BYTE</span> <span class="o">*</span> <span class="p">(</span><span class="n">dcryptsize</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="mh">0x1000</span><span class="p">))()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">CryptDecryptMessage</span><span class="p">(</span><span class="n">dparam</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">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">),</span> <span class="n">dcryptbuff</span><span class="p">,</span> <span class="n">dcryptsize</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">bytearray</span><span class="p">(</span><span class="n">dcryptbuff</span><span class="p">[:</span><span class="n">dcryptsize</span><span class="o">.</span><span class="n">value</span><span class="p">]))</span></div>
<span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="nb">bytearray</span><span class="p">(</span><span class="n">dcryptbuff</span><span class="p">[:</span><span class="n">dcryptsize</span><span class="o">.</span><span class="n">value</span><span class="p">]))</span></div>
</pre></div>
</div>
+17 -10
View File
@@ -147,11 +147,17 @@
<span class="n">t</span> <span class="o">=</span> <span class="n">rt</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">cproc</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">rt</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="s2">&quot;contents&quot;</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">value</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1"># Will fail in py3..</span>
<span class="n">content</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">contents</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="c1"># contents will fail on basic type</span>
<span class="c1"># Not really an expected behavior</span>
<span class="c1"># But it works for now.. (and since a while)</span>
<span class="k">pass</span>
<span class="k">if</span> <span class="n">content</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">value</span>
<span class="n">res</span><span class="p">[</span><span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="n">t</span>
<span class="k">return</span> <span class="n">res</span>
@@ -251,16 +257,17 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial_breakpoint</span><span class="o">.</span><span class="n">ret_trigger</span><span class="p">(</span><span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">FunctionCallBP</span><span class="p">(</span><span class="n">Breakpoint</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">break_on_ret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exception</span><span class="p">):</span>
<div class="viewcode-block" id="FunctionCallBP"><a class="viewcode-back" href="../../../debug.html#windows.debug.FunctionCallBP">[docs]</a><span class="k">class</span> <span class="nc">FunctionCallBP</span><span class="p">(</span><span class="n">Breakpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A Breakpoint that allow to trigger at the return of a function&quot;&quot;&quot;</span>
<div class="viewcode-block" id="FunctionCallBP.break_on_ret"><a class="viewcode-back" href="../../../debug.html#windows.debug.FunctionCallBP.break_on_ret">[docs]</a> <span class="k">def</span> <span class="nf">break_on_ret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exception</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Setup a breakpoint at the return address of the function, this breakpoint will call :func:`ret_trigger`&quot;&quot;&quot;</span>
<span class="n">cproc</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span>
<span class="n">return_addr</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">read_ptr</span><span class="p">(</span><span class="n">dbg</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">sp</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">FunctionRetBP</span><span class="p">(</span><span class="n">return_addr</span><span class="p">,</span> <span class="bp">self</span><span class="p">),</span> <span class="n">target</span><span class="o">=</span><span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="p">)</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">FunctionRetBP</span><span class="p">(</span><span class="n">return_addr</span><span class="p">,</span> <span class="bp">self</span><span class="p">),</span> <span class="n">target</span><span class="o">=</span><span class="n">dbg</span><span class="o">.</span><span class="n">current_process</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">ret_trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exception</span><span class="p">):</span>
<div class="viewcode-block" id="FunctionCallBP.ret_trigger"><a class="viewcode-back" href="../../../debug.html#windows.debug.FunctionCallBP.ret_trigger">[docs]</a> <span class="k">def</span> <span class="nf">ret_trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exception</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Called at the return of the function if :func:`break_on_ret` was called&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;ret_trigger&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;ret_trigger&quot;</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="FunctionBP"><a class="viewcode-back" href="../../../debug.html#windows.debug.FunctionBP">[docs]</a><span class="k">class</span> <span class="nc">FunctionBP</span><span class="p">(</span><span class="n">FunctionCallBP</span><span class="p">,</span> <span class="n">FunctionParamDumpBP</span><span class="p">):</span>
+63 -11
View File
@@ -42,7 +42,9 @@
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="k">import</span> <span class="n">contextmanager</span>
<span class="kn">import</span> <span class="nn">windows</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">import</span> <span class="nn">windows.winobject.exception</span> <span class="k">as</span> <span class="nn">winexception</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x86</span> <span class="k">as</span> <span class="nn">x86</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x64</span> <span class="k">as</span> <span class="nn">x64</span>
@@ -56,9 +58,13 @@
<span class="c1">#from windows.syswow64 import CS_32bits</span>
<span class="kn">from</span> <span class="nn">windows.winobject.exception</span> <span class="k">import</span> <span class="n">VectoredException</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">basestring</span>
<span class="n">PAGE_SIZE</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="k">class</span> <span class="nc">DebuggerError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">DEBUG_EVENT</span><span class="p">(</span><span class="n">DEBUG_EVENT</span><span class="p">):</span>
<span class="n">KNOWN_EVENT_CODE</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">x</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="p">[</span><span class="n">EXCEPTION_DEBUG_EVENT</span><span class="p">,</span>
@@ -110,7 +116,8 @@
<span class="bp">self</span><span class="o">.</span><span class="n">_watched_pages</span> <span class="o">=</span> <span class="p">{}</span><span class="c1"># Dict [page_modif] -&gt; [mem bp on the page]</span>
<span class="c1"># [start] -&gt; (size, current_proctection, original_prot)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_virtual_protected_memory</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># List of memory-range modified by a MemBP</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">_virtual_protected_memory</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># List of memory-range modified by a MemBP</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_debug_event</span> <span class="o">=</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="Debugger.attach"><a class="viewcode-back" href="../../../debug.html#windows.debug.Debugger.attach">[docs]</a> <span class="nd">@classmethod</span>
@@ -138,7 +145,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Remove ref to process -&gt; GC -&gt; CloseHandle -&gt; process is destroyed</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">DebugActiveProcessStop</span><span class="p">(</span><span class="n">tpid</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">proc</span> <span class="ow">in</span> <span class="n">targets</span><span class="p">:</span>
<span class="k">for</span> <span class="n">proc</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">targets</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">detach</span><span class="p">(</span><span class="n">proc</span><span class="p">)</span>
<span class="k">del</span> <span class="n">targets</span>
<span class="k">return</span>
@@ -146,7 +153,7 @@
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Detach accept only WinProcess&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">disable_all_memory_breakpoints</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
<span class="k">for</span> <span class="n">bp</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">breakpoints</span><span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">pid</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="k">for</span> <span class="n">bp</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">breakpoints</span><span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">pid</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">bp</span><span class="o">.</span><span class="n">apply_to_target</span><span class="p">(</span><span class="n">target</span><span class="p">):</span>
<span class="n">target_threads</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">target</span><span class="o">.</span><span class="n">threads</span> <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">tid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">threads</span><span class="p">]</span>
<span class="n">bp_threads</span> <span class="o">=</span> <span class="p">[]</span>
@@ -171,8 +178,8 @@
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_watched_pages</span><span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">pid</span><span class="p">]</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_module_by_process</span><span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">pid</span><span class="p">]</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_finish_debug_event</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">REMOVE_ME_debug_event</span><span class="p">,</span> <span class="n">DBG_CONTINUE</span><span class="p">)</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="p">:</span> <span class="c1"># Bug if CTRL+C and current_process changed ?</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_finish_debug_event</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_current_debug_event</span><span class="p">,</span> <span class="n">DBG_CONTINUE</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_process</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_thread</span> <span class="o">=</span> <span class="kc">None</span>
@@ -209,19 +216,43 @@
<span class="k">def</span> <span class="nf">_debug_event_generator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">debug_event</span> <span class="o">=</span> <span class="n">DEBUG_EVENT</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">WaitForDebugEvent</span><span class="p">(</span><span class="n">debug_event</span><span class="p">)</span>
<span class="n">debug_event</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DEBUG_EVENT</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">WaitForDebugEvent</span><span class="p">(</span><span class="n">debug_event</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="c1"># So we will go out of the loop because of a Ctrl+c</span>
<span class="c1"># BP trigger will not be called.</span>
<span class="c1"># So AT LEAST quit loop with a coherent context</span>
<span class="c1"># Fix thread PC if we just triggered a BP</span>
<span class="k">if</span> <span class="p">(</span><span class="n">debug_event</span><span class="o">.</span><span class="n">dwDebugEventCode</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EXCEPTION_DEBUG_EVENT</span> <span class="ow">and</span>
<span class="n">debug_event</span><span class="o">.</span><span class="n">u</span><span class="o">.</span><span class="n">Exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionCode</span> <span class="ow">in</span> <span class="p">[</span><span class="n">gdef</span><span class="o">.</span><span class="n">EXCEPTION_BREAKPOINT</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">STATUS_WX86_BREAKPOINT</span><span class="p">]):</span>
<span class="c1"># This is a breakpoint: One of ours ?</span>
<span class="n">bp_addr</span> <span class="o">=</span> <span class="n">debug_event</span><span class="o">.</span><span class="n">u</span><span class="o">.</span><span class="n">Exception</span><span class="o">.</span><span class="n">ExceptionRecord</span><span class="o">.</span><span class="n">ExceptionAddress</span>
<span class="k">if</span> <span class="n">bp_addr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">breakpoints</span><span class="p">[</span><span class="n">debug_event</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">]:</span>
<span class="c1"># Leave the thread in a coherent state for detach</span>
<span class="c1"># Should it be done in detach ?</span>
<span class="c1"># And just stock the &quot;Interrupted debug_event&quot; here ?</span>
<span class="n">thread</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">threads</span><span class="p">[</span><span class="n">debug_event</span><span class="o">.</span><span class="n">dwThreadId</span><span class="p">]</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">thread</span><span class="o">.</span><span class="n">context</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">pc</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="n">thread</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
<span class="k">raise</span>
<span class="k">finally</span><span class="p">:</span> <span class="c1"># If user Ctrl+c -&gt; we could raise just at the return of WaitForDebugEvent</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_debug_event</span> <span class="o">=</span> <span class="n">debug_event</span>
<span class="k">yield</span> <span class="n">debug_event</span>
<span class="k">def</span> <span class="nf">_finish_debug_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">if</span> <span class="n">action</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="n">windef</span><span class="o">.</span><span class="n">DBG_CONTINUE</span><span class="p">,</span> <span class="n">windef</span><span class="o">.</span><span class="n">DBG_EXCEPTION_NOT_HANDLED</span><span class="p">]:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Unknow action : &lt;0&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">ContinueDebugEvent</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">dwThreadId</span><span class="p">,</span> <span class="n">action</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_debug_event</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">_add_exe_to_module_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">create_process_event</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Add the intial exe file described by create_process_event to the list of module in the process&quot;&quot;&quot;</span>
<span class="n">exe_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">get_mapped_filename</span><span class="p">(</span><span class="n">create_process_event</span><span class="o">.</span><span class="n">lpBaseOfImage</span><span class="p">)</span>
<span class="n">exe_name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">exe_path</span><span class="p">)</span>
<span class="n">exe_name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">exe_path</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="n">exe_name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;.exe&quot;</span><span class="p">):</span>
<span class="n">exe_name</span> <span class="o">=</span> <span class="n">exe_name</span><span class="p">[:</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="s2">&quot;.exe&quot;</span><span class="p">)]</span>
<span class="c1">#print(&quot;Exe name is {0}&quot;.format(exe_name))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_module_by_process</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">pid</span><span class="p">][</span><span class="n">exe_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">pe_parse</span><span class="o">.</span><span class="n">GetPEFile</span><span class="p">(</span><span class="n">create_process_event</span><span class="o">.</span><span class="n">lpBaseOfImage</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="p">)</span>
<span class="c1">#self._setup_pending_breakpoints_load_dll(exe_name) # Already setup in _setup_pending_breakpoints_new_process</span>
@@ -265,7 +296,13 @@
<span class="k">if</span> <span class="n">api</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exports</span><span class="p">:</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;Error resolving &lt;</span><span class="si">{0}</span><span class="s2">&gt; in &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">target</span><span class="p">),</span> <span class="s2">&quot;DBG&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown API &lt;</span><span class="si">{0}</span><span class="s2">&gt; in DLL </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">api</span><span class="p">,</span> <span class="n">dll</span><span class="p">))</span>
<span class="k">return</span> <span class="n">exports</span><span class="p">[</span><span class="n">api</span><span class="p">]</span>
<span class="n">target_addr</span> <span class="o">=</span> <span class="n">exports</span><span class="p">[</span><span class="n">api</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">target_addr</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="n">target_string</span> <span class="o">=</span> <span class="n">target_addr</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="s2">&quot;!&quot;</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;&lt;</span><span class="si">{0}</span><span class="s2">&gt; is export proxy to &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">target_string</span><span class="p">),</span> <span class="s2">&quot;DBG&quot;</span><span class="p">)</span>
<span class="c1"># Possible infinite loop ?</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resolve</span><span class="p">(</span><span class="n">target_string</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
<span class="k">return</span> <span class="n">target_addr</span>
<span class="k">def</span> <span class="nf">add_pending_breakpoint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bp</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pending_breakpoints_new</span><span class="p">[</span><span class="n">target</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">bp</span><span class="p">)</span>
@@ -299,6 +336,9 @@
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Cannot setup STANDARD_BP on </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">target</span><span class="p">))</span>
<span class="n">addr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resolve</span><span class="p">(</span><span class="n">bp</span><span class="o">.</span><span class="n">addr</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
<span class="c1"># raise DebuggerError(&quot;Could not set breakpoint {0} at &lt;{1}&gt;&quot;.format(bp, bp.addr))</span>
<span class="k">if</span> <span class="n">addr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;Setting soft-BP at &lt;</span><span class="si">{0:#x}</span><span class="s2">&gt; in &lt;</span><span class="si">{1}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">target</span><span class="p">),</span> <span class="s2">&quot;DBG&quot;</span><span class="p">)</span>
@@ -835,6 +875,9 @@
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_breakpoint_to_reput</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">tid</span><span class="p">]</span>
<span class="k">return</span> <span class="n">retvalue</span>
<span class="k">def</span> <span class="nf">_internal_on_load_dll</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">load_dll</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">_handle_load_dll</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">debug_event</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Handle LOAD_DLL_DEBUG_EVENT&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_debugger_state</span><span class="p">(</span><span class="n">debug_event</span><span class="p">)</span>
@@ -849,6 +892,7 @@
<span class="n">dll_name</span> <span class="o">=</span> <span class="n">dll_name</span><span class="p">[:</span><span class="o">-</span><span class="mi">6</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;64&quot;</span> <span class="c1"># Crade..</span>
<span class="c1">#print(&quot;Load {0} -&gt; {1}&quot;.format(dll, dll_name))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_module_by_process</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">pid</span><span class="p">][</span><span class="n">dll_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">pe_parse</span><span class="o">.</span><span class="n">GetPEFile</span><span class="p">(</span><span class="n">load_dll</span><span class="o">.</span><span class="n">lpBaseOfDll</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_process</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_internal_on_load_dll</span><span class="p">(</span><span class="n">load_dll</span><span class="p">)</span> <span class="c1"># Allow hook for symbol-debugger</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_setup_pending_breakpoints_load_dll</span><span class="p">(</span><span class="n">dll_name</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">DisabledMemoryBreakpoint</span><span class="p">():</span>
<span class="k">try</span><span class="p">:</span>
@@ -882,7 +926,6 @@
<div class="viewcode-block" id="Debugger.loop"><a class="viewcode-back" href="../../../debug.html#windows.debug.Debugger.loop">[docs]</a> <span class="k">def</span> <span class="nf">loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Debugging loop: handle event / dispatch to breakpoint. Returns when all targets are dead/detached&quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">debug_event</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_debug_event_generator</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">REMOVE_ME_debug_event</span> <span class="o">=</span> <span class="n">debug_event</span>
<span class="n">dbg_continue_flag</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dispatch_debug_event</span><span class="p">(</span><span class="n">debug_event</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dbg_continue_flag</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">dbg_continue_flag</span> <span class="o">=</span> <span class="n">DBG_CONTINUE</span>
@@ -920,7 +963,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">add_pending_breakpoint</span><span class="p">(</span><span class="n">bp</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">target</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Check that targets are accepted</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">processes</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">threads</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">processes</span><span class="o">.</span><span class="n">values</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">threads</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
<span class="c1"># if target == self.target: # Original target (that have not been lauched yet)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_pending_breakpoint</span><span class="p">(</span><span class="n">bp</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
<span class="c1"># else:</span>
@@ -1031,6 +1074,15 @@
<span class="k">return</span> <span class="mi">32</span>
<span class="k">return</span> <span class="mi">64</span></div>
<div class="viewcode-block" id="Debugger.kill_on_exit"><a class="viewcode-back" href="../../../debug.html#windows.debug.Debugger.kill_on_exit">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">kill_on_exit</span><span class="p">(</span><span class="n">choice</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;If set to True(default in Windows) will kill all attached process on thread exit.</span>
<span class="sd"> Otherwise, the thread detaches from all processes being debugged on exit.</span>
<span class="sd"> See: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-debugsetprocesskillonexit</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">winproxy</span><span class="o">.</span><span class="n">DebugSetProcessKillOnExit</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span></div>
<span class="c1"># Public callback</span>
<div class="viewcode-block" id="Debugger.on_setup"><a class="viewcode-back" href="../../../debug.html#windows.debug.Debugger.on_setup">[docs]</a> <span class="k">def</span> <span class="nf">on_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Called on the first breakpoint event occuring in the debugger.</span>
+7 -2
View File
@@ -39,7 +39,7 @@
<h1>Source code for windows.generated_def.flag</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">:</span>
<span class="n">long</span> <span class="o">=</span> <span class="nb">int</span>
@@ -53,7 +53,12 @@
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{0}</span><span class="s2">(</span><span class="si">{1:#x}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="fm">__str__</span> <span class="o">=</span> <span class="fm">__repr__</span>
<span class="c1"># Custom __str__ removed for multiple reason</span>
<span class="c1"># Main one -&gt; it breaks the json encoding of structure with flags :)</span>
<span class="c1"># Moving to a new politic -&gt; if people want the name in a string use {x!r}</span>
<span class="c1"># The __str__ of security descriptor &amp; guid will change soon as well :)</span>
<span class="c1"># __str__ = __repr__</span>
<span class="c1"># Fix pickling with protocol 2</span>
<span class="k">def</span> <span class="nf">__getnewargs__</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>
File diff suppressed because one or more lines are too long
-9
View File
@@ -90,7 +90,6 @@
<div class="viewcode-block" id="IATHook"><a class="viewcode-back" href="../../iat_hook.html#windows.hooks.IATHook">[docs]</a><span class="k">class</span> <span class="nc">IATHook</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Look at my hook &lt;3&quot;&quot;&quot;</span>
<span class="c1"># yolo = []</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">IAT_entry</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">types</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">types</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
@@ -107,7 +106,6 @@
<span class="c1"># self.stub_addr = ctypes.cast(stub, PVOID) # Same problem as keep stub... (GC..)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</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="bp">self</span><span class="o">.</span><span class="n">stub</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">)</span><span class="o">.</span><span class="n">value</span> <span class="c1"># Same problem as keep stub... (GC..)</span>
<span class="c1"># IAT_entry.stub = stub</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">realfunction</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WINFUNCTYPE</span><span class="p">(</span><span class="o">*</span><span class="n">types</span><span class="p">)(</span><span class="n">IAT_entry</span><span class="o">.</span><span class="n">nonhookvalue</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">is_enable</span> <span class="o">=</span> <span class="kc">False</span>
@@ -123,7 +121,6 @@
<div class="viewcode-block" id="IATHook.enable"><a class="viewcode-back" href="../../iat_hook.html#windows.hooks.IATHook.enable">[docs]</a> <span class="k">def</span> <span class="nf">enable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Enable the IAT hook: you MUST keep a reference to the IATHook while the hook is enabled&quot;&quot;&quot;</span>
<span class="k">with</span> <span class="n">utils</span><span class="o">.</span><span class="n">VirtualProtected</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">addr</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">PVOID</span><span class="p">),</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stub_addr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">is_enable</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="kc">True</span></div>
@@ -151,12 +148,6 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">realfunction</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="o">*</span><span class="n">adapted_args</span><span class="p">,</span> <span class="n">real_function</span><span class="o">=</span><span class="n">real_function</span><span class="p">)</span></div>
<span class="c1"># Use this tricks to prevent garbage collection of hook ?</span>
<span class="c1"># That&#39;s dirty..</span>
<span class="c1"># def __del__(self):</span>
<span class="c1"># print(&quot;HAHAHA {0}&quot;.format(self.is_enable))</span>
<span class="c1"># print(&quot;HELLO&quot;)</span>
<span class="c1">## New simple hook API based on winproxy</span>
<span class="k">def</span> <span class="nf">setup_hook</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">hook</span><span class="p">,</span> <span class="n">dll_to_hook</span><span class="p">):</span>
<span class="s2">&quot;TODO: Test and doc :D&quot;</span>
@@ -37,9 +37,18 @@
<div class="body" role="main">
<h1>Source code for windows.native_exec.simple_x86</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">collections</span>
<span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">collections</span>
<span class="kn">import</span> <span class="nn">struct</span>
<span class="kn">import</span> <span class="nn">binascii</span>
<span class="c1"># py3</span>
<span class="n">is_py3</span> <span class="o">=</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_py3</span><span class="p">:</span>
<span class="n">basestring</span> <span class="o">=</span> <span class="nb">str</span>
<span class="n">int_types</span> <span class="o">=</span> <span class="nb">int</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">int_types</span> <span class="o">=</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BitArray</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">bits</span><span class="p">):</span>
@@ -111,9 +120,15 @@
<span class="k">def</span> <span class="nf">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)(</span><span class="n">other</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_code_py3</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">bytes</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">PREFIX_VALUE</span><span class="p">])</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="o">.</span><span class="n">get_code</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">get_code</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">PREFIX_VALUE</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="o">.</span><span class="n">get_code</span><span class="p">()</span>
<span class="k">if</span> <span class="n">is_py3</span><span class="p">:</span>
<span class="n">get_code</span> <span class="o">=</span> <span class="n">get_code_py3</span>
<span class="k">def</span> <span class="nf">create_prefix</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="n">prefix_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;Type&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">Prefix</span><span class="p">,),</span> <span class="p">{</span><span class="s1">&#39;PREFIX_VALUE&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
@@ -139,6 +154,15 @@
<span class="n">x86_segment_selectors</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;CS&#39;</span><span class="p">:</span> <span class="n">CSPrefix</span><span class="p">,</span> <span class="s1">&#39;DS&#39;</span><span class="p">:</span> <span class="n">DSPrefix</span><span class="p">,</span> <span class="s1">&#39;ES&#39;</span><span class="p">:</span> <span class="n">ESPrefix</span><span class="p">,</span> <span class="s1">&#39;SS&#39;</span><span class="p">:</span> <span class="n">SSPrefix</span><span class="p">,</span>
<span class="s1">&#39;FS&#39;</span><span class="p">:</span> <span class="n">FSPrefix</span><span class="p">,</span> <span class="s1">&#39;GS&#39;</span><span class="p">:</span> <span class="n">GSPrefix</span><span class="p">}</span>
<span class="c1"># Man intel -&gt; Sreg (Vol 2.a 3-6)</span>
<span class="n">x86_segment_selectors_number</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;ES&quot;</span><span class="p">:</span> <span class="s2">&quot;000&quot;</span><span class="p">,</span>
<span class="s2">&quot;CS&quot;</span><span class="p">:</span> <span class="s2">&quot;001&quot;</span><span class="p">,</span>
<span class="s2">&quot;SS&quot;</span><span class="p">:</span> <span class="s2">&quot;010&quot;</span><span class="p">,</span>
<span class="s2">&quot;DS&quot;</span><span class="p">:</span> <span class="s2">&quot;011&quot;</span><span class="p">,</span>
<span class="s2">&quot;FS&quot;</span><span class="p">:</span> <span class="s2">&quot;100&quot;</span><span class="p">,</span>
<span class="s2">&quot;GS&quot;</span><span class="p">:</span> <span class="s2">&quot;101&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">class</span> <span class="nc">X86</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="nd">@staticmethod</span>
@@ -148,6 +172,13 @@
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="c1"># Not a string</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">is_seg_reg</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">name</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">in</span> <span class="n">x86_segment_selectors_number</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">reg_size</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">in</span> <span class="n">x86_regs</span><span class="p">:</span>
@@ -411,6 +442,9 @@
<span class="k">return</span> <span class="p">(</span><span class="n">sizess</span> <span class="o">+</span> <span class="n">sizeabs</span><span class="p">,</span> <span class="n">dataabs</span> <span class="o">+</span> <span class="n">datass</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">ModRM</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sub_modrm</span><span class="p">,</span> <span class="n">accept_reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">has_direction_bit</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">accept_reverse</span> <span class="o">=</span> <span class="n">accept_reverse</span>
@@ -443,6 +477,7 @@
<span class="k">def</span> <span class="nf">match</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
<span class="k">return</span> <span class="n">X86</span><span class="o">.</span><span class="n">is_reg</span><span class="p">(</span><span class="n">arg1</span><span class="p">)</span> <span class="ow">and</span> <span class="n">X86</span><span class="o">.</span><span class="n">is_reg</span><span class="p">(</span><span class="n">arg2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="nb">reversed</span><span class="p">,</span> <span class="n">instr_state</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mod</span> <span class="o">=</span> <span class="n">BitArray</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;11&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">X86</span><span class="o">.</span><span class="n">reg_size</span><span class="p">(</span><span class="n">arg1</span><span class="p">)</span> <span class="o">!=</span> <span class="n">X86</span><span class="o">.</span><span class="n">reg_size</span><span class="p">(</span><span class="n">arg2</span><span class="p">):</span>
@@ -454,6 +489,18 @@
<span class="bp">self</span><span class="o">.</span><span class="n">after</span> <span class="o">=</span> <span class="n">BitArray</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">class</span> <span class="nc">ModRM_REG__SEGREG</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">match</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
<span class="k">return</span> <span class="n">X86</span><span class="o">.</span><span class="n">is_reg</span><span class="p">(</span><span class="n">arg1</span><span class="p">)</span> <span class="ow">and</span> <span class="n">X86</span><span class="o">.</span><span class="n">is_seg_reg</span><span class="p">(</span><span class="n">arg2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="nb">reversed</span><span class="p">,</span> <span class="n">instr_state</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mod</span> <span class="o">=</span> <span class="n">BitArray</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;11&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rm</span> <span class="o">=</span> <span class="n">X86RegisterSelector</span><span class="o">.</span><span class="n">get_reg_bits</span><span class="p">(</span><span class="n">arg1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reg</span> <span class="o">=</span> <span class="n">BitArray</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">x86_segment_selectors_number</span><span class="p">[</span><span class="n">arg2</span><span class="o">.</span><span class="n">upper</span><span class="p">()])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">after</span> <span class="o">=</span> <span class="n">BitArray</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span> <span class="o">=</span> <span class="nb">reversed</span>
<span class="k">class</span> <span class="nc">ModRM_REG__MEM</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
@@ -615,6 +662,13 @@
<span class="n">prefix_opcode</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">PREFIX_VALUE</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="p">)</span>
<span class="k">return</span> <span class="n">prefix_opcode</span> <span class="o">+</span> <span class="nb">bytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">get_code_py3</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">prefix_opcode</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">bytes</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">PREFIX_VALUE</span><span class="p">])</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="p">)</span>
<span class="k">return</span> <span class="n">prefix_opcode</span> <span class="o">+</span> <span class="nb">bytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">dump</span><span class="p">())</span>
<span class="k">if</span> <span class="n">is_py3</span><span class="p">:</span>
<span class="n">get_code</span> <span class="o">=</span> <span class="n">get_code_py3</span>
<span class="c1">#def __add__(self, other):</span>
<span class="c1"># res = MultipleInstr()</span>
<span class="c1"># res += self</span>
@@ -622,7 +676,7 @@
<span class="c1"># return res</span>
<span class="k">def</span> <span class="nf">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">)):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">NotImplemented</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">MultipleInstr</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
@@ -759,7 +813,8 @@
<span class="k">class</span> <span class="nc">Mov</span><span class="p">(</span><span class="n">Instruction</span><span class="p">):</span>
<span class="n">encoding</span> <span class="o">=</span> <span class="p">[(</span><span class="n">RawBits</span><span class="o">.</span><span class="n">from_int</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">),</span> <span class="n">ModRM</span><span class="p">([</span><span class="n">ModRM_REG__REG</span><span class="p">,</span> <span class="n">ModRM_REG__MEM</span><span class="p">])),</span>
<span class="p">(</span><span class="n">RawBits</span><span class="o">.</span><span class="n">from_int</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mh">0xc7</span><span class="p">),</span> <span class="n">Slash</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">Imm32</span><span class="p">()),</span>
<span class="p">(</span><span class="n">RawBits</span><span class="o">.</span><span class="n">from_int</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mh">0xb8</span> <span class="o">&gt;&gt;</span> <span class="mi">3</span><span class="p">),</span> <span class="n">X86RegisterSelector</span><span class="p">(),</span> <span class="n">Imm32</span><span class="p">()),</span>
<span class="p">(</span><span class="n">RawBits</span><span class="o">.</span><span class="n">from_int</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mh">0xB8</span> <span class="o">&gt;&gt;</span> <span class="mi">3</span><span class="p">),</span> <span class="n">X86RegisterSelector</span><span class="p">(),</span> <span class="n">Imm32</span><span class="p">()),</span>
<span class="p">(</span><span class="n">RawBits</span><span class="o">.</span><span class="n">from_int</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mh">0x8C</span><span class="p">),</span> <span class="n">ModRM</span><span class="p">([</span><span class="n">ModRM_REG__SEGREG</span><span class="p">])),</span>
<span class="p">(</span><span class="n">RawBits</span><span class="o">.</span><span class="n">from_int</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mh">0x0f20</span><span class="p">),</span> <span class="n">ControlRegisterModRM</span><span class="p">(</span><span class="n">writecr</span><span class="o">=</span><span class="kc">False</span><span class="p">)),</span>
<span class="p">(</span><span class="n">RawBits</span><span class="o">.</span><span class="n">from_int</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mh">0x0f22</span><span class="p">),</span> <span class="n">ControlRegisterModRM</span><span class="p">(</span><span class="n">writecr</span><span class="o">=</span><span class="kc">True</span><span class="p">))]</span>
@@ -897,7 +952,8 @@
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">initial_args</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">initial_args</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;raw &#39;opcode&#39; only accept one argument&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">initial_args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;hex&quot;</span><span class="p">)</span>
<span class="c1"># Accept space</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="n">initial_args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">get_code</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span>
@@ -1058,10 +1114,16 @@
<span class="k">def</span> <span class="nf">__iadd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">MultipleInstr</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">merge_shellcode</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assemble</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_instruction</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">assemble</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code</span><span class="p">):</span>
<span class="k">for</span> <span class="n">instr</span> <span class="ow">in</span> <span class="n">assemble_instructions_generator</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_instruction</span><span class="p">(</span><span class="n">instr</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">split_in_instruction</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">str</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
@@ -1072,9 +1134,7 @@
<span class="k">continue</span>
<span class="k">yield</span> <span class="n">instr</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">assemble</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Play test&quot;&quot;&quot;</span>
<span class="n">shellcode</span> <span class="o">=</span> <span class="n">MultipleInstr</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">assemble_instructions_generator</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
<span class="k">for</span> <span class="n">instr</span> <span class="ow">in</span> <span class="n">split_in_instruction</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">instr</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="n">mnemo</span><span class="p">,</span> <span class="n">args_raw</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
@@ -1095,9 +1155,19 @@
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="n">shellcode</span> <span class="o">+=</span> <span class="n">instr_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">instr_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">assemble</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Play test&quot;&quot;&quot;</span>
<span class="n">shellcode</span> <span class="o">=</span> <span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">shellcode</span> <span class="o">+=</span> <span class="nb">str</span>
<span class="k">return</span> <span class="n">shellcode</span><span class="o">.</span><span class="n">get_code</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">shellcode</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
<span class="n">shellcode</span> <span class="o">=</span> <span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">shellcode</span> <span class="o">+=</span> <span class="nb">str</span>
<span class="k">return</span> <span class="n">shellcode</span>
<span class="c1"># IDA : import windows.native_exec.simple_x86 as x86</span>
<span class="c1"># IDA testing</span>
+20 -349
View File
@@ -85,345 +85,6 @@
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknow PE target machine &lt;0x</span><span class="si">{0:x}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">machine</span><span class="p">))</span>
<span class="c1"># def GetPEFile(baseaddr, target=None, force_bitness=None):</span>
<span class="c1"># &quot;&quot;&quot;Returns a :class:`PEFile` to explore a PE loaded at `baseaddr` in process `target`.</span>
<span class="c1">#</span>
<span class="c1"># :rtype: :class:`PEFile`</span>
<span class="c1">#</span>
<span class="c1"># .. note::</span>
<span class="c1">#</span>
<span class="c1"># If target is ``None`` it refers to the curent process</span>
<span class="c1"># &quot;&quot;&quot;</span>
<span class="c1"># proc_bitness = windows.current_process.bitness</span>
<span class="c1">#</span>
<span class="c1"># if force_bitness is None:</span>
<span class="c1"># targetedbitness = get_pe_bitness(baseaddr, target)</span>
<span class="c1"># else:</span>
<span class="c1"># targetedbitness = force_bitness</span>
<span class="c1">#</span>
<span class="c1"># transformers = get_structure_transformer_for_target(target, targetedbitness)</span>
<span class="c1"># ctypes_structure_transformer, create_structure_at = transformers</span>
<span class="c1">#</span>
<span class="c1"># if targetedbitness == 32:</span>
<span class="c1"># IMAGE_ORDINAL_FLAG = IMAGE_ORDINAL_FLAG32</span>
<span class="c1"># else:</span>
<span class="c1"># IMAGE_ORDINAL_FLAG = IMAGE_ORDINAL_FLAG64</span>
<span class="c1">#</span>
<span class="c1"># def get_string(addr):</span>
<span class="c1"># if target is None:</span>
<span class="c1"># return ctypes.c_char_p(addr).value</span>
<span class="c1"># return target.read_string(addr)</span>
<span class="c1">#</span>
<span class="c1"># class RVA(DWORD):</span>
<span class="c1"># @property</span>
<span class="c1"># def addr(self):</span>
<span class="c1"># return baseaddr + self.value</span>
<span class="c1">#</span>
<span class="c1"># def __repr__(self):</span>
<span class="c1"># return &quot;&lt;DWORD {0} (RVA to &#39;{1}&#39;)&gt;&quot;.format(self.value, hex(self.addr))</span>
<span class="c1">#</span>
<span class="c1"># class StringRVa(RVA):</span>
<span class="c1"># if target is None:</span>
<span class="c1"># @property</span>
<span class="c1"># def str(self):</span>
<span class="c1"># return get_string(self.addr).decode()</span>
<span class="c1"># else:</span>
<span class="c1"># @property</span>
<span class="c1"># def str(self):</span>
<span class="c1"># return get_string(self.addr).decode()</span>
<span class="c1">#</span>
<span class="c1"># def __repr__(self):</span>
<span class="c1"># return &quot;&lt;DWORD {0} (String RVA to &#39;{1}&#39;)&gt;&quot;.format(self.value, self.str)</span>
<span class="c1">#</span>
<span class="c1"># def __int__(self):</span>
<span class="c1"># return self.value</span>
<span class="c1">#</span>
<span class="c1"># class IMPORT_BY_NAME(ctypes.Structure):</span>
<span class="c1"># _fields_ = [</span>
<span class="c1"># (&quot;Hint&quot;, WORD),</span>
<span class="c1"># (&quot;Name&quot;, BYTE)</span>
<span class="c1"># ]</span>
<span class="c1">#</span>
<span class="c1"># class THUNK_DATA(ctypes.Union):</span>
<span class="c1"># _fields_ = [</span>
<span class="c1"># (&quot;Ordinal&quot;, PVOID),</span>
<span class="c1"># (&quot;AddressOfData&quot;, PVOID)</span>
<span class="c1"># ]</span>
<span class="c1">#</span>
<span class="c1"># class IATEntry(ctypes.Structure):</span>
<span class="c1"># &quot;&quot;&quot;Represent an entry in the IAT of a module</span>
<span class="c1"># Can be used to get resolved value and setup hook</span>
<span class="c1"># &quot;&quot;&quot;</span>
<span class="c1"># _fields_ = [</span>
<span class="c1"># (&quot;value&quot;, PVOID)]</span>
<span class="c1">#</span>
<span class="c1">#</span>
<span class="c1">#</span>
<span class="c1"># @classmethod</span>
<span class="c1"># def create(cls, addr, ord, name):</span>
<span class="c1"># self = create_structure_at(cls, addr)</span>
<span class="c1"># self.addr = addr</span>
<span class="c1"># self.ord = ord</span>
<span class="c1"># self.name = name</span>
<span class="c1"># self.hook = None</span>
<span class="c1"># self.nonhookvalue = self.value</span>
<span class="c1"># return self</span>
<span class="c1">#</span>
<span class="c1"># def __repr__(self):</span>
<span class="c1"># return &#39;&lt;{0} &quot;{1}&quot; ordinal {2}&gt;&#39;.format(self.__class__.__name__, self.name, self.ord)</span>
<span class="c1">#</span>
<span class="c1"># def set_hook(self, callback, types=None):</span>
<span class="c1"># &quot;&quot;&quot;Setup a hook on the entry and return it.</span>
<span class="c1"># You MUST keep a reference to the hook while the hook is enabled.</span>
<span class="c1">#</span>
<span class="c1"># :param callback: the hook</span>
<span class="c1">#</span>
<span class="c1"># .. note::</span>
<span class="c1">#</span>
<span class="c1"># see :ref:`hook_protocol`</span>
<span class="c1">#</span>
<span class="c1"># :rtype: :class:`windows.hooks.IATHook`</span>
<span class="c1">#</span>
<span class="c1"># .. warning::</span>
<span class="c1">#</span>
<span class="c1"># This works only for PEFile with the current process as target.</span>
<span class="c1"># &quot;&quot;&quot;</span>
<span class="c1"># if target is not None:</span>
<span class="c1"># raise NotImplementedError(&quot;Setting hook in remote process (use python code injection)&quot;)</span>
<span class="c1">#</span>
<span class="c1"># hook = hooks.IATHook(self, callback, types)</span>
<span class="c1"># self.hook = hook</span>
<span class="c1"># hook.enable()</span>
<span class="c1"># return hook</span>
<span class="c1">#</span>
<span class="c1"># def remove_hook(self):</span>
<span class="c1"># &quot;&quot;&quot;Remove the hook on the entry&quot;&quot;&quot;</span>
<span class="c1"># if self.hook is None:</span>
<span class="c1"># return False</span>
<span class="c1"># self.hook.disable()</span>
<span class="c1"># self.hook = None</span>
<span class="c1"># return True</span>
<span class="c1">#</span>
<span class="c1"># class PEFile(object):</span>
<span class="c1"># &quot;&quot;&quot;Represent a PE loaded in a process (current or remote)&quot;&quot;&quot;</span>
<span class="c1"># #def __del__(self):</span>
<span class="c1"># # print(&quot;YOLODEL&quot;)</span>
<span class="c1"># # import pprint</span>
<span class="c1"># # pprint.pprint(vars(self))</span>
<span class="c1">#</span>
<span class="c1"># def __init__(self):</span>
<span class="c1"># self.baseaddr = baseaddr</span>
<span class="c1"># self.bitness = targetedbitness</span>
<span class="c1">#</span>
<span class="c1"># def get_DOS_HEADER(self):</span>
<span class="c1"># return create_structure_at(IMAGE_DOS_HEADER, baseaddr)</span>
<span class="c1">#</span>
<span class="c1"># def get_NT_HEADER(self):</span>
<span class="c1"># return self.get_DOS_HEADER().get_NT_HEADER()</span>
<span class="c1">#</span>
<span class="c1"># def get_OptionalHeader(self):</span>
<span class="c1"># return self.get_NT_HEADER().OptionalHeader</span>
<span class="c1">#</span>
<span class="c1"># def get_DataDirectory(self):</span>
<span class="c1"># # This won&#39;t work if we load a PE32 in a 64bit process</span>
<span class="c1"># # PE32 .NET...</span>
<span class="c1"># #return self.get_OptionalHeader().DataDirectory</span>
<span class="c1"># DataDirectory_type = IMAGE_DATA_DIRECTORY * IMAGE_NUMBEROF_DIRECTORY_ENTRIES</span>
<span class="c1"># SizeOfOptionalHeader = self.get_NT_HEADER().FileHeader.SizeOfOptionalHeader</span>
<span class="c1"># if target is None:</span>
<span class="c1"># opt_header_addr = ctypes.addressof(self.get_NT_HEADER().OptionalHeader)</span>
<span class="c1"># else:</span>
<span class="c1"># opt_header_addr = self.get_NT_HEADER().OptionalHeader._base_addr</span>
<span class="c1"># DataDirectory_addr = opt_header_addr + SizeOfOptionalHeader - ctypes.sizeof(DataDirectory_type)</span>
<span class="c1"># return create_structure_at(DataDirectory_type, DataDirectory_addr)</span>
<span class="c1">#</span>
<span class="c1">#</span>
<span class="c1"># def get_IMPORT_DESCRIPTORS(self):</span>
<span class="c1"># import_datadir = self.get_DataDirectory()[IMAGE_DIRECTORY_ENTRY_IMPORT]</span>
<span class="c1"># if import_datadir.VirtualAddress == 0:</span>
<span class="c1"># return []</span>
<span class="c1"># import_descriptor_addr = RVA(import_datadir.VirtualAddress).addr</span>
<span class="c1"># current_import_descriptor = create_structure_at(self.IMAGE_IMPORT_DESCRIPTOR, import_descriptor_addr)</span>
<span class="c1"># res = []</span>
<span class="c1"># while current_import_descriptor.FirstThunk:</span>
<span class="c1"># res.append(current_import_descriptor)</span>
<span class="c1"># import_descriptor_addr += ctypes.sizeof(self.IMAGE_IMPORT_DESCRIPTOR)</span>
<span class="c1"># current_import_descriptor = create_structure_at(self.IMAGE_IMPORT_DESCRIPTOR, import_descriptor_addr)</span>
<span class="c1"># return res</span>
<span class="c1">#</span>
<span class="c1"># def get_EXPORT_DIRECTORY(self):</span>
<span class="c1"># export_directory_rva = self.get_DataDirectory()[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress</span>
<span class="c1"># if export_directory_rva == 0:</span>
<span class="c1"># return None</span>
<span class="c1"># export_directory_addr = baseaddr + export_directory_rva</span>
<span class="c1"># return create_structure_at(self._IMAGE_EXPORT_DIRECTORY, export_directory_addr)</span>
<span class="c1">#</span>
<span class="c1"># class PESection((IMAGE_SECTION_HEADER)):</span>
<span class="c1"># if target is None:</span>
<span class="c1"># @property</span>
<span class="c1"># def name(self):</span>
<span class="c1"># return get_string(ctypes.addressof(self.Name))[:8]</span>
<span class="c1"># else:</span>
<span class="c1"># @property</span>
<span class="c1"># def name(self):</span>
<span class="c1"># return get_string(self._base_addr)[:8]</span>
<span class="c1">#</span>
<span class="c1"># @property</span>
<span class="c1"># def start(self):</span>
<span class="c1"># return baseaddr + self.VirtualAddress</span>
<span class="c1">#</span>
<span class="c1"># @property</span>
<span class="c1"># def size(self):</span>
<span class="c1"># return self.VirtualSize</span>
<span class="c1">#</span>
<span class="c1"># def __repr__(self):</span>
<span class="c1"># return &quot;&lt;PESection \&quot;{0}\&quot;&gt;&quot;.format(self.name)</span>
<span class="c1">#</span>
<span class="c1"># @utils.fixedpropety</span>
<span class="c1"># def sections(self):</span>
<span class="c1"># nt_header = self.get_NT_HEADER()</span>
<span class="c1"># nb_section = nt_header.FileHeader.NumberOfSections</span>
<span class="c1"># SizeOfOptionalHeader = self.get_NT_HEADER().FileHeader.SizeOfOptionalHeader</span>
<span class="c1"># if target is None:</span>
<span class="c1"># opt_header_addr = ctypes.addressof(self.get_NT_HEADER().OptionalHeader)</span>
<span class="c1"># else:</span>
<span class="c1"># opt_header_addr = self.get_NT_HEADER().OptionalHeader._base_addr</span>
<span class="c1"># base_section = opt_header_addr + SizeOfOptionalHeader</span>
<span class="c1"># sections_array = create_structure_at((self.PESection * nb_section), base_section)</span>
<span class="c1"># return list(sections_array)</span>
<span class="c1">#</span>
<span class="c1"># @utils.fixedpropety</span>
<span class="c1"># def exports(self):</span>
<span class="c1"># &quot;&quot;&quot;The exports of the PE in a dict. Keys are ordinal (:class:`int`) and name (:class:`str`).</span>
<span class="c1"># The values are the addresses of the exports.</span>
<span class="c1">#</span>
<span class="c1"># :type: {(:class:`int` or :class:`str`) : :class:`int`}&quot;&quot;&quot;</span>
<span class="c1"># res = {}</span>
<span class="c1"># exp_dir = self.get_EXPORT_DIRECTORY()</span>
<span class="c1"># if exp_dir is None:</span>
<span class="c1"># return res</span>
<span class="c1"># raw_exports = exp_dir.get_exports()</span>
<span class="c1"># for id, rva_addr, rva_name in raw_exports:</span>
<span class="c1"># res[id] = rva_addr.addr</span>
<span class="c1"># if rva_name is not None:</span>
<span class="c1"># res[rva_name.str] = rva_addr.addr</span>
<span class="c1"># return res</span>
<span class="c1">#</span>
<span class="c1"># @utils.fixedpropety</span>
<span class="c1"># def export_name(self):</span>
<span class="c1"># &quot;&quot;&quot;The Name attribute of the ``EXPORT_DIRECTORY``&quot;&quot;&quot;</span>
<span class="c1"># try:</span>
<span class="c1"># return self.get_EXPORT_DIRECTORY().Name.str</span>
<span class="c1"># except AttributeError:</span>
<span class="c1"># return None</span>
<span class="c1">#</span>
<span class="c1"># # TODO: get imports by parsing other modules exports if no INT</span>
<span class="c1"># @utils.fixedpropety</span>
<span class="c1"># def imports(self):</span>
<span class="c1"># &quot;&quot;&quot;The imports of the PE in a dict.</span>
<span class="c1"># Keys are the names of DLL to import from and values are :class:`list`</span>
<span class="c1"># of :class:`IATEntry`</span>
<span class="c1">#</span>
<span class="c1"># :type: {:class:`str` : [:class:`IATEntry`]}&quot;&quot;&quot;</span>
<span class="c1"># res = {}</span>
<span class="c1"># for import_descriptor in self.get_IMPORT_DESCRIPTORS():</span>
<span class="c1"># INT = import_descriptor.get_INT()</span>
<span class="c1"># IAT = import_descriptor.get_IAT()</span>
<span class="c1"># if INT is not None:</span>
<span class="c1"># for iat_entry, (ord, name) in zip(IAT, INT):</span>
<span class="c1"># # str(name.decode()) -&gt; python2 and python3 compatible for str result</span>
<span class="c1"># iat_entry.ord = ord</span>
<span class="c1"># iat_entry.name = str(name.decode()) if name else &quot;&quot;</span>
<span class="c1"># res.setdefault(import_descriptor.Name.str.lower(), []).extend(IAT)</span>
<span class="c1"># return res</span>
<span class="c1">#</span>
<span class="c1"># # Will be usable as `self.IMAGE_IMPORT_DESCRIPTOR`</span>
<span class="c1"># class IMAGE_IMPORT_DESCRIPTOR(ctypes.Structure):</span>
<span class="c1"># _fields_ = transform_ctypes_fields(IMAGE_IMPORT_DESCRIPTOR, {&quot;Name&quot;: StringRVa, &quot;OriginalFirstThunk&quot;: RVA, &quot;FirstThunk&quot;: RVA})</span>
<span class="c1">#</span>
<span class="c1"># def get_INT(self):</span>
<span class="c1"># if not self.OriginalFirstThunk.value:</span>
<span class="c1"># return None</span>
<span class="c1"># int_addr = self.OriginalFirstThunk.addr</span>
<span class="c1"># int_entry = create_structure_at(THUNK_DATA, int_addr)</span>
<span class="c1"># res = []</span>
<span class="c1"># while int_entry.Ordinal:</span>
<span class="c1"># if int_entry.Ordinal &amp; IMAGE_ORDINAL_FLAG:</span>
<span class="c1"># res += [(int_entry.Ordinal &amp; 0x7fffffff, None)]</span>
<span class="c1"># else:</span>
<span class="c1"># import_by_name = create_structure_at(IMPORT_BY_NAME, baseaddr + int_entry.AddressOfData)</span>
<span class="c1"># name_address = baseaddr + int_entry.AddressOfData + type(import_by_name).Name.offset</span>
<span class="c1"># if target is None:</span>
<span class="c1"># name = get_string(name_address)</span>
<span class="c1"># else:</span>
<span class="c1"># name = get_string(name_address).decode()</span>
<span class="c1"># res.append((import_by_name.Hint, name))</span>
<span class="c1"># int_addr += ctypes.sizeof(type(int_entry))</span>
<span class="c1"># int_entry = create_structure_at(THUNK_DATA, int_addr)</span>
<span class="c1"># return res</span>
<span class="c1">#</span>
<span class="c1"># def get_IAT(self):</span>
<span class="c1"># iat_addr = self.FirstThunk.addr</span>
<span class="c1"># iat_entry = create_structure_at(THUNK_DATA, iat_addr)</span>
<span class="c1"># res = []</span>
<span class="c1"># while iat_entry.Ordinal:</span>
<span class="c1"># res.append(IATEntry.create(iat_addr, -1, &quot;??&quot;))</span>
<span class="c1"># iat_addr += ctypes.sizeof(type(iat_entry))</span>
<span class="c1"># iat_entry = create_structure_at(THUNK_DATA, iat_addr)</span>
<span class="c1"># return res</span>
<span class="c1">#</span>
<span class="c1"># # Will be usable as `self._IMAGE_EXPORT_DIRECTORY`</span>
<span class="c1"># class _IMAGE_EXPORT_DIRECTORY(ctypes.Structure):</span>
<span class="c1"># _fields_ = transform_ctypes_fields(IMAGE_EXPORT_DIRECTORY, {&quot;Name&quot;: StringRVa, &quot;AddressOfFunctions&quot;: RVA, &quot;AddressOfNames&quot;: RVA, &quot;AddressOfNameOrdinals&quot;: RVA})</span>
<span class="c1">#</span>
<span class="c1"># def get_exports(self):</span>
<span class="c1"># NameOrdinals = create_structure_at((WORD * self.NumberOfNames), self.AddressOfNameOrdinals.addr)</span>
<span class="c1"># NameOrdinals = list(NameOrdinals)</span>
<span class="c1"># Functions = create_structure_at((RVA * self.NumberOfFunctions), self.AddressOfFunctions.addr)</span>
<span class="c1"># Names = create_structure_at((StringRVa * self.NumberOfNames), self.AddressOfNames.addr)</span>
<span class="c1"># res = []</span>
<span class="c1"># for nb, func in enumerate(Functions):</span>
<span class="c1"># if nb in NameOrdinals:</span>
<span class="c1"># name = Names[NameOrdinals.index(nb)]</span>
<span class="c1"># else:</span>
<span class="c1"># name = None</span>
<span class="c1"># res.append((nb, func, name))</span>
<span class="c1"># return res</span>
<span class="c1">#</span>
<span class="c1"># current_pe = PEFile()</span>
<span class="c1">#</span>
<span class="c1"># class IMAGE_DOS_HEADER(ctypes.Structure):</span>
<span class="c1"># _fields_ = [</span>
<span class="c1"># (&quot;e_magic&quot;, CHAR * 2),</span>
<span class="c1"># (&quot;e_cblp&quot;, WORD),</span>
<span class="c1"># (&quot;e_cp&quot;, WORD),</span>
<span class="c1"># (&quot;e_crlc&quot;, WORD),</span>
<span class="c1"># (&quot;e_cparhdr&quot;, WORD),</span>
<span class="c1"># (&quot;e_minalloc&quot;, WORD),</span>
<span class="c1"># (&quot;e_maxalloc&quot;, WORD),</span>
<span class="c1"># (&quot;e_ss&quot;, WORD),</span>
<span class="c1"># (&quot;e_sp&quot;, WORD),</span>
<span class="c1"># (&quot;e_csum&quot;, WORD),</span>
<span class="c1"># (&quot;e_ip&quot;, WORD),</span>
<span class="c1"># (&quot;e_cs&quot;, WORD),</span>
<span class="c1"># (&quot;e_lfarlc&quot;, WORD),</span>
<span class="c1"># (&quot;e_ovno&quot;, WORD),</span>
<span class="c1"># (&quot;e_res&quot;, WORD * 4),</span>
<span class="c1"># (&quot;e_oemid&quot;, WORD),</span>
<span class="c1"># (&quot;e_oeminfo&quot;, WORD),</span>
<span class="c1"># (&quot;e_res2&quot;, WORD * 10),</span>
<span class="c1"># (&quot;e_lfanew&quot;, DWORD),</span>
<span class="c1"># ]</span>
<span class="c1">#</span>
<span class="c1"># def get_NT_HEADER(self):</span>
<span class="c1"># if targetedbitness == 32:</span>
<span class="c1"># return create_structure_at(IMAGE_NT_HEADERS32, baseaddr + self.e_lfanew)</span>
<span class="c1"># return create_structure_at(IMAGE_NT_HEADERS64, baseaddr + self.e_lfanew)</span>
<span class="c1"># return current_pe</span>
<span class="c1">## == PEPARSE V2 ==</span>
@@ -467,7 +128,7 @@
<span class="k">def</span> <span class="nf">get_string</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_char_p</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="k">return</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_char_p</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;latin1&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">target</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
@@ -476,8 +137,11 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Name</span><span class="p">))[:</span><span class="mi">8</span><span class="p">]</span>
<span class="k">return</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_base_addr</span><span class="p">)[:</span><span class="mi">8</span><span class="p">]</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Name</span><span class="p">))[:</span><span class="mi">8</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_base_addr</span><span class="p">)[:</span><span class="mi">8</span><span class="p">]</span>
<span class="c1"># Decode as UTF-8 as the MS doc say ?</span>
<span class="k">return</span> <span class="n">name</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -590,7 +254,7 @@
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="n">name_address</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="n">name_address</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="n">name_address</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">import_by_name</span><span class="o">.</span><span class="n">Hint</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
<span class="n">int_addr</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="nb">type</span><span class="p">(</span><span class="n">int_entry</span><span class="p">))</span>
<span class="n">int_entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transformers</span><span class="o">.</span><span class="n">create_structure_at</span><span class="p">(</span><span class="n">THUNK_DATA</span><span class="p">,</span> <span class="n">int_addr</span><span class="p">)</span>
@@ -626,6 +290,9 @@
<span class="n">func</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">baseaddr</span>
<span class="k">if</span> <span class="n">nb</span> <span class="ow">in</span> <span class="n">NameOrdinals</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="n">Names</span><span class="p">[</span><span class="n">NameOrdinals</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">nb</span><span class="p">)]</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">baseaddr</span><span class="p">)</span>
<span class="c1"># Export name should be ascii</span>
<span class="c1"># Decode from ascii or return bytes ?</span>
<span class="c1"># https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#export-address-table</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">nb</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
@@ -677,11 +344,6 @@
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">IMAGE_ORDINAL_FLAG</span> <span class="o">=</span> <span class="n">IMAGE_ORDINAL_FLAG64</span>
<span class="k">def</span> <span class="nf">get_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_char_p</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_DOS_HEADER</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">transformers</span><span class="o">.</span><span class="n">create_structure_at</span><span class="p">(</span><span class="n">IMAGE_DOS_HEADER</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">baseaddr</span><span class="p">)</span>
@@ -752,10 +414,19 @@
<span class="sd"> :type: {(:class:`int` or :class:`str`) : :class:`int`}&quot;&quot;&quot;</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">exp_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_EXPORT_DIRECTORY</span><span class="p">()</span>
<span class="n">export_datadir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_DataDirectory</span><span class="p">()[</span><span class="n">IMAGE_DIRECTORY_ENTRY_EXPORT</span><span class="p">]</span>
<span class="n">export_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">baseaddr</span> <span class="o">+</span> <span class="n">export_datadir</span><span class="o">.</span><span class="n">VirtualAddress</span>
<span class="n">export_end</span> <span class="o">=</span> <span class="n">export_start</span> <span class="o">+</span> <span class="n">export_datadir</span><span class="o">.</span><span class="n">Size</span>
<span class="k">if</span> <span class="n">exp_dir</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">res</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="n">raw_exports</span> <span class="o">=</span> <span class="n">exp_dir</span><span class="o">.</span><span class="n">get_exports</span><span class="p">()</span>
<span class="k">for</span> <span class="nb">id</span><span class="p">,</span> <span class="n">rva_addr</span><span class="p">,</span> <span class="n">rva_name</span> <span class="ow">in</span> <span class="n">raw_exports</span><span class="p">:</span>
<span class="k">if</span> <span class="n">export_start</span> <span class="o">&lt;=</span> <span class="n">rva_addr</span> <span class="o">&lt;</span> <span class="n">export_end</span><span class="p">:</span>
<span class="c1"># Export proxy...</span>
<span class="c1"># Contains the string to another Dll.Function</span>
<span class="n">rva_addr</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="n">rva_addr</span><span class="p">)</span> <span class="c1"># Put the string proxy instead</span>
<span class="n">res</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span> <span class="o">=</span> <span class="n">rva_addr</span>
<span class="k">if</span> <span class="n">rva_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">res</span><span class="p">[</span><span class="n">rva_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">rva_addr</span>
@@ -787,7 +458,7 @@
<span class="k">for</span> <span class="n">iat_entry</span><span class="p">,</span> <span class="p">(</span><span class="nb">ord</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">IAT</span><span class="p">,</span> <span class="n">INT</span><span class="p">):</span>
<span class="c1"># str(name.decode()) -&gt; python2 and python3 compatible for str result</span>
<span class="n">iat_entry</span><span class="o">.</span><span class="n">ord</span> <span class="o">=</span> <span class="nb">ord</span>
<span class="n">iat_entry</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span> <span class="k">if</span> <span class="n">name</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">iat_entry</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">if</span> <span class="n">name</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">get_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">baseaddr</span> <span class="o">+</span> <span class="n">import_descriptor</span><span class="o">.</span><span class="n">Name</span><span class="p">)</span>
<span class="n">res</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="p">[])</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">IAT</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span></div>
+35 -6
View File
@@ -40,16 +40,24 @@
<span></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">import</span> <span class="nn">windows.generated_def</span> <span class="k">as</span> <span class="nn">gdef</span>
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">_multiprocessing</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">is_py3</span>
<span class="k">if</span> <span class="n">is_py3</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">multiprocessing.connection</span> <span class="k">import</span> <span class="n">PipeConnection</span> <span class="k">as</span> <span class="n">native_PipeConnection</span>
<span class="k">else</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">_multiprocessing</span> <span class="k">import</span> <span class="n">PipeConnection</span> <span class="k">as</span> <span class="n">native_PipeConnection</span>
<span class="c1"># Inspired from &#39;multiprocessing\connection.py&#39;</span>
<div class="viewcode-block" id="full_pipe_address"><a class="viewcode-back" href="../../pipe.html#windows.pipe.full_pipe_address">[docs]</a><span class="k">def</span> <span class="nf">full_pipe_address</span><span class="p">(</span><span class="n">addr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the full address of the pipe `addr`&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">addr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\\\</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">addr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\\\\</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="n">addr</span>
<span class="k">return</span> <span class="sa">r</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">.\pipe\</span><span class="si">{addr}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">addr</span><span class="o">=</span><span class="n">addr</span><span class="p">)</span></div>
<span class="k">return</span> <span class="sa">br</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">.\pipe&quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span> <span class="o">+</span> <span class="n">addr</span></div>
<div class="viewcode-block" id="PipeConnection"><a class="viewcode-back" href="../../pipe.html#windows.pipe.PipeConnection">[docs]</a><span class="k">class</span> <span class="nc">PipeConnection</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># Cannot inherit: crash the interpreter</span>
<span class="sd">&quot;&quot;&quot;A wrapper arround :class:`_multiprocessing.PipeConnection` able to work as a ContextManager&quot;&quot;&quot;</span>
@@ -64,22 +72,33 @@
<div class="viewcode-block" id="PipeConnection.from_handle"><a class="viewcode-back" href="../../pipe.html#windows.pipe.PipeConnection.from_handle">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_handle</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">phandle</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="sd">&quot;&quot;&quot;Create a :class:`PipeConnection` from pipe handle `phandle`&quot;&quot;&quot;</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">_multiprocessing</span><span class="o">.</span><span class="n">PipeConnection</span><span class="p">(</span><span class="n">phandle</span><span class="p">)</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">native_PipeConnection</span><span class="p">(</span><span class="n">phandle</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">connection</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></div>
<div class="viewcode-block" id="PipeConnection.create"><a class="viewcode-back" href="../../pipe.html#windows.pipe.PipeConnection.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">security_descriptor</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create a namedpipe pipe ``addr``</span>
<span class="sd"> :returns type: :class:`PipeConnection`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">full_pipe_address</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
<span class="n">security_attributes</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">security_descriptor</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">security_descriptor</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">security_descriptor</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">security_descriptor</span><span class="p">)</span>
<span class="n">security_attributes</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SECURITY_ATTRIBUTES</span><span class="p">()</span>
<span class="n">security_attributes</span><span class="o">.</span><span class="n">nLength</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">security_attributes</span><span class="p">)</span>
<span class="n">security_attributes</span><span class="o">.</span><span class="n">lpSecurityDescriptor</span> <span class="o">=</span> <span class="n">security_descriptor</span> <span class="c1"># Accept as arg ?</span>
<span class="n">security_attributes</span><span class="o">.</span><span class="n">bInheritHandle</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Accept as arg ?</span>
<span class="n">pipehandle</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CreateNamedPipeA</span><span class="p">(</span>
<span class="n">addr</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PIPE_ACCESS_DUPLEX</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PIPE_TYPE_MESSAGE</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PIPE_READMODE_MESSAGE</span> <span class="o">|</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PIPE_WAIT</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PIPE_UNLIMITED_INSTANCES</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">BUFFER_SIZE</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">BUFFER_SIZE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">NMPWAIT_WAIT_FOREVER</span><span class="p">,</span> <span class="kc">None</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">NMPWAIT_WAIT_FOREVER</span><span class="p">,</span> <span class="n">security_attributes</span>
<span class="p">)</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">from_handle</span><span class="p">(</span><span class="n">pipehandle</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">addr</span><span class="p">,</span> <span class="n">server</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
@@ -106,6 +125,16 @@
<span class="sd">&quot;&quot;&quot;Wait for a client process to connect to the named pipe&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">ConnectNamedPipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">get_security_descriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_handle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_security_descriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sd</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">sd</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="n">sd</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">sd</span><span class="p">)</span>
<span class="n">sd</span><span class="o">.</span><span class="n">_apply_to_handle_and_type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="n">security_descriptor</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_security_descriptor</span><span class="p">,</span> <span class="n">set_security_descriptor</span><span class="p">)</span>
<div class="viewcode-block" id="PipeConnection.close"><a class="viewcode-back" href="../../pipe.html#windows.pipe.PipeConnection.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Close the handle of the pipe&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+28 -5
View File
@@ -46,6 +46,14 @@
<span class="kn">import</span> <span class="nn">itertools</span>
<span class="kn">from</span> <span class="nn">_ctypes</span> <span class="k">import</span> <span class="n">_SimpleCData</span>
<span class="c1"># No PFW deps in this file</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="n">is_py3</span> <span class="o">=</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_py3</span><span class="p">:</span>
<span class="n">int_types</span> <span class="o">=</span> <span class="nb">int</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">int_types</span> <span class="o">=</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">)</span>
<span class="c1"># ## Utils ### #</span>
<span class="k">def</span> <span class="nf">is_pointer</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
@@ -136,11 +144,11 @@
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">base</span> <span class="o">+</span> <span class="p">(</span><span class="n">i</span> <span class="o">*</span> <span class="mh">0x100</span><span class="p">),</span> <span class="mh">0x100</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">x</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">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">x</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">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">break</span>
<span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">RemoteWCharP</span><span class="p">(</span><span class="n">RemotePtr</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_char_p</span><span class="p">):</span>
@@ -207,7 +215,7 @@
<span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">slice</span><span class="p">):</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">slice</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">)):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">slice</span><span class="p">,</span> <span class="n">int_types</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;RemoteArray slice __getitem__&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">slice</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">IndexError</span><span class="p">(</span><span class="s2">&quot;Access to </span><span class="si">{0}</span><span class="s2"> for a RemoteArray of size </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">slice</span><span class="p">,</span> <span class="nb">len</span><span class="p">))</span>
@@ -332,6 +340,21 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">contents</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># What if we have a non-struct pointer</span>
<span class="c1"># Like a Ptr(DWORD) we would like to get the underlying value</span>
<span class="n">realtype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">real_pointer_type</span><span class="o">.</span><span class="n">_sub_ctypes_</span>
<span class="c1"># if _SimpleCData in realtype.__bases__:</span>
<span class="c1"># A ctypes original value.</span>
<span class="c1"># Returnthe real pointed value</span>
<span class="c1"># Kind of a tricks for now compared to the real ctypes behavior</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="c1"># if not self.value:</span>
<span class="c1"># return None</span>
<span class="c1"># targetptr = self.target.read_ptr(self.value)</span>
<span class="c1"># if not targetptr:</span>
<span class="c1"># return None</span>
<span class="c1"># ss = self.target.read_memory(targetptr, ctypes.sizeof(realtype))</span>
<span class="c1"># return realtype.from_buffer(bytearray(ss)).value</span>
<span class="n">remote_pointed_type</span> <span class="o">=</span> <span class="n">transform_type_to_remote32bits</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">real_pointer_type</span><span class="o">.</span><span class="n">_sub_ctypes_</span><span class="p">)</span>
<span class="k">return</span> <span class="n">remote_pointed_type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">raw_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">)</span>
@@ -393,7 +416,7 @@
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">ftype</span><span class="p">,</span> <span class="n">_ctypes</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span> <span class="c1"># Arrays</span>
<span class="c1"># if this is a string: just cast the read value to string</span>
<span class="k">if</span> <span class="n">ftype</span><span class="o">.</span><span class="n">_type_</span> <span class="o">==</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_char</span><span class="p">:</span> <span class="c1"># Use issubclass instead ?</span>
<span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">ftype</span><span class="o">.</span><span class="n">_type_</span> <span class="o">==</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_wchar</span><span class="p">:</span> <span class="c1"># Use issubclass instead ?</span>
<span class="c1"># Decode from utf16 -&gt; size /=2 | put it in a wchar array | split at the first &quot;\x00&quot;</span>
<span class="k">return</span> <span class="p">(</span><span class="n">ftype</span><span class="o">.</span><span class="n">_type_</span> <span class="o">*</span> <span class="p">(</span><span class="n">fsize</span> <span class="o">/</span> <span class="mi">2</span><span class="p">))</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf16&#39;</span><span class="p">))[:]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># Sorry..</span>
+44 -12
View File
@@ -44,6 +44,9 @@
<span class="kn">import</span> <span class="nn">windows.com</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="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="n">buffer</span> <span class="o">=</span> <span class="nb">bytes</span>
<span class="n">KNOW_REQUEST_TYPE</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">RPC_REQUEST_TYPE_CALL</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">RPC_REQUEST_TYPE_BIND</span><span class="p">)</span>
<span class="n">KNOW_RESPONSE_TYPE</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">RPC_RESPONSE_TYPE_FAIL</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">RPC_RESPONSE_TYPE_SUCCESS</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">RPC_RESPONSE_TYPE_BIND_OK</span><span class="p">)</span>
@@ -93,10 +96,7 @@
<span class="p">(</span><span class="s2">&quot;UNK5&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;UNK6&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;UNK7&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;UNK8&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;UNK9&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;UNK10&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;UNK11&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;ORPC_IPID&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">GUID</span><span class="p">)</span>
<span class="p">]</span>
<div class="viewcode-block" id="RPCClient"><a class="viewcode-back" href="../../../rpc.html#windows.rpc.RPCClient">[docs]</a><span class="k">class</span> <span class="nc">RPCClient</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
@@ -125,7 +125,20 @@
<span class="c1">#TODO: attach version information to IID</span>
<span class="k">return</span> <span class="n">IID</span></div>
<div class="viewcode-block" id="RPCClient.call"><a class="viewcode-back" href="../../../rpc.html#windows.rpc.RPCClient.call">[docs]</a> <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">IID</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
<div class="viewcode-block" id="RPCClient.forge_alpc_request"><a class="viewcode-back" href="../../../rpc.html#windows.rpc.RPCClient.forge_alpc_request">[docs]</a> <span class="k">def</span> <span class="nf">forge_alpc_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">IID</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">ipid</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Craft an ALPC message containing an RPC request to call ``method_offset`` of interface ``IID`</span>
<span class="sd"> with ``params``.</span>
<span class="sd"> Can be used to craft request without directly sending it</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">iid_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">buffer</span><span class="p">(</span><span class="n">IID</span><span class="p">)[:])</span>
<span class="n">interface_nb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">if_bind_number</span><span class="p">[</span><span class="n">iid_hash</span><span class="p">]</span> <span class="c1"># TODO: add __hash__ to IID</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mh">0x900</span><span class="p">:</span> <span class="c1"># 0x1000 - size of meta-data</span>
<span class="n">request</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_forge_call_request_in_view</span><span class="p">(</span><span class="n">interface_nb</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">ipid</span><span class="o">=</span><span class="n">ipid</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">request</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_forge_call_request</span><span class="p">(</span><span class="n">interface_nb</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">ipid</span><span class="o">=</span><span class="n">ipid</span><span class="p">)</span>
<span class="k">return</span> <span class="n">request</span></div>
<div class="viewcode-block" id="RPCClient.call"><a class="viewcode-back" href="../../../rpc.html#windows.rpc.RPCClient.call">[docs]</a> <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">IID</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">ipid</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Call method number ``method_offset`` of interface ``IID`` with mashalled ``params``</span>
<span class="sd"> :param IID IID: An IID previously returned by :func:`bind`</span>
@@ -133,15 +146,14 @@
<span class="sd"> :param str params: The mashalled parameters (NDR32)</span>
<span class="sd"> :returns: :class:`str`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">iid_hash</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="n">buffer</span><span class="p">(</span><span class="n">IID</span><span class="p">)[:])</span>
<span class="n">interface_nb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">if_bind_number</span><span class="p">[</span><span class="n">iid_hash</span><span class="p">]</span> <span class="c1"># TODO: add __hash__ to IID</span>
<span class="n">request</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_forge_call_request</span><span class="p">(</span><span class="n">interface_nb</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
<span class="n">request</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">forge_alpc_request</span><span class="p">(</span><span class="n">IID</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">ipid</span><span class="o">=</span><span class="n">ipid</span><span class="p">)</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_request</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="c1"># Parse reponse</span>
<span class="n">request_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_request_type</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
<span class="k">if</span> <span class="n">request_type</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">RPC_RESPONSE_TYPE_SUCCESS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unexpected reponse type. Expected RESPONSE_SUCCESS got </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">KNOW_RESPONSE_TYPE</span><span class="p">[</span><span class="n">request_type</span><span class="p">]))</span>
<span class="c1"># windows.utils.sprint(ALPC_RPC_CALL.from_buffer_copy(response + &quot;\x00&quot; * 12))</span>
<span class="n">data</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">&quot;&lt;6I&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">[:</span><span class="mi">6</span> <span class="o">*</span> <span class="mi">4</span><span class="p">])</span>
<span class="k">assert</span> <span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">REQUEST_IDENTIFIER</span>
<span class="k">return</span> <span class="n">response</span><span class="p">[</span><span class="mi">4</span> <span class="o">*</span> <span class="mi">6</span><span class="p">:]</span> <span class="c1"># Should be the return value (not completly verified)</span></div>
@@ -150,7 +162,7 @@
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">alpc_client</span><span class="o">.</span><span class="n">send_receive</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">data</span>
<span class="k">def</span> <span class="nf">_forge_call_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface_nb</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_forge_call_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface_nb</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">ipid</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># TODO: differents REQUEST_IDENTIFIER for each req ?</span>
<span class="c1"># TODO: what is this &#39;0&#39; ? (1 is also accepted) (flags ?)</span>
<span class="c1"># request = struct.pack(&quot;&lt;16I&quot;, gdef.RPC_REQUEST_TYPE_CALL, NOT_USED, 1, self.REQUEST_IDENTIFIER, interface_nb, method_offset, *[NOT_USED] * 10)</span>
@@ -160,19 +172,39 @@
<span class="n">req</span><span class="o">.</span><span class="n">request_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">REQUEST_IDENTIFIER</span>
<span class="n">req</span><span class="o">.</span><span class="n">if_nb</span> <span class="o">=</span> <span class="n">interface_nb</span>
<span class="n">req</span><span class="o">.</span><span class="n">method_offset</span> <span class="o">=</span> <span class="n">method_offset</span>
<span class="k">if</span> <span class="n">ipid</span><span class="p">:</span>
<span class="n">req</span><span class="o">.</span><span class="n">ORPC_IPID</span> <span class="o">=</span> <span class="n">ipid</span>
<span class="n">this</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ORPCTHIS</span><span class="p">()</span>
<span class="n">this</span><span class="o">.</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">7</span><span class="p">)</span>
<span class="n">this</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">lthis</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LOCALTHIS</span><span class="p">()</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">(</span><span class="n">req</span><span class="p">)[:]</span> <span class="o">+</span> <span class="n">buffer</span><span class="p">(</span><span class="n">this</span><span class="p">)[:]</span> <span class="o">+</span> <span class="n">buffer</span><span class="p">(</span><span class="n">lthis</span><span class="p">)[:]</span> <span class="o">+</span> <span class="n">params</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">(</span><span class="n">req</span><span class="p">)[:]</span> <span class="o">+</span> <span class="n">params</span>
<span class="k">def</span> <span class="nf">_forge_call_request_in_view</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface_nb</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">ipid</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="c1"># Version crade qui clean rien pour POC. GROS DOUTES :D</span>
<span class="n">raw_request</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_forge_call_request</span><span class="p">(</span><span class="n">interface_nb</span><span class="p">,</span> <span class="n">method_offset</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcMessage</span><span class="p">(</span><span class="mh">0x2000</span><span class="p">)</span>
<span class="n">section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">alpc_client</span><span class="o">.</span><span class="n">create_port_section</span><span class="p">(</span><span class="mh">0x40000</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">))</span>
<span class="n">view</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">alpc_client</span><span class="o">.</span><span class="n">map_section</span><span class="p">(</span><span class="n">section</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">))</span>
<span class="n">p</span><span class="o">.</span><span class="n">port_message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">raw_request</span> <span class="o">+</span> <span class="n">windows</span><span class="o">.</span><span class="n">rpc</span><span class="o">.</span><span class="n">ndr</span><span class="o">.</span><span class="n">NdrLong</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> <span class="o">+</span> <span class="mh">0x200</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span> <span class="o">*</span> <span class="mi">40</span>
<span class="n">p</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">ValidAttributes</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ALPC_MESSAGE_VIEW_ATTRIBUTE</span>
<span class="n">p</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">Flags</span> <span class="o">=</span> <span class="mh">0x40000</span>
<span class="n">p</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">ViewBase</span> <span class="o">=</span> <span class="n">view</span><span class="o">.</span><span class="n">ViewBase</span>
<span class="n">p</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">SectionHandle</span> <span class="o">=</span> <span class="n">view</span><span class="o">.</span><span class="n">SectionHandle</span>
<span class="n">p</span><span class="o">.</span><span class="n">view_attribute</span><span class="o">.</span><span class="n">ViewSize</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">view</span><span class="o">.</span><span class="n">ViewBase</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span> <span class="c1"># Write NDR to view</span>
<span class="k">return</span> <span class="n">p</span>
<span class="k">def</span> <span class="nf">_forge_bind_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">uuid</span><span class="p">,</span> <span class="n">syntaxversion</span><span class="p">,</span> <span class="n">requested_if_nb</span><span class="p">):</span>
<span class="n">version_major</span><span class="p">,</span> <span class="n">version_minor</span> <span class="o">=</span> <span class="n">syntaxversion</span>
<span class="n">req</span> <span class="o">=</span> <span class="n">ALPC_RPC_BIND</span><span class="p">()</span>
<span class="n">req</span><span class="o">.</span><span class="n">request_type</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">RPC_REQUEST_TYPE_BIND</span>
<span class="n">req</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">RPC_IF_ID</span><span class="p">(</span><span class="n">uuid</span><span class="p">,</span> <span class="o">*</span><span class="n">syntaxversion</span><span class="p">)</span>
<span class="n">req</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BIND_IF_SYNTAX_NDR32</span>
<span class="c1"># req.flags = gdef.BIND_IF_SYNTAX_NDR64</span>
<span class="n">req</span><span class="o">.</span><span class="n">if_nb_ndr32</span> <span class="o">=</span> <span class="n">requested_if_nb</span>
<span class="n">req</span><span class="o">.</span><span class="n">if_nb_ndr64</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">req</span><span class="o">.</span><span class="n">if_nb_ndr64</span> <span class="o">=</span> <span class="n">requested_if_nb</span>
<span class="n">req</span><span class="o">.</span><span class="n">if_nb_unkn</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">req</span><span class="o">.</span><span class="n">register_multiple_syntax</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">req</span><span class="o">.</span><span class="n">some_context_id</span> <span class="o">=</span> <span class="mh">0xB00B00B</span>
+9 -8
View File
@@ -44,6 +44,7 @@
<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.rpc</span> <span class="k">import</span> <span class="n">ndr</span>
<span class="kn">from</span> <span class="nn">windows.dbgprint</span> <span class="k">import</span> <span class="n">dbgprint</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">basestring</span>
@@ -126,13 +127,13 @@
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">rhs</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">0</span><span class="p">):</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span><span class="p">[:</span><span class="n">rhs</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)]</span>
<span class="c1"># raise ValueError(&quot;ALPC Port name doest not end by \\x00&quot;)</span>
<span class="k">return</span> <span class="n">UnpackTower</span><span class="p">(</span><span class="s2">&quot;ncalrpc&quot;</span><span class="p">,</span> <span class="n">rhs</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">object</span><span class="p">,</span> <span class="n">syntax</span><span class="p">)</span>
<span class="k">return</span> <span class="n">UnpackTower</span><span class="p">(</span><span class="s2">&quot;ncalrpc&quot;</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">rhs</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]),</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">object</span><span class="p">,</span> <span class="n">syntax</span><span class="p">)</span>
<span class="c1"># http://pubs.opengroup.org/onlinepubs/9629399/apdxi.htm#tagcjh_28</span>
<span class="c1"># Octet 0 contains the hexadecimal value 0d. This is a reserved protocol identifier prefix that indicates that the protocol ID is UUID derived</span>
<span class="n">TOWER_PROTOCOL_IS_UUID</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\x0d</span><span class="s2">&quot;</span>
<span class="n">TOWER_EMPTY_RHS</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\x00\x00</span><span class="s2">&quot;</span>
<span class="n">TOWER_PROTOCOL_ID_ALPC</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\x0c</span><span class="s2">&quot;</span> <span class="c1"># From RE</span>
<span class="n">TOWER_PROTOCOL_IS_UUID</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x0d</span><span class="s2">&quot;</span>
<span class="n">TOWER_EMPTY_RHS</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00\x00</span><span class="s2">&quot;</span>
<span class="n">TOWER_PROTOCOL_ID_ALPC</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x0c</span><span class="s2">&quot;</span> <span class="c1"># From RE</span>
<span class="k">def</span> <span class="nf">construct_alpc_tower</span><span class="p">(</span><span class="nb">object</span><span class="p">,</span> <span class="n">syntax</span><span class="p">,</span> <span class="n">protseq</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
<span class="k">if</span> <span class="n">address</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
@@ -153,11 +154,11 @@
<span class="n">floor_2</span> <span class="o">=</span> <span class="n">craft_floor</span><span class="p">(</span><span class="n">floor_2_lsh</span><span class="p">,</span> <span class="n">floor_2_rsh</span><span class="p">)</span>
<span class="c1"># Floor 3</span>
<span class="k">if</span> <span class="n">endpoint</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">floor_3_lsh</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\xff</span><span class="s2">&quot;</span>
<span class="n">floor_3_lsh</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\xff</span><span class="s2">&quot;</span>
<span class="n">floor_3_rsh</span> <span class="o">=</span> <span class="n">TOWER_EMPTY_RHS</span>
<span class="n">floor_3</span> <span class="o">=</span> <span class="n">craft_floor</span><span class="p">(</span><span class="n">floor_3_lsh</span><span class="p">,</span> <span class="n">floor_3_rsh</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">floor_3_lsh</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\x10</span><span class="s2">&quot;</span>
<span class="n">floor_3_lsh</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x10</span><span class="s2">&quot;</span>
<span class="n">floor_3_rsh</span> <span class="o">=</span> <span class="n">endpoint</span>
<span class="n">floor_3</span> <span class="o">=</span> <span class="n">craft_floor</span><span class="p">(</span><span class="n">floor_3_lsh</span><span class="p">,</span> <span class="n">floor_3_rsh</span><span class="p">)</span>
<span class="n">towerarray</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;&lt;H&quot;</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="n">floor_0</span> <span class="o">+</span> <span class="n">floor_1</span> <span class="o">+</span> <span class="n">floor_2</span> <span class="o">+</span> <span class="n">floor_3</span>
@@ -187,7 +188,7 @@
<span class="n">syntax_iid</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;8a885d04-1ceb-11c9-9fe8-08002b104860&quot;</span><span class="p">)</span>
<span class="n">rpc_syntax</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">RPC_IF_ID</span><span class="p">(</span><span class="n">syntax_iid</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1">## Forge tower</span>
<span class="n">tower_array_size</span><span class="p">,</span> <span class="n">towerarray</span> <span class="o">=</span> <span class="n">construct_alpc_tower</span><span class="p">(</span><span class="n">rpc_object</span><span class="p">,</span> <span class="n">rpc_syntax</span><span class="p">,</span> <span class="s2">&quot;ncalrpc&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">tower_array_size</span><span class="p">,</span> <span class="n">towerarray</span> <span class="o">=</span> <span class="n">construct_alpc_tower</span><span class="p">(</span><span class="n">rpc_object</span><span class="p">,</span> <span class="n">rpc_syntax</span><span class="p">,</span> <span class="s2">&quot;ncalrpc&quot;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="c1"># parameters</span>
<span class="n">local_system_psid</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_known_sid</span><span class="p">(</span><span class="n">sid</span><span class="p">)</span>
@@ -223,7 +224,7 @@
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;ALPC endpoints list: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">alpctowers</span><span class="p">),</span> <span class="s2">&quot;RPC&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">tower</span> <span class="ow">in</span> <span class="n">alpctowers</span><span class="p">:</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;Trying to connect to endpoint &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tower</span><span class="o">.</span><span class="n">endpoint</span><span class="p">),</span> <span class="s2">&quot;RPC&quot;</span><span class="p">)</span>
<span class="n">alpc_port</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\RPC Control\</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">tower</span><span class="o">.</span><span class="n">endpoint</span><span class="p">)</span>
<span class="n">alpc_port</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\RPC Control\</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">tower</span><span class="o">.</span><span class="n">endpoint</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">rpc</span><span class="o">.</span><span class="n">RPCClient</span><span class="p">(</span><span class="n">alpc_port</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+25 -9
View File
@@ -63,7 +63,7 @@
<span class="k">def</span> <span class="nf">dword_pad</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">4</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="n">s</span>
<span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="p">(</span><span class="s2">&quot;P&quot;</span> <span class="o">*</span> <span class="p">(</span><span class="mi">4</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">4</span><span class="p">))</span>
<span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="p">(</span><span class="sa">b</span><span class="s2">&quot;P&quot;</span> <span class="o">*</span> <span class="p">(</span><span class="mi">4</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">4</span><span class="p">))</span>
<div class="viewcode-block" id="NdrUniquePTR"><a class="viewcode-back" href="../../../rpc.html#windows.rpc.ndr.NdrUniquePTR">[docs]</a><span class="k">class</span> <span class="nc">NdrUniquePTR</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
@@ -127,7 +127,7 @@
<span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">subcls</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">elt</span><span class="p">)</span> <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">subcls</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">elt</span><span class="p">)</span> <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
@@ -174,7 +174,7 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">):</span>
<span class="n">data</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf-16-le&quot;</span><span class="p">)</span>
<span class="n">l</span> <span class="o">=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">l</span> <span class="o">=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;&lt;3I&quot;</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">l</span><span class="p">)</span>
<span class="n">result</span> <span class="o">+=</span> <span class="n">data</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="n">result</span><span class="p">)</span></div>
@@ -304,7 +304,7 @@
<span class="k">else</span><span class="p">:</span>
<span class="n">packed_member</span> <span class="o">=</span> <span class="n">member</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</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">packed_member</span><span class="p">)</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">conformant_size</span><span class="p">))</span> <span class="o">+</span> <span class="n">dword_pad</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">))</span> <span class="o">+</span> <span class="n">dword_pad</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">pointed</span><span class="p">))</span></div>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">conformant_size</span><span class="p">))</span> <span class="o">+</span> <span class="n">dword_pad</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">))</span> <span class="o">+</span> <span class="n">dword_pad</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">pointed</span><span class="p">))</span></div>
<div class="viewcode-block" id="NdrStructure.unpack"><a class="viewcode-back" href="../../../rpc.html#windows.rpc.ndr.NdrStructure.unpack">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
@@ -333,7 +333,11 @@
<span class="n">data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">member</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">))</span>
<span class="c1"># print(&quot;Applying deref unpack&quot;)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">post_subcls</span><span class="p">:</span>
<span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="n">new_data</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="s2">&quot;post_unpack&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="n">new_data</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">post_unpack</span><span class="p">(</span><span class="n">new_data</span><span class="p">)</span>
<span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_data</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">post_unpack</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div>
<span class="nd">@classmethod</span>
@@ -359,7 +363,7 @@
<span class="k">for</span> <span class="p">(</span><span class="n">member</span><span class="p">,</span> <span class="n">memberdata</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">MEMBERS</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">packed_member</span> <span class="o">=</span> <span class="n">member</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</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">packed_member</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dword_pad</span><span class="p">(</span><span class="n">elt</span><span class="p">)</span> <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dword_pad</span><span class="p">(</span><span class="n">elt</span><span class="p">)</span> <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="n">res</span><span class="p">)</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
@@ -375,12 +379,12 @@
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">ndrsize</span> <span class="o">=</span> <span class="n">NdrLong</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="n">ndrsize</span> <span class="o">+</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">cls</span><span class="o">.</span><span class="n">MEMBER_TYPE</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</span><span class="p">)</span> <span class="k">for</span> <span class="n">memberdata</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="n">ndrsize</span> <span class="o">+</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">cls</span><span class="o">.</span><span class="n">MEMBER_TYPE</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</span><span class="p">)</span> <span class="k">for</span> <span class="n">memberdata</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">pack_conformant</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">ndrsize</span> <span class="o">=</span> <span class="n">NdrLong</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
<span class="n">ndrdata</span> <span class="o">=</span> <span class="n">dword_pad</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">cls</span><span class="o">.</span><span class="n">MEMBER_TYPE</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</span><span class="p">)</span> <span class="k">for</span> <span class="n">memberdata</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="n">ndrdata</span> <span class="o">=</span> <span class="n">dword_pad</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">cls</span><span class="o">.</span><span class="n">MEMBER_TYPE</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</span><span class="p">)</span> <span class="k">for</span> <span class="n">memberdata</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="k">return</span> <span class="n">ndrsize</span><span class="p">,</span> <span class="n">ndrdata</span>
<span class="nd">@classmethod</span>
@@ -406,7 +410,7 @@
<span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="n">ndrsize</span> <span class="o">=</span> <span class="n">NdrLong</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
<span class="n">offset</span> <span class="o">=</span> <span class="n">NdrLong</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="n">ndrsize</span> <span class="o">+</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">ndrsize</span> <span class="o">+</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">cls</span><span class="o">.</span><span class="n">MEMBER_TYPE</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</span><span class="p">)</span> <span class="k">for</span> <span class="n">memberdata</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="k">return</span> <span class="n">dword_pad</span><span class="p">(</span><span class="n">ndrsize</span> <span class="o">+</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">ndrsize</span> <span class="o">+</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">cls</span><span class="o">.</span><span class="n">MEMBER_TYPE</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">memberdata</span><span class="p">)</span> <span class="k">for</span> <span class="n">memberdata</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
@@ -449,6 +453,8 @@
<span class="k">def</span> <span class="nf">_post_unpack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">u</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">unichr</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">result</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">NdrCharConformantVaryingArrays</span><span class="p">(</span><span class="n">NdrConformantVaryingArrays</span><span class="p">):</span>
<span class="n">MEMBER_TYPE</span> <span class="o">=</span> <span class="n">NdrByte</span>
<span class="k">class</span> <span class="nc">NdrHyperConformantVaryingArrays</span><span class="p">(</span><span class="n">NdrConformantVaryingArrays</span><span class="p">):</span>
<span class="n">MEMBER_TYPE</span> <span class="o">=</span> <span class="n">NdrHyper</span>
@@ -469,6 +475,13 @@
<span class="k">def</span> <span class="nf">_post_unpack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">bytearray</span><span class="p">(</span><span class="n">result</span><span class="p">)</span></div>
<span class="k">class</span> <span class="nc">NdrWcharConformantArray</span><span class="p">(</span><span class="n">NdrConformantArray</span><span class="p">):</span>
<span class="n">MEMBER_TYPE</span> <span class="o">=</span> <span class="n">NdrShort</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">_post_unpack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">bytearray</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">NdrGuidConformantArray</span><span class="p">(</span><span class="n">NdrConformantArray</span><span class="p">):</span>
<span class="n">MEMBER_TYPE</span> <span class="o">=</span> <span class="n">NdrGuid</span>
@@ -502,12 +515,15 @@
<div class="viewcode-block" id="NdrStream.align"><a class="viewcode-back" href="../../../rpc.html#windows.rpc.ndr.NdrStream.align">[docs]</a> <span class="k">def</span> <span class="nf">align</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Discard some bytes to align the remaining stream on ``size``&quot;&quot;&quot;</span>
<span class="n">already_read</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fulldata</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">already_read</span> <span class="o">%</span> <span class="n">size</span><span class="p">:</span>
<span class="c1"># Realign</span>
<span class="n">size_to_align</span> <span class="o">=</span> <span class="p">(</span><span class="n">size</span> <span class="o">-</span> <span class="p">(</span><span class="n">already_read</span> <span class="o">%</span> <span class="n">size</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">size_to_align</span><span class="p">:]</span>
<span class="c1"># print(&quot;align {0}: {1}&quot;.format(size, size_to_align))</span>
<span class="k">return</span> <span class="n">size_to_align</span>
<span class="c1"># print(&quot;align {0}: 0&quot;.format(size))</span>
<span class="k">return</span> <span class="mi">0</span></div></div>
+318 -19
View File
@@ -44,7 +44,7 @@
<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</span> <span class="k">import</span> <span class="n">winproxy</span>
<span class="kn">from</span> <span class="nn">windows.winobject.token</span> <span class="k">import</span> <span class="n">Token</span>
<span class="kn">from</span> <span class="nn">windows.winobject.token</span> <span class="k">import</span> <span class="n">Token</span><span class="p">,</span> <span class="n">KNOW_INTEGRITY_LEVEL</span>
<span class="c1"># Specific access right</span>
@@ -125,7 +125,7 @@
<span class="n">gdef</span><span class="o">.</span><span class="n">SEMAPHORE_MODIFY_STATE</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">SEMAPHORE_ACCESS_RIGHT</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">TIMER_ACCESS_RIGHT</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">TIMER_QUERY_STATE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">TIMER_QUERY_STATE</span><span class="p">,</span>
<span class="p">)</span>
@@ -184,25 +184,114 @@
<span class="p">)</span>
<span class="n">JOB_ACCESS_RIGHT</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">JOB_OBJECT_ASSIGN_PROCESS</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_SET_ATTRIBUTES</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_QUERY</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_TERMINATE</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_ASSIGN_PROCESS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_SET_ATTRIBUTES</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_QUERY</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_TERMINATE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">JOB_OBJECT_SET_SECURITY_ATTRIBUTES</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">KEY_ACCESS_RIGHT</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">KEY_QUERY_VALUE</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_SET_VALUE</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_CREATE_SUB_KEY</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_ENUMERATE_SUB_KEYS</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_NOTIFY</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_CREATE_LINK</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_WOW64_64KEY</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_WOW64_32KEY</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_QUERY_VALUE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_SET_VALUE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_CREATE_SUB_KEY</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_ENUMERATE_SUB_KEYS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_NOTIFY</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_CREATE_LINK</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_WOW64_64KEY</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">KEY_WOW64_32KEY</span><span class="p">,</span>
<span class="c1"># KEY_WOW64_RES (0x0300) # Just a mask of the 2 last</span>
<span class="p">)</span>
<span class="n">SECTION_ACCESS_RIGHT</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">SECTION_QUERY</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SECTION_MAP_WRITE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SECTION_MAP_READ</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SECTION_MAP_EXECUTE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SECTION_EXTEND_SIZE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SECTION_MAP_EXECUTE_EXPLICIT</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">COM_ACCESS_RIGHT</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">COM_EXECUTE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">COM_EXECUTE_LOCAL</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">COM_EXECUTE_REMOTE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">COM_ACTIVATE_LOCAL</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">COM_ACTIVATE_REMOTE</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">SERVICE_ACCESS_RIGHT</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">SERVICE_QUERY_CONFIG</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_CHANGE_CONFIG</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_QUERY_STATUS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_ENUMERATE_DEPENDENTS</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_START</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_STOP</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_PAUSE_CONTINUE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_INTERROGATE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_USER_DEFINED_CONTROL</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">ADS_ACCESS_RIGHT</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">ADS_RIGHT_DS_CREATE_CHILD</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_DS_DELETE_CHILD</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_ACTRL_DS_LIST</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_DS_SELF</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_DS_READ_PROP</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_DS_WRITE_PROP</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_DS_DELETE_TREE</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_DS_LIST_OBJECT</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ADS_RIGHT_DS_CONTROL_ACCESS</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">SPECIFIC_ACCESS_RIGTH_BY_TYPE</span> <span class="o">=</span> <span class="p">{</span>
<span class="kc">None</span><span class="p">:</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FlagMapper</span><span class="p">(),</span>
<span class="s2">&quot;file&quot;</span><span class="p">:</span> <span class="n">FILE_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;directory&quot;</span><span class="p">:</span> <span class="n">DIRECTORY_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;named_pipe&quot;</span><span class="p">:</span> <span class="n">NAMED_PIPE_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;token&quot;</span><span class="p">:</span> <span class="n">TOKEN_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;cluster_api&quot;</span><span class="p">:</span> <span class="n">CLUSTER_API_ACCESS_RIGH</span><span class="p">,</span>
<span class="s2">&quot;fax&quot;</span><span class="p">:</span> <span class="n">FAX_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;callback&quot;</span><span class="p">:</span> <span class="n">CALLBACK_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;mutant&quot;</span><span class="p">:</span> <span class="n">MUTANT_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;event&quot;</span><span class="p">:</span> <span class="n">EVENT_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;semaphore&quot;</span><span class="p">:</span> <span class="n">SEMAPHORE_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;io_completion&quot;</span><span class="p">:</span> <span class="n">IO_COMPLETION_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;port&quot;</span><span class="p">:</span> <span class="n">PORT_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;object_manager_type&quot;</span><span class="p">:</span> <span class="n">OBJECT_MANAGER_TYPE_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;object_manager_directory&quot;</span><span class="p">:</span> <span class="n">OBJECT_MANAGER_DIRECTORY_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;object_manager_symlink&quot;</span><span class="p">:</span> <span class="n">OBJECT_MANAGER_SIMLINK_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;process&quot;</span><span class="p">:</span> <span class="n">PROCESS_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;thread&quot;</span><span class="p">:</span> <span class="n">THREAD_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;job&quot;</span><span class="p">:</span> <span class="n">JOB_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">KEY_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;com&quot;</span><span class="p">:</span> <span class="n">COM_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;service&quot;</span><span class="p">:</span> <span class="n">SERVICE_ACCESS_RIGHT</span><span class="p">,</span>
<span class="s2">&quot;ad&quot;</span><span class="p">:</span> <span class="n">ADS_ACCESS_RIGHT</span><span class="p">,</span>
<span class="p">}</span>
<span class="c1"># SD</span>
<span class="n">SD_CONTROL_FLAGS</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">SE_OWNER_DEFAULTED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_GROUP_DEFAULTED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_DACL_PRESENT</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_DACL_DEFAULTED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_SACL_PRESENT</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_SACL_DEFAULTED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_DACL_UNTRUSTED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_SERVER_SECURITY</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_DACL_AUTO_INHERIT_REQ</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_SACL_AUTO_INHERIT_REQ</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_DACL_AUTO_INHERITED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_SACL_AUTO_INHERITED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_DACL_PROTECTED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_SACL_PROTECTED</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_RM_CONTROL_VALID</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SE_SELF_RELATIVE</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># ACE</span>
<span class="n">ACE_FLAGS</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FlagMapper</span><span class="p">(</span>
@@ -225,6 +314,13 @@
<span class="n">gdef</span><span class="o">.</span><span class="n">DELETE</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">WRITE_DAC</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">WRITE_OWNER</span> <span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SYNCHRONIZE</span> <span class="p">,</span>
<span class="p">)</span>
<span class="n">MANDATORY_LABEL_ACE_MASK</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">SYSTEM_MANDATORY_LABEL_NO_WRITE_UP</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MANDATORY_LABEL_NO_READ_UP</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP</span><span class="p">,</span>
<span class="p">)</span>
<div class="viewcode-block" id="AceHeader"><a class="viewcode-back" href="../../security.html#windows.security.AceHeader">[docs]</a><span class="k">class</span> <span class="nc">AceHeader</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">ACE_HEADER</span><span class="p">):</span>
@@ -325,7 +421,16 @@
<span class="n">selfptr</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">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PUCHAR</span><span class="p">)</span>
<span class="n">datastart</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="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">sid</span><span class="o">.</span><span class="n">size</span> <span class="o">-</span> <span class="mi">4</span>
<span class="n">dataend</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceSize</span>
<span class="k">return</span> <span class="n">selfptr</span><span class="p">[</span><span class="n">datastart</span><span class="p">:</span> <span class="n">dataend</span><span class="p">]</span></div>
<span class="k">return</span> <span class="n">selfptr</span><span class="p">[</span><span class="n">datastart</span><span class="p">:</span> <span class="n">dataend</span><span class="p">]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">condition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">buff</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">BYTE</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">application_data</span><span class="p">)</span>
<span class="n">resstr</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPWSTR</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">GetStringConditionFromBinary</span><span class="p">(</span><span class="n">buff</span><span class="p">,</span> <span class="n">StringAceCondition</span><span class="o">=</span><span class="n">resstr</span><span class="p">)</span>
<span class="n">condition</span> <span class="o">=</span> <span class="n">resstr</span><span class="o">.</span><span class="n">value</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">LocalFree</span><span class="p">(</span><span class="n">resstr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">condition</span></div>
<div class="viewcode-block" id="ObjectRelatedACE"><a class="viewcode-back" href="../../security.html#windows.security.ObjectRelatedACE">[docs]</a><span class="k">class</span> <span class="nc">ObjectRelatedACE</span><span class="p">(</span><span class="n">MaskAndSidACE</span><span class="p">):</span>
@@ -610,10 +715,20 @@
<span class="n">gdef</span><span class="o">.</span><span class="n">GROUP_SECURITY_INFORMATION</span> <span class="o">|</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">DACL_SECURITY_INFORMATION</span> <span class="o">|</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ATTRIBUTE_SECURITY_INFORMATION</span> <span class="o">|</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">LABEL_SECURITY_INFORMATION</span> <span class="o">|</span> <span class="c1"># Integrity</span>
<span class="c1"># gdef.SACL_SECURITY_INFORMATION | # Need special rights</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SCOPE_SECURITY_INFORMATION</span> <span class="o">|</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">PROCESS_TRUST_LABEL_SECURITY_INFORMATION</span>
<span class="p">)</span>
<span class="c1"># https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-queryserviceobjectsecurity</span>
<span class="c1"># Default flags for services</span>
<span class="n">SERVICE_SECURITY_INFORMATION</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">OWNER_SECURITY_INFORMATION</span> <span class="o">|</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">GROUP_SECURITY_INFORMATION</span> <span class="o">|</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">DACL_SECURITY_INFORMATION</span>
<span class="p">)</span>
<span class="sd">&quot;&quot;&quot;The default ``flags`` value for functions expecting a</span>
<span class="sd"> `SECURITY_INFORMATION &lt;https://docs.microsoft.com/en-us/windows/desktop/SecAuthZ/security-information&gt;`_.</span>
@@ -625,6 +740,7 @@
<span class="sd"> - ``ATTRIBUTE_SECURITY_INFORMATION``</span>
<span class="sd"> - ``SCOPE_SECURITY_INFORMATION``</span>
<span class="sd"> - ``PROCESS_TRUST_LABEL_SECURITY_INFORMATION``</span>
<span class="sd"> - ``LABEL_SECURITY_INFORMATION``</span>
<span class="sd"> .. warning::</span>
@@ -727,7 +843,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">ConvertStringSecurityDescriptorToSecurityDescriptorA</span><span class="p">(</span>
<span class="n">sddl</span><span class="p">,</span>
<span class="n">sddl</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">),</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SDDL_REVISION_1</span><span class="p">,</span>
<span class="bp">self</span><span class="p">,</span>
<span class="kc">None</span><span class="p">)</span>
@@ -773,15 +889,59 @@
<span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">_apply_to_handle_and_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">objtype</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">SE_KERNEL_OBJECT</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># Make SecurityDescriptor method has_audit_ace ?</span>
<span class="k">if</span> <span class="n">flags</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">flags</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">OWNER_SECURITY_INFORMATION</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">GROUP_SECURITY_INFORMATION</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DACL_SECURITY_INFORMATION</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LABEL_SECURITY_INFORMATION</span>
<span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sacl</span> <span class="ow">and</span>
<span class="nb">any</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MANDATORY_LABEL_ACE_TYPE</span> <span class="k">for</span> <span class="n">ace</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sacl</span><span class="p">)):</span>
<span class="n">flags</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SACL_SECURITY_INFORMATION</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">SetSecurityInfo</span><span class="p">(</span>
<span class="n">handle</span><span class="p">,</span>
<span class="n">objtype</span><span class="p">,</span>
<span class="n">flags</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">owner</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">group</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dacl</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sacl</span>
<span class="p">)</span>
<div class="viewcode-block" id="SecurityDescriptor.from_filename"><a class="viewcode-back" href="../../security.html#windows.security.SecurityDescriptor.from_filename">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_filename</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">DEFAULT_SECURITY_INFORMATION</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Retrieve the security descriptor for the file ``filename``&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_from_name_and_type</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SE_FILE_OBJECT</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="n">query_sacl</span><span class="p">)</span></div>
<div class="viewcode-block" id="SecurityDescriptor.to_filename"><a class="viewcode-back" href="../../security.html#windows.security.SecurityDescriptor.to_filename">[docs]</a> <span class="k">def</span> <span class="nf">to_filename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="s2">&quot;Test method: WILL CHANGE&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">flags</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">owner</span><span class="p">:</span>
<span class="n">flags</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">OWNER_SECURITY_INFORMATION</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">group</span><span class="p">:</span>
<span class="n">flags</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">GROUP_SECURITY_INFORMATION</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">dacl</span><span class="p">:</span>
<span class="n">flags</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DACL_SECURITY_INFORMATION</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sacl</span><span class="p">:</span>
<span class="n">flags</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SACL_SECURITY_INFORMATION</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">SetNamedSecurityInfoW</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SE_FILE_OBJECT</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">owner</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">group</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dacl</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sacl</span><span class="p">)</span></div>
<div class="viewcode-block" id="SecurityDescriptor.from_service"><a class="viewcode-back" href="../../security.html#windows.security.SecurityDescriptor.from_service">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_service</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">SERVICE_SECURITY_INFORMATION</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Retrieve the security descriptor for the service named ``service``&quot;&quot;&quot;</span>
<span class="n">sd</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_from_name_and_type</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SE_SERVICE</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="n">query_sacl</span><span class="p">)</span>
<span class="n">sd</span><span class="o">.</span><span class="n">obj_type</span> <span class="o">=</span> <span class="s2">&quot;service&quot;</span>
<span class="k">return</span> <span class="n">sd</span></div>
<div class="viewcode-block" id="SecurityDescriptor.from_handle"><a class="viewcode-back" href="../../security.html#windows.security.SecurityDescriptor.from_handle">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_handle</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">DEFAULT_SECURITY_INFORMATION</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">from_handle</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">DEFAULT_SECURITY_INFORMATION</span><span class="p">,</span> <span class="n">obj_type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Retrieve the security descriptor for the kernel object described by``handle``&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_from_handle_and_type</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SE_KERNEL_OBJECT</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="n">query_sacl</span><span class="p">)</span></div>
<span class="n">sd</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_from_handle_and_type</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SE_KERNEL_OBJECT</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="n">query_sacl</span><span class="p">)</span>
<span class="n">sd</span><span class="o">.</span><span class="n">obj_type</span> <span class="o">=</span> <span class="n">obj_type</span> <span class="c1"># Test</span>
<span class="k">return</span> <span class="n">sd</span></div>
<div class="viewcode-block" id="SecurityDescriptor.from_binary"><a class="viewcode-back" href="../../security.html#windows.security.SecurityDescriptor.from_binary">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_binary</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
@@ -806,7 +966,9 @@
<span class="kc">None</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">result_cstr</span><span class="o">.</span><span class="n">value</span> <span class="c1"># Retrieve a python-str copy</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">LocalFree</span><span class="p">(</span><span class="n">result_cstr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span></div></div>
<span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span></div>
<span class="fm">__str__</span> <span class="o">=</span> <span class="n">to_string</span>
<span class="c1"># TST</span>
@@ -823,6 +985,143 @@
<span class="c1"># print(&quot;FREE SELF&quot;)</span>
<span class="c1"># self._close_function(self)</span>
<span class="k">def</span> <span class="nf">explain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">type</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;obj_type&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">explain_sd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sdtype</span><span class="o">=</span><span class="nb">type</span><span class="p">)</span></div>
<span class="c1"># Explain SD POC</span>
<span class="c1"># If ok -&gt; new file</span>
<span class="k">def</span> <span class="nf">explain_sid</span><span class="p">(</span><span class="n">sid</span><span class="p">):</span>
<span class="k">if</span> <span class="n">sid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;None&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">info</span> <span class="o">=</span> <span class="sa">u</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">lookup_sid</span><span class="p">(</span><span class="n">sid</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="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="n">info</span> <span class="o">=</span> <span class="sa">u</span><span class="s2">&quot;&lt;lookup failed&gt;&quot;</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">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">sid</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">explain_mask</span><span class="p">(</span><span class="n">mask</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="n">mapper</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SPECIFIC_ACCESS_RIGTH_BY_TYPE</span><span class="p">[</span><span class="n">sdtype</span><span class="p">]</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">32</span><span class="p">):</span> <span class="c1"># sizeof ACCESS_MASK * 8</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">v</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">mapper</span><span class="p">[</span><span class="n">ACE_MASKS</span><span class="p">[</span><span class="n">v</span><span class="p">]])</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">explain_simple_ace</span><span class="p">(</span><span class="n">ace</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Type:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Flags:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; </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">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceFlags</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;SID:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">explain_sid</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">sid</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Mask:&quot;</span>
<span class="n">mapper</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SPECIFIC_ACCESS_RIGTH_BY_TYPE</span><span class="p">[</span><span class="n">sdtype</span><span class="p">]</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">mapper</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">ace</span><span class="o">.</span><span class="n">mask</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">explain_mandatory_label_ace</span><span class="p">(</span><span class="n">ace</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="k">assert</span> <span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MANDATORY_LABEL_ACE_TYPE</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Type:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; </span><span class="si">{0}</span><span class="s2"> (Integrity Level)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Flags:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; </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">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceFlags</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;SID:&quot;</span>
<span class="n">sid</span> <span class="o">=</span> <span class="n">ace</span><span class="o">.</span><span class="n">sid</span>
<span class="n">count</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">GetSidSubAuthorityCount</span><span class="p">(</span><span class="n">sid</span><span class="p">)</span>
<span class="n">integrity</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">GetSidSubAuthority</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="n">count</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; </span><span class="si">{0}</span><span class="s2"> (Integrity Level: </span><span class="si">{1}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="n">KNOW_INTEGRITY_LEVEL</span><span class="p">[</span><span class="n">integrity</span><span class="p">])</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Mask:&quot;</span>
<span class="n">mapper</span> <span class="o">=</span> <span class="n">MANDATORY_LABEL_ACE_MASK</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">mapper</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">ace</span><span class="o">.</span><span class="n">mask</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">explain_object_related_ace</span><span class="p">(</span><span class="n">ace</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Type:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;HeaderFlags:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; </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">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceFlags</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;SID:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">explain_sid</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">sid</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Mask:&quot;</span>
<span class="n">mapper</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SPECIFIC_ACCESS_RIGTH_BY_TYPE</span><span class="p">[</span><span class="n">sdtype</span><span class="p">]</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">mapper</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">ace</span><span class="o">.</span><span class="n">mask</span><span class="p">))</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Flag:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">flags</span><span class="p">)</span>
<span class="n">object_type</span> <span class="o">=</span> <span class="n">ace</span><span class="o">.</span><span class="n">object_type</span>
<span class="n">inherited_object_type</span> <span class="o">=</span> <span class="n">ace</span><span class="o">.</span><span class="n">inherited_object_type</span>
<span class="k">if</span> <span class="n">object_type</span><span class="p">:</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;ObjectType&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">object_type</span>
<span class="k">if</span> <span class="n">inherited_object_type</span><span class="p">:</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;InheritedObjectType&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">inherited_object_type</span>
<span class="k">def</span> <span class="nf">explain_callback_ace</span><span class="p">(</span><span class="n">ace</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Type:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;HeaderFlags:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; </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">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceFlags</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;SID:&quot;</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">explain_sid</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">sid</span><span class="p">)</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;Mask:&quot;</span>
<span class="n">mapper</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">security</span><span class="o">.</span><span class="n">SPECIFIC_ACCESS_RIGTH_BY_TYPE</span><span class="p">[</span><span class="n">sdtype</span><span class="p">]</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">mapper</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">ace</span><span class="o">.</span><span class="n">mask</span><span class="p">))</span>
<span class="k">yield</span> <span class="s2">&quot;Application data:&quot;</span>
<span class="k">yield</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">application_data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">condition</span> <span class="o">=</span> <span class="n">ace</span><span class="o">.</span><span class="n">condition</span>
<span class="k">yield</span> <span class="s2">&quot;Condition:&quot;</span>
<span class="k">yield</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">condition</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">ACE_EXPLAINER</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ACCESS_ALLOWED_ACE_TYPE</span><span class="p">:</span> <span class="n">explain_simple_ace</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ACCESS_DENIED_ACE_TYPE</span><span class="p">:</span> <span class="n">explain_simple_ace</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MANDATORY_LABEL_ACE_TYPE</span><span class="p">:</span> <span class="n">explain_mandatory_label_ace</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_AUDIT_ACE_TYPE</span><span class="p">:</span> <span class="n">explain_simple_ace</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ACCESS_ALLOWED_OBJECT_ACE_TYPE</span><span class="p">:</span> <span class="n">explain_object_related_ace</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ACCESS_DENIED_OBJECT_ACE_TYPE</span><span class="p">:</span> <span class="n">explain_object_related_ace</span><span class="p">,</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">ACCESS_ALLOWED_CALLBACK_ACE_TYPE</span><span class="p">:</span> <span class="n">explain_callback_ace</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">explain_acl</span><span class="p">(</span><span class="n">acl</span><span class="p">,</span> <span class="n">sdtype</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">acl</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot;None&quot;</span>
<span class="k">for</span> <span class="n">ace</span> <span class="ow">in</span> <span class="n">acl</span><span class="o">.</span><span class="n">aces</span><span class="p">:</span>
<span class="k">yield</span> <span class="nb">str</span><span class="p">(</span><span class="n">ace</span><span class="p">)</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">ACE_EXPLAINER</span><span class="p">[</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span><span class="p">](</span><span class="n">ace</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="k">yield</span> <span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">line</span>
<span class="k">def</span> <span class="nf">explain_sd</span><span class="p">(</span><span class="n">sd</span><span class="p">,</span> <span class="n">sdtype</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;Security Descriptor: </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">sd</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; Owner:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">explain_sid</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">owner</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; Group:&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">explain_sid</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">group</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; Control:&quot;</span><span class="p">)</span>
<span class="n">control</span> <span class="o">=</span> <span class="n">sd</span><span class="o">.</span><span class="n">control</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; </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">flag</span> <span class="k">for</span> <span class="n">flag</span> <span class="ow">in</span> <span class="n">SD_CONTROL_FLAGS</span> <span class="k">if</span> <span class="n">control</span> <span class="o">&amp;</span> <span class="n">flag</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; Dacl: </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">sd</span><span class="o">.</span><span class="n">dacl</span><span class="p">))</span>
<span class="k">if</span> <span class="n">sd</span><span class="o">.</span><span class="n">dacl</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">explain_acl</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">dacl</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">line</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">UnicodeError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;cp1252&quot;</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; Sacl: </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">sd</span><span class="o">.</span><span class="n">sacl</span><span class="p">))</span>
<span class="k">if</span> <span class="n">sd</span><span class="o">.</span><span class="n">sacl</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">explain_acl</span><span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">sacl</span><span class="p">,</span> <span class="n">sdtype</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">line</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">UnicodeError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;cp1252&quot;</span><span class="p">))</span>
</pre></div>
</div>
+11 -4
View File
@@ -46,10 +46,11 @@
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x86</span> <span class="k">as</span> <span class="nn">x86</span>
<span class="kn">import</span> <span class="nn">windows.native_exec.simple_x64</span> <span class="k">as</span> <span class="nn">x64</span>
<span class="kn">from</span> <span class="nn">generated_def.winstructs</span> <span class="k">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">.generated_def.winstructs</span> <span class="k">import</span> <span class="o">*</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</span> <span class="k">import</span> <span class="n">winproxy</span>
<span class="kn">from</span> <span class="nn">winproxy</span> <span class="k">import</span> <span class="n">NeededParameter</span>
<span class="kn">from</span> <span class="nn">.winproxy</span> <span class="k">import</span> <span class="n">NeededParameter</span>
<span class="kn">from</span> <span class="nn">.pycompat</span> <span class="k">import</span> <span class="n">int_types</span>
<span class="c1"># Special code for syswow64 process</span>
<span class="n">CS_32bits</span> <span class="o">=</span> <span class="mh">0x23</span>
@@ -72,6 +73,12 @@
<span class="n">transition</span> <span class="o">=</span> <span class="n">x86</span><span class="o">.</span><span class="n">MultipleInstr</span><span class="p">()</span>
<span class="n">transition</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Call</span><span class="p">(</span><span class="n">CS_64bits</span><span class="p">,</span> <span class="n">x64shellcodeaddr</span><span class="p">)</span>
<span class="c1"># Reset the SS segment selector.</span>
<span class="c1"># We need to do that due to a bug in AMD CPUs with RETF &amp; SS</span>
<span class="c1"># https://github.com/hakril/PythonForWindows/issues/10</span>
<span class="c1"># http://blog.rewolf.pl/blog/?p=1484</span>
<span class="n">transition</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s2">&quot;ECX&quot;</span><span class="p">,</span> <span class="s2">&quot;SS&quot;</span><span class="p">)</span>
<span class="n">transition</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Mov</span><span class="p">(</span><span class="s2">&quot;SS&quot;</span><span class="p">,</span> <span class="s2">&quot;ECX&quot;</span><span class="p">)</span>
<span class="n">transition</span> <span class="o">+=</span> <span class="n">x86</span><span class="o">.</span><span class="n">Ret</span><span class="p">()</span>
<span class="n">stubaddr</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">allocator</span><span class="o">.</span><span class="n">write_code</span><span class="p">(</span><span class="n">transition</span><span class="o">.</span><span class="n">get_code</span><span class="p">())</span>
@@ -162,7 +169,7 @@
<span class="c1"># Transform args (ctypes byref possibly) to int</span>
<span class="n">writable_args</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">)):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">value</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">value</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_void_p</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="k">except</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">ArgumentError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
@@ -278,7 +285,7 @@
<span class="c1"># Ignore STATUS_INFO_LENGTH_MISMATCH if SystemInformation is None</span>
<span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">STATUS_INFO_LENGTH_MISMATCH</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
<span class="k">return</span> <span class="n">args</span>
<span class="k">raise</span> <span class="n">WinproxyError</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> failed with NTStatus </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">func_name</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="n">result</span><span class="p">)))</span>
<span class="k">raise</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">WinproxyError</span><span class="p">(</span><span class="s2">&quot;NtQuerySystemInformation failed with NTStatus </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="nb">hex</span><span class="p">(</span><span class="n">result</span><span class="p">)))</span>
<span class="nd">@Syswow64ApiProxy</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySystemInformation</span><span class="p">,</span> <span class="n">errcheck</span><span class="o">=</span><span class="n">ntquerysysteminformation_syswow64_error_check</span><span class="p">)</span>
<span class="c1"># @Syswow64ApiProxy(winproxy.NtQuerySystemInformation)</span>
+10 -1
View File
@@ -59,6 +59,8 @@
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cache_name</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">prop</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="n">f</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span>
<span class="c1"># Slow fix of the typo :)</span>
<span class="n">fixedproperty</span> <span class="o">=</span> <span class="n">fixedpropety</span>
<span class="c1"># type replacement based on name</span>
<span class="k">def</span> <span class="nf">transform_ctypes_fields</span><span class="p">(</span><span class="n">struct</span><span class="p">,</span> <span class="n">replacement</span><span class="p">):</span>
@@ -96,7 +98,14 @@
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> -&gt; </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">fname</span><span class="p">,</span> <span class="n">ftype</span> <span class="ow">in</span> <span class="n">struct</span><span class="o">.</span><span class="n">_fields_</span><span class="p">:</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">struct</span><span class="o">.</span><span class="n">_fields_</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">field</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">fname</span><span class="p">,</span> <span class="n">ftype</span> <span class="o">=</span> <span class="n">field</span>
<span class="n">nb_bits</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">field</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="n">fname</span><span class="p">,</span> <span class="n">ftype</span><span class="p">,</span> <span class="n">nb_bits</span> <span class="o">=</span> <span class="n">field</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown ctypes field entry format &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">struct</span><span class="p">,</span> <span class="n">fname</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+138 -40
View File
@@ -42,7 +42,9 @@
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">code</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">namedtuple</span>
<span class="kn">import</span> <span class="nn">windows</span>
@@ -90,7 +92,15 @@
<span class="sd">&quot;&quot;&quot;Return a Python :class:`file` around a ``Windows`` HANDLE&quot;&quot;&quot;</span>
<span class="n">flags</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">O_BINARY</span> <span class="k">if</span> <span class="s2">&quot;b&quot;</span> <span class="ow">in</span> <span class="n">mode</span> <span class="k">else</span> <span class="n">os</span><span class="o">.</span><span class="n">O_TEXT</span>
<span class="n">fd</span> <span class="o">=</span> <span class="n">msvcrt</span><span class="o">.</span><span class="n">open_osfhandle</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">fdopen</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span></div>
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">is_py3</span> <span class="ow">and</span> <span class="n">flags</span> <span class="o">==</span> <span class="n">os</span><span class="o">.</span><span class="n">O_TEXT</span><span class="p">:</span>
<span class="c1"># Buffering, encoding</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Buffering</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)</span>
<span class="c1"># In py2 os.fdopen do not accept kwargs</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">fdopen</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
<div class="viewcode-block" id="get_handle_from_file"><a class="viewcode-back" href="../../../utils.html#windows.utils.get_handle_from_file">[docs]</a><span class="k">def</span> <span class="nf">get_handle_from_file</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
@@ -107,7 +117,7 @@
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">console_stdout</span>
<span class="n">stdin_handle</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetStdHandle</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">STD_INPUT_HANDLE</span><span class="p">)</span>
<span class="n">console_stdin</span> <span class="o">=</span> <span class="n">create_file_from_handle</span><span class="p">(</span><span class="n">stdin_handle</span><span class="p">,</span> <span class="s2">&quot;r+&quot;</span><span class="p">)</span>
<span class="n">console_stdin</span> <span class="o">=</span> <span class="n">create_file_from_handle</span><span class="p">(</span><span class="n">stdin_handle</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdin</span> <span class="o">=</span> <span class="n">console_stdin</span>
<span class="n">stderr_handle</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetStdHandle</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">STD_ERROR_HANDLE</span><span class="p">)</span>
@@ -126,7 +136,7 @@
<span class="n">lpStartupInfo</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">StartupInfo</span><span class="p">)</span>
<span class="n">lpCommandLine</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="n">lpCommandLine</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]))</span>
<span class="n">lpCommandLine</span> <span class="o">=</span> <span class="p">(</span><span class="sa">b</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]))</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateProcessA</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">lpCommandLine</span><span class="o">=</span><span class="n">lpCommandLine</span><span class="p">,</span> <span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">dwCreationFlags</span><span class="p">,</span> <span class="n">lpProcessInformation</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">proc_info</span><span class="p">),</span> <span class="n">lpStartupInfo</span><span class="o">=</span><span class="n">lpStartupInfo</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;CreateProcessA new process handle </span><span class="si">{:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hProcess</span><span class="p">),</span> <span class="s2">&quot;HANDLE&quot;</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="s2">&quot;CreateProcessA new thread handle </span><span class="si">{:#x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hThread</span><span class="p">),</span> <span class="s2">&quot;HANDLE&quot;</span><span class="p">)</span>
@@ -135,11 +145,22 @@
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hProcess</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">device_io_control</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">iocode</span><span class="p">,</span> <span class="n">buffer</span><span class="p">):</span>
<span class="n">outbuffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">returned_size</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">DeviceIoControl</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">iocode</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">lpOutBuffer</span><span class="o">=</span><span class="n">outbuffer</span><span class="p">,</span> <span class="n">lpBytesReturned</span><span class="o">=</span><span class="n">returned_size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">outbuffer</span><span class="p">[:</span><span class="n">returned_size</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">tmp_cp_as</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
<span class="n">proc_info</span> <span class="o">=</span> <span class="n">PROCESS_INFORMATION</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateProcessAsUserA</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">lpCommandLine</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">CREATE_NEW_CONSOLE</span><span class="p">,</span> <span class="n">lpProcessInformation</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">proc_info</span><span class="p">),</span> <span class="n">lpStartupInfo</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winobject</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">proc_info</span><span class="o">.</span><span class="n">hProcess</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">find_handle</span><span class="p">(</span><span class="n">proc</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">h</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">handles</span> <span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">dwProcessId</span> <span class="o">==</span> <span class="n">proc</span><span class="o">.</span><span class="n">pid</span> <span class="ow">and</span> <span class="n">h</span><span class="o">.</span><span class="n">wValue</span> <span class="o">==</span> <span class="n">value</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">lookup_privilege_value</span><span class="p">(</span><span class="n">privilege_name</span><span class="p">):</span>
<span class="n">luid</span> <span class="o">=</span> <span class="n">LUID</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">LookupPrivilegeValueA</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">privilege_name</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">luid</span><span class="p">))</span>
@@ -231,6 +252,11 @@
<span class="n">UNIX_EPOCH</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">1970</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">WINDOWS_EPOCH</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">1601</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1"># https://docs.microsoft.com/en-us/cpp/atl-mfc-shared/date-type?view=vs-2019</span>
<span class="c1"># Why keep it simple and have only one epoch ? :D</span>
<span class="c1"># I don&#39;t want to name this &quot;DATE_EPOCH&quot; as everything is a DATE</span>
<span class="c1"># So let&#39;s go with COMDATE as this structure seems very related to COM/AUTOMATION</span>
<span class="n">COMDATE_EPOCH</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">1899</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">WIN_TO_UNIX_EPOCH_SECOND</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">UNIX_EPOCH</span> <span class="o">-</span> <span class="n">WINDOWS_EPOCH</span><span class="p">)</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">())</span>
<span class="n">WIN_TICK_PER_SECOND_INT</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="mi">7</span>
@@ -241,19 +267,45 @@
<span class="k">def</span> <span class="nf">unix_timestamp_from_filetime</span><span class="p">(</span><span class="n">filetime</span><span class="p">):</span>
<span class="c1"># Round the filetime</span>
<span class="n">round_win_ticks</span> <span class="o">=</span> <span class="p">((</span><span class="n">filetime</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">((</span><span class="n">filetime</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">)))</span> <span class="o">*</span> <span class="mi">10</span>
<span class="n">last_number</span> <span class="o">=</span> <span class="p">(</span><span class="n">filetime</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span>
<span class="c1"># We do some sort of &quot;manual rounding cause of py2 vs py3</span>
<span class="c1"># PY2: round(0.5) == 1</span>
<span class="c1"># PY3: round(0.5) == 0</span>
<span class="k">if</span> <span class="n">last_number</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">last_number</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">)</span>
<span class="n">round_win_ticks</span> <span class="o">=</span> <span class="p">((</span><span class="n">filetime</span> <span class="o">//</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">rounding</span><span class="p">))</span> <span class="o">*</span> <span class="mi">10</span>
<span class="k">return</span> <span class="nb">round</span><span class="p">((</span><span class="n">round_win_ticks</span> <span class="o">-</span> <span class="n">WIN_TO_UNIX_EPOCH_WIN_TICKS</span><span class="p">)</span> <span class="o">/</span> <span class="n">WIN_TICK_PER_SECOND_FLOAT</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">datetime_from_filetime</span><span class="p">(</span><span class="n">filetime</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;return a :class:`datetime.datetime` from a ``windows`` FILETIME int&quot;&quot;&quot;</span>
<span class="c1"># Manual non-approx rounding as filetime will not have a perfect representation as Python float</span>
<span class="n">round_microsecond</span> <span class="o">=</span> <span class="p">(</span><span class="n">filetime</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">((</span><span class="n">filetime</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">))</span>
<span class="c1"># We do some sort of &quot;manual rounding cause of py2 vs py3</span>
<span class="c1"># PY2: round(0.5) == 1</span>
<span class="c1"># PY3: round(0.5) == 0</span>
<span class="n">last_number</span> <span class="o">=</span> <span class="p">(</span><span class="n">filetime</span> <span class="o">%</span> <span class="mi">10</span><span class="p">)</span>
<span class="k">if</span> <span class="n">last_number</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">rounding</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">last_number</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">)</span>
<span class="n">round_microsecond</span> <span class="o">=</span> <span class="p">(</span><span class="n">filetime</span> <span class="o">//</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">rounding</span><span class="p">)</span>
<span class="k">return</span> <span class="n">WINDOWS_EPOCH</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">microseconds</span><span class="o">=</span><span class="n">round_microsecond</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">filetime_from_datetime</span><span class="p">(</span><span class="n">dtime</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the FILETIME value from a :class:`datetime.datetime` in a python :class:`int`&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">((</span><span class="n">dtime</span> <span class="o">-</span> <span class="n">WINDOWS_EPOCH</span><span class="p">)</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">())</span> <span class="o">*</span> <span class="n">WIN_TICK_PER_SECOND_INT</span>
<span class="k">def</span> <span class="nf">datetime_from_comdate</span><span class="p">(</span><span class="n">comtime</span><span class="p">):</span>
<span class="c1"># Hour values are expressed as the absolute value of the fractional part of the number.</span>
<span class="k">if</span> <span class="n">comtime</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># The date timeline becomes discontinuous for date values less than 0 (before 30 December 1899). This is because the whole-number portion of the date value is treated as signed, while the fractional part is treated as unsigned.</span>
<span class="c1"># other words, the whole-number part of the date value may be positive or negative, while the fractional part of the date value is always added to the overall logical date.</span>
<span class="c1"># WTF :D</span>
<span class="n">dec</span><span class="p">,</span> <span class="n">nb</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">modf</span><span class="p">(</span><span class="n">comtime</span><span class="p">)</span>
<span class="n">final_delta</span> <span class="o">=</span> <span class="n">nb</span> <span class="o">+</span> <span class="nb">abs</span><span class="p">(</span><span class="n">dec</span><span class="p">)</span>
<span class="k">return</span> <span class="n">COMDATE_EPOCH</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">final_delta</span><span class="p">)</span>
<span class="k">return</span> <span class="n">COMDATE_EPOCH</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">comtime</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">FixedInteractiveConsole</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">InteractiveConsole</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">raw_input</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prompt</span><span class="o">=</span><span class="s2">&quot;&gt;&gt;&gt;&quot;</span><span class="p">):</span>
@@ -269,24 +321,8 @@
<span class="n">FixedInteractiveConsole</span><span class="p">(</span><span class="n">locs</span><span class="p">)</span><span class="o">.</span><span class="n">interact</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">get_kernel_modules</span><span class="p">():</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">is_wow_64</span><span class="p">:</span>
<span class="k">return</span> <span class="n">get_kernel_modules_syswow64</span><span class="p">()</span>
<span class="n">cbsize</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySystemInformation</span><span class="p">(</span><span class="n">SystemModuleInformation</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">cbsize</span><span class="p">))</span>
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="p">(</span><span class="n">cbsize</span><span class="o">.</span><span class="n">value</span> <span class="o">*</span> <span class="n">c_char</span><span class="p">)()</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">SYSTEM_MODULE_INFORMATION</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySystemInformation</span><span class="p">(</span><span class="n">SystemModuleInformation</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">),</span> <span class="n">sizeof</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">cbsize</span><span class="p">))</span>
<span class="n">modules</span> <span class="o">=</span> <span class="p">(</span><span class="n">SYSTEM_MODULE</span> <span class="o">*</span> <span class="n">buffer</span><span class="o">.</span><span class="n">ModulesCount</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">addressof</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span> <span class="o">+</span> <span class="n">SYSTEM_MODULE_INFORMATION</span><span class="o">.</span><span class="n">Modules</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">modules</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_kernel_modules_syswow64</span><span class="p">():</span>
<span class="n">cbsize</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">syswow64</span><span class="o">.</span><span class="n">NtQuerySystemInformation_32_to_64</span><span class="p">(</span><span class="n">SystemModuleInformation</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">cbsize</span><span class="p">))</span>
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="p">(</span><span class="n">cbsize</span><span class="o">.</span><span class="n">value</span> <span class="o">*</span> <span class="n">c_char</span><span class="p">)()</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">SYSTEM_MODULE_INFORMATION64</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">))</span>
<span class="n">windows</span><span class="o">.</span><span class="n">syswow64</span><span class="o">.</span><span class="n">NtQuerySystemInformation_32_to_64</span><span class="p">(</span><span class="n">SystemModuleInformation</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">),</span> <span class="n">sizeof</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">cbsize</span><span class="p">))</span>
<span class="n">modules</span> <span class="o">=</span> <span class="p">(</span><span class="n">SYSTEM_MODULE64</span> <span class="o">*</span> <span class="n">buffer</span><span class="o">.</span><span class="n">ModulesCount</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">addressof</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span> <span class="o">+</span> <span class="n">SYSTEM_MODULE_INFORMATION64</span><span class="o">.</span><span class="n">Modules</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">modules</span><span class="p">)</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;get_kernel_modules() will be removed: use windows.system.modules instead&quot;</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">modules</span>
<span class="k">class</span> <span class="nc">FileStreamInformation</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_STREAM_INFORMATION</span><span class="p">):</span>
<span class="nd">@property</span>
@@ -331,7 +367,7 @@
<span class="p">}</span>
<span class="k">def</span> <span class="nf">query_file_information</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">file_info_class</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">int_types</span><span class="p">):</span>
<span class="n">file_or_handle</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_handle_from_file</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">)</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">file_or_handle</span>
<span class="n">io_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IO_STATUS_BLOCK</span><span class="p">()</span>
@@ -341,7 +377,6 @@
<span class="k">try</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryInformationFile</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">pinfo</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">info</span><span class="p">),</span> <span class="n">FileInformationClass</span><span class="o">=</span><span class="n">file_info_class</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">STATUS_BUFFER_OVERFLOW</span><span class="p">:</span>
<span class="k">raise</span>
<span class="c1"># STATUS_BUFFER_OVERFLOW -&gt; Guess we have a FILE_NAME_INFORMATION somewhere that need a bigger buffer</span>
@@ -358,9 +393,64 @@
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryInformationFile</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">full_size</span><span class="p">,</span> <span class="n">FileInformationClass</span><span class="o">=</span><span class="n">file_info_class</span><span class="p">)</span>
<span class="n">pinfo</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">POINTER</span><span class="p">(</span><span class="n">ntqueryinformationfile_info_structs</span><span class="p">[</span><span class="n">file_info_class</span><span class="p">]))</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">pinfo</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># return list of ADS if FileStreamInformation ?</span>
<span class="k">return</span> <span class="n">info</span>
<span class="k">class</span> <span class="nc">EAInfo</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_FULL_EA_INFORMATION</span><span class="p">):</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LPCSTR</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">EaName</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">value_addr</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">EaName</span><span class="o">.</span><span class="n">offset</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">EaNameLength</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># +1 -&gt; Name \x00</span>
<span class="k">return</span> <span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_char</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">EaValueLength</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">value_addr</span><span class="p">)[:]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># NextEntryOffset is Relative to our current offset</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># First entry</span>
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_b_base_</span><span class="o">.</span><span class="n">_raw_buffer_</span>
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_buffer_</span>
<span class="n">curoffset</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_raw_buffer_offset_&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">new</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">,</span> <span class="n">curoffset</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span><span class="p">)</span>
<span class="c1"># Keep the underlying buffer easily accessible</span>
<span class="n">new</span><span class="o">.</span><span class="n">_raw_buffer_</span> <span class="o">=</span> <span class="n">raw_buffer</span>
<span class="n">new</span><span class="o">.</span><span class="n">_raw_buffer_offset_</span> <span class="o">=</span> <span class="n">curoffset</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">NextEntryOffset</span>
<span class="k">return</span> <span class="n">new</span>
<span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="bp">self</span><span class="p">:</span>
<span class="k">yield</span> <span class="bp">self</span>
<span class="bp">self</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> name=&quot;</span><span class="si">{1}</span><span class="s1">&quot;&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">MAXIMUM_EA_SIZE</span> <span class="o">=</span> <span class="mh">0x0000ffff</span>
<span class="k">def</span> <span class="nf">query_extended_attributes</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
<span class="n">file_or_handle</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">get_handle_from_file</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">)</span>
<span class="c1"># Check EaSize</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">query_file_information</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FileEaInformation</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">EaSize</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">io_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IO_STATUS_BLOCK</span><span class="p">()</span>
<span class="c1"># Handle Win10 / Win7</span>
<span class="c1"># Saw on Win10 -&gt; EaSize &gt; MAXIMUM_EA_SIZE</span>
<span class="c1"># Saw on Win7 -&gt; EaSize not enought (STATUS_BUFFER_OVERFLOW)</span>
<span class="n">buffsize</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">MAXIMUM_EA_SIZE</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">EaSize</span><span class="p">)</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">EAInfo</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">buffsize</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryEaFile</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">io_status</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">buffsize</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
@@ -380,7 +470,7 @@
<span class="c1"># TODO: FileFsDriverPathInformation</span>
<span class="c1"># TODO: Extended FILE_FS_VOLUME_INFORMATION that can read the real value of &#39;VolumeLabel&#39;</span>
<span class="k">def</span> <span class="nf">query_volume_information</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">volume_info_class</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">pycompat</span><span class="o">.</span><span class="n">int_types</span><span class="p">):</span>
<span class="n">file_or_handle</span> <span class="o">=</span> <span class="n">get_handle_from_file</span><span class="p">(</span><span class="n">file_or_handle</span><span class="p">)</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">file_or_handle</span>
<span class="n">io_status</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IO_STATUS_BLOCK</span><span class="p">()</span>
@@ -412,6 +502,18 @@
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">generated_def</span><span class="o">.</span><span class="n">ntstatus</span><span class="o">.</span><span class="n">NtStatusException</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
<span class="n">_WINERROR_BY_VALUE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">winerror</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
<span class="k">global</span> <span class="n">_WINERROR_BY_VALUE</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_WINERROR_BY_VALUE</span><span class="p">:</span> <span class="c1"># Lazy init</span>
<span class="n">_WINERROR_BY_VALUE</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FlagMapper</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">gdef</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span> <span class="k">for</span> <span class="n">error</span> <span class="ow">in</span> <span class="n">gdef</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">errors</span><span class="p">))</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">_WINERROR_BY_VALUE</span><span class="p">[</span><span class="n">code</span><span class="p">]</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="n">code</span><span class="p">:</span> <span class="c1"># Not found</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">_WINERROR_BY_VALUE</span><span class="p">[</span><span class="n">code</span> <span class="o">&amp;</span> <span class="mh">0xffff</span><span class="p">]</span> <span class="c1"># Hresult: extract code (https://en.wikipedia.org/wiki/HRESULT)</span>
<span class="k">return</span> <span class="n">val</span>
<div class="viewcode-block" id="get_long_path"><a class="viewcode-back" href="../../../utils.html#windows.utils.get_long_path">[docs]</a><span class="k">def</span> <span class="nf">get_long_path</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the long path form for ``path``.</span>
@@ -421,12 +523,8 @@
<span class="sd"> :returns: :class:`str` | :obj:`unicode` -- same type as ``path`` parameter</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">unicode</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="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetLongPathNameW</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">else</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="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetLongPathNameA</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_unicode_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetLongPathNameW</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">rsize</span><span class="p">]</span></div>
@@ -439,12 +537,8 @@
<span class="sd"> :returns: :class:`str` | :obj:`unicode` -- same type as ``path`` parameter</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">unicode</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="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetShortPathNameW</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">else</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="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetShortPathNameA</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_unicode_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetShortPathNameW</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">rsize</span><span class="p">]</span></div>
<span class="k">def</span> <span class="nf">dospath_to_ntpath</span><span class="p">(</span><span class="n">dospath</span><span class="p">):</span>
@@ -453,12 +547,16 @@
<span class="k">return</span> <span class="n">ustring</span><span class="o">.</span><span class="n">str</span>
<span class="k">def</span> <span class="nf">get_shared_mapping</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mh">0x1000</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get_shared_mapping</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">INVALID_HANDLE_VALUE</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mh">0x1000</span><span class="p">):</span>
<span class="c1"># TODO: real code</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateFileMappingA</span><span class="p">(</span><span class="n">INVALID_HANDLE_VALUE</span><span class="p">,</span> <span class="n">dwMaximumSizeLow</span><span class="o">=</span><span class="n">size</span><span class="p">,</span> <span class="n">lpName</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateFileMappingA</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">dwMaximumSizeLow</span><span class="o">=</span><span class="n">size</span><span class="p">,</span> <span class="n">lpName</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">MapViewOfFile</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="n">dwNumberOfBytesToMap</span><span class="o">=</span><span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">addr</span>
<span class="k">def</span> <span class="nf">create_file</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">access</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">GENERIC_READ</span><span class="p">,</span> <span class="n">share</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_SHARE_READ</span><span class="p">,</span> <span class="n">security</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">creation</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">OPEN_EXISTING</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">FILE_ATTRIBUTE_NORMAL</span><span class="p">):</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CreateFileA</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">access</span><span class="p">,</span> <span class="n">share</span><span class="p">,</span> <span class="n">security</span><span class="p">,</span> <span class="n">creation</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1">#def mapfile(file):</span>
<span class="c1"># fhandle = get_handle_from_file(file)</span>
<span class="c1"># h = windows.winproxy.CreateFileMappingA(fhandle, None, PAGE_READONLY, 0, 1, None)</span>
+367 -17
View File
@@ -45,6 +45,7 @@
<span class="kn">import</span> <span class="nn">windows</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</span> <span class="k">import</span> <span class="n">winproxy</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">int_types</span>
<span class="c1"># Helpers</span>
@@ -89,8 +90,19 @@
<span class="n">publishinfo</span> <span class="o">=</span> <span class="n">generate_query_function</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">EvtGetPublisherMetadataProperty</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">EvtHandle</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EVT_HANDLE</span><span class="p">):</span>
<span class="c1"># Class attribute function</span>
<span class="c1"># Will pass (self) as first parameter (binding)</span>
<span class="c1"># No need to pass any param to close ourself :)</span>
<span class="n">_close_function</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">EvtClose</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_function</span><span class="p">()</span>
<span class="c1"># Class high-level API</span>
<div class="viewcode-block" id="EvtQuery"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EvtQuery">[docs]</a><span class="k">class</span> <span class="nc">EvtQuery</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EVT_HANDLE</span><span class="p">):</span>
<div class="viewcode-block" id="EvtQuery"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EvtQuery">[docs]</a><span class="k">class</span> <span class="nc">EvtQuery</span><span class="p">(</span><span class="n">EvtHandle</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Represent an Event-log query&quot;&quot;&quot;</span>
<span class="n">TIMEOUT</span> <span class="o">=</span> <span class="mh">0x1000</span>
@@ -109,11 +121,23 @@
<span class="k">raise</span> <span class="ne">StopIteration</span>
<span class="k">raise</span>
<span class="k">assert</span> <span class="n">ret</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">event</span>
<span class="k">return</span> <span class="n">event</span>
<span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">seek_flags</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">seek_flags</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">position</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">seek_flags</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtSeekRelativeToFirst</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># -1 + EvtSeekRelativeToLast will give us the last 2 events</span>
<span class="c1"># So passing (-1, None) will give us the last event only</span>
<span class="c1"># If user do not want this calcul it can directly pass seek_flags</span>
<span class="n">seek_flags</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtSeekRelativeToLast</span>
<span class="n">position</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">EvtSeek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">seek_flags</span><span class="p">)</span>
<span class="nb">next</span> <span class="o">=</span> <span class="fm">__next__</span> <span class="c1"># Yep.. real name is &#39;next&#39; in Py2 :D</span>
<div class="viewcode-block" id="EvtQuery.all"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EvtQuery.all">[docs]</a> <span class="k">def</span> <span class="nf">all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># SqlAlchemy like :)</span>
@@ -131,7 +155,9 @@
<span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span></div></div>
<div class="viewcode-block" id="EvtEvent"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EvtEvent">[docs]</a><span class="k">class</span> <span class="nc">EvtEvent</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EVT_HANDLE</span><span class="p">):</span>
<div class="viewcode-block" id="EvtEvent"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EvtEvent">[docs]</a><span class="k">class</span> <span class="nc">EvtEvent</span><span class="p">(</span><span class="n">EvtHandle</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;An Event log&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">channel</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">EvtEvent</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
@@ -199,7 +225,7 @@
<span class="n">pwstr_rarray</span> <span class="o">=</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">LPWSTR</span> <span class="o">*</span> <span class="n">nbelt</span><span class="p">)(</span><span class="o">*</span><span class="n">pwstr_values</span><span class="p">)</span>
<span class="c1"># https://msdn.microsoft.com/en-us/library/windows/desktop/aa385352(v=vs.85).aspx</span>
<span class="c1"># An array of XPath expressions that uniquely identify a node or attribute in the event that you want to render.</span>
<span class="c1"># Each value wil return 1 node :)</span>
<span class="c1"># Each value will return 1 node :)</span>
<span class="n">ctx</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">EvtCreateRenderContext</span><span class="p">(</span><span class="n">nbelt</span><span class="p">,</span> <span class="n">pwstr_rarray</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtRenderContextValues</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtRenderEventValues</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
@@ -271,9 +297,14 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># What about classic channels where there is no event_metadata ?</span>
<span class="c1"># Return a dict with [0-1-2-3-4] as key ? raise ?</span>
<span class="c1"># Juste use the render_xml ?</span>
<span class="n">event_data_name</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">event_data</span> <span class="k">if</span> <span class="n">i</span><span class="p">[</span><span class="s2">&quot;type&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;data&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span><span class="n">v</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">zip</span><span class="p">(</span><span class="n">event_data_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">event_values</span><span class="p">())}</span>
<span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span><span class="n">v</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">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">event_data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">event_values</span><span class="p">())}</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">date</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Event.time_created as a datetime&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">datetime_from_filetime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">time_created</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">creation_time</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">datetime_from_filetime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">time_created</span><span class="p">)</span>
@@ -333,6 +364,27 @@
<span class="n">v</span> <span class="o">=</span> <span class="n">v</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">Count</span><span class="p">]</span>
<span class="k">return</span> <span class="n">v</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_value</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">vtype</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Guess type</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">):</span>
<span class="n">vtype</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtVarTypeUInt64</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="n">vtype</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtVarTypeString</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;LATER&quot;</span><span class="p">)</span>
<span class="bp">self</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">()</span>
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="c1"># Yolo test :)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ImprovedEVT_VARIANT</span><span class="p">,</span> <span class="n">ImprovedEVT_VARIANT</span><span class="p">)</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">vtype</span><span class="p">)</span>
<span class="c1"># super(ImprovedEVT_VARIANT, self).Type = vtype</span>
<span class="n">attrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">VALUE_MAPPER</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">Type</span><span class="p">]</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attrname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">Type</span> <span class="ow">in</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtVarTypeBinary</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtVarTypeString</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">Count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&lt;</span><span class="si">{0}</span><span class="s2"> of type=</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="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Type</span><span class="p">)</span>
@@ -388,7 +440,7 @@
<span class="k">if</span> <span class="n">ids</span> <span class="ow">and</span> <span class="nb">filter</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;&lt;ids&gt; and &lt;filter&gt; are mutually exclusive&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ids</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="p">(</span><span class="n">long</span><span class="p">,</span> <span class="nb">int</span><span class="p">)):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">int_types</span><span class="p">):</span>
<span class="n">ids</span> <span class="o">=</span> <span class="p">(</span><span class="n">ids</span><span class="p">,)</span>
<span class="n">ids_filter</span> <span class="o">=</span> <span class="s2">&quot; or &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;EventID=</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="nb">id</span><span class="p">)</span> <span class="k">for</span> <span class="nb">id</span> <span class="ow">in</span> <span class="n">ids</span><span class="p">)</span>
<span class="nb">filter</span> <span class="o">=</span> <span class="s2">&quot;Event/System[</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">ids_filter</span><span class="p">)</span>
@@ -451,7 +503,7 @@
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;Cannot retrieve the configuration of an EvtFile&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="ChannelConfig"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.ChannelConfig">[docs]</a><span class="k">class</span> <span class="nc">ChannelConfig</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EVT_HANDLE</span><span class="p">):</span>
<div class="viewcode-block" id="ChannelConfig"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.ChannelConfig">[docs]</a><span class="k">class</span> <span class="nc">ChannelConfig</span><span class="p">(</span><span class="n">EvtHandle</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The configuration of a event channel&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ChannelConfig</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
@@ -471,6 +523,15 @@
<span class="s2">&quot;TEST&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">EvtPublisher</span><span class="p">(</span><span class="n">pub</span><span class="p">)</span> <span class="k">for</span> <span class="n">pub</span> <span class="ow">in</span> <span class="n">chaninfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtChannelPublisherList</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">]</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">keywords</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">chaninfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtChannelPublishingConfigKeywords</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">enabled</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">chaninfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtChannelConfigEnabled</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">classic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;``True`` if the channel is a classic event channel (for example the Application or System log)&quot;&quot;&quot;</span>
@@ -479,6 +540,130 @@
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> &quot;</span><span class="si">{1}</span><span class="s1">&quot;&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span></div>
<span class="k">class</span> <span class="nc">PublisherMetadataChannel</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pub_metadata</span><span class="p">,</span> <span class="n">channel_id</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PublisherMetadataChannel</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span> <span class="o">=</span> <span class="n">pub_metadata</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_id</span> <span class="o">=</span> <span class="n">channel_id</span>
<span class="k">def</span> <span class="nf">_query_channel_metadata_property</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">propertyid</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span><span class="o">.</span><span class="n">chanrefs</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">propertyid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_id</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">flags</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_channel_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataChannelReferenceFlags</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_channel_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataChannelReferencePath</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_channel_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataChannelReferenceID</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_channel_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataChannelReferenceIndex</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_channel_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataChannelReferenceMessageID</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">PublisherMetadataLevel</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pub_metadata</span><span class="p">,</span> <span class="n">channel_id</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PublisherMetadataLevel</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span> <span class="o">=</span> <span class="n">pub_metadata</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_id</span> <span class="o">=</span> <span class="n">channel_id</span>
<span class="k">def</span> <span class="nf">_query_level_metadata_property</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">propertyid</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span><span class="o">.</span><span class="n">levelrefs</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">propertyid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_id</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_level_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataLevelName</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_level_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataLevelValue</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_level_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataLevelMessageID</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">PublisherMetadataOpcode</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pub_metadata</span><span class="p">,</span> <span class="n">channel_id</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PublisherMetadataOpcode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span> <span class="o">=</span> <span class="n">pub_metadata</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_id</span> <span class="o">=</span> <span class="n">channel_id</span>
<span class="k">def</span> <span class="nf">_query_opcode_metadata_property</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">propertyid</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span><span class="o">.</span><span class="n">opcoderefs</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">propertyid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_id</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_opcode_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataOpcodeName</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_opcode_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataOpcodeValue</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_opcode_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataOpcodeMessageID</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">PublisherMetadataKeyword</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pub_metadata</span><span class="p">,</span> <span class="n">channel_id</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PublisherMetadataKeyword</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span> <span class="o">=</span> <span class="n">pub_metadata</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_id</span> <span class="o">=</span> <span class="n">channel_id</span>
<span class="k">def</span> <span class="nf">_query_keyword_metadata_property</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">propertyid</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span><span class="o">.</span><span class="n">keywordrefs</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">propertyid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_id</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_keyword_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataKeywordName</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_keyword_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataKeywordValue</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_keyword_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataKeywordMessageID</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">PublisherMetadataTask</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pub_metadata</span><span class="p">,</span> <span class="n">channel_id</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PublisherMetadataTask</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span> <span class="o">=</span> <span class="n">pub_metadata</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_id</span> <span class="o">=</span> <span class="n">channel_id</span>
<span class="k">def</span> <span class="nf">_query_keyword_metadata_property</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">propertyid</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pub_metadata</span><span class="o">.</span><span class="n">taskrefs</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">propertyid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_id</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_keyword_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataTaskName</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_keyword_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataTaskValue</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">event_guid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_query_keyword_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataTaskEventGuid</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_query_keyword_metadata_property</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataTaskMessageID</span><span class="p">))</span>
<div class="viewcode-block" id="EvtPublisher"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EvtPublisher">[docs]</a><span class="k">class</span> <span class="nc">EvtPublisher</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;An Event provider&quot;&quot;&quot;</span>
@@ -497,7 +682,7 @@
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> &quot;</span><span class="si">{1}</span><span class="s1">&quot;&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span></div>
<div class="viewcode-block" id="PublisherMetadata"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.PublisherMetadata">[docs]</a><span class="k">class</span> <span class="nc">PublisherMetadata</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EVT_HANDLE</span><span class="p">):</span>
<div class="viewcode-block" id="PublisherMetadata"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.PublisherMetadata">[docs]</a><span class="k">class</span> <span class="nc">PublisherMetadata</span><span class="p">(</span><span class="n">EvtHandle</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The metadata about an event provider&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PublisherMetadata</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
@@ -508,6 +693,14 @@
<span class="sd">&quot;&quot;&quot;The :class:`PublisherMetadata` for the publisher ``name``&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">EvtOpenPublisherMetadata</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">name</span><span class="p">)</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">guid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The GUID associated with this provider</span>
<span class="sd"> :type: [:class:`GUID`] -- the GUID in a XXXXXXXXXX-YYYY-ZZZZ-TTTT-VVVVVVVVVV form</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataPublisherGuid</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">chanrefs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Identifies the channels child element of the provider.</span>
@@ -516,6 +709,78 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">PropertyArray</span><span class="p">(</span><span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataChannelReferences</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">levelrefs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Identifies the levels child element of the provider.</span>
<span class="sd"> :type: :class:`PropertyArray`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">PropertyArray</span><span class="p">(</span><span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataLevels</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">opcoderefs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Identifies the opcodes child element of the provider.</span>
<span class="sd"> :type: :class:`PropertyArray`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">PropertyArray</span><span class="p">(</span><span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataOpcodes</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">keywordrefs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The list of keywords defined by this provider</span>
<span class="sd"> :type: :class:`PropertyArray`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">PropertyArray</span><span class="p">(</span><span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataKeywords</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">taskrefs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The list of tasks defined by this provider</span>
<span class="sd"> :type: :class:`PropertyArray`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">PropertyArray</span><span class="p">(</span><span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataTasks</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">channels_metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The :class:`PublisherMetadataChannel` for each channel this provider defines</span>
<span class="sd"> :yield: :class:`PublisherMetadataChannel`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">PublisherMetadataChannel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">chanrefs</span><span class="o">.</span><span class="n">size</span><span class="p">)]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">levels_metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The :class:`PublisherMetadataLevel` for each level this provider defines</span>
<span class="sd"> :yield: :class:`PublisherMetadataLevel`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">PublisherMetadataLevel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">levelrefs</span><span class="o">.</span><span class="n">size</span><span class="p">)]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">opcodes_metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The :class:`PublisherMetadataOpcode` for each opcode this provider defines</span>
<span class="sd"> :yield: :class:`PublisherMetadataOpcode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">PublisherMetadataOpcode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">opcoderefs</span><span class="o">.</span><span class="n">size</span><span class="p">)]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">tasks_metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The :class:`PublisherMetadataTask` for each opcode this provider defines</span>
<span class="sd"> :yield: :class:`PublisherMetadataTask`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">PublisherMetadataTask</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">taskrefs</span><span class="o">.</span><span class="n">size</span><span class="p">)]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">keywords_metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The :class:`PublisherMetadataKeyword` for each opcode this provider defines</span>
<span class="sd"> :yield: :class:`PublisherMetadataKeyword`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">PublisherMetadataKeyword</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">keywordrefs</span><span class="o">.</span><span class="n">size</span><span class="p">)]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">events_metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The :class:`EventMetadata` for each event this provider defines</span>
@@ -570,6 +835,31 @@
<span class="k">raise</span>
<span class="k">return</span> <span class="n">sbuff</span><span class="o">.</span><span class="n">value</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataPublisherMessageID</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_filepath</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataMessageFilePath</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_resource_filepath</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataResourceFilePath</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_parameter_filepath</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">publishinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EvtPublisherMetadataParameterFilePath</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> &quot;</span><span class="si">{1}</span><span class="s1">&quot;&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span></div>
@@ -585,7 +875,7 @@
<span class="k">def</span> <span class="nf">property</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
<span class="k">return</span> <span class="n">arrayproperty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">index</span><span class="p">)</span><span class="o">.</span><span class="n">value</span></div>
<div class="viewcode-block" id="EventMetadata"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EventMetadata">[docs]</a><span class="k">class</span> <span class="nc">EventMetadata</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">EVT_HANDLE</span><span class="p">):</span>
<div class="viewcode-block" id="EventMetadata"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EventMetadata">[docs]</a><span class="k">class</span> <span class="nc">EventMetadata</span><span class="p">(</span><span class="n">EvtHandle</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The Metadata about a given Event type</span>
@@ -595,7 +885,14 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The ID of the Event&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventID</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="c1"># https://docs.microsoft.com/en-us/windows/desktop/wes/eventschema-systempropertiestype-complextype</span>
<span class="c1"># Qualifiers:</span>
<span class="c1"># A legacy provider uses a 32-bit number to identify its events.</span>
<span class="c1"># If the event is logged by a legacy provider, the value of EventID</span>
<span class="c1"># element contains the low-order 16 bits of the event identifier and the</span>
<span class="c1"># Qualifier attribute contains the high-order 16 bits of the event identifier.</span>
<span class="c1"># [Question] Only true for legacy provider / channels ??</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventID</span><span class="p">)</span><span class="o">.</span><span class="n">value</span> <span class="o">&amp;</span> <span class="mh">0xffff</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -604,9 +901,29 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">channel_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The the Channel attribute of the Event definition&quot;&quot;&quot;</span>
<span class="sd">&quot;&quot;&quot;The Channel attribute of the Event definition&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventChannel</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">keyword</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The keyword attribute of the Event definition&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventKeyword</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">opcode</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The opcode attribute of the Event definition&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventOpcode</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">level</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The level attribute of the Event definition&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventLevel</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">task</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The task attribute of the Event definition&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventTask</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Identifies the message attribute of the event definition.&quot;&quot;&quot;</span>
@@ -617,19 +934,52 @@
<span class="sd">&quot;&quot;&quot;Identifies the template attribute of the event definition which is an XML string&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">eventinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">EventMetadataEventTemplate</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
<span class="k">def</span> <span class="nf">_parse_event_template_data_element</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;data&quot;</span><span class="p">}</span>
<span class="n">res</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="n">res</span><span class="p">[</span><span class="s2">&quot;inType&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">&quot;inType&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="n">res</span><span class="p">[</span><span class="s2">&quot;outType&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">&quot;outType&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="n">count</span> <span class="o">=</span> <span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;count&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">count</span><span class="p">:</span>
<span class="n">res</span><span class="p">[</span><span class="s2">&quot;count&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">count</span><span class="o">.</span><span class="n">value</span>
<span class="n">length</span> <span class="o">=</span> <span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;length&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">length</span><span class="p">:</span>
<span class="n">res</span><span class="p">[</span><span class="s2">&quot;length&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">length</span><span class="o">.</span><span class="n">value</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">_parse_event_template_struct_element</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;struct&quot;</span><span class="p">}</span>
<span class="n">res</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="n">res</span><span class="p">[</span><span class="s2">&quot;fields&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_event_template_data_element</span><span class="p">(</span><span class="n">elt</span><span class="p">)</span> <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="n">element</span><span class="o">.</span><span class="n">childNodes</span> <span class="k">if</span> <span class="n">elt</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">==</span> <span class="n">elt</span><span class="o">.</span><span class="n">ELEMENT_NODE</span><span class="p">]</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">_event_data_generator</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">template</span><span class="p">):</span>
<span class="n">xmldoc</span> <span class="o">=</span> <span class="n">xml</span><span class="o">.</span><span class="n">dom</span><span class="o">.</span><span class="n">minidom</span><span class="o">.</span><span class="n">parseString</span><span class="p">(</span><span class="n">template</span><span class="p">)</span>
<span class="n">xmltemplate</span> <span class="o">=</span> <span class="n">xmldoc</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;template&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="p">(</span><span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">xmltemplate</span><span class="o">.</span><span class="n">childNodes</span> <span class="k">if</span> <span class="n">n</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">==</span> <span class="n">n</span><span class="o">.</span><span class="n">ELEMENT_NODE</span><span class="p">):</span>
<span class="k">if</span> <span class="n">element</span><span class="o">.</span><span class="n">tagName</span> <span class="o">==</span> <span class="s2">&quot;data&quot;</span><span class="p">:</span>
<span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_event_template_data_element</span><span class="p">(</span><span class="n">element</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">element</span><span class="o">.</span><span class="n">tagName</span> <span class="o">==</span> <span class="s2">&quot;struct&quot;</span><span class="p">:</span>
<span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_event_template_struct_element</span><span class="p">(</span><span class="n">element</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unexpected XML element &lt;</span><span class="si">{0}</span><span class="s2">&gt; in event template&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">element</span><span class="o">.</span><span class="n">tagName</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">event_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The list of attribute specifique for this event.</span>
<span class="sd"> Retrieved by parsing :data:`EventMetadata.template`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">template</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">template</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{}</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_event_data_generator</span><span class="p">(</span><span class="n">template</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">yolo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">template</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">template</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">xmltemplate</span> <span class="o">=</span> <span class="n">xml</span><span class="o">.</span><span class="n">dom</span><span class="o">.</span><span class="n">minidom</span><span class="o">.</span><span class="n">parseString</span><span class="p">(</span><span class="n">template</span><span class="p">)</span>
<span class="k">for</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">xmltemplate</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">):</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">attributes</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span></div>
<span class="k">return</span> <span class="n">xmltemplate</span></div>
<div class="viewcode-block" id="EvtlogManager"><a class="viewcode-back" href="../../../evtlog.html#windows.winobject.event_log.EvtlogManager">[docs]</a><span class="k">class</span> <span class="nc">EvtlogManager</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+1 -1
View File
@@ -325,7 +325,7 @@
<span class="sd"> temporary workaround or horrible hack ? choose your side</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="n">nb_qword</span> <span class="o">=</span> <span class="p">(</span><span class="n">size</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</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">ULONGLONG</span><span class="p">)</span>
<span class="n">nb_qword</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">size</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</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">ULONGLONG</span><span class="p">))</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="p">(</span><span class="n">nb_qword</span> <span class="o">*</span> <span class="n">ULONGLONG</span><span class="p">)()</span>
<span class="n">struct_address</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">struct_address</span> <span class="o">&amp;</span> <span class="mh">0xf</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">]:</span>
+94 -38
View File
@@ -43,15 +43,11 @@
<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.generated_def</span> <span class="k">import</span> <span class="n">windef</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="c1"># Remove this ?</span>
<span class="k">class</span> <span class="nc">EPUBLIC_OBJECT_TYPE_INFORMATION</span><span class="p">(</span><span class="n">PUBLIC_OBJECT_TYPE_INFORMATION</span><span class="p">):</span>
<span class="k">pass</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="n">current_process_pid</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getpid</span><span class="p">()</span>
<div class="viewcode-block" id="Handle"><a class="viewcode-back" href="../../../handle.html#windows.winobject.handle.Handle">[docs]</a><span class="k">class</span> <span class="nc">Handle</span><span class="p">(</span><span class="n">SYSTEM_HANDLE</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">BaseSystemHandle</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A handle of the system&quot;&quot;&quot;</span>
<span class="nd">@windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -62,6 +58,15 @@
<span class="c1"># return [p for p in windows.system.processes if p.pid == self.dwProcessId][0]</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">dwProcessId</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">pid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">dwProcessId</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wValue</span>
<span class="nd">@windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The name of the handle</span>
@@ -83,35 +88,33 @@
<span class="k">def</span> <span class="nf">_get_object_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">lh</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_handle</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">yyy</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="mh">0x1000</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">ObjectNameInformation</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">yyy</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">yyy</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_needed</span><span class="p">))</span>
<span class="k">return</span> <span class="n">LSA_UNICODE_STRING</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">yyy</span><span class="p">[:</span><span class="n">size_needed</span><span class="o">.</span><span class="n">value</span><span class="p">])</span><span class="o">.</span><span class="n">str</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ObjectNameInformation</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">yyy</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">yyy</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_needed</span><span class="p">))</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LSA_UNICODE_STRING</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">yyy</span><span class="p">[:</span><span class="n">size_needed</span><span class="o">.</span><span class="n">value</span><span class="p">])</span><span class="o">.</span><span class="n">str</span>
<span class="k">def</span> <span class="nf">_get_object_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">lh</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_handle</span>
<span class="n">xxx</span> <span class="o">=</span> <span class="n">EPUBLIC_OBJECT_TYPE_INFORMATION</span><span class="p">()</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">xxx</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PUBLIC_OBJECT_TYPE_INFORMATION</span><span class="p">()</span>
<span class="n">size_needed</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">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">ObjectTypeInformation</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">xxx</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">xxx</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_needed</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ObjectTypeInformation</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">xxx</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">xxx</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_needed</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">code</span> <span class="o">!=</span> <span class="n">STATUS_INFO_LENGTH_MISMATCH</span><span class="p">:</span>
<span class="c1"># print(&quot;ERROR WITH {0:x}&quot;.format(lh))</span>
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">code</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">STATUS_INFO_LENGTH_MISMATCH</span><span class="p">:</span>
<span class="k">raise</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">size_needed</span><span class="o">.</span><span class="n">value</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">ObjectTypeInformation</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</span><span class="p">))</span>
<span class="n">xxx</span> <span class="o">=</span> <span class="n">EPUBLIC_OBJECT_TYPE_INFORMATION</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ObjectTypeInformation</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</span><span class="p">))</span>
<span class="n">xxx</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PUBLIC_OBJECT_TYPE_INFORMATION</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="k">return</span> <span class="n">xxx</span><span class="o">.</span><span class="n">TypeName</span><span class="o">.</span><span class="n">str</span>
<span class="k">def</span> <span class="nf">_get_object_basic_infos</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="n">lh</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_handle</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">basic_infos</span> <span class="o">=</span> <span class="n">PUBLIC_OBJECT_BASIC_INFORMATION</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">ObjectBasicInformation</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">basic_infos</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">basic_infos</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_needed</span><span class="p">))</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">basic_infos</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PUBLIC_OBJECT_BASIC_INFORMATION</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="n">lh</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ObjectBasicInformation</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">basic_infos</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">basic_infos</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_needed</span><span class="p">))</span>
<span class="k">return</span> <span class="n">basic_infos</span>
<span class="c1">#PUBLIC_OBJECT_BASIC_INFORMATION</span>
<span class="nd">@windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">local_handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -120,8 +123,8 @@
<span class="sd"> :type: :class:`int`&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">dwProcessId</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">pid</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wValue</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">HANDLE</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">DuplicateHandle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">wValue</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">handle</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">res</span><span class="p">),</span> <span class="n">dwOptions</span><span class="o">=</span><span class="n">DUPLICATE_SAME_ACCESS</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">HANDLE</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">DuplicateHandle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">wValue</span><span class="p">,</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">handle</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">res</span><span class="p">),</span> <span class="n">dwOptions</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">DUPLICATE_SAME_ACCESS</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span><span class="o">.</span><span class="n">value</span>
<span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -150,30 +153,83 @@
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">dwProcessId</span> <span class="o">==</span> <span class="n">current_process_pid</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_local_handle&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CloseHandle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_local_handle</span><span class="p">)</span></div>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CloseHandle</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_local_handle</span><span class="p">)</span>
<div class="viewcode-block" id="Handle"><a class="viewcode-back" href="../../../handle.html#windows.winobject.handle.Handle">[docs]</a><span class="k">class</span> <span class="nc">Handle</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_HANDLE</span><span class="p">,</span> <span class="n">BaseSystemHandle</span><span class="p">):</span>
<span class="k">pass</span></div>
<span class="k">class</span> <span class="nc">HandleWow64</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_HANDLE64</span><span class="p">,</span> <span class="n">BaseSystemHandle</span><span class="p">):</span>
<span class="k">pass</span> <span class="c1"># For wow64 process</span>
<span class="k">def</span> <span class="nf">enumerate_handles</span><span class="p">():</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">ULONG</span><span class="p">()</span>
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">is_wow_64</span><span class="p">:</span>
<span class="k">return</span> <span class="n">enumerate_handles_syswow64</span><span class="p">()</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">()</span>
<span class="c1"># Should at least be sizeof(gdef.SYSTEM_HANDLE_INFORMATION)</span>
<span class="n">tmp_buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_HANDLE_INFORMATION</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">NtQuerySystemInformation</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySystemInformation</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SystemHandleInformation</span><span class="p">,</span> <span class="n">tmp_buffer</span><span class="p">,</span> <span class="n">tmp_buffer</span><span class="o">.</span><span class="n">real_size</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</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">pass</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">size_needed</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="mh">0x1000</span> <span class="c1"># In case we have some more handle created</span>
<span class="n">buf</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">SYSTEM_HANDLE_INFORMATION</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">size</span><span class="p">)</span>
<span class="n">size_needed</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySystemInformation</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SystemHandleInformation</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">buf</span><span class="o">.</span><span class="n">real_size</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</span><span class="p">))</span>
<span class="n">handle_array</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">resized_array</span><span class="p">(</span><span class="n">buf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Handles</span><span class="p">,</span> <span class="n">buf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">HandleCount</span><span class="p">,</span> <span class="n">Handle</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">handle_array</span><span class="p">)</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">size_needed</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="mh">0x1000</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">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">NtQuerySystemInformation</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</span><span class="p">))</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">SYSTEM_HANDLE_INFORMATION</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">_GENERATED_SYSTEM_HANDLE_INFORMATION</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">Structure</span><span class="p">):</span>
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">(</span><span class="s2">&quot;HandleCount&quot;</span><span class="p">,</span> <span class="n">ULONG</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;Handles&quot;</span><span class="p">,</span> <span class="n">Handle</span> <span class="o">*</span> <span class="n">x</span><span class="o">.</span><span class="n">HandleCount</span><span class="p">),</span>
<span class="p">]</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">_GENERATED_SYSTEM_HANDLE_INFORMATION</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">buffer</span><span class="p">[:</span><span class="n">size_needed</span><span class="o">.</span><span class="n">value</span><span class="p">])</span><span class="o">.</span><span class="n">Handles</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">enumerate_handles_syswow64</span><span class="p">():</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">()</span>
<span class="c1"># Should at least be sizeof(gdef.SYSTEM_HANDLE_INFORMATION)</span>
<span class="n">tmp_buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_HANDLE_INFORMATION64</span><span class="p">)()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">syswow64</span><span class="o">.</span><span class="n">NtQuerySystemInformation_32_to_64</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SystemHandleInformation</span><span class="p">,</span> <span class="n">tmp_buffer</span><span class="p">,</span> <span class="n">tmp_buffer</span><span class="o">.</span><span class="n">real_size</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</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">pass</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">size_needed</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="mh">0x1000</span> <span class="c1"># In case we have some more handle created</span>
<span class="n">buf</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">SYSTEM_HANDLE_INFORMATION64</span><span class="p">)(</span><span class="n">size</span><span class="o">=</span><span class="n">size</span><span class="p">)</span>
<span class="n">size_needed</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">windows</span><span class="o">.</span><span class="n">syswow64</span><span class="o">.</span><span class="n">NtQuerySystemInformation_32_to_64</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SystemHandleInformation</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">buf</span><span class="o">.</span><span class="n">real_size</span><span class="p">,</span> <span class="n">ReturnLength</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</span><span class="p">))</span>
<span class="n">handle_array</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">resized_array</span><span class="p">(</span><span class="n">buf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Handles</span><span class="p">,</span> <span class="n">buf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">HandleCount</span><span class="p">,</span> <span class="n">HandleWow64</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">handle_array</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">enumerate_type</span><span class="p">():</span>
<span class="s2">&quot;WIP: DO NOT USE&quot;</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">fsize</span> <span class="o">=</span> <span class="mi">8</span>
<span class="n">fbuffer</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">fsize</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">NtQueryObject</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ObjectTypesInformation</span><span class="p">,</span> <span class="n">fbuffer</span><span class="p">,</span> <span class="n">fsize</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_needed</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">code</span> <span class="o">!=</span> <span class="n">STATUS_INFO_LENGTH_MISMATCH</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># We had enought memory ?</span>
<span class="k">return</span>
<span class="c1"># Looks like the Wow64 syscall emulation is broken :D</span>
<span class="c1"># It write AFTER the buffer if we are a wow64 process :D</span>
<span class="c1"># So better allocate a standalone buffer (triggering a ACCESS_VIOLATION) that corrupting the heap</span>
<span class="c1"># This is a worst case scenario, as we allocation more space it should not happen !</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">size_needed</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="mh">0x200</span>
<span class="n">size_needed</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">with</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">allocated_memory</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PAGE_READWRITE</span><span class="p">)</span> <span class="k">as</span> <span class="n">buffer_base</span><span class="p">:</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQueryObject</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ObjectTypesInformation</span><span class="p">,</span> <span class="n">buffer_base</span><span class="p">,</span> <span class="n">size</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_needed</span><span class="p">))</span>
<span class="c1"># Cache some exceptions ?</span>
<span class="c1"># Parse the buffer data in-place as string are addr-dependant</span>
<span class="n">types_info</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">OBJECT_TYPES_INFORMATION</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">buffer_base</span><span class="p">)</span>
<span class="n">offset</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">gdef</span><span class="o">.</span><span class="n">PVOID</span><span class="p">)</span> <span class="c1"># Looks like the size of the struct is PTR aligned as the struct is follower by other stuff</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">types_info</span><span class="o">.</span><span class="n">NumberOfTypes</span><span class="p">):</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PUBLIC_OBJECT_TYPE_INFORMATION</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">buffer_base</span> <span class="o">+</span> <span class="n">offset</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">info</span>
<span class="n">offset</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">gdef</span><span class="o">.</span><span class="n">PUBLIC_OBJECT_TYPE_INFORMATION</span><span class="p">)</span> <span class="o">+</span> <span class="n">info</span><span class="o">.</span><span class="n">TypeName</span><span class="o">.</span><span class="n">MaximumLength</span>
<span class="k">if</span> <span class="n">offset</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">gdef</span><span class="o">.</span><span class="n">PVOID</span><span class="p">):</span>
<span class="n">offset</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">gdef</span><span class="o">.</span><span class="n">PVOID</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">offset</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">gdef</span><span class="o">.</span><span class="n">PVOID</span><span class="p">))</span>
<span class="c1"># End-of ctx-manager</span>
<span class="k">return</span>
</pre></div>
</div>
@@ -57,7 +57,7 @@
<span class="n">obj_attr</span><span class="o">.</span><span class="n">SecurityQualityOfService</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">HANDLE</span><span class="p">()</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">NtOpenSymbolicLinkObject</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DIRECTORY_QUERY</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">READ_CONTROL</span> <span class="p">,</span> <span class="n">obj_attr</span><span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LSA_UNICODE_STRING</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">LSA_UNICODE_STRING</span><span class="o">.</span><span class="n">from_size</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySymbolicLinkObject</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span> <span class="c1"># Handle Buffer-too-small ?</span>
<span class="k">return</span> <span class="n">v</span><span class="o">.</span><span class="n">str</span>
@@ -65,7 +65,7 @@
<div class="viewcode-block" id="KernelObject"><a class="viewcode-back" href="../../../object_manager.html#windows.winobject.object_manager.KernelObject">[docs]</a><span class="k">class</span> <span class="nc">KernelObject</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Represent an object in the Object Manager namespace&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">path</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">if</span> <span class="n">path</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">):</span>
@@ -216,8 +216,7 @@
<span class="k">elif</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">:</span> <span class="c1"># Ask for root ? return ourself</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="c1"># Strip the leading \ and go to normal case</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
@@ -226,6 +225,7 @@
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">code</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">STATUS_OBJECT_TYPE_MISMATCH</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="s2">&quot;Could not find object &lt;</span><span class="si">{0}</span><span class="s2">&gt; under &lt;</span><span class="si">{1}</span><span class="s2">&gt; because it is a &lt;</span><span class="si">{2}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">part</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="k">raise</span> <span class="c1"># Something smart to do ?</span>
<span class="k">return</span> <span class="n">obj</span></div></div>
+57 -12
View File
@@ -66,7 +66,9 @@
<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">apisetmap</span>
<span class="kn">from</span> <span class="nn">windows.winobject</span> <span class="k">import</span> <span class="n">token</span>
<span class="kn">from</span> <span class="nn">windows</span> <span class="k">import</span> <span class="n">security</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">raw_encode</span><span class="p">,</span> <span class="n">raw_decode</span>
<span class="n">TimeInfo</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;TimeInfo&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;creation&quot;</span><span class="p">,</span> <span class="s2">&quot;exit&quot;</span><span class="p">,</span> <span class="s2">&quot;kernel&quot;</span><span class="p">,</span> <span class="s2">&quot;user&quot;</span><span class="p">])</span>
<span class="sd">&quot;&quot;&quot;Time information about a process&quot;&quot;&quot;</span>
@@ -183,12 +185,12 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_code</span> <span class="o">!=</span> <span class="n">STILL_ACTIVE</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span> <span class="nf">allocated_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">allocated_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">prot</span><span class="o">=</span><span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;ContextManager to allocate memory and free it</span>
<span class="sd"> :type: :class:`int` -- the address of the allocated memory</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">addr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">addr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">virtual_alloc</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">prot</span><span class="o">=</span><span class="n">prot</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">addr</span>
<span class="k">finally</span><span class="p">:</span>
@@ -394,11 +396,11 @@
<span class="n">read_size</span> <span class="o">=</span> <span class="n">read_size</span> <span class="o">/</span> <span class="mi">2</span>
<span class="k">continue</span>
<span class="n">readden</span> <span class="o">+=</span> <span class="n">read_size</span>
<span class="k">if</span> <span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">x</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">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">x</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">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">break</span>
<span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">read_wstring</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Read a windows UTF16 string at ``addr``&quot;&quot;&quot;</span>
@@ -415,15 +417,19 @@
<span class="c1"># handle read_wstring at end of page</span>
<span class="c1"># Of read failed: read only the half of size</span>
<span class="c1"># read_size must remain a multiple of 2</span>
<span class="n">read_size</span> <span class="o">=</span> <span class="n">read_size</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">read_size</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">read_size</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">readden</span> <span class="o">+=</span> <span class="n">read_size</span>
<span class="n">utf16_chars</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="nb">iter</span><span class="p">(</span><span class="n">x</span><span class="p">)]</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)]</span>
<span class="k">if</span> <span class="s2">&quot;</span><span class="se">\x00\x00</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">utf16_chars</span><span class="p">:</span>
<span class="n">res</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">utf16_chars</span><span class="p">[:</span><span class="n">utf16_chars</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00\x00</span><span class="s2">&quot;</span><span class="p">)])</span>
<span class="c1"># Bytearray will work on py2 &amp; py3</span>
<span class="c1"># Py2: bytearray((0, 0)) == b&quot;\x00\x00&quot;</span>
<span class="c1"># Py2: bytearray((0, 0)) == b&quot;\x00\x00&quot;</span>
<span class="n">utf16_chars</span> <span class="o">=</span> <span class="p">[</span><span class="nb">bytearray</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="nb">iter</span><span class="p">(</span><span class="n">x</span><span class="p">)]</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)]</span>
<span class="k">if</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00\x00</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">utf16_chars</span><span class="p">:</span>
<span class="c1"># Translate bytearray to str/bytes for both py2 &amp; py3</span>
<span class="n">res</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">bytes</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">utf16_chars</span><span class="p">[:</span><span class="n">utf16_chars</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00\x00</span><span class="s2">&quot;</span><span class="p">)])</span>
<span class="k">break</span>
<span class="n">res</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf16&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf16&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">write_byte</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">byte</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;write a byte at ``addr``&quot;&quot;&quot;</span>
@@ -510,6 +516,38 @@
<span class="n">token</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">open_token</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;The process :class:`~windows.winobject.token.Token`&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_security_descriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">DEFAULT_SECURITY_INFORMATION</span><span class="p">):</span>
<span class="n">open_flags</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">READ_CONTROL</span>
<span class="k">if</span> <span class="n">query_sacl</span><span class="p">:</span>
<span class="n">open_flags</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ACCESS_SYSTEM_SECURITY</span>
<span class="n">tmp_handle</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">OpenProcess</span><span class="p">(</span><span class="n">open_flags</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_handle</span><span class="p">(</span><span class="n">tmp_handle</span><span class="p">,</span> <span class="n">query_sacl</span><span class="o">=</span><span class="n">query_sacl</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span><span class="p">,</span> <span class="n">obj_type</span><span class="o">=</span><span class="s2">&quot;process&quot;</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CloseHandle</span><span class="p">(</span><span class="n">tmp_handle</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_security_descriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sd</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">sd</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="n">sd</span> <span class="o">=</span> <span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">sd</span><span class="p">)</span>
<span class="n">open_flags</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">WRITE_OWNER</span> <span class="o">|</span> <span class="n">gdef</span><span class="o">.</span><span class="n">WRITE_DAC</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sd</span><span class="o">.</span><span class="n">sacl</span> <span class="ow">and</span>
<span class="nb">any</span><span class="p">(</span><span class="n">ace</span><span class="o">.</span><span class="n">Header</span><span class="o">.</span><span class="n">AceType</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MANDATORY_LABEL_ACE_TYPE</span> <span class="k">for</span> <span class="n">ace</span> <span class="ow">in</span> <span class="n">sd</span><span class="o">.</span><span class="n">sacl</span><span class="p">)):</span>
<span class="c1"># Print error if requested but no SecurityPrivilege ?</span>
<span class="n">open_flags</span> <span class="o">|=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ACCESS_SYSTEM_SECURITY</span>
<span class="n">tmp_handle</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">OpenProcess</span><span class="p">(</span><span class="n">open_flags</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sd</span><span class="o">.</span><span class="n">_apply_to_handle_and_type</span><span class="p">(</span><span class="n">tmp_handle</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SE_KERNEL_OBJECT</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CloseHandle</span><span class="p">(</span><span class="n">tmp_handle</span><span class="p">)</span>
<span class="n">security_descriptor</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_security_descriptor</span><span class="p">,</span> <span class="n">set_security_descriptor</span><span class="p">)</span>
<span class="nd">@property</span> <span class="c1"># Document ?</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="n">pid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span>
<span class="k">return</span> <span class="p">[</span><span class="n">h</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">handles</span> <span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">dwProcessId</span> <span class="o">==</span> <span class="n">pid</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Process</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__del__</span><span class="p">()</span>
<span class="c1"># Same logic that AutoHandle.__del__ for Process.limited_handle</span>
@@ -625,6 +663,11 @@
<span class="k">def</span> <span class="nf">_get_handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetCurrentProcess</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">limited_handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetCurrentProcess</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
@@ -668,6 +711,7 @@
<div class="viewcode-block" id="CurrentProcess.write_memory"><a class="viewcode-back" href="../../../process.html#windows.winobject.process.CurrentProcess.write_memory">[docs]</a> <span class="k">def</span> <span class="nf">write_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Write data at addr&quot;&quot;&quot;</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">raw_encode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="c1"># buffertype = (c_char * len(data)).from_address(addr)</span>
<span class="c1"># buffertype[:len(data)] = data</span>
<span class="n">ctypes</span><span class="o">.</span><span class="n">memmove</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
@@ -1003,13 +1047,13 @@
<span class="k">pass</span>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> &quot;</span><span class="si">{1}</span><span class="s1">&quot; pid </span><span class="si">{2}</span><span class="s1"> at </span><span class="si">{3}</span><span class="s1">&gt;&#39;</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="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">exe_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)))</span>
<div class="viewcode-block" id="WinProcess.virtual_alloc"><a class="viewcode-back" href="../../../process.html#windows.winobject.process.WinProcess.virtual_alloc">[docs]</a> <span class="k">def</span> <span class="nf">virtual_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">prot</span><span class="o">=</span><span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">):</span>
<div class="viewcode-block" id="WinProcess.virtual_alloc"><a class="viewcode-back" href="../../../process.html#windows.winobject.process.WinProcess.virtual_alloc">[docs]</a> <span class="k">def</span> <span class="nf">virtual_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">prot</span><span class="o">=</span><span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">,</span> <span class="n">addr</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Allocate memory in the process</span>
<span class="sd"> :return: The address of the allocated memory</span>
<span class="sd"> :rtype: :class:`int`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">VirtualAllocEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">dwSize</span><span class="o">=</span><span class="n">size</span><span class="p">,</span> <span class="n">flProtect</span><span class="o">=</span><span class="n">prot</span><span class="p">)</span></div>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">VirtualAllocEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">lpAddress</span><span class="o">=</span><span class="n">addr</span><span class="p">,</span> <span class="n">dwSize</span><span class="o">=</span><span class="n">size</span><span class="p">,</span> <span class="n">flProtect</span><span class="o">=</span><span class="n">prot</span><span class="p">)</span></div>
<div class="viewcode-block" id="WinProcess.virtual_free"><a class="viewcode-back" href="../../../process.html#windows.winobject.process.WinProcess.virtual_free">[docs]</a> <span class="k">def</span> <span class="nf">virtual_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Free memory in the process by virtual_alloc&quot;&quot;&quot;</span>
@@ -1017,6 +1061,7 @@
<div class="viewcode-block" id="WinProcess.write_memory"><a class="viewcode-back" href="../../../process.html#windows.winobject.process.WinProcess.write_memory">[docs]</a> <span class="k">def</span> <span class="nf">write_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Write `data` at `addr`&quot;&quot;&quot;</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">raw_encode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">bitness</span> <span class="o">==</span> <span class="mi">32</span> <span class="ow">and</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">if</span> <span class="ow">not</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">is_implemented</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">NtWow64WriteVirtualMemory64</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;NtWow64WriteVirtualMemory64 non available in ntdll: cannot write into 64bits processus&quot;</span><span class="p">)</span>
+240 -44
View File
@@ -37,13 +37,33 @@
<div class="body" role="main">
<h1>Source code for windows.winobject.registry</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">_winreg</span>
<span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">itertools</span>
<span class="kn">import</span> <span class="nn">struct</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">namedtuple</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">namedtuple</span><span class="p">,</span> <span class="n">defaultdict</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">from</span> <span class="nn">windows.generated_def.windef</span> <span class="k">import</span> <span class="n">KEY_READ</span><span class="p">,</span> <span class="n">REG_QWORD</span>
<span class="kn">from</span> <span class="nn">windows.dbgprint</span> <span class="k">import</span> <span class="n">dbgprint</span>
<span class="kn">import</span> <span class="nn">windows.generated_def</span> <span class="k">as</span> <span class="nn">gdef</span>
<span class="kn">from</span> <span class="nn">windows</span> <span class="k">import</span> <span class="n">winproxy</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">basestring</span><span class="p">,</span> <span class="n">int_types</span><span class="p">,</span> <span class="n">is_py3</span>
<span class="n">WENCODING</span> <span class="o">=</span> <span class="s2">&quot;utf-16-le&quot;</span>
<span class="c1"># So _winreg does not handle unicode stuff in Py2 :(</span>
<span class="c1"># Need to rewrite everything to get it working with unicode</span>
<span class="k">class</span> <span class="nc">WinRegistryKey</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">HKEY</span><span class="p">):</span>
<span class="n">_close_function</span> <span class="o">=</span> <span class="nb">staticmethod</span><span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">RegCloseKey</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="n">sys</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># Late shutdown (not sur winproxy is still up)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="p">:</span> <span class="c1"># Not NULL handle ?</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;Closing registry key handle </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="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">),</span> <span class="s1">&#39;REGISTRY&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_function</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
@@ -55,7 +75,107 @@
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etype</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">tb</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="n">etype</span> <span class="o">==</span> <span class="ne">WindowsError</span> <span class="ow">and</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">errornumber</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="n">etype</span> <span class="ow">in</span> <span class="p">(</span><span class="n">winproxy</span><span class="o">.</span><span class="n">WinproxyError</span><span class="p">,</span> <span class="ne">WindowsError</span><span class="p">)</span> <span class="ow">and</span> <span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">errornumber</span><span class="p">)</span>
<span class="c1"># Translation reg-buffer &lt;-&gt; python methodes</span>
<span class="k">def</span> <span class="nf">Reg2Py_QWORD</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="k">return</span> <span class="n">buffer</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">PULONG64</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">Py2Reg_QWORD</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;&lt;Q&quot;</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Reg2Py_DWORD</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="c1"># Check size ?</span>
<span class="k">return</span> <span class="n">buffer</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">LPDWORD</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">Py2Reg_DWORD</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;&lt;I&quot;</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Reg2Py_DWORD_BIG_ENDIAN</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="c1"># Check size ?</span>
<span class="k">return</span> <span class="p">(</span><span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">24</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">buffer</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">buffer</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="n">buffer</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">Py2Reg_DWORD_BIG_ENDIAN</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;&gt;I&quot;</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Reg2Py_BINARY</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="nb">bytearray</span><span class="p">(</span><span class="n">buffer</span><span class="p">[:</span><span class="n">size</span><span class="p">]))</span>
<span class="k">def</span> <span class="nf">Py2Reg_BINARY</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="c1"># latin-1 encoding if py3 &amp; type is str ?</span>
<span class="k">return</span> <span class="n">obj</span>
<span class="k">def</span> <span class="nf">Reg2Py_SZ</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="c1"># Buffer is UTF16. buffer is extended-buffer</span>
<span class="k">if</span> <span class="n">size</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;&quot;</span>
<span class="k">if</span> <span class="n">buffer</span><span class="p">[</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">buffer</span><span class="p">[</span><span class="n">size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># NULL TERMINATED: EASY</span>
<span class="k">return</span> <span class="n">buffer</span><span class="o">.</span><span class="n">as_wstring</span><span class="p">()</span>
<span class="c1"># Not null terminated: keep last byte</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">size</span> <span class="o">%</span> <span class="mi">2</span>
<span class="k">return</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">WCHAR</span> <span class="o">*</span> <span class="p">(</span><span class="n">size</span> <span class="o">//</span> <span class="mi">2</span><span class="p">))</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">buffer</span><span class="p">)[:]</span>
<span class="k">def</span> <span class="nf">Py2Reg_SZ</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">return</span> <span class="n">obj</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">WENCODING</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Reg2Py_Multi_SZ</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">size</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="c1"># Simple path</span>
<span class="k">if</span> <span class="n">is_py3</span><span class="p">:</span>
<span class="n">rawstr</span> <span class="o">=</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">rawstr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">size</span><span class="p">]])</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">unistr</span> <span class="o">=</span> <span class="n">rawstr</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">WENCODING</span><span class="p">)</span>
<span class="k">return</span> <span class="n">unistr</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1"># Complexe-path</span>
<span class="c1"># This is not some valide UTF-16</span>
<span class="c1"># Try our best to extract some stuff from raw</span>
<span class="k">return</span> <span class="n">rawstr</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Py2Reg_Multi_SZ</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="c1"># Work on encoded values (to prevent str/unicode errors)</span>
<span class="n">uni_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">WENCODING</span><span class="p">)</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">obj</span><span class="p">]</span>
<span class="c1"># Separate by UTF-16 NULL BYTE (2 \x00)</span>
<span class="n">uni_str</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00\x00</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">uni_list</span><span class="p">)</span>
<span class="c1"># Add UTF-16 NULL byte for final string + final UTF-16 \x00 (4 \x00)</span>
<span class="k">return</span> <span class="n">uni_str</span> <span class="o">+</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00\x00\x00\x00</span><span class="s2">&quot;</span>
<span class="n">DECODE_METHOD</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">ENCODE_METHOD</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">KNOWN_ENCODE_DECODE_METHODS</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_SZ</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_SZ</span><span class="p">,</span> <span class="n">Py2Reg_SZ</span><span class="p">),</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_EXPAND_SZ</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_SZ</span><span class="p">,</span> <span class="n">Py2Reg_SZ</span><span class="p">),</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_MULTI_SZ</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_Multi_SZ</span><span class="p">,</span> <span class="n">Py2Reg_Multi_SZ</span><span class="p">),</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_DWORD</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_DWORD</span><span class="p">,</span> <span class="n">Py2Reg_DWORD</span><span class="p">),</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_DWORD_BIG_ENDIAN</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_DWORD_BIG_ENDIAN</span><span class="p">,</span> <span class="n">Py2Reg_DWORD_BIG_ENDIAN</span><span class="p">),</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_QWORD</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_QWORD</span><span class="p">,</span> <span class="n">Py2Reg_QWORD</span><span class="p">),</span>
<span class="c1"># Binary formats</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_LINK</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_BINARY</span><span class="p">,</span> <span class="n">Py2Reg_BINARY</span><span class="p">),</span> <span class="c1"># TESTING</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_BINARY</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_BINARY</span><span class="p">,</span> <span class="n">Py2Reg_BINARY</span><span class="p">),</span>
<span class="n">gdef</span><span class="o">.</span><span class="n">REG_NONE</span><span class="p">:</span> <span class="p">(</span><span class="n">Reg2Py_BINARY</span><span class="p">,</span> <span class="n">Py2Reg_BINARY</span><span class="p">),</span>
<span class="p">}</span>
<span class="c1"># All unknown format are seens as binary data</span>
<span class="n">UNKNOWM_FORMAT</span> <span class="o">=</span> <span class="p">(</span><span class="n">Reg2Py_BINARY</span><span class="p">,</span> <span class="n">Py2Reg_BINARY</span><span class="p">)</span>
<span class="n">ENCODE_DECODE_METHODS</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">UNKNOWM_FORMAT</span><span class="p">,</span> <span class="n">KNOWN_ENCODE_DECODE_METHODS</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">decode_registry_buffer</span><span class="p">(</span><span class="nb">type</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">ENCODE_DECODE_METHODS</span><span class="p">[</span><span class="nb">type</span><span class="p">][</span><span class="n">DECODE_METHOD</span><span class="p">](</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="c1"># Best effort if any decoding error happen</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">size</span><span class="p">])</span>
<span class="n">KeyValue</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;KeyValue&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="p">,</span> <span class="s2">&quot;type&quot;</span><span class="p">])</span>
@@ -64,7 +184,7 @@
<div class="viewcode-block" id="PyHKey"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.PyHKey">[docs]</a><span class="k">class</span> <span class="nc">PyHKey</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A windows registry key&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surkey</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sam</span><span class="o">=</span><span class="n">KEY_READ</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surkey</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sam</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surkey</span> <span class="o">=</span> <span class="n">surkey</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fullname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">fullname</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">name</span>
@@ -75,27 +195,46 @@
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;PyHKey &quot;</span><span class="si">{0}</span><span class="s1">&quot;&gt;&#39;</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">fullname</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_open_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sam</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">WinRegistryKey</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">RegOpenKeyExW</span><span class="p">(</span><span class="n">handle</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">sam</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;Opening registry key &lt;</span><span class="si">{0}</span><span class="s2">&gt; (handle=</span><span class="si">{1:#x}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">value</span><span class="p">),</span> <span class="s2">&quot;REGISTRY&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span> <span class="nf">_create_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sam</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">WinRegistryKey</span><span class="p">()</span>
<span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">RegCreateKeyExW</span><span class="p">(</span><span class="n">parent</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="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">sam</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">dbgprint</span><span class="p">(</span><span class="sa">u</span><span class="s2">&quot;Creating registry key &lt;</span><span class="si">{0}</span><span class="s2">&gt; (handle=</span><span class="si">{1:#x}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">value</span><span class="p">),</span> <span class="s2">&quot;REGISTRY&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">phkey</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span> <span class="o">=</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">OpenKeyEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sam</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sam</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">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span><span class="p">,</span> <span class="s2">&quot;Could not open registry key &lt;</span><span class="si">{0}</span><span class="s2">&gt; (</span><span class="si">{1}</span><span class="s2">)&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">fullname</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">exists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Best way todo ?</span>
<span class="c1"># TODO: document</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># May have been deleted in between</span>
<span class="c1"># So &lt;self._phkey&gt; tells use nothing</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span><span class="p">:</span> <span class="c1"># Not None + pointer not NULL</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_key_size_info</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_KEY_DELETED</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">tmpphkey</span> <span class="o">=</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">OpenKeyEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">tmpphkey</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</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">return</span> <span class="kc">False</span>
<span class="n">_winreg</span><span class="o">.</span><span class="n">CloseKey</span><span class="p">(</span><span class="n">tmpphkey</span><span class="p">)</span>
<span class="c1"># tmpphkey will be garbage collected and auto-closed</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="nd">@property</span>
@@ -105,32 +244,70 @@
<span class="sd"> :type: [:class:`PyHKey`] - A list of keys&quot;&quot;&quot;</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">with</span> <span class="n">ExpectWindowsError</span><span class="p">(</span><span class="mi">259</span><span class="p">):</span>
<span class="n">default_name_size</span> <span class="o">=</span> <span class="mi">256</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">name_size</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">default_name_size</span><span class="p">)</span>
<span class="n">name_buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">create_unicode_buffer</span><span class="p">(</span><span class="n">name_size</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">count</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">_winreg</span><span class="o">.</span><span class="n">EnumKey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span>
<span class="n">name_size</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">default_name_size</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">RegEnumKeyExW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">name_buffer</span><span class="p">,</span> <span class="n">name_size</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</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">name_buffer</span><span class="p">[:</span><span class="n">name_size</span><span class="o">.</span><span class="n">value</span><span class="p">])</span> <span class="c1"># Will allow key name with \x00 inside</span>
<span class="k">return</span> <span class="p">[</span><span class="n">PyHKey</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">res</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">get_key_size_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">max_name_len</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">max_value_len</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">RegQueryInfoKeyW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">max_name_len</span><span class="p">,</span> <span class="n">max_value_len</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="n">max_name_len</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">max_value_len</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The values of the registry key</span>
<span class="sd"> :type: [:class:`KeyValue`] - A list of values&quot;&quot;&quot;</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># Get max info keys</span>
<span class="n">max_name_size</span><span class="p">,</span> <span class="n">max_data_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_key_size_info</span><span class="p">()</span>
<span class="c1"># Null terminators</span>
<span class="n">max_name_size</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">max_data_size</span> <span class="o">+=</span> <span class="mi">2</span>
<span class="k">with</span> <span class="n">ExpectWindowsError</span><span class="p">(</span><span class="mi">259</span><span class="p">):</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="n">name_value_type</span> <span class="o">=</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">EnumValue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="c1"># _winreg doest not support REG_QWORD in python2</span>
<span class="c1"># See http://bugs.python.org/issue23026</span>
<span class="k">if</span> <span class="n">name_value_type</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">REG_QWORD</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">name_value_type</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">value</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">&quot;&lt;Q&quot;</span><span class="p">,</span> <span class="n">name_value_type</span><span class="p">[</span><span class="mi">1</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">type</span> <span class="o">=</span> <span class="n">name_value_type</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="n">name_value_type</span> <span class="o">=</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="nb">type</span>
<span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name_value_type</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[</span><span class="n">KeyValue</span><span class="p">(</span><span class="o">*</span><span class="n">r</span><span class="p">)</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">res</span><span class="p">]</span>
<span class="n">value_type</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">namesize</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">max_name_size</span><span class="p">)</span>
<span class="n">keyname</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">namesize</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">datasize</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">max_data_size</span><span class="p">)</span>
<span class="n">databuffer</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">BYTE</span><span class="p">,</span> <span class="n">nbelt</span><span class="o">=</span><span class="n">datasize</span><span class="o">.</span><span class="n">value</span><span class="p">)()</span>
<span class="c1"># A value can have been added in-between.</span>
<span class="c1"># So recheck the size given by get_key_size_info :)</span>
<span class="k">while</span> <span class="kc">True</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">RegEnumValueW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">keyname</span><span class="p">,</span> <span class="n">namesize</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">value_type</span><span class="p">,</span> <span class="n">databuffer</span><span class="p">,</span> <span class="n">datasize</span><span class="p">)</span>
<span class="k">break</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="c1"># Update the sizes / buffers &amp; try again :)</span>
<span class="n">max_name_size</span><span class="p">,</span> <span class="n">max_data_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_key_size_info</span><span class="p">()</span>
<span class="n">max_name_size</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">max_data_size</span> <span class="o">+=</span> <span class="mi">2</span>
<span class="n">namesize</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">max_name_size</span><span class="p">)</span>
<span class="n">keyname</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">namesize</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">datasize</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">max_data_size</span><span class="p">)</span>
<span class="n">databuffer</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">BYTE</span><span class="p">,</span> <span class="n">nbelt</span><span class="o">=</span><span class="n">datasize</span><span class="o">.</span><span class="n">value</span><span class="p">)()</span>
<span class="n">vobj</span> <span class="o">=</span> <span class="n">decode_registry_buffer</span><span class="p">(</span><span class="n">value_type</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">databuffer</span><span class="p">,</span> <span class="n">datasize</span><span class="o">.</span><span class="n">value</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">KeyValue</span><span class="p">(</span><span class="n">keyname</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">vobj</span><span class="p">,</span> <span class="n">value_type</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="k">return</span> <span class="n">res</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">QueryInfoKey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">)</span>
<span class="c1"># Need other stuff ?</span>
<span class="n">nb_key</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">nb_values</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">last_modif</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">FILETIME</span><span class="p">()</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">RegQueryInfoKeyW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">nb_key</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">nb_values</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">last_modif</span><span class="p">)</span>
<span class="k">return</span> <span class="n">nb_key</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">nb_values</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">last_modif</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">last_write</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -141,16 +318,28 @@
<span class="sd"> :rtype: :class:`KeyValue`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">value</span><span class="p">,</span> <span class="nb">type</span> <span class="o">=</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">QueryValueEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">value_name</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">type</span> <span class="o">==</span> <span class="n">REG_QWORD</span><span class="p">:</span>
<span class="n">value</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">&quot;&lt;Q&quot;</span><span class="p">,</span> <span class="n">value</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">KeyValue</span><span class="p">(</span><span class="n">value_name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span></div>
<span class="nb">type</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="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">0x100</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BYTE</span><span class="p">,</span> <span class="n">nbelt</span><span class="o">=</span><span class="n">size</span><span class="o">.</span><span class="n">value</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">RegQueryValueExW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">value_name</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">break</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">size</span><span class="o">.</span><span class="n">value</span> <span class="o">*=</span> <span class="mi">2</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BYTE</span><span class="p">,</span> <span class="n">nbelt</span><span class="o">=</span><span class="n">size</span><span class="o">.</span><span class="n">value</span><span class="p">)()</span>
<span class="k">continue</span>
<span class="n">vobj</span> <span class="o">=</span> <span class="n">decode_registry_buffer</span><span class="p">(</span><span class="nb">type</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">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="k">return</span> <span class="n">KeyValue</span><span class="p">(</span><span class="n">value_name</span><span class="p">,</span> <span class="n">vobj</span><span class="p">,</span> <span class="nb">type</span><span class="o">.</span><span class="n">value</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_guess_value_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">REG_SZ</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">REG_DWORD</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">REG_SZ</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">):</span>
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">REG_DWORD</span>
<span class="c1"># elif isinstance(value, (list, tuple)):</span>
<span class="c1"># if all(isinstance(v, basestring) in value):</span>
<span class="c1"># return _winreg.REG_MULTI_SZ</span>
@@ -161,13 +350,16 @@
<span class="sd">&quot;&quot;&quot;Set the value for ``name`` to ``value``. if ``type`` is None try to guess items&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_guess_value_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">type</span> <span class="o">==</span> <span class="n">REG_QWORD</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;&lt;Q&quot;</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">SetValueEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</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="nb">type</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span></div>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ENCODE_DECODE_METHODS</span><span class="p">[</span><span class="nb">type</span><span class="p">][</span><span class="n">ENCODE_METHOD</span><span class="p">](</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span> <span class="c1"># Should not be unicode at this point</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">BUFFER</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">BYTE</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer_copy</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">RegSetValueExW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</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="nb">type</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">buffer</span><span class="p">))</span></div>
<div class="viewcode-block" id="PyHKey.delete_value"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.PyHKey.delete_value">[docs]</a> <span class="k">def</span> <span class="nf">delete_value</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="sd">&quot;&quot;&quot;Delete the value with ``name``&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">DeleteValue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">RegDeleteValueW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div>
<div class="viewcode-block" id="PyHKey.open_subkey"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.PyHKey.open_subkey">[docs]</a> <span class="k">def</span> <span class="nf">open_subkey</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">sam</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
@@ -189,24 +381,28 @@
<div class="viewcode-block" id="PyHKey.create"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.PyHKey.create">[docs]</a> <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create the registry key&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span> <span class="o">=</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">CreateKeyEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sam</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phkey</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sam</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">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span><span class="p">,</span> <span class="s2">&quot;Could not create registry key &lt;</span><span class="si">{0}</span><span class="s2">&gt; (</span><span class="si">{1}</span><span class="s2">)&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">fullname</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="PyHKey.delete"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.PyHKey.delete">[docs]</a> <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Delete the registry key&quot;&quot;&quot;</span>
<span class="c1"># Allow a &#39;recursive&#39; param to empty before delete ?</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">_winreg</span><span class="o">.</span><span class="n">DeleteKeyEx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sam</span><span class="p">,</span> <span class="mi">0</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">RegDeleteKeyExW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surkey</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sam</span><span class="p">,</span> <span class="mi">0</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">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span><span class="p">,</span> <span class="s2">&quot;Could not delete registry key &lt;</span><span class="si">{0}</span><span class="s2">&gt; (</span><span class="si">{1}</span><span class="s2">)&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">fullname</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="k">def</span> <span class="nf">empty</span><span class="p">(</span><span class="bp">self</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">RegDeleteTreeW</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phkey</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<div class="viewcode-block" id="PyHKey.__setitem__"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.PyHKey.__setitem__">[docs]</a> <span class="k">def</span> <span class="nf">__setitem__</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">value</span><span class="p">):</span>
<span class="n">rtype</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">long</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">basestring</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">int_types</span><span class="p">)):</span>
<span class="n">value</span><span class="p">,</span> <span class="n">rtype</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">rtype</span><span class="p">)</span></div>
@@ -223,12 +419,12 @@
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="n">HKEY_LOCAL_MACHINE</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">_winreg</span><span class="o">.</span><span class="n">HKEY_LOCAL_MACHINE</span><span class="p">,</span> <span class="s2">&quot;HKEY_LOCAL_MACHINE&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_CLASSES_ROOT</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">_winreg</span><span class="o">.</span><span class="n">HKEY_CLASSES_ROOT</span><span class="p">,</span> <span class="s2">&quot;HKEY_CLASSES_ROOT&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">KEY_READ</span> <span class="p">)</span>
<span class="n">HKEY_CURRENT_USER</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">_winreg</span><span class="o">.</span><span class="n">HKEY_CURRENT_USER</span><span class="p">,</span> <span class="s2">&quot;HKEY_CURRENT_USER&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_DYN_DATA</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">_winreg</span><span class="o">.</span><span class="n">HKEY_DYN_DATA</span><span class="p">,</span> <span class="s2">&quot;HKEY_DYN_DATA&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_PERFORMANCE_DATA</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">_winreg</span><span class="o">.</span><span class="n">HKEY_PERFORMANCE_DATA</span><span class="p">,</span> <span class="s2">&quot;HKEY_PERFORMANCE_DATA&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_USERS</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">_winreg</span><span class="o">.</span><span class="n">HKEY_USERS</span><span class="p">,</span> <span class="s2">&quot;HKEY_USERS&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">_winreg</span><span class="o">.</span><span class="n">KEY_READ</span> <span class="p">)</span>
<span class="n">HKEY_LOCAL_MACHINE</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">HKEY_LOCAL_MACHINE</span><span class="p">,</span> <span class="s2">&quot;HKEY_LOCAL_MACHINE&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_CLASSES_ROOT</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">HKEY_CLASSES_ROOT</span><span class="p">,</span> <span class="s2">&quot;HKEY_CLASSES_ROOT&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span> <span class="p">)</span>
<span class="n">HKEY_CURRENT_USER</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">HKEY_CURRENT_USER</span><span class="p">,</span> <span class="s2">&quot;HKEY_CURRENT_USER&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_DYN_DATA</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">HKEY_DYN_DATA</span><span class="p">,</span> <span class="s2">&quot;HKEY_DYN_DATA&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_PERFORMANCE_DATA</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">HKEY_PERFORMANCE_DATA</span><span class="p">,</span> <span class="s2">&quot;HKEY_PERFORMANCE_DATA&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">)</span>
<span class="n">HKEY_USERS</span> <span class="o">=</span> <span class="n">PyHKey</span><span class="p">(</span><span class="n">DummyPHKEY</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">HKEY_USERS</span><span class="p">,</span> <span class="s2">&quot;HKEY_USERS&quot;</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span> <span class="p">)</span>
<div class="viewcode-block" id="Registry"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.Registry">[docs]</a><span class="k">class</span> <span class="nc">Registry</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
@@ -243,7 +439,7 @@
<span class="s2">&quot;HKEY_USERS&quot;</span> <span class="p">:</span> <span class="n">HKEY_USERS</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sam</span><span class="o">=</span><span class="n">KEY_READ</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sam</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">KEY_READ</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sam</span> <span class="o">=</span> <span class="n">sam</span>
<div class="viewcode-block" id="Registry.reopen"><a class="viewcode-back" href="../../../registry.html#windows.winobject.registry.Registry.reopen">[docs]</a> <span class="nd">@classmethod</span>
+102 -78
View File
@@ -46,14 +46,9 @@
<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.generated_def</span> <span class="k">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">windows</span> <span class="k">import</span> <span class="n">security</span>
<span class="n">SERVICE_TYPE</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">SERVICE_KERNEL_DRIVER</span><span class="p">,</span> <span class="n">SERVICE_FILE_SYSTEM_DRIVER</span><span class="p">,</span> <span class="n">SERVICE_WIN32_OWN_PROCESS</span><span class="p">,</span> <span class="n">SERVICE_WIN32_SHARE_PROCESS</span><span class="p">,</span> <span class="n">SERVICE_INTERACTIVE_PROCESS</span><span class="p">)</span>
<span class="n">SERVICE_STATE</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">SERVICE_STOPPED</span><span class="p">,</span> <span class="n">SERVICE_START_PENDING</span><span class="p">,</span> <span class="n">SERVICE_STOP_PENDING</span><span class="p">,</span> <span class="n">SERVICE_RUNNING</span><span class="p">,</span> <span class="n">SERVICE_CONTINUE_PENDING</span><span class="p">,</span> <span class="n">SERVICE_PAUSE_PENDING</span><span class="p">,</span> <span class="n">SERVICE_PAUSED</span><span class="p">)</span>
<span class="n">SERVICE_CONTROLE_ACCEPTED</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">SERVICE_FLAGS</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">SERVICE_RUNS_IN_SYSTEM_PROCESS</span><span class="p">)</span>
<span class="c1"># TODO: RM :)</span>
<span class="n">ServiceStatus</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;ServiceStatus&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;type&quot;</span><span class="p">,</span> <span class="s2">&quot;state&quot;</span><span class="p">,</span> <span class="s2">&quot;control_accepted&quot;</span><span class="p">,</span> <span class="s2">&quot;flags&quot;</span><span class="p">])</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">``type`` might be one of:</span>
@@ -81,82 +76,37 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="k">class</span> <span class="nc">Service</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">handle</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{0}</span><span class="s1"> &quot;</span><span class="si">{1}</span><span class="s1">&quot; </span><span class="si">{2}</span><span class="s1">&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">state</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">ServiceManager</span><span class="p">(</span><span class="n">utils</span><span class="o">.</span><span class="n">AutoHandle</span><span class="p">):</span>
<span class="n">_close_function</span> <span class="o">=</span> <span class="nb">staticmethod</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">CloseServiceHandle</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">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The name of the service</span>
<span class="k">def</span> <span class="nf">_get_handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">OpenSCManagerA</span><span class="p">(</span><span class="n">dwDesiredAccess</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">MAXIMUM_ALLOWED</span><span class="p">)</span>
<span class="sd"> :type: :class:`str`</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">lpServiceName</span>
<span class="k">def</span> <span class="nf">open_service</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">access</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">MAXIMUM_ALLOWED</span><span class="p">):</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">OpenServiceA</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">access</span><span class="p">)</span> <span class="c1"># Check service exists :)</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The description of the service</span>
<span class="k">def</span> <span class="nf">get_service</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">access</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">MAXIMUM_ALLOWED</span><span class="p">):</span>
<span class="n">handle</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_service</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">access</span><span class="p">)</span>
<span class="k">return</span> <span class="n">NewService</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">handle</span><span class="o">=</span><span class="n">handle</span><span class="p">)</span>
<span class="sd"> :type: :class:`str`</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">lpDisplayName</span>
<span class="fm">__getitem__</span> <span class="o">=</span> <span class="n">get_service</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">status</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The status of the service</span>
<span class="k">def</span> <span class="nf">get_service_display_name</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="c1"># This API is strange..</span>
<span class="c1"># Why can&#39;t we retrieve the display name for a service handle ?</span>
<span class="n">BUFFER_SIZE</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">(</span><span class="n">CHAR</span> <span class="o">*</span> <span class="n">BUFFER_SIZE</span><span class="p">)()</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="n">BUFFER_SIZE</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">GetServiceDisplayNameA</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">size_needed</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">value</span>
<span class="sd"> :type: :class:`ServiceStatus`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">status</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ServiceStatusProcess</span>
<span class="n">stype</span> <span class="o">=</span> <span class="n">SERVICE_TYPE</span><span class="p">[</span><span class="n">status</span><span class="o">.</span><span class="n">dwServiceType</span><span class="p">]</span>
<span class="n">sstate</span> <span class="o">=</span> <span class="n">SERVICE_STATE</span><span class="p">[</span><span class="n">status</span><span class="o">.</span><span class="n">dwCurrentState</span><span class="p">]</span>
<span class="n">scontrol</span> <span class="o">=</span> <span class="n">status</span><span class="o">.</span><span class="n">dwControlsAccepted</span>
<span class="n">sflags</span> <span class="o">=</span> <span class="n">SERVICE_FLAGS</span><span class="p">[</span><span class="n">status</span><span class="o">.</span><span class="n">dwServiceFlags</span><span class="p">]</span>
<span class="k">return</span> <span class="n">ServiceStatus</span><span class="p">(</span><span class="n">stype</span><span class="p">,</span> <span class="n">sstate</span><span class="p">,</span> <span class="n">scontrol</span><span class="p">,</span> <span class="n">sflags</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">process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The process running the service (if any)</span>
<span class="sd"> :type: :class:`WinProcess &lt;windows.winobject.process.WinProcess&gt;` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ServiceStatusProcess</span><span class="o">.</span><span class="n">dwProcessId</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">pid</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="n">pid</span><span class="p">)</span>
<span class="k">return</span> <span class="n">l</span>
<div class="viewcode-block" id="ServiceA"><a class="viewcode-back" href="../../../service.html#windows.winobject.service.ServiceA">[docs]</a><span class="k">class</span> <span class="nc">ServiceA</span><span class="p">(</span><span class="n">Service</span><span class="p">,</span> <span class="n">ENUM_SERVICE_STATUS_PROCESSA</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A Service object with ascii data&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">args</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;Start service with args != None&quot;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">scmanagera</span><span class="p">(</span><span class="n">SC_MANAGER_CONNECT</span><span class="p">)</span> <span class="k">as</span> <span class="n">scm</span><span class="p">:</span>
<span class="c1"># windows.winproxy.StartServiceA()</span>
<span class="n">servh</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">OpenServiceA</span><span class="p">(</span><span class="n">scm</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">SERVICE_START</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">StartServiceA</span><span class="p">(</span><span class="n">servh</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CloseServiceHandle</span><span class="p">(</span><span class="n">servh</span><span class="p">)</span></div>
<span class="nd">@contextmanager</span>
<span class="k">def</span> <span class="nf">scmanagera</span><span class="p">(</span><span class="n">access</span><span class="p">):</span>
<span class="c1"># scmanager = windows.winproxy.OpenSCManagerA(dwDesiredAccess=SC_MANAGER_ENUMERATE_SERVICE)</span>
<span class="n">scmanager</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">OpenSCManagerA</span><span class="p">(</span><span class="n">dwDesiredAccess</span><span class="o">=</span><span class="n">access</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">scmanager</span>
<span class="k">finally</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">CloseServiceHandle</span><span class="p">(</span><span class="n">scmanager</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">enumerate_services</span><span class="p">():</span>
<span class="k">with</span> <span class="n">scmanagera</span><span class="p">(</span><span class="n">SC_MANAGER_ENUMERATE_SERVICE</span><span class="p">)</span> <span class="k">as</span> <span class="n">scm</span><span class="p">:</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">nb_services</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="n">counter</span> <span class="o">=</span> <span class="n">DWORD</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_enumerate_services_generator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">nb_services</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">counter</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">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">EnumServicesStatusExA</span><span class="p">(</span><span class="n">scm</span><span class="p">,</span> <span class="n">SC_ENUM_PROCESS_INFO</span><span class="p">,</span> <span class="n">SERVICE_TYPE_ALL</span><span class="p">,</span> <span class="n">SERVICE_STATE_ALL</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</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">nb_services</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">counter</span><span class="p">),</span> <span class="kc">None</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">EnumServicesStatusExA</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">SC_ENUM_PROCESS_INFO</span><span class="p">,</span> <span class="n">SERVICE_TYPE_ALL</span><span class="p">,</span> <span class="n">SERVICE_STATE_ALL</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</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">nb_services</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">counter</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">WindowsError</span><span class="p">:</span>
<span class="k">pass</span>
@@ -164,11 +114,85 @@
<span class="n">size</span> <span class="o">=</span> <span class="n">size_needed</span><span class="o">.</span><span class="n">value</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="p">(</span><span class="n">BYTE</span> <span class="o">*</span> <span class="n">size</span><span class="p">)()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">EnumServicesStatusExA</span><span class="p">(</span><span class="n">scm</span><span class="p">,</span> <span class="n">SC_ENUM_PROCESS_INFO</span><span class="p">,</span> <span class="n">SERVICE_TYPE_ALL</span><span class="p">,</span> <span class="n">SERVICE_STATE_ALL</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</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">nb_services</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">counter</span><span class="p">),</span> <span class="kc">None</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">EnumServicesStatusExA</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle</span><span class="p">,</span> <span class="n">SC_ENUM_PROCESS_INFO</span><span class="p">,</span> <span class="n">SERVICE_TYPE_ALL</span><span class="p">,</span> <span class="n">SERVICE_STATE_ALL</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">size_needed</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">nb_services</span><span class="p">),</span> <span class="n">byref</span><span class="p">(</span><span class="n">counter</span><span class="p">),</span> <span class="kc">None</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">continue</span>
<span class="n">return_type</span> <span class="o">=</span> <span class="p">(</span><span class="n">ServiceA</span> <span class="o">*</span> <span class="n">nb_services</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">return_type</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">buffer</span><span class="p">))</span>
<span class="k">break</span>
<span class="n">services_array</span> <span class="o">=</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">ENUM_SERVICE_STATUS_PROCESSA</span> <span class="o">*</span> <span class="n">nb_services</span><span class="o">.</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span>
<span class="k">for</span> <span class="n">service_info</span> <span class="ow">in</span> <span class="n">services_array</span><span class="p">:</span>
<span class="n">shandle</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_service</span><span class="p">(</span><span class="n">service_info</span><span class="o">.</span><span class="n">lpServiceName</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">NewService</span><span class="p">(</span><span class="n">handle</span><span class="o">=</span><span class="n">shandle</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">service_info</span><span class="o">.</span><span class="n">lpServiceName</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="n">service_info</span><span class="o">.</span><span class="n">lpDisplayName</span><span class="p">)</span>
<span class="k">return</span>
<span class="fm">__iter__</span> <span class="o">=</span> <span class="n">_enumerate_services_generator</span>
<span class="k">def</span> <span class="nf">enumerate_services</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_enumerate_services_generator</span><span class="p">())</span>
<span class="k">class</span> <span class="nc">NewService</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SC_HANDLE</span><span class="p">):</span>
<span class="c1"># close_function = windows.winproxy.CloseServiceHandle</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handle</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">NewService</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="sd">&quot;&quot;&quot;The name of the service</span>
<span class="sd"> :type: :class:`str`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">description</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_description</span> <span class="o">=</span> <span class="n">description</span> <span class="c1"># Setup fixedpropety</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The description of the service</span>
<span class="sd"> :type: :class:`str`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ServiceManager</span><span class="p">()</span><span class="o">.</span><span class="n">get_service_display_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">status</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">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">SERVICE_STATUS_PROCESS</span><span class="p">)()</span>
<span class="n">size_needed</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span>
<span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">QueryServiceStatusEx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SC_STATUS_PROCESS_INFO</span><span class="p">,</span> <span class="n">buffer</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">LPBYTE</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">buffer</span><span class="p">),</span> <span class="n">size_needed</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The process running the service (if any)</span>
<span class="sd"> :type: :class:`WinProcess &lt;windows.winobject.process.WinProcess&gt;` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">dwProcessId</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">pid</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">WinProcess</span><span class="p">(</span><span class="n">pid</span><span class="o">=</span><span class="n">pid</span><span class="p">)</span>
<span class="k">return</span> <span class="n">l</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">security_descriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">security</span><span class="o">.</span><span class="n">SecurityDescriptor</span><span class="o">.</span><span class="n">from_service</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">nbelt</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">args</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="n">args</span><span class="p">]</span>
<span class="n">nbelt</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">LPCSTR</span> <span class="o">*</span> <span class="p">(</span><span class="n">nbelt</span><span class="p">))(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">StartServiceA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nbelt</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">SERVICE_STATUS</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">ControlService</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SERVICE_CONTROL_STOP</span><span class="p">,</span> <span class="n">status</span><span class="p">)</span>
<span class="k">return</span> <span class="n">status</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;</span><span class="si">{0}</span><span class="s2"> &quot;</span><span class="si">{1}</span><span class="s2">&quot; </span><span class="si">{2}</span><span class="s2">&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">state</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">windows</span><span class="o">.</span><span class="n">winproxy</span><span class="o">.</span><span class="n">CloseServiceHandle</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>
</div>
+147 -119
View File
@@ -48,6 +48,8 @@
<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>
@@ -58,10 +60,11 @@
<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">event_trace</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.winobject</span> <span class="k">import</span> <span class="n">bits</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>
@@ -97,12 +100,12 @@
<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">@property</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="sd">&quot;&quot;&quot;The list of services</span>
<span class="sd"> :type: [:class:`~windows.winobject.service.ServiceA`] -- A list of Service&quot;&quot;&quot;</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="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>
@@ -143,6 +146,10 @@
<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">etw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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>
@@ -167,6 +174,10 @@
<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">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>
@@ -174,9 +185,14 @@
<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">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="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="c1"># For now I don&#39;t know what is best as A vs W APIs...</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="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">else</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_string_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>
@@ -218,7 +234,7 @@
<span class="sd"> :type: :class:`str`</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">VER_NT_WORKSTATION</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="p">[</span><span class="s2">&quot;Windows Server 2016&quot;</span><span class="p">,</span> <span class="s2">&quot;Windows 10&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">3</span><span class="p">):</span>
@@ -230,7 +246,7 @@
<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">&quot;Windows Server 2008&quot;</span><span class="p">,</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">SM_SERVERR2</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="s2">&quot;Windows XP Professional x64 Edition&quot;</span>
@@ -247,7 +263,7 @@
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;Unknow 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">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="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="sd">&quot;&quot;&quot;The product type, value might be:</span>
@@ -262,97 +278,97 @@
<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="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">DWORD</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>
@@ -368,8 +384,8 @@
<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="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>
@@ -378,9 +394,9 @@
<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">gdef</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="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">gdef</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>
@@ -388,35 +404,47 @@
<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">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="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">&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">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">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">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">&quot;&lt;HH&quot;</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">&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="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">&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">LPCSTR</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">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(&quot;comctl32&quot;)</span>
<span class="c1"># Fallback on self.get_file_version(&quot;comctl32&quot;) 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">&quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&quot;</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="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="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">return</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="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="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">@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">PROCESSENTRY32</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">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>
@@ -431,7 +459,7 @@
<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">THREADENTRY32</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>
@@ -460,7 +488,7 @@
<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">gdef</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>
@@ -471,7 +499,7 @@
<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">THREADENTRY32</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>
@@ -79,7 +79,7 @@
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="p">(</span><span class="n">cbsize</span><span class="o">.</span><span class="n">value</span> <span class="o">*</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BYTE</span><span class="p">)()</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MODULE_INFORMATION</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">))</span>
<span class="n">winproxy</span><span class="o">.</span><span class="n">NtQuerySystemInformation</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SystemModuleInformation</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">raw_buffer</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">raw_buffer</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">cbsize</span><span class="p">))</span>
<span class="n">modules</span> <span class="o">=</span> <span class="p">(</span><span class="n">SystemModule</span> <span class="o">*</span> <span class="n">buffer</span><span class="o">.</span><span class="n">ModulesCount</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span> <span class="o">+</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MODULE_INFORMATION</span><span class="o">.</span><span class="n">Modules</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
<span class="n">modules</span> <span class="o">=</span> <span class="p">(</span><span class="n">SystemModule</span> <span class="o">*</span> <span class="n">buffer</span><span class="o">.</span><span class="n">ModulesCount</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MODULE_INFORMATION</span><span class="o">.</span><span class="n">Modules</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">modules</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">enumerate_kernel_modules_syswow64</span><span class="p">():</span>
@@ -88,7 +88,7 @@
<span class="n">raw_buffer</span> <span class="o">=</span> <span class="p">(</span><span class="n">cbsize</span><span class="o">.</span><span class="n">value</span> <span class="o">*</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BYTE</span><span class="p">)()</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MODULE_INFORMATION64</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">))</span>
<span class="n">windows</span><span class="o">.</span><span class="n">syswow64</span><span class="o">.</span><span class="n">NtQuerySystemInformation_32_to_64</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SystemModuleInformation</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">raw_buffer</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">sizeof</span><span class="p">(</span><span class="n">raw_buffer</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">cbsize</span><span class="p">))</span>
<span class="n">modules</span> <span class="o">=</span> <span class="p">(</span><span class="n">SystemModuleWow64</span> <span class="o">*</span> <span class="n">buffer</span><span class="o">.</span><span class="n">ModulesCount</span><span class="p">)</span><span class="o">.</span><span class="n">from_address</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">addressof</span><span class="p">(</span><span class="n">buffer</span><span class="p">)</span> <span class="o">+</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MODULE_INFORMATION64</span><span class="o">.</span><span class="n">Modules</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
<span class="n">modules</span> <span class="o">=</span> <span class="p">(</span><span class="n">SystemModuleWow64</span> <span class="o">*</span> <span class="n">buffer</span><span class="o">.</span><span class="n">ModulesCount</span><span class="p">)</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">raw_buffer</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">SYSTEM_MODULE_INFORMATION64</span><span class="o">.</span><span class="n">Modules</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">modules</span><span class="p">)</span>
</pre></div>
@@ -206,6 +206,27 @@
<span class="n">ITEM_TYPE</span> <span class="o">=</span> <span class="n">Trigger</span></div>
<span class="k">class</span> <span class="nc">TaskRegistrationInfo</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">IRegistrationInfo</span><span class="p">):</span>
<span class="n">author</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Author&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Description&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">date</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Date&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">source</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Source&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">documentation</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Documentation&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">uri</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_URI&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">version</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Version&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="c1"># Return WindowsError: [Error -2147467263] Not implemented</span>
<span class="n">xml</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_XmlText&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="c1"># security_descriptor = generate_simple_getter(&quot;get_SecurityDescriptor&quot;, gdef.BSTR)</span>
<span class="k">class</span> <span class="nc">TaskPrincipal</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">IPrincipal</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_DisplayName&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Id&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">user_id</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_UserId&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">group_id</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_GroupId&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="n">run_level</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_RunLevel&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">TASK_RUNLEVEL_TYPE</span><span class="p">)</span>
<span class="n">logon_type</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_LogonType&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">TASK_LOGON_TYPE</span><span class="p">)</span>
<div class="viewcode-block" id="TaskDefinition"><a class="viewcode-back" href="../../../task_scheduler.html#windows.winobject.task_scheduler.TaskDefinition">[docs]</a><span class="k">class</span> <span class="nc">TaskDefinition</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">ITaskDefinition</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The definition of a task&quot;&quot;&quot;</span>
<span class="n">actions</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Actions&quot;</span><span class="p">,</span> <span class="n">ActionCollection</span><span class="p">,</span> <span class="n">extract_value</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
@@ -217,8 +238,18 @@
<span class="sd">&quot;&quot;&quot;The list of triggers of the task</span>
<span class="sd"> :type: :class:`TriggerCollection`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">registration_info</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_RegistrationInfo&quot;</span><span class="p">,</span> <span class="n">TaskRegistrationInfo</span><span class="p">,</span> <span class="n">extract_value</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">principal</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Principal&quot;</span><span class="p">,</span> <span class="n">TaskPrincipal</span><span class="p">,</span> <span class="n">extract_value</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">xml</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_XmlText&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;The XML representig the task definition</span>
<span class="sd"> :type: :class:`str`</span>
<span class="sd"> &quot;&quot;&quot;</span></div>
<div class="viewcode-block" id="Task"><a class="viewcode-back" href="../../../task_scheduler.html#windows.winobject.task_scheduler.Task">[docs]</a><span class="k">class</span> <span class="nc">Task</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">IRegisteredTask</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A scheduled task&quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Name&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
@@ -228,12 +259,26 @@
<span class="n">state</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_State&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">TASK_STATE</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;The state of the task</span>
<span class="sd"> :type: :class:`~windows.generated_def.winstructs.TASK_STATE`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">enabled</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Enabled&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">VARIANT_BOOL</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;``True`` is the task is enabled&quot;&quot;&quot;</span>
<span class="n">last_runtime</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_LastRunTime&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DATE</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;Gets the last time the registered task was last run.&quot;&quot;&quot;</span>
<span class="n">next_runtime</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_NextRunTime&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">DATE</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;Gets the next time the registered task will be run.&quot;&quot;&quot;</span>
<span class="n">definition</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Definition&quot;</span><span class="p">,</span> <span class="n">TaskDefinition</span><span class="p">,</span> <span class="n">extract_value</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;The definition of the task</span>
<span class="sd"> :type: :class:`TaskDefinition`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">xml</span> <span class="o">=</span> <span class="n">generate_simple_getter</span><span class="p">(</span><span class="s2">&quot;get_Xml&quot;</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;The XML representig the task</span>
<span class="sd"> :type: :class:`str`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">gdef</span><span class="o">.</span><span class="n">TASK_RUN_NO_FLAGS</span><span class="p">,</span> <span class="n">sessionid</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
@@ -242,6 +287,11 @@
<span class="bp">self</span><span class="o">.</span><span class="n">RunEx</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">sessionid</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span> <span class="nf">get_security_descriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secinfo</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">BSTR</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetSecurityDescriptor</span><span class="p">(</span><span class="n">secinfo</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span><span class="o">.</span><span class="n">value</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;</span><span class="si">{0}</span><span class="s2"> &quot;</span><span class="si">{1}</span><span class="s2">&quot; at </span><span class="si">{2:#x}</span><span class="s2">&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span></div>
+3 -2
View File
@@ -39,13 +39,13 @@
<h1>Source code for windows.winobject.token</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">functools</span>
<span class="kn">from</span> <span class="nn">__builtin__</span> <span class="k">import</span> <span class="nb">type</span> <span class="k">as</span> <span class="n">bltn_type</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">utils</span>
<span class="kn">from</span> <span class="nn">windows</span> <span class="k">import</span> <span class="n">winproxy</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="n">bltn_type</span> <span class="o">=</span> <span class="nb">type</span>
<span class="n">KNOW_INTEGRITY_LEVEL</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">SECURITY_MANDATORY_UNTRUSTED_RID</span><span class="p">,</span>
@@ -504,7 +504,8 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">mandatory_label</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">TOKEN_MANDATORY_LABEL</span><span class="p">()</span>
<span class="n">mandatory_label</span><span class="o">.</span><span class="n">Label</span><span class="o">.</span><span class="n">Attributes</span> <span class="o">=</span> <span class="mh">0x60</span>
<span class="n">mandatory_label</span><span class="o">.</span><span class="n">Label</span><span class="o">.</span><span class="n">Sid</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PSID</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="s2">&quot;S-1-16-</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">integrity</span><span class="p">))</span>
<span class="c1"># cast integrity to int to accept SECURITY_MANDATORY_LOW_RID &amp; other Flags</span>
<span class="n">mandatory_label</span><span class="o">.</span><span class="n">Label</span><span class="o">.</span><span class="n">Sid</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PSID</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="s2">&quot;S-1-16-</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="nb">int</span><span class="p">(</span><span class="n">integrity</span><span class="p">)))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_informations</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">TokenIntegrityLevel</span><span class="p">,</span> <span class="n">mandatory_label</span><span class="p">)</span></div>
<span class="n">_INTEGRITY_PROPERTY_DOC</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;The integrity of the token as an int (extracted from integrity PSID)</span>
+2 -2
View File
@@ -110,7 +110,7 @@
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x100</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">GetLogicalDriveStringsA</span><span class="p">(</span><span class="mh">0x1000</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">rsize</span><span class="p">]</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">rsize</span><span class="p">]</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_info</span><span class="p">(</span><span class="n">drivename</span><span class="p">):</span>
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x1000</span>
@@ -124,7 +124,7 @@
<span class="n">size</span> <span class="o">=</span> <span class="mh">0x1000</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">c_buffer</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
<span class="n">rsize</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">QueryDosDeviceA</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">rsize</span><span class="p">]</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">buffer</span><span class="p">[:</span><span class="n">rsize</span><span class="p">]</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\x00</span><span class="s2">&quot;</span><span class="p">)</span>
</pre></div>
</div>
+63 -5
View File
@@ -41,6 +41,7 @@
<span class="kn">import</span> <span class="nn">ctypes</span>
<span class="kn">import</span> <span class="nn">struct</span>
<span class="kn">import</span> <span class="nn">functools</span>
<span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">partial</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">namedtuple</span>
<span class="kn">from</span> <span class="nn">ctypes.wintypes</span> <span class="k">import</span> <span class="o">*</span>
@@ -48,7 +49,8 @@
<span class="kn">import</span> <span class="nn">windows.com</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.generated_def.winstructs</span> <span class="k">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">partial</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">basestring</span>
<span class="c1"># Common error check for all WMI COM interfaces</span>
<span class="c1"># This &#39;just&#39; add the corresponding &#39;WBEMSTATUS&#39; to the hresult error code</span>
@@ -57,9 +59,44 @@
<span class="k">def</span> <span class="nf">errcheck</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
<span class="k">if</span> <span class="n">result</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">wmitag</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">WBEMSTATUS</span><span class="o">.</span><span class="n">mapper</span><span class="p">[</span><span class="n">result</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">]</span>
<span class="k">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">wmitag</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WinError</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">wmitag</span><span class="p">)</span>
<span class="k">return</span> <span class="n">args</span>
<span class="n">sentinel</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
<span class="c1"># POC</span>
<span class="k">class</span> <span class="nc">QualifierSet</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">IWbemQualifierSet</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get_variant</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="sd">&quot;&quot;&quot;Retrieve the value of property ``name`` as a :class:`~windows.com.Variant`</span>
<span class="sd"> :return: :class:`~windows.com.Variant`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
<span class="n">nametype</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;WmiObject attributes name must be str, not &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">nametype</span><span class="p">))</span>
<span class="n">variant_res</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">Variant</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">Get</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">variant_res</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">variant_res</span>
<span class="k">def</span> <span class="nf">get</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">default</span><span class="o">=</span><span class="n">sentinel</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the value of the property ``name``. The return value depends of the type of the property and can vary&quot;&quot;&quot;</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">get_variant</span><span class="p">(</span><span class="n">name</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="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">!=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">WBEM_E_NOT_FOUND</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="n">sentinel</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="n">default</span>
<span class="k">def</span> <span class="nf">names</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">res</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">com</span><span class="o">.</span><span class="n">SafeArray</span><span class="p">)()</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">pointer</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetNames</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">cast</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">POINTER</span><span class="p">(</span><span class="n">POINTER</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">SAFEARRAY</span><span class="p">))))</span>
<span class="c1"># need to free the safearray / unlock ?</span>
<span class="n">properties</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">to_list</span><span class="p">(</span><span class="n">BSTR</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">properties</span>
<span class="c1"># https://docs.microsoft.com/en-us/windows/desktop/api/wbemcli/nn-wbemcli-iwbemclassobject</span>
<span class="n">WmiMethod</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;WmiMethod&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;inparam&quot;</span><span class="p">,</span> <span class="s2">&quot;outparam&quot;</span><span class="p">])</span>
@@ -127,7 +164,6 @@
<span class="k">return</span> <span class="n">gdef</span><span class="o">.</span><span class="n">tag_WBEM_GENUS_TYPE</span><span class="o">.</span><span class="n">mapper</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;__GENUS&quot;</span><span class="p">)]</span>
<span class="c1">## Higher level API</span>
<div class="viewcode-block" id="WmiObject.get_properties"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiObject.get_properties">[docs]</a> <span class="k">def</span> <span class="nf">get_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">system_properties</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return the list of properties names available for the current object.</span>
<span class="sd"> If ``system_properties`` is ``False`` property names begining with ``_`` are ignored.</span>
@@ -147,6 +183,17 @@
<span class="n">properties</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_properties</span><span class="p">)</span> <span class="c1">#: The properties of the object (exclude system properties)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">qualifier_set</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># changer de nom ?</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">QualifierSet</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetQualifierSet</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">get_p_set</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="c1"># Changer de nom ?</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">QualifierSet</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">GetPropertyQualifierSet</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span>
<span class="c1"># Make WmiObject a mapping object</span>
<div class="viewcode-block" id="WmiObject.keys"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiObject.keys">[docs]</a> <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -170,7 +217,12 @@
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;</span><span class="si">{0}</span><span class="s2"> (NULL)&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">genus</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">WBEM_GENUS_CLASS</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;</span><span class="si">{0}</span><span class="s2"> class &quot;</span><span class="si">{1}</span><span class="s2">&quot;&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;__Class&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;</span><span class="si">{0}</span><span class="s2"> instance of &quot;</span><span class="si">{1}</span><span class="s2">&quot;&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;__Class&quot;</span><span class="p">))</span></div>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;</span><span class="si">{0}</span><span class="s2"> instance of &quot;</span><span class="si">{1}</span><span class="s2">&quot;&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;__Class&quot;</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">__sprint__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot; </span><span class="si">{0}</span><span class="se">\n</span><span class="s2"></span>
<span class="s2"> </span><span class="si">{1}</span><span class="s2"></span>
<span class="s2"> &quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;: &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])])</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">())))</span></div>
<div class="viewcode-block" id="WmiEnumeration"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiEnumeration">[docs]</a><span class="k">class</span> <span class="nc">WmiEnumeration</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">IEnumWbemClassObject</span><span class="p">,</span> <span class="n">WmiComInterface</span><span class="p">):</span>
@@ -189,7 +241,7 @@
<span class="n">return_count</span> <span class="o">=</span> <span class="n">gdef</span><span class="o">.</span><span class="n">ULONG</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">error</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">Next</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">return_count</span><span class="p">)</span>
<span class="k">if</span> <span class="n">error</span> <span class="o">==</span> <span class="n">gdef</span><span class="o">.</span><span class="n">WBEM_S_TIMEDOUT</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">WBEM_S_TIMEDOUT</span><span class="p">,</span> <span class="s2">&quot;Wmi timeout&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WinError</span><span class="p">(</span><span class="n">gdef</span><span class="o">.</span><span class="n">WBEM_S_TIMEDOUT</span><span class="p">,</span> <span class="s2">&quot;Wmi timeout&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">error</span> <span class="o">==</span> <span class="n">WBEM_S_FALSE</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
@@ -376,6 +428,12 @@
<span class="bp">self</span><span class="o">.</span><span class="n">PutInstance</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="n">res</span></div>
<div class="viewcode-block" id="WmiNamespace.delete_instance"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiNamespace.delete_instance">[docs]</a> <span class="k">def</span> <span class="nf">delete_instance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;TODO: Document&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">IWbemClassObject</span><span class="p">):</span>
<span class="n">instance</span> <span class="o">=</span> <span class="n">instance</span><span class="p">[</span><span class="s2">&quot;__Path&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">DeleteInstance</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span></div>
<div class="viewcode-block" id="WmiNamespace.exec_method"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiNamespace.exec_method">[docs]</a> <span class="k">def</span> <span class="nf">exec_method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">inparam</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Exec method named on ``object`` with ``inparam``.</span>
File diff suppressed because it is too large Load Diff
+4 -10
View File
@@ -41,6 +41,8 @@
<span class="kn">import</span> <span class="nn">functools</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">.error</span> <span class="k">import</span> <span class="n">ExportNotFound</span>
<span class="kn">from</span> <span class="nn">windows.pycompat</span> <span class="k">import</span> <span class="n">is_py3</span>
<span class="c1"># Utils</span>
<div class="viewcode-block" id="is_implemented"><a class="viewcode-back" href="../../../winproxy.html#windows.winproxy.is_implemented">[docs]</a><span class="k">def</span> <span class="nf">is_implemented</span><span class="p">(</span><span class="n">apiproxy</span><span class="p">):</span>
@@ -60,18 +62,10 @@
<div class="viewcode-block" id="resolve"><a class="viewcode-back" href="../../../winproxy.html#windows.winproxy.resolve">[docs]</a><span class="k">def</span> <span class="nf">resolve</span><span class="p">(</span><span class="n">apiproxy</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Resolve the address of ``apiproxy``. Might raise if ``apiproxy`` is not implemented&quot;&quot;&quot;</span>
<span class="n">apiproxy</span><span class="o">.</span><span class="n">force_resolution</span><span class="p">()</span>
<span class="n">func</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WinDLL</span><span class="p">(</span><span class="n">dll_name</span><span class="p">)[</span><span class="n">func_name</span><span class="p">]</span>
<span class="n">func</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">WinDLL</span><span class="p">(</span><span class="n">apiproxy</span><span class="o">.</span><span class="n">target_dll</span><span class="p">)[</span><span class="n">apiproxy</span><span class="o">.</span><span class="n">target_func</span><span class="p">]</span>
<span class="k">return</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">gdef</span><span class="o">.</span><span class="n">PVOID</span><span class="p">)</span><span class="o">.</span><span class="n">value</span></div>
<span class="c1"># ApiProxy stuff</span>
<span class="k">class</span> <span class="nc">ExportNotFound</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func_name</span><span class="p">,</span> <span class="n">api_name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">func_name</span> <span class="o">=</span> <span class="n">func_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">api_name</span> <span class="o">=</span> <span class="n">api_name</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ExportNotFound</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="s2">&quot;Function </span><span class="si">{0}</span><span class="s2"> not found into </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">func_name</span><span class="p">,</span> <span class="n">api_name</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">NeededParameterType</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">_inst</span> <span class="o">=</span> <span class="kc">None</span>
@@ -149,7 +143,7 @@
<span class="c1"># &quot;argument 2: &lt;type &#39;exceptions.TypeError&#39;&gt;: wrong type&quot;</span>
<span class="c1"># Thx ctypes..</span>
<span class="n">argnbstr</span><span class="p">,</span> <span class="n">ecx</span><span class="p">,</span> <span class="n">reason</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">message</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">argnbstr</span><span class="p">,</span> <span class="n">ecx</span><span class="p">,</span> <span class="n">reason</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</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="c1"># py2 / py3 compat :)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">argnbstr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;argument &quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="c1"># Don&#39;t knnow if it can happen</span>
<span class="n">argnb</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">argnbstr</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="s2">&quot;argument &quot;</span><span class="p">):])</span>
+9
View File
@@ -42,6 +42,15 @@
<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.generated_def.ntstatus</span> <span class="k">import</span> <span class="n">NtStatusException</span>
<span class="c1"># ApiProxy stuff</span>
<span class="k">class</span> <span class="nc">ExportNotFound</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func_name</span><span class="p">,</span> <span class="n">api_name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">func_name</span> <span class="o">=</span> <span class="n">func_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">api_name</span> <span class="o">=</span> <span class="n">api_name</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ExportNotFound</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="s2">&quot;Function </span><span class="si">{0}</span><span class="s2"> not found into </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">func_name</span><span class="p">,</span> <span class="n">api_name</span><span class="p">))</span>
<span class="c1"># PFW Winproxy Exception type</span>
<div class="viewcode-block" id="WinproxyError"><a class="viewcode-back" href="../../../winproxy.html#windows.winproxy.WinproxyError">[docs]</a><span class="k">class</span> <span class="nc">WinproxyError</span><span class="p">(</span><span class="ne">WindowsError</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">func_name</span><span class="p">,</span> <span class="n">error_code</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+1
View File
@@ -106,6 +106,7 @@
<span class="n">win_trust_data</span><span class="o">.</span><span class="n">pSIPClientData</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">win_trust_data</span><span class="o">.</span><span class="n">dwUIChoice</span> <span class="o">=</span> <span class="n">WTD_UI_NONE</span>
<span class="n">win_trust_data</span><span class="o">.</span><span class="n">fdwRevocationChecks</span> <span class="o">=</span> <span class="n">WTD_REVOKE_NONE</span>
<span class="n">win_trust_data</span><span class="o">.</span><span class="n">fdwRevocationChecks</span> <span class="o">=</span> <span class="n">WTD_REVOKE_WHOLECHAIN</span>
<span class="n">win_trust_data</span><span class="o">.</span><span class="n">dwUnionChoice</span> <span class="o">=</span> <span class="n">WTD_CHOICE_FILE</span>
<span class="n">win_trust_data</span><span class="o">.</span><span class="n">dwStateAction</span> <span class="o">=</span> <span class="n">WTD_STATEACTION_VERIFY</span>
<span class="n">win_trust_data</span><span class="o">.</span><span class="n">hWVTStateData</span> <span class="o">=</span> <span class="kc">None</span>
+15 -1
View File
@@ -82,7 +82,21 @@ When a breakpoint is hit, its ``trigger`` function is called with the debugger a
This means that a MEMBP at address ``X`` won't be triggered by a write of size 4 at address ``X - 1``. it's sad I know.
.. autoclass:: FunctionCallBP
:members:
:inherited-members:
:special-members: __init__
.. note::
See sample :ref:`sample_debugger_bp_functioncallbp`
.. autoclass:: FunctionBP
:members:
:inherited-members:
:special-members: __init__
:special-members: __init__
.. note::
See sample :ref:`sample_debugger_bp_functionbp`
+1
View File
@@ -22,6 +22,7 @@ Here is every generated definition by type:
windef_generated.rst
ntstatus_generated.rst
winstructs_generated.rst
winerror_generated.rst
+14
View File
@@ -261,6 +261,20 @@ Output
.. literalinclude:: samples_output\debug_debugger_membp_singlestep.txt
.. _sample_debugger_bp_functioncallbp:
:class:`windows.debug.FunctionCallBP`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. literalinclude:: ..\..\samples\debug\change_function_ret_value.py
Output
.. literalinclude:: samples_output\debug_change_function_ret_value.txt
.. _sample_debugger_bp_functionbp:
:class:`windows.debug.FunctionBP`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -359,7 +359,7 @@ ALPC messages over an ALPC port and the classes representing these messages.</p>
<dl class="method">
<dt id="windows.alpc.AlpcClient.send_receive">
<code class="descname">send_receive</code><span class="sig-paren">(</span><em>alpc_message</em>, <em>receive_msg=None</em>, <em>flags=ALPC_MSGFLG_SYNC_REQUEST(0x20000)</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.alpc.AlpcClient.send_receive" title="Permalink to this definition"></a></dt>
<code class="descname">send_receive</code><span class="sig-paren">(</span><em>alpc_message</em>, <em>receive_msg=None</em>, <em>flags=ALPC_MSGFLG_SYNC_REQUEST(0x20000)</em>, <em>timeout=None</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.alpc.AlpcClient.send_receive" title="Permalink to this definition"></a></dt>
<dd><p>Send and receive a message with <code class="docutils literal notranslate"><span class="pre">flags</span></code>.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
@@ -464,7 +464,7 @@ ALPC messages over an ALPC port and the classes representing these messages.</p>
<dl class="method">
<dt id="windows.alpc.AlpcServer.send_receive">
<code class="descname">send_receive</code><span class="sig-paren">(</span><em>alpc_message</em>, <em>receive_msg=None</em>, <em>flags=ALPC_MSGFLG_SYNC_REQUEST(0x20000)</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.alpc.AlpcServer.send_receive" title="Permalink to this definition"></a></dt>
<code class="descname">send_receive</code><span class="sig-paren">(</span><em>alpc_message</em>, <em>receive_msg=None</em>, <em>flags=ALPC_MSGFLG_SYNC_REQUEST(0x20000)</em>, <em>timeout=None</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.alpc.AlpcServer.send_receive" title="Permalink to this definition"></a></dt>
<dd><p>Send and receive a message with <code class="docutils literal notranslate"><span class="pre">flags</span></code>.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
+46
View File
@@ -196,6 +196,14 @@ Useful when debugingg a 32b process from a 64bits one</p>
</table>
</dd></dl>
<dl class="staticmethod">
<dt id="windows.debug.Debugger.kill_on_exit">
<em class="property">static </em><code class="descname">kill_on_exit</code><span class="sig-paren">(</span><em>choice</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/debug/debugger.html#Debugger.kill_on_exit"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.debug.Debugger.kill_on_exit" title="Permalink to this definition"></a></dt>
<dd><p>If set to True(default in Windows) will kill all attached process on thread exit.
Otherwise, the thread detaches from all processes being debugged on exit.</p>
<p>See: <a class="reference external" href="https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-debugsetprocesskillonexit">https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-debugsetprocesskillonexit</a></p>
</dd></dl>
<dl class="method">
<dt id="windows.debug.Debugger.on_setup">
<code class="descname">on_setup</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/debug/debugger.html#Debugger.on_setup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.debug.Debugger.on_setup" title="Permalink to this definition"></a></dt>
@@ -483,6 +491,40 @@ It is based on <code class="xref py py-func docutils literal notranslate"><span
<p class="last">This means that a MEMBP at address <code class="docutils literal notranslate"><span class="pre">X</span></code> wont be triggered by a write of size 4 at address <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">-</span> <span class="pre">1</span></code>. its sad I know.</p>
</div>
<dl class="class">
<dt id="windows.debug.FunctionCallBP">
<em class="property">class </em><code class="descclassname">windows.debug.</code><code class="descname">FunctionCallBP</code><span class="sig-paren">(</span><em>addr</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/debug/breakpoints.html#FunctionCallBP"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.debug.FunctionCallBP" title="Permalink to this definition"></a></dt>
<dd><p>A Breakpoint that allow to trigger at the return of a function</p>
<dl class="method">
<dt id="windows.debug.FunctionCallBP.__init__">
<code class="descname">__init__</code><span class="sig-paren">(</span><em>addr</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.debug.FunctionCallBP.__init__" title="Permalink to this definition"></a></dt>
<dd><p>x.__init__(…) initializes x; see help(type(x)) for signature</p>
</dd></dl>
<dl class="method">
<dt id="windows.debug.FunctionCallBP.break_on_ret">
<code class="descname">break_on_ret</code><span class="sig-paren">(</span><em>dbg</em>, <em>exception</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/debug/breakpoints.html#FunctionCallBP.break_on_ret"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.debug.FunctionCallBP.break_on_ret" title="Permalink to this definition"></a></dt>
<dd><p>Setup a breakpoint at the return address of the function, this breakpoint will call <a class="reference internal" href="#windows.debug.FunctionCallBP.ret_trigger" title="windows.debug.FunctionCallBP.ret_trigger"><code class="xref py py-func docutils literal notranslate"><span class="pre">ret_trigger()</span></code></a></p>
</dd></dl>
<dl class="method">
<dt id="windows.debug.FunctionCallBP.ret_trigger">
<code class="descname">ret_trigger</code><span class="sig-paren">(</span><em>dbg</em>, <em>exception</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/debug/breakpoints.html#FunctionCallBP.ret_trigger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.debug.FunctionCallBP.ret_trigger" title="Permalink to this definition"></a></dt>
<dd><p>Called at the return of the function if <a class="reference internal" href="#windows.debug.FunctionCallBP.break_on_ret" title="windows.debug.FunctionCallBP.break_on_ret"><code class="xref py py-func docutils literal notranslate"><span class="pre">break_on_ret()</span></code></a> was called</p>
</dd></dl>
<dl class="method">
<dt id="windows.debug.FunctionCallBP.trigger">
<code class="descname">trigger</code><span class="sig-paren">(</span><em>dbg</em>, <em>exception</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.debug.FunctionCallBP.trigger" title="Permalink to this definition"></a></dt>
<dd><p>Called when breakpoint is hit</p>
</dd></dl>
</dd></dl>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">See sample <a class="reference internal" href="sample.html#sample-debugger-bp-functioncallbp"><span class="std std-ref">windows.debug.FunctionCallBP</span></a></p>
</div>
<dl class="class">
<dt id="windows.debug.FunctionBP">
<em class="property">class </em><code class="descclassname">windows.debug.</code><code class="descname">FunctionBP</code><span class="sig-paren">(</span><em>addr=None</em>, <em>target=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/debug/breakpoints.html#FunctionBP"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.debug.FunctionBP" title="Permalink to this definition"></a></dt>
<dd><p>A breakpoint that accepts a function from <a class="reference internal" href="winproxy.html#module-windows.winproxy" title="windows.winproxy"><code class="xref py py-mod docutils literal notranslate"><span class="pre">windows.winproxy</span></code></a> and able to:</p>
@@ -528,6 +570,10 @@ It is based on <code class="xref py py-func docutils literal notranslate"><span
</dd></dl>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">See sample <a class="reference internal" href="sample.html#sample-debugger-bp-functionbp"><span class="std std-ref">windows.debug.FunctionBP</span></a></p>
</div>
</div>
</div>
+191 -1
View File
@@ -309,6 +309,20 @@
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.channels_metadata">
<code class="descname">channels_metadata</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.channels_metadata" title="Permalink to this definition"></a></dt>
<dd><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataChannel</span></code> for each channel this provider defines</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Yield:</th><td class="field-body"><code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataChannel</span></code></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.chanrefs">
<code class="descname">chanrefs</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.chanrefs" title="Permalink to this definition"></a></dt>
@@ -343,12 +357,158 @@
<dd><p>The <a class="reference internal" href="#windows.winobject.event_log.PublisherMetadata" title="windows.winobject.event_log.PublisherMetadata"><code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadata</span></code></a> for the publisher <code class="docutils literal notranslate"><span class="pre">name</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.guid">
<code class="descname">guid</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.guid" title="Permalink to this definition"></a></dt>
<dd><p>The GUID associated with this provider</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body">[<code class="xref py py-class docutils literal notranslate"><span class="pre">GUID</span></code>] the GUID in a XXXXXXXXXX-YYYY-ZZZZ-TTTT-VVVVVVVVVV form</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.keywordrefs">
<code class="descname">keywordrefs</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.keywordrefs" title="Permalink to this definition"></a></dt>
<dd><p>The list of keywords defined by this provider</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="#windows.winobject.event_log.PropertyArray" title="windows.winobject.event_log.PropertyArray"><code class="xref py py-class docutils literal notranslate"><span class="pre">PropertyArray</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.keywords_metadata">
<code class="descname">keywords_metadata</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.keywords_metadata" title="Permalink to this definition"></a></dt>
<dd><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataKeyword</span></code> for each opcode this provider defines</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Yield:</th><td class="field-body"><code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataKeyword</span></code></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.levelrefs">
<code class="descname">levelrefs</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.levelrefs" title="Permalink to this definition"></a></dt>
<dd><p>Identifies the levels child element of the provider.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="#windows.winobject.event_log.PropertyArray" title="windows.winobject.event_log.PropertyArray"><code class="xref py py-class docutils literal notranslate"><span class="pre">PropertyArray</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.levels_metadata">
<code class="descname">levels_metadata</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.levels_metadata" title="Permalink to this definition"></a></dt>
<dd><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataLevel</span></code> for each level this provider defines</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Yield:</th><td class="field-body"><code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataLevel</span></code></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="windows.winobject.event_log.PublisherMetadata.message">
<code class="descname">message</code><span class="sig-paren">(</span><em>msgid</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/event_log.html#PublisherMetadata.message"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.message" title="Permalink to this definition"></a></dt>
<dd><p>TODO</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.message_filepath">
<code class="descname">message_filepath</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.message_filepath" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.message_id">
<code class="descname">message_id</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.message_id" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.message_parameter_filepath">
<code class="descname">message_parameter_filepath</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.message_parameter_filepath" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.message_resource_filepath">
<code class="descname">message_resource_filepath</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.message_resource_filepath" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.opcoderefs">
<code class="descname">opcoderefs</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.opcoderefs" title="Permalink to this definition"></a></dt>
<dd><p>Identifies the opcodes child element of the provider.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="#windows.winobject.event_log.PropertyArray" title="windows.winobject.event_log.PropertyArray"><code class="xref py py-class docutils literal notranslate"><span class="pre">PropertyArray</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.opcodes_metadata">
<code class="descname">opcodes_metadata</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.opcodes_metadata" title="Permalink to this definition"></a></dt>
<dd><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataOpcode</span></code> for each opcode this provider defines</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Yield:</th><td class="field-body"><code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataOpcode</span></code></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.taskrefs">
<code class="descname">taskrefs</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.taskrefs" title="Permalink to this definition"></a></dt>
<dd><p>The list of tasks defined by this provider</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="#windows.winobject.event_log.PropertyArray" title="windows.winobject.event_log.PropertyArray"><code class="xref py py-class docutils literal notranslate"><span class="pre">PropertyArray</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.tasks_metadata">
<code class="descname">tasks_metadata</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.tasks_metadata" title="Permalink to this definition"></a></dt>
<dd><p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataTask</span></code> for each opcode this provider defines</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Yield:</th><td class="field-body"><code class="xref py py-class docutils literal notranslate"><span class="pre">PublisherMetadataTask</span></code></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.PublisherMetadata.value">
<code class="descname">value</code><a class="headerlink" href="#windows.winobject.event_log.PublisherMetadata.value" title="Permalink to this definition"></a></dt>
@@ -459,6 +619,12 @@
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EvtEvent.date">
<code class="descname">date</code><a class="headerlink" href="#windows.winobject.event_log.EvtEvent.date" title="Permalink to this definition"></a></dt>
<dd><p>Event.time_created as a datetime</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EvtEvent.id">
<code class="descname">id</code><a class="headerlink" href="#windows.winobject.event_log.EvtEvent.id" title="Permalink to this definition"></a></dt>
@@ -536,7 +702,7 @@
<dl class="attribute">
<dt id="windows.winobject.event_log.EventMetadata.channel_id">
<code class="descname">channel_id</code><a class="headerlink" href="#windows.winobject.event_log.EventMetadata.channel_id" title="Permalink to this definition"></a></dt>
<dd><p>The the Channel attribute of the Event definition</p>
<dd><p>The Channel attribute of the Event definition</p>
</dd></dl>
<dl class="attribute">
@@ -552,12 +718,36 @@ Retrieved by parsing <a class="reference internal" href="#windows.winobject.even
<dd><p>The ID of the Event</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EventMetadata.keyword">
<code class="descname">keyword</code><a class="headerlink" href="#windows.winobject.event_log.EventMetadata.keyword" title="Permalink to this definition"></a></dt>
<dd><p>The keyword attribute of the Event definition</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EventMetadata.level">
<code class="descname">level</code><a class="headerlink" href="#windows.winobject.event_log.EventMetadata.level" title="Permalink to this definition"></a></dt>
<dd><p>The level attribute of the Event definition</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EventMetadata.message_id">
<code class="descname">message_id</code><a class="headerlink" href="#windows.winobject.event_log.EventMetadata.message_id" title="Permalink to this definition"></a></dt>
<dd><p>Identifies the message attribute of the event definition.</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EventMetadata.opcode">
<code class="descname">opcode</code><a class="headerlink" href="#windows.winobject.event_log.EventMetadata.opcode" title="Permalink to this definition"></a></dt>
<dd><p>The opcode attribute of the Event definition</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EventMetadata.task">
<code class="descname">task</code><a class="headerlink" href="#windows.winobject.event_log.EventMetadata.task" title="Permalink to this definition"></a></dt>
<dd><p>The task attribute of the Event definition</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.event_log.EventMetadata.template">
<code class="descname">template</code><a class="headerlink" href="#windows.winobject.event_log.EventMetadata.template" title="Permalink to this definition"></a></dt>
+8 -7
View File
@@ -16,7 +16,7 @@
<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" />
<link rel="next" title="14.1. Windef" href="windef_generated.html" />
<link rel="next" title="14.1. WinDef" href="windef_generated.html" />
<link rel="prev" title="13. windows.rpc ALPC-based Windows RPC" href="rpc.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
@@ -29,7 +29,7 @@
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="windef_generated.html" title="14.1. Windef"
<a href="windef_generated.html" title="14.1. WinDef"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="rpc.html" title="13. windows.rpc ALPC-based Windows RPC"
@@ -58,10 +58,11 @@
<p>Here is every generated definition by type:</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="windef_generated.html">14.1. Windef</a></li>
<li class="toctree-l1"><a class="reference internal" href="windef_generated.html">14.1. WinDef</a></li>
<li class="toctree-l1"><a class="reference internal" href="ntstatus_generated.html">14.2. Ntstatus</a></li>
<li class="toctree-l1"><a class="reference internal" href="winstructs_generated.html">14.3. Winstructs</a></li>
<li class="toctree-l1"><a class="reference internal" href="winstructs_generated.html#winenums">14.4. WinEnums</a></li>
<li class="toctree-l1"><a class="reference internal" href="winerror_generated.html">14.5. WinError</a></li>
</ul>
</div>
<dl class="class">
@@ -77,7 +78,7 @@
</dd></dl>
<div class="section" id="example">
<h2>14.5. Example<a class="headerlink" href="#example" title="Permalink to this headline"></a></h2>
<h2>14.6. Example<a class="headerlink" href="#example" title="Permalink to this headline"></a></h2>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">windows.generated_def</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">windows.generated_def</span> <span class="kn">as</span> <span class="nn">gdef</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">gdef</span>
@@ -125,7 +126,7 @@
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">14. <code class="docutils literal notranslate"><span class="pre">windows.generated_def</span></code> generated Windows defines and structures</a><ul>
<li><a class="reference internal" href="#example">14.5. Example</a></li>
<li><a class="reference internal" href="#example">14.6. Example</a></li>
</ul>
</li>
</ul>
@@ -135,7 +136,7 @@
title="previous chapter">13. <code class="docutils literal notranslate"><span class="pre">windows.rpc</span></code> ALPC-based Windows RPC</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="windef_generated.html"
title="next chapter">14.1. Windef</a></p>
title="next chapter">14.1. WinDef</a></p>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
@@ -169,7 +170,7 @@
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="windef_generated.html" title="14.1. Windef"
<a href="windef_generated.html" title="14.1. WinDef"
>next</a> |</li>
<li class="right" >
<a href="rpc.html" title="13. windows.rpc ALPC-based Windows RPC"
+17727 -951
View File
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -54,8 +54,7 @@
<span class="target" id="module-windows.winobject.handle"></span><dl class="class">
<dt id="windows.winobject.handle.Handle">
<em class="property">class </em><code class="descclassname">windows.winobject.handle.</code><code class="descname">Handle</code><a class="reference internal" href="_modules/windows/winobject/handle.html#Handle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.handle.Handle" title="Permalink to this definition"></a></dt>
<dd><p>A handle of the system</p>
<dl class="attribute">
<dd><dl class="attribute">
<dt id="windows.winobject.handle.Handle.infos">
<code class="descname">infos</code><a class="headerlink" href="#windows.winobject.handle.Handle.infos" title="Permalink to this definition"></a></dt>
<dd><p>TODO: DOC</p>
+5 -5
View File
@@ -17,7 +17,7 @@
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="16. Early Work In Progress" href="wip.html" />
<link rel="prev" title="14.3. Winstructs" href="winstructs_generated.html" />
<link rel="prev" title="14.5. Windef" href="winerror_generated.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
@@ -32,7 +32,7 @@
<a href="wip.html" title="16. Early Work In Progress"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="winstructs_generated.html" title="14.3. Winstructs"
<a href="winerror_generated.html" title="14.5. Windef"
accesskey="P">previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 0.5 documentation</a> &#187;</li>
</ul>
@@ -190,8 +190,8 @@
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="winstructs_generated.html"
title="previous chapter">14.3. Winstructs</a></p>
<p class="topless"><a href="winerror_generated.html"
title="previous chapter">14.5. Windef</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="wip.html"
title="next chapter">16. Early Work In Progress</a></p>
@@ -231,7 +231,7 @@
<a href="wip.html" title="16. Early Work In Progress"
>next</a> |</li>
<li class="right" >
<a href="winstructs_generated.html" title="14.3. Winstructs"
<a href="winerror_generated.html" title="14.5. Windef"
>previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 0.5 documentation</a> &#187;</li>
</ul>
+3 -2
View File
@@ -161,11 +161,12 @@ I am always glad to have feedbacks from people using this project.</p>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="generated.html">14. <code class="docutils literal notranslate"><span class="pre">windows.generated_def</span></code> generated Windows defines and structures</a><ul>
<li class="toctree-l2"><a class="reference internal" href="windef_generated.html">14.1. Windef</a></li>
<li class="toctree-l2"><a class="reference internal" href="windef_generated.html">14.1. WinDef</a></li>
<li class="toctree-l2"><a class="reference internal" href="ntstatus_generated.html">14.2. Ntstatus</a></li>
<li class="toctree-l2"><a class="reference internal" href="winstructs_generated.html">14.3. Winstructs</a></li>
<li class="toctree-l2"><a class="reference internal" href="winstructs_generated.html#winenums">14.4. WinEnums</a></li>
<li class="toctree-l2"><a class="reference internal" href="generated.html#example">14.5. Example</a></li>
<li class="toctree-l2"><a class="reference internal" href="winerror_generated.html">14.5. WinError</a></li>
<li class="toctree-l2"><a class="reference internal" href="generated.html#example">14.6. Example</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="iat_hook.html">15. IAT hooking</a><ul>
+4 -4
View File
@@ -17,7 +17,7 @@
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="14.3. Winstructs" href="winstructs_generated.html" />
<link rel="prev" title="14.1. Windef" href="windef_generated.html" />
<link rel="prev" title="14.1. WinDef" href="windef_generated.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
@@ -32,7 +32,7 @@
<a href="winstructs_generated.html" title="14.3. Winstructs"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="windef_generated.html" title="14.1. Windef"
<a href="windef_generated.html" title="14.1. WinDef"
accesskey="P">previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 0.5 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="generated.html" accesskey="U">14. <code class="docutils literal notranslate"><span class="pre">windows.generated_def</span></code> generated Windows defines and structures</a> &#187;</li>
@@ -9026,7 +9026,7 @@
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="windef_generated.html"
title="previous chapter">14.1. Windef</a></p>
title="previous chapter">14.1. WinDef</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="winstructs_generated.html"
title="next chapter">14.3. Winstructs</a></p>
@@ -9066,7 +9066,7 @@
<a href="winstructs_generated.html" title="14.3. Winstructs"
>next</a> |</li>
<li class="right" >
<a href="windef_generated.html" title="14.1. Windef"
<a href="windef_generated.html" title="14.1. WinDef"
>previous</a> |</li>
<li class="nav-item nav-item-0"><a href="index.html">PythonForWindows 0.5 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="generated.html" >14. <code class="docutils literal notranslate"><span class="pre">windows.generated_def</span></code> generated Windows defines and structures</a> &#187;</li>
+1 -1
View File
@@ -105,7 +105,7 @@ from <code class="docutils literal notranslate"><span class="pre">windows.system
<h2>2.13.2. KernelObject<a class="headerlink" href="#kernelobject" title="Permalink to this headline"></a></h2>
<dl class="class">
<dt id="windows.winobject.object_manager.KernelObject">
<em class="property">class </em><code class="descclassname">windows.winobject.object_manager.</code><code class="descname">KernelObject</code><span class="sig-paren">(</span><em>path</em>, <em>name</em>, <em>type</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/object_manager.html#KernelObject"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.object_manager.KernelObject" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">windows.winobject.object_manager.</code><code class="descname">KernelObject</code><span class="sig-paren">(</span><em>path</em>, <em>name</em>, <em>type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/object_manager.html#KernelObject"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.object_manager.KernelObject" title="Permalink to this definition"></a></dt>
<dd><p>Represent an object in the Object Manager namespace</p>
<dl class="method">
<dt id="windows.winobject.object_manager.KernelObject.__getitem__">
+2 -2
View File
@@ -61,7 +61,7 @@
<h2>6.1. Helper functions<a class="headerlink" href="#helper-functions" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="windows.pipe.create">
<code class="descclassname">windows.pipe.</code><code class="descname">create</code><span class="sig-paren">(</span><em>addr</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.pipe.create" title="Permalink to this definition"></a></dt>
<code class="descclassname">windows.pipe.</code><code class="descname">create</code><span class="sig-paren">(</span><em>addr</em>, <em>security_descriptor=None</em><span class="sig-paren">)</span><a class="headerlink" href="#windows.pipe.create" title="Permalink to this definition"></a></dt>
<dd><p>Create a namedpipe pipe <code class="docutils literal notranslate"><span class="pre">addr</span></code></p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
@@ -134,7 +134,7 @@
<dl class="classmethod">
<dt id="windows.pipe.PipeConnection.create">
<em class="property">classmethod </em><code class="descname">create</code><span class="sig-paren">(</span><em>addr</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/pipe.html#PipeConnection.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.pipe.PipeConnection.create" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="descname">create</code><span class="sig-paren">(</span><em>addr</em>, <em>security_descriptor=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/pipe.html#PipeConnection.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.pipe.PipeConnection.create" title="Permalink to this definition"></a></dt>
<dd><p>Create a namedpipe pipe <code class="docutils literal notranslate"><span class="pre">addr</span></code></p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
+1 -1
View File
@@ -1015,7 +1015,7 @@ raises an exception if the remote thread raised one</p>
<dl class="method">
<dt id="windows.winobject.process.WinProcess.virtual_alloc">
<code class="descname">virtual_alloc</code><span class="sig-paren">(</span><em>size</em>, <em>prot=PAGE_EXECUTE_READWRITE(0x40)</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/process.html#WinProcess.virtual_alloc"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.process.WinProcess.virtual_alloc" title="Permalink to this definition"></a></dt>
<code class="descname">virtual_alloc</code><span class="sig-paren">(</span><em>size</em>, <em>prot=PAGE_EXECUTE_READWRITE(0x40)</em>, <em>addr=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/process.html#WinProcess.virtual_alloc"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.process.WinProcess.virtual_alloc" title="Permalink to this definition"></a></dt>
<dd><p>Allocate memory in the process</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
+9 -1
View File
@@ -87,7 +87,7 @@
<dl class="method">
<dt id="windows.rpc.RPCClient.call">
<code class="descname">call</code><span class="sig-paren">(</span><em>IID</em>, <em>method_offset</em>, <em>params</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/rpc/client.html#RPCClient.call"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.rpc.RPCClient.call" title="Permalink to this definition"></a></dt>
<code class="descname">call</code><span class="sig-paren">(</span><em>IID</em>, <em>method_offset</em>, <em>params</em>, <em>ipid=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/rpc/client.html#RPCClient.call"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.rpc.RPCClient.call" title="Permalink to this definition"></a></dt>
<dd><p>Call method number <code class="docutils literal notranslate"><span class="pre">method_offset</span></code> of interface <code class="docutils literal notranslate"><span class="pre">IID</span></code> with mashalled <code class="docutils literal notranslate"><span class="pre">params</span></code></p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
@@ -107,6 +107,14 @@
</table>
</dd></dl>
<dl class="method">
<dt id="windows.rpc.RPCClient.forge_alpc_request">
<code class="descname">forge_alpc_request</code><span class="sig-paren">(</span><em>IID</em>, <em>method_offset</em>, <em>params</em>, <em>ipid=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/rpc/client.html#RPCClient.forge_alpc_request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.rpc.RPCClient.forge_alpc_request" title="Permalink to this definition"></a></dt>
<dd><p>Craft an ALPC message containing an RPC request to call <code class="docutils literal notranslate"><span class="pre">method_offset</span></code> of interface <code class="docutils literal notranslate"><span class="pre">IID`</span>
<span class="pre">with</span> <span class="pre">``params</span></code>.
Can be used to craft request without directly sending it</p>
</dd></dl>
</dd></dl>
</div>
+80 -24
View File
@@ -783,7 +783,7 @@ Current thread token is &lt;Token TokenId=0x3f1fac85 Type=TokenImpersonation(0x2
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing actions:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">task</span><span class="o">.</span><span class="n">definition</span><span class="o">.</span><span class="n">actions</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Action: &lt;</span><span class="si">{action}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Type: &lt;</span><span class="si">{action.type}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Type: &lt;</span><span class="si">{action.type!r}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="s2">&quot;path&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * path: &lt;</span><span class="si">{action.path}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * arguments: &lt;</span><span class="si">{action.arguments}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">))</span>
@@ -791,7 +791,7 @@ Current thread token is &lt;Token TokenId=0x3f1fac85 Type=TokenImpersonation(0x2
<span class="c1"># import pdb;pdb.set_trace()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listing triggers:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">trigger</span> <span class="ow">in</span> <span class="n">task</span><span class="o">.</span><span class="n">definition</span><span class="o">.</span><span class="n">triggers</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Trigger type: &lt;</span><span class="si">{trigger.type}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">trigger</span><span class="o">=</span><span class="n">trigger</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Trigger type: &lt;</span><span class="si">{trigger.type!r}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">trigger</span><span class="o">=</span><span class="n">trigger</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">DEMO_FOLDER_NAME</span> <span class="o">=</span> <span class="s2">&quot;PFW_DEMO_FOLDER&quot;</span>
@@ -1076,7 +1076,7 @@ Current thread token is &lt;Token TokenId=0x3f1fac85 Type=TokenImpersonation(0x2
<span class="k">while</span> <span class="n">TODO</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">TODO</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">findname</span> <span class="ow">in</span> <span class="n">name</span><span class="p">:</span>
<span class="k">if</span> <span class="n">findname</span> <span class="ow">in</span> <span class="n">name</span> <span class="ow">or</span> <span class="n">findname</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">type</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;* </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">obj_with_link</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s2">&quot;Directory&quot;</span><span class="p">:</span>
<span class="n">TODO</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
@@ -1562,8 +1562,71 @@ No more tracing !
</pre></div>
</div>
</div>
<div class="section" id="windows-debug-functioncallbp">
<span id="sample-debugger-bp-functioncallbp"></span><h4>18.11.1.3. <a class="reference internal" href="debug.html#windows.debug.FunctionCallBP" title="windows.debug.FunctionCallBP"><code class="xref py py-class docutils literal notranslate"><span class="pre">windows.debug.FunctionCallBP</span></code></a><a class="headerlink" href="#windows-debug-functioncallbp" title="Permalink to this headline"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span> <span class="o">+</span> <span class="s2">&quot;\..\..&quot;</span><span class="p">))</span>
<span class="kn">import</span> <span class="nn">windows</span>
<span class="kn">import</span> <span class="nn">windows.test</span>
<span class="kn">import</span> <span class="nn">windows.debug</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="c1"># The debugge python will just print the result of</span>
<span class="c1"># 3 call to IsDebuggerPresent</span>
<span class="n">TARGET_PYTHON_CODE</span> <span class="o">=</span> <span class="s1">&#39;&quot;</span><span class="se">\</span>
<span class="s1">import ctypes;</span><span class="se">\</span>
<span class="s1">import time;</span><span class="se">\</span>
<span class="s1">IsDebuggerPresent = ctypes.windll.kernel32.IsDebuggerPresent;</span><span class="se">\</span>
<span class="s1">print(</span><span class="se">\&#39;</span><span class="s1">[DEBUGGE] IsDebuggerPresent=</span><span class="si">{0}</span><span class="se">\&#39;</span><span class="s1">.format(IsDebuggerPresent()));</span><span class="se">\</span>
<span class="s1">time.sleep(1);</span><span class="se">\</span>
<span class="s1">print(</span><span class="se">\&#39;</span><span class="s1">[DEBUGGE] IsDebuggerPresent=</span><span class="si">{0}</span><span class="se">\&#39;</span><span class="s1">.format(IsDebuggerPresent()));</span><span class="se">\</span>
<span class="s1">time.sleep(1);</span><span class="se">\</span>
<span class="s1">print(</span><span class="se">\&#39;</span><span class="s1">[DEBUGGE] IsDebuggerPresent=</span><span class="si">{0}</span><span class="se">\&#39;</span><span class="s1">.format(IsDebuggerPresent()));</span><span class="se">\</span>
<span class="s1">&quot;&#39;</span>
<span class="c1"># This breakpoint now nothing about its target argument</span>
<span class="c1"># It only now how to break at the return of the function</span>
<span class="c1"># This allow us to change the return value of any function</span>
<span class="k">class</span> <span class="nc">IncrementReturnValue</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">FunctionCallBP</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">initialvalue</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">IncrementReturnValue</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initialvalue</span> <span class="o">=</span> <span class="n">initialvalue</span>
<span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="c1"># Ask to break a the return of the function</span>
<span class="c1"># callback is ret_trigger</span>
<span class="bp">self</span><span class="o">.</span><span class="n">break_on_ret</span><span class="p">(</span><span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">ret_trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbg</span><span class="p">,</span> <span class="n">exc</span><span class="p">):</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">dbg</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">context</span>
<span class="c1"># Func result is an alias to EAX/RAX</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">func_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initialvalue</span>
<span class="c1"># Set the new context for the target thread</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">current_thread</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initialvalue</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">debug</span><span class="o">.</span><span class="n">Debugger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s2">&quot;-c&quot;</span><span class="p">,</span> <span class="n">TARGET_PYTHON_CODE</span><span class="p">])</span>
<span class="c1"># We could also give the direct address of the function</span>
<span class="c1"># But it would require to wait for the module to be loaded</span>
<span class="n">d</span><span class="o">.</span><span class="n">add_bp</span><span class="p">(</span><span class="n">IncrementReturnValue</span><span class="p">(</span><span class="s2">&quot;kernelbase!IsDebuggerPresent&quot;</span><span class="p">,</span> <span class="mi">42</span><span class="p">))</span>
<span class="n">d</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
</pre></div>
</div>
<p>Output</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="n">python</span> <span class="n">debug</span>\<span class="n">change_function_ret_value</span><span class="o">.</span><span class="n">py</span>
<span class="p">[</span><span class="n">DEBUGGE</span><span class="p">]</span> <span class="n">IsDebuggerPresent</span><span class="o">=</span><span class="mi">42</span>
<span class="p">[</span><span class="n">DEBUGGE</span><span class="p">]</span> <span class="n">IsDebuggerPresent</span><span class="o">=</span><span class="mi">43</span>
<span class="p">[</span><span class="n">DEBUGGE</span><span class="p">]</span> <span class="n">IsDebuggerPresent</span><span class="o">=</span><span class="mi">44</span>
</pre></div>
</div>
</div>
<div class="section" id="windows-debug-functionbp">
<h4>18.11.1.3. <a class="reference internal" href="debug.html#windows.debug.FunctionBP" title="windows.debug.FunctionBP"><code class="xref py py-class docutils literal notranslate"><span class="pre">windows.debug.FunctionBP</span></code></a><a class="headerlink" href="#windows-debug-functionbp" title="Permalink to this headline"></a></h4>
<span id="sample-debugger-bp-functionbp"></span><h4>18.11.1.4. <a class="reference internal" href="debug.html#windows.debug.FunctionBP" title="windows.debug.FunctionBP"><code class="xref py py-class docutils literal notranslate"><span class="pre">windows.debug.FunctionBP</span></code></a><a class="headerlink" href="#windows-debug-functionbp" title="Permalink to this headline"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
@@ -1630,7 +1693,7 @@ Exiting process
</div>
</div>
<div class="section" id="debugger-attach">
<span id="sample-debugger-attach"></span><h4>18.11.1.4. <a class="reference internal" href="debug.html#windows.debug.Debugger.attach" title="windows.debug.Debugger.attach"><code class="xref py py-func docutils literal notranslate"><span class="pre">Debugger.attach</span></code></a><a class="headerlink" href="#debugger-attach" title="Permalink to this headline"></a></h4>
<span id="sample-debugger-attach"></span><h4>18.11.1.5. <a class="reference internal" href="debug.html#windows.debug.Debugger.attach" title="windows.debug.Debugger.attach"><code class="xref py py-func docutils literal notranslate"><span class="pre">Debugger.attach</span></code></a><a class="headerlink" href="#debugger-attach" title="Permalink to this headline"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">pprint</span>
@@ -1683,7 +1746,7 @@ Exiting process
</div>
</div>
<div class="section" id="native-code-tester">
<h4>18.11.1.5. Native code tester<a class="headerlink" href="#native-code-tester" title="Permalink to this headline"></a></h4>
<h4>18.11.1.6. Native code tester<a class="headerlink" href="#native-code-tester" title="Permalink to this headline"></a></h4>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">argparse</span>
@@ -2631,9 +2694,10 @@ Result = &lt;my secret message&gt;
<div class="section" id="certificate-demo">
<span id="sample-crypto-certificate"></span><h3>18.14.2. Certificate demo<a class="headerlink" href="#certificate-demo" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">hashlib</span>
<span class="kn">import</span> <span class="nn">base64</span>
<span class="kn">import</span> <span class="nn">windows.crypto</span>
<span class="n">windowscert</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;-----BEGIN CERTIFICATE-----</span>
<span class="n">windowscert</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;&quot;-----BEGIN CERTIFICATE-----</span>
<span class="s2">MIIFBDCCA+ygAwIBAgITMwAAAQZuwyXEMckYDgAAAAABBjANBgkqhkiG9w0BAQsF</span>
<span class="s2">ADCBhDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT</span>
<span class="s2">B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEuMCwGA1UE</span>
@@ -2664,7 +2728,7 @@ Result = &lt;my secret message&gt;
<span class="s2">-----END CERTIFICATE-----&quot;&quot;&quot;</span>
<span class="n">raw_cert</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">windowscert</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;base64&#39;</span><span class="p">)</span>
<span class="n">raw_cert</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">decodestring</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">windowscert</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
<span class="n">cert</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">Certificate</span><span class="o">.</span><span class="n">from_buffer</span><span class="p">(</span><span class="n">raw_cert</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Analysing certificate: </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">cert</span><span class="p">))</span>
@@ -2674,7 +2738,7 @@ Result = &lt;my secret message&gt;
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * serial: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="o">.</span><span class="n">serial</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * encoded start: &lt;</span><span class="si">{0!r}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert</span><span class="o">.</span><span class="n">encoded</span><span class="p">[:</span><span class="mi">20</span><span class="p">]))</span>
<span class="nb">print</span> <span class="s2">&quot;&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">chains</span> <span class="o">=</span> <span class="n">cert</span><span class="o">.</span><span class="n">chains</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;This certificate has </span><span class="si">{0}</span><span class="s2"> certificate chain(s)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">chains</span><span class="p">)))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">chain</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">chains</span><span class="p">):</span>
@@ -2684,7 +2748,7 @@ Result = &lt;my secret message&gt;
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; </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">ccert</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * issuer: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ccert</span><span class="o">.</span><span class="n">issuer</span><span class="p">))</span>
<span class="nb">print</span> <span class="s2">&quot;&quot;</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">cert_to_verif</span> <span class="o">=</span> <span class="n">ccert</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Looking for &lt;</span><span class="si">{0}</span><span class="s2">&gt; in trusted certificates&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cert_to_verif</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="n">root_store</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">CertificateStore</span><span class="o">.</span><span class="n">from_system_store</span><span class="p">(</span><span class="s2">&quot;Root&quot;</span><span class="p">)</span>
@@ -2710,7 +2774,7 @@ Result = &lt;my secret message&gt;
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;File has </span><span class="si">{0}</span><span class="s2"> signer(s):&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cryptobj</span><span class="o">.</span><span class="n">crypt_msg</span><span class="o">.</span><span class="n">nb_signer</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">signer</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">cryptobj</span><span class="o">.</span><span class="n">crypt_msg</span><span class="o">.</span><span class="n">signers</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Signer </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">i</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Issuer: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">crypto</span><span class="o">.</span><span class="n">ECRYPT_DATA_BLOB</span><span class="p">(</span><span class="n">signer</span><span class="o">.</span><span class="n">Issuer</span><span class="o">.</span><span class="n">cbData</span><span class="p">,</span> <span class="n">signer</span><span class="o">.</span><span class="n">Issuer</span><span class="o">.</span><span class="n">pbData</span><span class="p">)</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Issuer: </span><span class="si">{0!r}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">signer</span><span class="o">.</span><span class="n">Issuer</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * HashAlgorithme: </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">signer</span><span class="o">.</span><span class="n">HashAlgorithm</span><span class="o">.</span><span class="n">pszObjId</span><span class="p">))</span>
<span class="n">cert</span> <span class="o">=</span> <span class="n">cryptobj</span><span class="o">.</span><span class="n">cert_store</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">signer</span><span class="o">.</span><span class="n">Issuer</span><span class="p">,</span> <span class="n">signer</span><span class="o">.</span><span class="n">SerialNumber</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; * Certificate: </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">cert</span><span class="p">))</span>
@@ -2771,24 +2835,16 @@ File embdeds 2 certificate(s):
<span class="n">PORT_NAME</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\RPC Control\PythonForWindowsPORT&quot;</span>
<span class="k">def</span> <span class="nf">print_alpc_handle</span><span class="p">():</span>
<span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">windows</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">handles</span><span class="p">:</span>
<span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">dwProcessId</span> <span class="o">!=</span> <span class="n">windows</span><span class="o">.</span><span class="n">current_process</span><span class="o">.</span><span class="n">pid</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s2">&quot;ALPC Port&quot;</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">h</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">h</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">h</span><span class="o">.</span><span class="n">wValue</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">alpc_server</span><span class="p">():</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">windows</span><span class="o">.</span><span class="n">alpc</span><span class="o">.</span><span class="n">AlpcServer</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">)</span> <span class="c1"># Create the ALPC Port</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] PORT &lt;</span><span class="si">{0}</span><span class="s2">&gt; CREATED&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">PORT_NAME</span><span class="p">))</span>
<span class="n">print_alpc_handle</span><span class="p">()</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">server</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span> <span class="c1"># Wait for a message</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Message type = </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">msg</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Received data: &lt;</span><span class="si">{0}</span><span class="s2">&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="k">assert</span> <span class="n">msg</span><span class="o">.</span><span class="n">type</span> <span class="o">&amp;</span> <span class="mh">0xfff</span> <span class="o">==</span> <span class="n">LPC_CONNECTION_REQUEST</span> <span class="c1"># Check that message is a connection request</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;[SERV] Connection request&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">accept_connection</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">print_alpc_handle</span><span class="p">()</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">server</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span> <span class="c1"># Wait for a real message</span>
<span class="nb">print</span> <span class="s2">&quot;&quot;</span>
@@ -2800,7 +2856,6 @@ File embdeds 2 certificate(s):
<span class="c1"># - Recreate a Message and copy the MessageId</span>
<span class="n">msg</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s2">&quot;REQUEST &#39;</span><span class="si">{0}</span><span class="s2">&#39; DONE&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">print_alpc_handle</span><span class="p">()</span>
@@ -3563,9 +3618,10 @@ BYE
<li><a class="reference internal" href="#debugger">18.11.1. <code class="docutils literal notranslate"><span class="pre">Debugger</span></code></a><ul>
<li><a class="reference internal" href="#on-setup">18.11.1.1. on_setup</a></li>
<li><a class="reference internal" href="#single-stepping">18.11.1.2. Single stepping</a></li>
<li><a class="reference internal" href="#windows-debug-functionbp">18.11.1.3. <code class="docutils literal notranslate"><span class="pre">windows.debug.FunctionBP</span></code></a></li>
<li><a class="reference internal" href="#debugger-attach">18.11.1.4. <code class="docutils literal notranslate"><span class="pre">Debugger.attach</span></code></a></li>
<li><a class="reference internal" href="#native-code-tester">18.11.1.5. Native code tester</a></li>
<li><a class="reference internal" href="#windows-debug-functioncallbp">18.11.1.3. <code class="docutils literal notranslate"><span class="pre">windows.debug.FunctionCallBP</span></code></a></li>
<li><a class="reference internal" href="#windows-debug-functionbp">18.11.1.4. <code class="docutils literal notranslate"><span class="pre">windows.debug.FunctionBP</span></code></a></li>
<li><a class="reference internal" href="#debugger-attach">18.11.1.5. <code class="docutils literal notranslate"><span class="pre">Debugger.attach</span></code></a></li>
<li><a class="reference internal" href="#native-code-tester">18.11.1.6. Native code tester</a></li>
</ul>
</li>
<li><a class="reference internal" href="#localdebugger">18.11.2. <code class="docutils literal notranslate"><span class="pre">LocalDebugger</span></code></a><ul>
+1 -1
View File
File diff suppressed because one or more lines are too long
+19 -6
View File
@@ -70,8 +70,8 @@
<p class="last">TODO: free the underliying buffer when not needed anymore for now the underliying memory is never freed.</p>
</div>
<dl class="attribute">
<dt id="windows.security.SecurityDescriptor.DEFAULT_SECURITY_INFORMATION">
<code class="descname">DEFAULT_SECURITY_INFORMATION</code><em class="property"> = 231L</em><a class="headerlink" href="#windows.security.SecurityDescriptor.DEFAULT_SECURITY_INFORMATION" title="Permalink to this definition"></a></dt>
<dt id="windows.security.SecurityDescriptor.SERVICE_SECURITY_INFORMATION">
<code class="descname">SERVICE_SECURITY_INFORMATION</code><em class="property"> = 7L</em><a class="headerlink" href="#windows.security.SecurityDescriptor.SERVICE_SECURITY_INFORMATION" title="Permalink to this definition"></a></dt>
<dd><p>The default <code class="docutils literal notranslate"><span class="pre">flags</span></code> value for functions expecting a
<a class="reference external" href="https://docs.microsoft.com/en-us/windows/desktop/SecAuthZ/security-information">SECURITY_INFORMATION</a>.</p>
<p>This value regroups the followings flags:</p>
@@ -83,6 +83,7 @@
<li><code class="docutils literal notranslate"><span class="pre">ATTRIBUTE_SECURITY_INFORMATION</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">SCOPE_SECURITY_INFORMATION</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">PROCESS_TRUST_LABEL_SECURITY_INFORMATION</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">LABEL_SECURITY_INFORMATION</span></code></li>
</ul>
</div></blockquote>
<div class="admonition warning">
@@ -130,16 +131,22 @@ Binary security descriptor can be found in the registry for example</p>
<dl class="classmethod">
<dt id="windows.security.SecurityDescriptor.from_filename">
<em class="property">classmethod </em><code class="descname">from_filename</code><span class="sig-paren">(</span><em>filename</em>, <em>query_sacl=False</em>, <em>flags=231L</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.from_filename"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.from_filename" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="descname">from_filename</code><span class="sig-paren">(</span><em>filename</em>, <em>query_sacl=False</em>, <em>flags=247L</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.from_filename"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.from_filename" title="Permalink to this definition"></a></dt>
<dd><p>Retrieve the security descriptor for the file <code class="docutils literal notranslate"><span class="pre">filename</span></code></p>
</dd></dl>
<dl class="classmethod">
<dt id="windows.security.SecurityDescriptor.from_handle">
<em class="property">classmethod </em><code class="descname">from_handle</code><span class="sig-paren">(</span><em>handle</em>, <em>query_sacl=False</em>, <em>flags=231L</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.from_handle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.from_handle" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="descname">from_handle</code><span class="sig-paren">(</span><em>handle</em>, <em>query_sacl=False</em>, <em>flags=247L</em>, <em>obj_type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.from_handle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.from_handle" title="Permalink to this definition"></a></dt>
<dd><p>Retrieve the security descriptor for the kernel object described by``handle``</p>
</dd></dl>
<dl class="classmethod">
<dt id="windows.security.SecurityDescriptor.from_service">
<em class="property">classmethod </em><code class="descname">from_service</code><span class="sig-paren">(</span><em>filename</em>, <em>query_sacl=False</em>, <em>flags=7L</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.from_service"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.from_service" title="Permalink to this definition"></a></dt>
<dd><p>Retrieve the security descriptor for the service named <code class="docutils literal notranslate"><span class="pre">service</span></code></p>
</dd></dl>
<dl class="classmethod">
<dt id="windows.security.SecurityDescriptor.from_string">
<em class="property">classmethod </em><code class="descname">from_string</code><span class="sig-paren">(</span><em>sddl</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.from_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.from_string" title="Permalink to this definition"></a></dt>
@@ -204,7 +211,7 @@ Binary security descriptor can be found in the registry for example</p>
<dl class="attribute">
<dt id="windows.security.SecurityDescriptor.sacl">
<code class="descname">sacl</code><a class="headerlink" href="#windows.security.SecurityDescriptor.sacl" title="Permalink to this definition"></a></dt>
<dd><p>The SACL of the security descriptor. You may need special attention to retrieve it (see <a class="reference internal" href="#windows.security.SecurityDescriptor.DEFAULT_SECURITY_INFORMATION" title="windows.security.SecurityDescriptor.DEFAULT_SECURITY_INFORMATION"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">DEFAULT_SECURITY_INFORMATION</span></code></a>)</p>
<dd><p>The SACL of the security descriptor. You may need special attention to retrieve it (see <code class="xref any docutils literal notranslate"><span class="pre">DEFAULT_SECURITY_INFORMATION</span></code>)</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
@@ -215,9 +222,15 @@ Binary security descriptor can be found in the registry for example</p>
</table>
</dd></dl>
<dl class="method">
<dt id="windows.security.SecurityDescriptor.to_filename">
<code class="descname">to_filename</code><span class="sig-paren">(</span><em>filename</em>, <em>flags=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.to_filename"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.to_filename" title="Permalink to this definition"></a></dt>
<dd><p>Test method: WILL CHANGE</p>
</dd></dl>
<dl class="method">
<dt id="windows.security.SecurityDescriptor.to_string">
<code class="descname">to_string</code><span class="sig-paren">(</span><em>security_information=231L</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.to_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.to_string" title="Permalink to this definition"></a></dt>
<code class="descname">to_string</code><span class="sig-paren">(</span><em>security_information=247L</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/security.html#SecurityDescriptor.to_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.security.SecurityDescriptor.to_string" title="Permalink to this definition"></a></dt>
<dd><p>Return the SDDL representation of the security descriptor</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
-63
View File
@@ -109,69 +109,6 @@
</dd></dl>
<dl class="class">
<dt id="windows.winobject.service.ServiceA">
<em class="property">class </em><code class="descclassname">windows.winobject.service.</code><code class="descname">ServiceA</code><a class="reference internal" href="_modules/windows/winobject/service.html#ServiceA"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.service.ServiceA" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">windows.winobject.service.Service</span></code>, <a class="reference internal" href="winstructs_generated.html#windows.generated_def.winstructs._ENUM_SERVICE_STATUS_PROCESSA" title="windows.generated_def.winstructs._ENUM_SERVICE_STATUS_PROCESSA"><code class="xref py py-class docutils literal notranslate"><span class="pre">windows.generated_def.winstructs._ENUM_SERVICE_STATUS_PROCESSA</span></code></a></p>
<p>A Service object with ascii data</p>
<dl class="attribute">
<dt id="windows.winobject.service.ServiceA.description">
<code class="descname">description</code><a class="headerlink" href="#windows.winobject.service.ServiceA.description" title="Permalink to this definition"></a></dt>
<dd><p>The description of the service</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.service.ServiceA.name">
<code class="descname">name</code><a class="headerlink" href="#windows.winobject.service.ServiceA.name" title="Permalink to this definition"></a></dt>
<dd><p>The name of the service</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.service.ServiceA.process">
<code class="descname">process</code><a class="headerlink" href="#windows.winobject.service.ServiceA.process" title="Permalink to this definition"></a></dt>
<dd><p>The process running the service (if any)</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="process.html#windows.winobject.process.WinProcess" title="windows.winobject.process.WinProcess"><code class="xref py py-class docutils literal notranslate"><span class="pre">WinProcess</span></code></a> or <code class="docutils literal notranslate"><span class="pre">None</span></code></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.service.ServiceA.status">
<code class="descname">status</code><a class="headerlink" href="#windows.winobject.service.ServiceA.status" title="Permalink to this definition"></a></dt>
<dd><p>The status of the service</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="#windows.winobject.service.ServiceStatus" title="windows.winobject.service.ServiceStatus"><code class="xref py py-class docutils literal notranslate"><span class="pre">ServiceStatus</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
</dd></dl>
</div>
+46
View File
@@ -246,12 +246,30 @@
</table>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.task_scheduler.Task.enabled">
<code class="descname">enabled</code><a class="headerlink" href="#windows.winobject.task_scheduler.Task.enabled" title="Permalink to this definition"></a></dt>
<dd><p><code class="docutils literal notranslate"><span class="pre">True</span></code> is the task is enabled</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.task_scheduler.Task.last_runtime">
<code class="descname">last_runtime</code><a class="headerlink" href="#windows.winobject.task_scheduler.Task.last_runtime" title="Permalink to this definition"></a></dt>
<dd><p>Gets the last time the registered task was last run.</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.task_scheduler.Task.name">
<code class="descname">name</code><a class="headerlink" href="#windows.winobject.task_scheduler.Task.name" title="Permalink to this definition"></a></dt>
<dd><p>The name of the task</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.task_scheduler.Task.next_runtime">
<code class="descname">next_runtime</code><a class="headerlink" href="#windows.winobject.task_scheduler.Task.next_runtime" title="Permalink to this definition"></a></dt>
<dd><p>Gets the next time the registered task will be run.</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.task_scheduler.Task.path">
<code class="descname">path</code><a class="headerlink" href="#windows.winobject.task_scheduler.Task.path" title="Permalink to this definition"></a></dt>
@@ -278,6 +296,20 @@
<dd><p>current value</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.task_scheduler.Task.xml">
<code class="descname">xml</code><a class="headerlink" href="#windows.winobject.task_scheduler.Task.xml" title="Permalink to this definition"></a></dt>
<dd><p>The XML representig the task</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
</dd></dl>
</div>
@@ -322,6 +354,20 @@
<dd><p>current value</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.task_scheduler.TaskDefinition.xml">
<code class="descname">xml</code><a class="headerlink" href="#windows.winobject.task_scheduler.TaskDefinition.xml" title="Permalink to this definition"></a></dt>
<dd><p>The XML representig the task definition</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></td>
</tr>
</tbody>
</table>
</dd></dl>
</dd></dl>
</div>
+5864 -7464
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -222,7 +222,7 @@ It also offers some submodules aimed to help the interfacing with <code class="d
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body">[<a class="reference internal" href="service.html#windows.winobject.service.ServiceA" title="windows.winobject.service.ServiceA"><code class="xref py py-class docutils literal notranslate"><span class="pre">ServiceA</span></code></a>] A list of Service</td>
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body">[<code class="xref py py-class docutils literal notranslate"><span class="pre">ServiceA</span></code>] A list of Service</td>
</tr>
</tbody>
</table>
File diff suppressed because it is too large Load Diff
+14547 -4832
View File
File diff suppressed because it is too large Load Diff
+6
View File
@@ -181,6 +181,12 @@ if <code class="docutils literal notranslate"><span class="pre">superclass</span
</div>
</dd></dl>
<dl class="method">
<dt id="windows.winobject.wmi.WmiNamespace.delete_instance">
<code class="descname">delete_instance</code><span class="sig-paren">(</span><em>instance</em>, <em>flags=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/wmi.html#WmiNamespace.delete_instance"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.wmi.WmiNamespace.delete_instance" title="Permalink to this definition"></a></dt>
<dd><p>TODO: Document</p>
</dd></dl>
<dl class="method">
<dt id="windows.winobject.wmi.WmiNamespace.exec_method">
<code class="descname">exec_method</code><span class="sig-paren">(</span><em>obj</em>, <em>method</em>, <em>inparam</em>, <em>flags=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/wmi.html#WmiNamespace.exec_method"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.wmi.WmiNamespace.exec_method" title="Permalink to this definition"></a></dt>
+1
View File
@@ -22,6 +22,7 @@ Here is every generated definition by type:
windef_generated.rst
ntstatus_generated.rst
winstructs_generated.rst
winerror_generated.rst
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff