Re: [Evolution-hackers] Exchange 5.5 - network reverse engineering underway (MAPI, Nspi)
- From: Luke Kenneth Casson Leighton <lkcl lkcl net>
- To: Peter Colijn <pcolijn gmail com>
- Cc: evolution-hackers lists ximian com
- Subject: Re: [Evolution-hackers] Exchange 5.5 - network reverse engineering underway (MAPI, Nspi)
- Date: Tue, 1 Feb 2005 20:17:56 +0000
thank you peter!
there's yTNEF, there's a debian package called tnef, there's KDE tnef,
there's this, that, it's kinda fun :)
On Tue, Feb 01, 2005 at 10:51:18AM -0800, Peter Colijn wrote:
> Hi Luke,
>
> You might want to check out WvMapi. You can download it at
> http://open.nit.ca/wiki/?DownloadSnapshots (get the
> evolution-exchangeit tarball, look for the wvampi subdirectory).
>
> WvMapi currently supports decoding/encoding TNEFs containing the
> attMapiProps attribute, from standard iCalendar and vCard files. It's
> under LGPL.
>
> Have fun,
>
> Peter
>
>
> On Tue, 1 Feb 2005 15:06:41 +0000, Luke Kenneth Casson Leighton
> <lkcl lkcl net> wrote:
> > hi,
> >
> > i've begun the network-reverse-engineering necessary to interoperating
> > with Exchange 5.5 and Outlook.
> >
> > i have a basic test client and a basic server which is able to return
> > hard coded data structures.
> >
> > the key difference between the present attempt and all previous ones is
> > that i have started from FreeDCE not from decoding MSRPC on-wire, so i
> > have a 99.5% IDL file (2 actually) which define the interfaces. FreeDCE
> > turns that into c code, and it's a matter of filling in the blanks.
> >
> > unfortunately there are a lot of blanks. _fortunately_, the data
> > structures of emsabp.idl (the Nspi interface) are IDENTICAL to those
> > used in mapidefs.h - see Wine's include/windows/mapidefs.h
> >
> > anybody interested in helping out please contact me.
> >
> > in particular, help with tying in MAPI which is actually MS-TNEF which
> > is winmail.dat which is therefore directly relevant to evolution,
> > much appreciated.
> >
> > l.
> >
> > --
> > --
> > <a href="http://lkcl.net">http://lkcl.net</a>
> > --
> >
> > [ uuid(f5cc5a18-4264-101a-8c59-08002b2f8426),
> > version(56.0),
> > implicit_handle(handle_t rpc_binding)
> > ] interface emsabp
> > {
> >
> > /* this is mostly identical to wine/include/mapidefs.h,
> > * up until MAPIERROR, at which point it looks completely
> > * unfamiliar and alien.
> > *
> > * the functions in the IMAPITable only look _vaguely_
> > * familiar but are like, utterly different.
> > * really odd. same data structures. different functions.
> > * oh well.
> > */
> >
> > #define PR_ENTRYID 0x0fff0102
> > #define PR_OBJECTID 0xfffd0003
> > #define PR_DISPLAY_NAME 0x3001001e
> > #define PT_CONTAINER_FLAGS 0x36000003 /* PCF_ISCONTAINER | PCF_HASCHILDCONTAINER */
> > #define PR_DEPTH 0x30050003
> > #define PR_PARENTENTRYID 0xfffc0102
> >
> > typedef unsigned short WCHAR;
> >
> > typedef struct {
> > long element_1;
> > long element_2;
> > long element_3;
> > long element_4;
> > long element_5;
> > long element_6;
> > long element_7;
> > long element_8;
> > long element_9;
> > } EMS_MAPI_UNIDENTIFIED;
> >
> > typedef struct {
> > char ab[16];
> > } MAPIUID;
> >
> > typedef [context_handle] void *emsabp_hnd_t;
> >
> > long NspiBind(
> > [in] handle_t element_11,
> > [in] long element_12,
> > [in, ref] EMS_MAPI_UNIDENTIFIED *element_13,
> > [in,out, unique] MAPIUID *element_14,
> > [out] emsabp_hnd_t *element_15
> > );
> >
> > long NspiUnbind(
> > [in,out] emsabp_hnd_t *element_16,
> > [in] long element_17
> > );
> >
> > long NspiUpdateStat(
> > [in] emsabp_hnd_t element_18,
> > [in] long element_19,
> > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_20,
> > [in,out, unique] long *element_21
> > );
> >
> > /* typedef [ptr, string] unsigned long *EMS_SPropTagArray;*/
> >
> > /* this is probably an SPropTagArray. although it doesn't match
> > * up with the definition in wine/includes/mapidefs.h, it also
> > * is the data structure i've had the most difficulty with, matching
> > * it to on-wire format.
> > */
> > typedef struct {
> > [unique, length_is(cValues), size_is(cValues)] long *aulPropTag;
> > long cValues;
> > /*long element_24;*/
> > } EMS_SPropTagArray;
> >
> > typedef [unique] EMS_SPropTagArray *EMS_LPSPropTagArray ;
> >
> > typedef struct {
> > long cb;
> > [size_is(cb), ptr] char *lpb;
> > } EMS_SBinary;
> >
> > typedef struct {
> > long dwLowDateTime;
> > long dwHighDateTime;
> > } EMS_FILETIME;
> >
> > typedef struct {
> > long cValues;
> > [size_is(cValues), ptr] short *lpi;
> > } EMS_SShortArray;
> >
> > typedef struct {
> > long cValues;
> > [size_is(cValues), ptr] long *lpl;
> > } EMS_MULTIVALUE_LONG_STRUCT;
> >
> > typedef struct {
> > long cValues;
> > [size_is(cValues), ptr] long *lppszA; /* this doesn't look right: should be a LPSTR */
> > } EMS_SLPSTRArray;
> >
> > typedef struct {
> > long cValues;
> > [size_is(cValues), ptr] EMS_SBinary *lpbin;
> > } EMS_SBinaryArray;
> >
> > typedef struct {
> > long cValues;
> > [size_is(cValues), ptr] long *lpguid; /* this doesn't look right: it should be a GUID* */
> > } EMS_SGuidArray;
> >
> > typedef struct {
> > long cValues;
> > [size_is(cValues), ptr] long *lpi; /* this doesn't look right: it should be a LPWSTR* */
> > } EMS_MULTIVALUE_UNICODE_STRUCT;
> >
> > typedef struct {
> > long cValues;
> > [size_is(cValues), ptr] EMS_FILETIME *lpft;
> > } EMS_SDateTimeArray;
> >
> > typedef [ptr, string] unsigned short *WSTRING;
> > typedef [ptr, string] char *STRING;
> >
> > #define PT_UNSPECIFIED 0x0000
> > #define PT_NULL 0x0001
> > #define PT_I2 0002
> > #define PT_LONG 0003
> > #define PT_R4 0004
> > #define PT_DOUBLE 0x0005
> > #define PT_CURRENCY 0x0006
> > #define PT_APPTIME 0x0007
> > /*#define PT_CLSID 0x0008 */
> > #define PT_ERROR 0x000a
> > /*
> > means in a response package, that the given attribute contains no value,
> > or not exists.
> > -> So it won't be contained in the enumeration of the attrib. values array.
> > */
> > #define PT_BOOLEAN 0x000b
> > #define PT_OBJECT 0x000d
> > #define PT_I8 0x0014
> > #define PT_STRING8 0x001e
> > #define PT_UNICODE 0x001f
> > #define PT_SYSTIME 0x0040
> > #define PT_CLSID 0x0048
> > #define PT_BINARY 0x0102 /*(the corresponding ???HDR entry is 4 bytes longer in this case!) 1??? */
> >
> > /* MV means MultiValued*/
> > #define PT_MV_I2 0x1002
> > #define PT_MV_LONG 0x1003
> > #define PT_MV_R4 0x1004
> > #define PT_MV_DOUBLE 0x1005
> > #define PT_MV_CURRENCY 0x1006
> > #define PT_MV_APPTIME 0x1007
> > #define PT_MV_I8 0x1014
> > #define PT_MV_STRING8 0x101e
> > #define PT_MV_TSTRING 0x101e
> > #define PT_MV_UNICODE 0x101f
> > #define PT_MV_SYSTIME 0x1040
> > #define PT_MV_CLSID 0x1048
> > #define PT_MV_BINARY 0x1102
> >
> > typedef [switch_type(long)] union {
> > [case(PT_I2)] short i;
> > [case(PT_LONG)] long l;
> > [case(PT_BOOLEAN)] short b;
> > [case(PT_STRING8)] STRING lpszA;
> > [case(PT_BINARY)] EMS_SBinary bin;
> > [case(PT_UNICODE)] WSTRING lpszW;
> > [case(PT_CLSID), ptr] MAPIUID *lpguid;
> > [case(PT_SYSTIME)] EMS_FILETIME ft;
> > [case(PT_ERROR)] long err;
> > [case(PT_MV_I2)] EMS_SShortArray MVi;
> > [case(PT_MV_LONG)] EMS_MULTIVALUE_LONG_STRUCT MVl;
> > [case(PT_MV_STRING8)] EMS_SLPSTRArray MVszA;
> > [case(PT_MV_BINARY)] EMS_SBinaryArray MVbin;
> > [case(PT_MV_CLSID)] EMS_SGuidArray MVguid;
> > [case(PT_MV_UNICODE)] EMS_MULTIVALUE_UNICODE_STRUCT MVszW;
> > [case(PT_MV_SYSTIME)] EMS_SDateTimeArray MVft;
> > [case(PT_NULL)] long null;
> > [case(PT_OBJECT)] long object;
> > } EMS_SPropValue_CTR;
> >
> > typedef struct {
> > long ulPropTag;
> > long dwAlignPad;
> > [switch_is(ulPropTag)] EMS_SPropValue_CTR Value;
> > } EMS_SPropValue;
> >
> > typedef struct {
> > long ulAdrEntryPad;
> > long cValues;
> > [size_is(cValues), unique] EMS_SPropValue *lpProps;
> > } EMS_SRow;
> >
> > typedef [unique] EMS_SRow *EMS_SRow_PTR ;
> >
> > typedef struct {
> > long cRows;
> > [size_is(cRows)] EMS_SRow aRow[*];
> > } EMS_SRowSet;
> >
> > typedef [unique] EMS_SRowSet *EMS_SRowSet_PTR ;
> >
> > long NspiQueryRows(
> > [in] emsabp_hnd_t element_69,
> > [in] long element_70,
> > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_71,
> > [in] long lRows,
> > [in, size_is(lRows), unique] long *element_73,
> > [in] long element_74,
> > [in, ref] EMS_SPropTagArray *element_75,
> > [out, ref] EMS_SRowSet_PTR *element_76
> > );
> >
> > long NspiSeekEntries(
> > [in] emsabp_hnd_t element_77,
> > [in] long element_78,
> > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_79,
> > [in, ref] EMS_SPropValue *element_80,
> > [in, unique] EMS_SPropTagArray *element_81,
> > [in, unique] EMS_SPropTagArray *element_82,
> > [out, ref] EMS_SRowSet_PTR *element_83
> > );
> >
> > typedef [ptr] struct _SRestriction *LPSRestriction;
> >
> > typedef struct {
> > long cRes;
> > [size_is(cRes)] LPSRestriction lpRes;
> > } EMS_SAndRestriction;
> >
> > typedef struct {
> > long cRes;
> > [size_is(cRes)] LPSRestriction lpRes;
> > } EMS_SOrRestriction;
> >
> > typedef struct {
> > /* ULONG ulReserved - perhaps an [ignore] property on this one? */
> > LPSRestriction lpRes;
> > } EMS_SNotRestriction;
> >
> > typedef struct {
> > long ulFuzzyLevel;
> > long ulPropTag;
> > [ptr] EMS_SPropValue *lpProp;
> > } EMS_SContentRestriction;
> >
> > typedef struct {
> > long relop;
> > long ulPropTag;
> > [ptr] EMS_SPropValue *lpProp;
> > } EMS_SPropertyRestriction;
> >
> > typedef struct {
> > long ulReserved1;
> > long ulPropTag;
> > long ulReserved2;
> > } EMS_SExistRestriction;
> >
> > typedef struct {
> > long relop;
> > long ulPropTag;
> > long cb;
> > } EMS_SSizeRestriction;
> >
> > typedef struct {
> > long relBMR;
> > long ulPropTag;
> > long ulMask;
> > } EMS_SBitMaskRestriction;
> >
> > typedef struct {
> > long relop;
> > long ulPropTag1;
> > long ulPropTag2;
> > } EMS_SComparePropsRestriction;
> >
> > typedef struct {
> > long ulSubObject;
> > LPSRestriction lpRes;
> > } EMS_SSubRestriction;
> >
> > typedef struct {
> > [unique] MAPIUID *lpguid;
> > long ulKind;
> > long lID; /* this is actually a union in mapidefs.h */
> > } EMS_MAPINAMEID;
> >
> > /* Restriction types */
> > #define RES_AND 0U
> > #define RES_OR 1U
> > #define RES_NOT 2U
> > #define RES_CONTENT 3U
> > #define RES_PROPERTY 4U
> > #define RES_COMPAREPROPS 5U
> > #define RES_BITMASK 6U
> > #define RES_SIZE 7U
> > #define RES_EXIST 8U
> > #define RES_SUBRESTRICTION 9U
> > #define RES_COMMENT 10U
> >
> > typedef [switch_type(long)] union {
> > [case(RES_AND) ] EMS_SAndRestriction resAnd;
> > [case(RES_OR) ] EMS_SOrRestriction resOr;
> > [case(RES_NOT) ] EMS_SNotRestriction resNot;
> > [case(RES_CONTENT) ] EMS_SContentRestriction resContent;
> > [case(RES_PROPERTY) ] EMS_SPropertyRestriction resProperty;
> > [case(RES_COMPAREPROPS) ] EMS_SComparePropsRestriction resCompareProps;
> > [case(RES_BITMASK) ] EMS_SBitMaskRestriction resBitMask;
> > [case(RES_SUBRESTRICTION)] EMS_SSubRestriction resSub;
> > [case(RES_SIZE) ] EMS_SSizeRestriction resSize;
> > [case(RES_EXIST) ] EMS_SExistRestriction resExist;
> > /* case SCommentRestriction is missing! */
> > } EMS_SRestriction_CTR;
> >
> > typedef struct _SRestriction {
> > long rt;
> > [switch_is(rt)] EMS_SRestriction_CTR res;
> > } EMS_SRestriction;
> >
> > long NspiGetMatches(
> > [in] emsabp_hnd_t element_110,
> > [in] long element_111,
> > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_112,
> > [in, unique] EMS_SPropTagArray *element_113,
> > [in] long element_114,
> > [in, unique] EMS_SRestriction *element_115,
> > [in, unique] EMS_MAPINAMEID *element_116,
> > [in] long element_117,
> > [out, ref] EMS_SPropTagArray *element_118,
> > [in, ref] EMS_SPropTagArray *element_119,
> > [out, ref] EMS_SRowSet_PTR *element_120
> > );
> >
> > long NspiResortRestriction(
> > [in] emsabp_hnd_t element_121,
> > [in] long element_122,
> > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_123,
> > [in, ref] EMS_SPropTagArray *element_124,
> > [in,out, ref] EMS_LPSPropTagArray *element_125
> > );
> >
> > typedef struct {
> > long element_126;
> > [unique, string] char *element_127;
> > } EMS_NAME_STRING;
> >
> > long NspiDNToEph(
> > [in] emsabp_hnd_t element_128,
> > [in] long element_129,
> > [in, ref] EMS_NAME_STRING *element_130,
> > [out, ref] EMS_SPropTagArray *element_131
> > );
> >
> > long NspiGetPropList(
> > [in] emsabp_hnd_t element_132,
> > [in] long element_133,
> > [in] long element_134,
> > [in] long element_135,
> > [out, ref] EMS_LPSPropTagArray *element_136
> > );
> >
> > long NspiGetProps(
> > [in] emsabp_hnd_t element_137,
> > [in] long element_138,
> > [in, ref] EMS_MAPI_UNIDENTIFIED *element_139,
> > [in, unique] EMS_SPropTagArray *element_140,
> > [out, ref] EMS_SRow_PTR *element_141
> > );
> >
> > long NspiCompareDNTs(
> > [in] emsabp_hnd_t element_142,
> > [in] long element_143,
> > [in, ref] EMS_MAPI_UNIDENTIFIED *element_144,
> > [in] long element_145,
> > [in] long element_146,
> > [out, ref] long *element_147
> > );
> >
> > long NspiModProps(
> > [in] emsabp_hnd_t element_148,
> > [in] long element_149,
> > [in, ref] EMS_MAPI_UNIDENTIFIED *element_150,
> > [in, unique] EMS_SPropTagArray *element_151,
> > [in, ref] EMS_SRow *element_152
> > );
> >
> > long NspiGetHierarchyInfo(
> > [in] emsabp_hnd_t element_153,
> > [in] long element_154,
> > [in, ref] EMS_MAPI_UNIDENTIFIED *element_155,
> > [in,out, ref] long *element_156,
> > [out, ref] EMS_SRowSet_PTR *element_157
> > );
> >
> > long NspiGetTemplateInfo(
> > [in] emsabp_hnd_t element_158,
> > [in] long element_159,
> > [in] long element_160,
> > [in, unique, string] char *element_161,
> > [in] long element_162,
> > [in] long element_163,
> > [out, ref] EMS_SRow_PTR *element_164
> > );
> >
> > long NspiModLInkAtt(
> > [in] emsabp_hnd_t element_165,
> > [in] long element_166,
> > [in] long element_167,
> > [in] long element_168,
> > [in, ref] EMS_SBinaryArray *element_169
> > );
> >
> > long NspiDeleteEntries(
> > [in] emsabp_hnd_t element_170,
> > [in] long element_171,
> > [in] long element_172,
> > [in, ref] EMS_SBinaryArray *element_173
> > );
> >
> > long NspiQueryColumns(
> > [in] emsabp_hnd_t element_174,
> > [in] long element_175,
> > [in] long element_176,
> > [out, ref] EMS_LPSPropTagArray *element_177
> > );
> >
> > typedef struct {
> > long element_178;
> > [unique] MAPIUID *element_179;
> > } EMS_NAME_CLSID;
> >
> > typedef [ptr] EMS_NAME_CLSID *EMS_NAME_CLSID_PTR;
> >
> > long NspiGetNamesFromIDs(
> > [in] emsabp_hnd_t element_180,
> > [in] long element_181,
> > [in, unique] MAPIUID *element_182,
> > [in, unique] EMS_SPropTagArray *element_183,
> > [out, ref] EMS_LPSPropTagArray *element_184,
> > [out, ref] EMS_NAME_CLSID_PTR *element_185
> > );
> >
> > long NspiGetIDsFromNames(
> > [in] emsabp_hnd_t element_186,
> > [in] long element_187,
> > [in] long element_188,
> > [in] long element_189,
> > [in, size_is(element_189), ref] long *element_190,
> > [out, ref] EMS_LPSPropTagArray *element_191
> > );
> >
> > long NspiResolveNames(
> > [in] emsabp_hnd_t element_192,
> > [in] long element_193,
> > [in, ref] EMS_MAPI_UNIDENTIFIED *element_194,
> > [in, unique] EMS_SPropTagArray *element_195,
> > [in, ref] EMS_NAME_STRING *element_196,
> > [out, ref] EMS_LPSPropTagArray *element_197,
> > [out, ref] EMS_SRowSet_PTR *element_198
> > );
> >
> > typedef struct {
> > long element_199;
> > [unique, string] WCHAR *element_200;
> > } EMS_NAME_UNICODE;
> >
> > long NspiResolveNamesW(
> > [in] emsabp_hnd_t element_201,
> > [in] long element_202,
> > [in, ref] EMS_MAPI_UNIDENTIFIED *element_203,
> > [in, unique] EMS_SPropTagArray *element_204,
> > [in, ref] EMS_NAME_UNICODE *element_205,
> > [out, ref] EMS_LPSPropTagArray *element_206,
> > [out, ref] EMS_SRowSet_PTR *element_207
> > );
> >
> > }
> >
> > _______________________________________________
> > evolution-hackers maillist - evolution-hackers lists ximian com
> > http://lists.ximian.com/mailman/listinfo/evolution-hackers
> >
--
--
<a href="http://lkcl.net">http://lkcl.net</a>
--
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]