Synchronization


From SynCE-Wiki

Contents

General

Getting/setting device name

The name of the device is specified through the following registry key:

HKLM\Ident
Name: REG_SZ

Example:

CeRegCreateKeyEx(HKLM, "Ident", "") => SUCCESS, 0x040b4560, OPENED_EXISTING
CeRegSetValueEx(0x040b4560, "Name", REG_SZ, "WM_Fetter_Zole") => SUCCESS
CeRegCloseKey(0x040b4560) => SUCCESS

Querying for sync version

HKLM\Software\Microsoft\Windows CE Services\Version contains a REG_DWORD with the major version in the leftmost 16 bits and the minor version in the rightmost 16 bits. This version is used to know which registry keys are available and their semantics (and possibly more, like which queries CeProcessConfig supports etc.).

For Windows Mobile 5 devices the version is 2.0.

Example:

CeRegOpenKeyEx(HKLM, "Software\Microsoft\Windows CE Services") => SUCCESS, 0x040b4da0
CeRegQueryValueEx(0x040b4da0, "Version", 4) => SUCCESS, 0x00020000
CeRegCloseKey(0x040b4da0) => SUCCESS

Partnerships

Enumerating existing partnerships

  • The following two registry keys, on the device, are examined:
    HKLM\Software\Microsoft\Windows CE Services\Partners\P1
    PId: REG_DWORD
    PName: REG_SZ
    HKLM\Software\Microsoft\Windows CE Services\Partners\P2
    PId: REG_DWORD
    PName: REG_SZ
    There can only be two partnerships at any given time.
  • To get more information about an existing partnership CeProcessConfig can be used, see the example session below.

Creating a new partnership

  1. Enumerate existing partnerships.
  2. Call CeProcessConfig with a query for available sync sources, and if the number of sources doesn't match the number of partnerships enumerated in the previous step, we delete any "dangling" partnerships.
  3. Call CeProcessConfig to retrieve a list of PIM sync engines. We're supposed to know of any other non-PIM sync engines (there's probably a way to query for all sync engines as well).
  4. Generate a DWORD identifying the host as the primary identifier.
  5. Generate a GUID identifying the host as a data source.
  6. Call CeProcessConfig to set the configuration config for this GUID. For example:
    <wap-provisioningdoc>
    <characteristic type="Sync">
    <characteristic type="Sources">
    <characteristic type="{69099894-F2B4-4389-A155-E6007B409927}">
    <parm name="Name" value="Windows PC"/>
    <parm name="Server" value="FZWARE2"/>
    <parm name="StoreType" value="2"/>
    <characteristic type="Engines">
    <characteristic type="{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}">
    <characteristic type="Settings">
    <parm name="User" value="DEFAULT"/>
    <parm name="Domain" value="DEFAULT"/>
    <parm name="Password" value="DEFAULT"/>
    <parm name="SavePassword" value="1"/>
    <parm name="UseSSL" value="0"/>
    <parm name="ConflictResolution" value="1"/>
    <parm name="URI" value="Microsoft-Server-ActiveSync"/>
    <characteristic/>
    <characteristic type="Providers">
    <characteristic type="{C6D47067-6E92-480E-B0FC-4BA82182FAC7}">
    <parm name="Enabled" value="0"/>
    <parm name="ReadOnly" value="0"/>
    <characteristic/>
    <characteristic type="{783AE4F6-4C12-4423-8270-66361260D4F1}">
    <parm name="Enabled" value="1"/>
    <parm name="ReadOnly" value="0"/>
    <characteristic/>
    <characteristic type="{0DD8685C-E272-4FCB-9ECF-2EAD7EA2497B}">
    <parm name="Enabled" value="0"/>
    <parm name="ReadOnly" value="0"/>
    <characteristic/>
    <characteristic type="{4A5D9FE0-F139-4A63-A5A4-4F31CEEA02AD}">
    <parm name="Enabled" value="0"/>
    <parm name="ReadOnly" value="0"/>
    <characteristic/>
    <characteristic type="{8E98CB51-85A4-4777-8DEB-A0298DF8899F}">
    <parm name="Enabled" value="0"/>
    <parm name="ReadOnly" value="1"/>
    <parm name="Name" value="Notes"/>
    <characteristic/>
    <characteristic type="{7E29B5F7-C686-4B0C-9892-FD8BAD8E0D08}">
    <parm name="Enabled" value="0"/>
    <parm name="ReadOnly" value="1"/>
    <parm name="Name" value="Favorites"/>
    <characteristic/>
    <characteristic type="{B7B6ACB2-AF1D-43F5-BF9A-586111B263EF}">
    <parm name="Enabled" value="0"/>
    <parm name="ReadOnly" value="1"/>
    <parm name="Name" value="Files"/>
    <characteristic/>
    <characteristic type="Media">
    <parm name="Enabled" value="0"/>
    <parm name="ReadOnly" value="1"/>
    <parm name="Name" value="Media"/>
    <characteristic/>
    <characteristic/>
    <characteristic/>
    <characteristic/>
    <characteristic/>
    <characteristic/>
    <characteristic/>
    <wap-provisioningdoc/>
    where:
    • Name is a user-specified name of the host, max 20 characters in length
    • Server is our hostname
    • StoreType is 2 (FIXME: figure out what the different store types are)
  7. Insert outself into the first available slot, like for example:
    CeRegCreateKeyEx(HKLM, "Software\Microsoft\Windows CE Services\Partners", "") => SUCCESS, 0x040b4a40, OPENED_EXISTING
    CeRegSetValueEx(0x040b4a40, "PCur", REG_DWORD, 0x00000001) => SUCCESS
    CeRegCreateKeyEx(0x040b4a40, "P1", "") => SUCCESS, 0x040b4b00, OPENED_EXISTING
    CeRegSetValueEx(0x040b4b00, "PId", REG_DWORD, 0x58533dc0) => SUCCESS
    CeRegSetValueEx(0x040b4b00, "DataSourceID", REG_SZ, "{69099894-F2B4-4389-A155-E6007B409927}") => SUCCESS
    CeRegSetValueEx(0x040b4b00, "PName", REG_SZ, "FZWARE2") => SUCCESS
    CeRegCloseKey(0x040b4b00) => SUCCESS
    CeRegCloseKey(0x040b4a40) => SUCCESS
    where:
    • PId is the primary identifier generated
    • DataSourceID is the GUID that we generated to identify ourself as a data source
    • PName is our hostname

