--- trunk/reactos/lib/ole32/compobj.c 2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/compobj.c 2005-11-20 15:01:10 UTC (rev 19370)
@@ -56,24 +56,20 @@
#include "windef.h"
#include "winbase.h"
+#include "winerror.h"
+#include "winreg.h"
#include "winuser.h"
#include "objbase.h"
#include "ole2.h"
#include "ole2ver.h"
-#include "rpc.h"
-#include "winerror.h"
-#include "winreg.h"
-#include "wownt32.h"
-#include "wine/unicode.h"
-#include "objbase.h"
+
#include "compobj_private.h"
+#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole);
-typedef LPCSTR LPCOLESTR16;
-
HINSTANCE OLE32_hInstance = 0; /* FIXME: make static ... */
#define ARRAYSIZE(array) (sizeof(array)/sizeof((array)[0]))
@@ -97,7 +93,7 @@
{
0, 0, &csApartment,
{ &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
- 0, 0, { 0, (DWORD)(__FILE__ ": csApartment") }
+ 0, 0, { (DWORD_PTR)(__FILE__ ": csApartment") }
};
static CRITICAL_SECTION csApartment = { &critsect_debug, -1, 0, 0, 0, 0 };
@@ -134,7 +130,7 @@
{
0, 0, &csRegisteredClassList,
{ &class_cs_debug.ProcessLocksList, &class_cs_debug.ProcessLocksList },
- 0, 0, { 0, (DWORD)(__FILE__ ": csRegisteredClassList") }
+ 0, 0, { (DWORD_PTR)(__FILE__ ": csRegisteredClassList") }
};
static CRITICAL_SECTION csRegisteredClassList = { &class_cs_debug, -1, 0, 0, 0, 0 };
@@ -161,7 +157,7 @@
{
0, 0, &csOpenDllList,
{ &dll_cs_debug.ProcessLocksList, &dll_cs_debug.ProcessLocksList },
- 0, 0, { 0, (DWORD)(__FILE__ ": csOpenDllList") }
+ 0, 0, { (DWORD_PTR)(__FILE__ ": csOpenDllList") }
};
static CRITICAL_SECTION csOpenDllList = { &dll_cs_debug, -1, 0, 0, 0, 0 };
@@ -419,7 +415,8 @@
switch (msg)
{
case DM_EXECUTERPC:
- return RPC_ExecuteCall((struct dispatch_params *)lParam);
+ RPC_ExecuteCall((struct dispatch_params *)lParam);
+ return 0;
default:
return DefWindowProcW(hWnd, msg, wParam, lParam);
}
@@ -981,14 +978,36 @@
return MultiByteToWideChar( CP_ACP, 0, xguid, -1, str, cmax );
}
-/* open HKCR\\CLSID\\{string form of clsid} key */
-DWORD COM_OpenKeyForCLSID(REFCLSID clsid, REGSAM access, HKEY *key)
+/* open HKCR\\CLSID\\{string form of clsid}\\{keyname} key */
+HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY *subkey)
{
static const WCHAR wszCLSIDSlash[] = {'C','L','S','I','D','\\',0};
WCHAR path[CHARS_IN_GUID + ARRAYSIZE(wszCLSIDSlash) - 1];
+ LONG res;
+ HKEY key;
+
strcpyW(path, wszCLSIDSlash);
StringFromGUID2(clsid, path + strlenW(wszCLSIDSlash), CHARS_IN_GUID);
- return RegOpenKeyExW(HKEY_CLASSES_ROOT, path, 0, access, key);
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, path, 0, keyname ? KEY_READ : access, &key);
+ if (res == ERROR_FILE_NOT_FOUND)
+ return REGDB_E_CLASSNOTREG;
+ else if (res != ERROR_SUCCESS)
+ return REGDB_E_READREGDB;
+
+ if (!keyname)
+ {
+ *subkey = key;
+ return S_OK;
+ }
+
+ res = RegOpenKeyExW(key, keyname, 0, access, subkey);
+ RegCloseKey(key);
+ if (res == ERROR_FILE_NOT_FOUND)
+ return REGDB_E_KEYMISSING;
+ else if (res != ERROR_SUCCESS)
+ return REGDB_E_READREGDB;
+
+ return S_OK;
}
/******************************************************************************
@@ -1007,25 +1026,15 @@
*/
HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *lplpszProgID)
{
- static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
- HKEY hkey = NULL;
- HKEY hkey_clsid;
- HRESULT ret = S_OK;
-
- if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsid, KEY_READ, &hkey_clsid))
- ret = REGDB_E_CLASSNOTREG;
-
- if (ret == S_OK)
- {
- if (RegOpenKeyExW(hkey_clsid, wszProgID, 0, KEY_READ, &hkey))
- ret = REGDB_E_CLASSNOTREG;
- RegCloseKey(hkey_clsid);
- }
-
- if (ret == S_OK)
- {
+ static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
+ HKEY hkey;
+ HRESULT ret;
LONG progidlen = 0;
+ ret = COM_OpenKeyForCLSID(clsid, wszProgID, KEY_READ, &hkey);
+ if (FAILED(ret))
+ return ret;
+
if (RegQueryValueW(hkey, NULL, NULL, &progidlen))
ret = REGDB_E_CLASSNOTREG;
@@ -1040,49 +1049,12 @@
else
ret = E_OUTOFMEMORY;
}
- }
- RegCloseKey(hkey);
- return ret;
+ RegCloseKey(hkey);
+ return ret;
}
/******************************************************************************
- * CLSIDFromProgID [COMPOBJ.61]
- *
- * Converts a program ID into the respective GUID.
- *
- * PARAMS
- * progid [I] program id as found in registry
- * riid [O] associated CLSID
- *
- * RETURNS
- * Success: S_OK
- * Failure: CO_E_CLASSSTRING - the given ProgID cannot be found.
- */
-HRESULT WINAPI CLSIDFromProgID16(LPCOLESTR16 progid, LPCLSID riid)
-{
- char *buf,buf2[80];
- LONG buf2len;
- HRESULT err;
- HKEY xhkey;
-
- buf = HeapAlloc(GetProcessHeap(),0,strlen(progid)+8);
- sprintf(buf,"%s\\CLSID",progid);
- if ((err=RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&xhkey))) {
- HeapFree(GetProcessHeap(),0,buf);
- return CO_E_CLASSSTRING;
- }
- HeapFree(GetProcessHeap(),0,buf);
- buf2len = sizeof(buf2);
- if ((err=RegQueryValueA(xhkey,NULL,buf2,&buf2len))) {
- RegCloseKey(xhkey);
- return CO_E_CLASSSTRING;
- }
- RegCloseKey(xhkey);
- return __CLSIDFromStringA(buf2,riid);
-}
-
-/******************************************************************************
* CLSIDFromProgID [OLE32.@]
*
* Converts a program id into the respective GUID.
@@ -1122,7 +1094,6 @@
}
-
/*****************************************************************************
* CoGetPSClsid [OLE32.@]
*
@@ -1388,7 +1359,14 @@
*/
hr = COM_GetRegisteredClassObject(rclsid, dwClsContext, &foundObject);
if (hr == S_OK) {
+ if (flags & REGCLS_MULTIPLEUSE) {
+ if (dwClsContext & CLSCTX_LOCAL_SERVER)
+ hr = CoLockObjectExternal(foundObject, TRUE, FALSE);
+ IUnknown_Release(foundObject);
+ return hr;
+ }
IUnknown_Release(foundObject);
+ ERR("object already registered for class %s\n", debugstr_guid(rclsid));
return CO_E_OBJISREG;
}
@@ -1559,6 +1537,40 @@
return hres;
}
+static HRESULT get_inproc_class_object(HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv)
+{
+ HINSTANCE hLibrary;
+ typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, LPVOID *ppv);
+ DllGetClassObjectFunc DllGetClassObject;
+ WCHAR dllpath[MAX_PATH+1];
+
+ if (COM_RegReadPath(hkeydll, NULL, NULL, dllpath, ARRAYSIZE(dllpath)) != ERROR_SUCCESS)
+ {
+ /* failure: CLSID is not found in registry */
+ WARN("class %s not registered inproc\n", debugstr_guid(rclsid));
+ return REGDB_E_CLASSNOTREG;
+ }
+
+ if ((hLibrary = LoadLibraryExW(dllpath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0)
+ {
+ /* failure: DLL could not be loaded */
+ ERR("couldn't load in-process dll %s\n", debugstr_w(dllpath));
+ return E_ACCESSDENIED; /* FIXME: or should this be CO_E_DLLNOTFOUND? */
+ }
+
+ if (!(DllGetClassObject = (DllGetClassObjectFunc)GetProcAddress(hLibrary, "DllGetClassObject")))
+ {
+ /* failure: the dll did not export DllGetClassObject */
+ ERR("couldn't find function DllGetClassObject in %s\n", debugstr_w(dllpath));
+ FreeLibrary( hLibrary );
+ return CO_E_DLLNOTFOUND;
+ }
+
+ /* OK: get the ClassObject */
+ COMPOBJ_DLLList_Add( hLibrary );
+ return DllGetClassObject(rclsid, riid, ppv);
+}
+
/***********************************************************************
* CoGetClassObject [OLE32.@]
*
@@ -1600,50 +1612,58 @@
return hres;
}
- /* first try: in-process */
- if ((CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER) & dwClsContext)
+ /* First try in-process server */
+ if (CLSCTX_INPROC_SERVER & dwClsContext)
{
static const WCHAR wszInprocServer32[] = {'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
- HINSTANCE hLibrary;
- typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, LPVOID *ppv);
- DllGetClassObjectFunc DllGetClassObject;
- WCHAR dllpath[MAX_PATH+1];
HKEY hkey;
- if (ERROR_SUCCESS != COM_OpenKeyForCLSID(rclsid, KEY_READ, &hkey))
+ hres = COM_OpenKeyForCLSID(rclsid, wszInprocServer32, KEY_READ, &hkey);
+ if (FAILED(hres))
{
- ERR("class %s not registered\n", debugstr_guid(rclsid));
- hres = REGDB_E_CLASSNOTREG;
+ if (hres == REGDB_E_CLASSNOTREG)
+ ERR("class %s not registered\n", debugstr_guid(rclsid));
+ else
+ WARN("class %s not registered as in-proc server\n", debugstr_guid(rclsid));
}
- if (COM_RegReadPath(hkey, wszInprocServer32, NULL, dllpath, ARRAYSIZE(dllpath)) != ERROR_SUCCESS)
+ if (SUCCEEDED(hres))
{
- /* failure: CLSID is not found in registry */
- WARN("class %s not registered inproc\n", debugstr_guid(rclsid));
- hres = REGDB_E_CLASSNOTREG;
+ hres = get_inproc_class_object(hkey, rclsid, iid, ppv);
+ RegCloseKey(hkey);
}
- else
+
+ /* return if we got a class, otherwise fall through to one of the
+ * other types */
+ if (SUCCEEDED(hres))
+ return hres;
+ }
+
+ /* Next try in-process handler */
+ if (CLSCTX_INPROC_HANDLER & dwClsContext)
+ {
+ static const WCHAR wszInprocHandler32[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
+ HKEY hkey;
+
+ hres = COM_OpenKeyForCLSID(rclsid, wszInprocHandler32, KEY_READ, &hkey);
+ if (FAILED(hres))
{
- if ((hLibrary = LoadLibraryExW(dllpath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0)
- {
- /* failure: DLL could not be loaded */
- ERR("couldn't load InprocServer32 dll %s\n", debugstr_w(dllpath));
- hres = E_ACCESSDENIED; /* FIXME: or should this be CO_E_DLLNOTFOUND? */
- }
- else if (!(DllGetClassObject = (DllGetClassObjectFunc)GetProcAddress(hLibrary, "DllGetClassObject")))
- {
- /* failure: the dll did not export DllGetClassObject */
- ERR("couldn't find function DllGetClassObject in %s\n", debugstr_w(dllpath));
- FreeLibrary( hLibrary );
- hres = CO_E_DLLNOTFOUND;
- }
+ if (hres == REGDB_E_CLASSNOTREG)
+ ERR("class %s not registered\n", debugstr_guid(rclsid));
else
- {
- /* OK: get the ClassObject */
- COMPOBJ_DLLList_Add( hLibrary );
- return DllGetClassObject(rclsid, iid, ppv);
- }
+ WARN("class %s not registered in-proc handler\n", debugstr_guid(rclsid));
}
+
+ if (SUCCEEDED(hres))
+ {
+ hres = get_inproc_class_object(hkey, rclsid, iid, ppv);
+ RegCloseKey(hkey);
+ }
+
+ /* return if we got a class, otherwise fall through to one of the
+ * other types */
+ if (SUCCEEDED(hres))
+ return hres;
}
/* Next try out of process */
@@ -1659,26 +1679,13 @@
hres = E_NOINTERFACE;
}
+ if (FAILED(hres))
+ ERR("no class object %s could be created for for context 0x%lx\n",
+ debugstr_guid(rclsid), dwClsContext);
return hres;
}
/***********************************************************************
- * CoGetClassObject [COMPOBJ.7]
- *
- */
-HRESULT WINAPI CoGetClassObject16(
- REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo,
- REFIID iid, LPVOID *ppv)
-{
- FIXME(", stub!\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
-
- if (pServerInfo) {
- FIXME("\tpServerInfo: name=%s\n",debugstr_w(pServerInfo->pwszName));
- FIXME("\t\tpAuthInfo=%p\n",pServerInfo->pAuthInfo);
- }
- return E_NOTIMPL;
-}
-/***********************************************************************
* CoResumeClassObjects (OLE32.@)
*
* Resumes all class objects registered with REGCLS_SUSPENDED.
@@ -1800,6 +1807,9 @@
HRESULT hres;
LPCLASSFACTORY lpclf = 0;
+ TRACE("(rclsid=%s, pUnkOuter=%p, dwClsContext=%08lx, riid=%s, ppv=%p)\n", debugstr_guid(rclsid),
+ pUnkOuter, dwClsContext, debugstr_guid(iid), ppv);
+
if (!COM_CurrentApt()) return CO_E_NOTINITIALIZED;
/*
@@ -1855,23 +1865,6 @@
}
/***********************************************************************
- * CoCreateInstance [COMPOBJ.13]
- */
-HRESULT WINAPI CoCreateInstance16(
- REFCLSID rclsid,
- LPUNKNOWN pUnkOuter,
- DWORD dwClsContext,
- REFIID iid,
- LPVOID *ppv)
-{
- FIXME("(%s, %p, %lx, %s, %p), stub!\n",
- debugstr_guid(rclsid), pUnkOuter, dwClsContext, debugstr_guid(iid),
- ppv
- );
- return E_NOTIMPL;
-}
-
-/***********************************************************************
* CoCreateInstanceEx [OLE32.@]
*/
HRESULT WINAPI CoCreateInstanceEx(
@@ -2207,16 +2200,12 @@
LONG len;
HRESULT res = S_OK;
- if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsidOld, KEY_READ, &hkey))
- {
- res = REGDB_E_CLASSNOTREG;
+ res = COM_OpenKeyForCLSID(clsidOld, wszAutoConvertTo, KEY_READ, &hkey);
+ if (FAILED(res))
goto done;
- }
len = sizeof(buf);
- /* we can just query for the default value of AutoConvertTo key like that,
- without opening the AutoConvertTo key and querying for NULL (default) */
- if (RegQueryValueW(hkey, wszAutoConvertTo, buf, &len))
+ if (RegQueryValueW(hkey, NULL, buf, &len))
{
res = REGDB_E_KEYMISSING;
goto done;
@@ -2254,11 +2243,9 @@
LONG auto_treat_as_size = sizeof(auto_treat_as);
CLSID id;
- if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsidOld, KEY_READ | KEY_WRITE, &hkey))
- {
- res = REGDB_E_CLASSNOTREG;
- goto done;
- }
+ res = COM_OpenKeyForCLSID(clsidOld, NULL, KEY_READ | KEY_WRITE, &hkey);
+ if (FAILED(res))
+ goto done;
if (!memcmp( clsidOld, clsidNew, sizeof(*clsidOld) ))
{
if (!RegQueryValueW(hkey, wszAutoTreatAs, auto_treat_as, &auto_treat_as_size) &&
@@ -2315,13 +2302,11 @@
FIXME("(%s,%p)\n", debugstr_guid(clsidOld), clsidNew);
memcpy(clsidNew,clsidOld,sizeof(CLSID)); /* copy over old value */
- if (COM_OpenKeyForCLSID(clsidOld, KEY_READ, &hkey))
+ res = COM_OpenKeyForCLSID(clsidOld, wszTreatAs, KEY_READ, &hkey);
+ if (FAILED(res))
+ goto done;
+ if (RegQueryValueW(hkey, NULL, szClsidNew, &len))
{
- res = REGDB_E_CLASSNOTREG;
- goto done;
- }
- if (RegQueryValueW(hkey, wszTreatAs, szClsidNew, &len))
- {
res = S_FALSE;
goto done;
}
@@ -2688,6 +2673,12 @@
TRACE("received message whilst waiting for RPC: 0x%04x\n", msg.message);
TranslateMessage(&msg);
DispatchMessageW(&msg);
+ if (msg.message == WM_QUIT)
+ {
+ TRACE("resending WM_QUIT to outer message loop\n");
+ PostQuitMessage(msg.wParam);
+ goto done;
+ }
}
}
else if ((res >= WAIT_OBJECT_0) && (res < WAIT_OBJECT_0 + cHandles))
@@ -2708,6 +2699,7 @@
break;
}
}
+done:
TRACE("-- 0x%08lx\n", hr);
return hr;
}
--- trunk/reactos/lib/ole32/compobj_private.h 2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/compobj_private.h 2005-11-20 15:01:10 UTC (rev 19370)
@@ -71,6 +71,7 @@
IID iid; /* RO */
IPID ipid; /* RO */
IUnknown *iface; /* RO */
+ MSHLFLAGS flags; /* so we can enforce process-local marshalling rules (RO) */
};
@@ -87,7 +88,14 @@
OID oid; /* apartment-scoped unique identifier (RO) */
IUnknown *object; /* the object we are managing the stub for (RO) */
ULONG next_ipid; /* currently unused (LOCK) */
- STUB_STATE state; /* state machine (CS lock) */
+
+ /* We need to keep a count of the outstanding marshals, so we can enforce the
+ * marshalling rules (ie, you can only unmarshal normal marshals once). Note
+ * that these counts do NOT include unmarshalled interfaces, once a stream is
+ * unmarshalled and a proxy set up, this count is decremented.
+ */
+
+ ULONG norm_refs; /* refcount of normal marshals (CS lock) */
};
/* imported interface proxy */
@@ -163,22 +171,23 @@
extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr);
HRESULT WINAPI __CLSIDFromStringA(LPCSTR idstr, CLSID *id);
-DWORD COM_OpenKeyForCLSID(REFCLSID clsid, REGSAM access, HKEY *key);
+HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY *key);
HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);
/* Stub Manager */
ULONG stub_manager_int_addref(struct stub_manager *This);
ULONG stub_manager_int_release(struct stub_manager *This);
-struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object, MSHLFLAGS mshlflags);
+struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object);
ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs);
ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs);
-struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid);
+struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid, MSHLFLAGS flags);
+struct ifstub *stub_manager_find_ifstub(struct stub_manager *m, REFIID iid, MSHLFLAGS flags);
struct stub_manager *get_stub_manager(APARTMENT *apt, OID oid);
struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, void *object);
-BOOL stub_manager_notify_unmarshal(struct stub_manager *m);
-BOOL stub_manager_is_table_marshaled(struct stub_manager *m);
-void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs);
+BOOL stub_manager_notify_unmarshal(struct stub_manager *m, const IPID *ipid);
+BOOL stub_manager_is_table_marshaled(struct stub_manager *m, const IPID *ipid);
+void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs, const IPID *ipid);
HRESULT ipid_to_stub_manager(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **stubmgr_ret);
IRpcStubBuffer *ipid_to_apt_and_stubbuffer(const IPID *ipid, APARTMENT **stub_apt);
HRESULT start_apartment_remote_unknown(void);
@@ -191,7 +200,7 @@
void RPC_StartRemoting(struct apartment *apt);
HRESULT RPC_CreateClientChannel(const OXID *oxid, const IPID *ipid, IRpcChannelBuffer **pipebuf);
-HRESULT RPC_ExecuteCall(struct dispatch_params *params);
+void RPC_ExecuteCall(struct dispatch_params *params);
HRESULT RPC_RegisterInterface(REFIID riid);
void RPC_UnregisterInterface(REFIID riid);
void RPC_StartLocalServer(REFCLSID clsid, IStream *stream);
@@ -247,13 +256,8 @@
#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
/* helpers for debugging */
-#ifdef __i386__
-# define DEBUG_SET_CRITSEC_NAME(cs, name) (cs)->DebugInfo->Spare[1] = (DWORD)(__FILE__ ": " name)
-# define DEBUG_CLEAR_CRITSEC_NAME(cs) (cs)->DebugInfo->Spare[1] = 0
-#else
-# define DEBUG_SET_CRITSEC_NAME(cs, name)
-# define DEBUG_CLEAR_CRITSEC_NAME(cs)
-#endif
+# define DEBUG_SET_CRITSEC_NAME(cs, name) (cs)->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": " name)
+# define DEBUG_CLEAR_CRITSEC_NAME(cs) (cs)->DebugInfo->Spare[0] = 0
extern HINSTANCE OLE32_hInstance; /* FIXME: make static */
--- trunk/reactos/lib/ole32/dcom.idl 2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/dcom.idl 2005-11-20 15:01:10 UTC (rev 19370)
@@ -1,292 +1,292 @@
-/*
- * Copyright 2003 Ove KÕven, TransGaming Technologies
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/* see http://www.microsoft.com/msj/0398/dcom.htm */
-/* and the official DCOM specification
- * (there's a copy at http://www.grimes.demon.co.uk/DCOM/DCOMSpec.htm) */
-
-import "unknwn.idl";
-
-[
- uuid(99fcfe60-5260-101b-bbcb-00aa0021347a),
- pointer_default(unique)
-]
-interface ObjectRpcBaseTypes
-{
- typedef unsigned hyper ID;
- typedef ID MID;
- typedef ID OXID;
- typedef ID OID;
- typedef ID SETID;
- typedef GUID IPID;
- typedef GUID CID;
- typedef REFGUID REFIPID;
-
- const unsigned short COM_MINOR_VERSION_1 = 1;
- const unsigned short COM_MINOR_VERSION_2 = 2;
-
- const unsigned short COM_MAJOR_VERSION = 5;
- const unsigned short COM_MINOR_VERSION = 3;
-
- typedef struct tagCOMVERSION {
- unsigned short MajorVersion;
- unsigned short MinorVersion;
- } COMVERSION;
-
- const unsigned long ORPCF_NULL = 0;
- const unsigned long ORPCF_LOCAL = 1;
- const unsigned long ORPCF_RESERVED1 = 2;
- const unsigned long ORPCF_RESERVED2 = 4;
- const unsigned long ORPCF_RESERVED3 = 8;
- const unsigned long ORPCF_RESERVED4 = 16;
-
- typedef struct tagORPC_EXTENT {
- GUID id;
- unsigned long size;
- [size_is((size+7)&~7)] byte data[];
- } ORPC_EXTENT;
-
- typedef struct tagORPC_EXTENT_ARRAY {
- unsigned long size;
- unsigned long reserved;
- [size_is((size+1)&~1,), unique] ORPC_EXTENT **extent;
- } ORPC_EXTENT_ARRAY;
-
- typedef struct tagORPCTHIS {
- COMVERSION version;
- unsigned long flags;
- unsigned long reserved1;
- CID cid;
- [unique] ORPC_EXTENT_ARRAY *extensions;
- } ORPCTHIS;
-
- typedef struct tagORPCTHAT {
- unsigned long flags;
- [unique] ORPC_EXTENT_ARRAY *extensions;
- } ORPCTHAT;
-
- const unsigned short NCADG_IP_UDP = 0x08;
- const unsigned short NCACN_IP_TCP = 0x07;
- const unsigned short NCADG_IPX = 0x0E;
- const unsigned short NCACN_SPX = 0x0C;
- const unsigned short NCACN_NB_NB = 0x12;
- const unsigned short NCACN_NB_IPX = 0x0D;
- const unsigned short NCACN_DNET_NSP = 0x04;
- const unsigned short NCACN_HTTP = 0x1F;
-
- typedef struct tagSTRINGBINDING {
- unsigned short wTowerId;
- [string] unsigned short aNetworkAddr[];
- } STRINGBINDING;
-
- const unsigned short COM_C_AUTHZ_NONE = 0xffff;
-
- typedef struct tagSECURITYBINDING {
- unsigned short wAuthnSvc;
- unsigned short wAuthzSvc;
- [string] unsigned short aPrincName[];
- } SECURITYBINDING;
-
- typedef struct tagDUALSTRINGARRAY {
- unsigned short wNumEntries;
- unsigned short wSecurityOffset;
- [size_is(wNumEntries)] unsigned short aStringArray[];
- } DUALSTRINGARRAY;
-
- const unsigned long OBJREF_SIGNATURE = 0x574f454d; /* "MEOW" */
- const unsigned long OBJREF_STANDARD = 0x1;
- const unsigned long OBJREF_HANDLER = 0x2;
- const unsigned long OBJREF_CUSTOM = 0x4;
- const unsigned long SORF_OXRES1 = 0x1;
- const unsigned long SORF_OXRES2 = 0x20;
- const unsigned long SORF_OXRES3 = 0x40;
- const unsigned long SORF_OXRES4 = 0x80;
- const unsigned long SORF_OXRES5 = 0x100;
- const unsigned long SORF_OXRES6 = 0x200;
- const unsigned long SORF_OXRES7 = 0x400;
- const unsigned long SORF_OXRES8 = 0x800;
- const unsigned long SORF_NULL = 0x0;
- const unsigned long SORF_NOPING = 0x1000;
-
- typedef struct tagSTDOBJREF {
- unsigned long flags;
- unsigned long cPublicRefs;
- OXID oxid;
- OID oid;
- IPID ipid;
- } STDOBJREF;
-
- typedef struct tagOBJREF {
- unsigned long signature;
- unsigned long flags;
- GUID iid;
- [switch_is(flags)] union {
- [case(OBJREF_STANDARD)] struct OR_STANDARD {
- STDOBJREF std;
- DUALSTRINGARRAY saResAddr;
- } u_standard;
- [case(OBJREF_HANDLER)] struct OR_HANDLER {
- STDOBJREF std;
- CLSID clsid;
- DUALSTRINGARRAY saResAddr;
- } u_handler;
- [case(OBJREF_CUSTOM)] struct OR_CUSTOM {
- CLSID clsid;
- unsigned long cbExtension;
- unsigned long size;
- [size_is(size), ref] byte *pData;
- } u_custom;
- } u_objref;
- } OBJREF;
-
- typedef struct tagMInterfacePointer {
- ULONG ulCntData;
- [size_is(ulCntData)] BYTE abData[];
- } MInterfacePointer;
-
- typedef [unique] MInterfacePointer *PMInterfacePointer;
-
-} /* interface ObjectRpcBaseTypes */
-
-[
- object,
- uuid(00000131-0000-0000-C000-000000000046)
-]
-interface IRemUnknown : IUnknown
-{
- typedef [unique] IRemUnknown *LPREMUNKNOWN;
-
- typedef struct tagREMQIRESULT {
- HRESULT hResult;
- STDOBJREF std;
- } REMQIRESULT;
-
- typedef struct tagREMINTERFACEREF {
- IPID ipid;
- unsigned long cPublicRefs;
- unsigned long cPrivateRefs;
- } REMINTERFACEREF;
-
- HRESULT RemQueryInterface(
- [in] REFIPID ripid,
- [in] unsigned long cRefs,
- [in] unsigned short cIids,
- [in, size_is(cIids)] IID *iids,
- [out, size_is(,cIids)] REMQIRESULT **ppQIResults);
-
- HRESULT RemAddRef(
- [in] unsigned short cInterfaceRefs,
- [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs,
- [out, size_is(cInterfaceRefs)] HRESULT *pResults);
-
- HRESULT RemRelease(
- [in] unsigned short cInterfaceRefs,
- [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs);
-}
-
-[
- object,
- uuid(00000142-0000-0000-C000-000000000046)
-]
-interface IRemUnknown2 : IRemUnknown
-{
- typedef [unique] IRemUnknown2 *LPREMUNKNOWN2;
-
- HRESULT RemQueryInterface2(
- [in] REFIPID ripid,
- [in] unsigned short cIids,
- [in, size_is(cIids)] IID *iids,
- [out, size_is(cIids)] HRESULT *phr,
- [out, size_is(cIids)] MInterfacePointer **ppMIF);
-}
-
-cpp_quote("#if 0")
-[
- uuid(99fcfec4-5260-101b-bbcb-00aa0021347a),
- pointer_default(unique)
-]
-interface IOXIDResolver
-{
- [idempotent] error_status_t ResolveOxid(
- [in] handle_t hRpc,
- [in] OXID *pOxid,
- [in] unsigned short cRequestedProtseqs,
- [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[],
- [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings,
- [out, ref] IPID *pipidRemUnknown,
- [out, ref] DWORD *pAuthnHint);
-
- [idempotent] error_status_t SimplePing(
- [in] handle_t hRpc,
- [in] SETID *pSetId);
-
- [idempotent] error_status_t ComplexPing(
- [in] handle_t hRpc,
- [in, out] SETID *pSetId,
- [in] unsigned short SequenceNum,
- [in] unsigned short cAddToSet,
- [in] unsigned short cDelFromSet,
- [in, unique, size_is(cAddToSet)] OID AddToSet[],
- [in, unique, size_is(cDelFromSet)] OID DelFromSet[],
- [out] unsigned short *pPingBackoffFactor);
-
- [idempotent] error_status_t ServerAlive(
- [in] handle_t hRpc);
-
- [idempotent] error_status_t ResolveOxid2(
- [in] handle_t hRpc,
- [in] OXID *pOxid,
- [in] unsigned short cRequestedProtseqs,
- [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[],
- [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings,
- [out, ref] IPID *pipidRemUnknown,
- [out, ref] DWORD *pAuthnHint,
- [out, ref] COMVERSION *pComVersion);
-}
-
-[
- uuid(4d9f4ab8-7d1c-11cf-861e-0020af6e7c57),
- pointer_default(unique)
-]
-interface IRemoteActivation
-{
- const unsigned long MODE_GET_CLASS_OBJECT = 0xffffffff;
-
- HRESULT RemoteActivation(
- [in] handle_t hRpc,
- [in] ORPCTHIS *ORPCthis,
- [out] ORPCTHAT *ORPCthat,
- [in] GUID *Clsid,
- [in, string, unique] WCHAR *pwszObjectName,
- [in, unique] MInterfacePointer *pObjectStorage,
- [in] DWORD ClientImpLevel,
- [in] DWORD Mode,
- [in] DWORD Interfaces,
- [in, unique, size_is(Interfaces)] IID *pIIDs,
- [in] unsigned short cRequestedProtseqs,
- [in, size_is(cRequestedProtseqs)] unsigned short RequestedProtseqs[],
- [out] OXID *pOxid,
- [out] DUALSTRINGARRAY **ppdsaOxidBindings,
- [out] IPID *pipidRemUnknown,
- [out] DWORD *pAuthnHint,
- [out] COMVERSION *pServerVersion,
- [out] HRESULT *phr,
- [out,size_is(Interfaces)] MInterfacePointer **ppInterfaceData,
- [out,size_is(Interfaces)] HRESULT *pResults);
-}
-cpp_quote("#endif")
+/*
+ * Copyright 2003 Ove KÕven, TransGaming Technologies
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* see http://www.microsoft.com/msj/0398/dcom.htm */
+/* and the official DCOM specification
+ * (there's a copy at http://www.grimes.demon.co.uk/DCOM/DCOMSpec.htm) */
+
+import "unknwn.idl";
+
+[
+ uuid(99fcfe60-5260-101b-bbcb-00aa0021347a),
+ pointer_default(unique)
+]
+interface ObjectRpcBaseTypes
+{
+ typedef unsigned hyper ID;
+ typedef ID MID;
+ typedef ID OXID;
+ typedef ID OID;
[truncated at 1000 lines; 3575 more skipped]