Skip to content

Commit 4f54817

Browse files
mamoreau-devolutionsawakecoding
authored andcommitted
Fix COM reference counting
1 parent 0a72ccf commit 4f54817

File tree

13 files changed

+297
-246
lines changed

13 files changed

+297
-246
lines changed

dll/AxHost/RdpAxHostWnd.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ class CRdpAxHostWnd : public IUnknown
120120
if (riid == IID_IUnknown) {
121121
*ppv = this;
122122
}
123-
else if (riid == IID_IOleClientSite) {
123+
else if (riid == IID_IOleClientSite && m_pOleClientSite) {
124124
*ppv = (void*)m_pOleClientSite;
125125
}
126-
else if (riid == IID_IOleInPlaceSiteEx) {
126+
else if (riid == IID_IOleInPlaceSiteEx && m_pOleInPlaceSiteEx) {
127127
*ppv = (void*)m_pOleInPlaceSiteEx;
128128
}
129129

@@ -687,7 +687,7 @@ class CRdpAxHostWnd : public IUnknown
687687
HANDLE m_stopEvent = NULL;
688688

689689
private:
690-
LONG m_refCount = 0;
690+
LONG m_refCount = 1;
691691
HWND m_hWnd = NULL;
692692
HWND m_hWndParent = NULL;
693693
DWORD m_dwAdviseCookie = 0;

dll/AxHost/RdpEventSink.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ STDMETHODIMP CRdpEventSink::OnConfirmClose(VARIANT_BOOL* pfAllowClose)
164164

165165
CRdpEventSink::CRdpEventSink(HWND hWndParent)
166166
{
167-
m_refCount = 0;
167+
m_refCount = 1;
168168
m_hWndParent = hWndParent;
169169
}
170170

dll/AxHost/RdpOleSite.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
CRdpOleClientSite::CRdpOleClientSite(IUnknown* pUnkOuter)
55
{
6-
m_refCount = 0;
6+
m_refCount = 1;
77
m_pUnkOuter = pUnkOuter;
88
m_pUnkOuter->AddRef();
99
}
@@ -91,7 +91,7 @@ STDMETHODIMP CRdpOleClientSite::RequestNewObjectLayout()
9191
}
9292

9393
CRdpOleInPlaceSiteEx::CRdpOleInPlaceSiteEx(IUnknown* pUnkOuter)
94-
: m_refCount(0), m_hWnd(0)
94+
: m_refCount(1), m_hWnd(0)
9595
{
9696
m_pUnkOuter = pUnkOuter;
9797
m_pUnkOuter->AddRef();

dll/MsRdpClient.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,9 @@ class CMsRdpClient : public IMsRdpClient10
150150
public:
151151
CMsRdpClient(IUnknown* pUnknown)
152152
{
153-
m_refCount = 0;
153+
m_refCount = 1;
154154
m_pUnknown = pUnknown;
155+
pUnknown->AddRef();
155156

156157
pUnknown->QueryInterface(IID_IDispatch, (LPVOID*)&m_pDispatch);
157158
pUnknown->QueryInterface(IID_IMsTscAx, (LPVOID*)&m_pMsTscAx);
@@ -168,13 +169,10 @@ class CMsRdpClient : public IMsRdpClient10
168169

169170
m_pMsRdpExInstance = CMsRdpExInstance_New(this);
170171
IMsRdpExInstance* pMsRdpExInstance = (IMsRdpExInstance*)m_pMsRdpExInstance;
171-
pMsRdpExInstance->AddRef();
172172
pMsRdpExInstance->GetSessionId(&m_sessionId);
173173
MsRdpEx_InstanceManager_Add(m_pMsRdpExInstance);
174174

175175
m_pMsRdpExtendedSettings = CMsRdpExtendedSettings_New(pUnknown, (IUnknown*)m_pMsTscAx, &m_sessionId);
176-
IMsRdpExtendedSettings* pMsRdpExtendedSettings = (IMsRdpExtendedSettings*)m_pMsRdpExtendedSettings;
177-
pMsRdpExtendedSettings->AddRef();
178176
pMsRdpExInstance->AttachExtendedSettings(m_pMsRdpExtendedSettings);
179177

180178
void* pCorePropsRaw = NULL;
@@ -205,10 +203,9 @@ class CMsRdpClient : public IMsRdpClient10
205203
}
206204

207205
if (m_pMsRdpExInstance) {
208-
IMsRdpExInstance* pMsRdpExInstance = (IMsRdpExInstance*)m_pMsRdpExInstance;
209206
MsRdpEx_InstanceManager_Remove(m_pMsRdpExInstance);
210-
pMsRdpExInstance->Release();
211-
pMsRdpExInstance = NULL;
207+
((IMsRdpExInstance*)m_pMsRdpExInstance)->Release();
208+
m_pMsRdpExInstance = NULL;
212209
}
213210
}
214211

@@ -715,7 +712,7 @@ class CMsRdpClient : public IMsRdpClient10
715712

716713
private:
717714
GUID m_sessionId;
718-
ULONG m_refCount = 0;
715+
ULONG m_refCount;
719716
IUnknown* m_pUnknown = NULL;
720717
IDispatch* m_pDispatch = NULL;
721718
IMsTscAx* m_pMsTscAx = NULL;
@@ -762,12 +759,12 @@ class CClassFactory : IClassFactory
762759

763760
if (riid == IID_IUnknown) {
764761
*ppvObject = (LPVOID)((IUnknown*)this);
765-
m_refCount++;
762+
InterlockedIncrement(&m_refCount);
766763
return S_OK;
767764
}
768765
if (riid == IID_IClassFactory) {
769766
*ppvObject = (LPVOID)((IClassFactory*)this);
770-
m_refCount++;
767+
InterlockedIncrement(&m_refCount);
771768
return S_OK;
772769
}
773770

@@ -776,19 +773,21 @@ class CClassFactory : IClassFactory
776773

777774
ULONG STDMETHODCALLTYPE AddRef()
778775
{
779-
MsRdpEx_LogPrint(DEBUG, "CClassFactory::AddRef");
780-
return ++m_refCount;
776+
ULONG refCount = InterlockedIncrement(&m_refCount);
777+
MsRdpEx_LogPrint(DEBUG, "CClassFactory::AddRef = %d", refCount);
778+
return refCount;
781779
}
782780

783781
ULONG STDMETHODCALLTYPE Release()
784782
{
785-
MsRdpEx_LogPrint(DEBUG, "CClassFactory::Release");
786-
if (--m_refCount == 0)
783+
ULONG refCount = InterlockedDecrement(&m_refCount);
784+
MsRdpEx_LogPrint(DEBUG, "CClassFactory::Release = %d", refCount);
785+
if (refCount == 0)
787786
{
788787
delete this;
789788
return 0;
790789
}
791-
return m_refCount;
790+
return refCount;
792791
}
793792

794793
// IClassFactory interface
@@ -824,6 +823,7 @@ class CClassFactory : IClassFactory
824823
{
825824
CMsRdpClient* pMsRdpClient = new CMsRdpClient((IUnknown*)*ppvObject);
826825
hr = pMsRdpClient->QueryInterface(riid, ppvObject);
826+
pMsRdpClient->Release();
827827
}
828828
}
829829

