Overview

Desktop Pass Through (or DTPT) is a protocol used for sharing the host's internet connection with the device, ie. a proprietary proxy protocol (yes, another one). The host listens on TCP port 5721 and the device connects to it with one or more clients. The MessageType of the first request initializes the connection to either a NSPSession or a ConnectionSession. A NSPSession is used to perform DNS lookups, whilst a ConnectionSession is used to connect to a given host (a new session is created for every external host that the device wishes to have a session with).

DTPT will be enabled when sync-engine is running. Note that DTPT requires an existing partnership.

NSPSession

All requests and responses have a fixed size of 20 bytes.

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Message type identifier.

Padding

2

Padding.

QValue

8

A QWORD.

DValue1

4

A DWORD.

DValue2

4

A DWORD.

LookupBeginRequest

RPC version of WSALookupServiceBegin, where the payload is WSAQUERYSET serialized (see below).

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Set to 9.

Padding

2

Padding.

QValue

8

Unused.

dwControlFlags

4

Flags as documented for WSALookupServiceBegin.

PayloadSize

4

Number of bytes of payload following, containing the serialized WSAQUERYSET (documented below).

LookupBeginResponse

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Set to 10.

Padding

2

Padding.

Handle

8

The handle returned by WSALookupServiceBegin.

LastError

4

Last error, set to a non-zero value in case of failure.

DValue2

4

Unused.

LookupNextRequest

RPC version of WSALookupServiceNext.

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Set to 11.

Padding

2

Padding.

Handle

8

The handle returned in the LookupBeginResponse.

DValue1

4

Unused.

BufferSize

4

Number of bytes of buffer space allocated for the response. The response' LastError will be set to WSAEFAULT (0x271e) and DataSize will be set to the minimum size required.

LookupNextResponse

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Set to 12.

Padding

2

Padding.

QValue

8

Unused.

LastError

4

Last error, set to a non-zero value in case of failure.

DataSize

4

Contains the number of bytes of payload if LastError is 0, elsewise it contains the minimum buffer space required if LastError is set to WSAEFAULT. On success, the payload contains a serialized WSAQUERYSET (documented below).

LookupEndRequest

RPC version of WSALookupServiceEnd.

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Set to 13.

Padding

2

Padding.

Handle

8

The handle returned in the LookupBeginResponse.

DValue1

4

Unused.

DValue2

4

Unused.

ConnectionSession

ConnectRequest

This request has a fixed size of 36 bytes.

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Set to 1.

Address

30

sockaddr_in or sockaddr_in6, serialized (see below).

LastError

4

Last error, set to 0 in this case.

ConnectResponse

This response has a fixed size of 36 bytes.

Name

Size

Description

Version

1

Set to 1.

MessageType

1

Set to 0x5A on success, 0x5B on failure.

Address

30

The address of the local socket, as returned from getsockname, sockaddr_in or sockaddr_in6, serialized (see below).

LastError

4

Last error, set to a non-zero value in case of failure.

Encodings

Packed fields

Each packed field contains a little-endian DWORD specifying the number of bytes following, followed by that many bytes of data. All fields have to end on 4 byte boundary, so trailing padding is added to ensure this.

WSAQUERYSET serialized

It has mostly packed fields (denoted PF in the Type column) following one another:

Name

Size

Description

WSAQUERYSET

PF, Raw

Contains a flat representation of the WSAQUERYSET, and will thus be 60 bytes big (sizeof(WSAQUERYSET)).

WSAQUERYSET.lpszServiceInstanceName

PF, Unicode C-string

The lpszServiceInstanceName of the WSAQUERYSET.

WSAQUERYSET.lpServiceClassId

PF, Raw GUID (16 bytes)

The lpServiceClassId of the WSAQUERYSET.

WSAQUERYSET.lpszComment

PF, Unicode C-string

The lpszComment of the WSAQUERYSET.

WSAQUERYSET.lpNSProviderId

PF, Raw GUID (16 bytes)

The lpNSProviderId of the WSAQUERYSET.

WSAQUERYSET.lpszContext

PF, Unicode C-string

The lpszContext of the WSAQUERYSET.

WSAQUERYSET.dwNumberOfProtocols

UINT32LE

A UINT32 (little-endian) containing the number of AFPROTOCOL structures following in the next packet field.

WSAQUERYSET.lpafpProtocols

PF, AFPROTOCOL

AFPROTOCOL structures following each other.

WSAQUERYSET.lpszQueryString

PF, Unicode C-string

The lpszQueryString of the WSAQUERYSET.

WSAQUERYSET.dwNumberOfCsAddrs

UINT32LE

A UINT32 (little-endian) containing the number of CSADDR_INFO structures following in the next packet field.

WSAQUERYSET.lpcsaBuffer

PF, CSADDR_INFO

CSADDR_INFO structures following each other. The next fields contain the LocalAddr and RemoteAddr for SOCKET_ADDRESS structure 0 to n.

WSAQUERYSET.lpcsaBuffer[n].LocalAddr

PF, SOCKET_ADDRESS

SOCKET_ADDRESS structure for CSADDR_INFO n.

WSAQUERYSET.lpcsaBuffer[n].RemoteAddr

PF, SOCKET_ADDRESS

SOCKET_ADDRESS structure for CSADDR_INFO n.

WSAQUERYSET.lpBlob

PF, BLOB (8 bytes)

The BLOB structure.

WSAQUERYSET.lpBlob->pBlobData

PF, byte[] (WSAQUERYSET.lpBlob->cbSize bytes long)

The pBlobData member of the BLOB.

sockaddr_in serialized

Name

Size

Description

sin_family

4

Family in little-endian -- AF_INET (2) in this case.

Padding

4

Padding bytes.

sin_port

2

Port in big-endian.

sin_addr

4

Address in big-endian.

Reserved

16

sockaddr_in6 serialized

Name

Size

Description

sin6_family

4

Family in little-endian -- AF_INET6 (23) in this case.

Padding

4

Padding bytes.

sin6_port

2

Port in big-endian.

sin6_addr

16

Address in big-endian.

sin6_scope_id

4

Scope id in big-endian.

ProtocolDocumentation/DesktopPassThrough (last edited 2008-05-18 10:51:33 by Hans Bakker)