<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Параметры запущенного приложения]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=6443</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=6443&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Параметры запущенного приложения».]]></description>
		<lastBuildDate>Fri, 01 Jun 2012 14:05:40 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60643#p60643</link>
			<description><![CDATA[<div class="quotebox"><cite>creature.ws пишет:</cite><blockquote><p>С изменением <em>len := strlen(NewCommandLine)*2+2</em> работает как предполагалось.</p></blockquote></div><p>Спасибо, поправил пост.</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Fri, 01 Jun 2012 14:05:40 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60643#p60643</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60642#p60642</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Или ты про опечатку в шестой строке снизу?</p></blockquote></div><p>Именно так <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />С изменением <em>len := strlen(NewCommandLine)*2+2</em> работает как предполагалось.</p>]]></description>
			<author><![CDATA[null@example.com (creature.ws)]]></author>
			<pubDate>Fri, 01 Jun 2012 13:52:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60642#p60642</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60641#p60641</link>
			<description><![CDATA[<div class="quotebox"><cite>creature.ws пишет:</cite><blockquote><p><strong>len</strong> всегда будет больше <strong>MaxLen</strong>, при изменении<em> len := strlen(NewCommandLine)*2</em> и, в частности, len = 12&nbsp; — командная строка не изменяется.</p></blockquote></div><p>Не понял <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.<br /><strong>MaxLen</strong>- это количество байт, выделенное под строку. <strong>len</strong>- это количество байт нужное для записи строки, не считая нуля на конце(т.е. косяк, нужно было ещё 2 прибавить). Далее если <strong>len&gt;MaxLen</strong>, то просто записать строку нельзя, потому что может произойти переполнение и нужно либо обрезать строку, либо выделить другой участок памяти и прописать его в <strong>lpProcessParameters</strong>.<br />Или ты про опечатку в шестой строке снизу?</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Fri, 01 Jun 2012 13:50:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60641#p60641</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60640#p60640</link>
			<description><![CDATA[<p><strong>len</strong> всегда будет больше <strong>MaxLen</strong>, при изменении<em> len := strlen(NewCommandLine)*2</em> и, в частности, len = 12&nbsp; — командная строка не изменяется.</p>]]></description>
			<author><![CDATA[null@example.com (creature.ws)]]></author>
			<pubDate>Fri, 01 Jun 2012 12:45:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60640#p60640</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=60636#p60636</link>
			<description><![CDATA[<p>Возвращаясь к WMI и информации о процессах <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.<br />WMI почти всю информацию берёт из <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706%28v=vs.85%29.aspx">PEB</a> целевого процесса, таким образом подменив там информацию можно обманывать приложения, использующие эту технологию. А командная строка вообще нигде не сохраняется, кроме как в PEB(по крайней мере я не нашёл). Таким образом, затерев командную строку мы обманем все приложения, которые будут получать её после модификации. Пример кода подменяющего командную строку(проверял только на win7 x64, но должно везде работать):<br /></p><div class="codebox"><pre><code>msgbox % GetCommandLine()
ChangeCommandLine(&quot;бугага&quot;)
msgbox % GetCommandLine()
return

GetCommandLine()
{
   ComObjGet(&quot;winmgmts:&quot;).ExecQuery(&quot;Select * from Win32_Process WHERE ProcessId = &quot; . DllCall(&quot;GetCurrentProcessId&quot;, &quot;uint&quot;))._NewEnum.next(x)
   return x.CommandLine
}

ChangeCommandLine(NewCommandLine)
{
   VarSetCapacity(ProcessInformation, 6*a_PtrSize, 0)
   VarSetCapacity(ReturnLength, 4, 0)
   x:=DllCall(&quot;ntdll.dll\ZwQueryInformationProcess&quot;, &quot;ptr&quot;, -1, &quot;uint&quot;, 0, &quot;ptr&quot;, &amp;ProcessInformation, &quot;uint&quot;, 6*a_PtrSize, &quot;ptr&quot;, &amp;ReturnLength, &quot;int&quot;)
   if(x&lt;0)
   {
      msgbox ZwQueryInformationProcess error, return = %x%, GetLastError = %a_lasterror%
      return
   }
   lpPEB := NumGet(&amp;ProcessInformation, A_PtrSize, &quot;ptr&quot;)
   if(!lpPEB)
   {
      msgbox не получен адрес PEB
	  return
   }
   lpProcessParameters := NumGet(lpPEB|0, A_PtrSize*4, &quot;ptr&quot;)
   if(!lpProcessParameters)
   {
      msgbox не получен адрес RTL_USER_PROCESS_PARAMETERS
	  return
   }
   MaxLen:=NumGet(lpProcessParameters|0, 18+12*A_PtrSize, &quot;ushort&quot;)
   CommandLine := NumGet(lpProcessParameters|0, 24+12*A_PtrSize, &quot;ptr&quot;)
   if(!CommandLine)
   {
      msgbox не получен адрес командной строки
	  return
   }
   len := strlen(NewCommandLine)*2+2
   if(len&gt;MaxLen)
      len := MaxLen
   NumPut(len-2, 16+12*A_PtrSize, &quot;ushort&quot;)
   StrPut(NewCommandLine, CommandLine|0, len/2, &quot;UTF-16&quot;)
}</code></pre></div><p>После выполнения функции ChangeCommandLine ни одно приложение не сможет получить командную строку этого скрипта.</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Fri, 01 Jun 2012 11:40:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=60636#p60636</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53596#p53596</link>
			<description><![CDATA[<p>Его логика + моя эмпирика. Процессор грузится, если поставить проверку почаще, с 1ms заметно, — и грузится не скриптом. Прости, что встрял.</p>]]></description>
			<author><![CDATA[null@example.com (mih)]]></author>
			<pubDate>Thu, 17 Nov 2011 05:28:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53596#p53596</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53593#p53593</link>
			<description><![CDATA[<div class="quotebox"><cite>Александр_ пишет:</cite><blockquote><p>WMI тупо проверяет список каждые N секунд,</p></blockquote></div><p>Откуда такая информация?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 17 Nov 2011 04:15:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53593#p53593</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53582#p53582</link>
			<description><![CDATA[<div class="quotebox"><cite>mih пишет:</cite><blockquote><p>Да, насчет дробного числа - не подумал, но wmiprvse.exe начинает грузить процессор.</p></blockquote></div><p>Ага, именно поэтому лучше самому список процессов проверять.<br /></p><div class="quotebox"><cite>mih пишет:</cite><blockquote><p>за чем он ещё следит?</p></blockquote></div><p>А хрен его знает. Мне про WMI ничего хорошего не говорили, поэтому я не интересовался подробностями его работы.<br /></p><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>У меня такого не случалось.</p></blockquote></div><p>Ну это ведь просто логика! WMI тупо проверяет список каждые N секунд, соответственно если WMI не получит процессорное время, то не сможет вовремя сделать проверку. Вообще тема с запуском процессов уже изъезжена вдоль и поперёк. В режиме пользователя есть только функция CreateProcessNotify, её нужно экспортировать из dll, а саму библиотеку прописать в какой-то параметр реестра. У неё два существенных минуса- библиотека не подгружается в уже работающие процессы и при желании можно создать процесс в обход этого механизма. Все остальные методы базируются на полулегальных перехватах/подменах.</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Wed, 16 Nov 2011 20:46:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53582#p53582</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53568#p53568</link>
			<description><![CDATA[<div class="quotebox"><cite>Александр_ пишет:</cite><blockquote><p>Может не сработать из-за загруженности процессора.</p></blockquote></div><p>У меня такого не случалось.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 16 Nov 2011 14:59:58 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53568#p53568</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53565#p53565</link>
			<description><![CDATA[<p>Да, насчет дробного числа - не подумал, но wmiprvse.exe начинает грузить процессор. Аудит посмотрел, вроде работает, но не вижу ком. строки процесса, и вообще всё это в топорном стиле MS: &quot;сложно — о простом&quot;. Procmon, кажется, лучше (про утилиты Руссиновича, конечно, знал; но почему-то отложилось: procmon=regmon+filemon). Без скрипта, конечно, обойтись можно; — кстати, за чем он ещё следит?</p>]]></description>
			<author><![CDATA[null@example.com (mih)]]></author>
			<pubDate>Wed, 16 Nov 2011 12:22:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53565#p53565</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53562#p53562</link>
			<description><![CDATA[<div class="quotebox"><cite>mih пишет:</cite><blockquote><p>Но второй — опять же, мониторит только длительноживущие процессы (скрипт с одной стокой &quot;sleep 500&quot; он не замечает, &quot;sleep 1000&quot; — нормально). Поэтому — мою задачу в итоге не решает.</p></blockquote></div><p>Ну в запросе ведь указано проверять раз в секунду, можно и дробное число указать, например пол секунды:<br />ExecNotificationQuery(&quot;SELECT * FROM __InstanceCreationEvent WITHIN <strong>0.5</strong> WHERE TargetInstance ISA &#039;Win32_Process&#039;&quot;)<br />Кстати, он не только за созданием процессов следит.<br /></p><div class="quotebox"><cite>mih пишет:</cite><blockquote><p>А задача была такая: очень редко (не каждый день) возникает процесс (напр., Блокнот), который запускает неизвестный мне некий &quot;быстроживущий&quot; процесс-родитель (его можно с&#039;имитировать ahk-скриптом с одной строчкой запуска Блокнота) — я хочу этот запускающий процесс &quot;найти и обезвредить&quot;. Надо среагировать на возникновение Блокнота (например, твоим скриптом), и сообщить информацию о родительском процессе. PID этого процесса может сообщить скрипт из поста 15, а вот его имя (или ком. строку), если к тому времени процесс уже завершён — добыть не удается. Почему-то система может выдать pid процесса, запустившего Блокнот, но ничего более про него она уже не помнит, — поэтому этот pid бесполезен (я дополнил скрипт в посте 15, теперь он сообщает и имя parent процесса, но при условии, если он существует на момент работы скрипта). <br />Если таково свойство системы, то такой путь к успеху не приведёт, но можно по-другому: мониторить любой новый процесс и запоминать всё о нём, смотреть, возник ли далее Блокнот, и, — если возник, сообщать всё о предыдущем процессе. Тут и нужен хорошо реагирующий скрипт, но — твой скрипт не видит &quot;быстрых&quot; процессов, и поэтому вроде как бесполезен.</p></blockquote></div><p>Я выше писал- включи аудит процессов, скрипт вообще не нужен.<br /></p><div class="quotebox"><cite>mih пишет:</cite><blockquote><p>А ProcMon (как она прошла мимо меня, удивляюсь, спасибо Alex&#039;у2), похоже, засекает любые &quot;быстрые&quot; процессы, так что возможности какие-то существуют; а может, они что-то в обход системы делают.</p></blockquote></div><p>Process Monitor- это утилита от Марка Руссиновича, у него много подобных программ, позволяющих следить за работой ОС Windows, все они рассмотрены в его книгах серии &quot;Windows Internals&quot;. Process Monitor устанавливает в систему собственный драйвер, поэтому скриптом его действия повторить нельзя.<br /></p><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Отчего? Утечка памяти была только с объектом Refresher.</p></blockquote></div><p>Может не сработать из-за загруженности процессора. Правда в скриптах другого пути нету.</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Wed, 16 Nov 2011 10:00:05 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53562#p53562</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53552#p53552</link>
			<description><![CDATA[<div class="quotebox"><cite>Александр_ пишет:</cite><blockquote><p>Я бы не рекомендовал этим пользоваться, лучше уж самому раз в секунду проверять smile.</p></blockquote></div><p>Отчего? Утечка памяти была только с объектом Refresher.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 16 Nov 2011 01:51:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53552#p53552</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53551#p53551</link>
			<description><![CDATA[<p>Александр_, оба скрипта работают. Рабочую директорию получаю, спасибо.</p><p>Но второй — опять же, мониторит только длительноживущие процессы (скрипт с одной стокой &quot;sleep 500&quot; он не замечает, &quot;sleep 1000&quot; — нормально). Поэтому — мою задачу в итоге не решает. </p><p>А задача была такая: очень редко (не каждый день) возникает процесс (напр., Блокнот), который запускает неизвестный мне некий &quot;быстроживущий&quot; процесс-родитель (его можно с&#039;имитировать ahk-скриптом с одной строчкой запуска Блокнота) — я хочу этот запускающий процесс &quot;найти и обезвредить&quot;. Надо среагировать на возникновение Блокнота (например, твоим скриптом), и сообщить информацию о родительском процессе. PID этого процесса может сообщить скрипт из поста 15, а вот его имя (или ком. строку), если к тому времени процесс уже завершён — добыть не удается. Почему-то система может выдать pid процесса, запустившего Блокнот, но ничего более про него она уже не помнит, — поэтому этот pid бесполезен (я дополнил скрипт в посте 15, теперь он сообщает и имя parent процесса, но при условии, если он существует на момент работы скрипта). <br />Если таково свойство системы, то такой путь к успеху не приведёт, но можно по-другому: мониторить любой новый процесс и запоминать всё о нём, смотреть, возник ли далее Блокнот, и, — если возник, сообщать всё о предыдущем процессе. Тут и нужен хорошо реагирующий скрипт, но — твой скрипт не видит &quot;быстрых&quot; процессов, и поэтому вроде как бесполезен. А ProcMon (как она прошла мимо меня, удивляюсь, спасибо Alex&#039;у2), похоже, засекает любые &quot;быстрые&quot; процессы, так что возможности какие-то существуют; а может, они что-то в обход системы делают.</p><p>?</p>]]></description>
			<author><![CDATA[null@example.com (mih)]]></author>
			<pubDate>Wed, 16 Nov 2011 01:12:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53551#p53551</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53550#p53550</link>
			<description><![CDATA[<div class="quotebox"><cite>Александр_ пишет:</cite><blockquote><div class="quotebox"><cite>mih пишет:</cite><blockquote><p>И ещё вопрос. Различные диспетчеры (PE, PH, SE) сканируют процессы &quot;редко&quot;, и короткоживущие процессы не оставляют следа в списках. Есть ли какой способ отследить событие запуска процесса, если он достаточно быстро завершается? Это не очень в тему, но если не существует ответа, то не имеет смысла заводить отдельную.</p></blockquote></div><p>В режиме пользователя это обычно реализуется через перехват функции ZwCreateThread во всех процессах. На AHK это довольно неудобно делать <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> . Если нужно только зарегистрировать сам факт создания процесса, то можно включить аудит процессов в политике аудита windows и читать лог.</p></blockquote></div><p>Совсем забыл, в WMI ведь тоже есть всякие события/уведомления. Пример, который выводит сообщение при запуске процесса:<br /></p><div class="codebox"><pre><code>WMI := ComObjGet(&quot;winmgmts:&quot;).ExecNotificationQuery(&quot;SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA &#039;Win32_Process&#039;&quot;)
loop
{
    WMIEvent := WMI.NextEvent()
    msgbox % WMIEvent.TargetInstance.ExecutablePath ;%
}
return</code></pre></div><p>Я бы не рекомендовал этим пользоваться, лучше уж самому раз в секунду проверять <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Tue, 15 Nov 2011 20:52:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53550#p53550</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Параметры запущенного приложения]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53548#p53548</link>
			<description><![CDATA[<div class="quotebox"><cite>Александр_ пишет:</cite><blockquote><div class="quotebox"><cite>mih пишет:</cite><blockquote><p>Александр_, а нельзя ли выудить заодно &quot;current directory&quot; процесса?</p></blockquote></div><p>Я бы получал её как и писал в той теме.</p></blockquote></div><p>Код для AHK_L, можно переписать и под оригинальный:<br /></p><div class="codebox"><pre><code>;константы
ProcessBasicInformation   := 0
PROCESS_QUERY_INFORMATION := 0x0400
PROCESS_VM_READ           := 0x0010
;функции
;открытие процесса
OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)
{
   return DllCall(&quot;OpenProcess&quot;, &quot;uint&quot;, dwDesiredAccess, &quot;int&quot;, bInheritHandle, &quot;uint&quot;, dwProcessId, &quot;uint&quot;)
}
;получение информации о процессе
ZwQueryInformationProcess(ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength, ReturnLength)
{
   return DllCall(&quot;ntdll.dll\ZwQueryInformationProcess&quot;,&quot;uint&quot;, ProcessHandle, &quot;uint&quot;, ProcessInformationClass, &quot;uint&quot;, ProcessInformation, &quot;uint&quot;, ProcessInformationLength, &quot;uint&quot;, ReturnLength, &quot;uint&quot;)
}
;чтение данных из процесса
ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
{
   return DllCall(&quot;ReadProcessMemory&quot;, &quot;uint&quot;, hProcess, &quot;uint&quot;, lpBaseAddress, &quot;uint&quot;, lpBuffer, &quot;uint&quot;, nSize, &quot;uint&quot;, lpNumberOfBytesRead)
}

Process Exist ;, calc.exe
msgbox % GetProcCurrentDirectory(ErrorLevel) ;%
return 
;получает текущую директорию процесса по его PID&#039;у
GetProcCurrentDirectory(pid)
{
   global ProcessBasicInformation, PROCESS_QUERY_INFORMATION, PROCESS_VM_READ
   hProc := OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pid)
   if (hProc=0)
   {
      return Error
   }
   VarSetCapacity(ProcessInformation, 0x18) ; под PROCESS_BASIC_INFORMATION
   VarSetCapacity(Buffer, 8)
   VarSetCapacity(ReturnLength, 4) ; формальность
   ZwQueryInformationProcess(hProc, ProcessBasicInformation, &amp;ProcessInformation, 0x18, &amp;ReturnLength)
   ;по смещению 4 располагается адрес PEB
   ReadProcessMemory(hProc, NumGet(&amp;ProcessInformation, 4)+16, &amp;Buffer, 4, &amp;ReturnLength)
   ;по смещению 16 в PEB находится адрес структуры RTL_USER_PROCESS_PARAMETERS
   ReadProcessMemory(hProc, NumGet(&amp;Buffer)+36, &amp;Buffer, 8, &amp;ReturnLength)
   ; слово по смещению 0 содержит длину строки в байтах
   ; двойное слово по смещению 4 содержит адрес строки
   ; строка НЕ заканчивается нулём
   x:=NumGet(&amp;Buffer, 0, &quot;ushort&quot;)
   VarSetCapacity(str, x) ; выделяем необходимое место
   ReadProcessMemory(hProc, NumGet(&amp;Buffer, 4), &amp;str, x, &amp;ReturnLength)
   x:=StrGet(&amp;str, x/2, &quot;UTF-16&quot;)
   
   VarSetCapacity(ProcessInformation, 0) ; освобождаем память
   VarSetCapacity(str, 0)
   VarSetCapacity(Buffer, 0)
   VarSetCapacity(ReturnLength, 0)
   return x
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Tue, 15 Nov 2011 19:31:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53548#p53548</guid>
		</item>
	</channel>
</rss>
