Added coded stubs for DdeQueryConvInfo (16 & 32 bit), DdeAddData (32
bit), DdeAbandonTransaction (32 bit), DdeImpersonateClient (32)
DdeSetQualityOfService, DdeSetUserHandle.
Corrected heap handling in DdeInitializeW, refined CreateMutex error
handling.
General tidying.

diff --git a/if1632/ddeml.spec b/if1632/ddeml.spec
index 6a89e41..992c8b7 100644
--- a/if1632/ddeml.spec
+++ b/if1632/ddeml.spec
@@ -8,7 +8,7 @@
 6 pascal DdeDisconnectList(word) DdeDisconnectList16
 7 pascal   DdeConnect(long long long ptr) DdeConnect16
 8 pascal16 DdeDisconnect(long) DdeDisconnect16
-9 stub DdeQueryConvInfo #(word long ptr) DdeQueryConvInfo
+9 pascal16  DdeQueryConvInfo (word long ptr) DdeQueryConvInfo16
 10 pascal DdeSetUserHandle(word long long) DdeSetUserHandle16
 11 pascal   DdeClientTransaction(ptr long long long s_word s_word long ptr)
             DdeClientTransaction16
@@ -23,7 +23,7 @@
 20 pascal16 DdeGetLastError(long) DdeGetLastError16
 21 pascal   DdeCreateStringHandle(long str s_word) DdeCreateStringHandle16
 22 pascal16 DdeFreeStringHandle(long long) DdeFreeStringHandle16
-23 stub DdeQueryString #(long word ptr long word) DdeQueryString
+23 pascal  DdeQueryString (long word ptr long word) DdeQueryString16
 24 pascal16 DdeKeepStringHandle(long long) DdeKeepStringHandle16
 
 26 pascal DdeEnableCallback(long word word) DdeEnableCallback16
diff --git a/include/ddeml.h b/include/ddeml.h
index a8f6f3f..0de1c6c 100644
--- a/include/ddeml.h
+++ b/include/ddeml.h
@@ -12,10 +12,23 @@
 
 /* Codepage Constants
  */
+
 #define CP_WINANSI      1004
 #define CP_WINUNICODE   1200
 
+/* DDE synchronisation constants 
+ */
+
 #define MSGF_DDEMGR 0x8001
+
+#define QID_SYNC16	-1L
+#define QID_SYNC	0xFFFFFFFF
+
+/*   Type variation for MS  deliberate departures from ANSI standards
+ */
+
+#define EXPENTRY CALLBACK
+
 /***************************************************
 
       FLAGS Section - copied from Microsoft SDK as must be standard, probably Copyright Microsoft Corporation
@@ -40,6 +53,8 @@
 #define     CBF_SKIP_DISCONNECTS         0x00200000
 #define     CBF_SKIP_ALLNOTIFICATIONS    0x003c0000
 
+#define     CBR_BLOCK			 0xFFFFFFFFL
+
 /*
  * Application command flags
  */
@@ -87,6 +102,57 @@
 
 /****************************************************
 
+	Message Types Section
+
+****************************************************/
+
+#define XTYPF_NOBLOCK		0x0002		/* CBR_NOBLOCK will not work */
+#define XTYPF_NODATA		0x0004		/* DDE_FDEFERUPD  */
+#define XTYPF_ACKREQ		0x0008		/* DDE_FACKREQ */
+
+#define XCLASS_MASK		0xFC00
+#define XCLASS_BOOL		0x1000
+#define XCLASS_DATA		0x2000
+#define XCLASS_FLAGS		0x4000
+#define	XCLASS_NOTIFICATION	0x8000
+
+#define XTYP_ADVDATA		(0x0010 | XCLASS_FLAGS)
+#define XTYP_XACT_COMPLETE	(0x0080 | XCLASS_NOTIFICATION )
+#define XTYP_REGISTER		(0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )
+#define XTYP_REQUEST		(0x00B0 | XCLASS_DATA )
+#define XTYP_DISCONNECT		(0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )
+#define XTYP_UNREGISTER		(0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )
+
+/**************************************************
+
+	End of Message Types Section
+
+****************************************************/
+
+/*****************************************************
+
+	DDE Codes for wStatus field
+
+*****************************************************/
+
+#define DDE_FACK		0x8000
+#define DDE_FBUSY		0x4000
+#define DDE_FDEFERUPD		0x4000
+#define DDE_FACKREQ		0x8000
+#define DDE_FRELEASE		0x2000
+#define DDE_FREQUESTED		0x1000
+#define DDE_FAPPSTATUS		0x00FF
+#define DDE_FNOTPROCESSED	0x0000
+
+
+/*****************************************************
+
+	End of wStatus codes
+
+*****************************************************/
+
+/****************************************************
+
       Return Codes section again copied from SDK as must be same
 
 *****************************************************/
