<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Получить переменные окружения процесса, зная его PID]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=9705</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=9705&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Получить переменные окружения процесса, зная его PID».]]></description>
		<lastBuildDate>Tue, 10 Jan 2017 13:52:55 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110770#p110770</link>
			<description><![CDATA[<p>Т.е. запускать версию АНК с нужной разрядностью? Интересная мысль.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 10 Jan 2017 13:52:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110770#p110770</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110769#p110769</link>
			<description><![CDATA[<p>Да я из практического опыта. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Пробовал просто подставлять максимальное значение — проблем не разу не возникло. Ещё так можно:<br /></p><div class="codebox"><pre><code>$F10::
   WinGet, PID, PID, A
   MsgBox % GetEnv(PID)
;  MsgBox % GetEnv(PID, &quot;PATH&quot;)
   Return
   
GetEnv(PID, Var := &quot;&quot;)  {
   Is32bitProc := true
   if A_Is64bitOS  {
      hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_QUERY_INFORMATION := 0x400, Int, 0, UInt, PID, Ptr)
      DllCall(&quot;IsWow64Process&quot;, Ptr, hProc, UIntP, Is32bitProc)
      DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
   }
   SplitPath, A_AhkPath,, Dir
   if !FileExist(AhkPath := Dir . &quot;\AutoHotkeyU&quot; . (Is32bitProc ? &quot;32&quot; : &quot;64&quot;) . &quot;.exe&quot;)  {
      MsgBox, Исполнимый файл %AhkPath% не найден!`nДля работы скрипта установите AutoHotkey!
      Return
   }
   Return ExecScript( GetScript(PID, Var), AhkPath )
}

ExecScript(script, AhkPath)  {
   shell := ComObjCreate(&quot;WScript.Shell&quot;)
   exec := shell.Exec(AhkPath . &quot; /ErrorStdOut *&quot;)
   exec.StdIn.Write(script)
   exec.StdIn.Close()
   return exec.StdOut.ReadAll()
}

GetScript(PID, Var := &quot;&quot;)  {
   script =
   (
      #NoTrayIcon
      PID := %PID%, Var := &quot;%Var%&quot;
      PROCESS_QUERY_INFORMATION := 0x400, PROCESS_VM_READ := 0x10, cbPES_max := 0x3000
      info := STATUS_SUCCESS := 0, OffsetPES := A_PtrSize = 4 ? 0x48 : 0x80, sbMBI := A_PtrSize * 5 + 4 * 2
      
      hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, Int, 0, UInt, PID, Ptr)
      VarSetCapacity(PBI, szPBI := A_PtrSize * 6, 0)
      if DllCall(&quot;Ntdll\NtQueryInformationProcess&quot;, Ptr, hProc, UInt, info, Ptr, &amp;PBI, UInt, szPBI, UIntP, bytes) != STATUS_SUCCESS  {
         DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
         Return
      }
      pPEB := NumGet(&amp;PBI + A_PtrSize, &quot;Ptr&quot;)
      DllCall(&quot;ReadProcessMemory&quot;, Ptr, hProc, Ptr, pPEB + A_PtrSize * 4, PtrP, pRUPP, Ptr, A_PtrSize, UIntP, bytes)
      DllCall(&quot;ReadProcessMemory&quot;, Ptr, hProc, Ptr, pRUPP + OffsetPES, PtrP, pPES, Ptr, A_PtrSize, UIntP, bytes)
      
      VarSetCapacity(MBI, sbMBI, 0)
      DllCall(&quot;VirtualQueryEx&quot;, Ptr, hProc, Ptr, pPES, Ptr, &amp;MBI, Ptr, sbMBI)
      cbRegion := NumGet(&amp;MBI + A_PtrSize * 3)
      cbPES := (((pPES + cbRegion) &gt;&gt; 12) &lt;&lt; 12) - pPES
      (cbPES &gt; cbPES_max &amp;&amp; cbPES := cbPES_max)
      
      VarSetCapacity(PES, cbPES, 0)
      DllCall(&quot;ReadProcessMemory&quot;, Ptr, hProc, Ptr, pPES, Ptr, &amp;PES, Ptr, cbPES, UIntP, bytes)
      DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
      
      CurrPtr := &amp;PES, len := -1
      while len := DllCall(&quot;lstrlenW&quot;, Ptr, CurrPtr += len*2 + 2)
         env .= (A_Index = 1 ? &quot;&quot; : &quot;``r``n&quot;) . StrGet(CurrPtr)

      if Var  {
         RegExMatch(env, &quot;im``n)^&quot; Var &quot;=([^\n]+)$&quot;, Found)
         env := Found1
      }
      FileAppend, `% env, *
   )
   Return script
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 10 Jan 2017 11:43:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110769#p110769</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110768#p110768</link>
			<description><![CDATA[<p>Аполитично рассуждаешь. Раз была такая функция, то зачем было гаданиями заниматься и до крайнего случая доводить? Сейчас, конечно, можно и так сделать.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 10 Jan 2017 07:33:07 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110768#p110768</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110763#p110763</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>я её использую в моём скрипте, чтобы узнать размер региона памяти</p></blockquote></div><p>Так зачем его узнавать, просто ставь 0x4000. Хотя бы только для данной ситуации (32 — 64). По моим оценкам достаточно с большим запасом и 0x3000. А в крайнем случае просто функция чтения упадёт. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 10 Jan 2017 04:29:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110763#p110763</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110762#p110762</link>
			<description><![CDATA[<p>Нет, я именно про Query, я её использую в моём скрипте, чтобы узнать размер региона памяти. А Read и Write пока есть. Вот полный список экспорта: <a href="https://yadi.sk/d/iJ-rTrsD387dkM">https://yadi.sk/d/iJ-rTrsD387dkM</a>.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 10 Jan 2017 04:23:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110762#p110762</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110752#p110752</link>
			<description><![CDATA[<p><strong>YMP</strong>, а можешь ntdll 32-bit из win 10 запостить?<br /></p><div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Кстати, в Win10 функция ntdll.dll\NtWow64QueryVirtualMemory64 не существует</p></blockquote></div><p>Тут путаница, она должна называться NtWow64ReadVirtualMemory64. Точно ли нету? Так не пробовал (из 32-битного скрипта):</p><div class="codebox"><pre><code>hModule := DllCall(&quot;GetModuleHandle&quot;, &quot;str&quot;, &quot;Ntdll&quot;, Ptr)
ReadProcessMemory := DllCall(&quot;GetProcAddress&quot;, Ptr, hModule, AStr, &quot;NtWow64ReadVirtualMemory64&quot;, Ptr)</code></pre></div><p>?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 09 Jan 2017 17:09:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110752#p110752</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110728#p110728</link>
			<description><![CDATA[<p>Ага, спасибо за информацию, надо иметь в виду.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 09 Jan 2017 08:14:27 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110728#p110728</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110727#p110727</link>
			<description><![CDATA[<p>Кстати, в Win10 функция ntdll.dll\NtWow64QueryVirtualMemory64 не существует, так что мой код уже не работает, если скрипт 32 бита, а процесс 64. Функции чтения и записи пока что присутствуют. NtWow64QueryInformationProcess64 тоже есть.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Mon, 09 Jan 2017 07:12:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110727#p110727</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110724#p110724</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Вот тут структуры явно обозначены: <a href="http://www.nirsoft.net/kernel_struct/vista/RTL_USER_PROCESS_PARAMETERS.html">http://www.nirsoft.net/kernel_struct/vi … ETERS.html</a>.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Mon, 09 Jan 2017 03:54:08 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110724#p110724</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110709#p110709</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>UNICODE_STRING — это структура</p></blockquote></div><p>А, ясно, спасибо, я думал, это просто пойнтер.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 08 Jan 2017 18:40:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110709#p110709</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110706#p110706</link>
			<description><![CDATA[<p>UNICODE_STRING — это структура:<br /></p><div class="codebox"><pre><code>
typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} U
</code></pre></div><p>Занимает 8 и 16 байт соответственно, потому что в х64 нужно делать выравнивание каждого типа по его естественной границе, т.е. указатель должен быть по смещению 8. Кроме того такое выравнивание должно быть здесь:<br /></p><div class="codebox"><pre><code>
  PVOID                   ConsoleHandle;
  ULONG                   ConsoleFlags;
  HANDLE                  StdInputHandle;
</code></pre></div><p>Т.е. к ULONG добавляется ещё 4 байта, чтобы HANDLE был на смещении, кратном 8.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Sun, 08 Jan 2017 18:24:40 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110706#p110706</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=110701#p110701</link>
			<description><![CDATA[<p><strong>YMP</strong>, писал <a href="http://forum.script-coding.com/viewtopic.php?pid=110680#p110680">тут</a> код на основе твоего (второй вариант). Не пойму, как в структуре <a href="http://undocumented.ntinternals.net/index.html?page=UserMode%2FStructures%2FRTL_USER_PROCESS_PARAMETERS.html">RTL_USER_PROCESS_PARAMETERS</a> ты посчитал сдвиг OffsetPES := 0x48 для 32 и OffsetPES := 0x80 для 64? Я только методом тыка определил.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 08 Jan 2017 17:22:19 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=110701#p110701</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=84149#p84149</link>
			<description><![CDATA[<p>Да будет так. Поместил.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 24 Jun 2014 10:36:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=84149#p84149</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=84145#p84145</link>
			<description><![CDATA[<p>Спасибо за реализацию. Действительно скрипту место в Коллекции.</p>]]></description>
			<author><![CDATA[null@example.com (Aslan)]]></author>
			<pubDate>Tue, 24 Jun 2014 00:35:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=84145#p84145</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Получить переменные окружения процесса, зная его PID]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=84005#p84005</link>
			<description><![CDATA[<p>Отлично, можно и увековечить.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 19 Jun 2014 19:26:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=84005#p84005</guid>
		</item>
	</channel>
</rss>
