<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SGriffin's MAPI Internals : MFCMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/</link><description>Tags: MFCMAPI</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.20496 (Build: 5.6.583.20496)</generator><item><title>January 2012 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2012/01/23/january-2012-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Mon, 23 Jan 2012 19:40:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10259736</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10259736</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10259736</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2012/01/23/january-2012-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;No one’s taking my subtle hints about &lt;a href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;. One more try: It sure would be nice if someone added MFCMAPI to the &lt;a href="http://en.wikipedia.org/wiki/Messaging_Application_Programming_Interface"&gt;article about MAPI&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The January 2012 Release (build 15.0.0.1030) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I’m continuing to crunch on the UI overhaul. This release has a ton of fixes for various flicker issues and glitches, especially those which show under the Windows Classic theme. Most of the problems were bad assumptions on my part that the Classic Theme helped expose. I also worked a good bit on making my various dialogs more pretty, practically rewriting the layout engine in the process. Finally, I finished up my work on painting the system buttons. This last bit required a bit of &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2009/03/06/kernel-debugging-mfcmapi.aspx"&gt;kernel debugging&lt;/a&gt; to figure out why Windows liked to repaint on top of my icons when I moved the mouse around. It turns out that initialization of the window’s system menu is what caused this. If you’re interested, look at how I handle WM_CREATE.&lt;/p&gt;  &lt;p&gt;I’m continuing to tweak the colors. Here’s another hero screenshot highlighting the &lt;strike&gt;new &lt;/strike&gt;new color scheme, including the new system buttons:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/2620.MFCMAPINewUI_5F00_02F9E1FB.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MFCMAPINewUI" border="0" alt="MFCMAPINewUI" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/7674.MFCMAPINewUI_5F00_thumb_5F00_5985A0BA.png" width="240" height="193" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MFCMAPI: Rewrote/cleaned up most of the dialog rendering &lt;/li&gt;    &lt;li&gt;MFCMAPI: Much more double buffering to reduce flicker&lt;/li&gt;    &lt;li&gt;MFCMAPI: Custom system icons&lt;/li&gt;    &lt;li&gt;MrMAPI: New –Restrict switch to limit output from folders&lt;/li&gt;    &lt;li&gt;MFCMAPI: Softer color scheme&lt;/li&gt;    &lt;li&gt;MFCMAPI: Fixed all known Classic Theme glitches&lt;/li&gt;    &lt;li&gt;SmartView: Added PidTagRoamingBinary&lt;/li&gt;    &lt;li&gt;MFCMAPI: Much smaller options dialog now scrolls.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10259736" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>December 2011 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/12/13/december-2011-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Tue, 13 Dec 2011 20:34:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10247344</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10247344</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10247344</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/12/13/december-2011-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;What’s an app got to do to get on &lt;a href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;? You know I can’t put it there myself – that’s against the &lt;a href="http://en.wikipedia.org/wiki/Wikipedia:Conflict_of_interest"&gt;rules&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The December 2011 Release (build 15.0.0.1030) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;When I started working on the UI overhaul, I knew it was going to take a few releases to get it right. After all, I’m a one man development team, and while I’ve got a number of folks who do testing for me, I can’t catch everything. Since the last release, I’ve found (or been pointed at) a number of issues with the new UI, mostly relating to the abundance of themes out there. I’ve also found a new (to me) code analysis tool which has uncovered a number of potential issues. So I’ve decided to release an off schedule build to address everything. I’m still not done with the UI, but this release should be more visually stable on more machines.&lt;/p&gt;  &lt;p&gt;Since I’ve changed some colors in this release, I took a new screenshot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/4621.MFCMAPINewUI_5F00_4B13C7DE.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MFCMAPINewUI" border="0" alt="MFCMAPINewUI" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/7041.MFCMAPINewUI_5F00_thumb_5F00_480169E9.png" width="240" height="192" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MFCMAPI: Border painting was weird on some systems (never figured out exactly which, but did find my math error).&lt;/li&gt;    &lt;li&gt;MFCMAPI: Underlying window bleed through in About dialog without Aero (fixed)&lt;/li&gt;    &lt;li&gt;MFCMAPI: Clipping in the tree control as we hover highlight&lt;/li&gt;    &lt;li&gt;MFCMAPI: Color choices conflicted with certain themes (switched to system colors which should not conflict)&lt;/li&gt;    &lt;li&gt;Function annotations: Fixed a number of annotation and signature issues.&lt;/li&gt;    &lt;li&gt;Other sundry code sanitation issues.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10247344" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Enabling Kerberos Authentication</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/12/06/enabling-kerberos-authentication.aspx</link><pubDate>Tue, 06 Dec 2011 19:58:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10244750</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10244750</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10244750</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/12/06/enabling-kerberos-authentication.aspx#comments</comments><description>&lt;p&gt;We had a customer recently who was using Outlook 2010’s MAPI in their application to talk to the Exchange server. They wanted to enable Kerberos authentication, but were having trouble enabling it programmatically. They had found the property that gets changed when you enable Kerberos authentication through the UI: PR_PROFILE_AUTH_PACKAGE in the global profile section gets set to RPC_C_AUTHN_GSS_KERBEROS. When they tried setting this value in their profile though, they’d find that &lt;a href="http://msdn.microsoft.com/en-us/library/cc815381.aspx"&gt;OpenAddressBook&lt;/a&gt; would return MAPI_W_ERRORS_RETURNED and subsequent calls to &lt;a href="http://msdn.microsoft.com/en-us/library/cc815696.aspx"&gt;ResolveName&lt;/a&gt; would return MAPI_E_CALL_FAILED. What was really strange was if they opened the profile using Outlook or &lt;a href="http://mfcmapi.codeplex.com/"&gt;MFCMAPI&lt;/a&gt;, the profile would somehow be “fixed”, and their application would work.&lt;/p&gt;  &lt;p&gt;By comparing the profile before and after “fixing” it, we were able to track the difference down to a single property, which development has given me permission to document, PR_PROFILE_HOME_SERVER_FQDN (0x662A001F). This property is located in the address book section, dca740c8c042101ab4b908002b2fe182 (aka muidEMSAB). Setting this property to the DN of the user’s directory server was sufficient to turn a non-working profile into a working profile using Kerberos authentication. For example, if my DC was named ExampleDC, I might set this property to “ExampleDC.example.com”.&lt;/p&gt;  &lt;p&gt;So why would running MFCMAPI or Outlook fix the profile? It all has to do with the flags the customer passed to MAPILogonEx. They were passing MAPI_NT_SERVICE. To the Exchange address book provider, this indicated (among other things) that we should not load our user interface (UI) support object, since we’re running in a context that doesn’t allow UI. Later, when we’re attempting to connect to the server, we check if we have been referred to a DC yet. This is the PR_PROFILE_HOME_SERVER_FQDN property. Finding this property not set, we enter the code that would normally request a referral from the Exchange server. However, this code is dependent on the UI support object, so it does not execute. Ultimately, we decide to just talk directly to the Exchange server and let it handle proxying our calls over to the DC as needed.&lt;/p&gt;  &lt;p&gt;This all works fine as long as we’re not using Kerberos authentication. However, as we saw in the &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2009/08/11/auth-and-check-names.aspx"&gt;Check Names&lt;/a&gt; article, you cannot use Kerberos to make address book calls to the Exchange server (Exchange 2010 may fix this, but I believe this customer was using Exchange 2007). That’s why setting PR_PROFILE_HOME_SERVER_FQDN fixes the problem, since we connect directly to the DC.&lt;/p&gt;  &lt;p&gt;Notes: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Exchange 2010 handles address book calls made to the CAS differently from how Exchange 2007 and earlier handle them. The DSProxy process is no longer used. So the Kerberos authentication may succeed. However, the client would still be talking to the Exchange server instead of directly to the DC, which may not be desired. Setting PR_PROFILE_HOME_SERVER_FQDN will avoid this. &lt;/li&gt;    &lt;li&gt;Logging on without MAPI_NT_SERVICE sets additional properties besides&amp;#160; PR_PROFILE_HOME_SERVER_FQDN, but investigation has not shown any of them to be essential. I’ll update this post if this changes. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10244750" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Documentation/">Documentation</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MSDN/">MSDN</category></item><item><title>November 2011 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/11/29/november-2011-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Tue, 29 Nov 2011 13:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10242400</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10242400</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10242400</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/11/29/november-2011-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;Still no mention of MFCMAPI on &lt;a href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;. I had such high hopes. Sigh.&lt;/p&gt;
&lt;p&gt;The November 2011 Release (build 15.0.0.1029) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that build number. That&amp;rsquo;s right. I jumped all the way from 6 (where I&amp;rsquo;ve been stuck forever) to 15. That&amp;rsquo;s the sort of jump that&amp;rsquo;s normally only accompanied by a full UI refresh. And that&amp;rsquo;s exactly what you get! I&amp;rsquo;ve overhauled just about every aspect of the UI for a more modern, some might say &amp;ldquo;Metro inspired&amp;rdquo;, look. I&amp;rsquo;ll admit, there&amp;rsquo;s still some work to be done (I didn&amp;rsquo;t get to scrollbars for instance) but this is a pretty good start. Let&amp;rsquo;s take a look:&lt;/p&gt;
&lt;p&gt;[See the new screenshot &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2011/12/13/december-2011-release-of-mfcmapi-and-mrmapi.aspx"&gt;here&lt;/a&gt;.]&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/3225.MFCMAPINewUI_5F00_69603D6D.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve drastically slimmed down the menus, stuffing most of the little used functionality into Advanced menus that most of you will never need to open. The old, usually empty, File menu is gone and Session now takes prominence. This should help new users immensely. Long time users of MFCMAPI may want to spend a little time figuring out where their favorite features went, but nothing&amp;rsquo;s been cut.&lt;/p&gt;
&lt;p&gt;A note about the tree: In the past, whenever you selected or expanded a folder, MFCMAPI would register for notifications on that folder and a number of it&amp;rsquo;s child folders. This was represented in the UI by bolding the folder name. This just confused people, so now, the only time I bold a folder name is to represent the currently selected folder. You can tell if MFCMAPI is listening for notifications on a folder by looking for a little red &amp;ldquo;I&amp;rsquo;m listening&amp;rdquo;icon after the folder name. It looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/3162.ListeningIcon_5F00_75D624E8.jpg"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Listening Icon" border="0" alt="Listening Icon" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/3582.ListeningIcon_5F00_thumb_5F00_6CE9235A.jpg" width="50" height="18" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MFCMAPI: The entire UI (save scrollbars) has been updated with our new look.&lt;/li&gt;
&lt;li&gt;MFCMAPI: The menu system has been given a long overdue scrub and overhaul.&lt;/li&gt;
&lt;li&gt;MFCMAPI: The links in the help are now clickable.&lt;/li&gt;
&lt;li&gt;MFCMAPI: Options shortcut &amp;ndash; Ctrl+O brings up the newly slimmed options dialog.&lt;/li&gt;
&lt;li&gt;MFCMAPI: While reskinnng the tree view I found several opportunities for performance enhancements. The tree should load faster, with less chatter to the server, and fewer issues with refresh as notifications come in.&lt;/li&gt;
&lt;li&gt;Hex Editor: I&amp;rsquo;ve added commas (,) to the list of ignored characters for hex strings, making importing hex from other applications simpler.&lt;/li&gt;
&lt;li&gt;Debug Viewer: Cancel has been replaced with Close, which makes much more sense.&lt;/li&gt;
&lt;li&gt;MrMAPI: I&amp;rsquo;ve added pbGlobalProfileSectionGuid to our guid list&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10242400" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>September 2011 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/09/14/september-2011-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Wed, 14 Sep 2011 14:38:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10210871</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10210871</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10210871</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/09/14/september-2011-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;Before we get to business, a comment: MFCMAPI does not appear anywhere in &lt;a href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;. This is a sad. Very very sad.&lt;/p&gt;  &lt;p&gt;The September 2011 Release (build 6.0.0.1028) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;We got a handful of new features this time. MrMAPI can now parse flags on the fly, For instance, if you want to know what 0x3a means in PR_MESSAGE_FLAGS, MrMAPI can tell you: &lt;br/&gt;   C:\&amp;gt;mrmapi PR_MESSAGE_FLAGS -flag 3a     &lt;br /&gt;Found property PR_MESSAGE_FLAGS (0x0E070003).     &lt;br /&gt;0x0000003A = MSGFLAG_UNMODIFIED | MSGFLAG_UNSENT | MSGFLAG_HASATTACH | MSGFLAG_FROMME &lt;/p&gt;  &lt;p&gt;Additionally, I added a feature to MFCMAPI to sort the names of properties such that the more common name is listed first. For instance, if you looked at an Exchange profile for the property 0x6612001E, you used to see the following list of property names, in alphabetical order:    &lt;br /&gt;PR_CONTAB_STORE_NAME, PR_CONTAB_STORE_NAME_A, PR_PROFILE_HOME_SERVER_DN, PidTagContactAddressBookStoreName     &lt;br /&gt;Now, when you look at the same property, we see the name we expect to see come first:     &lt;br /&gt;PR_PROFILE_HOME_SERVER_DN, PR_CONTAB_STORE_NAME, PR_CONTAB_STORE_NAME_A, PidTagContactAddressBookStoreName&lt;/p&gt;  &lt;p&gt;I also added property name lookup to the restriction editor and a switch in Options to force MFCMAPI to load MAPI from the System directory, useful for older Exchange servers where Outlook Express may also be installed.&lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MFCMAPI: Better property name sorting. All alternate property names are now hand sorted with the most common name first. Please let me know if you find any which could be sorted better! &lt;/li&gt;    &lt;li&gt;MrMAPI: Flag lookup via the new –Flag switch. &lt;/li&gt;    &lt;li&gt;MFCMAPI: Force System MAPI, allowing MFCMAPI to work again on older Exchange servers. &lt;/li&gt;    &lt;li&gt;MFCMAPI: Prop lookup in the Restriction Editor &lt;/li&gt;    &lt;li&gt;Hex Editor: Bug fix when editing Base64. &lt;/li&gt;    &lt;li&gt;SmartView: Found a type of Public Folder entry ID I wasn’t parsing correctly. &lt;/li&gt;    &lt;li&gt;MFCMAPI: Count Named Properties will now report the highest named property in more situations. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10210871" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>July 2011 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/07/22/june-2011-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Fri, 22 Jul 2011 14:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10188952</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10188952</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10188952</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/07/22/june-2011-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;The July 2011 Release (build 6.0.0.1027) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This round, the focus was on bulking up MrMAPI’s feature set. MrMAPI is one of the core data collection tools being used in a future update to our &lt;a href="http://support.microsoft.com/kb/2538191"&gt;Software Diagnostics Platform&lt;/a&gt; for Outlook issues. This has driven several of the features I’ve added to MrMAPI to make it easier for the engineers writing the diagnostics to grab the bits of information they need so we can resolve issues faster.&lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MFCMAPI: Empty Folder can now delete one message at a time. Useful for those stubborn super large folders where the EmptyFolder API can’t complete.&lt;/li&gt;    &lt;li&gt;MrMAPI: Fid/Mid lookup can now be performed.&lt;/li&gt;    &lt;li&gt;MrMAPI: Open folders by name. Anywhere that takes a folder can now take a full path to the folder by name, or rooted on one of the “known” folders. The known folders list has been augmented to include the Sync Issues folders.&lt;/li&gt;    &lt;li&gt;MrMAPI: Restrict by subject and message class. In case you just want to output certain messages.&lt;/li&gt;    &lt;li&gt;MrMAPI: List folder contents and hierarchy tables.&lt;/li&gt;    &lt;li&gt;MrMAPI: Better handling of non-Exchange mailboxes.&lt;/li&gt;    &lt;li&gt;SmartView: I’ve augmented how PT_I8 is handled.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10188952" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Enough With The Redirects Already</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/07/08/enough-with-the-redirects-already.aspx</link><pubDate>Fri, 08 Jul 2011 20:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10184722</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10184722</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10184722</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/07/08/enough-with-the-redirects-already.aspx#comments</comments><description>&lt;p&gt;Here&amp;rsquo;s the scenario the customer gave us: They use Outlook&amp;rsquo;s MAPI and a single MAPI profile connect to an admin mailbox, and then use CreateStoreEntryID and &lt;a href="http://msdn.microsoft.com/en-us/library/cc842103.aspx"&gt;OpenMsgStore&lt;/a&gt; to open various work mailboxes to do their processing. All day they&amp;rsquo;re opening and closing these mailboxes. In some environments, after they run for some time, one of the OpenMsgStore calls will return MAPI_E_FAILONEPROVIDER. There were a number of variations of the issue, as we&amp;rsquo;ll discuss below, but what they all had in common was that they were rapidly logging in to mailboxes, at least 5 times over a 10 second span.&lt;/p&gt;
&lt;p&gt;This was key to the issue. When we traced the process and debugged the reason for the failure, we saw the Exchange server was returning &lt;a href="http://msdn.microsoft.com/en-us/library/ee218068(EXCHG.80).aspx"&gt;ecServerPaused&lt;/a&gt; when we got the error. Digging further back, we saw we were getting &lt;a href="http://msdn.microsoft.com/en-us/library/ee179302(EXCHG.80).aspx"&gt;ecWrongServer&lt;/a&gt; on earlier, successful connections. If you read through the documentation on these errors, you&amp;rsquo;ll see this is a defense mechanism for Exchange. The ecWrongServer error, which never bubbles up to the caller, indicates that the mailbox requested is not on the server we&amp;rsquo;re talking to. This initiates a &lt;a href="http://msdn.microsoft.com/en-us/library/ee178510(EXCHG.80).aspx"&gt;redirect&lt;/a&gt; conversation to find the right server. This negotiation is expensive, especially since the server conducting it shouldn&amp;rsquo;t have been contacted in the first place. So if the same client triggers too many redirects, Exchange returns ecServerPaused as a signal to the client that maybe it&amp;rsquo;s doing something wrong. You can find this error by calling GetLastError after OpenMsgStore fails. Outlook itself will use this information to trigger an update to the profile to ensure it&amp;rsquo;s talking to the right server.&lt;/p&gt;
&lt;p&gt;So, armed with this information, we went looking at the customer&amp;rsquo;s code to see what they were doing wrong. They would connect to mailbox Homer on server Alpha, obtain the DNs for mailbox Bart and server Beta, and pass these in to CreateStoreEntryID. They would then use this entry ID, and still see the problem if they logged in rapidly. They did nothing wrong and still had a problem.&lt;/p&gt;
&lt;p&gt;This is where things get complicated. First, let&amp;rsquo;s look at the output of CreateStoreEntryID (as parsed with MFCMAPI):&lt;/p&gt;
&lt;p&gt;MAPI Message Store Entry ID: &lt;br /&gt;abFlags = 0x00000000 &lt;br /&gt;Provider GUID = {10BBA138-E505-1A10-A1BB-08002B2A56C2} = muidStoreWrap &lt;br /&gt;Version = 0x00 = MAPIMDB_VERSION &lt;br /&gt;Flag = 0x00 = MAPIMDB_NORMAL &lt;br /&gt;DLLFileName = EMSMDB.DLL &lt;br /&gt;Wrapped Flags = 0x00000000 &lt;br /&gt;WrappedProviderUID = {20FA551B-66AA-CD11-9BC8-00AA002FC45A} = g_muidStorePrivate &lt;br /&gt;WrappedType = 0x0000000C = OPENSTORE_HOME_LOGON | OPENSTORE_TAKE_OWNERSHIP &lt;br /&gt;ServerShortname = Beta &lt;br /&gt;MailboxDN = /o=First Organization/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=Bart&lt;/p&gt;
&lt;p&gt;Note that the entry ID contains the server name &amp;ldquo;Beta&amp;rdquo;, but not the full DN, even though the full DN was passed in to CreateStoreEntryID. This is because the entry ID format generated by CreateStoreEntryID does not support using the full server DN. So only the short name is kept, and that&amp;rsquo;s all emsmdb32 has to work with. To talk to the server, we need the full DN, so we have to manufacture a DN using the information we have at hand. We do this by grabbing the DN of a known good server (in this example, Alpha) and replacing the server name. We then have a dilemma &amp;ndash; this new DN may point to a real server, or it may be total garbage, for instance, if the OUs of the servers were different, this made up DN doesn&amp;rsquo;t exist. So instead of using this newly constructed DN to connect, we instead connect to the only server we know is functioning, using the server DN of the mailbox in the profile.&lt;/p&gt;
&lt;p&gt;Of course, this is wrong and we get redirected, and if we repeat this dance several times we&amp;rsquo;ll hit ecServerPaused. We recognized the potential to do better by implementing a cache of recently used DNs. If the DN we constructed was on this list, we&amp;rsquo;d go ahead and try it. So the first time we connect to Beta, we redirect through Alpha, but subsequent connections will use Beta&amp;rsquo;s DN since it&amp;rsquo;s in the cache. This fix first showed up in Outlook 2003 and 2007 via &lt;a href="http://support.microsoft.com/kb/929307"&gt;929307&lt;/a&gt; and &lt;a href="http://support.microsoft.com/kb/937494"&gt;937949&lt;/a&gt; respectively. So I had the customer check that their customer&amp;rsquo;s Outlook was up to date. Sure enough, one of their clients wasn&amp;rsquo;t, and updating it fixed the problem. This didn&amp;rsquo;t fix the others though, so we debugged again.&lt;/p&gt;
&lt;p&gt;The next site we looked at had an updated Outlook, but the the two servers were in different OUs. We&amp;rsquo;d build a (wrong) DN for Beta using Alpha&amp;rsquo;s DN. This DN wouldn&amp;rsquo;t be in our cache, so we&amp;rsquo;d connect to Alpha for a redirect. We&amp;rsquo;d then cache the (correct) DN for Beta. This same sequence of steps would repeat the next time we log in to Beta. As long as the two servers are in different OUs, we&amp;rsquo;ll always redirect. This customer was able to move mailboxes around and eliminate the problem.&lt;/p&gt;
&lt;p&gt;We then encountered a site with a single OU and up to date Outlook where the problem still happened. A close look at a trace of the problem revealed that in this particular configuration, the customer&amp;rsquo;s code managed to log all the way out of MAPI in between mailbox logons. So the cache we went through all the trouble to maintain was torn down and rebuilt on every pass, making it totally ineffective. Keeping one mailbox open the entire time was enough to keep the cache alive.&lt;/p&gt;
&lt;p&gt;We were able to get their code running in every environment except the ones where they couldn&amp;rsquo;t move their mailboxes and had to keep them in different OUs. For those, the only workaround they can use right now is to slow down a bit. Of course, things would be easier if there was a documented &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2008/03/21/old-school-entry-ids.aspx"&gt;entry ID format that included the FQDN&lt;/a&gt;. Maybe one day there well be&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;I just documented the &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2011/07/21/store-entry-id-v2.aspx"&gt;v2 Store Entry ID format&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10184722" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>MFCMAPI: Documentation By Committee</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/06/13/mfcmapi-documentation-by-committee.aspx</link><pubDate>Mon, 13 Jun 2011 14:29:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10173919</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10173919</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10173919</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/06/13/mfcmapi-documentation-by-committee.aspx#comments</comments><description>&lt;p&gt;I’ve noticed over the years that a number of articles have been written documenting how to use &lt;a href="http://mfcmapi.codeplex.com"&gt;MFCMAPI&lt;/a&gt; to troubleshoot various issues. I thought it would be a good idea to put together a list of these articles in one central location. So after much searching with the Bing and with the Google, I’ve put together this list:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mfcmapi.codeplex.com/wikipage?title=MFCMAPI%20Articles"&gt;MFCMAPI Articles&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I made an effort to classify the articles by topic. I know I’ve probably missed a number of articles – if you wrote an article or are aware of one that ought to be on the list, just let me know.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10173919" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Documentation/">Documentation</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Large Multivalued Properties</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/06/10/large-multivalued-properties.aspx</link><pubDate>Fri, 10 Jun 2011 15:33:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10173353</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10173353</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10173353</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/06/10/large-multivalued-properties.aspx#comments</comments><description>&lt;p&gt;We recently encountered an issue where, in the customer’s code, a call to &lt;a href="http://msdn.microsoft.com/en-us/library/cc765749.aspx"&gt;GetProps&lt;/a&gt; for a particular message failed with MAPI_E_CALL_FAILED. We found that MFCMAPI had trouble getting properties on the message as well. The curious thing was that if we made a GetProps call for one or two properties, it would work. Only when we did GetProps(NULL) or called GetProps with the result of &lt;a href="http://msdn.microsoft.com/en-us/library/cc765530.aspx"&gt;GetPropList&lt;/a&gt; did we see the problem. Further investigation of the RPC Client Access logs on the Exchange server (c:\Program Files\Microsoft\Exchange Server\V14\Logging\RPC Client Access) showed several &lt;strong&gt;BufferTooSmall&lt;/strong&gt; errors logged at the same time as our GetProps calls:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;2011-05-27T17:45:57.201Z,13537,0,/o=SPRINGFIELD14/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=Administrator,,MFCMapi.exe,12.0.6539.5000,Classic,,,ncacn_ip_tcp,,,1149 (rpc::&lt;strong&gt;BufferTooSmall&lt;/strong&gt;),00:00:00.0156244,,RpcDispatch: [BufferTooSmallException] Exception of type 'Microsoft.Exchange.RpcClientAccess.BufferTooSmallException' was thrown.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I had the opportunity to debug this and found some interesting details in how Exchange responds to a GetProps call. The first thing we do is gather all the properties that were requested from the store. Next, we have to pack these results into an RPC buffer to send them back to the client. An RPC buffer is of limited size, so we have to be careful not to pack too much data in to it. We assume everything will fit and count up how many bytes we used. If we used more bytes than is available in the RPC buffer, we look for the largest PT_BINARY, PT_STRING8 or PT_UNICODE property in our list (over 255 bytes) and replace it with the error MAPI_E_NOT_ENOUGH_MEMORY. Then we repeat, repacking the buffer, checking the size, and removing the largest property if necessary. If we reach a point where we’ve removed every string and binary property we can and our buffer is still too large, we fail the call and throw the BufferTooSmall exception. On the client side, we get MAPI_E_CALL_FAILED, and extended error information shows the error ecBufferTooSmall (0x47D == 1149).&lt;/p&gt;  &lt;p&gt;This is what was happening with this message – we had removed every binary and string property we could and still the buffer needed to serialize the remaining properties was larger than the RPC buffer we were given to fill. What took up all the space? This is one of MAPI’s dirty little secrets: large multivalued properties can fill your GetProps buffer and there is no alternative way to request them. This message had a single PT_MV_UNICODE property in it which had entries on the order of a few kilobytes in size. If this property was excluded from the GetProps call, the call would work.. If this property was requested by itself, it would work. But when this property was requested alongside a number of other properties, that was enough to fill the buffer and the call failed.&lt;/p&gt;  &lt;p&gt;We saw this problem with Exchange 2010, but this same packing logic exists in all versions of Exchange. All versions of MAPI (both Outlook and MAPICDO) can potentially hit this&amp;#160; as well.&lt;/p&gt;  &lt;h1&gt;Recommendations for Dealing With Large Multivalued Properties&lt;/h1&gt;  &lt;ol&gt;   &lt;li&gt;Don’t do it. If you use multivalued properties, keep the overall total size relatively small. This will greatly reduce the chance that your multivalued property will cause a failure in GetProps.&lt;/li&gt;    &lt;li&gt;A large number of small multivalued properties can be just as bad as a small number of large multivalued properties. Don’t go adding 50 different multivalued properties to the same message and expect to be able to ask for everything in one call.&lt;/li&gt;    &lt;li&gt;If you must put large amounts of data into multivalued properties, never ask for them alongside other properties. Always ask for them on their own. Put a comment in your code noting why you asked for them by themselves instead of rolling them into another GetProps call so the developer who comes after you doesn’t optimize the code by combining the calls.&lt;/li&gt; &lt;/ol&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10173353" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Gotchas/">Gotchas</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Fun With the MAPI Spooler</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/05/31/fun-with-the-mapi-spooler.aspx</link><pubDate>Tue, 31 May 2011 13:51:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10169907</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10169907</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10169907</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/05/31/fun-with-the-mapi-spooler.aspx#comments</comments><description>&lt;p&gt;Here’s a fun trick. On a machine where you have the &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=E17E7F31-079A-43A9-BFF2-0A110307611E"&gt;Exchange MAPI Download&lt;/a&gt; installed, create a file named “Program” in the root of the system drive. Then start &lt;a href="http://mfcmapi.codeplex.com"&gt;MFCMAPI&lt;/a&gt; and open a profile with an Exchange mailbox in it. You’ll get this nice error:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/3225.SpoolerError_5F00_0A507C88.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Spooler Error" border="0" alt="The MAPI Spooler could not be started. Close and then restart all mail-enabled applications. MAPI 1.0 [000004C7]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-37-67-metablogapi/1731.SpoolerError_5F00_thumb_5F00_143A8F55.jpg" width="244" height="100" /&gt;&lt;/a&gt;     &lt;br /&gt;“The MAPI Spooler could not be started. Close and then restart all mail-enabled applications. MAPI 1.0 [000004C7]”&lt;/p&gt;  &lt;p&gt;Of course, restarting MAPI applications, or even rebooting, won’t help. You have to delete that file, “Program”, from the root of the system drive. Only then will the MAPI spooler start.&lt;/p&gt;  &lt;p&gt;So – what happened here? We’re using &lt;a href="http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx"&gt;CreateProcess&lt;/a&gt; to try to launch the spooler. The string we pass in for the command line looks like this:     &lt;br /&gt;C:\Program Files (x86)\ExchangeMapi\MAPISP32.EXE –0001EFC1A5208C4&lt;/p&gt;  &lt;p&gt;Note the distinct lack of quotes. As the documentation suggests, if you call this function with a path which has white space in it and no quotes, it will try to parse the path as if the first space separates the executable name from the parameters. So it looks for an executable named “C:\Program”. When it finds a file with that name which is not an executable, it returns an error. The lesson here is to make sure to properly quote paths passed to CreateProcess. Also, make sure you don’t have a file named “Program” in the root.&lt;/p&gt;  &lt;p&gt;Outlook’s MAPI is not vulnerable to this problem since it no longer has a separate MAPI spooler process. I don’t believe we’ll be pursuing a fix to the Exchange MAPI download since the likelihood of such a file existing for legitimate purposes is low, and you need to be an administrator to even create it in the first place.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10169907" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Gotchas/">Gotchas</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI+Download/">MAPI Download</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>May 2011 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/05/24/may-2011-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Tue, 24 May 2011 13:50:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10167778</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10167778</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10167778</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/05/24/may-2011-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;The May 2011 Release (build 6.0.0.1026) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This round, the focus was on a new MAPI stub library and Fuzz testing.&lt;/p&gt;  &lt;p&gt;The new &lt;a href="http://mapistublibrary.codeplex.com/"&gt;MAPI Stub Library&lt;/a&gt; is the product of months of hard work on the part of a few talented developers and testers in the Outlook organization. I did a good bit of testing myself and even fixed a few issues, but I did not have the honor of writing it. Incorporating this new stub library into MFCMAPI allowed me to ditch a good bit of my own import code. I highly recommend everyone to check this project out.&lt;/p&gt;  &lt;p&gt;I found some internal tools to help with &lt;a href="http://en.wikipedia.org/wiki/Fuzz_testing"&gt;Fuzz testing&lt;/a&gt;. Using these, I was able to ferret out a number of issues with my SmartView parsers. I’ve actually found far fewer issues than I had expected, so it looks like my parsers were on solid footing already. I’ve fixed everything I’ve found, along with a number of issues reported through &lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg487440"&gt;Windows Error Reporting&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;New MAPI Stub Library&lt;/li&gt;    &lt;li&gt;MrMAPI: Reduced default help length (use –? to get full help)&lt;/li&gt;    &lt;li&gt;MrMAPI: Corrected smartview parser to output to console when output file not specified&lt;/li&gt;    &lt;li&gt;MFCMAPI: Open Profile By Name&lt;/li&gt;    &lt;li&gt;SmartView: Fixed several crash and hang issues in SmartView parsers.&lt;/li&gt;    &lt;li&gt;XML Output is now scrubbed for invalid characters.&lt;/li&gt;    &lt;li&gt;Retail builds are now compiler optimized.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10167778" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Picking an API</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/04/11/picking-an-api.aspx</link><pubDate>Mon, 11 Apr 2011 13:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10152032</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10152032</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10152032</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/04/11/picking-an-api.aspx#comments</comments><description>&lt;p&gt;Angela just posted an article on &lt;a href="http://blogs.msdn.com/b/officedevdocs/archive/2011/04/11/how-do-i-extend-outlook-to-do.aspx"&gt;extending Outlook&lt;/a&gt; on her blog, and an article on &lt;a href="http://msdn.microsoft.com/en-us/library/gg608200.aspx"&gt;picking the right API&lt;/a&gt; on the MSDN. Both articles make several mentions of MFCMAPI and are thus worthwhile reads. The MSDN article is an especially good one-stop overview of all the APIs and technologies available in Outlook, with special attention paid to details such as managed vs unmanaged code, bitness, and threading&lt;/p&gt;
&lt;p&gt;Note that both articles are written very much from Outlook&amp;rsquo;s point of view. The presumption is that Outlook is part of your solution. This may not necessarily be the case. If you are considering server side solutions, your top choices will likely be either &lt;a href="http://msdn.microsoft.com/en-us/library/bb204119(EXCHG.140).aspx"&gt;Exchange Web Services (EWS)&lt;/a&gt; or the &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=E17E7F31-079A-43A9-BFF2-0A110307611E"&gt;MAPI download&lt;/a&gt;, though there several other Exchange based APIs which you can read about in the &lt;a href="http://msdn.microsoft.com/en-us/library/dd877024(EXCHG.140).aspx"&gt;Exchange Server 2010 SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10152032" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/OOM/">OOM</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/EWS/">EWS</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI+Download/">MAPI Download</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>April 2011 Release of MFCMAPI.Net</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/04/01/april-2011-release-of-mfcmapi-net.aspx</link><pubDate>Fri, 01 Apr 2011 12:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10148719</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10148719</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10148719</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/04/01/april-2011-release-of-mfcmapi-net.aspx#comments</comments><description>&lt;p&gt;The April 2011 Release (build 7.0.0.1234) is live: &lt;a href="http://www.youtube.com/watch?v=oHg5SJYRHA0"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I know I just released the March update a few days ago, but I just got permission from development to release this. I have thrown off the shackles of C++ and fully embraced the awesome power of the CLR. MFCMAPI.NET is a complete rewrite of MFCMAPI using the .Net framework.&lt;/p&gt;
&lt;p&gt;The productivity gains were immediate. I was able to completely rewrite MFCMAPI, from scratch, in just 20 minutes. Since I had allotted a full hour for the conversion, I spent the extra time adding some new features, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix My Calendar: This feature will automatically identify whatever problem is plaguing your calendar and Fix It.&lt;/li&gt;
&lt;li&gt;Do That Thing I Just Did, But Everywhere: Ever found a problem on a large number of messages that you could fix just by editing a single property? With this revolutionary new feature, MFCMAPI.Net will record the steps you performed on one message and play them back on all of the other messages. What if you only need to edit a subset of your messages? Don&amp;rsquo;t worry, this feature Just Knows which messages to update. It&amp;rsquo;s that easy!&lt;/li&gt;
&lt;li&gt;No MAPI Required: The most amazing feature of MFCMAPI.Net, and the one of which I am most proud, is No MAPI Required. That&amp;rsquo;s right &amp;ndash; MFCMAPI.Net doesn&amp;rsquo;t need MAPI installed to function! In fact, it doesn&amp;rsquo;t need an Exchange server either. How does it work? Simple: the cloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even after implementing those amazing features, I still had a half hour left, so I decided to fix a few other outstanding issues for the Outlook and Exchange product teams. Look for announcements soon of the following hotfixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unicode MSG file and PSTs in MAPICDO.&lt;/li&gt;
&lt;li&gt;64 bit support in MAPICDO.&lt;/li&gt;
&lt;li&gt;Unified 32 and 64 bit support in all versions of Outlook and MAPI. That&amp;rsquo;s right &amp;ndash; all 32 bit MAPI code will now work without any changes against 64 bit MAPI, and vice versa.&lt;/li&gt;
&lt;li&gt;Return of Exchange Client Extensions in Outlook 2010 and above.&lt;/li&gt;
&lt;li&gt;The EDK is back!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in all, it was a super productive 45 minutes coding with .Net. I even had time for a nap! I look forward to doing it again.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10148719" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Gotchas/">Gotchas</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>March 2011 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/03/30/march-2011-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Wed, 30 Mar 2011 15:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10147805</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10147805</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10147805</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/03/30/march-2011-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;The March 2011 Release (build 6.0.0.1025) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The singular focus of this round is MrMAPI: I made it much smaller and added a bunch of new features to help out some of our upcoming diagnostics initiatives. Hopefully people will find interesting ways to use these features.&lt;/p&gt;
&lt;p&gt;The biggest new feature is contents table output for special folders. This provides&amp;nbsp; a quick way to get a ton of data that typically you&amp;rsquo;d have to fire up MFCMAPI for and navigate through myriad windows. I&amp;rsquo;ve also exposed a command line for converting between .MSG and .EML files. This was also doable with MFCMAPI, but now you can do it from the command line or in scripts.&lt;/p&gt;
&lt;p&gt;I wanted to take a minute and point out the hard work of &lt;a href="http://blogs.technet.com/b/rtopken/"&gt;Randy Topken&lt;/a&gt;, who published the &lt;a href="http://calcheck.codeplex.com/"&gt;CalCheck&lt;/a&gt; tool, which uses MrMAPI for some of its parsing. Hopefully this release of MrMAPI will allow him to add even more cool checks to his tool.&lt;/p&gt;
&lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MrMAPI: Contents Table output&lt;/li&gt;
&lt;li&gt;MrMAPI: MAPI&amp;lt;-&amp;gt;MIME conversion&lt;/li&gt;
&lt;li&gt;MrMAPI: MSG file property dumps&lt;/li&gt;
&lt;li&gt;MrMAPI: Force online (for bypassing cached mode)&lt;/li&gt;
&lt;li&gt;MrMAPI: Verbose switch turns on all debug output for troubleshooting.&lt;/li&gt;
&lt;li&gt;MrMAPI: Smaller binary achieved by cutting much of MFCMAPI&amp;rsquo;s code from the build.&lt;/li&gt;
&lt;li&gt;SmartView: Parse PR_RULE_ID
&lt;ul&gt;
&lt;!--EndFragment--&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MFCMAPI: Fixed the Resend Single Message feature, which had never worked quite right.&lt;/li&gt;
&lt;li&gt;Message property dumps again include embedded message information.&lt;/li&gt;
&lt;li&gt;Message property dumps (both in MFCMAPI and MrMAPI) should be significantly faster.&lt;/li&gt;
&lt;li&gt;Body property stream errors are better exposed.&lt;/li&gt;
&lt;li&gt;Several crashes were fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10147805" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>MAPI And Virtualization</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/03/03/mapi-and-virtualization.aspx</link><pubDate>Thu, 03 Mar 2011 13:31:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10136431</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10136431</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10136431</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/03/03/mapi-and-virtualization.aspx#comments</comments><description>&lt;p&gt;I &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2010/03/10/outlook-and-click-to-run.aspx"&gt;promised before&lt;/a&gt; that I would take an in depth look at Click-to-Run and MFCMAPI. I’ve done so and the results are mixed. I couldn’t find a way to launch MFCMAPI on its own into the virtual environment, but I did find a trick to load it along side Outlook.&lt;/p&gt;  &lt;p&gt;Click-to-Run, &lt;a href="http://office.microsoft.com/en-us/outlook-help/click-to-run-introduction-HA101850493.aspx"&gt;described here&lt;/a&gt; is a mechanism for delivering Office to client machines. It’s built on top of &lt;a href="http://www.microsoft.com/systemcenter/appv/default.mspx"&gt;App-V&lt;/a&gt; (formerly SoftGrid). Using Click-to-Run, you can stream Office to a client machine (so that you can run it while it’s still installing) and it also runs virtually, reducing the number of co-existence scenarios. Enterprises can use this to reduce installation, support, and upgrade costs. We even use it to deliver &lt;a href="http://office.microsoft.com/en-us/try/try-office-2010-FX101868838.aspx"&gt;trial versions of Office 2010&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The virtualization behind Click-to-Run is the source of the problem we have with MAPI. Since MAPI is installed by Outlook, and since Outlook is virtualized, applications running outside the Click-to-Run don’t have access to MAPI. We describe what does and doesn’t work here:    &lt;br /&gt;&lt;a title="http://support.microsoft.com/kb/981242" href="http://support.microsoft.com/kb/981242"&gt;http://support.microsoft.com/kb/981242&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;MFCMAPI falls in the “doesn’t work” category, but that doesn’t mean there aren’t tricks you can use. In the previous post, Kevin noted that he could use an Outlook 2010 Add-in to launch MFCMAPI inside the virtual environment. This will work, but I found another trick: use a little known feature of the File/Open dialog.&lt;/p&gt;  &lt;p&gt;Here’s the trick as I perform it:    &lt;br /&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Open Outlook Data File - File/Open/Open Outlook Data File &lt;/li&gt;    &lt;li&gt;Navigate to c:\windows\system32 &lt;/li&gt;    &lt;li&gt;Select &amp;quot;All Files&amp;quot; from the file type dropdown. &lt;/li&gt;    &lt;li&gt;Locate cmd.exe, right click, and select Open. &lt;/li&gt;    &lt;li&gt;The command prompt is now running in the virtual environment. Cancel Outlook Data File dialog. &lt;/li&gt;    &lt;li&gt;Run MFCMAPI from the command prompt. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The advantage of doing the trick this way is you don’t have to install anything special to make it work. Also, once you have the command prompt open, you can run any application you want from inside the virtual environment, not just MFCMAPI.&lt;/p&gt;  &lt;p&gt;Some caveats:    &lt;br /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;This trick obviously only works if Outlook is running. If you’re having trouble getting Outlook to log on and you wanted to use MFCMAPI to look at the profile, you may be out of luck. Of course, you could always try building a new profile using the Mail Control Panel and using that profile to get in to Outlook, and then do your troubleshooting. &lt;/li&gt;    &lt;li&gt;If you close Outlook, I think your command prompt and anything launched from it will also be closed. If you have multiple virtual Office application installed, you might try doing the trick from one of the other Office applications and leaving it open, allowing you to open and close Outlook. &lt;/li&gt;    &lt;li&gt;If you have a policy applied which doesn’t allow you to create PSTs, you can’t use that entry point into the File/Open dialog. You might try using Attach File from a mail message instead. &lt;/li&gt;    &lt;li&gt;The ideal fix here would be to add MFCMAPI (or whatever MAPI based application you need to run) to the virtual environment. This involves a lot of stuff about App-V that I just don’t understand. Until someone shows me it can be done, I’ve concluded it’s impossible. :) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If I haven’t been clear – this is a &lt;em&gt;trick&lt;/em&gt; to getting MFCMAPI to run in this environment. It’s not supported and not guaranteed to work. Use at your own risk.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10136431" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Gotchas/">Gotchas</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>January 2011 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2011/01/20/january-2011-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Thu, 20 Jan 2011 17:00:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10118229</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10118229</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10118229</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2011/01/20/january-2011-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;The January 2011 Release (build 6.0.0.1024) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This round of work had two foci: Speed startup time of MFCMAPI and MrMAPI, and add features to MrMAPI.&lt;/p&gt;  &lt;p&gt;I have been ignoring startup time of MFCMAPI for a while now, since it started up “fast enough”. But MrMAPI was designed to be run in batch scripts, and a slow startup time really adds up over multiple runs. They share the same code, so any work improving one improves the other. I found a number of opportunities to squeeze cycles out by sorting some arrays in the source and by improving the algorithms I use to shuffle them around when we’re starting. But the biggest improvement will happen if you happen to run MFCMAPI or MrMAPI from a directory with a lot of other files in it, such as a tools directory. We get a great speedup by remembering which files are and are not add-ins to MFCMAPI, so we don’t keep retrying them.&lt;/p&gt;  &lt;p&gt;Other than the speed-up work, MrMAPI got most of the love. I added a host of new features: Error lookup, guid lookup, ACL and Rule table exports, and &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2010/03/15/the-nickname-cache.aspx"&gt;nickname cache&lt;/a&gt; parsing are the big ones. I’ve also uploaded a 64 bit version of MrMAPI since some of the features actually log in to a profile, and we need to support 64 bit Outlook.&lt;/p&gt;  &lt;p&gt;When you download the new version of MFCMAPI, make sure to download MrMAPI for all of your property tag needs. &lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SmartView: Parse nickname cache.&lt;/li&gt;    &lt;li&gt;MrMAPI: Error lookup – mostly MAPI errors&lt;/li&gt;    &lt;li&gt;MrMAPI: GUID lookup – every GUID MFCMAPI knows can be searched&lt;/li&gt;    &lt;li&gt;MrMAPI: Smartview can now accept either hex or binary files with the –b switch&lt;/li&gt;    &lt;li&gt;MrMAPI: Help banner: tells what MrMAPI can do.&lt;/li&gt;    &lt;li&gt;Startup optimization&lt;/li&gt;    &lt;li&gt;Smartview: Parse PR_FORM_HOST_MAP&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10118229" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Outlook 2010 MAPI Reference</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/19/outlook-2010-mapi-reference.aspx</link><pubDate>Fri, 19 Nov 2010 19:20:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10093967</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10093967</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10093967</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/19/outlook-2010-mapi-reference.aspx#comments</comments><description>&lt;p&gt;A couple of days ago, we published an update to the Outlook 2010 MAPI reference. Rather than try to summarize everything we did, here’s the mini press release &lt;a href="http://msdn.microsoft.com/en-us/library/ee692172.aspx"&gt;Randy&lt;/a&gt; sent out to announce that we were done:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;p&gt;The updated 11/15/2010 release of the &lt;a href="http://msdn.microsoft.com/en-us/library/cc765775.aspx"&gt;Outlook 2010 MAPI Reference&lt;/a&gt; is now live on MSDN.             &lt;br /&gt;Additionally, I’m happy to announce that the &lt;a href="http://msdn.microsoft.com/en-us/library/ff960252.aspx"&gt;Outlook 2010 Auxiliary Reference&lt;/a&gt; is available on MSDN.             &lt;br /&gt;This publication completes our developer documentation for Outlook 2010.             &lt;br /&gt;Outlook 2010 developer documentation consists of the following reference titles:             &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc765775.aspx"&gt;Outlook 2010 MAPI Reference&lt;/a&gt;             &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff960252.aspx"&gt;Outlook 2010 Auxiliary Reference&lt;/a&gt;             &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff870432.aspx"&gt;Outlook 2010 Developer Reference&lt;/a&gt;             &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb652780.aspx"&gt;Outlook 2010 Primary Interop Assembly Reference&lt;/a&gt;             &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee829696.aspx"&gt;Outlook Social Connector 1.1 Provider Reference&lt;/a&gt; &lt;/p&gt;          &lt;h4&gt;New and Updated Contents for Outlook 2010 MAPI Reference&lt;/h4&gt;          &lt;ul&gt;           &lt;li&gt;&lt;b&gt;Support for 64-bit Microsoft Outlook&lt;/b&gt;—Reference topics for applicable API elements have been updated to correspond to new header files that support 64-bit Outlook. These header files are now available as a download at &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f8d01fc8-f7b5-4228-baa3-817488a66db1"&gt;Outlook 2010: MAPI Header Files&lt;/a&gt;. A new code sample is provided in &lt;a href="http://msdn.microsoft.com/en-us/library/dd941331.aspx"&gt;How to: Check the Version of Outlook&lt;/a&gt; to show how to check whether the installed version of Outlook is 64-bit Microsoft Outlook 2010. If your existing 32-bit MAPI application is going to be running on a 64-bit operating system with 64-bit Outlook installed, you will need to rebuild your 32-bit application as a 64-bit application. For more information about MAPI support for 64-bit Outlook, see &lt;a href="http://msdn.microsoft.com/en-us/library/dd941355.aspx"&gt;Building MAPI Applications on 32-Bit and 64-Bit Platforms&lt;/a&gt;. &lt;/li&gt;            &lt;li&gt;&lt;b&gt;Fast shutdown support for MAPI clients&lt;/b&gt;—MAPI clients can now initiate a quick shutdown and have the MAPI subsystem notify loaded providers to minimize data loss from the fast shutdown. Additional interfaces have been added for the client and provider to support fast shutdown. For more information about fast shutdown, see &lt;a href="http://msdn.microsoft.com/en-us/library/dd941312.aspx"&gt;Client Shutdown in MAPI&lt;/a&gt;. &lt;/li&gt;            &lt;li&gt;&lt;b&gt;Stream structure for field definitions for an Outlook item&lt;/b&gt;—Documentation for a binary stream for the &lt;a href="http://msdn.microsoft.com/en-us/library/ee415119.aspx"&gt;PidLidPropertyDefinitionStream&lt;/a&gt; property has been added. This property specifies definitions of all custom fields and data-binding settings for built-in fields of an Outlook item. &lt;/li&gt;            &lt;li&gt;&lt;b&gt;More properties&lt;/b&gt;—Documentation for an additional 38 tagged properties and named properties has been added to this release. &lt;/li&gt;            &lt;li&gt;&lt;b&gt;Option of linking explicitly to MAPI functions&lt;/b&gt;—MAPI developers can now choose to explicitly link to the MAPI stub of the default MAPI client (for example, Msmapi32.dll of Outlook) without going through the MAPI library and the Windows MAPI stub. For more information about explicit linking as compared with implicit linking, see &lt;a href="http://msdn.microsoft.com/en-us/library/cc963763.aspx"&gt;How to: Link to MAPI Functions&lt;/a&gt;. &lt;/li&gt;            &lt;li&gt;&lt;b&gt;Message Store Provider Example&lt;/b&gt;—The &lt;a href="http://msdn.microsoft.com/en-us/library/cc815814.aspx"&gt;Sample Wrapped PST Store Provider Example&lt;/a&gt; has been updated to support 64-bit architecture. &lt;/li&gt;            &lt;li&gt;&lt;b&gt;Nickname Cache&lt;/b&gt;—Documentation for the &lt;a href="http://msdn.microsoft.com/en-us/library/ff625288.aspx"&gt;Nickname Cache&lt;/a&gt; has been added. Microsoft Outlook 2010 interacts with the nickname cache file, also known as the “.nk2 file.” The .nk2 file is where Outlook 2010 persists the autocomplete list, which is the list of names that displays in the To, Cc, and Bcc edit boxes while a user is composing an e-mail. &lt;/li&gt;            &lt;li&gt;&lt;b&gt;Using Multiple Exchange Accounts&lt;/b&gt;—Documentation for the &lt;a href="http://msdn.microsoft.com/en-us/library/ff522797.aspx"&gt;MAPI Address Book API&lt;/a&gt; has been added. This API has been enhanced to support multiple Exchange accounts in Microsoft Outlook 2010. To resolve addresses correctly with multiple Exchange accounts, you use the new functions that take an account context so that calls to the address book search the correct Exchange account. &lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;My involvement in this project was as tech reviewer and author of &lt;a href="http://mfcmapi.codeplex.com/"&gt;MFCMAPI&lt;/a&gt;. I tried to shove as much of the new documentation into MFCMAPI as possible, including SmartView parsers for PidLidPropertyDefinitionStream and PidTagUserFields, both of which have been long standing &lt;a href="http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.messaging/2005-11/msg00125.html"&gt;requests&lt;/a&gt;. I also wrote or contributed to many of the code samples. The bulk of the work though was done by a small crew of folks on the Office Content Publishing team who know so much more about content than I could ever hope to know. They did an excellent job.&lt;/p&gt;  &lt;p&gt;As always, feedback is welcome.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10093967" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Documentation/">Documentation</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Call MrMAPI, That’s My Name, That Name Again Is MrMAPI!</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/17/call-mrmapi-that-s-my-name-that-name-again-is-mrmapi.aspx</link><pubDate>Wed, 17 Nov 2010 16:40:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10092652</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10092652</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10092652</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/17/call-mrmapi-that-s-my-name-that-name-again-is-mrmapi.aspx#comments</comments><description>&lt;p&gt;I said &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/16/november-2010-release-of-mfcmapi-and-mrmapi.aspx"&gt;yesterday&lt;/a&gt; that &lt;a href="http://mfcmapi.codeplex.com/"&gt;MrMAPI&lt;/a&gt; deserved a full post, so here it is.&lt;/p&gt;  &lt;p&gt;MAPI has a lot of property tags. You’ll find &lt;a href="http://msdn.microsoft.com/en-us/library/cc815517.aspx"&gt;lists&lt;/a&gt; of them in the MSDN, and a number of them are documented in various and sundry KB articles. The problem with this documentation is that it’s of very little use when you’re debugging a &lt;a href="http://msdn.microsoft.com/en-us/library/cc765749.aspx"&gt;GetProps&lt;/a&gt; call, trying to figure out what the property 0x0E6D001E is, or when you’re trying to remember an interesting property you read about, but all you know for sure is that the name of the property had the word “street” in it. For years, we had internal Microsoft only tools that were of some help in this – they were built from the Exchange or Outlook source and included in them a large number of properties that you could look up. With these tools, you could look up a property by tag number and learn its name. They also provided limited support for searching in the other direction, looking up a property by name and learning its tag.&lt;/p&gt;  &lt;p&gt;The problems I had with these internal tools were twofold:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;They didn’t know every property. &lt;/li&gt;    &lt;li&gt;They were internal only. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I tackled the first problem in two phases. Over the years I had been hand tuning arrays in MFCMAPI that consisted of every property we’ve ever documented in the MSDN, in KBs or in blogs. Using these as a baseline, I wrote Perl scripts to search the Exchange and Outlook source trees for anything that looked like a property and built augmented arrays of every property ever in existence. With these in hand, I built a tool I dubbed &lt;a href="http://en.wikipedia.org/wiki/Mr._Plow"&gt;MrTag&lt;/a&gt;. This tool has been very successful here in support, as well as over in the product team where they use it to check on availability of unused property tags. We still had the problem that the tool was internal only, since it contained internal information.&lt;/p&gt;  &lt;p&gt;Now – I originally planned to take the arrays from MFCMAPI and build an external version of MrTag, but that would have been yet another project for me to support and manage. Then inspiration struck – I could code up a command line for MFCMAPI and just let MFCMAPI do the work! Unfortunately, it’s not possible to add a command line interface to a Windows application that works as I expect a command line tool to work. That is, if I pass command line parameters, I want the output to display back in the command window. Maybe I’ll write up the reasons for that later. I finally settled on adding a new project configuration to the MFCMAPI project that builds strictly as a command line tool with no Windows UI. I then just had to port the property lookup logic from MrTag, and MrMAPI was born! Now the world has access to a first class property lookup tool, and I have less code to maintain. Everybody wins! Since this tool is just a variant build of MFCMAPI, as I add and tweak the property lists, it will stay up to date.&lt;/p&gt;  &lt;p&gt;Enough history – here’s how to use MrMAPI. I’ve excerpted part of the command line help:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;MrMAPI [-S] [-D] [-N] [-T &amp;lt;type&amp;gt;] &amp;lt;number&amp;gt;|&amp;lt;name&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Property Tag Lookup:
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-S   Perform substring search.
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        With no parameters prints all known properties.
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-D   Search dispids.
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-N   Number is in decimal. Ignored for non-numbers.
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-T   Print information on specified type.
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        With no parameters prints list of known types.
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        When combined with -S, restrict output to given type.&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Without any switches, MrMAPI just looks up the property number or name, so you can look up 0x0037 or PR_SUBJECT and get results. You use the –S switch to perform a substring search. This is how you’d find that property that had street in it’s name. With no string, it will give you a list of every property that MrMAPI knows – nearly 4 thousand of them. If for some reason the property number you’ve run across is in decimal, you can use the –N switch to indicate this. The –D switch allows you to look up named properties – something our other internal tools never supported. The term dispid comes from the fact that most of the named properties begin with dispid, such as&amp;#160; dispidReminderNextTime. In recent years, we’ve started giving these properties names beginning with PidLid, much as we’ve started giving property tags names starting with PidTag. MrMAPI is comfortable with both naming conventions, and if you look up a property using one name it will always tell you the other.&lt;/p&gt;

&lt;p&gt;The –T switch is interesting. On its own, it can be used to print a list of MAPI property types. Combined with a search, we can restrict our output by type. So, for instance, if we wanted to find a PT_LONG property with “address” in it, we could use the switched “-s address –t PT_LONG”.&lt;/p&gt;

&lt;p&gt;If you’ve played with MrMAPI a bit, you’ve probably noticed I’ve only covered half of what it can do. The other thing it does right now is SmartView parsing from the command line. For day to day use, if you’ve got a hex string you want to parse with SmartView, MFCMAPI’s Hex Editor (Ctrl+H) is probably more convenient. The command line SmartView parser is prep work for some automated analysis tools we’re working on. It also allowed me to write some test cases for the SmartView parsers, since I’m finding that the parsers are easy to break if I’m not careful. I plan to do a lot of work in this area and will talk about it more later when it becomes more interesting.&lt;/p&gt;

&lt;p&gt;Hopefully you will all find MrMAPI to be useful. I’m very interested in getting feedback. If you find a flaw in the way it works, or find that we’ve documented a property that it doesn’t know about, please let me know so I can fix it. You’ll always find the latest version of MrMAPI on the download page for the latest release of &lt;a href="http://mfcmapi.codeplex.com/"&gt;MFCMAPI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10092652" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Documentation/">Documentation</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Protocol+Docs/">Protocol Docs</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>November 2010 Release of MFCMAPI and MrMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/16/november-2010-release-of-mfcmapi-and-mrmapi.aspx</link><pubDate>Tue, 16 Nov 2010 18:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10092089</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10092089</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10092089</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/16/november-2010-release-of-mfcmapi-and-mrmapi.aspx#comments</comments><description>&lt;p&gt;The November 2010 Release (build 6.0.0.1023) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;. I’m also excited to announce the release of &lt;strong&gt;MrMAPI&lt;/strong&gt; at the same location. &lt;/p&gt;  &lt;p&gt;MFCMAPI work this round consisted of one new SmartView parser and a smattering of small features and bug fixes. The really exciting work was rebuilding MFCMAPI into a command line tool I’d dubbed MrMAPI. MrMAPI exposes two of MFCMAPI’s best features from the command line: Property tag lookup and SmartView parsing. It really deserves a blog entry of it’s own but for now, here’s a taste of what it can do:&lt;/p&gt;    &lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;C:\&amp;gt;mrmapi 0x3001001E
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Property tag 0x3001001E:
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Exact matches:
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3001001E,PR_DISPLAY_NAME,PT_STRING8
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3001001E,PR_DISPLAY_NAME_A,PT_STRING8
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3001001E,ptagDisplayName,PT_STRING8
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Partial matches:
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3001001F,PR_DISPLAY_NAME_W,PT_UNICODE
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3001001F,PidTagDisplayName,PT_UNICODE
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;C:\&amp;gt;mrmapi -s last_mod
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Searching for &amp;quot;last_mod&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x0E590102,PR_LAST_MODIFIER_SID,PT_BINARY
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x0E6D001E,PR_LAST_MODIFIER_SID_AS_XML,PT_STRING8
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x30080040,PR_LAST_MODIFICATION_TIME,PT_SYSTIME
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3FFA001E,PR_LAST_MODIFIER_NAME,PT_STRING8
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3FFA001E,PR_LAST_MODIFIER_NAME_A,PT_STRING8
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3FFA001F,PR_LAST_MODIFIER_NAME_W,PT_UNICODE
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x3FFB0102,PR_LAST_MODIFIER_ENTRYID,PT_BINARY
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;0x80B40040,PR_EMS_AB_GWART_LAST_MODIFIED,PT_SYSTIME
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Found 8 matches.&lt;/pre&gt;&lt;/pre&gt;
When you download the new version of MFCMAPI, make sure to download MrMAPI for all of your property tag needs.



&lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SmartView: Parse PR_LAST_MODIFIER_SID &lt;/li&gt;

  &lt;li&gt;Profile: Added the ability to set the default profile &lt;/li&gt;

  &lt;li&gt;Export: Export to text now sorts the properties by tag first &lt;/li&gt;

  &lt;li&gt;Recipients: Reworked the Recipient table editor to make updating recipients much easier &lt;/li&gt;

  &lt;li&gt;MrMAPI: New tool, MrMAPI.exe, enables property tag lookup on the command line &lt;/li&gt;

  &lt;li&gt;MrMAPI: New tool, MrMAPI.exe, enables SmartView parsing from the command line &lt;/li&gt;

  &lt;li&gt;Bugs: Found and fixed a number of crashes &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10092089" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Can’t Open A Stream Twice</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/10/08/can-t-open-a-stream-twice.aspx</link><pubDate>Fri, 08 Oct 2010 22:13:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10073497</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10073497</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10073497</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/10/08/can-t-open-a-stream-twice.aspx#comments</comments><description>&lt;p&gt;A customer asked me to document this, as they had run in to it while developing a COM Add-in for Outlook. They were trying to do some work with attachments, and this led them to listen to the Outlook Object Model’s &lt;a href="http://msdn.microsoft.com/en-us/library/ff869219.aspx"&gt;BeforeAttachmentAdd&lt;/a&gt; event. Inside this event, they used MAPIOBJECT to get the attachment, and called &lt;a href="http://msdn.microsoft.com/en-us/library/cc839910.aspx"&gt;OpenProperty&lt;/a&gt; to open a stream on the &lt;a href="http://msdn.microsoft.com/en-us/library/cc842329.aspx"&gt;PR_ATTACH_DATA_OBJ&lt;/a&gt; property. This worked fine in cached mode, or against a PST, but when they ran their code in online mode, OpenProperty failed with MAPI_E_CALL_FAILED.&lt;/p&gt;  &lt;p&gt;Digging in to the problem, we found that before firing the event, Outlook had itself already opened a stream on this property. Perhaps this was the reason for the failure? I did a quick test with &lt;a href="http://mfcmapi.codeplex.com/"&gt;MFCMAPI&lt;/a&gt;, modifying the &lt;a href="http://mfcmapi.codeplex.com/SourceControl/changeset/view/67065#91654"&gt;CAttachmentsDlg::OpenItemProp&lt;/a&gt; function to call OpenProperty twice in a row. Sure enough, I saw the same thing they saw. Against a PST/OST, the second call succeeded, but against Exchange online mode it failed. Exchange won’t let you open two streams on this property at the same time. Not even if the second stream is read only.&lt;/p&gt;  &lt;p&gt;Ultimately, this isn’t much of a surprise. These are two different store providers. One operates against a local database file, while the other operates across a network. The PST provider is in a better position to negotiate two different stream interfaces operating against the same backend data than the Exchange provider would be. So we can chalk this up as another implementation difference between the two providers.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10073497" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Gotchas/">Gotchas</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/OOM/">OOM</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/PST_2F00_OST/">PST/OST</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>September 2010 Release of MFCMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/09/27/september-2010-release-of-mfcmapi.aspx</link><pubDate>Mon, 27 Sep 2010 17:40:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10068303</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10068303</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10068303</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/09/27/september-2010-release-of-mfcmapi.aspx#comments</comments><description>&lt;p&gt;The September 2010 Release (build 6.0.0.1022) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;My work the past two months on MFCMAPI was all over the map, no real focus. I fixed a few bugs, added some Smart View parsing, and made opening random profile sections a bit easier.&lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://MFCMAPI.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SmartView: Parsing for PR_USERFIELDS (MSDN documentation is on the way!) &lt;/li&gt;    &lt;li&gt;Profile Sections: The old Open Profile Section dialog has been replaced with a new one with a drop down for selecting known profile sections. Also, the parser which converts what you typed to a GUID is much improved – braces and dashes are now optional. Finally, since what a GUID looks like in memory or in the registry differs from the “canonical” form, there’s now a handy-dandy checkbox to indicate when you need your string byte swapped.&lt;/li&gt;    &lt;li&gt;IMsgServiceAdmin2: Hate the way MFCMAPI has to mark profile sections before calling CreateMsgService? By using IMsgServiceAdmin2, this problem is avoided. (MSDN documentation for this interface is also on the way!) &lt;/li&gt;    &lt;li&gt;Bug: Importing from MSG files allows multiple files again, and will stop importing everything to the Associated Contents table. &lt;/li&gt;    &lt;li&gt;Bug: You can now create empty string properties – not sure how long ago I broke this. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10068303" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Let’s Try To Hash This Out</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/08/18/let-s-try-to-hash-this-out.aspx</link><pubDate>Wed, 18 Aug 2010 17:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10051587</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10051587</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10051587</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/08/18/let-s-try-to-hash-this-out.aspx#comments</comments><description>&lt;p&gt;[This is now documented here: &lt;a href="http://msdn.microsoft.com/en-us/library/ff960307.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff960307.aspx&lt;/a&gt; ]&lt;/p&gt;
&lt;p&gt;A few years ago, I blogged an algorithm to &lt;a href="http://blogs.msdn.com/b/stephen_griffin/archive/2007/03/02/outlook-2007-rtm-docs-notification-based-indexing-support.aspx"&gt;calculate the hash&lt;/a&gt; used by &lt;a href="http://msdn.microsoft.com/en-us/library/ff628790(VS.85).aspx"&gt;Windows Search&lt;/a&gt; in MAPI urls. This algorithm is now &lt;a href="http://msdn.microsoft.com/en-us/library/bb821099(office.12).aspx"&gt;enshrined&lt;/a&gt; in the MSDN. I&amp;rsquo;ve been asked by development to blog some augmentations to this algorithm to bring it more in line with what we actually send to Search.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The binary blob to be encoded will be the PR_ENTRYID of the store in most cases, but for cached Exchange stores (both public and private), the binary blob should be PR_MAPPING_SIGNATURE, found in the profile. &lt;/li&gt;
&lt;li&gt;After computing the hash for a public folder store&amp;rsquo;s binary blob, but before hashing in the OST path, we hash in the constant 0x2E505542 to make sure the hash is uniquely different from the private store&amp;rsquo;s hash. This constant represents the string &amp;ldquo;.PUB&amp;rdquo;. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Below you&amp;rsquo;ll find updated code which incorporates these new bits, along with some support code which will pull the relevant bits from the profile which can be used to tell if a store is public or private, if it&amp;rsquo;s cached, and the path to the OST. If you were to incorporate this code into your own project, the function you&amp;rsquo;d call is ComputeStoreHash, which takes as its input the session pointer as well as PR_ENTRYID, PR_SERVICE_UID, and PR_MDB_PROVIDER from the message store table. The rest of the information it needs it gets from the profile. For output, this function returns the hash as computed from PR_MAPPING_SIGNATURE, if the store is a cached Exchange store, and the hash as computed from PR_ENTRYID.&lt;/p&gt;
&lt;p&gt;BTW &amp;ndash; the HrEmsmdbUIDFromStore support function here is interesting. It&amp;rsquo;s a &lt;a href="http://msdn.microsoft.com/en-us/library/ff522797.aspx"&gt;multi-ex&lt;/a&gt; aware replacement for using pbGlobalProfileSectionGuid to open the profile section for an Exchange mailbox. If you want, you could augment this function by having it look for PR_EMSMDB_LEGACY and reporting if the mailbox being checked is considered the Legacy mailbox which would match what you get with pbGlobalProfileSectionGuid.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve tested this code against my own stores and the hashes I get match with what I see in Windows Search. Look forward to a version of this code showing up in the next version of MFCMAPI in September. Enjoy!&lt;/p&gt;
&lt;pre style="background-color: #fbfbfb; min-height: 40px; width: 650px; overflow: auto; border: #cecece 1px solid; padding: 5px;"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;#define PR_PROFILE_OFFLINE_STORE_PATH_A PROP_TAG(PT_STRING8, 0x6610)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;#define PR_PROFILE_OFFLINE_STORE_PATH_W PROP_TAG(PT_UNICODE, 0x6610)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;#define CONFIG_OST_CACHE_PRIVATE  ((ULONG)0x00000180)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;#define CONFIG_OST_CACHE_PUBLIC   ((ULONG)0x00000400)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;HRESULT HrEmsmdbUIDFromStore(IMAPISession* pmsess,
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;                             MAPIUID* puidService,
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;                             MAPIUID* pEmsmdbUID)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;{
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!puidService) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; MAPI_E_INVALID_PARAMETER;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  HRESULT hRes = S_OK;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  SRestriction mres = {0};
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  SPropValue mval = {0};
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  SRowSet* pRows = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  SRow* pRow = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPSERVICEADMIN spSvcAdmin = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPMAPITABLE spmtab = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; { eEntryID = 0, eSectionUid, eMax };
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; SizedSPropTagArray(eMax, tagaCols) =
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    eMax,
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      PR_ENTRYID,
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      PR_EMSMDB_SECTION_UID,
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  };
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  hRes = pmsess-&amp;gt;AdminServices(0, (LPSERVICEADMIN*)&amp;amp;spSvcAdmin);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hRes) &amp;amp;&amp;amp; spSvcAdmin)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    hRes = spSvcAdmin-&amp;gt;GetMsgServiceTable(0, &amp;amp;spmtab);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (spmtab)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      hRes = spmtab-&amp;gt;SetColumns((LPSPropTagArray)&amp;amp;tagaCols, TBL_BATCH);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      mres.rt = RES_PROPERTY;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      mres.res.resProperty.relop = RELOP_EQ;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      mres.res.resProperty.ulPropTag = PR_SERVICE_UID;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      mres.res.resProperty.lpProp = &amp;amp;mval;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      mval.ulPropTag = PR_SERVICE_UID;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      mval.Value.bin.cb = &lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;(*puidService);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      mval.Value.bin.lpb = (LPBYTE)puidService;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      (&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;) spmtab-&amp;gt;Restrict(&amp;amp;mres, 0);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      (&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;) spmtab-&amp;gt;QueryRows(10, 0, &amp;amp;pRows);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hRes) &amp;amp;&amp;amp; pRows &amp;amp;&amp;amp; pRows-&amp;gt;cRows)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        pRow = &amp;amp;pRows-&amp;gt;aRow[0];
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pEmsmdbUID &amp;amp;&amp;amp; pRow)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;          &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PR_EMSMDB_SECTION_UID == pRow-&amp;gt;lpProps[eSectionUid].ulPropTag &amp;amp;&amp;amp;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;            pRow-&amp;gt;lpProps[eSectionUid].Value.bin.cb == &lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;(*pEmsmdbUID))
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;          {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;            memcpy(pEmsmdbUID, pRow-&amp;gt;lpProps[eSectionUid].Value.bin.lpb, &lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;(*pEmsmdbUID));
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;          }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      FreeProws(pRows);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (spmtab) spmtab-&amp;gt;Release();
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (spSvcAdmin) spSvcAdmin-&amp;gt;Release();
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; hRes;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;} &lt;span style="color: #008000"&gt;// HrEmsmdbUIDFromStore&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; FExchangePrivateStore(LPMAPIUID lpmapiuid)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;{
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!lpmapiuid) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; IsEqualMAPIUID(lpmapiuid, (LPMAPIUID)pbExchangeProviderPrimaryUserGuid);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;} &lt;span style="color: #008000"&gt;// FExchangePrivateStore&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; FExchangePublicStore(LPMAPIUID lpmapiuid)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;{
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!lpmapiuid) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; IsEqualMAPIUID(lpmapiuid, (LPMAPIUID)pbExchangeProviderPublicGuid);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;} &lt;span style="color: #008000"&gt;// FExchangePublicStore&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;DWORD ComputeHash(ULONG cbStoreEID, LPBYTE pbStoreEID, LPCSTR pszFileName, LPCWSTR pwzFileName, BOOL bPublicStore)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;{
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  DWORD  dwHash = 0;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  ULONG  cdw    = 0;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  DWORD* pdw    = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  ULONG  cb     = 0;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  BYTE*  pb     = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  ULONG  i      = 0;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!cbStoreEID || !pbStoreEID) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; dwHash;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// We shouldn't see both of these at the same time.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pszFileName &amp;amp;&amp;amp; pwzFileName) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; dwHash;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// Get the Store Entry ID&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// pbStoreEID is a pointer to the Entry ID&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// cbStoreEID is the size in bytes of the Entry ID&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  pdw = (DWORD*)pbStoreEID;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  cdw = cbStoreEID / &lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;(DWORD);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (i = 0; i &amp;lt; cdw; i++)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    dwHash = (dwHash &amp;lt;&amp;lt; 5) + dwHash + *pdw++;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  pb = (BYTE *)pdw;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  cb = cbStoreEID % &lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;(DWORD);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (i = 0; i &amp;lt; cb; i++)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    dwHash = (dwHash &amp;lt;&amp;lt; 5) + dwHash + *pb++;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (bPublicStore)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #008000"&gt;// augment to make sure it is unique else could be same as the private store&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    dwHash = (dwHash &amp;lt;&amp;lt; 5) + dwHash + 0x2E505542; &lt;span style="color: #008000"&gt;// this is '.PUB'&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// You may want to also include the store file name in the hash calculation&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// pszFileName and pwzFileName are NULL terminated strings with the path and filename of the store&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pwzFileName)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (*pwzFileName)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      dwHash = (dwHash &amp;lt;&amp;lt; 5) + dwHash + *pwzFileName++;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pszFileName)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (*pszFileName)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      dwHash = (dwHash &amp;lt;&amp;lt; 5) + dwHash + *pszFileName++;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// dwHash now contains the hash to be used. It should be written in hex when building a URL.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; dwHash;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;} &lt;span style="color: #008000"&gt;// ComputeHash&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ComputeStoreHash(LPMAPISESSION lpMAPISession, LPSBinary lpEntryID, LPSBinary lpServiceUID, LPSBinary lpProviderUID, DWORD* lpdwSigHash, DWORD* lpdwEIDHash)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;{
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  HRESULT hRes = S_OK;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  MAPIUID emsmdbUID = {0};
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPPROFSECT lpProfSect = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  BOOL fPublicExchangeStore  = FExchangePublicStore((LPMAPIUID)lpProviderUID-&amp;gt;lpb);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  BOOL fPrivateExchangeStore = FExchangePrivateStore((LPMAPIUID)lpProviderUID-&amp;gt;lpb);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  BOOL fCached = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPSPropValue lpConfigProp = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPSPropValue lpPathPropA = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPSPropValue lpPathPropW = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPSPropValue lpMappingSig = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPSTR szPath = NULL; &lt;span style="color: #008000"&gt;// do not free&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  LPWSTR wzPath = NULL; &lt;span style="color: #008000"&gt;// do not free&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #008000"&gt;// Get profile section&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpServiceUID)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    hRes = HrEmsmdbUIDFromStore(lpMAPISession,
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      (LPMAPIUID) lpServiceUID-&amp;gt;lpb,
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &amp;amp;emsmdbUID);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hRes))
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      hRes = lpMAPISession-&amp;gt;OpenProfileSection(&amp;amp;emsmdbUID, NULL, 0, &amp;amp;lpProfSect);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!lpServiceUID || FAILED(hRes))
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #008000"&gt;// For Outlook 2003/2007, HrEmsmdbUIDFromStore may not succeed,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #008000"&gt;// so use pbGlobalProfileSectionGuid instead&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    hRes = lpMAPISession-&amp;gt;OpenProfileSection((LPMAPIUID)pbGlobalProfileSectionGuid, NULL, 0, &amp;amp;lpProfSect);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpProfSect)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    hRes = HrGetOneProp(lpProfSect, PR_PROFILE_CONFIG_FLAGS, &amp;amp;lpConfigProp);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hRes) &amp;amp;&amp;amp; PROP_TYPE(lpConfigProp-&amp;gt;ulPropTag) != PT_ERROR)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (fPrivateExchangeStore)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        fCached = ((lpConfigProp-&amp;gt;Value.l &amp;amp; CONFIG_OST_CACHE_PRIVATE) != 0);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (fPublicExchangeStore)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        fCached = ((lpConfigProp-&amp;gt;Value.l &amp;amp; CONFIG_OST_CACHE_PUBLIC) == CONFIG_OST_CACHE_PUBLIC);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (fCached)
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      hRes = HrGetOneProp(lpProfSect, PR_PROFILE_OFFLINE_STORE_PATH_W, &amp;amp;lpPathPropW);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (FAILED(hRes))
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        hRes = HrGetOneProp(lpProfSect, PR_PROFILE_OFFLINE_STORE_PATH_A, &amp;amp;lpPathPropA);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hRes))
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpPathPropW &amp;amp;&amp;amp; lpPathPropW-&amp;gt;Value.lpszW)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;          wzPath = lpPathPropW-&amp;gt;Value.lpszW;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpPathPropA &amp;amp;&amp;amp; lpPathPropA-&amp;gt;Value.lpszA)
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;          szPath = lpPathPropA-&amp;gt;Value.lpszA;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &lt;span style="color: #008000"&gt;// If this is an Exchange store with an OST path, it's an OST, so we get the mapping signature&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ((fPrivateExchangeStore || fPublicExchangeStore) &amp;amp;&amp;amp; (wzPath || szPath))
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      {
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;        hRes = HrGetOneProp(lpProfSect, PR_MAPPING_SIGNATURE, &amp;amp;lpMappingSig);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;      }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  DWORD dwSigHash = NULL;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpMappingSig &amp;amp;&amp;amp; PT_BINARY == PROP_TYPE(lpMappingSig-&amp;gt;ulPropTag))
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  {
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;    dwSigHash = ComputeHash(lpMappingSig-&amp;gt;Value.bin.cb, lpMappingSig-&amp;gt;Value.bin.lpb, NULL, NULL, fPublicExchangeStore);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  }
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  DWORD dwEIDHash = ComputeHash(lpEntryID-&amp;gt;cb, lpEntryID-&amp;gt;lpb, szPath, wzPath, fPublicExchangeStore);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpdwSigHash) *lpdwSigHash = dwSigHash;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpdwEIDHash) *lpdwEIDHash = dwEIDHash;
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  MAPIFreeBuffer(lpMappingSig);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  MAPIFreeBuffer(lpPathPropA);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  MAPIFreeBuffer(lpPathPropW);
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  MAPIFreeBuffer(lpConfigProp);
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (lpProfSect) lpProfSect-&amp;gt;Release();
&lt;/pre&gt;
&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;} &lt;span style="color: #008000"&gt;// ComputeStoreHash&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px;"&gt;&lt;/pre&gt;
&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10051587" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Outlook/">Outlook</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Code+Snippet/">Code Snippet</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Documentation/">Documentation</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MSDN/">MSDN</category></item><item><title>July 2010 Release of MFCMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/07/26/july-2010-release-of-mfcmapi.aspx</link><pubDate>Mon, 26 Jul 2010 14:14:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10042542</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10042542</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10042542</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/07/26/july-2010-release-of-mfcmapi.aspx#comments</comments><description>&lt;p&gt;The &lt;strike&gt;July 2010 Release (build 6.0.0.1020)&lt;/strike&gt; July 2010 &lt;strong&gt;Second&lt;/strong&gt; Release (build 6.0.0.1021) is live: &lt;a href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The scope of this release was primarily under the covers engineering, most notably to add &lt;a href="http://msdn.microsoft.com/en-us/library/ms235402.aspx"&gt;SAL annotations&lt;/a&gt;. While adding these notations took seemingly forever, in the process I did run across a few potential crashing bugs, so the effort was worth it. It should pay off even more going forward.&lt;/p&gt;  &lt;p&gt;Here's a change list - see the &lt;a href="http://www.codeplex.com/MFCMAPI/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on Codeplex for more details, or look at the code:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SAL: Added SAL notation to all functions and fixed every bug exposed in doing so. &lt;/li&gt;    &lt;li&gt;Restriction and Property Editors: both had problems with editing new data. These problems have been fixed. The restriction editor should be much better behaved now, and the property editor will handle “Edit Given Prop” on a new prop much better. &lt;/li&gt;    &lt;li&gt;Import MSG: Can now import a .MSG file to an associated contents table. Useful for transferring views, rules, etc from one mailbox to another for testing purposes. &lt;/li&gt;    &lt;li&gt;Windows 2000: I accidently killed Windows 2000 support a few versions back by calling a kernel32 function that isn’t implemented in Windows 2000. This call has been switched from static linking to dynamic, so MFCMAPI should again run on Windows 2000. &lt;/li&gt;    &lt;li&gt;VC 6 support: Has now been completely cut. Sorry. The SAL header (sal.h) just doesn’t work in VC 6.0 and I didn’t feel it was worth the effort to wrap the SAL notation in #defines which I could turn off for the sake of VC 6. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;[Added for 6.0.0.21]&lt;/strong&gt;: Fixed stupid stupid bug where a dialog pops if you open the system menu, as will often happen if you right click the icon to close the app.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;  &lt;p&gt;[Edit, 7/27/2010: Added details about 6.0.0.1021]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10042542" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>Content Indexing and Search Folders</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/06/22/content-indexing-and-search-folders.aspx</link><pubDate>Tue, 22 Jun 2010 14:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10028497</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10028497</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10028497</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/06/22/content-indexing-and-search-folders.aspx#comments</comments><description>&lt;p&gt;[This is now documented here: &lt;a href="http://msdn.microsoft.com/en-us/library/cc842312.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc842312.aspx&lt;/a&gt; ]&lt;/p&gt;
&lt;p&gt;I recently had a customer who noticed that their MAPI search folders weren&amp;rsquo;t updating properly when they moved to Exchange 2010. Their wasn&amp;rsquo;t anything complicated about the search criteria &amp;ndash; they called &lt;a href="http://msdn.microsoft.com/en-us/library/cc842312(office.12).aspx"&gt;SetSearchCriteria&lt;/a&gt; passing a &lt;a href="http://msdn.microsoft.com/en-us/library/cc842044.aspx"&gt;RES_CONTENT&lt;/a&gt; type restriction looking for &lt;a href="http://msdn.microsoft.com/en-us/library/bb446033.aspx"&gt;PR_MESSAGE_CLASS&lt;/a&gt; matching their item type. The search folder which was initially built was correct &amp;ndash; it had all the items in it which it was supposed to have and nothing else. But as items were created and deleted, the search folder didn&amp;rsquo;t keep up. Additionally, they noted that the same criteria worked on Exchange 2007, and that on some Exchange 2010 servers, they didn&amp;rsquo;t see the problem at all.&lt;/p&gt;
&lt;p&gt;To troubleshoot this issue, the first thing we did was use &lt;a href="http://mfcmapi.codeplex.com"&gt;MFCMAPI&lt;/a&gt; to look at the search folder they created. If you right click on a folder with MFCMAPI, you can select Edit Search Criteria, which will cause MFCMAPI to call GetSearchCriteria and display the results. Comparing the working search folders to the non-working search folders exposed the problem &amp;ndash; all of the non-working folders had the &lt;a href="http://msdn.microsoft.com/en-us/library/ee219969(EXCHG.80).aspx"&gt;SEARCH_STATIC&lt;/a&gt; flag set on them. So as far as Exchange was concerned, all of these folders were working correctly. The static folders didn&amp;rsquo;t update, while the non-static, or dynamic folder, updated dynamically.&lt;/p&gt;
&lt;p&gt;But why were these folders static? This was caused by Content Indexing. On the Exchange 2010 servers where the folders were working, Content Indexing wasn&amp;rsquo;t. In fact, I went to a non-working server and manually disabled Content Indexing. When I rebuilt the search folder SEARCH_STATIC wasn&amp;rsquo;t set. It turns out, on Exchange 2010, search folders backed by Content Indexing are always static. A little digging uncovered that on Exchange 2007, even though we had intended Content Indexing backed search folders to be static, we had accidently made them dynamic. So that&amp;rsquo;s why the folders were working on 2007.&lt;/p&gt;
&lt;p&gt;Once we realize Content Indexing is the problem, the fix is simple &amp;ndash; when building the search folder, ask that Content Indexing not be used. There&amp;rsquo;s a flag for this, &lt;a href="http://help.outlook.com/en-us/140/cc842312(v=office.12).aspx"&gt;NON_CONTENT_INDEXED_SEARCH&lt;/a&gt; (0x20000). Once we passed this flag, Exchange didn&amp;rsquo;t use Content Indexing to build the search folder, SEARCH_STATIC wasn&amp;rsquo;t set, and the search folder started updating dynamically.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10028497" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Exchange/">Exchange</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Documentation/">Documentation</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/Protocol+Docs/">Protocol Docs</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item><item><title>May 2010 Release of MFCMAPI</title><link>http://blogs.msdn.com/b/stephen_griffin/archive/2010/05/13/may-2010-release-of-mfcmapi.aspx</link><pubDate>Thu, 13 May 2010 14:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10012547</guid><dc:creator>Stephen Griffin - MSFT</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/rsscomments.aspx?WeblogPostID=10012547</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/stephen_griffin/commentapi.aspx?WeblogPostID=10012547</wfw:comment><comments>http://blogs.msdn.com/b/stephen_griffin/archive/2010/05/13/may-2010-release-of-mfcmapi.aspx#comments</comments><description>&lt;P&gt;The May 2010 Release (build 6.0.0.1019) is live: &lt;A href="http://mfcmapi.codeplex.com/" mce_href="http://mfcmapi.codeplex.com"&gt;http://mfcmapi.codeplex.com&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Mostly bug fixes and the ever expanding scope of Smart View. I’ve added parsing for PT_LONG as a date, enabling parsing of a number of props I couldn’t parse before. I also added parsers for Web View Persist Objects (&lt;A href="http://blogs.msdn.com/pcreehan/archive/2007/12/19/folder-homepage-no-longer-works-in-outlook-2007-from-mapi-store-providers.aspx" mce_href="http://blogs.msdn.com/pcreehan/archive/2007/12/19/folder-homepage-no-longer-works-in-outlook-2007-from-mapi-store-providers.aspx"&gt;PR_FOLDER_WEBVIEWINFO&lt;/A&gt;) and Recipient Row Streams (&lt;A href="http://msdn.microsoft.com/en-us/library/cc842350.aspx" mce_href="http://msdn.microsoft.com/en-us/library/cc842350.aspx"&gt;dispidApptUnsendableRecips&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;Here's a change list - see the &lt;A href="http://www.codeplex.com/MFCMAPI/WorkItem/List.aspx" mce_href="http://www.codeplex.com/MFCMAPI/WorkItem/List.aspx"&gt;Issue Tracker&lt;/A&gt; on Codeplex for more details, or look at the code:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Smart View: Parser framework for PT_LONG. First parser adds rtime parsing.&lt;/LI&gt;
&lt;LI&gt;Smart View: Added flag parsing for a bunch of new props.&lt;/LI&gt;
&lt;LI&gt;Smart View: Many fuzzing fixes implemented.&lt;/LI&gt;
&lt;LI&gt;Debug Viewer: Removed dismiss on Enter. Changed Pause from a button to a checkbox.&lt;/LI&gt;
&lt;LI&gt;RTF: RTF streams with embedded binary containing 0A or 0D get messed up when viewing. Fixed viewer to honor hex stream first.&lt;/LI&gt;
&lt;LI&gt;VC 2010: Fixed project so it will build in 2010.&lt;/LI&gt;
&lt;LI&gt;Hex Editor: Fixed hex editor parsing to ignore more punctuation to make it easier to paste hex from other sources.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Enjoy.&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN: right; PADDING-BOTTOM: 4px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 4px" class=wlWriterHeaderFooter&gt;
&lt;SCRIPT type=text/javascript&gt;digg_url = "http://blogs.msdn.com/stephen_griffin/archive/2010/05/13/may-2010-release-of-mfcmapi.aspx";digg_title = "May 2010 Release of MFCMAPI";digg_bgcolor = "#FFFFFF";digg_skin = "compact";&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://digg.com/tools/diggthis.js" mce_src="http://digg.com/tools/diggthis.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/SCRIPT&gt;
&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10012547" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MAPI/">MAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/MFCMAPI/">MFCMAPI</category><category domain="http://blogs.msdn.com/b/stephen_griffin/archive/tags/DevMsgTeam/">DevMsgTeam</category></item></channel></rss>
