<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Волчьи IT-мысли &#187; wdk</title>
	<atom:link href="http://sww-it.ru/tag/wdk/feed" rel="self" type="application/rss+xml" />
	<link>http://sww-it.ru</link>
	<description>Компьютерная безопасность, IT, антивирусная индустрия.</description>
	<lastBuildDate>Wed, 18 Jan 2012 11:20:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Getting Started with the Windows Driver Development Environment</title>
		<link>http://sww-it.ru/2010-05-28/465?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=getting-started-with-the-windows-driver-development-environment</link>
		<comments>http://sww-it.ru/2010-05-28/465#comments</comments>
		<pubDate>Fri, 28 May 2010 12:13:30 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Без перевода]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[wdk]]></category>
		<category><![CDATA[драйвер]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=465</guid>
		<description><![CDATA[<p>Getting started with Microsoft Windows device drivers can be difficult, even for experienced developers. This paper presents an overview of the debugging and testing tools that developers use to create a device driver for Windows operating systems. In particular, the paper examines ways to find and fix bugs early in development, to help you produce [...]]]></description>
			<content:encoded><![CDATA[<p><em>Getting started with Microsoft Windows device drivers can be difficult, even for experienced developers. This paper presents an overview of the debugging and testing tools that developers use to create a device driver for Windows operating systems. In particular, the paper examines ways to find and fix bugs early in development, to help you produce a high-quality device driver.</p>
<p>WDK MVP Don Burn shares his experience and insights about the hardware and software you need for driver development, how to get started with the WDK build environments and Build utility, and tips, techniques, and tools for all phases of development.</em></p>
<p>Неплохая <a href="http://www.microsoft.com/whdc/driver/foundation/drvdev_intro.mspx">статья для начинающих</a>. Рекомендуется к просмотру.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2010-05-28%2F465&amp;title=Getting%20Started%20with%20the%20Windows%20Driver%20Development%20Environment" id="wpa2a_2"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2010-05-28/465/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WDK документация онлайн в MSDN</title>
		<link>http://sww-it.ru/2010-04-01/454?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wdk-%25d0%25b4%25d0%25be%25d0%25ba%25d1%2583%25d0%25bc%25d0%25b5%25d0%25bd%25d1%2582%25d0%25b0%25d1%2586%25d0%25b8%25d1%258f-%25d0%25be%25d0%25bd%25d0%25bb%25d0%25b0%25d0%25b9%25d0%25bd-%25d0%25b2-msdn</link>
		<comments>http://sww-it.ru/2010-04-01/454#comments</comments>
		<pubDate>Thu, 01 Apr 2010 09:02:51 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[msdn]]></category>
		<category><![CDATA[wdk]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=454</guid>
		<description><![CDATA[<p>Microsoft проделали громадную работу по публикации документации Windows Driver Kit в MSDN. Она доступна онлайн в MSDN в любом месте и в любое время.</p> ]]></description>
			<content:encoded><![CDATA[<p>Microsoft проделали громадную работу по публикации документации <a href="http://msdn.microsoft.com/en-us/library/ff557573%28VS.85%29.aspx">Windows Driver Kit</a> в MSDN. Она доступна онлайн в MSDN в любом месте и в любое время.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2010-04-01%2F454&amp;title=WDK%20%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD%20%D0%B2%20MSDN" id="wpa2a_4"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2010-04-01/454/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WDK 7.1.0 и WinDbg 6.12.2.633</title>
		<link>http://sww-it.ru/2010-02-27/418?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wdk-7-1-0-%25d0%25b8-windbg-6-12-2-633</link>
		<comments>http://sww-it.ru/2010-02-27/418#comments</comments>
		<pubDate>Sat, 27 Feb 2010 10:49:42 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[wdk]]></category>
		<category><![CDATA[windbg]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=418</guid>
		<description><![CDATA[<p>Итак, обновились Windows Debugging Tools, теперь WinDbg входит в поставку WDK (не знаю зачем это было делать).</p> <p>Что нового в WinDbg 6.12.2.633 Что нового в WDK 7.1.0 Скачать</p> ]]></description>
			<content:encoded><![CDATA[<p>Итак, обновились Windows Debugging Tools, теперь WinDbg входит в поставку WDK (не знаю зачем это было делать).</p>
<p><a href="http://www.microsoft.com/whdc/devtools/debugging/whatsnew.mspx#">Что нового в WinDbg 6.12.2.633</a><br />
<a href="http://www.microsoft.com/whdc/devtools/wdk/RelNotesW7.mspx">Что нового в WDK 7.1.0</a><br />
<a href="http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx">Скачать</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2010-02-27%2F418&amp;title=WDK%207.1.0%20%D0%B8%20WinDbg%206.12.2.633" id="wpa2a_6"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2010-02-27/418/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Функции уведомления и функции обратного вызова в Windows (ч.1, Ps*)</title>
		<link>http://sww-it.ru/2010-02-21/362?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d1%2584%25d1%2583%25d0%25bd%25d0%25ba%25d1%2586%25d0%25b8%25d0%25b8-%25d1%2583%25d0%25b2%25d0%25b5%25d0%25b4%25d0%25be%25d0%25bc%25d0%25bb%25d0%25b5%25d0%25bd%25d0%25b8%25d1%258f-%25d0%25b8-%25d1%2584%25d1%2583%25d0%25bd%25d0%25ba%25d1%2586%25d0%25b8%25d0%25b8-%25d0%25be%25d0%25b1%25d1%2580%25d0%25b0%25d1%2582%25d0%25bd</link>
		<comments>http://sww-it.ru/2010-02-21/362#comments</comments>
		<pubDate>Sun, 21 Feb 2010 11:35:19 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[callback]]></category>
		<category><![CDATA[notify]]></category>
		<category><![CDATA[wdk]]></category>
		<category><![CDATA[драйвер]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=362</guid>
		<description><![CDATA[<p style="text-align: justify;">В операционной системе Windows разработчиками было предусмотрено довольно много механизмов получения каких-либо уведомлений и событий. В некоторых случаях разработчик может влиять на возвращаемый результат, в некоторых – нет. В основном считается, что программист не может влиять на возвращаемый результат функций уведомления (notifications) и может влиять на возвращаемый результат функций обратного вызова (callbacks). Однако [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">В операционной системе Windows разработчиками было предусмотрено довольно много механизмов получения каких-либо уведомлений и событий. В некоторых случаях разработчик может влиять на возвращаемый результат, в некоторых – нет. В основном считается, что программист не может влиять на возвращаемый результат функций уведомления (notifications) и может влиять на возвращаемый результат функций обратного вызова (callbacks). Однако это совсем не означает, что функции уведомления вызываются асинхронно, поэтому необходимо обязательно возвращать управление из тех и из других.</p>
<p style="text-align: justify;">Предоставленные функции связаны с различными объектами операционной системы, такими как  процессы, потоки, файловые образы, объекты системного реестра и так далее.</p>
<p><span id="more-362"></span></p>
<h3 style="text-align: center;">PsSetLoadImageNotifyRoutine</h3>
<p style="text-align: justify;"><span style="color: #0000ff;">PsSetLoadImageNotifyRoutine</span> регистрирует функцию уведомления, которая вызывается в момент загрузки образа или отображения образа в память.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">NTSTATUS
  PsSetLoadImageNotifyRoutine<span style="color: #009900;">&#40;</span>
    IN PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Функция уведомления должна быть определена следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">VOID
<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>PLOAD_IMAGE_NOTIFY_ROUTINE<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>
    IN PUNICODE_STRING  FullImageName<span style="color: #339933;">,</span>
    IN HANDLE  ProcessId<span style="color: #339933;">,</span>
    IN PIMAGE_INFO  ImageInfo
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">После регистрации данной функции она будет вызываться операционной системой после отображения в память исполняемого образа в пространстве ядра или в пользовательском пространстве, до начала исполнения образа. Данная функция вызывается, в том числе и в момент загрузки DLL в пользовательском пространстве.</p>
<p style="text-align: justify;">В момент загрузки основного исполняемого образа в память нового процесса данная функция уведомления вызывается в контексте создаваемого процесса.</p>
<p style="text-align: justify;">Пример регистрации функции уведомления:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">NTSTATUS SetLoadImageNotifyRoutine<span style="color: #009900;">&#40;</span>IN PLOAD_IMAGE_NOTIFY_ROUTINE Routine<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>Routine <span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">return</span> STATUS_INVALID_PARAMETER<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> PsSetLoadImageNotifyRoutine<span style="color: #009900;">&#40;</span> Routine <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
VOID LoadImageNotifyRoutine<span style="color: #009900;">&#40;</span>IN PUNICODE_STRING FullImageName<span style="color: #339933;">,</span> IN HANDLE ProcessId<span style="color: #339933;">,</span> IN PIMAGE_INFO ImageInfo<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	KdPrint<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;LoadImageNotifyRoutine called with FullImageName = %wZ, ProcessId = 0x%08X<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> FullImageName<span style="color: #339933;">,</span> ProcessId <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Из переменной <span style="color: #0000ff;">ImageInfo</span> можно получить дополнительную информацию. Причем для систем Windows Vista и выше данная структура содержит больше информации, чем для предыдущих версий ОС (см. WDK Help).</p>
<p style="text-align: justify;">Операционная система содержит список (массив) функций уведомления. Например, для Windows XP/2003 – это глобальный массив <span style="color: #0000ff;">PspLoadImageNotifyRoutine</span>. Вызов каждой зарегистрированной процедуры происходит последовательно в функции <span style="color: #0000ff;">PsCallImageNotifyRoutines</span>.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">NTSTATUS
MmLoadSystemImage <span style="color: #009900;">&#40;</span>
    IN PUNICODE_STRING ImageFileName<span style="color: #339933;">,</span>
    IN PUNICODE_STRING NamePrefix OPTIONAL<span style="color: #339933;">,</span>
    IN PUNICODE_STRING LoadedBaseName OPTIONAL<span style="color: #339933;">,</span>
    IN ULONG LoadFlags<span style="color: #339933;">,</span>
    OUT PVOID <span style="color: #339933;">*</span>ImageHandle<span style="color: #339933;">,</span>
    OUT PVOID <span style="color: #339933;">*</span>ImageBaseAddress
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
…
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>PsImageNotifyEnabled<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            IMAGE_INFO ImageInfo<span style="color: #339933;">;</span>
&nbsp;
            ImageInfo.<span style="color: #202020;">Properties</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
            ImageInfo.<span style="color: #202020;">ImageAddressingMode</span> <span style="color: #339933;">=</span> IMAGE_ADDRESSING_MODE_32BIT<span style="color: #339933;">;</span>
            ImageInfo.<span style="color: #202020;">SystemModeImage</span> <span style="color: #339933;">=</span> TRUE<span style="color: #339933;">;</span>
            ImageInfo.<span style="color: #202020;">ImageSize</span> <span style="color: #339933;">=</span> DataTableEntry<span style="color: #339933;">-&gt;</span>SizeOfImage<span style="color: #339933;">;</span>
            ImageInfo.<span style="color: #202020;">ImageBase</span> <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>ImageBaseAddress<span style="color: #339933;">;</span>
            ImageInfo.<span style="color: #202020;">ImageSelector</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
            ImageInfo.<span style="color: #202020;">ImageSectionNumber</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
            PsCallImageNotifyRoutines<span style="color: #009900;">&#40;</span>ImageFileName<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>HANDLE<span style="color: #009900;">&#41;</span>NULL<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ImageInfo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
…
<span style="color: #009900;">&#125;</span>
&nbsp;
PsCallImageNotifyRoutines<span style="color: #009900;">&#40;</span>
    IN PUNICODE_STRING FullImageName<span style="color: #339933;">,</span>
    IN HANDLE ProcessId<span style="color: #339933;">,</span>
    IN PIMAGE_INFO ImageInfo
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    ULONG i<span style="color: #339933;">;</span>
    PEX_CALLBACK_ROUTINE_BLOCK CallBack<span style="color: #339933;">;</span>
    PLOAD_IMAGE_NOTIFY_ROUTINE Rtn<span style="color: #339933;">;</span>
&nbsp;
    PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>PsImageNotifyEnabled<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> PSP_MAX_LOAD_IMAGE_NOTIFY<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            CallBack <span style="color: #339933;">=</span> ExReferenceCallBackBlock <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>PspLoadImageNotifyRoutine<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CallBack <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                Rtn <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>PLOAD_IMAGE_NOTIFY_ROUTINE<span style="color: #009900;">&#41;</span> ExGetCallBackBlockRoutine <span style="color: #009900;">&#40;</span>CallBack<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Rtn <span style="color: #009900;">&#40;</span>FullImageName<span style="color: #339933;">,</span>
                     ProcessId<span style="color: #339933;">,</span>
                     ImageInfo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                ExDereferenceCallBackBlock <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>PspLoadImageNotifyRoutine<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> CallBack<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Удалить функцию уведомления можно с помощью вызова <span style="color: #0000ff;">PsRemoveLoadImageNotifyRoutine</span>, передав указатель на зарегистрированный обработчик.</p>
<h3 style="text-align: center;">PsSetCreateProcessNotifyRoutine и PsSetCreateProcessNotifyRoutineEx</h3>
<p style="text-align: justify;"><span style="color: #0000ff;">PsSetCreateProcessNotifyRoutine</span> и <span style="color: #0000ff;">PsSetCreateProcessNotifyRoutineEx</span> позволяют зарегистрировать функцию уведомления на создание и завершение процессов в системе. Последняя из перечисленных функций присутствует только начиная с Windows Vista SP1 и предоставляет больше информации и более удобный интерфейс для использования.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">NTSTATUS
  PsSetCreateProcessNotifyRoutine<span style="color: #009900;">&#40;</span>
    IN PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine<span style="color: #339933;">,</span>
    IN BOOLEAN  Remove
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
NTSTATUS
  PsSetCreateProcessNotifyRoutineEx<span style="color: #009900;">&#40;</span>
    IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX  NotifyRoutine<span style="color: #339933;">,</span>
    IN BOOLEAN  Remove
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">В отличие от <span style="color: #0000ff;">PsSetLoadImageNotifyRoutine</span> для удаления обработчика не нужно вызывать другую функцию, достаточно вызвать ту же самую с параметром <span style="color: #0000ff;">Remove</span> равным TRUE.</p>
<p style="text-align: justify;">Обработчики должны быть определены следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">VOID
<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>PCREATE_PROCESS_NOTIFY_ROUTINE<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>
    IN HANDLE  ParentId<span style="color: #339933;">,</span>
    IN HANDLE  ProcessId<span style="color: #339933;">,</span>
    IN BOOLEAN  Create
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
VOID
  CreateProcessNotifyEx<span style="color: #009900;">&#40;</span>
    __inout PEPROCESS  Process<span style="color: #339933;">,</span>
    __in HANDLE  ProcessId<span style="color: #339933;">,</span>
    __in_opt PPS_CREATE_NOTIFY_INFO  CreateInfo
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Структура с дополнительной информацией:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> _PS_CREATE_NOTIFY_INFO <span style="color: #009900;">&#123;</span>
  __in SIZE_T  Size<span style="color: #339933;">;</span>
  <span style="color: #993333;">union</span> <span style="color: #009900;">&#123;</span>
    __in ULONG  Flags<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
      __in ULONG  FileOpenNameAvailable <span style="color: #339933;">:</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
      __in ULONG  Reserved <span style="color: #339933;">:</span> <span style="color: #0000dd;">31</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  __in HANDLE  ParentProcessId<span style="color: #339933;">;</span>
  __in CLIENT_ID  CreatingThreadId<span style="color: #339933;">;</span>
  __inout <span style="color: #993333;">struct</span> _FILE_OBJECT  <span style="color: #339933;">*</span>FileObject<span style="color: #339933;">;</span>
  __in PCUNICODE_STRING  ImageFileName<span style="color: #339933;">;</span>
  __in_opt PCUNICODE_STRING  CommandLine<span style="color: #339933;">;</span>
  __inout NTSTATUS  CreationStatus<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> PS_CREATE_NOTIFY_INFO<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>PPS_CREATE_NOTIFY_INFO<span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">После регистрации функции уведомления операционная система вызывает зарегистрированный обработчик  в двух случаях: когда процесс создается и когда процесс завершается. В случае создания процесса функция уведомления вызывается после того как создан начальный поток, но исполнение его еще не началось. В случае завершения процесса операционная система вызывает функцию уведомления, перед тем как последний поток в процессе завершится. В обработчике, зарегистрированном с помощью <span style="color: #0000ff;">PsSetCreateProcessNotifyRoutineEx</span>, можно влиять на результат создания процесса. Для этого необходимо использовать член <span style="color: #0000ff;">CreationStatus</span> структуры <span style="color: #0000ff;">PS_CREATE_NOTIFY_INFO</span>.</p>
<p style="text-align: justify;">В момент создания нового процесса функция уведомления вызывается в контексте потока, который инициировал создание этого процесса. В момент уничтожения процесса функция уведомления вызывается в контексте последнего потока завершаемого процесса.</p>
<p style="text-align: justify;">Пример регистрации функции уведомления:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> NTSTATUS <span style="color: #009900;">&#40;</span>NTAPI<span style="color: #339933;">*</span> PSSETCREATEPROCESSNOTIFYROUTINEEX_PROC<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>
	IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine<span style="color: #339933;">,</span>
	IN BOOLEAN Remove
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
NTSTATUS SetCreateProcessNotifyRoutine<span style="color: #009900;">&#40;</span>VOID<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	NTSTATUS                               status<span style="color: #339933;">;</span>
	UNICODE_STRING                         szCreateProcessEx <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	PSSETCREATEPROCESSNOTIFYROUTINEEX_PROC pCreateProcessEx  <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
	PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	RtlInitUnicodeString<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span>szCreateProcessEx<span style="color: #339933;">,</span> L<span style="color: #ff0000;">&quot;PsSetCreateProcessNotifyRoutineEx&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	pCreateProcessEx <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>PSSETCREATEPROCESSNOTIFYROUTINEEX_PROC <span style="color: #009900;">&#41;</span>MmGetSystemRoutineAddress<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span>szCreateProcessEx <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> pCreateProcessEx <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		status <span style="color: #339933;">=</span> pCreateProcessEx<span style="color: #009900;">&#40;</span> CreateProcessNotifyRoutineEx<span style="color: #339933;">,</span> FALSE <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span>
		status <span style="color: #339933;">=</span> PsSetCreateProcessNotifyRoutine<span style="color: #009900;">&#40;</span> CreateProcessNotifyRoutine<span style="color: #339933;">,</span> FALSE <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> status<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
VOID CreateProcessNotifyRoutine<span style="color: #009900;">&#40;</span>IN HANDLE ParentId<span style="color: #339933;">,</span> IN HANDLE ProcessId<span style="color: #339933;">,</span> IN BOOLEAN Create<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	KdPrint<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;CreateProcessNotifyRoutine called with ParentId = 0x%08X, ProcessId = 0x%08X, Create = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> ParentId<span style="color: #339933;">,</span> ProcessId<span style="color: #339933;">,</span> Create <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
VOID CreateProcessNotifyRoutineEx<span style="color: #009900;">&#40;</span>__inout PEPROCESS Process<span style="color: #339933;">,</span> __in HANDLE ProcessId<span style="color: #339933;">,</span> __in_opt PPS_CREATE_NOTIFY_INFO CreateInfo<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	KdPrint<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;CreateProcessNotifyRoutineEx called with Process = 0x%08X, ProcessId = 0x%08X<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> Process<span style="color: #339933;">,</span> ProcessId <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Как и в случае с <span style="color: #0000ff;">PsLoadImageNotifyRoutine</span> операционная система содержит список (массив) функций уведомления в глобальной переменной <span style="color: #0000ff;">PspCreateProcessNotifyRoutine</span> (Windows XP/2003). Вызов каждой зарегистрированной функции происходит из системных функций <span style="color: #0000ff;">PspCreateThread</span> и <span style="color: #0000ff;">PspExitProcess</span>.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">VOID
PspExitProcess<span style="color: #009900;">&#40;</span>
    IN BOOLEAN LastThreadExit<span style="color: #339933;">,</span>
    IN PEPROCESS Process
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
…
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>LastThreadExit<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
…
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>PspCreateProcessNotifyRoutineCount <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            ULONG i<span style="color: #339933;">;</span>
            PEX_CALLBACK_ROUTINE_BLOCK CallBack<span style="color: #339933;">;</span>
            PCREATE_PROCESS_NOTIFY_ROUTINE Rtn<span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> PSP_MAX_CREATE_PROCESS_NOTIFY<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                CallBack <span style="color: #339933;">=</span> ExReferenceCallBackBlock <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>PspCreateProcessNotifyRoutine<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CallBack <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    Rtn <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>PCREATE_PROCESS_NOTIFY_ROUTINE<span style="color: #009900;">&#41;</span> ExGetCallBackBlockRoutine <span style="color: #009900;">&#40;</span>CallBack<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    Rtn <span style="color: #009900;">&#40;</span>Process<span style="color: #339933;">-&gt;</span>InheritedFromUniqueProcessId<span style="color: #339933;">,</span>
                         Process<span style="color: #339933;">-&gt;</span>UniqueProcessId<span style="color: #339933;">,</span>
                         FALSE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    ExDereferenceCallBackBlock <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>PspCreateProcessNotifyRoutine<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                                                CallBack<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
…
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3 style="text-align: center;">PsSetCreateThreadNotifyRoutine</h3>
<p style="text-align: justify;"><span style="color: #0000ff;">PsSetCreateThreadNotifyRoutine</span> регистрирует функцию уведомления, которая вызывается в момент создания и уничтожения потока.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">NTSTATUS
  PsSetCreateThreadNotifyRoutine<span style="color: #009900;">&#40;</span>
    IN PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Функция уведомления должна быть определена следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">VOID
<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>PCREATE_THREAD_NOTIFY_ROUTINE<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>
    IN HANDLE  ProcessId<span style="color: #339933;">,</span>
    IN HANDLE  ThreadId<span style="color: #339933;">,</span>
    IN BOOLEAN  Create
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Для удаления обработчика необходимо использовать функцию <span style="color: #0000ff;">PsRemoveCreateThreadNotifyRoutine</span>.</p>
<p style="text-align: justify;">В момент создания нового потока функция уведомления вызывается в контексте потока, который инициировал его создание. В момент уничтожения потока функция уведомления вызывается в контексте завершаемого потока.</p>
<p style="text-align: justify;">Пример регистрации функции уведомления:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">NTSTATUS SetCreateThreadNotifyRoutine<span style="color: #009900;">&#40;</span>IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>NotifyRoutine <span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">return</span> STATUS_INVALID_PARAMETER<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> PsSetCreateThreadNotifyRoutine<span style="color: #009900;">&#40;</span> NotifyRoutine <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
VOID CreateThreadNotifyRoutine<span style="color: #009900;">&#40;</span>IN HANDLE ProcessId<span style="color: #339933;">,</span> IN HANDLE ThreadId<span style="color: #339933;">,</span> IN BOOLEAN Create<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PAGED_CODE<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	KdPrint<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;CreateThreadNotifyRoutine called with ProcessId = 0x%08X, ThreadId = 0x%08X, Create = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> ProcessId<span style="color: #339933;">,</span> ThreadId<span style="color: #339933;">,</span> Create <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Как и во всех вышеперечисленных функциях, операционная система хранит список (массив) функций уведомления в глобальной переменной <span style="color: #0000ff;">PspCreateThreadNotifyRoutine</span> (Windows XP/2003). Вызов каждой зарегистрированной функции происходит из функций <span style="color: #0000ff;">PspCreateThread</span> и <span style="color: #0000ff;">PspExitThread</span>.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">NTSTATUS
PspCreateThread<span style="color: #009900;">&#40;</span>
    OUT PHANDLE ThreadHandle<span style="color: #339933;">,</span>
    IN ACCESS_MASK DesiredAccess<span style="color: #339933;">,</span>
    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL<span style="color: #339933;">,</span>
    IN HANDLE ProcessHandle<span style="color: #339933;">,</span>
    IN PEPROCESS ProcessPointer<span style="color: #339933;">,</span>
    OUT PCLIENT_ID ClientId OPTIONAL<span style="color: #339933;">,</span>
    IN PCONTEXT ThreadContext OPTIONAL<span style="color: #339933;">,</span>
    IN PINITIAL_TEB InitialTeb OPTIONAL<span style="color: #339933;">,</span>
    IN BOOLEAN CreateSuspended<span style="color: #339933;">,</span>
    IN PKSTART_ROUTINE StartRoutine OPTIONAL<span style="color: #339933;">,</span>
    IN PVOID StartContext
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
…
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>PspCreateThreadNotifyRoutineCount <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ULONG i<span style="color: #339933;">;</span>
        PEX_CALLBACK_ROUTINE_BLOCK CallBack<span style="color: #339933;">;</span>
        PCREATE_THREAD_NOTIFY_ROUTINE Rtn<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> PSP_MAX_CREATE_THREAD_NOTIFY<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            CallBack <span style="color: #339933;">=</span> ExReferenceCallBackBlock <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>PspCreateThreadNotifyRoutine<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CallBack <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                Rtn <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>PCREATE_THREAD_NOTIFY_ROUTINE<span style="color: #009900;">&#41;</span> ExGetCallBackBlockRoutine <span style="color: #009900;">&#40;</span>CallBack<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Rtn <span style="color: #009900;">&#40;</span>Thread<span style="color: #339933;">-&gt;</span>Cid.<span style="color: #202020;">UniqueProcess</span><span style="color: #339933;">,</span>
                     Thread<span style="color: #339933;">-&gt;</span>Cid.<span style="color: #202020;">UniqueThread</span><span style="color: #339933;">,</span>
                     TRUE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                ExDereferenceCallBackBlock <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>PspCreateThreadNotifyRoutine<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                                            CallBack<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
…
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">На этом первая часть цикла о функциях уведомления и функциях обратного вызова закончена. Исходные тексты к статье можно <a href="http://sww-it.ru/wp-content/uploads/2010/cbtest.zip">скачать здесь</a>. После каждой новой главы я буду их обновлять.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2010-02-21%2F362&amp;title=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20%D1%83%D0%B2%D0%B5%D0%B4%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0%20%D0%B2%20Windows%20%28%D1%87.1%2C%20Ps%2A%29" id="wpa2a_8"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2010-02-21/362/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 7 WDK documentation</title>
		<link>http://sww-it.ru/2009-08-11/303?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=windows-7-wdk-documentation</link>
		<comments>http://sww-it.ru/2009-08-11/303#comments</comments>
		<pubDate>Tue, 11 Aug 2009 17:56:59 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[wdk]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=303</guid>
		<description><![CDATA[<p>На сайте WDKDocs доступна обновленная документация с поддержкой Windows 7.</p> <p>Документацию можно загрузить в двух форматах, как обычный апдейт и в формате .chm:</p> <p>WDKDocs_08072009.exe</p> <p>wdkchm_08072009.exe</p> ]]></description>
			<content:encoded><![CDATA[<p>На сайте <a href="http://www.microsoft.com/whdc/DevTools/WDK/WDKdocs.mspx" target="_blank">WDKDocs</a> доступна обновленная документация с поддержкой Windows 7.</p>
<p>Документацию можно загрузить в двух форматах, как обычный апдейт и в формате .chm:</p>
<p><a href="http://download.microsoft.com/download/3/3/C/33CFEF4D-21DA-4229-BC17-3EAC7A7EABE1/WDKDocs_08072009.EXE">WDKDocs_08072009.exe</a></p>
<p><a href="http://download.microsoft.com/download/3/3/C/33CFEF4D-21DA-4229-BC17-3EAC7A7EABE1/wdkchm_08072009.chm">wdkchm_08072009.exe</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2009-08-11%2F303&amp;title=Windows%207%20WDK%20documentation" id="wpa2a_10"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2009-08-11/303/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WDK 7.0.0 доступен для загрузки</title>
		<link>http://sww-it.ru/2009-08-07/297?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wdk-7-0-0-%25d0%25b4%25d0%25be%25d1%2581%25d1%2582%25d1%2583%25d0%25bf%25d0%25b5%25d0%25bd-%25d0%25b4%25d0%25bb%25d1%258f-%25d1%2581%25d0%25ba%25d0%25b0%25d1%2587%25d0%25b8%25d0%25b2%25d0%25b0%25d0%25bd%25d0%25b8%25d1%258f</link>
		<comments>http://sww-it.ru/2009-08-07/297#comments</comments>
		<pubDate>Fri, 07 Aug 2009 11:09:09 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[wdk]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=297</guid>
		<description><![CDATA[<p>Hello WDK Program Participants:</p> <p>We are pleased to announce the release of the Windows Driver Kit Version 7.0.0. This latest production release of the WDK is now available for download on Connect.</p> <p>In this WDK release, the WDK is delivering the latest updates to create drivers for: • Windows 7 • Windows Vista • Windows [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Hello WDK Program Participants:</p>
<p>We are pleased to announce the release of the Windows Driver Kit Version 7.0.0. This latest production release of the WDK is now available for download on Connect.</p>
<p>In this WDK release, the WDK is delivering the latest updates to create drivers for:<br />
• Windows 7<br />
• Windows Vista<br />
• Windows XP<br />
• Windows Server 2008 R2<br />
• Windows Server 2008<br />
• Windows Server 2003</p>
<p>A few of the highlights in this release are:<br />
• A number of additional headers<br />
• Update of KMDF and UMDF to Version 1.9<br />
• Co-installers for WinUSB v2 added<br />
• Update of DIFx redistributable files<br />
• Addition of Offreg DLLs<br />
• Sample additions in 1394, Audio, Biometric, Build, Bus, File System, HID, Input, Network, Print, Sensors, Storage, WMI, WPD, and general samples<br />
• Tools added in Biometrics, Bluetooth, Driver Coverage, Enhanced Storage, Test tools, Networking, Print and general tools<br />
• Improvements to PFD and Static Driver Verifier<br />
• Updated documentation</p>
<p>This release is available as a download only. The image posted is a DVD image and the recommended approach is to download and burn a DVD.</p>
<p>Thank you for your continued support!</p>
<p>Regards,<br />
The Windows Driver Kit (WDK) team</p></blockquote>
<p>Доступен для загрузки на <a href="https://connect.microsoft.com/site148/Downloads/DownloadDetails.aspx?DownloadID=26935" target="_blank">Windows Connect</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2009-08-07%2F297&amp;title=WDK%207.0.0%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%20%D0%B4%D0%BB%D1%8F%20%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8" id="wpa2a_12"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2009-08-07/297/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Супер BUILD</title>
		<link>http://sww-it.ru/2009-02-22/11?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d1%2581%25d1%2583%25d0%25bf%25d0%25b5%25d1%2580-build</link>
		<comments>http://sww-it.ru/2009-02-22/11#comments</comments>
		<pubDate>Sun, 22 Feb 2009 14:04:45 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[wdk]]></category>
		<category><![CDATA[драйвер]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=11</guid>
		<description><![CDATA[<p>Рано или поздно драйверописатель сталкивается с необходимостью использовать в своем проекте чужой код. Обычно, для сборки драйвера используется утилита BUILD, идущая в поставке WDK. Буквально недавно я столкнулся с очевидной проблемой данного инструмента:</p> <p>С:\path1\path2\path3&#62;build -g BUILD: Compile and Link for x86 BUILD: Loading c:\winddk\6001\build.dat&#8230; BUILD: Computing Include file dependencies: BUILD: Start time: Fri Feb 06 [...]]]></description>
			<content:encoded><![CDATA[<p>Рано или поздно драйверописатель сталкивается с необходимостью использовать в своем проекте чужой код. Обычно, для сборки драйвера используется утилита <strong>BUILD</strong>, идущая в поставке WDK. Буквально недавно я столкнулся с очевидной проблемой данного инструмента:</p>
<p>С:\path1\path2\path3&gt;<span style="color: #3366ff;">build -g</span><br />
<span style="color: #339966;">BUILD: Compile and Link for x86<br />
BUILD: Loading c:\winddk\6001\build.dat&#8230;<br />
BUILD: Computing Include file dependencies:<br />
BUILD: Start time: Fri Feb 06 15:50:51 2009</span><br />
<span style="color: #ff0000;">errors in directory С:\path1\path2\path3</span></p>
<p><span style="color: #ff0000;">Ignoring invalid directory prefix in SOURCES= entry: D:\somepath1\somepath2\somepath3\somepath4\somepath5\file.c</span></p>
<p><span style="color: #ff0000;"><span id="more-11"></span><span style="color: #000000;">Поиск в гугле вывел меня на <a href="http://www.osronline.com/showThread.cfm?link=59562" target="_blank">ветку</a> форума OSR Online:</span></span></p>
<blockquote><p><span style="color: #000000;">&#171;Welcome to the wonderful world of BUILD. It can only deal with source code in the same or parent directory of the &#171;sources&#187; file. It cannot use source files from arbitrary locations.&#187;</span></p></blockquote>
<p><span style="color: #000000;"> Таким образом, подключить в свой проект чужие исходные коды по произвольному пути не получится. Выходов из сложившейся ситуации я вижу два:</span></p>
<ol>
<li><span style="color: #000000;">Чужой код должен быть реализован в виде статической библиотеки. У этого способа есть как очевидные плюсы, так и очевидные минусы. Одним из минусов я считаю то, что разработчику, который пишет код для вас, придется часто собирать эту самую библиотеку или это должна делать build-машина.</span></li>
<li>Использовать преимущества современных <a href="http://ru.wikipedia.org/wiki/Система_управления_версиями" target="_blank">систем управления версиями</a>. Проблема решается выкачиванием нужного проекта в директорию, которая доступна инструменту <strong>BUILD</strong>. Свою проблему я решил именно так. Конечно, не стоит забывать и о синхронизации выкаченных файлов.</li>
</ol>
<p>Иногда на форумах появляются вопросы, в которых люди спрашивают можно ли управлять инструментом <strong>BUILD</strong>. В MSDN есть отдельный раздел, посвященный этой утилите: <strong>Win32 and COM Development -&gt; Windows Driver Kit -&gt; Driver Development Tools -&gt; Tools for Building Drivers -&gt; Build</strong>. Подраздел <strong>Build Utility Macros</strong> самый интересный.</p>
<p><span style="color: #000000;"> </span></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2009-02-22%2F11&amp;title=%D0%A1%D1%83%D0%BF%D0%B5%D1%80%20BUILD" id="wpa2a_14"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2009-02-22/11/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

