Re: [Evolution-hackers] Exchange 5.5 - network reverse engineering underway (MAPI, Nspi)



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]