@@ -130,6 +196,13 @@
 typedef DWORD HDDEDATA;
 typedef CHAR *LPTSTR;
 
+
+/*******************************************************
+
+	API Entry Points
+
+*******************************************************/
+
 typedef HDDEDATA (CALLBACK *PFNCALLBACK16)(UINT16,UINT16,HCONV,HSZ,HSZ,
                                            HDDEDATA,DWORD,DWORD);
 typedef HDDEDATA (CALLBACK *PFNCALLBACK)(UINT,UINT,HCONV,HSZ,HSZ,
@@ -161,6 +234,43 @@
     DWORD   dwSecurity;
 } CONVCONTEXT, *LPCONVCONTEXT;
 
+typedef struct
+{
+    DWORD		cb;
+    DWORD 		hUser;
+    HCONV		hConvPartner;
+    HSZ			hszSvcPartner;
+    HSZ			hszServiceReq;
+    HSZ			hszTopic;
+    HSZ			hszItem;
+    UINT16		wFmt;
+    UINT16		wType;
+    UINT16		wStatus;
+    UINT16		wConvst;
+    UINT16		wLastError;
+    HCONVLIST		hConvList;
+    CONVCONTEXT16	ConvCtxt;
+} CONVINFO16, *LPCONVINFO16;
+
+typedef struct
+{
+    DWORD		cb;
+    DWORD 		hUser;
+    HCONV		hConvPartner;
+    HSZ			hszSvcPartner;
+    HSZ			hszServiceReq;
+    HSZ			hszTopic;
+    HSZ			hszItem;
+    UINT		wFmt;
+    UINT		wType;
+    UINT		wStatus;
+    UINT		wConvst;
+    UINT		wLastError;
+    HCONVLIST		hConvList;
+    CONVCONTEXT		ConvCtxt;
+    HWND		hwnd;
+    HWND		hwndPartner;
+} CONVINFO, *LPCONVINFO;
 //  Internal data structures
 
       /*  entry for handle table     */
@@ -169,7 +279,7 @@
     BOOL16              Client_only;    // bit wasteful of space but it will be faster
     BOOL16		Unicode;	/* Flag to indicate Win32 API used to initialise */
     BOOL16		Win16;		/* flag to indicate Win16 API used to initialize */
-    LPDWORD            	Instance_id;  // needed to track monitor usage
+    DWORD            	Instance_id;  // needed to track monitor usage
     struct DDE_HANDLE_ENTRY    *Next_Entry;
     PFNCALLBACK	CallBack;
     DWORD               CBF_Flags;
diff --git a/include/winnt.h b/include/winnt.h
index 216e4a2..35e02c3 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -556,6 +556,18 @@
 } SECURITY_IMPERSONATION_LEVEL; 
 
 
+typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
+	* PSECURITY_CONTEXT_TRACKING_MODE;
+//
+//	Quality of Service
+//
+
+typedef struct _SECURITY_QUALITY_OF_SERVICE {
+  DWORD				Length;
+  SECURITY_IMPERSONATION_LEVEL	ImpersonationLevel;
+  SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+  BOOL				EffectiveOnly;
+} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
 
 /*
  * TOKEN_STATISTICS
diff --git a/misc/ddeml.c b/misc/ddeml.c
index 6ab81cc..8432b4b 100644
--- a/misc/ddeml.c
+++ b/misc/ddeml.c
@@ -17,6 +17,7 @@
 #include "heap.h"
 #include "shm_semaph.h"
 #include "debug.h"
+#include "winnt.h"
 
 /* Has defined in atom.c file.
  */
@@ -28,7 +29,7 @@
 
 
 static DDE_HANDLE_ENTRY *DDE_Handle_Table_Base = NULL;
