From 397964746fc15f39ac7398cfa9821f7e4fd5cdff Mon Sep 17 00:00:00 2001
From: Keith Matthews <keith_m@sweeney.demon.co.uk>
Date: Sat, 13 Mar 1999 12:53:39 +0000
Subject: [PATCH] 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.

---
 if1632/ddeml.spec   |   4 +-
 include/ddeml.h     | 112 +++++++++++++++++++-
 include/winnt.h     |  12 +++
 misc/ddeml.c        | 250 +++++++++++++++++++++++++++++++++++++-------
 relay32/user32.spec |  12 +--
 5 files changed, 341 insertions(+), 49 deletions(-)

diff --git a/if1632/ddeml.spec b/if1632/ddeml.spec
index 6a89e419f0b..992c8b7fd24 100644
--- a/if1632/ddeml.spec
+++ b/if1632/ddeml.spec
@@ -8,7 +8,7 @@ type	win16
 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 @@ type	win16
 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 a8f6f3f710d..0de1c6cf063 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
  */
@@ -85,6 +100,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 HSZ;
 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 @@ typedef struct
     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 @@ typedef struct DDE_HANDLE_ENTRY {
     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 216e4a2a401..35e02c334f7 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -556,6 +556,18 @@ typedef enum _SECURITY_IMPERSONATION_LEVEL {
 } 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 6ab81ccda3b..8432b4b3edf 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 @@ static HANDLE	     	handle_mutex = 0;
 /*  typedef struct {
 	DWORD		nLength;
 	LPVOID		lpSecurityDescriptor;
-	BOOL32		bInheritHandle;
+	BOOL		bInheritHandle;
 }	SECURITY_ATTRIBUTES; */
 
 #define TRUE	1
@@ -206,6 +207,7 @@ static void InsertHSZNode( DWORD idInst, HSZ hsz )
  *  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 @@ static void InsertHSZNode( DWORD idInst, HSZ hsz )
         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 @@ static void InsertHSZNode( DWORD idInst, HSZ hsz )
          }
 	if ( release_this_i )
 	{
-                HeapFree(GetProcessHeap(), 0, this_instance);
+                HeapFree(SystemHeap, 0, this_instance);
 	}
 	return DMLERR_NO_ERROR;
 }
@@ -257,7 +259,7 @@ DWORD IncrementInstanceId()
 		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 @@ DWORD IncrementInstanceId()
 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 @@ UINT WINAPI DdeInitializeA( LPDWORD pidInst, PFNCALLBACK pfnCallback,
  *
  *  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 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
     }
     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 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
      // 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 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
 	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 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
 	     /*  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 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
 		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 @@ BOOL16 WINAPI DdeUninitialize16( DWORD idInst )
 
 
 /*****************************************************************
- * DdeUninitialize32 [USER32.119]  Frees DDEML resources
+ * DdeUninitialize [USER32.119]  Frees DDEML resources
  *
  * PARAMS
  *    idInst [I] Instance identifier
@@ -581,7 +589,7 @@ HCONVLIST WINAPI DdeConnectList16( DWORD idInst, HSZ hszService, HSZ hszTopic,
 
 
 /******************************************************************************
- * 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 @@ HCONV WINAPI DdeQueryNextServer16( HCONVLIST hConvList, HCONV hConvPrev )
 
 
 /*****************************************************************
- * DdeQueryNextServer32 [USER32.112]
+ * DdeQueryNextServer [USER32.112]
  */
 HCONV WINAPI DdeQueryNextServer( HCONVLIST hConvList, HCONV hConvPrev )
 {
@@ -622,7 +630,16 @@ HCONV WINAPI DdeQueryNextServer( HCONVLIST hConvList, HCONV hConvPrev )
 }
 
 /*****************************************************************
- * 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 @@ DWORD WINAPI DdeQueryStringA(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, INT
 }
 
 /*****************************************************************
- * 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 @@ DWORD WINAPI DdeQueryStringW(DWORD idInst, HSZ hsz, LPWSTR psz, DWORD cchMax, IN
     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 @@ BOOL16 WINAPI DdeDisconnectList16( HCONVLIST hConvList )
 
 
 /******************************************************************************
- * DdeDisconnectList32 [USER32.98]  Destroys list and terminates conversations
+ * DdeDisconnectList [USER32.98]  Destroys list and terminates conversations
  *
  * RETURNS
  *    Success: TRUE
@@ -727,7 +777,7 @@ HCONV WINAPI DdeConnect16( DWORD idInst, HSZ hszService, HSZ hszTopic,
 
 
 /*****************************************************************
- *            DdeConnect32   (USER32.92)
+ *            DdeConnect   (USER32.92)
  */
 HCONV WINAPI DdeConnect( DWORD idInst, HSZ hszService, HSZ hszTopic,
                            LPCONVCONTEXT pCC )
