<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Guardant &mdash; "Исчезает" guardant Code]]></title>
		<link>https://forum.guardant.ru/topic/193/</link>
		<atom:link href="https://forum.guardant.ru/feed/rss/topic/193" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «"Исчезает" guardant Code».]]></description>
		<lastBuildDate>Fri, 06 Jul 2012 13:15:18 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/979/#p979</link>
			<description><![CDATA[<p>Ираклий,</p><p>На некоторых (!) серверных (!) чипсетах у нас наблюдалось периодическое зависание ключей Sign/Time/Code (раз в несколько недель при интенсивной работе) из за периодической потери USB-пакетов этими чипсетами. Мы в драйвере 6.0 ввели в протокол общения с ключами некоторую избыточность, в связи с чем зависания по нашим тестам прекратились. Однако один из клиентов тщательно проверивший информацию сообщим нам что зависания все еще бывают, но примерно в 1000 раз реже. Нам не удалось это воспроизвести, и клиент за последние полгода не поднимал этот вопрос.</p><p>Главный совет который я могу дать: откажитесь от излишнего использования GrdCodeLoad. В идеале за все время жизни ключа эта функция будет использована всего несколько раз, а во многих случаях всего 1 - при первоначальной прошивке ключа.</p><p>И поставить драйвер 6.0 нужно - он в любом случае (!) стабильнее 5.хх версий. Но я не могу гарантировать что проблемы зависания там нет. За прошедшие полгода, впрочем, мы таких сигналов не получали.</p>]]></description>
			<author><![CDATA[null@example.com (AndreyStepin)]]></author>
			<pubDate>Fri, 06 Jul 2012 13:15:18 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/979/#p979</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/978/#p978</link>
			<description><![CDATA[<p>На данный момоент, к сожалению, не ключ, программа или hardware, а именно драйвер ключа и оказался слабым звеном. Это к тому, что мы получили рекламацию от клиентов о &quot;незапуске&quot;, при анализе журналов обнаружили описанную проблему. Самое ужасное, что тупо перезапустить компьютер или передёрнуть ключ некому.</p><p>Нам надо получить подтверждение от разработчиков, что в связке с новыми драйверами проблемы зависания нет. Мы не можем тестировать guardant драйвера на наших клиентах, нам нужно <em><span style="color:blue">минимум</span></em> второе (кроме собственного) тестирование на отсутствие зависания.</p><p>PS: Указано </p><div class="quotebox"><cite>AndreyStepin пишет:</cite><blockquote><p>Мы исправляли подобную ошибку в драйвере 6.0</p></blockquote></div><p> - можно ознакомиться с деталями?</p><div class="quotebox"><cite>AndreyStepin пишет:</cite><blockquote><p>Ираклий,</p><p>Как я написал ранее мы проведем этот тест повторно на последних версиях API и драйвера (!). Мы исправляли подобную ошибку в драйвере 6.0, что подтверждается теперь и вашими наблюдениями. Однако конкретно GrdCodeLoad мы так пристально не гоняли на стресс-тесты по причине особенностей использования данной функции.</p><p>Если зависание будет обнаружено, оно _обязательно_ будет исправлено, но только в очередном релизе. Пока что воркараунд в виде перевтыкания ключа мы считаем разумным. Насколько я понимаю перезагрузка компьютера тоже вполне помогает. Апокалиптический сценарий ключа в запечатанном ящике в глухом лесу все же крайний случай, там все что угодно может выйти из строя. Вышка рухнет, электричество сбойнет, сам компьютер подвиснет, BSOD,... ключ не будет самым слабым звеном.</p><p>Поробуйте поработать с драйвером 6.0.0.101 - зависаний там быть не должно.</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (Ираклий)]]></author>
			<pubDate>Fri, 06 Jul 2012 12:52:48 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/978/#p978</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/960/#p960</link>
			<description><![CDATA[<p>Ираклий,</p><p>Как я написал ранее мы проведем этот тест повторно на последних версиях API и драйвера (!). Мы исправляли подобную ошибку в драйвере 6.0, что подтверждается теперь и вашими наблюдениями. Однако конкретно GrdCodeLoad мы так пристально не гоняли на стресс-тесты по причине особенностей использования данной функции.</p><p>Если зависание будет обнаружено, оно _обязательно_ будет исправлено, но только в очередном релизе. Пока что воркараунд в виде перевтыкания ключа мы считаем разумным. Насколько я понимаю перезагрузка компьютера тоже вполне помогает. Апокалиптический сценарий ключа в запечатанном ящике в глухом лесу все же крайний случай, там все что угодно может выйти из строя. Вышка рухнет, электричество сбойнет, сам компьютер подвиснет, BSOD,... ключ не будет самым слабым звеном.</p><p>Поробуйте поработать с драйвером 6.0.0.101 - зависаний там быть не должно.</p>]]></description>
			<author><![CDATA[null@example.com (AndreyStepin)]]></author>
			<pubDate>Tue, 26 Jun 2012 12:02:31 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/960/#p960</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/959/#p959</link>
			<description><![CDATA[<p>Вот это страсти закипели, не ожидал такой бурной дискуссии. </p><p>Насчёт корявого решения (воркараунд) - к сожалению не нашёл.</p><p>Насчёт критичности ошибки, для нас она не кажется такой уж малозначительной. По следующим причинам: 1) наш продукт - приложение безопасности,&nbsp; программа запущена постоянно, работает в большом числе случаев в автоматическом режиме (тоесть, оператор может быть, а может и вышел куда, а может и нет оператора -- только периодическое обслуживание); 2) GrdCodeLoad() мы делаем каждый раз при запуске. Если компьютер сбойнул в неподходящий момент а физически находится в запечатаном ящике на вышке в глухом лесу... Тут у наших заказчиков, и у нас, соответственно, - проблемы.</p><p>Напоследок, ещё одно наблюдение: установил драйвера 6.00.101 и мой тест стал работать заметно лучше. Теперь после первого запуска (на котором вызывается сбой) на второй запуск тест ругается как и раньше, НО есть отличие: GrdCleanup() явно что-то полезное делает и на третьем запуске программа уже работает корректно. Если ошибка действительно исправлена в новых драйверах, хотелось бы закрепить это достижение на будущие версии.</p><p><strong>Резюме: </strong><br />GRD API:<br />&nbsp; &nbsp; Version: 5.51<br />&nbsp; &nbsp; Release: 22.06.2011<br />Версия драйвера Guardant 5.50.85 </p><p>Работоспособность можно восстановить. Можно ли надеятся на официальную проверку производителем?</p>]]></description>
			<author><![CDATA[null@example.com (Ираклий)]]></author>
			<pubDate>Tue, 26 Jun 2012 10:57:29 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/959/#p959</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/958/#p958</link>
			<description><![CDATA[<div class="quotebox"><cite>AndreyStepin пишет:</cite><blockquote><p>Если бы проблема ключа приводила к зависанию/падению программы и потере данных пользователя - это была бы однозначно критичная ошибка. Здесь все с точностью до наоборот - проблема программы приводит к зависанию ключей. Причем проблема потенциально крайне редкая. Причем лечится перевтыканием ключа.</p><p>Опять же - если ошибка подтвердится на версиях 6.х - она обязательно будет исправлена. Я просто обозначил тот факт, что она по сути не препятствует функционированию ключей в 99.999% случаев, а там где она и проявляется - не вызывает никаких серьезных последствий и элементарно обходится. С моей личной точки зрения это некритично.</p></blockquote></div><p>Нет, я со всем согласен , но смотрите в чем тут дело. Человек описывает проблему, как часть описания он пишет, что если переткнуть ключ то все работает. Зачем ему повторять то, что он и так знает, выдавая за ответ поддержки? Он то создал тему после того как нашел воркараунд, не до, явно его он не устроил.</p>]]></description>
			<author><![CDATA[null@example.com (Neekeetos)]]></author>
			<pubDate>Tue, 26 Jun 2012 09:49:16 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/958/#p958</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/957/#p957</link>
			<description><![CDATA[<p>Если бы проблема ключа приводила к зависанию/падению программы и потере данных пользователя - это была бы однозначно критичная ошибка. Здесь все с точностью до наоборот - проблема программы приводит к зависанию ключей. Причем проблема потенциально крайне редкая. Причем лечится перевтыканием ключа.</p><p>Опять же - если ошибка подтвердится на версиях 6.х - она обязательно будет исправлена. Я просто обозначил тот факт, что она по сути не препятствует функционированию ключей в 99.999% случаев, а там где она и проявляется - не вызывает никаких серьезных последствий и элементарно обходится. С моей личной точки зрения это некритично.</p>]]></description>
			<author><![CDATA[null@example.com (AndreyStepin)]]></author>
			<pubDate>Tue, 26 Jun 2012 09:34:00 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/957/#p957</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/956/#p956</link>
			<description><![CDATA[<div class="quotebox"><cite>AndreyStepin пишет:</cite><blockquote><p>Критерий следующий: вызов GrdCodeLoad в подавляющем большинстве случаев производится 1 раз при программировании ключа в GrdUtil и занимает пару секунд. За годы службы ключа у конечного пользователя вызов этой функции может произойти еще несколько раз, при обновлении содержимого ключа. А может и никогда больше не произойти. В итоге получаем что за средний срок эксплуатации ключа 100 миллионов секунд (ключ вотктнут в компьютер в течение 3.5 лет) существует примерно 10-20 &quot;опасных&quot; секунд когда ключ может подвиснуть при аварийном завершении программы во время GrdCodeLoad.</p></blockquote></div><p>То есть логика такова, что интервал времени, в который возможен сбой, довольно мал по сравнению с временем жизни ключа , и поэтому это как бы не ошибка? А если допустим пользователь вообще не использует подобные функции, то и исправлять не требуется, потому что время использования вообще равно нулю?&nbsp; Не вижу тут ни логики ни критериев. </p><div class="quotebox"><cite>AndreyStepin пишет:</cite><blockquote><p>Причем это лечится простым перевтыканием ключа! То есть абсолютно простой и безопасный workaround. На мой взгляд бОльшая проблема здесь именно в аварийном завершении программы разработчика.</p></blockquote></div><p>Да все на свете лечится простым перевтыканием ключа, а если нет , то простой заменой ключа, это не воркараунд, воркараунд если вы предложите способ из программы определить, что ключ завис и сбросить его.</p>]]></description>
			<author><![CDATA[null@example.com (Neekeetos)]]></author>
			<pubDate>Tue, 26 Jun 2012 09:05:54 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/956/#p956</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/955/#p955</link>
			<description><![CDATA[<p>Критерий следующий: вызов GrdCodeLoad в подавляющем большинстве случаев производится 1 раз при программировании ключа в GrdUtil и занимает пару секунд. За годы службы ключа у конечного пользователя вызов этой функции может произойти еще несколько раз, при обновлении содержимого ключа. А может и никогда больше не произойти. В итоге получаем что за средний срок эксплуатации ключа 100 миллионов секунд (ключ вотктнут в компьютер в течение 3.5 лет) существует примерно 10-20 &quot;опасных&quot; секунд когда ключ может подвиснуть при аварийном завершении программы во время GrdCodeLoad. </p><p>Причем это лечится простым перевтыканием ключа! То есть абсолютно простой и безопасный workaround. На мой взгляд бОльшая проблема здесь именно в аварийном завершении программы разработчика.</p><p>В любом случае это надо проверить, в том числе в драйвере&nbsp; 6.0 и API 6.0 - мы там исправляли похожие вещи. И тесты нами проводились именно такие. Подвисаний не было. Впрочем, GrdCodeLoad это могло не коснуться именно ввиду редкости использования.</p>]]></description>
			<author><![CDATA[null@example.com (AndreyStepin)]]></author>
			<pubDate>Tue, 26 Jun 2012 08:37:13 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/955/#p955</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/954/#p954</link>
			<description><![CDATA[<div class="quotebox"><cite>AndreyStepin пишет:</cite><blockquote><p>Обращаю внимание что даже если ошибка имеется, она весьма и весьма некритична. Вызов GrdCodeLoad это редкий случай, а переподключение ключа организовать несложно при необходимости</p></blockquote></div><p>Раз уж обращаете внимание, озвучте также критерии по которым описанная ошибка вдруг стала &quot;весьма некритичной&quot; . Вызов функций апи является базовой функциональностью, описан ее отказ. На каком основании драйвер ключа вдруг залочил ключ и оставил сессию при том, что программа, создавшая сессию, прекратила свою работу? Судя по описанию таймаут таже не сработал. По моему ошибка является критичной, и далеко не факт что она относится только лишь к загрузке кода, думаю такое же поведение можно получить и при закрытии программы во время вызова любой другой функции апи.</p>]]></description>
			<author><![CDATA[null@example.com (Neekeetos)]]></author>
			<pubDate>Tue, 26 Jun 2012 08:22:00 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/954/#p954</guid>
		</item>
		<item>
			<title><![CDATA[Re: "Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/953/#p953</link>
			<description><![CDATA[<p>Спасибо за сообщение, такое поведение действительно может быть следствием ошибки API/драйверов. Однако это так же может быть особенностью микропрограммы. Мы проверим предоставленную Вами информации и сообщим о результатах.</p><p>Обращаю внимание что даже если ошибка имеется, она весьма и весьма некритична. Вызов GrdCodeLoad это редкий случай, а переподключение ключа организовать несложно при необходимости</p>]]></description>
			<author><![CDATA[null@example.com (AndreyStepin)]]></author>
			<pubDate>Tue, 26 Jun 2012 07:44:59 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/953/#p953</guid>
		</item>
		<item>
			<title><![CDATA["Исчезает" guardant Code]]></title>
			<link>https://forum.guardant.ru/post/947/#p947</link>
			<description><![CDATA[<p>Обнаружено непонятное поведение, мне кажется, что это ошибка в GuardantAPI или<br />драйверах.</p><p><strong>Условия возникновения:</strong> Программа аварийно завершается во время выполнения <em>GrdCodeLoad()</em><br /><strong>Проблема:</strong> При последующих запусках Guardant Code заблокирован, защита блокирует программу.</p><p>Наша программа загружает код в Guardant Code. Если во время загрузки пограмму аварийно прервать, то после этого ключик постоянно будет выдавать ошибку:<br /></p><div class="codebox"><pre><code>  FAILURE IN : GrdCodeLoad(teh_guardant, 0x00, gcexe.size(), &amp;gcexe[0], NULL)
  ERROR CODE : 23
             : Guardant dongle locked by another copy of protected application</code></pre></div><p>Избавиться от ошибки (и запустить программу) можно только переподключив ключ<br />защиты (вытащить из USB порта, вставить обратно).</p><p>Для иллюстрации написан короткий пример, который запускает отдельный поток работы с ключом защиты. В этом потоке открывается новая сессия, происходит login, после этого в память ключа записывается программа (в принципе, любая, она всё равно не будет запускаться, при тестировании использовалась программа размером 8 кб) перед началом заливки программы в ключ, поток guardant информирует главный поток о начале операции, а главный поток с небольшой задержкой экстренно завершает выполнение программы.</p><p>Результат первого запуска:<br /></p><div class="codebox"><pre><code>    D:\Projects\GrdTest\Release&gt;grdtest
    GrdTest sample application by iRacly 2012
     A initialize and start thread...
     T begin
     T Opening guardant session...
     T logged in, flushing...
     A grd thread is flushing...
     A done, aborting...</code></pre></div><p>Видно, что запустился поток защиты (строки, начинающиеся с T), открыта сессия, логин на ключе, начата загрузка программы. Главный поток получил сигнал о начале загрузки и самоубился. Поведение ожилаемое, всё нормально (пока, вроде бы)</p><p>Второй запуск:<br /></p><div class="codebox"><pre><code>    D:\Projects\GrdTest\Release&gt;grdtest
    GrdTest sample application by iRacly 2012
     A initialize and start thread...
     T begin
     T Opening guardant session...
     T logged in, flushing...
     A grd thread is flushing...
      FAILURE IN : GrdCodeLoad(teh_guardant, 0x00, gcexe.size(), &amp;gcexe[0], NULL)
      ERROR CODE : 23
                 : Guardant dongle locked by another copy of protected application
     T guardant ready
     T Using guardant session...
     T Closing guardant session...
     A done, aborting...</code></pre></div><p>Видно, что поток защиты не может загрузить программу в ключ.</p><br /><p><strong>Дополнительный наблюдения</strong>:<br /></p><ul><li><p>Ожидание 15+ минут (как в документации к <em>GrdCloseHandle()</em>) -- ситуация не меняется</p></li><li><p>После переподключения Guardant Code (вытащить/вставить из USB порта) - ключ работает штатно.</p></li><li><p>Попытки вызывать <em>GrdSetDriverMode()</em> положительных результатов не дали</p></li></ul><br /><p><strong>Конфигурация</strong>:<br />GRD API:<br />&nbsp; &nbsp; Version: 5.51<br />&nbsp; &nbsp; Release: 22.06.2011</p><p>&nbsp; &nbsp; Процессор Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz <br />&nbsp; &nbsp; Операционная система Microsoft Windows 7 (Build 7600) <br />&nbsp; &nbsp; Версия драйвера Guardant 5.50.85 <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; Модель Guardant Code USB <br />&nbsp; &nbsp; Дата и время выпуска 07 Jun 2010 16:20:30 <br />&nbsp; &nbsp; Версия ключа 0.1 <br />&nbsp; &nbsp; Тип микроконтроллера 09 <br />&nbsp; &nbsp; Номер программы 1, 0, 0, 14 <br />&nbsp; &nbsp; <br /><strong>Диагностика установленных ключей Guardant:</strong> (grddiag.exe после запуска теста)<br />&nbsp; &nbsp; Создание дескриптора ключа (GrdCreateHandle) <em>Успешно </em><br />&nbsp; &nbsp; Установка режима поиска ключа (GrdSetFindMode) <em>Успешно </em><br />&nbsp; &nbsp; Поиск ключа (GrdFind) Успешно <br />&nbsp; &nbsp; Проверка кода доступа к ключу <em>Данная утилита не может произвести подробное тестирование этого ключа. </em><br />&nbsp; &nbsp; Удаление дескриптора ключа (GrdCloseHandle) <em>Успешно</em> </p><p><strong>Исходный код теста</strong><br /></p><div class="codebox"><pre><code>// GrdTest.cpp : Defines the entry point for the console application.
//
// iRacly 2012
#include &lt;iostream&gt;
#include &lt;assert.h&gt;
#include &lt;Windows.h&gt;
#include &lt;process.h&gt;
#include &lt;fstream&gt;
#include &quot;GrdAPI\grdapi.h&quot;
#pragma comment (lib, &quot;Grdapi32.lib&quot;)


HANDLE beginWriteEvent;

#define VERIFY_GRD(X) { int result = (X);                                   \
    if (GrdE_OK != result) {                                                \
        char szErrorMsg[1024];                                              \
        int nRet = GrdFormatMessage(NULL, result, GrdLng_ENG, szErrorMsg,   \
            1024, NULL);                                                    \
        std::cerr                                                           \
            &lt;&lt; &quot;  FAILURE IN : &quot; &lt;&lt; #X &lt;&lt; std::endl                         \
            &lt;&lt; &quot;  ERROR CODE : &quot; &lt;&lt; result &lt;&lt; std::endl                     \
            &lt;&lt; &quot;             : &quot; &lt;&lt; szErrorMsg &lt;&lt; std::endl;                \
    }                                                                       \
}

unsigned __stdcall GrdThread(void* arguments)
{
    std::cout &lt;&lt; &quot; T begin&quot; &lt;&lt; std::endl;
    int a, b, c, d;
    {
        std::ifstream codes(&quot;codes.txt&quot;);
        codes &gt;&gt; a &gt;&gt; b &gt;&gt; c &gt;&gt; d;
    }
    std::string gcexe;
    {
        std::ifstream app(&quot;dongle.gcexe&quot;, std::ios::binary);
        assert(app.good());
        size_t const chunkSize = 64 * 1024;
        char chunk[chunkSize];
        // Program is 64K max!
        app.read(chunk, chunkSize);
        std::streamsize sz = app.gcount();
        assert(!app.good());
        assert(sz &lt; chunkSize);
        gcexe.assign(chunk, chunk + sz);
    }
    HANDLE teh_guardant;
    unsigned int id = 0;
    BYTE abyGrd[GrdContainerSize];
    {    
        std::cout &lt;&lt; &quot; T Opening guardant session...&quot; &lt;&lt; std::endl;
        int grdRz;
        grdRz = GrdStartup(GrdFMR_Local);
        assert(GrdE_OK == grdRz);
        teh_guardant = GrdCreateHandle(
            (HANDLE)abyGrd, // Pointer to memory allocated for Grd protected container, if NULL, Grd API allocates memory for new Grd protected container by itself
            GrdCHM_MultiThread,
            NULL); // Reserved and must be NULL
        assert(teh_guardant);
        VERIFY_GRD(GrdSetAccessCodes(teh_guardant, a, b, c, d));
        VERIFY_GRD(GrdSetFindMode(teh_guardant, GrdFMR_Local, 0, 0, 0, 0, 0, 0, 0, 0, GrdFMI_USB));
        TGrdFindInfo GrdFindInfo;
        //always look first and the only key
        VERIFY_GRD(GrdFind(teh_guardant, GrdF_First, (DWORD*)&amp;id, &amp;GrdFindInfo));
        VERIFY_GRD(GrdLogin(teh_guardant, -1, GrdLM_PerStation));
        std::cout &lt;&lt; &quot; T logged in, flushing...&quot; &lt;&lt; std::endl;
        BOOL resetRz = SetEvent(beginWriteEvent);
        assert(resetRz);
        VERIFY_GRD(GrdCodeLoad(teh_guardant, 0x00, gcexe.size(), &amp;gcexe[0], NULL));
        std::cout &lt;&lt; &quot; T guardant ready&quot; &lt;&lt; std::endl;
    }
    { // use guardant here
        std::cout &lt;&lt; &quot; T Using guardant session...&quot; &lt;&lt; std::endl;
    }
    { // finalize
        std::cout &lt;&lt; &quot; T Closing guardant session...&quot; &lt;&lt; std::endl;
        VERIFY_GRD(GrdCloseHandle(teh_guardant));
        VERIFY_GRD(GrdCleanup());
    }
    std::cout &lt;&lt; &quot; T end&quot; &lt;&lt; std::endl;
    return 0;
}

int main(int argc, char* argv[])
{
    std::cout &lt;&lt; &quot;GrdTest sample application by iRacly 2012&quot; &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot; A initialize and start thread...&quot; &lt;&lt; std::endl;
    beginWriteEvent = CreateEventW(NULL, TRUE, FALSE, L&quot;FlashingGrdProgram&quot;);
    assert(beginWriteEvent);
    unsigned threadID = 0;
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &amp;GrdThread, NULL, 0, &amp;threadID);
    DWORD waitRz = WaitForSingleObject(beginWriteEvent, INFINITE);
    assert(WAIT_OBJECT_0 == waitRz);
    std::cout &lt;&lt; &quot; A grd thread is flushing...&quot; &lt;&lt; std::endl;
    Sleep(30); // this is empirical value: let T print something
    // harakiri
    std::cout &lt;&lt; &quot; A done, aborting...&quot; &lt;&lt; std::endl;
    TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()), 0);
    WaitForSingleObject(hThread, INFINITE);
    return 0;
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ираклий)]]></author>
			<pubDate>Fri, 22 Jun 2012 15:14:21 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/947/#p947</guid>
		</item>
	</channel>
</rss>