Deleting an existing partnership

CeProcessConfig is called with an XML stanza as below, with:

  • the "type" attribute containing the GUID of the partnership as figured out by a previous CeProcessConfig query
  • dwFlags set to 0x00000001
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Sources">
            <nocharacteristic type="{C1027B2D-882B-4459-B0C7-D544FA2E8E79}">
            <nocharacteristic/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>

The response, on success, is simply the same XML stanza echoed back (and LastError set to 6 -- FIXME: look up this errorcode)

Example sessions

Session where the PDA knows about two existing partnerships

  • Query for version, 2.0 is returned.
  • Enumerate existing partnerships:
CeRegCreateKeyEx(HKLM, "Software\Microsoft\Windows CE Services\Partners", "") => SUCCESS, 0x040b4e00, OPENED_EXISTING

CeRegCreateKeyEx(0x040b4e00, "P1", "") => SUCCESS, 0x040b4e60, OPENED_EXISTING
CeRegQueryValueEx(0x040b4e60, "PId", 4) => SUCCESS, 0x6e2a0c0a
CeRegQueryValueEx(0x040b4e60, "PName", 32) => SUCCESS, "FETTERZOLE"
CeRegCloseKey(0x040b4e60) => SUCCESS

CeRegCreateKeyEx(0x040b4e00, "P2", "") => SUCCESS, 0x040b4ec0, OPENED_EXISTING
CeRegQueryValueEx(0x040b4ec0, "PId", 4) => SUCCESS, 0x1158434c
CeRegQueryValueEx(0x040b4ec0, "PName", 32) => SUCCESS, "FZWARE"
CeRegCloseKey(0x040b4ec0) => SUCCESS

CeRegCloseKey(0x040b4e00) => SUCCESS
  • CeGetDesktopDeviceCaps() for BITSPIXEL and TEXTCAPS.
  • Get "Software\Microsoft\Windows CE Services\FileSyncPath":
CeRegOpenKeyEx(HKLM, "Software\Microsoft\Windows CE Services") => SUCCESS, 0x040b4e00
CeRegQueryValueEx(0x040b4e00, "FileSyncPath", 1040) => FILE_NOT_FOUND
CeRegCloseKey(0x040b4e00) => SUCCESS
  • Query for sources and settings:
