<?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>ZetBlog&#187; Microsoft</title>
	<atom:link href="http://zetblog.ru/tag/microsoft/feed/" rel="self" type="application/rss+xml" />
	<link>http://zetblog.ru</link>
	<description>Зеты говорят. Блог о программировании, администрировании и безопасности.</description>
	<lastBuildDate>Sat, 29 Oct 2011 18:59:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Администрирование: восстановление работоспособности Windows XP &#8212; ошибка c000021a.</title>
		<link>http://zetblog.ru/administration/201002/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5%d0%b2%d0%be%d1%81%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b0/</link>
		<comments>http://zetblog.ru/administration/201002/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5%d0%b2%d0%be%d1%81%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b0/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 14:21:15 +0000</pubDate>
		<dc:creator>C0ffe1n</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows XP]]></category>
		<category><![CDATA[восстановление]]></category>
		<category><![CDATA[ошибки]]></category>
		<category><![CDATA[файлы]]></category>

		<guid isPermaLink="false">http://zetblog.ru/?p=922</guid>
		<description><![CDATA[Поведаю Вам очередной совет по восстановлению операционной системы Windows XP из дауна в синий «экран смерти» с ошибкой с000021a. Такая ситуация с ошибкой c000021a возникает при завершении Winlogon.exe или сsrss.exe, а также при неудачном запуске smss.exe. Причиной тому может стать некорректное завершение работы операционной системы, некорректная установка софта или обновления, а также «трипачек» (то бишь [...]]]></description>
			<content:encoded><![CDATA[<p>Поведаю Вам очередной совет по восстановлению операционной системы <strong>Windows XP</strong> из дауна в синий «экран смерти» с ошибкой <strong>с000021a</strong>. </p>
<p>Такая ситуация с ошибкой <strong>c000021a</strong> возникает при завершении <strong>Winlogon.exe</strong> или <strong>сsrss.exe</strong>, а также при неудачном запуске <strong>smss.exe</strong>. Причиной тому может стать некорректное завершение работы операционной системы, некорректная установка софта или обновления, а также <strong>«трипачек»</strong> (то бишь вредоносные программы).<br />
<span id="more-922"></span><br />
Для  решения проблемы Вам потребуется загрузочный диск или <strong>Live CD/DVD</strong> и т.п., чтобы получить доступ к файлам <strong>Winlogon.exe</strong>, <strong>csrss.exe</strong>, <strong>smss.exe</strong> не блокируемым системой. Кроме того, потребуется скопировать данные файлы с работоспособной системы, которые лежат в <strong>C:\WINDOWS\system32</strong>. После того как Вы, например, загрузитесь с <strong>Live CD/DVD</strong>, просто замените данные файлы и будет Вам счастье.</p>
]]></content:encoded>
			<wfw:commentRss>http://zetblog.ru/administration/201002/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5%d0%b2%d0%be%d1%81%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b0/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Администрирование: проблема с загрузкой профилей в Windows Vista и 7.</title>
		<link>http://zetblog.ru/administration/201001/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0-%d1%81-%d0%b7%d0%b0%d0%b3%d1%80%d1%83%d0%b7/</link>
		<comments>http://zetblog.ru/administration/201001/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0-%d1%81-%d0%b7%d0%b0%d0%b3%d1%80%d1%83%d0%b7/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 13:59:54 +0000</pubDate>
		<dc:creator>C0ffe1n</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows Vista]]></category>
		<category><![CDATA[восстановление]]></category>
		<category><![CDATA[профили]]></category>
		<category><![CDATA[реестр]]></category>
		<category><![CDATA[служба]]></category>

		<guid isPermaLink="false">http://zetblog.ru/?p=906</guid>
		<description><![CDATA[По служебной деятельности научился решать проблему, возникающую в Windows Vista и Windows 7 со службой профилей пользователей. А именно, при попытке войти в систему (в домене) выводится сообщение о том, что «Служба профилей препятствует входу в систему». Причиной тому могут быть разные ситуации, но наиболее часто встречаемые это: некорректный путь к профилю, были удалены профили [...]]]></description>
			<content:encoded><![CDATA[<p>По служебной деятельности научился решать проблему, возникающую в <strong>Windows Vista</strong> и <strong>Windows 7</strong> со службой профилей пользователей. А именно, при попытке войти в систему (в домене) выводится сообщение о том, что <strong>«Служба профилей препятствует входу в систему»</strong>. Причиной тому могут быть разные ситуации, но наиболее часто встречаемые это:</p>
<ul>
<li> некорректный путь к профилю,</li>
<li>были удалены профили <strong>«default»</strong> или <strong>«Общие»</strong>(он же <strong>«Public»</strong>) или нарушена их иерархия папок.</li>
</ul>
<p><span id="more-906"></span><br />
При этом может возникнуть проблема, что невозможно загрузить систему даже под локальным пользователем (администратором). Но в безопасном режиме система грузится.</p>
<p><strong>В первой ситуации</strong>, для решения проблемы с загрузкой профилей, необходимо будет почистить и слегка отредактировать реестр <strong>«ручками»</strong> следующим образом. В реестре переходим сюда:</p>
<div class="codesnip-container" >HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\</div>
<p>Просматривая этот раздел, ищем нужный нам профиль пользователя по ключам (<strong>«ProfileImagePath»</strong>), указывающим путь к профилям. В просматриваемом списке правильный раздел имеет вид <strong><идентификатор>.bak</strong>. Кроме того, присутствует точно такой же раздел, только с именем <strong><идентификатор> (без «.bak»)</strong>, в котором путь к профилю указан не верно. </p>
<p><strong>Наши действия</strong>:</p>
<ol>
<li> Удаляем раздел с ошибочным путем к профилю.</li>
<li>	Переименовываем раздел с правильным путем к профилю, удалив из его имени окончание «.bak».</li>
<li>Попутно удаляем разделы, профили пользователей которые были удалены вами в ручную (разумеется, если такое имело место быть ;) ).</li>
</ol>
<p>Далее перезагружаемся и пытаемся войти под пользователем, под которым ранее войти в систему не удавалось. Все должно сработать.</p>
<p><strong>Во втором случае</strong>, проблема возникла, как показала практика, были либо удалены один из профилей <strong>«default»</strong> или <strong>«Общие»</strong>, либо в этих профилях нарушена иерархия папок (попросту удалены все или часть вложенных папок).</p>
<p>Для решения данной проблемы достаточно создать папки с такими именами, если папки были удалены. Либо скопировать содержимое любого профиля и вставить в <strong>«default»</strong> или <strong>«Общие»</strong>. После этого работоспособность системы восстанавливается. </p>
<p> Желаю удачи! ;) </p>
<p>Если у Вас есть чем дополнить данную статью, пишите пожалуйста комментарии к статье либо у нас на <a href="/forum/">форуме</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://zetblog.ru/administration/201001/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0-%d1%81-%d0%b7%d0%b0%d0%b3%d1%80%d1%83%d0%b7/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Microsoft Outlook: Формат почтовой базы (.pst, или PFF &#8212; Personal Folder Files).</title>
		<link>http://zetblog.ru/theory/documentation/200901/microsoft-outlook-%d1%84%d0%be%d1%80%d0%bc%d0%b0%d1%82-pff-personal-folder-files/</link>
		<comments>http://zetblog.ru/theory/documentation/200901/microsoft-outlook-%d1%84%d0%be%d1%80%d0%bc%d0%b0%d1%82-pff-personal-folder-files/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 13:23:21 +0000</pubDate>
		<dc:creator>lizz</dc:creator>
				<category><![CDATA[документация]]></category>
		<category><![CDATA[форматы файлов]]></category>
		<category><![CDATA[.pst]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Outlook]]></category>
		<category><![CDATA[PFF]]></category>

		<guid isPermaLink="false">http://zetblog.ru/?p=94</guid>
		<description><![CDATA[Данный пост является частичным переводом найденной на просторах интернета спецификации формата PFF. Исходный текст был залицензирован под GPL ;-). Имя Outlook.pst &#8212; формат файла MS Outlook .pst. Сводка outlook.pst Обзор Каждый элемент в .pst файле определяется двумя значениями идентификаторов ID1 и ID2. Существуют два отдельных Б-дерева с индексами ID1 и ID2. Начиная с Outlook 2003, [...]]]></description>
			<content:encoded><![CDATA[<p>Данный пост является частичным переводом найденной на просторах интернета спецификации формата PFF. Исходный текст был залицензирован под GPL ;-).<br />
<span id="more-94"></span></p>
<p><strong>Имя</strong><br />
Outlook.pst &#8212; формат файла MS Outlook .pst.</p>
<p><strong>Сводка</strong><br />
outlook.pst</p>
<p><strong>Обзор</strong><br />
Каждый элемент в .pst файле определяется двумя значениями идентификаторов ID1 и ID2. Существуют два отдельных Б-дерева с индексами ID1 и ID2. Начиная с Outlook 2003, изменён формат файла с 32-битной версии на 64-битную. Рассмотрен будет 64-битный формат.<br />
Б-деревья далее будем обозначать &#171;Индекс 1&#8243; и &#171;Индекс 2&#8243;.</p>
<p><strong>64-битный заголовок файла</strong><br />
Заголовок располагается по смещению 0 в .pst файле.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>signature</td>
<td>4 байта</td>
<td>0x4e444221</td>
<td>сигнатура файла, константа</td>
</tr>
<tr>
<td>000a</td>
<td>indexType</td>
<td>1 байт</td>
<td>0&#215;17</td>
<td>тип файла .pst (0&#215;17 &#8212; 64-битный)</td>
</tr>
<tr>
<td>0201</td>
<td>encryptionType</td>
<td>1 байт</td>
<td>0&#215;00<br />
0&#215;01<br />
0&#215;02</td>
<td>Тип шифрования<br />
0 — нет<br />
1 — со сжатием<br />
2 — стойкое</td>
</tr>
<tr>
<td>00b8</td>
<td>fileSize</td>
<td>8 байт</td>
<td></td>
<td>общий размер файла</td>
</tr>
<tr>
<td>00e8</td>
<td>backPointer1</td>
<td>8 байт</td>
<td></td>
<td>Обратный указатель 1</td>
</tr>
<tr>
<td>00f0</td>
<td>offsetIndex1</td>
<td>8 байт</td>
<td></td>
<td>Смещение индекса 1</td>
</tr>
<tr>
<td>00d8</td>
<td>backPointer2</td>
<td>8 байт</td>
<td></td>
<td>Обратный указатель 2</td>
</tr>
<tr>
<td>00e0</td>
<td>offsetIndex2</td>
<td>8 байт</td>
<td></td>
<td>Смещение индекса 2</td>
</tr>
</tbody>
</table>
<p><strong>64-битный узел Индекса 1 </strong><br />
Узлы индекса 1 являются блоками по 512 байт, формат описан ниже.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>01e8</td>
<td>itemCount</td>
<td>1 байт</td>
<td></td>
<td>количество элементов</td>
</tr>
<tr>
<td>01e9</td>
<td>maxItemCount</td>
<td>1 байт</td>
<td>0&#215;14</td>
<td>максимальное количество элементов, константа</td>
</tr>
<tr>
<td>01ea</td>
<td>itemSize</td>
<td>1 байт</td>
<td>0&#215;18</td>
<td>размер элемента, константа</td>
</tr>
<tr>
<td>01eb</td>
<td>nodeLevel</td>
<td>1 байт</td>
<td></td>
<td>уровень элемента в дереве</td>
</tr>
<tr>
<td>01f8</td>
<td>backPointer</td>
<td>8 байт</td>
<td></td>
<td>Обратный указатель</td>
</tr>
</tbody>
</table>
<p>itemCount – определяет количество 24-байтовых 24 записей, которые являются активными.<br />
nodeLevel – ненулевое для этого типа узлов. Узлы-листья имеют другой формат.<br />
backPointer – должен совпадать с обратным указателем тройки, которая указывает на этот узел.<br />
Каждый элемент в этом узел – это тройки (ID1, backPointer, offset), где offset (смещение) указывает на дочерний узел, значение backPointer должно совпадать с backPointer в дочернем узле, ID1 – наименьшее значение ID1 в поддереве.</p>
<p><strong>64-битный лист Индекса 1</strong><br />
Листья имеют размер 512 байт.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>01e8</td>
<td>itemCount</td>
<td>1 байт</td>
<td></td>
<td>количество элементов</td>
</tr>
<tr>
<td>01e9</td>
<td>maxItemCount</td>
<td>1 байт</td>
<td>0&#215;14</td>
<td>максимальное количество элементов, константа</td>
</tr>
<tr>
<td>01ea</td>
<td>itemSize</td>
<td>1 байт</td>
<td>0&#215;18</td>
<td>размер элемента, константа</td>
</tr>
<tr>
<td>01eb</td>
<td>nodeLevel</td>
<td>1 байт</td>
<td>0&#215;00</td>
<td>Уровень узла в дереве, для листьев 0&#215;00, константа</td>
</tr>
<tr>
<td>01f8</td>
<td>backPointer</td>
<td>8 байт</td>
<td></td>
<td>обратный указатель</td>
</tr>
</tbody>
</table>
<p>itemCount – определяет количество 24-байтовых записей, которые активны. nodeLevel – равно нулю для листьев.<br />
backPointer – должнен совпадать с backPointer тройки, которая указывает на этот узел.<br />
Каждый элемент в этом узле является тройкой (ID1, offset, size, unknown). Два младших бита ID1 – флаги. Случаев, когда бит установлен в 0 не было (но не факт, что этого не может быть). Первый бит указывает, что элемент не зашифрован. Заметьте, что ссылки на ID1 могут иметь установленный в 1 младший бит (что это означает – неизвестно), поэтому при поиске в этом дереве младший бит сбрасывается.</p>
<p><strong>64-битный узел Индекса 2</strong><br />
Узлы этого Б-дерева имеют размер в 512 байт.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>01e8</td>
<td>itemCount</td>
<td>1 байт</td>
<td></td>
<td>количество элементов</td>
</tr>
<tr>
<td>01e9</td>
<td>maxItemCount</td>
<td>1 байт</td>
<td>0&#215;14</td>
<td>максимальное количество элементов, константа</td>
</tr>
<tr>
<td>01ea</td>
<td>itemSize</td>
<td>1 байт</td>
<td>0&#215;18</td>
<td>размер элемента, константа</td>
</tr>
<tr>
<td>01eb</td>
<td>nodeLevel</td>
<td>1 байт</td>
<td></td>
<td>уровень узла</td>
</tr>
<tr>
<td>01f8</td>
<td>backPointer</td>
<td>8 байт</td>
<td></td>
<td>обратный указатель</td>
</tr>
</tbody>
</table>
<p>itemCount – определяет количество 24-байтовых записей, которые являются активными.<br />
nodeLevel – имеет ненулевое значение для этого типа узлов. Листья имеют другой формат.<br />
backPointer – должно совпадать c backPointer тройки, которая указывает на этот узел.<br />
Каждый элемент в этом узле – тройка (ID2, backPointer, offset), где смещение указывает на дочерний узел в дереве. Значение backPointer должно совпадать с backPointer в дочернем узле. ID2 – наименьшее значение ID2 в поддереве.</p>
<p><strong>64-битный лист Индекса 2</strong><br />
Лист имеет размер 512 байт.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>01e8</td>
<td>itemCount</td>
<td>1 байт</td>
<td></td>
<td>количество элементов</td>
</tr>
<tr>
<td>01e9</td>
<td>maxItemCount</td>
<td>1 байт</td>
<td>0x0f</td>
<td>максимальное количество элементов, константа</td>
</tr>
<tr>
<td>01ea</td>
<td>itemSize</td>
<td>1 байт</td>
<td>0&#215;20</td>
<td>размер элемента, константа</td>
</tr>
<tr>
<td>01eb</td>
<td>nodeLevel</td>
<td>1 байт</td>
<td>0&#215;00</td>
<td>уровень узла, для листьев константа</td>
</tr>
<tr>
<td>01f8</td>
<td>backPointer</td>
<td>8 байт</td>
<td></td>
<td>обратный указатель</td>
</tr>
</tbody>
</table>
<p>itemCount – определяет количество 32-байтовых записей, которые являются активными.<br />
nodeLevel – равно нулю для листьев.<br />
backPointer – должен совпадать с backPointer тройки, которая указывает на этот узел.<br />
Каждый элемент в этом узле является кортежем (ID2, DESC-ID1, LIST-ID1, PARENT-ID2).</p>
<p><strong>64-битный Список Ассоциаций Элементов (тип 0&#215;0002)</strong><br />
Содержит ассоциации между ID1 и ID2 для элементов, контролируемых записью.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>signature</td>
<td>2 байта</td>
<td>0&#215;0002</td>
<td>сигнатура, константа</td>
</tr>
<tr>
<td>0002</td>
<td>count</td>
<td>2 байта</td>
<td></td>
<td>количество</td>
</tr>
<tr>
<td>0004</td>
<td>unknown</td>
<td>4 байта</td>
<td>0</td>
<td>неизвестно, возможно константа</td>
</tr>
<tr>
<td>0008</td>
<td>id2</td>
<td>4 байта</td>
<td></td>
<td></td>
</tr>
<tr>
<td>000c</td>
<td>unknown1</td>
<td>2 байта</td>
<td>0</td>
<td>возможно количество или размер</td>
</tr>
<tr>
<td>000e</td>
<td>unknown2</td>
<td>2 байта</td>
<td>0</td>
<td>возможно количество или размер</td>
</tr>
<tr>
<td>0010</td>
<td>id</td>
<td>8 байт</td>
<td></td>
<td></td>
</tr>
<tr>
<td>0018</td>
<td>table2</td>
<td>8 байт</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p><strong>Связанный дескриптор (тип 0xbcec)</strong><br />
Содержит информацию об элементе, который может быть письмом, контактом или другим типом Outlook&#8217;а. In the above leaf node, we have a tuple of (0&#215;21, 0x00e638, 0, 0) 0x00e638 is the ID1 of the associated descriptor, and we can lookup that ID1 value in the index1 b-tree to find the (offset,size) of the data in the .pst file. Например, в листе мы имеем кортеж (0&#215;21, 0x00e638, 0, 0). 0x00e638 – ID1 связанного с ним дескриптора, и мы можем посмотреть значение ID1 в Б-дереве index1 чтобы найти смещение и размер этих данных в файл .pst файле.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>indexOffset</td>
<td>2 байта</td>
<td></td>
<td>смещение индекса</td>
</tr>
<tr>
<td>0002</td>
<td>signature</td>
<td>2 байта</td>
<td>0xbcec</td>
<td>сигнатура</td>
</tr>
<tr>
<td>0004</td>
<td>b5offset</td>
<td>4 байта</td>
<td></td>
<td>ссылка на индекс</td>
</tr>
</tbody>
</table>
<p>Стоит отметить, что существуют и другие форматы блока дескриптора с другими сигнатурами. indexOffset указывает  позицию в блоке дескриптора, у нас есть массив из двухбайтовых целых чисел. Первое целое (0x000b) является (количество &#8212; 1) числом перекрывающихся пар. Перекрывающиеся означает, что второй элемент пары равен первому элементу следующий пары. Значения элементов пар &#8212; это смещение элементов в данном блоке в виде (начальное смещение, конечное смещение + 1).<br />
b5offset имеет тип &#171;ссылка на индекс&#187;. Такие ссылки имеют как минимум две разные формы и могут указывать на данные в этом же блоке или в каком-то другом. Внешние ссылки имеют установленные в единицу 4 младших бита и являются значениями ID2, которые могут быть использованы для извлечения данных. Если значение ссылки, например, равно 0&#215;0020, то это внтрунняя ссылка, которую надо сдвинуть вправо на 4 бита чтобы получить значение 0&#215;0002, которое является смещением, которое надо прибавить к indexOffset+2 (+2 – чтобы пропустить count).<br />
До сих пор мы описывали внутренние ссылки на индекс, где старшие 16 бит нулевые. Это достаточно для одиночных блоков десприторов. Но в случае типа блока дескриптора 0&#215;0101 мы получим массив подблоков. В таких ситуациях старшие 16 бит внутренней ссылки на индекс используются для выбора подблока. Каждый подблок начинается с 16 бит indexOffset&#8217;а, который указывает на count и массив из 16-битных пар целых чисел, которые являются смещением в текущем подблоке.<br />
Наконец, мы получили смещение и размер блока &#171;b5&#8243;. Блок имеет следующий формат:</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>signature</td>
<td>2 байта</td>
<td>0x02b5</td>
<td>сигнатура, константа</td>
</tr>
<tr>
<td>0002</td>
<td>datasize</td>
<td>2 байта</td>
<td>0&#215;0006</td>
<td>размер данных, может быть 6 или 2 для 8-байтовых записей</td>
</tr>
<tr>
<td>0004</td>
<td>descoffset</td>
<td>4 байта</td>
<td></td>
<td>ссылка на индекс</td>
</tr>
</tbody>
</table>
<p>Каждая запись дескриптора имеет следующий формат:</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>itemType</td>
<td>2 байта</td>
<td>тип элемента</td>
</tr>
<tr>
<td>0002</td>
<td>referenceType</td>
<td>2 байта</td>
<td>тип ссылки</td>
</tr>
<tr>
<td>0004</td>
<td>value</td>
<td>4 байта</td>
<td>значение</td>
</tr>
</tbody>
</table>
<p>Для некоторых типов ссылок (типы 2, 3, 0xb) значение используется напрямую, в других случаях это поле является ссылкой на индекс, который также является значением ID2 или смещением, которое надо сдвинуть вправо на 4 бита и использовать для извлечения пар из таблицы индекса чтобы найти смещение и размер элемента в данном блоке дескриптора.</p>
<div class="spoiler"><a class="spoilerheader" onclick="this.parentNode.className=this.parentNode.className=='spoiler'?'spoiler open':'spoiler'"><strong>Известные типы ссылок</strong></a></p>
<div class="spoilertext">Известные типы ссылок:<br />
0&#215;0002 &#8212; Signed 16bit value (знаковое 16-битное значение)<br />
0&#215;0003 &#8212; Signed 32bit value (знаковое 32-битное значение)<br />
0&#215;0004 &#8212; 4-byte floating point (4-байтовое значение с плавающей точкой)<br />
0&#215;0005 &#8212; Floating point double (с плавающей точкой двойной точности)<br />
0&#215;0006 &#8212; Signed 64-bit int (знаковое 64-битное целое)<br />
0&#215;0007 &#8212; Application Time  (&#171;время приложения&#187;)<br />
0x000A &#8212; 32-bit error value (32-битный код ошибки)<br />
0x000B &#8212; Boolean (non-zero = true)<br />
0x000D &#8212; Embedded Object (вложенный объект)<br />
0&#215;0014 &#8212; 8-byte signed integer (8-байтовое знаковое целое)<br />
0x001E &#8212; Null terminated String (строка, заканчивающаяся \0)<br />
0x001F &#8212; Unicode string (строка юникода)<br />
0&#215;0040 &#8212; Systime &#8212; Filetime structure (структура времени)<br />
0&#215;0048 &#8212; OLE Guid<br />
0&#215;0102 &#8212; Binary data (двоичные данные)<br />
0&#215;1003 &#8212; Array of 32bit values (массив 32-битных значений)<br />
0&#215;1014 &#8212; Array of 64bit values (массив 64-битных значений)<br />
0x101E &#8212; Array of Strings (массив строк)<br />
0&#215;1102 &#8212; Array of Binary data (массив двоичных данных)<br />
<!--more--></p>
<p>Следующие типы известны, но не используются в libpst:<br />
0002  Alternate recipient allowed<br />
0003  Extended Attributes Table<br />
0017  Importance Level<br />
001a  IPM Context, message class<br />
0023  Global delivery report requested<br />
0026  Priority<br />
0029  Read Receipt<br />
002b  Reassignment Prohibited<br />
002e  Original Sensitivity<br />
0036  Sensitivity<br />
0037  Email Subject<br />
0039  Client submit time / date sent<br />
003b  Outlook Address of Sender<br />
003f  Outlook structure describing the recipient<br />
0040  Name of the Outlook recipient structure<br />
0041  Outlook structure describing the sender<br />
0042  Name of the Outlook sender structure<br />
0043  Another structure describing the recipient<br />
0044  Name of the second recipient structure<br />
004f  Reply-To Outlook Structure<br />
0050  Name of the Reply-To structure<br />
0051  Outlook Name of recipient<br />
0052  Second Outlook name of recipient<br />
0057  My address in TO field<br />
0058  My address in CC field<br />
0059  Message addressed to me<br />
0063  Response requested<br />
0064  Sender&#8217;s Address access method (SMTP, EX)<br />
0065  Sender&#8217;s Address<br />
0070  Conversation topic, processed subject (with Fwd:, Re, &#8230; removed)<br />
0071  Conversation index<br />
0072  Original display BCC<br />
0073  Original display CC<br />
0074  Original display TO<br />
0075  Recipient Address Access Method (SMTP, EX)<br />
0076  Recipient&#8217;s Address<br />
0077  Second Recipient Access Method (SMTP, EX)<br />
0078  Second Recipient Address<br />
007d  Email Header. This is the header that was attached to the email<br />
0c17  Reply Requested<br />
0c19  Second sender structure<br />
0c1a  Name of second sender structure<br />
0c1d  Second outlook name of sender<br />
0c1e  Second sender access method (SMTP, EX)<br />
0c1f  Second Sender Address<br />
0e01  Delete after submit<br />
0e02  BCC Addresses<br />
0e03  CC Addresses<br />
0e04  SentTo Address<br />
0e06  Date.<br />
0e07  Flag bits<br />
0&#215;01 &#8212; Read<br />
0&#215;02 &#8212; Unmodified<br />
0&#215;04 &#8212; Submit<br />
0&#215;08 &#8212; Unsent<br />
0&#215;10 &#8212; Has Attachments<br />
0&#215;20 &#8212; From Me<br />
0&#215;40 &#8212; Associated<br />
0&#215;80 &#8212; Resend<br />
0&#215;100 &#8212; RN Pending<br />
0&#215;200 &#8212; NRN Pending<br />
0e08  Message Size<br />
0e0a  Sentmail EntryID<br />
0e1f  Compressed RTF in Sync<br />
0e20  Attachment Size<br />
0ff9  binary record header<br />
1000  Plain Text Email Body. Does not exist if the email doesn&#8217;t have a plain text version<br />
1006  RTF Sync Body CRC<br />
1007  RTF Sync Body character count<br />
1008  RTF Sync body tag<br />
1009  RTF Compressed body<br />
1010  RTF whitespace prefix count<br />
1011  RTF whitespace tailing count<br />
1013  HTML Email Body. Does not exist if the email doesn&#8217;t have an HTML version<br />
1035  Message ID<br />
1042  In-Reply-To or Parent&#8217;s Message ID<br />
1046  Return Path<br />
3001  Folder Name? I have seen this value used for the contacts record aswell<br />
3002  Address Type<br />
3003  Contact Address<br />
3004  Comment<br />
3007  Date item creation<br />
3008  Date item modification<br />
300b  binary record header<br />
35df  Valid Folder Mask<br />
35e0  binary record contains a reference to &#171;Top of Personal Folder&#187; item<br />
35e2  binary record contains a reference to default outbox item<br />
35e3  binary record contains a reference to &#171;Deleted Items&#187; item<br />
35e4  binary record contains a reference to sent items folder item<br />
35e5  binary record contains a reference to user views folder item<br />
35e6  binary record contains a reference to common views folder item<br />
35e7  binary record contains a reference to &#171;Search Root&#187; item<br />
3602  the number of emails stored in a folder<br />
3603  the number of unread emails in a folder<br />
360a  Has Subfolders<br />
3613  the folder content description<br />
3617  Associate Content count<br />
3701  Binary Data attachment<br />
3704  Attachment Filename<br />
3705  Attachement method<br />
3707  Attachment Filename long<br />
370b  Attachment Position<br />
370e  Attachment mime encoding<br />
3710  Attachment mime Sequence<br />
3a00  Contact&#8217;s Account name<br />
3a01  Contact Alternate Recipient<br />
3a02  Callback telephone number<br />
3a03  Message Conversion Prohibited<br />
3a05  Contacts Suffix<br />
3a06  Contacts First Name<br />
3a07  Contacts Government ID Number<br />
3a08  Business Telephone Number<br />
3a09  Home Telephone Number<br />
3a0a  Contacts Initials<br />
3a0b  Keyword<br />
3a0c  Contact&#8217;s Language<br />
3a0d  Contact&#8217;s Location<br />
3a0e  Mail Permission<br />
3a0f  MHS Common Name<br />
3a10  Organizational ID #<br />
3a11  Contacts Surname<br />
3a12  original entry id<br />
3a13  original display name<br />
3a14  original search key<br />
3a15  Default Postal Address<br />
3a16  Company Name<br />
3a17  Job Title<br />
3a18  Department Name<br />
3a19  Office Location<br />
3a1a  Primary Telephone<br />
3a1b  Business Phone Number 2<br />
3a1c  Mobile Phone Number<br />
3a1d  Radio Phone Number<br />
3a1e  Car Phone Number<br />
3a1f  Other Phone Number<br />
3a20  Transmittable Display Name<br />
3a21  Pager Phone Number<br />
3a22  user certificate<br />
3a23  Primary Fax Number<br />
3a24  Business Fax Number<br />
3a25  Home Fax Number<br />
3a26  Business Address Country<br />
3a27  Business Address City<br />
3a28  Business Address State<br />
3a29  Business Address Street<br />
3a2a  Business Postal Code<br />
3a2b  Business PO Box<br />
3a2c  Telex Number<br />
3a2d  ISDN Number<br />
3a2e  Assistant Phone Number<br />
3a2f  Home Phone 2<br />
3a30  Assistant&#8217;s Name<br />
3a40  Can receive Rich Text<br />
3a41  Wedding Anniversary<br />
3a42  Birthday<br />
3a43  Hobbies<br />
3a44  Middle Name<br />
3a45  Display Name Prefix (Title)<br />
3a46  Profession<br />
3a47  Preferred By Name<br />
3a48  Spouse&#8217;s Name<br />
3a49  Computer Network Name<br />
3a4a  Customer ID<br />
3a4b  TTY/TDD Phone<br />
3a4c  Ftp Site<br />
3a4d  Gender<br />
3a4e  Manager&#8217;s Name<br />
3a4f  Nickname<br />
3a50  Personal Home Page<br />
3a51  Business Home Page<br />
3a57  Company Main Phone<br />
3a58  childrens names<br />
3a59  Home Address City<br />
3a5a  Home Address Country<br />
3a5b  Home Address Postal Code<br />
3a5c  Home Address State or Province<br />
3a5d  Home Address Street<br />
3a5e  Home Address Post Office Box<br />
3a5f  Other Address City<br />
3a60  Other Address Country<br />
3a61  Other Address Postal Code<br />
3a62  Other Address State<br />
3a63  Other Address Street<br />
3a64  Other Address Post Office box<br />
65e3  Entry ID<br />
67f2  Attachment ID2 value<br />
67ff  Password checksum<br />
6f02  Secure HTML Body<br />
6f04  Secure Text Body<br />
7c07  Top of folders RecID<br />
8005  Contact Fullname<br />
801a  Home Address<br />
801b  Business Address<br />
801c  Other Address<br />
8045  Work Address Street<br />
8046  Work Address City<br />
8047  Work Address State<br />
8048  Work Address Postal Code<br />
8049  Work Address Country<br />
804a  Work Address Post Office Box<br />
8082  Email Address 1 Transport<br />
8083  Email Address 1 Address<br />
8084  Email Address 1 Description<br />
8085  Email Address 1 Record<br />
8092  Email Address 2 Transport<br />
8093  Email Address 2 Address<br />
8094  Email Address 2 Description<br />
8095  Email Address 2 Record<br />
80a2  Email Address 3 Transport<br />
80a3  Email Address 3 Address<br />
80a4  Email Address 3 Description<br />
80a5  Email Address 3 Record<br />
80d8  Internet Free/Busy<br />
8205  Appointment shows as<br />
8208  Appointment Location<br />
820d  Appointment start<br />
820e  Appointment end<br />
8214  Label for appointment<br />
8215  All day appointment flag<br />
8231  Recurrence type<br />
8232  Recurrence description<br />
8234  TimeZone of times<br />
8235  Recurrence Start Time<br />
8236  Recurrence End Time<br />
8501  Reminder minutes before appointment start<br />
8503  Reminder alarm<br />
8516  Common Time Start<br />
8517  Common Time End<br />
851f  Play reminder sound filename<br />
8530  Followup String<br />
8534  Mileage<br />
8535  Billing Information<br />
8554  Outlook Version<br />
8560  Appointment Reminder Time<br />
8700  Journal Entry Type<br />
8706  Start Timestamp<br />
8708  End Timestamp<br />
8712  Journal Entry Type &#8212; duplicate?</p></div>
</div>
<p><strong>Связанный дескриптор (тип 0x7cec)</strong><br />
Блоки дескриптора такого типа похожи блоки типа 0xbcec.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>indexOffset</td>
<td>2 байта</td>
<td></td>
<td>смещение индекса</td>
</tr>
<tr>
<td>0002</td>
<td>signature</td>
<td>2 байта</td>
<td>0x7cec</td>
<td>сигнатура, константа</td>
</tr>
<tr>
<td>0004</td>
<td>7coffset</td>
<td>4 байта</td>
<td></td>
<td>ссылка на индекс</td>
</tr>
</tbody>
</table>
<p>Начиная с позиции в блоке дескриптора на которую указывает indexOffset мы имеем массив двухбайтовых целых чисел. Первое число, например 0&#215;0006, – это количество – 1 числа перекрывающихся пар. Первая пара (все значения взяты случайным образом, это не константы) – (0, 0xc), следующая – (0xc, 0&#215;14), т.е. первое значение следующей пары равно второму предыдущей (это и означает &#171;перекрывающиеся пары&#187;). Значение пары означает начальное и конечное + 1 смещение элементов в данном блоке.</p>
<p>7coffset – ссылка на индекс. Если ссылка внутренняя – то необходимо сдвинуть её значение вправо на 4 бита и прибавить к indexOffset+2, тогда она будет указывать на первую пару (прибавляем два чтобы пропустить количество пар вначале). Теперь у нас есть смещение и размер блока &#171;7c&#187;. Блок типа &#171;7c&#187; начинает с заголовка следующего формата:</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>signature</td>
<td>1 байт</td>
<td>0x7c</td>
<td>сигнатура, константа</td>
</tr>
<tr>
<td>0001</td>
<td>itemCount</td>
<td>1 байт</td>
<td></td>
<td>соличество элементов</td>
</tr>
<tr>
<td>0002</td>
<td>unknown</td>
<td>2 байта</td>
<td></td>
<td></td>
</tr>
<tr>
<td>0004</td>
<td>unknown</td>
<td>2 байта</td>
<td></td>
<td></td>
</tr>
<tr>
<td>0006</td>
<td>unknown</td>
<td>2 байта</td>
<td></td>
<td></td>
</tr>
<tr>
<td>0008</td>
<td>recordSize</td>
<td>2 байта</td>
<td></td>
<td>размер записи</td>
</tr>
<tr>
<td>000a</td>
<td>b5Offset</td>
<td>4 байта</td>
<td></td>
<td>ссылка на индекс</td>
</tr>
<tr>
<td>000e</td>
<td>index2Offset</td>
<td>4 байта</td>
<td></td>
<td>ссылка на индекс</td>
</tr>
<tr>
<td>0012</td>
<td>unknown</td>
<td>2 байта</td>
<td></td>
<td></td>
</tr>
<tr>
<td>0014</td>
<td>unknown</td>
<td>2 байта</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Так мы получаем смещение и размер блока &#171;b5&#8243;, формат самого блока ниже.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>signature</td>
<td>2 байта</td>
<td>0x04b5</td>
<td>сигнатура, константа</td>
</tr>
<tr>
<td>0002</td>
<td>datasize</td>
<td>2 байта</td>
<td></td>
<td>размер данных</td>
</tr>
<tr>
<td>0004</td>
<td>descoffset</td>
<td>4 байта</td>
<td></td>
<td>ссылка на индекс</td>
</tr>
</tbody>
</table>
<p>По ссылке decoffset мы придём к неизвестному блоку в неизученном формате. Иногда эта ссылка и ссылка index2Offset в блоке типа 7c могут быть равны нулю. Это как то связано, скорее всего, со статусом сообщения &#171;прочтёное/новое&#187;.<br />
К index2Offset прибавляем indexOffset + 2 и получаем указатель на пару (0xf0, 0&#215;155), которая указывает на массив таблиц 4-байтовых целых. Далее будем называть это таблицы IND2. Размер каждой из этих таблиц указан в поле recordSize заголовка блока 7c. Количество таблиц указано в recordCount в блоке b5.</p>
<p>Теперь оставшиеся данные в блоке 7c после заголовка начинаются со смещения 0x2a. Далее идёт itemCount (в смысле itemCount &#8212; количество элементов) 8-байтовых элементов следующего формата:</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
</tr>
<tr>
<td>0000</td>
<td>referenceType</td>
<td>2 байта</td>
</tr>
<tr>
<td>0002</td>
<td>itemType</td>
<td>2 байта</td>
</tr>
<tr>
<td>0004</td>
<td>ind2Offset</td>
<td>2 байта</td>
</tr>
<tr>
<td>0006</td>
<td>size</td>
<td>1 байт</td>
</tr>
<tr>
<td>0007</td>
<td>unknown</td>
<td>1 байт</td>
</tr>
</tbody>
</table>
<p>ind2Offset &#8212; смещение в текущей IND2 таблице. Если оно указывает на 4х байтовое целое значение, тогда мы извлекаем такую же тройку (тип элемента, тип ссылки, значение), как и в блоках дескриптора типа 0xbcec. Иначе, значения используются напрямую. Такие 8-байтовые дескрипторы обрабатываются recorCount раз, какждый раз используя следующую таблицу IND2. Типы элемента и ссылки такие же, как и описанные выше для блока дескриптора типа 0xbcec.</p>
<p><strong>Связаный дескриптор (тип 0&#215;0101)</strong><br />
Такой блок дескриптора содержит список значений ID1.</p>
<table border="1">
<tbody>
<tr>
<td>смещение</td>
<td>поле</td>
<td>размер</td>
<td>значение</td>
<td>описание</td>
</tr>
<tr>
<td>0000</td>
<td>signature</td>
<td>2 байта</td>
<td>0&#215;0101</td>
<td>сигнатура, константа</td>
</tr>
<tr>
<td>0002</td>
<td>count</td>
<td>2 байта</td>
<td></td>
<td>количество</td>
</tr>
<tr>
<td>0004</td>
<td>totalLenght</td>
<td>4 байта</td>
<td></td>
<td>общая длина</td>
</tr>
<tr>
<td>0008</td>
<td>id1</td>
<td>8 байта</td>
<td></td>
<td></td>
</tr>
<tr>
<td>0010</td>
<td>id1</td>
<td>8 байта</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Если у вас возникли какие-либо вопросы, предложения и т.п. &#8212; как обычно, в комменты :).</p>
<p>Ссылки к статье:<br />
<a href="http://www.five-ten-sg.com/libpst/rn01re06.html">http://www.five-ten-sg.com/libpst/rn01re06.html</a> &#8212; Оригинал, рассматривается обе версии формата.<br />
<a href="http://ru.wikipedia.org/wiki/%D0%91-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE">http://ru.wikipedia.org/wiki/%D0%91-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE</a> &#8212; Б-дерево.</p>
]]></content:encoded>
			<wfw:commentRss>http://zetblog.ru/theory/documentation/200901/microsoft-outlook-%d1%84%d0%be%d1%80%d0%bc%d0%b0%d1%82-pff-personal-folder-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

