Minor bug fixes in DdeNameService, also changes to move towards

process-safe code.
This commit is contained in:
Keith Matthews 1999-07-15 16:08:32 +00:00 committed by Alexandre Julliard
parent 767b099fe8
commit f73b72b557

View File

@ -82,11 +82,6 @@ static const char handle_string[] = "DDEHandleAccess";
static LPCWSTR DDEHandleAccess = (LPCWSTR)&handle_string; static LPCWSTR DDEHandleAccess = (LPCWSTR)&handle_string;
static HANDLE inst_count_mutex = 0; static HANDLE inst_count_mutex = 0;
static HANDLE handle_mutex = 0; static HANDLE handle_mutex = 0;
DDE_HANDLE_ENTRY *this_instance;
SECURITY_ATTRIBUTES *s_att= NULL;
DWORD err_no = 0;
DWORD prev_err = 0;
DDE_HANDLE_ENTRY *reference_inst;
#define TRUE 1 #define TRUE 1
#define FALSE 0 #define FALSE 0
@ -107,7 +102,7 @@ static HANDLE handle_mutex = 0;
* 1.1 Mar 1999 Keith Matthews Added multiple instance handling * 1.1 Mar 1999 Keith Matthews Added multiple instance handling
* *
*/ */
static void RemoveHSZNode( HSZ hsz ) static void RemoveHSZNode( HSZ hsz, DDE_HANDLE_ENTRY * reference_inst )
{ {
HSZNode* pPrev = NULL; HSZNode* pPrev = NULL;
HSZNode* pCurrent = NULL; HSZNode* pCurrent = NULL;
@ -169,7 +164,7 @@ static void RemoveHSZNode( HSZ hsz )
* 1.1 Mar 1999 Keith Matthews Added multiple instance handling * 1.1 Mar 1999 Keith Matthews Added multiple instance handling
* *
*/ */
static void FreeAndRemoveHSZNodes( DWORD idInst ) static void FreeAndRemoveHSZNodes( DWORD idInst, DDE_HANDLE_ENTRY * reference_inst )
{ {
/* Free any strings created in this instance. /* Free any strings created in this instance.
*/ */
@ -195,7 +190,7 @@ static void FreeAndRemoveHSZNodes( DWORD idInst )
* 1.2 Jun 1999 Keith Matthews Added Usage count handling * 1.2 Jun 1999 Keith Matthews Added Usage count handling
* *
*/ */
static void InsertHSZNode( HSZ hsz ) static void InsertHSZNode( HSZ hsz, DDE_HANDLE_ENTRY * reference_inst )
{ {
if( hsz != 0 ) if( hsz != 0 )
{ {
@ -239,6 +234,7 @@ static void InsertHSZNode( HSZ hsz )
*/ */
DDE_HANDLE_ENTRY *Find_Instance_Entry (DWORD InstId) DDE_HANDLE_ENTRY *Find_Instance_Entry (DWORD InstId)
{ {
DDE_HANDLE_ENTRY * reference_inst;
reference_inst = DDE_Handle_Table_Base; reference_inst = DDE_Handle_Table_Base;
while ( reference_inst != NULL ) while ( reference_inst != NULL )
{ {
@ -302,8 +298,10 @@ static void InsertHSZNode( HSZ hsz )
* 1.1 Mar 1999 Keith Matthews Corrected Heap handling. Corrected re-initialisation handling * 1.1 Mar 1999 Keith Matthews Corrected Heap handling. Corrected re-initialisation handling
* *
*/ */
static DWORD Release_reserved_mutex (HANDLE mutex, LPSTR mutex_name, BOOL release_handle_m, BOOL release_this_i ) static DWORD Release_reserved_mutex (HANDLE mutex, LPSTR mutex_name, BOOL release_handle_m, BOOL release_this_i ,
DDE_HANDLE_ENTRY *this_instance)
{ {
DWORD err_no = 0;
ReleaseMutex(mutex); ReleaseMutex(mutex);
if ( (err_no=GetLastError()) != 0 ) if ( (err_no=GetLastError()) != 0 )
{ {
@ -336,9 +334,10 @@ static DWORD Release_reserved_mutex (HANDLE mutex, LPSTR mutex_name, BOOL releas
* 1.0 Jan 1999 Keith Matthews Initial version * 1.0 Jan 1999 Keith Matthews Initial version
* *
*/ */
DWORD IncrementInstanceId() DWORD IncrementInstanceId( DDE_HANDLE_ENTRY *this_instance)
{ {
SECURITY_ATTRIBUTES s_attrib; SECURITY_ATTRIBUTES s_attrib;
DWORD err_no = 0;
/* Need to set up Mutex in case it is not already present */ /* Need to set up Mutex in case it is not already present */
/* increment handle count & get value */ /* increment handle count & get value */
if ( !inst_count_mutex ) if ( !inst_count_mutex )
@ -354,13 +353,13 @@ DWORD IncrementInstanceId()
if ( (err_no=GetLastError()) != 0 ) if ( (err_no=GetLastError()) != 0 )
{ {
ERR("CreateMutex failed - inst_count %li\n",err_no); ERR("CreateMutex failed - inst_count %li\n",err_no);
err_no=Release_reserved_mutex (handle_mutex,"handle_mutex",0,1); err_no=Release_reserved_mutex (handle_mutex,"handle_mutex",0,1,this_instance);
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
} }
DDE_Max_Assigned_Instance++; DDE_Max_Assigned_Instance++;
this_instance->Instance_id = DDE_Max_Assigned_Instance; this_instance->Instance_id = DDE_Max_Assigned_Instance;
TRACE("New instance id %ld allocated\n",DDE_Max_Assigned_Instance); TRACE("New instance id %ld allocated\n",DDE_Max_Assigned_Instance);
if (Release_reserved_mutex(inst_count_mutex,"instance_count",1,0)) return DMLERR_SYS_ERROR; if (Release_reserved_mutex(inst_count_mutex,"instance_count",1,0,this_instance)) return DMLERR_SYS_ERROR;
return DMLERR_NO_ERROR; return DMLERR_NO_ERROR;
} }
@ -510,7 +509,11 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
/* probably not really capable of handling mutliple processes, but should handle /* probably not really capable of handling mutliple processes, but should handle
* multiple instances within one process */ * multiple instances within one process */
SECURITY_ATTRIBUTES *s_att= NULL;
SECURITY_ATTRIBUTES s_attrib; SECURITY_ATTRIBUTES s_attrib;
DWORD err_no = 0;
DDE_HANDLE_ENTRY *this_instance;
DDE_HANDLE_ENTRY *reference_inst;
s_att = &s_attrib; s_att = &s_attrib;
if( ulRes ) if( ulRes )
@ -618,7 +621,8 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
this_instance->CBF_Flags=this_instance->CBF_Flags|APPCMD_FILTERINITS; this_instance->CBF_Flags=this_instance->CBF_Flags|APPCMD_FILTERINITS;
TRACE("First application instance detected OK\n"); TRACE("First application instance detected OK\n");
/* allocate new instance ID */ /* allocate new instance ID */
if ((err_no = IncrementInstanceId()) ) return err_no; if ((err_no = IncrementInstanceId( this_instance)) ) return err_no;
} else { } else {
/* really need to chain the new one in to the latest here, but after checking conditions /* really need to chain the new one in to the latest here, but after checking conditions
* such as trying to start a conversation from an application trying to monitor */ * such as trying to start a conversation from an application trying to monitor */
@ -639,7 +643,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
if ( this_instance->Client_only != reference_inst->Client_only) if ( this_instance->Client_only != reference_inst->Client_only)
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
return DMLERR_DLL_USAGE; return DMLERR_DLL_USAGE;
} }
@ -648,7 +652,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
if ( this_instance->Monitor != reference_inst->Monitor) if ( this_instance->Monitor != reference_inst->Monitor)
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
return DMLERR_INVALIDPARAMETER; return DMLERR_INVALIDPARAMETER;
} }
@ -657,7 +661,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
if ( this_instance->CallBack == reference_inst->CallBack) if ( this_instance->CallBack == reference_inst->CallBack)
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
return DMLERR_DLL_USAGE; return DMLERR_DLL_USAGE;
} }
@ -667,8 +671,8 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
/* All cleared, add to chain */ /* All cleared, add to chain */
TRACE("Application Instance checks finished\n"); TRACE("Application Instance checks finished\n");
if ((err_no = IncrementInstanceId())) return err_no; if ((err_no = IncrementInstanceId( this_instance)) ) return err_no;
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,0)) return DMLERR_SYS_ERROR; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,0,this_instance)) return DMLERR_SYS_ERROR;
reference_inst->Next_Entry = this_instance; reference_inst->Next_Entry = this_instance;
} }
*pidInst = this_instance->Instance_id; *pidInst = this_instance->Instance_id;
@ -688,7 +692,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
} }
if (DDE_Handle_Table_Base == NULL ) if (DDE_Handle_Table_Base == NULL )
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) return DMLERR_SYS_ERROR; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance)) return DMLERR_SYS_ERROR;
return DMLERR_DLL_USAGE; return DMLERR_DLL_USAGE;
} }
HeapFree(SystemHeap, 0, this_instance); /* finished - release heap space used as work store */ HeapFree(SystemHeap, 0, this_instance); /* finished - release heap space used as work store */
@ -713,7 +717,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
if ( ! ( afCmd & APPCMD_CLIENTONLY)) if ( ! ( afCmd & APPCMD_CLIENTONLY))
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
return DMLERR_DLL_USAGE; return DMLERR_DLL_USAGE;
} }
@ -723,7 +727,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
if ( this_instance->Monitor != reference_inst->Monitor) if ( this_instance->Monitor != reference_inst->Monitor)
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
return DMLERR_DLL_USAGE; return DMLERR_DLL_USAGE;
} }
@ -732,7 +736,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
if (( afCmd&APPCMD_CLIENTONLY) && ! reference_inst->Client_only ) if (( afCmd&APPCMD_CLIENTONLY) && ! reference_inst->Client_only )
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
return DMLERR_DLL_USAGE; return DMLERR_DLL_USAGE;
} }
@ -746,7 +750,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
* *
* Manual does not say what we do, cannot return DMLERR_NOT_INITIALIZED so what ? * Manual does not say what we do, cannot return DMLERR_NOT_INITIALIZED so what ?
*/ */
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
return DMLERR_INVALIDPARAMETER; return DMLERR_INVALIDPARAMETER;
} }
@ -755,7 +759,7 @@ UINT WINAPI DdeInitializeW( LPDWORD pidInst, PFNCALLBACK pfnCallback,
reference_inst->CBF_Flags = this_instance->CBF_Flags; reference_inst->CBF_Flags = this_instance->CBF_Flags;
reference_inst->Client_only = this_instance->Client_only; reference_inst->Client_only = this_instance->Client_only;
reference_inst->Monitor_flags = this_instance->Monitor_flags; reference_inst->Monitor_flags = this_instance->Monitor_flags;
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",0,1,this_instance))
return DMLERR_SYS_ERROR; return DMLERR_SYS_ERROR;
} }
@ -788,7 +792,11 @@ BOOL WINAPI DdeUninitialize( DWORD idInst )
{ {
/* Stage one - check if we have a handle for this instance /* Stage one - check if we have a handle for this instance
*/ */
DWORD err_no = 0;
SECURITY_ATTRIBUTES *s_att= NULL;
SECURITY_ATTRIBUTES s_attrib; SECURITY_ATTRIBUTES s_attrib;
DDE_HANDLE_ENTRY *this_instance;
DDE_HANDLE_ENTRY *reference_inst;
s_att = &s_attrib; s_att = &s_attrib;
if ( DDE_Max_Assigned_Instance == 0 ) if ( DDE_Max_Assigned_Instance == 0 )
@ -810,7 +818,7 @@ BOOL WINAPI DdeUninitialize( DWORD idInst )
this_instance = Find_Instance_Entry(idInst); this_instance = Find_Instance_Entry(idInst);
if ( this_instance == NULL ) if ( this_instance == NULL )
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return FALSE; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance)) return FALSE;
/* /*
* Needs something here to record NOT_INITIALIZED ready for DdeGetLastError * Needs something here to record NOT_INITIALIZED ready for DdeGetLastError
*/ */
@ -825,7 +833,7 @@ BOOL WINAPI DdeUninitialize( DWORD idInst )
/* Free the nodes that were not freed by this instance /* Free the nodes that were not freed by this instance
* and remove the nodes from the list of HSZ nodes. * and remove the nodes from the list of HSZ nodes.
*/ */
FreeAndRemoveHSZNodes( idInst ); FreeAndRemoveHSZNodes( idInst, this_instance );
/* OK now delete the instance handle itself */ /* OK now delete the instance handle itself */
@ -838,7 +846,7 @@ BOOL WINAPI DdeUninitialize( DWORD idInst )
{ {
/* general case /* general case
*/ */
reference_inst->Next_Entry = DDE_Handle_Table_Base; reference_inst = DDE_Handle_Table_Base;
while ( reference_inst->Next_Entry != this_instance ) while ( reference_inst->Next_Entry != this_instance )
{ {
reference_inst = this_instance->Next_Entry; reference_inst = this_instance->Next_Entry;
@ -847,7 +855,7 @@ BOOL WINAPI DdeUninitialize( DWORD idInst )
} }
/* release the mutex and the heap entry /* release the mutex and the heap entry
*/ */
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,TRUE)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,TRUE,this_instance))
{ {
/* should record something here, but nothing left to hang it from !! /* should record something here, but nothing left to hang it from !!
*/ */
@ -925,8 +933,10 @@ HCONV WINAPI DdeQueryNextServer( HCONVLIST hConvList, HCONV hConvPrev )
*/ */
DWORD WINAPI DdeQueryStringA(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, INT iCodePage) DWORD WINAPI DdeQueryStringA(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, INT iCodePage)
{ {
DWORD err_no = 0;
DWORD ret = 0; DWORD ret = 0;
CHAR pString[MAX_BUFFER_LEN]; CHAR pString[MAX_BUFFER_LEN];
DDE_HANDLE_ENTRY *reference_inst;
FIXME( FIXME(
"(%ld, 0x%lx, %p, %ld, %d): partial stub\n", "(%ld, 0x%lx, %p, %ld, %d): partial stub\n",
@ -957,7 +967,7 @@ DWORD WINAPI DdeQueryStringA(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, INT
reference_inst = Find_Instance_Entry(idInst); reference_inst = Find_Instance_Entry(idInst);
if ( reference_inst == NULL ) if ( reference_inst == NULL )
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return FALSE; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst)) return FALSE;
/* /*
Needs something here to record NOT_INITIALIZED ready for DdeGetLastError Needs something here to record NOT_INITIALIZED ready for DdeGetLastError
*/ */
@ -977,7 +987,7 @@ DWORD WINAPI DdeQueryStringA(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, INT
ret = GlobalGetAtomNameA( hsz, (LPSTR)psz, cchMax ); ret = GlobalGetAtomNameA( hsz, (LPSTR)psz, cchMax );
} else { } else {
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst);
} }
TRACE("returning pointer\n"); TRACE("returning pointer\n");
return ret; return ret;
@ -1218,7 +1228,9 @@ HSZ WINAPI DdeCreateStringHandle16( DWORD idInst, LPCSTR str, INT16 codepage )
*/ */
HSZ WINAPI DdeCreateStringHandleA( DWORD idInst, LPCSTR psz, INT codepage ) HSZ WINAPI DdeCreateStringHandleA( DWORD idInst, LPCSTR psz, INT codepage )
{ {
DWORD err_no = 0;
HSZ hsz = 0; HSZ hsz = 0;
DDE_HANDLE_ENTRY *reference_inst;
TRACE("(%ld,%s,%d): partial stub\n",idInst,debugstr_a(psz),codepage); TRACE("(%ld,%s,%d): partial stub\n",idInst,debugstr_a(psz),codepage);
@ -1242,7 +1254,7 @@ HSZ WINAPI DdeCreateStringHandleA( DWORD idInst, LPCSTR psz, INT codepage )
reference_inst = Find_Instance_Entry(idInst); reference_inst = Find_Instance_Entry(idInst);
if ( reference_inst == NULL ) if ( reference_inst == NULL )
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return 0; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst)) return 0;
/* /*
Needs something here to record NOT_INITIALIZED ready for DdeGetLastError Needs something here to record NOT_INITIALIZED ready for DdeGetLastError
*/ */
@ -1256,8 +1268,8 @@ HSZ WINAPI DdeCreateStringHandleA( DWORD idInst, LPCSTR psz, INT codepage )
* uninitialize is called. * uninitialize is called.
*/ */
TRACE("added atom %s with HSZ 0x%lx, \n",debugstr_a(psz),hsz); TRACE("added atom %s with HSZ 0x%lx, \n",debugstr_a(psz),hsz);
InsertHSZNode( hsz ); InsertHSZNode( hsz, reference_inst );
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst))
{ {
reference_inst->Last_Error = DMLERR_SYS_ERROR; reference_inst->Last_Error = DMLERR_SYS_ERROR;
return 0; return 0;
@ -1265,7 +1277,7 @@ HSZ WINAPI DdeCreateStringHandleA( DWORD idInst, LPCSTR psz, INT codepage )
TRACE("Returning pointer\n"); TRACE("Returning pointer\n");
return hsz; return hsz;
} else { } else {
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst);
} }
TRACE("Returning error\n"); TRACE("Returning error\n");
return 0; return 0;
@ -1294,6 +1306,8 @@ HSZ WINAPI DdeCreateStringHandleW(
LPCWSTR psz, /* [in] Pointer to string */ LPCWSTR psz, /* [in] Pointer to string */
INT codepage) /* [in] Code page identifier */ INT codepage) /* [in] Code page identifier */
{ {
DWORD err_no = 0;
DDE_HANDLE_ENTRY *reference_inst;
HSZ hsz = 0; HSZ hsz = 0;
TRACE("(%ld,%s,%d): partial stub\n",idInst,debugstr_w(psz),codepage); TRACE("(%ld,%s,%d): partial stub\n",idInst,debugstr_w(psz),codepage);
@ -1319,7 +1333,7 @@ HSZ WINAPI DdeCreateStringHandleW(
reference_inst = Find_Instance_Entry(idInst); reference_inst = Find_Instance_Entry(idInst);
if ( reference_inst == NULL ) if ( reference_inst == NULL )
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return 0; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst)) return 0;
/* /*
Needs something here to record NOT_INITIALIZED ready for DdeGetLastError Needs something here to record NOT_INITIALIZED ready for DdeGetLastError
*/ */
@ -1337,8 +1351,8 @@ HSZ WINAPI DdeCreateStringHandleW(
/* Save the handle so we know to clean it when /* Save the handle so we know to clean it when
* uninitialize is called. * uninitialize is called.
*/ */
InsertHSZNode( hsz ); InsertHSZNode( hsz, reference_inst );
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst))
{ {
reference_inst->Last_Error = DMLERR_SYS_ERROR; reference_inst->Last_Error = DMLERR_SYS_ERROR;
return 0; return 0;
@ -1346,7 +1360,7 @@ HSZ WINAPI DdeCreateStringHandleW(
TRACE("Returning pointer\n"); TRACE("Returning pointer\n");
return hsz; return hsz;
} else { } else {
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst);
} }
TRACE("Returning error\n"); TRACE("Returning error\n");
return 0; return 0;
@ -1380,6 +1394,9 @@ BOOL16 WINAPI DdeFreeStringHandle16( DWORD idInst, HSZ hsz )
*/ */
BOOL WINAPI DdeFreeStringHandle( DWORD idInst, HSZ hsz ) BOOL WINAPI DdeFreeStringHandle( DWORD idInst, HSZ hsz )
{ {
DWORD err_no = 0;
DWORD prev_err = 0;
DDE_HANDLE_ENTRY *reference_inst;
TRACE("(%ld,%ld): \n",idInst,hsz); TRACE("(%ld,%ld): \n",idInst,hsz);
if ( DDE_Max_Assigned_Instance == 0 ) if ( DDE_Max_Assigned_Instance == 0 )
{ {
@ -1406,7 +1423,7 @@ BOOL WINAPI DdeFreeStringHandle( DWORD idInst, HSZ hsz )
reference_inst = Find_Instance_Entry(idInst); reference_inst = Find_Instance_Entry(idInst);
if ( (reference_inst == NULL) || (reference_inst->Node_list == NULL)) if ( (reference_inst == NULL) || (reference_inst->Node_list == NULL))
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return TRUE; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst)) return TRUE;
/* Nothing has been initialised - exit now ! can return TRUE since effect is the same */ /* Nothing has been initialised - exit now ! can return TRUE since effect is the same */
return TRUE; return TRUE;
@ -1414,10 +1431,10 @@ BOOL WINAPI DdeFreeStringHandle( DWORD idInst, HSZ hsz )
/* Remove the node associated with this HSZ. /* Remove the node associated with this HSZ.
*/ */
RemoveHSZNode( hsz ); RemoveHSZNode( hsz , reference_inst);
/* Free the string associated with this HSZ. /* Free the string associated with this HSZ.
*/ */
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst);
return GlobalDeleteAtom (hsz) ? 0 : hsz; return GlobalDeleteAtom (hsz) ? 0 : hsz;
} }
@ -1471,6 +1488,9 @@ BOOL16 WINAPI DdeKeepStringHandle16( DWORD idInst, HSZ hsz )
BOOL WINAPI DdeKeepStringHandle( DWORD idInst, HSZ hsz ) BOOL WINAPI DdeKeepStringHandle( DWORD idInst, HSZ hsz )
{ {
DWORD prev_err = 0;
DWORD err_no = 0;
DDE_HANDLE_ENTRY *reference_inst;
TRACE("(%ld,%ld): \n",idInst,hsz); TRACE("(%ld,%ld): \n",idInst,hsz);
if ( DDE_Max_Assigned_Instance == 0 ) if ( DDE_Max_Assigned_Instance == 0 )
{ {
@ -1497,13 +1517,13 @@ BOOL WINAPI DdeKeepStringHandle( DWORD idInst, HSZ hsz )
reference_inst = Find_Instance_Entry(idInst); reference_inst = Find_Instance_Entry(idInst);
if ( (reference_inst == NULL) || (reference_inst->Node_list == NULL)) if ( (reference_inst == NULL) || (reference_inst->Node_list == NULL))
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return FALSE; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst)) return FALSE;
/* Nothing has been initialised - exit now ! can return FALSE since effect is the same */ /* Nothing has been initialised - exit now ! can return FALSE since effect is the same */
return FALSE; return FALSE;
return FALSE; return FALSE;
} }
DdeReserveAtom(reference_inst,hsz); DdeReserveAtom(reference_inst,hsz);
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst);
return TRUE; return TRUE;
} }
@ -1806,6 +1826,9 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
ServiceNode* this_service, *reference_service ; ServiceNode* this_service, *reference_service ;
CHAR SNameBuffer[MAX_BUFFER_LEN]; CHAR SNameBuffer[MAX_BUFFER_LEN];
UINT rcode; UINT rcode;
DWORD err_no = 0;
DDE_HANDLE_ENTRY *this_instance;
DDE_HANDLE_ENTRY *reference_inst;
this_service = NULL; this_service = NULL;
FIXME("(%ld,%ld,%ld,%d): stub\n",idInst,hsz1,hsz2,afCmd); FIXME("(%ld,%ld,%ld,%d): stub\n",idInst,hsz1,hsz2,afCmd);
if ( DDE_Max_Assigned_Instance == 0 ) if ( DDE_Max_Assigned_Instance == 0 )
@ -1815,7 +1838,7 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
return 0L; return 0L;
} }
WaitForSingleObject(handle_mutex,1000); WaitForSingleObject(handle_mutex,1000);
if ( ((err_no=GetLastError()) != 0 ) && (err_no != prev_err )) if ( (err_no=GetLastError()) != 0 )
{ {
/* FIXME - needs refinement with popup for timeout, also is timeout interval OK */ /* FIXME - needs refinement with popup for timeout, also is timeout interval OK */
@ -1831,7 +1854,7 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
if (reference_inst == NULL) if (reference_inst == NULL)
{ {
TRACE("Instance not found as initialised\n"); TRACE("Instance not found as initialised\n");
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return TRUE; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance)) return TRUE;
/* Nothing has been initialised - exit now ! can return TRUE since effect is the same */ /* Nothing has been initialised - exit now ! can return TRUE since effect is the same */
return FALSE; return FALSE;
@ -1842,7 +1865,7 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
/* Illegal, reserved parameter /* Illegal, reserved parameter
*/ */
reference_inst->Last_Error = DMLERR_INVALIDPARAMETER; reference_inst->Last_Error = DMLERR_INVALIDPARAMETER;
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance);
FIXME("Reserved parameter no-zero !!\n"); FIXME("Reserved parameter no-zero !!\n");
return FALSE; return FALSE;
} }
@ -1858,7 +1881,7 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
*/ */
TRACE("General unregister unexpected flags\n"); TRACE("General unregister unexpected flags\n");
reference_inst->Last_Error = DMLERR_DLL_USAGE; reference_inst->Last_Error = DMLERR_DLL_USAGE;
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance);
return FALSE; return FALSE;
} }
/* Loop to find all registered service and de-register them /* Loop to find all registered service and de-register them
@ -1869,22 +1892,25 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
*/ */
TRACE("General de-register - nothing registered\n"); TRACE("General de-register - nothing registered\n");
reference_inst->Last_Error = DMLERR_DLL_USAGE; reference_inst->Last_Error = DMLERR_DLL_USAGE;
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance);
return FALSE; return FALSE;
} else } else
{ {
this_service = reference_inst->ServiceNames; this_service = reference_inst->ServiceNames;
while ( this_service->next != NULL) while ( this_service->next != NULL)
{ {
TRACE("general deregister - iteration\n");
reference_service = this_service; reference_service = this_service;
this_service = this_service->next; this_service = this_service->next;
DdeReleaseAtom(reference_inst,reference_service->hsz); DdeReleaseAtom(reference_inst,reference_service->hsz);
HeapFree(SystemHeap, 0, this_service); /* finished - release heap space used as work store */ HeapFree(SystemHeap, 0, reference_service); /* finished - release heap space used as work store */
} }
DdeReleaseAtom(reference_inst,this_service->hsz);
HeapFree(SystemHeap, 0, this_service); /* finished - release heap space used as work store */ HeapFree(SystemHeap, 0, this_service); /* finished - release heap space used as work store */
reference_inst->ServiceNames = NULL;
TRACE("General de-register - finished\n"); TRACE("General de-register - finished\n");
} }
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance);
return TRUE; return TRUE;
} }
TRACE("Specific name action detected\n"); TRACE("Specific name action detected\n");
@ -1986,7 +2012,7 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
/* trying to filter where no service names !! /* trying to filter where no service names !!
*/ */
reference_inst->Last_Error = DMLERR_DLL_USAGE; reference_inst->Last_Error = DMLERR_DLL_USAGE;
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance);
return FALSE; return FALSE;
} else } else
{ {
@ -2003,14 +2029,14 @@ HDDEDATA WINAPI DdeNameService( DWORD idInst, HSZ hsz1, HSZ hsz2,
/* trying to filter where no service names !! /* trying to filter where no service names !!
*/ */
reference_inst->Last_Error = DMLERR_DLL_USAGE; reference_inst->Last_Error = DMLERR_DLL_USAGE;
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance);
return FALSE; return FALSE;
} else } else
{ {
this_service->FilterOn = FALSE; this_service->FilterOn = FALSE;
} }
} }
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,this_instance);
return TRUE; return TRUE;
} }
@ -2048,6 +2074,9 @@ UINT16 WINAPI DdeGetLastError16( DWORD idInst )
UINT WINAPI DdeGetLastError( DWORD idInst ) UINT WINAPI DdeGetLastError( DWORD idInst )
{ {
DWORD error_code; DWORD error_code;
DWORD err_no = 0;
DWORD prev_err = 0;
DDE_HANDLE_ENTRY *reference_inst;
FIXME("(%ld): stub\n",idInst); FIXME("(%ld): stub\n",idInst);
if ( DDE_Max_Assigned_Instance == 0 ) if ( DDE_Max_Assigned_Instance == 0 )
{ {
@ -2074,14 +2103,14 @@ UINT WINAPI DdeGetLastError( DWORD idInst )
reference_inst = Find_Instance_Entry(idInst); reference_inst = Find_Instance_Entry(idInst);
if (reference_inst == NULL) if (reference_inst == NULL)
{ {
if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE)) return TRUE; if ( Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst)) return TRUE;
/* Nothing has been initialised - exit now ! can return TRUE since effect is the same */ /* Nothing has been initialised - exit now ! can return TRUE since effect is the same */
return DMLERR_DLL_NOT_INITIALIZED; return DMLERR_DLL_NOT_INITIALIZED;
} }
error_code = this_instance->Last_Error; error_code = reference_inst->Last_Error;
this_instance->Last_Error = 0; reference_inst->Last_Error = 0;
Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE); Release_reserved_mutex(handle_mutex,"handle_mutex",FALSE,FALSE,reference_inst);
return error_code; return error_code;
} }