dll/RdpCoreApi.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class CMsRdpExCoreApi : public IMsRdpExCoreApi
1515
public:
1616
CMsRdpExCoreApi()
1717
{
18-
m_refCount = 0;
18+
m_refCount = 1;
1919
MsRdpEx_PathCchDetect(m_MsRdpExDllPath, MSRDPEX_MAX_PATH, MSRDPEX_CURRENT_LIBRARY_PATH);
2020
}
2121

@@ -127,22 +127,21 @@ class CMsRdpExCoreApi : public IMsRdpExCoreApi
127127

128128
bool __stdcall QueryInstanceByWindowHandle(HWND hWnd, LPVOID* ppvObject)
129129
{
130-
HRESULT hr;
131130
IMsRdpExInstance* instance = NULL;
132131

133132
instance = (IMsRdpExInstance*) MsRdpEx_InstanceManager_FindByOutputPresenterHwnd(hWnd);
134133

135134
if (!instance)
136135
return false;
137136

138-
hr = instance->QueryInterface(IID_IMsRdpExInstance, ppvObject);
137+
instance->AddRef();
138+
*ppvObject = (LPVOID)instance;
139139

140-
return (hr == S_OK) ? true : false;
140+
return true;
141141
}
142142

143143
bool __stdcall OpenInstanceForWindowHandle(HWND hWnd, LPVOID* ppvObject)
144144
{
145-
HRESULT hr;
146145
IMsRdpExInstance* instance = NULL;
147146

148147
instance = (IMsRdpExInstance*) MsRdpEx_InstanceManager_FindByOutputPresenterHwnd(hWnd);
@@ -153,10 +152,14 @@ class CMsRdpExCoreApi : public IMsRdpExCoreApi
153152
instance->AttachOutputWindow(hWnd, NULL);
154153
MsRdpEx_InstanceManager_Add((CMsRdpExInstance*) instance);
155154
}
155+
else
156+
{
157+
instance->AddRef();
158+
}
156159

157-
hr = instance->QueryInterface(IID_IMsRdpExInstance, ppvObject);
160+
*ppvObject = (LPVOID)instance;
158161

159-
return (hr == S_OK) ? true : false;
162+
return true;
160163
}
161164

162165
private:

dll/RdpDvcClient.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ void CRdpDvcClient::SetListener(IWTSListener* pListener)
9393

9494
CRdpDvcClient::CRdpDvcClient(void)
9595
{
96-
96+
m_refCount = 1;
9797
}
9898

9999
CRdpDvcClient::~CRdpDvcClient()
@@ -184,7 +184,7 @@ HRESULT STDMETHODCALLTYPE CRdpDvcListener::OnNewChannelConnection(IWTSVirtualCha
184184

185185
CRdpDvcListener::CRdpDvcListener(void)
186186
{
187-
187+
m_refCount = 1;
188188
}
189189

190190
CRdpDvcListener::~CRdpDvcListener()
@@ -288,7 +288,7 @@ HRESULT STDMETHODCALLTYPE CRdpDvcPlugin::Terminated(void)
288288

289289
CRdpDvcPlugin::CRdpDvcPlugin(void)
290290
{
291-
291+
m_refCount = 1;
292292
}
293293

294294
CRdpDvcPlugin::~CRdpDvcPlugin()
@@ -324,12 +324,12 @@ class CDvcPluginClassFactory : IClassFactory
324324

325325
if (riid == IID_IUnknown) {
326326
*ppvObject = (LPVOID)((IUnknown*)this);
327-
m_refCount++;
327+
InterlockedIncrement(&m_refCount);
328328
return S_OK;
329329
}
330330
if (riid == IID_IClassFactory) {
331331
*ppvObject = (LPVOID)((IClassFactory*)this);
332-
m_refCount++;
332+
InterlockedIncrement(&m_refCount);
333333
return S_OK;
334334
}
335335

dll/RdpDvcClient.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class CRdpDvcClient :
2626
virtual ~CRdpDvcClient();
2727

2828
private:
29-
ULONG m_refCount = 0;
29+
ULONG m_refCount;
3030
IWTSVirtualChannel* m_pChannel = NULL;
3131
IWTSListener* m_pListener = NULL;
3232
};
@@ -48,7 +48,7 @@ class CRdpDvcListener :
4848
CRdpDvcListener(void);
4949
virtual ~CRdpDvcListener();
5050
private:
51-
ULONG m_refCount = 0;
51+
ULONG m_refCount;
5252
};
5353

5454
class CRdpDvcPlugin :
@@ -71,7 +71,7 @@ class CRdpDvcPlugin :
7171
virtual ~CRdpDvcPlugin();
7272

7373
private:
74-
ULONG m_refCount = 0;
74+
ULONG m_refCount;
7575
IWTSVirtualChannel* m_pChannel = NULL;
7676
};
7777

dll/RdpInstance.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class CMsRdpExInstance : public IMsRdpExInstance
1515
public:
1616
CMsRdpExInstance(CMsRdpClient* pMsRdpClient)
1717
{
18-
m_refCount = 0;
18+
m_refCount = 1;
1919
m_pMsRdpClient = pMsRdpClient;
2020
MsRdpEx_GuidGenerate(&m_sessionId);
2121

@@ -48,6 +48,12 @@ class CMsRdpExInstance : public IMsRdpExInstance
4848
char iid[MSRDPEX_GUID_STRING_SIZE];
4949
MsRdpEx_GuidBinToStr((GUID*)&riid, iid, 0);
5050

51+
if (!ppvObject) {
52+
return E_INVALIDARG;
53+
}
54+
55+
*ppvObject = NULL; // Initialize to NULL for safety
56+
5157
if (riid == IID_IUnknown)
5258
{
5359
*ppvObject = (LPVOID)((IUnknown*)this);
@@ -56,7 +62,7 @@ class CMsRdpExInstance : public IMsRdpExInstance
5662
}
5763
else if (riid == IID_IMsRdpExInstance)
5864
{
59-
*ppvObject = (LPVOID)((IUnknown*)this);
65+
*ppvObject = (LPVOID)((IMsRdpExInstance*)this);
6066
refCount = InterlockedIncrement(&m_refCount);
6167
hr = S_OK;
6268
}
@@ -300,7 +306,7 @@ class CMsRdpExInstance : public IMsRdpExInstance
300306

301307
public:
302308
GUID m_sessionId;
303-
ULONG m_refCount = NULL;
309+
ULONG m_refCount;
304310
CMsRdpClient* m_pMsRdpClient = NULL;
305311
HWND m_hInputCaptureWnd = NULL;
306312
HWND m_hOutputPresenterWnd = NULL;

dll/RdpProcess.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class CMsRdpExProcess : public IMsRdpExProcess
8686
public:
8787
CMsRdpExProcess()
8888
{
89-
m_refCount = 0;
89+
m_refCount = 1;
9090
m_exitCode = 0;
9191
m_hasExited = false;
9292
m_filename = NULL;

0 commit comments

Comments
 (0)