-static LPDWORD 		DDE_Max_Assigned_Instance = 0;  // OK for present, may have to worry about wrap-around later
+static DWORD 		DDE_Max_Assigned_Instance = 0;  // OK for present, may have to worry about wrap-around later
 static const char	inst_string[]= "DDEMaxInstance";
 static LPCWSTR 		DDEInstanceAccess = (LPCWSTR)&inst_string;
 static const char	handle_string[] = "DDEHandleAccess";
@@ -42,7 +43,7 @@
 /*  typedef struct {
 	DWORD		nLength;
 	LPVOID		lpSecurityDescriptor;
-	BOOL32		bInheritHandle;
+	BOOL		bInheritHandle;
 }	SECURITY_ATTRIBUTES; */
 
 #define TRUE	1
@@ -206,6 +207,7 @@
  *  Vn       Date    	Author         		Comment
  *
  *  1.0      Jan 1999  Keith Matthews        Initial version
+ *  1.1	     Mar 1999  Keith Matthews	     Corrected Heap handling.
  *
  */
  DWORD Release_reserved_mutex (HANDLE mutex, LPTSTR mutex_name, BOOL release_handle_m, BOOL release_this_i )
@@ -214,7 +216,7 @@
         if ( (err_no=GetLastError()) != 0 )
         {
                 ERR(ddeml,"ReleaseMutex failed - %s mutex %li\n",mutex_name,err_no);
-                HeapFree(GetProcessHeap(), 0, this_instance);
+                HeapFree(SystemHeap, 0, this_instance);
 		if ( release_handle_m )
 		{
 			ReleaseMutex(handle_mutex);
@@ -223,7 +225,7 @@
          }
 	if ( release_this_i )
 	{
-                HeapFree(GetProcessHeap(), 0, this_instance);
+                HeapFree(SystemHeap, 0, this_instance);
 	}
 	return DMLERR_NO_ERROR;
 }
@@ -257,7 +259,7 @@
 		WaitForSingleObject(inst_count_mutex,1000); // subsequent calls
 		/*  FIXME  - needs refinement with popup for timeout, also is timeout interval OK */
 	}
-	if ( (err_no=GetLastError()) == ERROR_INVALID_HANDLE )
+	if ( (err_no=GetLastError()) != 0 )
 	{
 		ERR(ddeml,"CreateMutex failed - inst_count %li\n",err_no);
 		err_no=Release_reserved_mutex (handle_mutex,"handle_mutex",0,1);
@@ -275,23 +277,25 @@
 UINT16 WINAPI DdeInitialize16( LPDWORD pidInst, PFNCALLBACK16 pfnCallback,
                                DWORD afCmd, DWORD ulRes)
 {
+    TRACE(ddeml,"DdeInitialize16 called - calling DdeInitializeA\n");
     return (UINT16)DdeInitializeA(pidInst,(PFNCALLBACK)pfnCallback,
                                     afCmd, ulRes);
 }
 
 
 /******************************************************************************
- *            DdeInitialize32A   (USER32.106)
+ *            DdeInitializeA   (USER32.106)
  */
 UINT WINAPI DdeInitializeA( LPDWORD pidInst, PFNCALLBACK pfnCallback,
                                 DWORD afCmd, DWORD ulRes )
 {
+    TRACE(ddeml,"DdeInitializeA called - calling DdeInitializeW\n");
     return DdeInitializeW(pidInst,pfnCallback,afCmd,ulRes);
 }
 
 
 /******************************************************************************
- * DdeInitialize32W [USER32.107]
+ * DdeInitializeW [USER32.107]
  * Registers an application with the DDEML
  *
  * PARAMS
@@ -312,6 +316,7 @@
  *
  *  1.0      Pre 1998  Alexandre/Len	     Initial Stub
  *  1.1      Jan 1999  Keith Matthews        Initial (near-)complete version
+ *  1.2	     Mar 1999  Keith Matthews	     Corrected Heap handling, CreateMutex failure handling
  *
  */
 UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
@@ -333,6 +338,9 @@
     }
     if (!pfnCallback ) 
     {
+	/*  this one may be wrong - MS dll seems to accept the condition, leave this until we find out more !! */
+
+
         /* can't set up the instance with nothing to act as a callback */
         TRACE(ddeml,"No callback provided\n");
         return DMLERR_INVALIDPARAMETER; /* might be DMLERR_DLL_USAGE */
@@ -353,7 +361,7 @@
      // messy bit, spec implies that 'Client Only' can be set in 2 different ways, catch 1 here
 
      this_instance->Client_only=afCmd&APPCMD_CLIENTONLY;
-     this_instance->Instance_id = pidInst; // May need to add calling proc Id
+     this_instance->Instance_id = *pidInst; // May need to add calling proc Id
      this_instance->CallBack=*pfnCallback;
      this_instance->Txn_count=0;
      this_instance->Unicode = TRUE;
@@ -383,10 +391,10 @@
 	s_att->lpSecurityDescriptor = NULL;
 	s_att->nLength = sizeof(s_att);
 	handle_mutex = CreateMutexW(s_att,1,DDEHandleAccess);
-	if ( (err_no=GetLastError()) == ERROR_INVALID_HANDLE )
+	if ( (err_no=GetLastError()) != 0 )
 	{
 		ERR(ddeml,"CreateMutex failed - handle list  %li\n",err_no);
-                HeapFree(GetProcessHeap(), 0, this_instance);
+                HeapFree(SystemHeap, 0, this_instance);
 		return DMLERR_SYS_ERROR;
 	}
 	TRACE(ddeml,"Handle Mutex created/reserved\n");
@@ -472,7 +480,7 @@
 	     /*  FIXME  - needs refinement with popup for timeout, also is timeout interval OK */
 
                     ERR(ddeml,"WaitForSingleObject failed - handle list %li\n",err_no);
-                    HeapFree(GetProcessHeap(), 0, this_instance);
+                    HeapFree(SystemHeap, 0, this_instance);
                     return DMLERR_SYS_ERROR;
         }
         if (DDE_Handle_Table_Base == NULL ) 