CeProcessConfig([230 bytes], 0x00000001) => SUCCESS, [2406 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic-query recursive="false" type="Sources">
        <characteristic-query/>
        <characteristic-query type="Settings">
        <characteristic-query/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic recursive="false" type="Sources">
            <characteristic type="{C1027B2D-882B-4459-B0C7-D544FA2E8E79}"/>
            <characteristic type="{26DF7C59-98DB-48A2-86AA-353E2A530ED7}"/>
        <characteristic/>
        <characteristic type="Settings">
            <characteristic type="CarrierConnectorList"/>
            <characteristic type="PeakDays">
                <parm name="Fri" value="1"/>
                <parm name="Mon" value="1"/>
                <parm name="Sat" value="0"/>
                <parm name="Sun" value="0"/>
                <parm name="Thr" value="1"/>
                <parm name="Tue" value="1"/>
                <parm name="Wed" value="1"/>
            <characteristic/>
            <parm name="AllowSSLOption" value="1"/>
            <parm name="AutoSync" value="1"/>
            <parm name="AutoSyncWhenCradled" value="1"/>
            <parm name="BodyTruncation" value="5120"/>
            <parm name="CalendarAgeFilter" value="0"/>
            <parm name="CarrierConnector" value=""/>
            <parm name="ClientAutdSupport" value="3"/>
            <parm name="ClientCertAuthSupport" value="1"/>
            <parm name="ClientNegotiated" value="0"/>
            <parm name="ClientProtocolVersion" value=""/>
            <parm name="ConflictResolution" value="1"/>
            <parm name="Device" value="PocketPC"/>
            <parm name="DeviceAddressingMethod" value="0"/>
            <parm name="DeviceID" value=""/>
            <parm name="DevicePhoneNumber" value=""/>
            <parm name="DevicePhoneReadOnly" value="0"/>
            <parm name="DeviceSMSAddress" value=""/>
            <parm name="DisconnectWhenDone" value="1"/>
            <parm name="EmailAgeFilter" value="2"/>
            <parm name="EnableNonLocalCrossPollination" value="0"/>
            <parm name="HeartbeatDefault" value="480"/>
            <parm name="HeartbeatIncrement" value="300"/>
            <parm name="HeartbeatMax" value="1680"/>
            <parm name="HeartbeatMin" value="480"/>
            <parm name="MIMETruncation" value="5120"/>
            <parm name="MailBodyTruncation" value="512"/>
            <parm name="MailFileAttachments" value="0"/>
            <parm name="NotificationsSupported" value="0"/>
            <parm name="OffPeakFrequency" value="-1"/>
            <parm name="OutboundMailDelay" value="5"/>
            <parm name="PeakEndTime" value="1800"/>
            <parm name="PeakFrequency" value="-1"/>
            <parm name="PeakStartTime" value="0800"/>
            <parm name="RadioEnabledDevice" value="1"/>
            <parm name="SaveSentItems" value="1"/>
            <parm name="SendMailItemsImmediately" value="1"/>
            <parm name="SyncAPN" value=""/>
            <parm name="SyncAfterCount" value="0"/>
            <parm name="SyncAfterTime" value="0"/>
            <parm name="SyncAfterTimeWhenCradled" value="5"/>
            <parm name="SyncWhenRoaming" value="0"/>
            <parm name="VersionMajor" value="1"/>
            <parm name="VersionMinor" value="1"/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
  • Do a query on each of the sources returned by the previous query:
CeProcessConfig([230 bytes], 0x00000001) => SUCCESS, [2767 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Sources">
            <characteristic-query type="{C1027B2D-882B-4459-B0C7-D544FA2E8E79}">
            <characteristic-query/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Sources">
            <characteristic type="{C1027B2D-882B-4459-B0C7-D544FA2E8E79}">
                <characteristic type="Engines">
                    <characteristic type="{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}">
                        <characteristic type="CarrierConnectorList"/>
                        <characteristic type="Providers">
                            <characteristic type="{C3D12871-210E-0922-1188-DDA01BD31169}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Media"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{B7B6ACB2-AF1D-43F5-BF9A-586111B263EF}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Files"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{7E29B5F7-C686-4B0C-9892-FD8BAD8E0D08}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Favorites"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{8E98CB51-85A4-4777-8DEB-A0298DF8899F}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Notes"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{4A5D9FE0-F139-4A63-A5A4-4F31CEEA02AD}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Kalender"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{0DD8685C-E272-4FCB-9ECF-2EAD7EA2497B}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Kontakter"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{783AE4F6-4C12-4423-8270-66361260D4F1}">
                                <parm name="Enabled" value="1"/>
                                <parm name="Name" value="Oppgaver"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{C6D47067-6E92-480E-B0FC-4BA82182FAC7}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="E-post"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                        <characteristic/>
                        <characteristic type="Settings">
                            <parm name="CarrierConnector" value=""/>
                            <parm name="ClientNegotiated" value="1"/>
                            <parm name="ClientProtocolVersion" value="2.5"/>
                            <parm name="ConflictResolution" value="1"/>
                            <parm name="DeviceAddressingMethod" value="0"/>
                            <parm name="DevicePhoneNumber" value=""/>
                            <parm name="DeviceSMSAddress" value=""/>
                            <parm name="Domain" value="DEFAULT"/>
                            <parm name="EmailAddress" value=""/>
                            <parm name="Logging" value="0"/>
                            <parm name="NotificationsSupported" value="0"/>
                            <parm name="RefreshCertAuthXml" value="0"/>
                            <parm name="SavePassword" value="1"/>
                            <parm name="ServerAutdSupport" value="0"/>
                            <parm name="ServerCertAuthRequired" value="0"/>
                            <parm name="URI" value="Microsoft-Server-ActiveSync"/>
                            <parm name="UseSSL" value="0"/>
                            <parm name="User" value="DEFAULT"/>
                        <characteristic/>
                    <characteristic/>
                <characteristic/>
                <parm name="Name" value="Vmware PC"/>
                <parm name="Server" value="FZWARE"/>
                <parm name="StoreType" value="2"/>
            <characteristic/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
CeProcessConfig([230 bytes], 0x00000001) => SUCCESS, [2772 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Sources">
            <characteristic-query type="{26DF7C59-98DB-48A2-86AA-353E2A530ED7}">
            <characteristic-query/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Sources">
            <characteristic type="{26DF7C59-98DB-48A2-86AA-353E2A530ED7}">
                <characteristic type="Engines">
                    <characteristic type="{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}">
                        <characteristic type="CarrierConnectorList"/>
                        <characteristic type="Providers">
                            <characteristic type="{37120B52-E418-0E3E-4F98-AA3E26F5527F}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Media"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{B7B6ACB2-AF1D-43F5-BF9A-586111B263EF}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Files"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{7E29B5F7-C686-4B0C-9892-FD8BAD8E0D08}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="Favorites"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{8E98CB51-85A4-4777-8DEB-A0298DF8899F}">
                                <parm name="Enabled" value="1"/>
                                <parm name="Name" value="Notes"/>
                                <parm name="ReadOnly" value="1"/>
                            <characteristic/>
                            <characteristic type="{4A5D9FE0-F139-4A63-A5A4-4F31CEEA02AD}">
                                <parm name="Enabled" value="1"/>
                                <parm name="Name" value="Kalender"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{0DD8685C-E272-4FCB-9ECF-2EAD7EA2497B}">
                                <parm name="Enabled" value="1"/>
                                <parm name="Name" value="Kontakter"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{783AE4F6-4C12-4423-8270-66361260D4F1}">
                                <parm name="Enabled" value="1"/>
                                <parm name="Name" value="Oppgaver"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{C6D47067-6E92-480E-B0FC-4BA82182FAC7}">
                                <parm name="Enabled" value="0"/>
                                <parm name="Name" value="E-post"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                        <characteristic/>
                        <characteristic type="Settings">
                            <parm name="CarrierConnector" value=""/>
                            <parm name="ClientNegotiated" value="1"/>
                            <parm name="ClientProtocolVersion" value="2.5"/>
                            <parm name="ConflictResolution" value="1"/>
                            <parm name="DeviceAddressingMethod" value="0"/>
                            <parm name="DevicePhoneNumber" value=""/>
                            <parm name="DeviceSMSAddress" value=""/>
                            <parm name="Domain" value="DEFAULT"/>
                            <parm name="EmailAddress" value=""/>
                            <parm name="Logging" value="0"/>
                            <parm name="NotificationsSupported" value="0"/>
                            <parm name="RefreshCertAuthXml" value="0"/>
                            <parm name="SavePassword" value="1"/>
                            <parm name="ServerAutdSupport" value="0"/>
                            <parm name="ServerCertAuthRequired" value="0"/>
                            <parm name="URI" value="Microsoft-Server-ActiveSync"/>
                            <parm name="UseSSL" value="0"/>
                            <parm name="User" value="DEFAULT"/>
                        <characteristic/>
                    <characteristic/>
                <characteristic/>
                <parm name="Name" value="Windows PC"/>
                <parm name="Server" value="FETTERZOLE"/>
                <parm name="StoreType" value="2"/>
            <characteristic/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
  • Prompt the user which of the two existing partnerships should be removed, and do this as outlined in the "Deleting an existing partnership" section.


Session where the PDA doesn't have any partnerships and the first one is created

  • Query for version, 2.0 is returned.
  • Enumerate existing partnerships:
CeRegCreateKeyEx(HKLM, "Software\Microsoft\Windows CE Services\Partners", "") => SUCCESS, 0x040b4500, OPENED_EXISTING

CeRegCreateKeyEx(0x040b4500, "
P1", "") => SUCCESS, 0x040b45c0, CREATED_NEW
CeRegQueryValueEx(0x040b45c0, "PId", 4) => FILE_NOT_FOUND
CeRegCloseKey(0x040b45c0) => SUCCESS

CeRegCreateKeyEx(0x040b4500, "P2", "") => SUCCESS, 0x040b45c0, OPENED_EXISTING
CeRegQueryValueEx(0x040b45c0, "PId", 4) => FILE_NOT_FOUND
CeRegCloseKey(0x040b45c0) => SUCCESS

CeRegCloseKey(0x040b4500) => SUCCESS
  • CeGetDesktopDeviceCaps() for BITSPIXEL and TEXTCAPS.
  • Get "Software\Microsoft\Windows CE Services\FileSyncPath":
CeRegOpenKeyEx(HKLM, "Software\Microsoft\Windows CE Services") => SUCCESS, 0x040b4500
CeRegQueryValueEx(0x040b4500, "FileSyncPath", 1040) => FILE_NOT_FOUND
CeRegCloseKey(0x040b4500) => SUCCESS
  • Query for sources and settings:
CeProcessConfig([230 bytes], 0x00000001) => SUCCESS, [2264 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic-query recursive="false" type="Sources">
        <characteristic-query/>
        <characteristic-query type="Settings">
        <characteristic-query/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic recursive="false" type="Sources"/>
        <characteristic type="Settings">
            <characteristic type="CarrierConnectorList"/>
            <characteristic type="PeakDays">
                <parm name="Fri" value="1"/>
                <parm name="Mon" value="1"/>
                <parm name="Sat" value="0"/>
                <parm name="Sun" value="0"/>
                <parm name="Thr" value="1"/>
                <parm name="Tue" value="1"/>
                <parm name="Wed" value="1"/>
            <characteristic/>
            <parm name="AllowSSLOption" value="1"/>
            <parm name="AutoSync" value="1"/>
            <parm name="AutoSyncWhenCradled" value="1"/>
            <parm name="BodyTruncation" value="5120"/>
            <parm name="CalendarAgeFilter" value="0"/>
            <parm name="CarrierConnector" value=""/>
            <parm name="ClientAutdSupport" value="3"/>
            <parm name="ClientCertAuthSupport" value="1"/>
            <parm name="ClientNegotiated" value="0"/>
            <parm name="ClientProtocolVersion" value=""/>
            <parm name="ConflictResolution" value="1"/>
            <parm name="Device" value="PocketPC"/>
            <parm name="DeviceAddressingMethod" value="0"/>
            <parm name="DeviceID" value=""/>
            <parm name="DevicePhoneNumber" value=""/>
            <parm name="DevicePhoneReadOnly" value="0"/>
            <parm name="DeviceSMSAddress" value=""/>
            <parm name="DisconnectWhenDone" value="1"/>
            <parm name="EmailAgeFilter" value="2"/>
            <parm name="EnableNonLocalCrossPollination" value="0"/>
            <parm name="HeartbeatDefault" value="480"/>
            <parm name="HeartbeatIncrement" value="300"/>
            <parm name="HeartbeatMax" value="1680"/>
            <parm name="HeartbeatMin" value="480"/>
            <parm name="MIMETruncation" value="5120"/>
            <parm name="MailBodyTruncation" value="512"/>
            <parm name="MailFileAttachments" value="0"/>
            <parm name="NotificationsSupported" value="0"/>
            <parm name="OffPeakFrequency" value="-1"/>
            <parm name="OutboundMailDelay" value="5"/>
            <parm name="PeakEndTime" value="1800"/>
            <parm name="PeakFrequency" value="-1"/>
            <parm name="PeakStartTime" value="0800"/>
            <parm name="RadioEnabledDevice" value="1"/>
            <parm name="SaveSentItems" value="1"/>
            <parm name="SendMailItemsImmediately" value="1"/>
            <parm name="SyncAPN" value=""/>
            <parm name="SyncAfterCount" value="0"/>
            <parm name="SyncAfterTime" value="0"/>
            <parm name="SyncAfterTimeWhenCradled" value="5"/>
            <parm name="SyncWhenRoaming" value="0"/>
            <parm name="VersionMajor" value="1"/>
            <parm name="VersionMinor" value="1"/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
  • Show a wizard guiding the user through creating a new partnership.
  • Query for available engines and present these to the user:
CeProcessConfig([230 bytes], 0x00000001) => SUCCESS, [1275 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Engines">
            <characteristic-query type="{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}">
            <characteristic-query/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Engines">
            <characteristic type="{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}">
                <characteristic type="Providers">
                    <characteristic type="{c6d47067-6e92-480e-b0fc-4ba82182fac7}">
                        <parm name="Name" value="E-post"/>
                        <parm name="ReadOnly" value="0"/>
                        <parm name="Enabled" value="1"/>
                    <characteristic/>
                    <characteristic type="{783ae4f6-4c12-4423-8270-66361260d4f1}">
                        <parm name="Name" value="Oppgaver"/>
                        <parm name="ReadOnly" value="0"/>
                        <parm name="Enabled" value="1"/>
                    <characteristic/>
                    <characteristic type="{0dd8685c-e272-4fcb-9ecf-2ead7ea2497b}">
                        <parm name="Name" value="Kontakter"/>
                        <parm name="ReadOnly" value="0"/>
                        <parm name="Enabled" value="1"/>
                    <characteristic/>
                    <characteristic type="{4a5d9fe0-f139-4a63-a5a4-4f31ceea02ad}">
                        <parm name="Name" value="Kalender"/>
                        <parm name="ReadOnly" value="0"/>
                        <parm name="Enabled" value="1"/>
                    <characteristic/>
                <characteristic/>
                <characteristic type="Settings">
                    <parm name="NotificationsSupported" value="0"/>
                    <parm name="URI" value="Microsoft-Server-ActiveSync"/>
                    <parm name="DeviceAddressingMethod" value="1"/>
                    <parm name="SyncAfterTimeWhenCradled" value="5"/>
                    <parm name="ConflictResolution" value="1"/>
                <characteristic/>
            <characteristic/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
NOTE 
This query is limited to engines of type "{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}", which are probably PIM-only engines. The rest of the engines presented are hard-coded, probably based on which generation device it's talking to. A confirmation of this assumption is that when testing with English ActiveSync and a PDA with Norwegian Windows Mobile 5, these PIM engines are presented with the device's Norwegian names, whilst the rest were in English.
  • The user chooses to synchronize only Tasks and finishes the wizard.
  • Device identity is set:
CeRegCreateKeyEx(HKLM, "Ident", "") => SUCCESS, 0x040b4560, OPENED_EXISTING
CeRegSetValueEx(0x040b4560, "Name", REG_SZ, "WM_Fetter_Zole") => SUCCESS
CeRegCloseKey(0x040b4560) => SUCCESS
  • Time on device is synchronized with the host by calling CeSyncTimeToPc.
  • The synchronization config is set. "{69099894-F2B4-4389-A155-E6007B409927}" is a GUID generated by the host to identify itself, and is used for example with CeSyncStart, as can be seen below.
CeProcessConfig([2126 bytes], 0x00000001) => SUCCESS, [2083 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Sources">
            <characteristic type="{69099894-F2B4-4389-A155-E6007B409927}">
                <parm name="Name" value="Windows PC"/>
                <parm name="Server" value="FZWARE2"/>
                <parm name="StoreType" value="2"/>
                <characteristic type="Engines">
                    <characteristic type="{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}">
                        <characteristic type="Settings">
                            <parm name="User" value="DEFAULT"/>
                            <parm name="Domain" value="DEFAULT"/>
                            <parm name="Password" value="DEFAULT"/>
                            <parm name="SavePassword" value="1"/>
                            <parm name="UseSSL" value="0"/>
                            <parm name="ConflictResolution" value="1"/>
                            <parm name="URI" value="Microsoft-Server-ActiveSync"/>
                        <characteristic/>
                        <characteristic type="Providers">
                            <characteristic type="{C6D47067-6E92-480E-B0FC-4BA82182FAC7}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{783AE4F6-4C12-4423-8270-66361260D4F1}">
                                <parm name="Enabled" value="1"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{0DD8685C-E272-4FCB-9ECF-2EAD7EA2497B}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{4A5D9FE0-F139-4A63-A5A4-4F31CEEA02AD}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{8E98CB51-85A4-4777-8DEB-A0298DF8899F}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Notes"/>
                            <characteristic/>
                            <characteristic type="{7E29B5F7-C686-4B0C-9892-FD8BAD8E0D08}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Favorites"/>
                            <characteristic/>
                            <characteristic type="{B7B6ACB2-AF1D-43F5-BF9A-586111B263EF}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Files"/>
                            <characteristic/>
                            <characteristic type="Media">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Media"/>
                            <characteristic/>
                        <characteristic/>
                    <characteristic/>
                <characteristic/>
            <characteristic/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic type="Sources">
            <characteristic type="{69099894-F2B4-4389-A155-E6007B409927}">
                <parm name="Name" value="Windows PC"/>
                <parm name="Server" value="FZWARE2"/>
                <parm name="StoreType" value="2"/>
                <characteristic type="Engines">
                    <characteristic type="{176F4FFD-F20C-4BD4-BDD7-01D0726C567B}">
                        <characteristic type="Settings">
                            <parm name="User" value="DEFAULT"/>
                            <parm name="Domain" value="DEFAULT"/>
                            <parm name="Password" value="DEFAULT"/>
                            <parm name="SavePassword" value="1"/>
                            <parm name="UseSSL" value="0"/>
                            <parm name="ConflictResolution" value="1"/>
                            <parm name="URI" value="Microsoft-Server-ActiveSync"/>
                        <characteristic/>
                        <characteristic type="Providers">
                            <characteristic type="{C6D47067-6E92-480E-B0FC-4BA82182FAC7}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{783AE4F6-4C12-4423-8270-66361260D4F1}">
                                <parm name="Enabled" value="1"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{0DD8685C-E272-4FCB-9ECF-2EAD7EA2497B}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{4A5D9FE0-F139-4A63-A5A4-4F31CEEA02AD}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="0"/>
                            <characteristic/>
                            <characteristic type="{8E98CB51-85A4-4777-8DEB-A0298DF8899F}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Notes"/>
                            <characteristic/>
                            <characteristic type="{7E29B5F7-C686-4B0C-9892-FD8BAD8E0D08}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Favorites"/>
                            <characteristic/>
                            <characteristic type="{B7B6ACB2-AF1D-43F5-BF9A-586111B263EF}">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Files"/>
                            <characteristic/>
                            <characteristic type="Media">
                                <parm name="Enabled" value="0"/>
                                <parm name="ReadOnly" value="1"/>
                                <parm name="Name" value="Media"/>
                            <characteristic/>
                        <characteristic/>
                    <characteristic/>
                <characteristic/>
            <characteristic/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
  • Query for synchronization settings:
CeProcessConfig([169 bytes], 0x00000001) => SUCCESS, [2020 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic-query recursive="false" type="Settings">
        <characteristic-query/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="Sync">
        <characteristic recursive="false" type="Settings">
            <characteristic type="CarrierConnectorList"/>
            <characteristic type="PeakDays"/>
            <parm name="AllowSSLOption" value="1"/>
            <parm name="AutoSync" value="1"/>
            <parm name="AutoSyncWhenCradled" value="1"/>
            <parm name="BodyTruncation" value="5120"/>
            <parm name="CalendarAgeFilter" value="0"/>
            <parm name="CarrierConnector" value=""/>
            <parm name="ClientAutdSupport" value="3"/>
            <parm name="ClientCertAuthSupport" value="1"/>
            <parm name="ClientNegotiated" value="0"/>
            <parm name="ClientProtocolVersion" value=""/>
            <parm name="ConflictResolution" value="1"/>
            <parm name="Device" value="PocketPC"/>
            <parm name="DeviceAddressingMethod" value="0"/>
            <parm name="DeviceID" value=""/>
            <parm name="DevicePhoneNumber" value=""/>
            <parm name="DevicePhoneReadOnly" value="0"/>
            <parm name="DeviceSMSAddress" value=""/>
            <parm name="DisconnectWhenDone" value="1"/>
            <parm name="EmailAgeFilter" value="2"/>
            <parm name="EnableNonLocalCrossPollination" value="0"/>
            <parm name="HeartbeatDefault" value="480"/>
            <parm name="HeartbeatIncrement" value="300"/>
            <parm name="HeartbeatMax" value="1680"/>
            <parm name="HeartbeatMin" value="480"/>
            <parm name="MIMETruncation" value="5120"/>
            <parm name="MailBodyTruncation" value="512"/>
            <parm name="MailFileAttachments" value="0"/>
            <parm name="NotificationsSupported" value="0"/>
            <parm name="OffPeakFrequency" value="-1"/>
            <parm name="OutboundMailDelay" value="5"/>
            <parm name="PeakEndTime" value="1800"/>
            <parm name="PeakFrequency" value="-1"/>
            <parm name="PeakStartTime" value="0800"/>
            <parm name="RadioEnabledDevice" value="1"/>
            <parm name="SaveSentItems" value="1"/>
            <parm name="SendMailItemsImmediately" value="1"/>
            <parm name="SyncAPN" value=""/>
            <parm name="SyncAfterCount" value="0"/>
            <parm name="SyncAfterTime" value="0"/>
            <parm name="SyncAfterTimeWhenCradled" value="5"/>
            <parm name="SyncWhenRoaming" value="0"/>
            <parm name="VersionMajor" value="1"/>
            <parm name="VersionMinor" value="1"/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
  • Query for CM_ProxyEntries:
CeProcessConfig([130 bytes], 0x00000001) => SUCCESS, [260 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic-query recursive="false" type="CM_ProxyEntries">
    <characteristic-query/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic recursive="false" type="CM_ProxyEntries">
        <characteristic type="null-corp-{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}"/>
        <characteristic type="HTTP-{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"/>
    <characteristic/>
<wap-provisioningdoc/>
  • Get more details on each of the CM_ProxyEntries returned:
CeProcessConfig([335 bytes], 0x00000001) => SUCCESS, [1016 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="CM_ProxyEntries">
        <characteristic-query recursive="false" type="null-corp-{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}">
        <characteristic-query/>
        <characteristic-query recursive="false" type="HTTP-{ADB0B001-10B5-3F39-27C6-9742E785FCD4}">
        <characteristic-query/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="CM_ProxyEntries">
        <characteristic recursive="false" type="null-corp-{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}">
            <parm name="SrcId" value="{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}"/>
            <parm name="DestId" value="{A1182988-0D73-439E-87AD-2A5B369F808B}"/>
            <parm name="Proxy" value=""/>
            <parm name="Override" value=""/>
            <parm name="Enable" value="1"/>
            <parm name="Type" value="0"/>
            <parm name="Username" value=""/>
            <parm name="Password" value=""/>
            <parm name="ExtraInfo" value=""/>
        <characteristic/>
        <characteristic recursive="false" type="HTTP-{ADB0B001-10B5-3F39-27C6-9742E785FCD4}">
            <parm name="SrcId" value="{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"/>
            <parm name="DestId" value="{436EF144-B4FB-4863-A041-8F905A62C572}"/>
            <parm name="Proxy" value=""/>
            <parm name="Override" value=""/>
            <parm name="Enable" value="1"/>
            <parm name="Type" value="0"/>
            <parm name="Username" value=""/>
            <parm name="Password" value=""/>
            <parm name="ExtraInfo" value=""/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
  • Set CurrentDTPTNetwork to HTTP by setting it to its SrcId as returned in the previous step:
CeProcessConfig([227 bytes], 0x00000001) => SUCCESS, [226 bytes]

szRequest:
----------
<wap-provisioningdoc>
    <characteristic type="CM_NetEntries">
        <characteristic type="CurrentDTPTNetwork">
            <parm name="DestId" value="{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>

szResponse:
-----------
<wap-provisioningdoc>
    <characteristic type="CM_NetEntries">
        <characteristic type="CurrentDTPTNetwork">
            <parm name="DestId" value="{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"/>
        <characteristic/>
    <characteristic/>
<wap-provisioningdoc/>
  • Call CeSyncStart with our own id generated earlier:
CeSyncStart([145 bytes]) => SUCCESS

szXML:
------
<sync xmlns="http://schemas.microsoft.com/as/2004/core" type="Interactive">
    <partner id="{69099894-F2B4-4389-A155-E6007B409927}">
    <partner/>
<sync/>
  • Enumerate existing partnerships:
CeRegCreateKeyEx(HKLM, "Software\Microsoft\Windows CE Services\Partners", "") => SUCCESS, 0x040b4a40, OPENED_EXISTING

CeRegCreateKeyEx(0x040b4a40, "P1", "") => SUCCESS, 0x040b4b00, OPENED_EXISTING
CeRegQueryValueEx(0x040b4b00, "PId", 4) => FILE_NOT_FOUND
CeRegCloseKey(0x040b4b00) => SUCCESS

CeRegCreateKeyEx(0x040b4a40, "P2", "") => SUCCESS, 0x040b4b00, OPENED_EXISTING
CeRegQueryValueEx(0x040b4b00, "PId", 4) => FILE_NOT_FOUND
CeRegCloseKey(0x040b4b00) => SUCCESS

CeRegCloseKey(0x040b4a40) => SUCCESS
  • Insert ourself into the first available slot and set PCur to this:
CeRegCreateKeyEx(HKLM, "Software\Microsoft\Windows CE Services\Partners", "") => SUCCESS, 0x040b4a40, OPENED_EXISTING

CeRegSetValueEx(0x040b4a40, "PCur", REG_DWORD, 0x00000001) => SUCCESS

CeRegCreateKeyEx(0x040b4a40, "P1", "") => SUCCESS, 0x040b4b00, OPENED_EXISTING
CeRegSetValueEx(0x040b4b00, "PId", REG_DWORD, 0x58533dc0) => SUCCESS
CeRegSetValueEx(0x040b4b00, "DataSourceID", REG_SZ, "{69099894-F2B4-4389-A155-E6007B409927}") => SUCCESS
CeRegSetValueEx(0x040b4b00, "PName", REG_SZ, "FZWARE2") => SUCCESS
  • Call CeGetFileAttributes():
CeGetFileAttributes("\Restart Synchronization Marker.1") => 0xffffffff
  • Close the open keys:
CeRegCloseKey(0x040b4a40) => SUCCESS
CeRegCloseKey(0x040b4b00) => SUCCESS
  • Set RasTimeoutResponse to 60:
CeRegOpenKeyEx(HKLM, "Software\Microsoft\Windows CE Services") => SUCCESS, 0x040b4b00
CeRegSetValueEx(0x040b4b00, "RasTimeoutResponse", REG_DWORD, 60) => SUCCESS
CeRegCloseKey(0x040b4b00) => SUCCESS
  • Set ExcludeExts to "lnk,tmp,cdb,mdb":
CeRegCreateKeyEx(HKLM, "Software\Microsoft\Windows CE Services", "") => SUCCESS, 0x040b4b00, OPENED_EXISTING
CeRegSetValueEx(0x040b4b00, "ExcludeExts", REG_SZ, "lnk,tmp,cdb,mdb") => SUCCESS
CeRegCloseKey(0x040b4b00) => SUCCESS
  • At this point, another thread X does:
CeRegOpenKeyEx(HKLM, "Software\Microsoft\Windows CE Services\Partners") => SUCCESS, 0x040b4b00
CeRegQueryValueEx(0x040b4b00, "PCur", 4) => SUCCESS, 0x00000001
CeRegCloseKey(0x040b4b00) => SUCCESS
CeGetFileAttributes("\Restart Synchronization Marker.1") => 0xffffffff
  • And, while that happens, another thread Y does:
CeStartReplication() => 0x00000001 (LastError = 0x00000019)
  • The UI then says "Looking for changes", we start listening on port 999 and the PDA connects to it.
  • We start listening on port 5678, and the PDA connects to it with two clients.
  • After some magic interaction with the first client connected to 5678, the UI says "Synchronizing".
  • The same thread that did all the RAPI calls from the start of this trace then does:
RAPI_EXP_28() => SUCCESS (LastError = 0x000000b7)
  • Shortly after, we send some magic from port 999, then some transaction with the first client connected

to 5678, then "$UPTODATE$" from port 999, then send some more magic to the first client on 5678. The UI changes to "Synchronized", and right after that two responses from the first client on 5678.

NOTE 
The last part is somewhat inaccurate, as SocketSpy doesn't, at the time of this writing, catch the HTTP traffic where the actual synchronization is done. This is because it's done by a kernel http daemon through the httpapi.dll API, which will be intercepted in the near future.