ReactOS 0.4.16-dev-1946-g52006dd
ole_server.c
Go to the documentation of this file.
1/*
2 * OLE client/server test suite
3 *
4 * Copyright 2013 Dmitry Timoshkov
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#define COBJMACROS
22#define CONST_VTABLE
23
24#include <windows.h>
25#include <exdisp.h>
26#include <tlhelp32.h>
27#include <stdio.h>
28#include <assert.h>
29#include "wine/test.h"
30
31#include <initguid.h>
32DEFINE_GUID(CLSID_WineTestObject, 0xdeadbeef,0xdead,0xbeef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef);
33DEFINE_GUID(CLSID_UnknownUnmarshal,0x4c1e39e1,0xe3e3,0x4296,0xaa,0x86,0xec,0x93,0x8d,0x89,0x6e,0x92);
34
36{
38};
39
40static const struct
41{
42 const GUID *guid;
43 const char *name;
44} guid_name[] =
45{
46#define GUID_NAME(guid) \
47 { &IID_##guid, #guid }
56 { &CLSID_IdentityUnmarshal, "CLSID_IdentityUnmarshal" },
57 { &CLSID_UnknownUnmarshal, "CLSID_UnknownUnmarshal" },
58#undef GUID_NAME
59};
60
62
63/******************************* OLE server *******************************/
64typedef struct
65{
69
71{
72 return CONTAINING_RECORD(iface, UnknownImpl, IUnknown_iface);
73}
74
76 REFIID iid, void **ppv)
77{
79
80 trace("server: unknown_QueryInterface: %p,%s,%p\n", iface, debugstr_guid(iid), ppv);
81
82 if (!ppv) return E_INVALIDARG;
83
84 if (IsEqualIID(&IID_IUnknown, iid))
85 {
86 *ppv = &This->IUnknown_iface;
87 IUnknown_AddRef(&This->IUnknown_iface);
88 return S_OK;
89 }
90
91 *ppv = NULL;
92 return E_NOINTERFACE;
93}
94
96{
99
101
102 trace("server: unknown_AddRef: %p, ref %u\n", iface, ref);
103 return ref;
104}
105
107{
110
112
113 trace("server: unknown_Release: %p, ref %u\n", iface, ref);
114 if (ref == 0) HeapFree(GetProcessHeap(), 0, This);
115 return ref;
116}
117
118static const IUnknownVtbl UnknownImpl_Vtbl =
119{
123};
124
125typedef struct
126{
127 IClassFactory IClassFactory_iface;
128 LONG ref;
130
132{
133 return CONTAINING_RECORD(iface, ClassFactoryImpl, IClassFactory_iface);
134}
135
137 REFIID iid, void **ppv)
138{
140
141 trace("server: factory_QueryInterface: %p,%s,%p\n", iface, debugstr_guid(iid), ppv);
142
143 if (!ppv) return E_INVALIDARG;
144
145 if (IsEqualIID(&IID_IUnknown, iid) ||
147 {
148 IClassFactory_AddRef(&This->IClassFactory_iface);
149 *ppv = &This->IClassFactory_iface;
150 return S_OK;
151 }
152
153 *ppv = NULL;
154 return E_NOINTERFACE;
155}
156
158{
161
163
164 trace("server: factory_AddRef: %p, ref %u\n", iface, ref);
165 return ref;
166}
167
169{
172
174
175 trace("server: factory_Release: %p, ref %u\n", iface, ref);
176 return ref;
177}
178
180 IUnknown *punkouter, REFIID iid, void **ppv)
181{
183 HRESULT hr;
184
185 trace("server: factory_CreateInstance: %p,%s,%p\n", iface, debugstr_guid(iid), ppv);
186
187 if (punkouter) return CLASS_E_NOAGGREGATION;
188
189 unknown = HeapAlloc(GetProcessHeap(), 0, sizeof(*unknown));
190 if (!unknown) return E_OUTOFMEMORY;
191
192 unknown->IUnknown_iface.lpVtbl = &UnknownImpl_Vtbl;
193 unknown->ref = 0;
194 IUnknown_AddRef(&unknown->IUnknown_iface);
195
196 hr = IUnknown_QueryInterface(&unknown->IUnknown_iface, iid, ppv);
197 IUnknown_Release(&unknown->IUnknown_iface);
198
199 return hr;
200}
201
203{
205
206 trace("server: factory_LockServer: %p,%d, ref %u\n", iface, lock, ref);
207 return S_OK;
208}
209
210static const IClassFactoryVtbl ClassFactoryImpl_Vtbl =
211{
217};
218
220
221static void ole_server(void)
222{
223 HRESULT hr;
224 DWORD key;
225
226 trace("server: starting %u\n", GetCurrentProcessId());
227
229 if (hr == S_OK)
230 {
231 trace("server: registering class object\n");
232 hr = CoRegisterClassObject(&CLSID_WineTestObject, (IUnknown *)&factory.IClassFactory_iface,
233 CLSCTX_SERVER, REGCLS_MULTIPLEUSE, &key);
234 if (hr == S_OK)
235 {
236 HANDLE done_event, init_done_event;
237
238 done_event = OpenEventA(SYNCHRONIZE, FALSE, "ole_server_done_event");
239 ok(done_event != 0, "server: OpenEvent error %d\n", GetLastError());
240 init_done_event = OpenEventA(EVENT_MODIFY_STATE, FALSE, "ole_server_init_done_event");
241 ok(init_done_event != 0, "server: OpenEvent error %d\n", GetLastError());
242
243 SetEvent(init_done_event);
244
245 trace("server: waiting for requests\n");
246 WaitForSingleObject(done_event, INFINITE);
247
248 /* 1 remainining class ref is supposed to be cleared by CoRevokeClassObject */
249 ok(class_ref == 1, "expected 1 class refs, got %d\n", class_ref);
250 ok(!obj_ref, "expected 0 object refs, got %d\n", obj_ref);
251 ok(!server_locks, "expected 0 server locks, got %d\n", server_locks);
252
253 CloseHandle(done_event);
254 CloseHandle(init_done_event);
255 if (0)
256 {
257 /* calling CoRevokeClassObject terminates process under Win7 */
258 trace("call CoRevokeClassObject\n");
260 trace("ret CoRevokeClassObject\n");
261 }
262 }
263 trace("server: call CoUninitialize\n");
265 trace("server: ret CoUninitialize\n");
266 }
267
268 trace("server: exiting %u\n", GetCurrentProcessId());
269}
270
271/******************************* OLE client *******************************/
272static BOOL register_server(const char *server, BOOL inproc_handler)
273{
274 static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
275 DWORD ret;
276 HKEY root;
277 WCHAR buf[39 + 6];
278 char server_path[MAX_PATH];
279
280 lstrcpyA(server_path, server);
281 lstrcatA(server_path, " ole_server");
282
284 StringFromGUID2(&CLSID_WineTestObject, buf + 6, 39);
285
288 if (ret == ERROR_SUCCESS)
289 {
290 ret = RegSetValueA(root, "LocalServer32", REG_SZ, server_path, strlen(server_path));
291 ok(ret == ERROR_SUCCESS, "RegSetValue error %u\n", ret);
292
293 if (inproc_handler)
294 {
295 ret = RegSetValueA(root, "InprocHandler32", REG_SZ, "ole32.dll", 9);
296 ok(ret == ERROR_SUCCESS, "RegSetValue error %u\n", ret);
297 }
298
300 }
301
302 return ret == ERROR_SUCCESS;
303}
304
305static void unregister_server(void)
306{
307 static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
308 DWORD ret;
309 HKEY root;
310 WCHAR buf[39 + 6];
311
313 StringFromGUID2(&CLSID_WineTestObject, buf + 6, 39);
314
316 DELETE, NULL, &root, NULL);
317 if (ret == ERROR_SUCCESS)
318 {
319 ret = RegDeleteKeyA(root, "InprocHandler32");
320 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
321 ret = RegDeleteKeyA(root, "LocalServer32");
322 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
323 ret = RegDeleteKeyA(root, "");
324 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
326 }
327}
328
329static HANDLE start_server(const char *argv0)
330{
332 STARTUPINFOA si;
334 char cmdline[MAX_PATH * 2];
335 BOOL ret;
336
337 memset(&si, 0, sizeof(si));
338 si.cb = sizeof(si);
342 si.hStdError = si.hStdOutput;
343
344 sa.nLength = sizeof(sa);
345 sa.lpSecurityDescriptor = NULL;
346 sa.bInheritHandle = TRUE;
347
348 sprintf(cmdline, "\"%s\" ole_server -server", argv0);
349 ret = CreateProcessA(argv0, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
350 ok(ret, "CreateProcess(%s) error %d\n", cmdline, GetLastError());
351 if (!ret) return 0;
352
353 CloseHandle(pi.hThread);
354 return pi.hProcess;
355}
356
358{
359 CLSID clsid = CLSID_WineTestObject;
360 HRESULT hr;
363 IOleObject *oleobj;
364 IRunnableObject *runobj;
365 DWORD ret;
366 HANDLE mapping, done_event, init_done_event, process;
367 struct winetest_info *info;
368 int argc;
369 char **argv;
370
371 mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, "winetest_ole_server");
372 ok(mapping != 0, "CreateFileMapping failed\n");
374
376
377 done_event = CreateEventA(NULL, TRUE, FALSE, "ole_server_done_event");
378 ok(done_event != 0, "CreateEvent error %d\n", GetLastError());
379 init_done_event = CreateEventA(NULL, TRUE, FALSE, "ole_server_init_done_event");
380 ok(init_done_event != 0, "CreateEvent error %d\n", GetLastError());
381
382 if (argc > 2)
383 {
384 if (!lstrcmpiA(argv[2], "-Embedding"))
385 {
386 trace("server: Refusing to be run by ole32\n");
387 return;
388 }
389
390 if (!lstrcmpiA(argv[2], "-server"))
391 {
392 info->child_failures = 0;
393 ole_server();
394 info->child_failures = winetest_get_failures();
395 return;
396 }
397
398 trace("server: Unknown parameter: %s\n", argv[2]);
399 return;
400 }
401
402 if (!register_server(argv[0], FALSE))
403 {
404 win_skip("not enough permissions to create a server CLSID key\n");
405 return;
406 }
407
408 if (!(process = start_server(argv[0])))
409 {
411 return;
412 }
413 WaitForSingleObject(init_done_event, 5000);
414
416 ok(hr == S_OK, "OleInitialize error %#x\n", hr);
417
418 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&unknown);
419 ok(hr == REGDB_E_CLASSNOTREG, "expected REGDB_E_CLASSNOTREG, got %#x\n", hr);
420
421 if (!register_server(argv[0], TRUE))
422 {
423 win_skip("not enough permissions to create a server CLSID key\n");
425 return;
426 }
427
428 trace("call CoCreateInstance(&IID_NULL)\n");
429 hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_NULL, (void **)&unknown);
430 trace("ret CoCreateInstance(&IID_NULL)\n");
431 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
432
433 /* in-process handler supports IID_IUnknown starting from Vista */
434 trace("call CoCreateInstance(&IID_IUnknown)\n");
435 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&unknown);
436 trace("ret CoCreateInstance(&IID_IUnknown)\n");
437 ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* XP,win2000 and earlier */, "CoCreateInstance(IID_IUnknown) error %#x\n", hr);
438 if (hr != S_OK)
439 {
440 win_skip("In-process handler doesn't support IID_IUnknown on this platform\n");
442 }
443
444 trace("call CoCreateInstance(&IID_IOleObject)\n");
445 hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IOleObject, (void **)&oleobj);
446 trace("ret CoCreateInstance(&IID_IOleObject)\n");
447 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
448
449 trace("call IUnknown_QueryInterface(&IID_IRunnableObject)\n");
450 hr = IUnknown_QueryInterface(unknown, &IID_IRunnableObject, (void **)&runobj);
451 trace("ret IUnknown_QueryInterface(&IID_IRunnableObject)\n");
452 ok(hr == S_OK, "QueryInterface(&IID_IRunnableObject) error %#x\n", hr);
453
454 ret = IRunnableObject_IsRunning(runobj);
455 ok(!ret, "expected 0, got %d\n", ret);
456
457 trace("call OleRun\n");
458 hr = OleRun(unknown);
459 trace("ret OleRun\n");
461 ok(hr == S_OK, "OleRun error %#x\n", hr);
462
463 ret = IRunnableObject_IsRunning(runobj);
465 ok(ret == 1, "expected 1, got %d\n", ret);
466
467 trace("call IRunnableObject_Release\n");
468 ret = IRunnableObject_Release(runobj);
469 trace("ret IRunnableObject_Release\n");
470 ok(ret == 1, "expected ref 1, got %u\n", ret);
471
472 trace("call IUnknown_QueryInterface(&IID_IOleObject)\n");
473 hr = IUnknown_QueryInterface(unknown, &IID_IOleObject, (void **)&oleobj);
474 trace("ret IUnknown_QueryInterface(&IID_IOleObject)\n");
475 ok(hr == S_OK, "QueryInterface(&IID_IOleObject) error %#x\n", hr);
476
477 trace("call IOleObject_Release\n");
478 ret = IOleObject_Release(oleobj);
479 trace("ret IOleObject_Release\n");
480 ok(ret == 1, "expected ref 1, got %u\n", ret);
481
482 trace("call IUnknown_Release\n");
483 ret = IUnknown_Release(unknown);
484 trace("ret IUnknown_Release\n");
485 ok(!ret, "expected ref 0, got %u\n", ret);
486
488 /* local server supports IID_IUnknown */
489 trace("call CoCreateInstance(&IID_IUnknown)\n");
490 hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IUnknown, (void **)&unknown);
491 trace("ret CoCreateInstance(&IID_IUnknown)\n");
492 ok(hr == S_OK, "CoCreateInstance(IID_IUnknown) error %#x\n", hr);
493
494 trace("call IUnknown_QueryInterface(&IID_IRunnableObject)\n");
495 hr = IUnknown_QueryInterface(unknown, &IID_IRunnableObject, (void **)&runobj);
496 trace("ret IUnknown_QueryInterface(&IID_IRunnableObject)\n");
497 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
498
499 trace("call OleRun\n");
500 hr = OleRun(unknown);
501 trace("ret OleRun\n");
502 ok(hr == S_OK, "OleRun error %#x\n", hr);
503
504 trace("call IUnknown_QueryInterface(&IID_IOleObject)\n");
505 hr = IUnknown_QueryInterface(unknown, &IID_IOleObject, (void **)&oleobj);
506 trace("ret IUnknown_QueryInterface(&IID_IOleObject)\n");
507 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
508
509 trace("call IUnknown_Release\n");
510 ret = IUnknown_Release(unknown);
511 trace("ret IUnknown_Release\n");
512 ok(!ret, "expected ref 0, got %u\n", ret);
513
514 trace("call CoGetClassObject(&IID_IClassFactory)\n");
515 hr = CoGetClassObject(&clsid, CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void **)&factory);
516 trace("ret CoGetClassObject(&IID_IClassFactory)\n");
517 ok(hr == S_OK, "CoGetClassObject error %#x\n", hr);
518
519 trace("call IClassFactory_CreateInstance(&IID_NULL)\n");
520 hr = IClassFactory_CreateInstance(factory, NULL, &IID_NULL, (void **)&oleobj);
521 trace("ret IClassFactory_CreateInstance(&IID_NULL)\n");
522 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
523
524 trace("call IClassFactory_CreateInstance(&IID_IOleObject)\n");
525 hr = IClassFactory_CreateInstance(factory, NULL, &IID_IOleObject, (void **)&oleobj);
526 trace("ret IClassFactory_CreateInstance(&IID_IOleObject)\n");
527 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
528
529 trace("call IClassFactory_Release\n");
530 ret = IClassFactory_Release(factory);
531 trace("ret IClassFactory_Release\n");
532 ok(!ret, "expected ref 0, got %u\n", ret);
533
534 trace("signalling termination\n");
535 SetEvent(done_event);
537 ok(ret == WAIT_OBJECT_0, "server failed to terminate\n");
538
540
542
543 if (info->child_failures)
544 {
545 trace("%d failures in child process\n", info->child_failures);
546 winetest_add_failures(info->child_failures);
547 }
548}
static int argc
Definition: ServiceArgs.c:12
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define RegCloseKey(hKey)
Definition: registry.h:49
struct _root root
const CLSID CLSID_IdentityUnmarshal
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define ERROR_SUCCESS
Definition: deptool.c:10
static const WCHAR clsidW[]
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueA(HKEY hKeyOriginal, LPCSTR lpSubKey, DWORD dwType, LPCSTR lpData, DWORD cbData)
Definition: reg.c:4954
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1605
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define FILE_MAP_READ
Definition: compat.h:776
#define lstrcpyW
Definition: compat.h:749
#define MapViewOfFile
Definition: compat.h:745
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4749
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4227
HRESULT WINAPI CoRegisterClassObject(REFCLSID rclsid, LPUNKNOWN pUnk, DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister)
Definition: compobj.c:2897
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI DECLSPEC_HOTPATCH CoRevokeClassObject(DWORD dwRegister)
Definition: compobj.c:1086
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:2002
HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3103
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
HRESULT WINAPI DECLSPEC_HOTPATCH OleRun(LPUNKNOWN pUnknown)
Definition: ole2.c:1205
void WINAPI DECLSPEC_HOTPATCH OleUninitialize(void)
Definition: ole2.c:230
return ret
Definition: mutex.c:146
#define INFINITE
Definition: serial.h:102
HANDLE NTAPI CreateFileMappingA(IN HANDLE hFile, IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes, IN DWORD flProtect, IN DWORD dwMaximumSizeHigh, IN DWORD dwMaximumSizeLow, IN LPCSTR lpName)
Definition: filemap.c:23
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define debugstr_guid
Definition: kernel32.h:35
#define REG_SZ
Definition: layer.c:22
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
#define win_skip
Definition: minitest.h:67
LONG winetest_get_failures(void)
void winetest_add_failures(LONG new_failures)
#define todo_wine
Definition: minitest.h:80
#define sprintf
Definition: sprintf.c:45
static void test_local_server(void)
Definition: marshal.c:3824
static refpint_t pi[]
Definition: server.c:112
#define argv
Definition: mplay32.c:18
const CLSID * clsid
Definition: msctf.cpp:50
#define SYNCHRONIZE
Definition: nt_native.h:61
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_CREATE_SUB_KEY
Definition: nt_native.h:1021
#define DELETE
Definition: nt_native.h:57
#define KEY_WRITE
Definition: nt_native.h:1034
@ REGCLS_MULTIPLEUSE
Definition: objbase.h:393
@ COINIT_MULTITHREADED
Definition: objbase.h:279
static UnknownImpl * impl_from_IUnknown(IUnknown *iface)
Definition: ole_server.c:70
static const IUnknownVtbl UnknownImpl_Vtbl
Definition: ole_server.c:118
static ULONG WINAPI ClassFactoryImpl_Release(IClassFactory *iface)
Definition: ole_server.c:168
static ULONG WINAPI UnknownImpl_AddRef(IUnknown *iface)
Definition: ole_server.c:95
static ClassFactoryImpl factory
Definition: ole_server.c:219
static HRESULT WINAPI ClassFactoryImpl_LockServer(IClassFactory *iface, BOOL lock)
Definition: ole_server.c:202
static ULONG WINAPI ClassFactoryImpl_AddRef(IClassFactory *iface)
Definition: ole_server.c:157
static void ole_server(void)
Definition: ole_server.c:221
static HRESULT WINAPI ClassFactoryImpl_CreateInstance(IClassFactory *iface, IUnknown *punkouter, REFIID iid, void **ppv)
Definition: ole_server.c:179
static LONG server_locks
Definition: ole_server.c:61
static void unregister_server(void)
Definition: ole_server.c:305
const char * name
Definition: ole_server.c:43
const GUID * guid
Definition: ole_server.c:42
static ClassFactoryImpl * impl_from_IClassFactory(IClassFactory *iface)
Definition: ole_server.c:131
static HRESULT WINAPI ClassFactoryImpl_QueryInterface(IClassFactory *iface, REFIID iid, void **ppv)
Definition: ole_server.c:136
static LONG class_ref
Definition: ole_server.c:61
static LONG obj_ref
Definition: ole_server.c:61
static ULONG WINAPI UnknownImpl_Release(IUnknown *iface)
Definition: ole_server.c:106
static const IClassFactoryVtbl ClassFactoryImpl_Vtbl
Definition: ole_server.c:210
#define GUID_NAME(guid)
static HRESULT WINAPI UnknownImpl_QueryInterface(IUnknown *iface, REFIID iid, void **ppv)
Definition: ole_server.c:75
static const struct @1823 guid_name[]
static BOOL register_server(const char *server, BOOL inproc_handler)
Definition: ole_server.c:272
static HANDLE start_server(const char *argv0)
Definition: ole_server.c:329
const GUID IID_IRunnableObject
const GUID IID_IOleObject
long LONG
Definition: pedump.c:60
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
int winetest_get_mainargs(char ***pargv)
#define memset(x, y, z)
Definition: compat.h:39
static char argv0[MAX_PATH]
Definition: shlexec.c:49
HRESULT hr
Definition: shlfolder.c:183
TCHAR * cmdline
Definition: stretchblt.cpp:32
IUnknown IUnknown_iface
Definition: ole_server.c:66
Definition: main.c:439
IClassFactory IClassFactory_iface
Definition: main.c:440
Definition: copy.c:22
Definition: send.c:48
LONG child_failures
Definition: ole_server.c:37
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:637
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
HANDLE WINAPI DECLSPEC_HOTPATCH OpenEventA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: synch.c:669
rwlock_t lock
Definition: tcpcore.h:0
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
static rfbScreenInfoPtr server
Definition: vnc.c:74
#define STD_OUTPUT_HANDLE
Definition: winbase.h:292
#define STD_INPUT_HANDLE
Definition: winbase.h:291
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FILE_MAP_WRITE
Definition: winbase.h:156
#define EVENT_MODIFY_STATE
Definition: winbase.h:165
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
#define WAIT_OBJECT_0
Definition: winbase.h:383
#define STARTF_USESTDHANDLES
Definition: winbase.h:476
#define WINAPI
Definition: msvc.h:6
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:3801
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
__wchar_t WCHAR
Definition: xmlstorage.h:180