combase: Move CoGetCurrentProcess().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
bcfd32edad
commit
a1ff0d9b78
|
@ -11,5 +11,9 @@ C_SRCS = \
|
||||||
malloc.c \
|
malloc.c \
|
||||||
marshal.c \
|
marshal.c \
|
||||||
roapi.c \
|
roapi.c \
|
||||||
|
rpc.c \
|
||||||
string.c \
|
string.c \
|
||||||
usrmarshal.c
|
usrmarshal.c
|
||||||
|
|
||||||
|
IDL_SRCS = \
|
||||||
|
irpcss.idl
|
||||||
|
|
|
@ -2233,3 +2233,19 @@ HRESULT WINAPI CoGetCurrentLogicalThreadId(GUID *id)
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* CoGetCurrentProcess (combase.@)
|
||||||
|
*/
|
||||||
|
DWORD WINAPI CoGetCurrentProcess(void)
|
||||||
|
{
|
||||||
|
struct tlsdata *tlsdata;
|
||||||
|
|
||||||
|
if (FAILED(com_get_tlsdata(&tlsdata)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!tlsdata->thread_seqid)
|
||||||
|
tlsdata->thread_seqid = rpcss_get_next_seqid();
|
||||||
|
|
||||||
|
return tlsdata->thread_seqid;
|
||||||
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
@ stub CoGetClassVersion
|
@ stub CoGetClassVersion
|
||||||
@ stdcall CoGetContextToken(ptr)
|
@ stdcall CoGetContextToken(ptr)
|
||||||
@ stdcall CoGetCurrentLogicalThreadId(ptr)
|
@ stdcall CoGetCurrentLogicalThreadId(ptr)
|
||||||
@ stdcall CoGetCurrentProcess() ole32.CoGetCurrentProcess
|
@ stdcall CoGetCurrentProcess()
|
||||||
@ stdcall CoGetDefaultContext(long ptr ptr)
|
@ stdcall CoGetDefaultContext(long ptr ptr)
|
||||||
@ stdcall CoGetErrorInfo(long ptr) GetErrorInfo
|
@ stdcall CoGetErrorInfo(long ptr) GetErrorInfo
|
||||||
@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr)
|
@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr)
|
||||||
|
|
|
@ -88,3 +88,6 @@ static inline struct apartment* com_get_current_apt(void)
|
||||||
com_get_tlsdata(&tlsdata);
|
com_get_tlsdata(&tlsdata);
|
||||||
return tlsdata->apt;
|
return tlsdata->apt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* RpcSs interface */
|
||||||
|
DWORD rpcss_get_next_seqid(void) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winsvc.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/exception.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
|
#include "irpcss.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
|
|
||||||
|
void * __RPC_USER MIDL_user_allocate(SIZE_T size)
|
||||||
|
{
|
||||||
|
return heap_alloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __RPC_USER MIDL_user_free(void *p)
|
||||||
|
{
|
||||||
|
heap_free(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *eptr)
|
||||||
|
{
|
||||||
|
return I_RpcExceptionFilter(eptr->ExceptionRecord->ExceptionCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL start_rpcss(void)
|
||||||
|
{
|
||||||
|
SERVICE_STATUS_PROCESS status;
|
||||||
|
SC_HANDLE scm, service;
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
TRACE("\n");
|
||||||
|
|
||||||
|
if (!(scm = OpenSCManagerW(NULL, NULL, 0)))
|
||||||
|
{
|
||||||
|
ERR("Failed to open service manager\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(service = OpenServiceW(scm, L"RpcSs", SERVICE_START | SERVICE_QUERY_STATUS)))
|
||||||
|
{
|
||||||
|
ERR("Failed to open RpcSs service\n");
|
||||||
|
CloseServiceHandle( scm );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StartServiceW(service, 0, NULL) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
|
||||||
|
{
|
||||||
|
ULONGLONG start_time = GetTickCount64();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
DWORD dummy;
|
||||||
|
|
||||||
|
if (!QueryServiceStatusEx(service, SC_STATUS_PROCESS_INFO, (BYTE *)&status, sizeof(status), &dummy))
|
||||||
|
break;
|
||||||
|
if (status.dwCurrentState == SERVICE_RUNNING)
|
||||||
|
{
|
||||||
|
ret = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetTickCount64() - start_time > 30000) break;
|
||||||
|
Sleep( 100 );
|
||||||
|
|
||||||
|
} while (status.dwCurrentState == SERVICE_START_PENDING);
|
||||||
|
|
||||||
|
if (status.dwCurrentState != SERVICE_RUNNING)
|
||||||
|
WARN("RpcSs failed to start %u\n", status.dwCurrentState);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ERR("Failed to start RpcSs service\n");
|
||||||
|
|
||||||
|
CloseServiceHandle(service);
|
||||||
|
CloseServiceHandle(scm);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RPC_BINDING_HANDLE get_rpc_handle(unsigned short *protseq, unsigned short *endpoint)
|
||||||
|
{
|
||||||
|
RPC_BINDING_HANDLE handle = NULL;
|
||||||
|
RPC_STATUS status;
|
||||||
|
RPC_WSTR binding;
|
||||||
|
|
||||||
|
status = RpcStringBindingComposeW(NULL, protseq, NULL, endpoint, NULL, &binding);
|
||||||
|
if (status == RPC_S_OK)
|
||||||
|
{
|
||||||
|
status = RpcBindingFromStringBindingW(binding, &handle);
|
||||||
|
RpcStringFreeW(&binding);
|
||||||
|
}
|
||||||
|
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RPC_BINDING_HANDLE get_irpcss_handle(void)
|
||||||
|
{
|
||||||
|
static RPC_BINDING_HANDLE irpcss_handle;
|
||||||
|
|
||||||
|
if (!irpcss_handle)
|
||||||
|
{
|
||||||
|
unsigned short protseq[] = IRPCSS_PROTSEQ;
|
||||||
|
unsigned short endpoint[] = IRPCSS_ENDPOINT;
|
||||||
|
|
||||||
|
RPC_BINDING_HANDLE new_handle = get_rpc_handle(protseq, endpoint);
|
||||||
|
if (InterlockedCompareExchangePointer(&irpcss_handle, new_handle, NULL))
|
||||||
|
/* another thread beat us to it */
|
||||||
|
RpcBindingFree(&new_handle);
|
||||||
|
}
|
||||||
|
return irpcss_handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD rpcss_get_next_seqid(void)
|
||||||
|
{
|
||||||
|
DWORD id = 0;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
__TRY
|
||||||
|
{
|
||||||
|
hr = irpcss_get_thread_seq_id(get_irpcss_handle(), &id);
|
||||||
|
}
|
||||||
|
__EXCEPT(rpc_filter)
|
||||||
|
{
|
||||||
|
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
||||||
|
}
|
||||||
|
__ENDTRY
|
||||||
|
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
||||||
|
{
|
||||||
|
if (start_rpcss())
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
|
@ -45,7 +45,6 @@ RC_SRCS = ole32res.rc
|
||||||
IDL_SRCS = \
|
IDL_SRCS = \
|
||||||
dcom.idl \
|
dcom.idl \
|
||||||
irot.idl \
|
irot.idl \
|
||||||
irpcss.idl \
|
|
||||||
ole32_objidl.idl \
|
ole32_objidl.idl \
|
||||||
ole32_oleidl.idl \
|
ole32_oleidl.idl \
|
||||||
ole32_unknwn.idl
|
ole32_unknwn.idl
|
||||||
|
|
|
@ -2898,22 +2898,6 @@ done:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* CoGetCurrentProcess [OLE32.@]
|
|
||||||
*/
|
|
||||||
DWORD WINAPI CoGetCurrentProcess(void)
|
|
||||||
{
|
|
||||||
struct oletls *info = COM_CurrentInfo();
|
|
||||||
|
|
||||||
if (!info)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!info->thread_seqid)
|
|
||||||
info->thread_seqid = rpcss_get_next_seqid();
|
|
||||||
|
|
||||||
return info->thread_seqid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CoIsOle1Class [OLE32.@]
|
* CoIsOle1Class [OLE32.@]
|
||||||
*
|
*
|
||||||
|
|
|
@ -353,6 +353,4 @@ static inline HRESULT copy_formatetc(FORMATETC *dst, const FORMATETC *src)
|
||||||
extern HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data,
|
extern HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data,
|
||||||
BOOL copy, IEnumSTATDATA **ppenum) DECLSPEC_HIDDEN;
|
BOOL copy, IEnumSTATDATA **ppenum) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern DWORD rpcss_get_next_seqid(void) DECLSPEC_HIDDEN;
|
|
||||||
|
|
||||||
#endif /* __WINE_OLE_COMPOBJ_H */
|
#endif /* __WINE_OLE_COMPOBJ_H */
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
#include "compobj_private.h"
|
#include "compobj_private.h"
|
||||||
#include "moniker.h"
|
#include "moniker.h"
|
||||||
#include "irot.h"
|
#include "irot.h"
|
||||||
#include "irpcss.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
|
|
||||||
|
@ -78,7 +77,6 @@ typedef struct RunningObjectTableImpl
|
||||||
|
|
||||||
static RunningObjectTableImpl* runningObjectTableInstance = NULL;
|
static RunningObjectTableImpl* runningObjectTableInstance = NULL;
|
||||||
static IrotHandle irot_handle;
|
static IrotHandle irot_handle;
|
||||||
static RPC_BINDING_HANDLE irpcss_handle;
|
|
||||||
|
|
||||||
/* define the EnumMonikerImpl structure */
|
/* define the EnumMonikerImpl structure */
|
||||||
typedef struct EnumMonikerImpl
|
typedef struct EnumMonikerImpl
|
||||||
|
@ -135,21 +133,6 @@ static IrotHandle get_irot_handle(void)
|
||||||
return irot_handle;
|
return irot_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RPC_BINDING_HANDLE get_irpcss_handle(void)
|
|
||||||
{
|
|
||||||
if (!irpcss_handle)
|
|
||||||
{
|
|
||||||
unsigned short protseq[] = IROT_PROTSEQ;
|
|
||||||
unsigned short endpoint[] = IROT_ENDPOINT;
|
|
||||||
|
|
||||||
RPC_BINDING_HANDLE new_handle = get_rpc_handle(protseq, endpoint);
|
|
||||||
if (InterlockedCompareExchangePointer(&irpcss_handle, new_handle, NULL))
|
|
||||||
/* another thread beat us to it */
|
|
||||||
RpcBindingFree(&new_handle);
|
|
||||||
}
|
|
||||||
return irpcss_handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL start_rpcss(void)
|
static BOOL start_rpcss(void)
|
||||||
{
|
{
|
||||||
static const WCHAR rpcssW[] = {'R','p','c','S','s',0};
|
static const WCHAR rpcssW[] = {'R','p','c','S','s',0};
|
||||||
|
@ -200,33 +183,6 @@ static BOOL start_rpcss(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD rpcss_get_next_seqid(void)
|
|
||||||
{
|
|
||||||
DWORD id = 0;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
__TRY
|
|
||||||
{
|
|
||||||
hr = irpcss_get_thread_seq_id(get_irpcss_handle(), &id);
|
|
||||||
}
|
|
||||||
__EXCEPT(rpc_filter)
|
|
||||||
{
|
|
||||||
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
|
||||||
}
|
|
||||||
__ENDTRY
|
|
||||||
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
|
||||||
{
|
|
||||||
if (start_rpcss())
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT create_stream_on_mip_ro(const InterfaceData *mip, IStream **stream)
|
static HRESULT create_stream_on_mip_ro(const InterfaceData *mip, IStream **stream)
|
||||||
{
|
{
|
||||||
HGLOBAL hglobal = GlobalAlloc(0, mip->ulCntData);
|
HGLOBAL hglobal = GlobalAlloc(0, mip->ulCntData);
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
@ stdcall CoGetClassObject(ptr long ptr ptr ptr)
|
@ stdcall CoGetClassObject(ptr long ptr ptr ptr)
|
||||||
@ stdcall CoGetContextToken(ptr) combase.CoGetContextToken
|
@ stdcall CoGetContextToken(ptr) combase.CoGetContextToken
|
||||||
@ stdcall CoGetCurrentLogicalThreadId(ptr) combase.CoGetCurrentLogicalThreadId
|
@ stdcall CoGetCurrentLogicalThreadId(ptr) combase.CoGetCurrentLogicalThreadId
|
||||||
@ stdcall CoGetCurrentProcess()
|
@ stdcall CoGetCurrentProcess() combase.CoGetCurrentProcess
|
||||||
@ stdcall CoGetDefaultContext(long ptr ptr) combase.CoGetDefaultContext
|
@ stdcall CoGetDefaultContext(long ptr ptr) combase.CoGetDefaultContext
|
||||||
@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr) combase.CoGetInstanceFromFile
|
@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr) combase.CoGetInstanceFromFile
|
||||||
@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr) combase.CoGetInstanceFromIStorage
|
@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr) combase.CoGetInstanceFromIStorage
|
||||||
|
|
Loading…
Reference in New Issue