@@ -747,7 +797,7 @@ BOOL16 WINAPI DdeDisconnect16( HCONV hConv )
 }
 
 /*****************************************************************
- *            DdeSetUserHandle (DDEML.10)
+ *            DdeSetUserHandle16 (DDEML.10)
  */
 BOOL16 WINAPI DdeSetUserHandle16( HCONV hConv, DWORD id, DWORD hUser )
 {
@@ -772,7 +822,7 @@ HDDEDATA WINAPI DdeCreateDataHandle16( DWORD idInst, LPBYTE pSrc, DWORD cb,
 }
 
 /*****************************************************************
- *            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 @@ HDDEDATA WINAPI DdeCreateDataHandle( DWORD idInst, LPBYTE pSrc, DWORD cb,
 }
 
 /*****************************************************************
- *            DdeDisconnect32   (USER32.97)
+ *            DdeDisconnect   (USER32.97)
  */
 BOOL WINAPI DdeDisconnect( HCONV hConv )
 {
@@ -821,7 +871,7 @@ HSZ WINAPI DdeCreateStringHandle16( DWORD idInst, LPCSTR str, INT16 codepage )
 
 
 /*****************************************************************
- * DdeCreateStringHandle32A [USER32.95]
+ * DdeCreateStringHandleA [USER32.95]
  *
  * RETURNS
  *    Success: String handle
@@ -846,7 +896,7 @@ HSZ WINAPI DdeCreateStringHandleA( DWORD idInst, LPCSTR psz, INT codepage )
 
 
 /******************************************************************************
- * DdeCreateStringHandle32W [USER32.96]  Creates handle to identify string
+ * DdeCreateStringHandleW [USER32.96]  Creates handle to identify string
  *
  * RETURNS
  *    Success: String handle
@@ -884,7 +934,7 @@ BOOL16 WINAPI DdeFreeStringHandle16( DWORD idInst, HSZ hsz )
 
 
 /*****************************************************************
- *            DdeFreeStringHandle32   (USER32.101)
+ *            DdeFreeStringHandle   (USER32.101)
  * RETURNS: success: nonzero
  *          fail:    zero
  */
@@ -910,7 +960,7 @@ BOOL16 WINAPI DdeFreeDataHandle16( HDDEDATA hData )
 
 
 /*****************************************************************
- *            DdeFreeDataHandle32   (USER32.100)
+ *            DdeFreeDataHandle   (USER32.100)
  */
 BOOL WINAPI DdeFreeDataHandle( HDDEDATA hData )
 {
@@ -931,7 +981,7 @@ BOOL16 WINAPI DdeKeepStringHandle16( DWORD idInst, HSZ hsz )
 
 
 /*****************************************************************
- *            DdeKeepStringHandle32  (USER32.108)
+ *            DdeKeepStringHandle  (USER32.108)
  */
 BOOL WINAPI DdeKeepStringHandle( DWORD idInst, HSZ hsz )
 {
@@ -954,7 +1004,7 @@ HDDEDATA WINAPI DdeClientTransaction16( LPVOID pData, DWORD cbData,
 
 
 /*****************************************************************
- *            DdeClientTransaction32  (USER32.90)
+ *            DdeClientTransaction  (USER32.90)
  */
 HDDEDATA WINAPI DdeClientTransaction( LPBYTE pData, DWORD cbData,
                                         HCONV hConv, HSZ hszItem, UINT wFmt,
@@ -966,16 +1016,37 @@ HDDEDATA WINAPI DdeClientTransaction( LPBYTE pData, DWORD cbData,
 }
 
 /*****************************************************************
- *            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]
  */
@@ -986,7 +1057,7 @@ BOOL16 WINAPI DdePostAdvise16( DWORD idInst, HSZ hszTopic, HSZ hszItem )
 
 
 /******************************************************************************
- * 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 @@ BOOL WINAPI DdePostAdvise(
 
 
 /*****************************************************************
- *            DdeAddData (DDEML.15)
+ *            DdeAddData16 (DDEML.15)
  */
 HDDEDATA WINAPI DdeAddData16( HDDEDATA hData, LPBYTE pSrc, DWORD cb,
                             DWORD cbOff )
@@ -1012,9 +1083,87 @@ HDDEDATA WINAPI DdeAddData16( HDDEDATA hData, LPBYTE pSrc, DWORD cb,
     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 @@ LPBYTE WINAPI DdeAccessData16( HDDEDATA hData, LPDWORD pcbDataSize )
 }
 
 /*****************************************************************
- *            DdeAccessData32 (USER32.88)
+ *            DdeAccessData (USER32.88)
  */
 LPBYTE WINAPI DdeAccessData( HDDEDATA hData, LPDWORD pcbDataSize )
 {
@@ -1069,7 +1218,7 @@ BOOL16 WINAPI DdeUnaccessData16( HDDEDATA hData )
 }
 
 /*****************************************************************
- *            DdeUnaccessData32 (USER32.118)
+ *            DdeUnaccessData (USER32.118)
  */
 BOOL WINAPI DdeUnaccessData( HDDEDATA hData )
 {
@@ -1087,7 +1236,7 @@ BOOL16 WINAPI DdeEnableCallback16( DWORD idInst, HCONV hConv, UINT16 wCmd )
 }
 
 /*****************************************************************
- *            DdeEnableCallback32 (USER32.99)
+ *            DdeEnableCallback (USER32.99)
  */
 BOOL WINAPI DdeEnableCallback( DWORD idInst, HCONV hConv, UINT wCmd )
 {
@@ -1107,7 +1256,7 @@ HDDEDATA WINAPI DdeNameService16( DWORD idInst, HSZ hsz1, HSZ hsz2,
 
 
 /******************************************************************************
- * 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 @@ UINT16 WINAPI DdeGetLastError16( DWORD idInst )
 
 
 /******************************************************************************
- * 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 @@ int WINAPI DdeCmpStringHandles16( HSZ hsz1, HSZ hsz2 )
 }
 
 /*****************************************************************
- *            DdeCmpStringHandles32 (USER32.91)
+ *            DdeCmpStringHandles (USER32.91)
  *
  * Compares the value of two string handles.  This comparison is
  * not case sensitive.
@@ -1277,3 +1426,24 @@ UINT WINAPI ReuseDDElParam(UINT lParam, UINT msgIn, UINT msgOut,
     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 559720c4200..d33151f91c8 100644
--- a/relay32/user32.spec
+++ b/relay32/user32.spec
@@ -88,9 +88,9 @@ init	MAIN_UserInit
  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 @@ init	MAIN_UserInit
 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
-- 
GitLab