@@ -480,13 +488,13 @@
 		if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) return DMLERR_SYS_ERROR;
         	return DMLERR_DLL_USAGE;
  	}
-        HeapFree(GetProcessHeap(), 0, this_instance); // finished - release heap space used as work store
+        HeapFree(SystemHeap, 0, this_instance); // finished - release heap space used as work store
         // can't reinitialise if we have initialised nothing !!
         reference_inst =  DDE_Handle_Table_Base;
         /* must first check if we have been given a valid instance to re-initialise !!  how do we do that ? */
 	while ( reference_inst->Next_Entry != NULL )
 	{
-		if ( pidInst == reference_inst->Instance_id && pfnCallback == reference_inst->CallBack )
+		if ( *pidInst == reference_inst->Instance_id && pfnCallback == reference_inst->CallBack )
 		{
 			// Check 1 - cannot change client-only mode if set via APPCMD_CLIENTONLY
 
@@ -546,7 +554,7 @@
 
 
 /*****************************************************************
- * DdeUninitialize32 [USER32.119]  Frees DDEML resources
+ * DdeUninitialize [USER32.119]  Frees DDEML resources
  *
  * PARAMS
  *    idInst [I] Instance identifier
@@ -581,7 +589,7 @@
 
 
 /******************************************************************************
- * DdeConnectList32 [USER32.93]  Establishes conversation with DDE servers
+ * DdeConnectList [USER32.93]  Establishes conversation with DDE servers
  *
  * PARAMS
  *    idInst     [I] Instance identifier
@@ -613,7 +621,7 @@
 
 
 /*****************************************************************
- * DdeQueryNextServer32 [USER32.112]
+ * DdeQueryNextServer [USER32.112]
  */
 HCONV WINAPI DdeQueryNextServer( HCONVLIST hConvList, HCONV hConvPrev )
 {
@@ -622,7 +630,16 @@
 }
 
 /*****************************************************************
- * DdeQueryString32A [USER32.113]
+ * DdeQueryStringA [USER32.113]
+ *
+ *****************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      Dec 1998  Corel/Macadamian    Initial version
+ *
  */
 DWORD WINAPI DdeQueryStringA(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, INT iCodePage)
 {
@@ -655,7 +672,16 @@
 }
 
 /*****************************************************************
- * DdeQueryString32W [USER32.114]
+ * DdeQueryStringW [USER32.114]
+ *
+ *****************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      Dec 1998  Corel/Macadamian    Initial version
+ *
  */
 DWORD WINAPI DdeQueryStringW(DWORD idInst, HSZ hsz, LPWSTR psz, DWORD cchMax, INT iCodePage)
 {
@@ -690,6 +716,30 @@
     return ret;
 }
 
+/*****************************************************************
+*
+*		DdeQueryString16 (DDEML.23)
+*
+******************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      March 1999 K Matthews		stub only
+ */
+
+DWORD DdeQueryString16(DWORD idInst, HSZ hsz, LPSTR lpsz, DWORD cchMax, int codepage)
+{
+	FIXME(ddeml,"(%ld, 0x%lx, %p, %ld, %d): stub \n", 
+         idInst,
+         hsz,
+         lpsz, 
+         cchMax,
+         codepage);
+	return 0;
+}
+
 
 /*****************************************************************
  *            DdeDisconnectList (DDEML.6)
@@ -701,7 +751,7 @@
 
 
 /******************************************************************************
- * DdeDisconnectList32 [USER32.98]  Destroys list and terminates conversations
+ * DdeDisconnectList [USER32.98]  Destroys list and terminates conversations
  *
  * RETURNS
  *    Success: TRUE
@@ -727,7 +777,7 @@
 
 
 /*****************************************************************
- *            DdeConnect32   (USER32.92)
+ *            DdeConnect   (USER32.92)
  */
 HCONV WINAPI DdeConnect( DWORD idInst, HSZ hszService, HSZ hszTopic,
                            LPCONVCONTEXT pCC )
@@ -747,7 +797,7 @@
 }
 
 /*****************************************************************
- *            DdeSetUserHandle (DDEML.10)
+ *            DdeSetUserHandle16 (DDEML.10)
  */
 BOOL16 WINAPI DdeSetUserHandle16( HCONV hConv, DWORD id, DWORD hUser )
 {
@@ -772,7 +822,7 @@
 }
 
 /*****************************************************************
- *            DdeCreateDataHandle32 (USER32.94)
+ *            DdeCreateDataHandle (USER32.94)
  */
 HDDEDATA WINAPI DdeCreateDataHandle( DWORD idInst, LPBYTE pSrc, DWORD cb, 
                                        DWORD cbOff, HSZ hszItem, UINT wFmt, 
@@ -792,7 +842,7 @@
 }
 
 /*****************************************************************
- *            DdeDisconnect32   (USER32.97)
+ *            DdeDisconnect   (USER32.97)
  */
 BOOL WINAPI DdeDisconnect( HCONV hConv )
 {
@@ -821,7 +871,7 @@
 
 
 /*****************************************************************
- * DdeCreateStringHandle32A [USER32.95]
+ * DdeCreateStringHandleA [USER32.95]
  *
  * RETURNS
  *    Success: String handle
@@ -846,7 +896,7 @@
 
 
 /******************************************************************************
- * DdeCreateStringHandle32W [USER32.96]  Creates handle to identify string
+ * DdeCreateStringHandleW [USER32.96]  Creates handle to identify string
  *
  * RETURNS
  *    Success: String handle
@@ -884,7 +934,7 @@
 
 
 /*****************************************************************
- *            DdeFreeStringHandle32   (USER32.101)
+ *            DdeFreeStringHandle   (USER32.101)
  * RETURNS: success: nonzero
  *          fail:    zero
  */
@@ -910,7 +960,7 @@
 
 
 /*****************************************************************
- *            DdeFreeDataHandle32   (USER32.100)
+ *            DdeFreeDataHandle   (USER32.100)
  */
 BOOL WINAPI DdeFreeDataHandle( HDDEDATA hData )
 {
@@ -931,7 +981,7 @@
 
 
 /*****************************************************************
- *            DdeKeepStringHandle32  (USER32.108)
+ *            DdeKeepStringHandle  (USER32.108)
  */
 BOOL WINAPI DdeKeepStringHandle( DWORD idInst, HSZ hsz )
 {
@@ -954,7 +1004,7 @@
 
 
 /*****************************************************************
- *            DdeClientTransaction32  (USER32.90)
+ *            DdeClientTransaction  (USER32.90)
  */
 HDDEDATA WINAPI DdeClientTransaction( LPBYTE pData, DWORD cbData,
                                         HCONV hConv, HSZ hszItem, UINT wFmt,
@@ -966,17 +1016,38 @@
 }
 
 /*****************************************************************
- *            DdeAbandonTransaction (DDEML.12)
+ *
+ *            DdeAbandonTransaction16 (DDEML.12)
+ *
  */
 BOOL16 WINAPI DdeAbandonTransaction16( DWORD idInst, HCONV hConv, 
                                      DWORD idTransaction )
 {
     FIXME( ddeml, "empty stub\n" );
-    return 0;
+    return TRUE;
 }
 
 
 /*****************************************************************
+ *
+ *            DdeAbandonTransaction (USER32.87)
+ *
+******************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      March 1999 K Matthews		stub only
+ */
+BOOL WINAPI DdeAbandonTransaction( DWORD idInst, HCONV hConv, 
+                                     DWORD idTransaction )
+{
+    FIXME( ddeml, "empty stub\n" );
+    return TRUE;
+}
+
+/*****************************************************************
  * DdePostAdvise16 [DDEML.13]
  */
 BOOL16 WINAPI DdePostAdvise16( DWORD idInst, HSZ hszTopic, HSZ hszItem )
@@ -986,7 +1057,7 @@
 
 
 /******************************************************************************
- * DdePostAdvise32 [USER32.110]  Send transaction to DDE callback function.
+ * DdePostAdvise [USER32.110]  Send transaction to DDE callback function.
  *
  * RETURNS
  *    Success: TRUE
@@ -1003,7 +1074,7 @@
 
 
 /*****************************************************************
- *            DdeAddData (DDEML.15)
+ *            DdeAddData16 (DDEML.15)
  */
 HDDEDATA WINAPI DdeAddData16( HDDEDATA hData, LPBYTE pSrc, DWORD cb,
                             DWORD cbOff )
@@ -1012,9 +1083,87 @@
     return 0;
 }
 
+/*****************************************************************
+ *
+ *            DdeAddData (USER32.89)
+ *
+******************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      March 1999 K Matthews		stub only
+ */
+HDDEDATA WINAPI DdeAddData( HDDEDATA hData, LPBYTE pSrc, DWORD cb,
+                            DWORD cbOff )
+{
+    FIXME( ddeml, "empty stub\n" );
+    return 0;
+}
+
+
+/*****************************************************************
+ *
+ *            DdeImpersonateClient (USER32.105)
+ *
+******************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      March 1999 K Matthews		stub only
+ */
+
+BOOL WINAPI DdeImpersonateClient( HCONV hConv)
+{
+    FIXME( ddeml, "empty stub\n" );
+    return TRUE;
+}
+
+
+/*****************************************************************
+ *
+ *            DdeSetQualityOfService (USER32.116)
+ *
+******************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      March 1999 K Matthews		stub only
+ */
+
+BOOL WINAPI DdeSetQualityOfService( HWND hwndClient, CONST SECURITY_QUALITY_OF_SERVICE *pqosNew,
+					PSECURITY_QUALITY_OF_SERVICE pqosPrev)
+{
+    FIXME( ddeml, "empty stub\n" );
+    return TRUE;
+}
+
+/*****************************************************************
+ *
+ *            DdeSetUserHandle (USER32.117)
+ *
+******************************************************************
+ *
+ *	Change History
+ *
+ *  Vn       Date    	Author         		Comment
+ *
+ *  1.0      March 1999 K Matthews		stub only
+ */
+
+BOOL WINAPI DdeSetUserHandle( HCONV hConv, DWORD id, DWORD hUser)
+{
+    FIXME( ddeml, "empty stub\n" );
+    return TRUE;
+}
 
 /******************************************************************************
- * DdeGetData32 [USER32.102]  Copies data from DDE object ot local buffer
+ * DdeGetData [USER32.102]  Copies data from DDE object ot local buffer
  *
  * RETURNS
  *    Size of memory object associated with handle
@@ -1052,7 +1201,7 @@
 }
 
 /*****************************************************************
- *            DdeAccessData32 (USER32.88)
+ *            DdeAccessData (USER32.88)
  */
 LPBYTE WINAPI DdeAccessData( HDDEDATA hData, LPDWORD pcbDataSize )
 {
@@ -1069,7 +1218,7 @@
 }
 
 /*****************************************************************
- *            DdeUnaccessData32 (USER32.118)
+ *            DdeUnaccessData (USER32.118)
  */
 BOOL WINAPI DdeUnaccessData( HDDEDATA hData )
 {
@@ -1087,7 +1236,7 @@
 }
 
 /*****************************************************************
- *            DdeEnableCallback32 (USER32.99)
+ *            DdeEnableCallback (USER32.99)
  */
 BOOL WINAPI DdeEnableCallback( DWORD idInst, HCONV hConv, UINT wCmd )
 {
@@ -1107,7 +1256,7 @@
 
 
 /******************************************************************************
- * DdeNameService32 [USER32.109]  {Un}registers service name of DDE server
+ * DdeNameService [USER32.109]  {Un}registers service name of DDE server
  *
  * PARAMS
  *    idInst [I] Instance identifier
@@ -1137,7 +1286,7 @@
 
 
 /******************************************************************************
- * DdeGetLastError32 [USER32.103]  Gets most recent error code
+ * DdeGetLastError [USER32.103]  Gets most recent error code
  *
  * PARAMS
  *    idInst [I] Instance identifier
@@ -1161,7 +1310,7 @@
 }
 
 /*****************************************************************
- *            DdeCmpStringHandles32 (USER32.91)
+ *            DdeCmpStringHandles (USER32.91)
  *
  * Compares the value of two string handles.  This comparison is
  * not case sensitive.
@@ -1277,3 +1426,24 @@
     FIXME(ddeml, "stub.\n");
     return 0;
 } 
+
+/******************************************************************
+ *		DdeQueryConvInfo16 (DDEML.9)
+ *
+ */
+UINT16 WINAPI DdeQueryConvInfo16( HCONV hconv, DWORD idTransaction , LPCONVINFO16 lpConvInfo)
+{
+	FIXME(ddeml,"stub.\n");
+	return 0;
+}
+
+
+/******************************************************************
+ *		DdeQueryConvInfo (USER32.111)
+ *
+ */
+UINT WINAPI DdeQueryConvInfo( HCONV hconv, DWORD idTransaction , LPCONVINFO lpConvInfo)
+{
+	FIXME(ddeml,"stub.\n");
+	return 0;
+}
diff --git a/relay32/user32.spec b/relay32/user32.spec
index 559720c..d33151f 100644
--- a/relay32/user32.spec
+++ b/relay32/user32.spec
@@ -88,9 +88,9 @@
  84 stdcall CreateWindowExW(long wstr wstr long long long long long long long long ptr) CreateWindowExW
  85 stub CreateWindowStationA
  86 stdcall CreateWindowStationW(wstr long long ptr) CreateWindowStationW
- 87 stub DdeAbandonTransaction
+ 87 stdcall DdeAbandonTransaction(long long long)DdeAbandonTransaction
  88 stdcall DdeAccessData(long ptr) DdeAccessData
- 89 stub DdeAddData
+ 89 stdcall DdeAddData(long ptr long long) DdeAddData
  90 stdcall DdeClientTransaction(ptr long long long long long long ptr) DdeClientTransaction
  91 stdcall DdeCmpStringHandles(long long) DdeCmpStringHandles
  92 stdcall DdeConnect(long long long ptr) DdeConnect
@@ -106,19 +106,19 @@
 102 stdcall DdeGetData(long ptr long long) DdeGetData
 103 stdcall DdeGetLastError(long) DdeGetLastError
 104 stub DdeGetQualityOfService
-105 stub DdeImpersonateClient
+105 stdcall DdeImpersonateClient(long) DdeImpersonateClient
 106 stdcall DdeInitializeA(ptr ptr long long) DdeInitializeA
 107 stdcall DdeInitializeW(ptr ptr long long) DdeInitializeW
 108 stdcall DdeKeepStringHandle(long long) DdeKeepStringHandle
 109 stdcall DdeNameService(long long long long) DdeNameService
 110 stdcall DdePostAdvise(long long long) DdePostAdvise
-111 stub DdeQueryConvInfo
+111 stdcall DdeQueryConvInfo(long long ptr) DdeQueryConvInfo
 112 stdcall DdeQueryNextServer(long long) DdeQueryNextServer
 113 stdcall DdeQueryStringA(long long ptr long long) DdeQueryStringA
 114 stdcall DdeQueryStringW(long long ptr long long) DdeQueryStringW
 115 stdcall DdeReconnect(long) DdeReconnect
-116 stub DdeSetQualityOfService
-117 stub DdeSetUserHandle
+116 stdcall DdeSetQualityOfService(long ptr ptr) DdeSetQualityOfService
+117 stdcall DdeSetUserHandle (long long long) DdeSetUserHandle
 118 stdcall DdeUnaccessData(long) DdeUnaccessData
 119 stdcall DdeUninitialize(long) DdeUninitialize
 120 stdcall DefDlgProcA(long long long long) DefDlgProcA