ReactOS 0.4.16-dev-1946-g52006dd
cstub.c
Go to the documentation of this file.
1/*
2 * Unit test suite for cstubs
3 *
4 * Copyright 2006 Huw Davies
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#include <stdarg.h>
22#include <stdio.h>
23
24#define COBJMACROS
25
26#include <windef.h>
27#include <winbase.h>
28#include <winnt.h>
29#include <winerror.h>
30
31#include "initguid.h"
32#include <ole2.h>
33#include "rpc.h"
34#include "rpcdce.h"
35#include "rpcproxy.h"
36
37#include "wine/test.h"
38
39#include "cstub_p.h"
40
42
44{
46}
47
49{
51}
52
53static GUID IID_if1 = {0x12345678, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
54static GUID IID_if2 = {0x12345679, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
55static GUID IID_if3 = {0x1234567a, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
56static GUID IID_if4 = {0x1234567b, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
57static CLSID CLSID_psfact = {0x1234567c, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
58
59static int my_alloc_called;
60static int my_free_called;
61
63{
65 return malloc(size);
66}
67
68static void CALLBACK my_free(void *ptr)
69{
71 free(ptr);
72}
73
74typedef struct _MIDL_PROC_FORMAT_STRING
75{
76 short Pad;
77 unsigned char Format[ 2 ];
79
80typedef struct _MIDL_TYPE_FORMAT_STRING
81{
82 short Pad;
83 unsigned char Format[ 2 ];
85
86
88{
89 0,
90 {
91 0, 0
92 }
93};
94
96{
97 0,
98 {
99 0, 0
100 }
101};
102
104 {
105 NULL,
106 my_alloc,
107 my_free,
108 { 0 },
109 0,
110 0,
111 0,
112 0,
114 1, /* -error bounds_check flag */
115 0x20000, /* Ndr library version */
116 0,
117 0x50100a4, /* MIDL Version 5.1.164 */
118 0,
119 NULL,
120 0, /* notify & notify_flag routine table */
121 1, /* Flags */
122 0, /* Reserved3 */
123 0, /* Reserved4 */
124 0 /* Reserved5 */
125 };
126
128{
129 return S_OK;
130}
131
134 IRpcChannelBuffer *_pRpcChannelBuffer,
135 PRPC_MESSAGE _pRpcMessage,
136 DWORD *_pdwStubPhase)
137{
138 trace("fn1 stub\n");
139}
140
142{
143 return S_OK;
144}
145
148 IRpcChannelBuffer *_pRpcChannelBuffer,
149 PRPC_MESSAGE _pRpcMessage,
150 DWORD *_pdwStubPhase)
151{
152 trace("fn2 stub\n");
153}
154
155static CINTERFACE_PROXY_VTABLE(5) if1_proxy_vtbl =
156{
157 { &IID_if1 },
163 }
164};
165
166
167static const unsigned short if1_FormatStringOffsetTable[] =
168 {
169 0,
170 0
171 };
172
174 {
176 0,
179 0,
180 0,
181 0,
182 0};
183
184
186{
189};
190
192{
193 {
194 &IID_if1,
196 5,
197 &if1_table[-3]
198 },
199 {
210 }
211};
212
213static CINTERFACE_PROXY_VTABLE(13) if2_proxy_vtbl =
214{
215 { &IID_if2 },
219 0,
220 0,
221 0,
222 0,
223 0,
224 0,
225 0,
226 0,
227 0,
228 0
229 }
230};
231
232static const unsigned short if2_FormatStringOffsetTable[] =
233 {
234 (unsigned short) -1,
235 (unsigned short) -1,
236 (unsigned short) -1,
237 (unsigned short) -1,
238 (unsigned short) -1,
239 (unsigned short) -1,
240 (unsigned short) -1,
241 (unsigned short) -1,
242 (unsigned short) -1,
243 (unsigned short) -1,
244 0
245 };
246
248 {
250 0,
253 0,
254 0,
255 0,
256 0};
257
258
260{
271};
272
274{
275 {
276 &IID_if2,
278 13,
279 &if2_table[-3]
280 },
281 { 0, 0, test_CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0 }
282};
283
284static CINTERFACE_PROXY_VTABLE(5) if3_proxy_vtbl =
285{
286 { &IID_if3 },
291 0
292 }
293};
294
295
296static const unsigned short if3_FormatStringOffsetTable[] =
297 {
298 0,
299 0
300 };
301
303 {
305 0,
308 0,
309 0,
310 0,
311 0};
312
314{
315 {
316 &IID_if3,
318 5,
319 &if1_table[-3]
320 },
321 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
322};
323
324static CINTERFACE_PROXY_VTABLE(7) if4_proxy_vtbl =
325{
326 { &IID_if4 },
330 0,
331 0,
332 0,
333 0
334 }
335};
336
337static const unsigned short if4_FormatStringOffsetTable[] =
338 {
339 (unsigned short) -1,
340 (unsigned short) -1,
341 (unsigned short) -1,
342 (unsigned short) -1,
343 0
344 };
345
347 {
349 0,
352 0,
353 0,
354 0,
355 0};
356
358{
359 {
360 &IID_if4,
362 7,
363 &if2_table[-3]
364 },
365 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
366};
367
369{
370 (const CInterfaceProxyVtbl *) &if1_proxy_vtbl,
371 (const CInterfaceProxyVtbl *) &if2_proxy_vtbl,
372 (const CInterfaceProxyVtbl *) &if3_proxy_vtbl,
373 (const CInterfaceProxyVtbl *) &if4_proxy_vtbl,
374 NULL
375};
376
378{
383 NULL
384};
385
387{
388 "if1",
389 "if2",
390 "if3",
391 "if4",
392 NULL
393};
394
395static const IID *base_iid_list[] =
396{
397 NULL,
398 &IID_ITypeLib,
399 NULL,
401 NULL
402};
403
404#define cstub_CHECK_IID(n) IID_GENERIC_CHECK_IID( cstub, pIID, n)
405
406static int __stdcall iid_lookup( const IID * pIID, int * pIndex )
407{
409
410 IID_BS_LOOKUP_INITIAL_TEST( cstub, 4, 4 )
411 IID_BS_LOOKUP_NEXT_TEST( cstub, 2 )
412 IID_BS_LOOKUP_NEXT_TEST( cstub, 1 )
414
415}
416
417
418static BOOL check_address(void *actual, void *expected)
419{
420 static void *ole32_start = NULL;
421 static void *ole32_end = NULL;
422 static void *combase_start = NULL;
423 static void *combase_end = NULL;
424
425 if (actual == expected)
426 return TRUE;
427
428 /* On Win7, actual can be located inside ole32.dll */
429 if (ole32_start == NULL || ole32_end == NULL)
430 {
431 PIMAGE_NT_HEADERS nt_headers;
432 ole32_start = (void *) GetModuleHandleA("ole32.dll");
433 if (ole32_start == NULL)
434 return FALSE;
435 nt_headers = (PIMAGE_NT_HEADERS)((char *) ole32_start + ((PIMAGE_DOS_HEADER) ole32_start)->e_lfanew);
436 ole32_end = (void *)((char *) ole32_start + nt_headers->OptionalHeader.SizeOfImage);
437 }
438
439 if (ole32_start <= actual && actual < ole32_end)
440 return TRUE;
441
442 /* On Win8, actual can be located inside combase.dll */
443 if (combase_start == NULL || combase_end == NULL)
444 {
445 PIMAGE_NT_HEADERS nt_headers;
446 combase_start = (void *) GetModuleHandleA("combase.dll");
447 if (combase_start == NULL)
448 return FALSE;
449 nt_headers = (PIMAGE_NT_HEADERS)((char *) combase_start + ((PIMAGE_DOS_HEADER) combase_start)->e_lfanew);
450 combase_end = (void *)((char *) combase_start + nt_headers->OptionalHeader.SizeOfImage);
451 }
452
453 return (combase_start <= actual && actual < combase_end);
454}
455
457{
460 (const PCInterfaceName *) &if_name_list,
461 (const IID **) &base_iid_list,
462 &iid_lookup,
463 4,
464 1,
465 NULL,
466 0,
467 0,
468 0
469};
470
473 NULL
474};
475
476
478{
479 HMODULE rpcrt4 = GetModuleHandleA("rpcrt4.dll");
480 IPSFactoryBuffer *ppsf = NULL;
481 const PCInterfaceProxyVtblList* proxy_vtbl;
482 const PCInterfaceStubVtblList* stub_vtbl;
483 const CLSID CLSID_Unknown = {0x45678, 0x1234, 0x6666, {0xff, 0x67, 0x45, 0x98, 0x76, 0x12, 0x34, 0x56}};
484 static const GUID * const interfaces[] = { &IID_if1, &IID_if2, &IID_if3, &IID_if4 };
485 UINT i;
486 HRESULT r;
487 HMODULE hmod = GetModuleHandleA("rpcrt4.dll");
488 void *CStd_QueryInterface = GetProcAddress(hmod, "CStdStubBuffer_QueryInterface");
489 void *CStd_AddRef = GetProcAddress(hmod, "CStdStubBuffer_AddRef");
490 void *CStd_Release = GetProcAddress(hmod, "NdrCStdStubBuffer_Release");
491 void *CStd_Connect = GetProcAddress(hmod, "CStdStubBuffer_Connect");
492 void *CStd_Disconnect = GetProcAddress(hmod, "CStdStubBuffer_Disconnect");
493 void *CStd_Invoke = GetProcAddress(hmod, "CStdStubBuffer_Invoke");
494 void *CStd_IsIIDSupported = GetProcAddress(hmod, "CStdStubBuffer_IsIIDSupported");
495 void *CStd_CountRefs = GetProcAddress(hmod, "CStdStubBuffer_CountRefs");
496 void *CStd_DebugServerQueryInterface = GetProcAddress(hmod, "CStdStubBuffer_DebugServerQueryInterface");
497 void *CStd_DebugServerRelease = GetProcAddress(hmod, "CStdStubBuffer_DebugServerRelease");
498
499 r = NdrDllGetClassObject(&CLSID_Unknown, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
501 ok(r == CLASS_E_CLASSNOTAVAILABLE, "NdrDllGetClassObject with unknown clsid should have returned CLASS_E_CLASSNOTAVAILABLE instead of 0x%lx\n", r);
502 ok(ppsf == NULL, "NdrDllGetClassObject should have set ppsf to NULL on failure\n");
503
504 r = NdrDllGetClassObject(&CLSID_psfact, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
506
507 ok(r == S_OK, "ret %08lx\n", r);
508 ok(ppsf != NULL, "ppsf == NULL\n");
509
510 proxy_vtbl = PSFactoryBuffer.pProxyFileList[0]->pProxyVtblList;
511 stub_vtbl = PSFactoryBuffer.pProxyFileList[0]->pStubVtblList;
512 ok(PSFactoryBuffer.pProxyFileList == proxy_file_list, "pfl not the same\n");
513 ok(proxy_vtbl == (PCInterfaceProxyVtblList *) &cstub_ProxyVtblList, "proxy vtbllist not the same\n");
514 ok(stub_vtbl == (PCInterfaceStubVtblList *) &cstub_StubVtblList, "stub vtbllist not the same\n");
515
516 /* if1 is non-delegating, if2 is delegating, if3 is non-delegating
517 but I've zero'ed the vtbl entries, similarly if4 is delegating
518 with zero'ed vtbl entries */
519
520#define VTBL_TEST_NOT_CHANGE_TO(name, i) \
521 ok(stub_vtbl[i]->Vtbl.name != CStd_##name, #name "vtbl %d updated %p %p\n", \
522 i, stub_vtbl[i]->Vtbl.name, CStd_##name )
523#define VTBL_TEST_CHANGE_TO(name, i) \
524 ok(check_address(stub_vtbl[i]->Vtbl.name, CStd_##name), #name "vtbl %d not updated %p %p\n", \
525 i, stub_vtbl[i]->Vtbl.name, CStd_##name )
526#define VTBL_TEST_ZERO(name, i) \
527 ok(stub_vtbl[i]->Vtbl.name == NULL, #name "vtbl %d not null %p\n", \
528 i, stub_vtbl[i]->Vtbl.name )
529
534 VTBL_TEST_NOT_CHANGE_TO(Disconnect, 0);
535 VTBL_TEST_NOT_CHANGE_TO(Invoke, 0);
536 VTBL_TEST_NOT_CHANGE_TO(IsIIDSupported, 0);
537 VTBL_TEST_NOT_CHANGE_TO(CountRefs, 0);
538 VTBL_TEST_NOT_CHANGE_TO(DebugServerQueryInterface, 0);
539 VTBL_TEST_NOT_CHANGE_TO(DebugServerRelease, 0);
540
545 VTBL_TEST_NOT_CHANGE_TO(Disconnect, 1);
546 VTBL_TEST_CHANGE_TO(Invoke, 1);
547 VTBL_TEST_CHANGE_TO(IsIIDSupported, 1);
548 VTBL_TEST_NOT_CHANGE_TO(CountRefs, 1);
549 VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 1);
550 VTBL_TEST_CHANGE_TO(DebugServerRelease, 1);
551
556 VTBL_TEST_CHANGE_TO(Disconnect, 2);
557 VTBL_TEST_CHANGE_TO(Invoke, 2);
558 VTBL_TEST_CHANGE_TO(IsIIDSupported, 2);
559 VTBL_TEST_CHANGE_TO(CountRefs, 2);
560 VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 2);
561 VTBL_TEST_CHANGE_TO(DebugServerRelease, 2);
562
567 VTBL_TEST_NOT_CHANGE_TO(Disconnect, 3);
568 VTBL_TEST_CHANGE_TO(Invoke, 3);
569 VTBL_TEST_CHANGE_TO(IsIIDSupported, 3);
570 VTBL_TEST_NOT_CHANGE_TO(CountRefs, 3);
571 VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 3);
572 VTBL_TEST_CHANGE_TO(DebugServerRelease, 3);
573
574#define VTBL_PROXY_TEST(i,num,ptr) \
575 ok( check_address(proxy_vtbl[i]->Vtbl[num], (ptr)), "wrong proxy %u func %u %p/%p\n", \
576 (i), (num), proxy_vtbl[i]->Vtbl[num], (ptr) )
577#define VTBL_PROXY_TEST_NOT_ZERO(i,num) \
578 ok( proxy_vtbl[i]->Vtbl[num] != NULL, "wrong proxy %u func %u is NULL\n", (i), (num))
579
585
586 VTBL_PROXY_TEST(1, 0, GetProcAddress(rpcrt4,"IUnknown_QueryInterface_Proxy"));
587 VTBL_PROXY_TEST(1, 1, GetProcAddress(rpcrt4,"IUnknown_AddRef_Proxy"));
588 VTBL_PROXY_TEST(1, 2, GetProcAddress(rpcrt4,"IUnknown_Release_Proxy"));
599
605
606 VTBL_PROXY_TEST(3, 0, GetProcAddress(rpcrt4,"IUnknown_QueryInterface_Proxy"));
607 VTBL_PROXY_TEST(3, 1, GetProcAddress(rpcrt4,"IUnknown_AddRef_Proxy"));
608 VTBL_PROXY_TEST(3, 2, GetProcAddress(rpcrt4,"IUnknown_Release_Proxy"));
613
614#undef VTBL_TEST_NOT_CHANGE_TO
615#undef VTBL_TEST_CHANGE_TO
616#undef VTBL_TEST_ZERO
617#undef VTBL_PROXY_TEST
618#undef VTBL_PROXY_TEST_NOT_ZERO
619
620 for (i = 0; i < ARRAY_SIZE(interfaces); i++)
621 ok( proxy_vtbl[i]->header.piid == interfaces[i],
622 "wrong proxy %u iid %p/%p\n", i, proxy_vtbl[i]->header.piid, interfaces[i] );
623
624 ok(PSFactoryBuffer.RefCount == 1, "ref count %ld\n", PSFactoryBuffer.RefCount);
625 IPSFactoryBuffer_Release(ppsf);
626
627 /* One can also search by IID */
628 r = NdrDllGetClassObject(&IID_if3, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
630 ok(r == S_OK, "ret %08lx\n", r);
631 ok(ppsf != NULL, "ppsf == NULL\n");
632 IPSFactoryBuffer_Release(ppsf);
633
634 r = NdrDllGetClassObject(&IID_if3, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
636 ok(r == S_OK, "ret %08lx\n", r);
637 ok(ppsf != NULL, "ppsf == NULL\n");
638 IPSFactoryBuffer_Release(ppsf);
639
640 /* but only if the PS factory implements it */
641 r = NdrDllGetClassObject(&IID_IDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
643 ok(r == CLASS_E_CLASSNOTAVAILABLE, "ret %08lx\n", r);
644
645 /* Create it again to return */
646 r = NdrDllGetClassObject(&CLSID_psfact, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
648 ok(r == S_OK, "ret %08lx\n", r);
649 ok(ppsf != NULL, "ppsf == NULL\n");
650
651 /* Because this PS factory is not loaded as a dll in the normal way, Windows 8 / 10
652 get confused and will crash when one of the proxies for the delegated ifaces is created.
653 Registering the ifaces fixes this (in fact calling CoRegisterPSClsid() with any IID / CLSID is enough). */
654
656 ok(r == S_OK, "ret %08lx\n", r);
658 ok(r == S_OK, "ret %08lx\n", r);
660 ok(r == S_OK, "ret %08lx\n", r);
662 ok(r == S_OK, "ret %08lx\n", r);
663
664 return ppsf;
665}
666
669{
671 ok(msg == (RPCOLEMESSAGE*)0xcafebabe, "msg ptr changed\n");
672 ok(channel == (IRpcChannelBuffer*)0xdeadbeef, "channel ptr changed\n");
673 return S_OK; /* returning any failure here results in an exception */
674}
675
676static IRpcStubBufferVtbl base_buffer_vtbl = {
677 (void*)0xcafebab0,
678 (void*)0xcafebab1,
679 (void*)0xcafebab2,
680 (void*)0xcafebab3,
681 (void*)0xcafebab4,
683 (void*)0xcafebab6,
684 (void*)0xcafebab7,
685 (void*)0xcafebab8,
686 (void*)0xcafebab9
687};
688
690{
691 void *This[5];
692 void *real_this;
693 IRpcChannelBuffer *channel = (IRpcChannelBuffer*)0xdeadbeef;
694 RPC_MESSAGE *msg = (RPC_MESSAGE*)0xcafebabe;
695 DWORD *phase = (DWORD*)0x12345678;
696 IRpcStubBufferVtbl *base_buffer_vtbl_ptr = &base_buffer_vtbl;
697 IRpcStubBuffer *base_stub_buffer = (IRpcStubBuffer*)&base_buffer_vtbl_ptr;
698
699 memset(This, 0xcc, sizeof(This));
700 This[0] = base_stub_buffer;
701 real_this = &This[1];
702
703 NdrStubForwardingFunction( real_this, channel, msg, phase );
704 ok(base_buffer_invoke_called == 1, "base_buffer_invoke called %d times\n", base_buffer_invoke_called);
705
706}
707
709{
710 IRpcStubBuffer *pstub = NULL;
711 HRESULT r;
712
713 r = IPSFactoryBuffer_CreateStub(ppsf, iid, obj, &pstub);
714 ok(r == expected_result, "CreateStub returned %08lx expected %08lx\n", r, expected_result);
715 return pstub;
716}
717
719{
720 ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
721 *ppv = (void*)0xdeadbeef;
722 return S_OK;
723}
724
725static IUnknownVtbl create_stub_test_vtbl =
726{
728 NULL,
729 NULL
730};
731
733{
734 ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
735 *ppv = NULL;
736 return E_NOINTERFACE;
737}
738
739static IUnknownVtbl create_stub_test_fail_vtbl =
740{
742 NULL,
743 NULL
744};
745
747{
750};
751
752static inline struct dummy_unknown *impl_from_IUnknown(IUnknown *iface)
753{
754 return CONTAINING_RECORD(iface, struct dummy_unknown, IUnknown_iface);
755}
756
758{
759 *ppv = NULL;
760 return E_NOINTERFACE;
761}
762
764{
765 struct dummy_unknown *this = impl_from_IUnknown(iface);
766 return InterlockedIncrement( &this->ref );
767}
768
770{
771 struct dummy_unknown *this = impl_from_IUnknown(iface);
772 return InterlockedDecrement( &this->ref );
773}
774
775static IUnknownVtbl dummy_unknown_vtbl =
776{
780};
782
783static void create_proxy_test( IPSFactoryBuffer *ppsf, REFIID iid, const void *expected_vtbl )
784{
786 IUnknown *iface = NULL;
787 HRESULT r;
788 ULONG count;
789
790 r = IPSFactoryBuffer_CreateProxy(ppsf, NULL, iid, &proxy, (void **)&iface);
791 ok( r == S_OK, "IPSFactoryBuffer_CreateProxy failed %lx\n", r );
792 ok( *(void **)iface == expected_vtbl, "wrong iface pointer %p/%p\n", *(void **)iface, expected_vtbl );
793 count = IUnknown_Release( iface );
794 ok( count == 1, "wrong refcount %lu\n", count );
795 count = IRpcProxyBuffer_Release( proxy );
796 ok( count == 0, "wrong refcount %lu\n", count );
797
798 dummy_unknown.ref = 4;
799 r = IPSFactoryBuffer_CreateProxy(ppsf, &dummy_unknown.IUnknown_iface, iid, &proxy,
800 (void **)&iface);
801 ok( r == S_OK, "IPSFactoryBuffer_CreateProxy failed %lx\n", r );
802 ok( dummy_unknown.ref == 5, "wrong refcount %lu\n", dummy_unknown.ref );
803 ok( *(void **)iface == expected_vtbl, "wrong iface pointer %p/%p\n", *(void **)iface, expected_vtbl );
804 count = IUnknown_Release( iface );
805 ok( count == 4, "wrong refcount %lu\n", count );
806 ok( dummy_unknown.ref == 4, "wrong refcount %lu\n", dummy_unknown.ref );
807 count = IRpcProxyBuffer_Release( proxy );
808 ok( count == 0, "wrong refcount %lu\n", count );
809 ok( dummy_unknown.ref == 4, "wrong refcount %lu\n", dummy_unknown.ref );
810}
811
813{
814 create_proxy_test( ppsf, &IID_if1, if1_proxy_vtbl.Vtbl );
815 create_proxy_test( ppsf, &IID_if2, if2_proxy_vtbl.Vtbl );
816 create_proxy_test( ppsf, &IID_if3, if3_proxy_vtbl.Vtbl );
817 create_proxy_test( ppsf, &IID_if4, if4_proxy_vtbl.Vtbl );
818}
819
821{
822 IUnknownVtbl *vtbl = &create_stub_test_vtbl;
823 IUnknown *obj = (IUnknown*)&vtbl;
824 IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
825 CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
826 const CInterfaceStubHeader *header = &CONTAINING_RECORD(cstd_stub->lpVtbl, const CInterfaceStubVtbl, Vtbl)->header;
827
828 ok(IsEqualIID(header->piid, &IID_if1), "header iid differs\n");
829 ok(cstd_stub->RefCount == 1, "ref count %ld\n", cstd_stub->RefCount);
830 /* 0xdeadbeef returned from create_stub_test_QI */
831 ok(cstd_stub->pvServerObject == (void*)0xdeadbeef, "pvServerObject %p\n", cstd_stub->pvServerObject);
832 ok(cstd_stub->pPSFactory != NULL, "pPSFactory was NULL\n");
833 cstd_stub->pvServerObject = NULL;
834 IRpcStubBuffer_Release(pstub);
835
837 pstub = create_stub(ppsf, &IID_if1, obj, E_NOINTERFACE);
838 ok(pstub == NULL, "create_stub failed: %lu\n", GetLastError());
839
840}
841
843{
844 ok(IsEqualIID(iid, &IID_if1) ||
845 IsEqualIID(iid, &IID_if2), "incorrect iid\n");
846 *ppv = (void*)This;
847 return S_OK;
848}
849
852{
854 return 0;
855}
856
857static IUnknownVtbl connect_test_orig_vtbl =
858{
860 NULL,
862};
863
865{
866 ok(IsEqualIID(iid, &IID_if1) ||
867 IsEqualIID(iid, &IID_if2), "incorrect iid\n");
868 *ppv = (void*)0xcafebabe;
869 return S_OK;
870}
871
872static IUnknownVtbl connect_test_new_vtbl =
873{
875 NULL,
876 NULL
877};
878
880{
881 ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
882 *ppv = (void*)0xdeadbeef;
883 return E_NOINTERFACE;
884}
885
886static IUnknownVtbl connect_test_new_fail_vtbl =
887{
889 NULL,
890 NULL
891};
892
895{
897 ok(*(void**)obj == (void*)0xbeefcafe, "unexpected obj %p\n", obj);
898 return S_OK;
899}
900
901static IRpcStubBufferVtbl connect_test_base_stub_buffer_vtbl =
902{
903 (void*)0xcafebab0,
904 (void*)0xcafebab1,
905 (void*)0xcafebab2,
907 (void*)0xcafebab4,
908 (void*)0xcafebab5,
909 (void*)0xcafebab6,
910 (void*)0xcafebab7,
911 (void*)0xcafebab8,
912 (void*)0xcafebab9
913};
914
916{
917 IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl;
918 IUnknownVtbl *new_vtbl = &connect_test_new_vtbl;
919 IUnknownVtbl *new_fail_vtbl = &connect_test_new_fail_vtbl;
920 IUnknown *obj = (IUnknown*)&orig_vtbl;
921 IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
922 CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
923 IRpcStubBufferVtbl *base_stub_buf_vtbl = &connect_test_base_stub_buffer_vtbl;
924 HRESULT r;
925
926 obj = (IUnknown*)&new_vtbl;
927 r = IRpcStubBuffer_Connect(pstub, obj);
928 ok(r == S_OK, "r %08lx\n", r);
930 ok(cstd_stub->pvServerObject == (void*)0xcafebabe, "pvServerObject %p\n", cstd_stub->pvServerObject);
931
932 cstd_stub->pvServerObject = (IUnknown*)&orig_vtbl;
933 obj = (IUnknown*)&new_fail_vtbl;
934 r = IRpcStubBuffer_Connect(pstub, obj);
935 ok(r == E_NOINTERFACE, "r %08lx\n", r);
936 ok(cstd_stub->pvServerObject == (void*)0xdeadbeef, "pvServerObject %p\n", cstd_stub->pvServerObject);
938
939 /* Now use a delegated stub.
940
941 We know from the NdrStubForwardFunction test that
942 (void**)pstub-1 is the base interface stub buffer. This shows
943 that (void**)pstub-2 contains the address of a vtable that gets
944 passed to the base interface's Connect method. Note that
945 (void**)pstub-2 itself gets passed to Connect and not
946 *((void**)pstub-2), so it should contain the vtable ptr and not
947 an interface ptr. */
948
949 obj = (IUnknown*)&orig_vtbl;
950 pstub = create_stub(ppsf, &IID_if2, obj, S_OK);
951 *((void**)pstub-1) = &base_stub_buf_vtbl;
952 *((void**)pstub-2) = (void*)0xbeefcafe;
953
954 obj = (IUnknown*)&new_vtbl;
955 r = IRpcStubBuffer_Connect(pstub, obj);
956 ok(r == S_OK, "r %08lx\n", r);
957 ok(connect_test_base_Connect_called == 1, "connect_test_bsae_Connect called %d times\n",
960 cstd_stub = (CStdStubBuffer*)pstub;
961 ok(cstd_stub->pvServerObject == (void*)0xcafebabe, "pvServerObject %p\n", cstd_stub->pvServerObject);
962}
963
965{
966 IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl;
967 IUnknown *obj = (IUnknown*)&orig_vtbl;
968 IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
969 CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
970
972 IRpcStubBuffer_Disconnect(pstub);
974 ok(cstd_stub->pvServerObject == NULL, "pvServerObject %p\n", cstd_stub->pvServerObject);
975 IRpcStubBuffer_Release(pstub);
976}
977
978
981{
983 return 1;
984}
985
987{
988 NULL,
989 NULL,
991};
992
994{
995 LONG facbuf_refs;
996 IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl;
997 IUnknown *obj = (IUnknown*)&orig_vtbl;
998 IUnknownVtbl *pretend_psfacbuf_vtbl = &release_test_pretend_psfacbuf_vtbl;
999 IUnknown *pretend_psfacbuf = (IUnknown *)&pretend_psfacbuf_vtbl;
1000 IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
1001 CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
1002
1003 facbuf_refs = PSFactoryBuffer.RefCount;
1004
1005 /* This shows that NdrCStdStubBuffer_Release doesn't call Disconnect */
1006 ok(cstd_stub->RefCount == 1, "ref count %ld\n", cstd_stub->RefCount);
1008 IRpcStubBuffer_Release(pstub);
1009todo_wine {
1011}
1012 ok(PSFactoryBuffer.RefCount == facbuf_refs - 1, "factory buffer refs %ld orig %ld\n", PSFactoryBuffer.RefCount, facbuf_refs);
1013
1014 /* This shows that NdrCStdStubBuffer_Release calls Release on its 2nd arg, rather than on This->pPSFactory
1015 (which are usually the same and indeed it's odd that _Release requires this 2nd arg). */
1016 pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
1017 ok(PSFactoryBuffer.RefCount == facbuf_refs, "factory buffer refs %ld orig %ld\n", PSFactoryBuffer.RefCount, facbuf_refs);
1018 NdrCStdStubBuffer_Release(pstub, (IPSFactoryBuffer*)pretend_psfacbuf);
1019 ok(release_test_psfacbuf_release_called == 1, "pretend_psfacbuf_release called %d\n", release_test_psfacbuf_release_called);
1020 ok(PSFactoryBuffer.RefCount == facbuf_refs, "factory buffer refs %ld orig %ld\n", PSFactoryBuffer.RefCount, facbuf_refs);
1021}
1022
1024{
1025
1026 *ppv = pUnk;
1027 return S_OK;
1028}
1029
1031{
1032 return 1;
1033}
1034
1036{
1037 return 1;
1038}
1039
1041{
1042 return 0xabcdef;
1043}
1044
1046{
1051 NULL,
1052 NULL,
1053 NULL,
1054 NULL,
1055 NULL,
1056 NULL,
1057 NULL,
1058 NULL,
1059 NULL
1060};
1061
1063 REFIID iid,
1064 void **ppv)
1065{
1066 ok(0, "call to QueryInterface not expected\n");
1067 return E_NOINTERFACE;
1068}
1069
1071{
1072 return 2;
1073}
1074
1076{
1077 return 1;
1078}
1079
1081 RPCOLEMESSAGE *msg,
1082 REFIID iid)
1083{
1084 msg->Buffer = malloc(msg->cbBuffer);
1085 return S_OK;
1086}
1087
1089 RPCOLEMESSAGE *pMessage,
1090 ULONG *pStatus)
1091{
1092 ok(0, "call to SendReceive not expected\n");
1093 return E_NOTIMPL;
1094}
1095
1097 RPCOLEMESSAGE *pMessage)
1098{
1099 ok(0, "call to FreeBuffer not expected\n");
1100 return E_NOTIMPL;
1101}
1102
1104 DWORD *pdwDestContext,
1105 void **ppvDestContext)
1106{
1107 *pdwDestContext = MSHCTX_LOCAL;
1108 *ppvDestContext = NULL;
1109 return S_OK;
1110}
1111
1113{
1114 ok(0, "call to IsConnected not expected\n");
1115 return E_NOTIMPL;
1116}
1117
1118static IRpcChannelBufferVtbl delegating_invoke_test_rpc_chan_vtbl =
1119{
1128};
1129
1131{
1132 ITypeLibVtbl *obj_vtbl = &delegating_invoke_test_obj_vtbl;
1133 IUnknown *obj = (IUnknown*)&obj_vtbl;
1134 IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if2, obj, S_OK);
1135 IRpcChannelBufferVtbl *pchan_vtbl = &delegating_invoke_test_rpc_chan_vtbl;
1136 IRpcChannelBuffer *pchan = (IRpcChannelBuffer *)&pchan_vtbl;
1137 HRESULT r = E_FAIL;
1138 RPCOLEMESSAGE msg;
1139
1140 memset(&msg, 0, sizeof(msg));
1141 msg.dataRepresentation = NDR_LOCAL_DATA_REPRESENTATION;
1142 msg.iMethod = 3;
1143 r = IRpcStubBuffer_Invoke(pstub, &msg, pchan);
1144 ok(r == S_OK, "ret %08lx\n", r);
1145 if(r == S_OK)
1146 {
1147 ok(*(DWORD*)msg.Buffer == 0xabcdef, "buf[0] %08lx\n", *(DWORD*)msg.Buffer);
1148 ok(*((DWORD*)msg.Buffer + 1) == S_OK, "buf[1] %08lx\n", *((DWORD*)msg.Buffer + 1));
1149 }
1150 /* free the buffer allocated by delegating_invoke_chan_get_buffer */
1151 free(msg.Buffer);
1152 IRpcStubBuffer_Release(pstub);
1153}
1155{
1156 NULL
1157};
1158
1160{
1161 NULL
1162};
1163
1165{
1166 NULL
1167};
1168
1169static const IID *base_iid_list2[] =
1170{
1171 NULL,
1172};
1173
1175{
1178 (const PCInterfaceName *) &if_name_list2,
1179 (const IID **) &base_iid_list2,
1180 &iid_lookup,
1181 0,
1182 1,
1183 NULL,
1184 0,
1185 0,
1186 0
1187};
1188
1191 NULL
1192};
1193
1194static void test_NdrDllRegisterProxy( void )
1195{
1196 HRESULT res;
1197 const ExtendedProxyFileInfo *pf;
1199
1200
1202 ok(res == E_HANDLE, "Incorrect return code %lx\n",res);
1203 pf = NULL;
1205 ok(res == E_NOINTERFACE, "Incorrect return code %lx\n",res);
1207 ok(res == E_NOINTERFACE, "Incorrect return code %lx\n",res);
1208 /* This fails on Vista and Windows 7 due to permissions */
1210 ok(res == S_OK || res == E_ACCESSDENIED, "NdrDllRegisterProxy failed %lx\n",res);
1211 if (res == S_OK)
1212 {
1214 ok(res == S_OK, "NdrDllUnregisterProxy failed %lx\n",res);
1215 }
1216}
1217
1218static HANDLE create_process(const char *arg)
1219{
1221 STARTUPINFOA si = {0};
1222 char cmdline[200];
1223 char **argv;
1224 BOOL ret;
1225
1226 si.cb = sizeof(si);
1228 sprintf(cmdline, "\"%s\" %s %s", argv[0], argv[1], arg);
1229 ret = CreateProcessA(argv[0], cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
1230 ok(ret, "CreateProcess failed: %lu\n", GetLastError());
1231 CloseHandle(pi.hThread);
1232 return pi.hProcess;
1233}
1234
1235DEFINE_GUID(CLSID_test1,0xdeadf00d,0x0001,0x44c7,0x85,0x0f,0x2a,0x0f,0x46,0x5c,0x0c,0x6c);
1236
1238{
1239 if (winetest_debug > 1) trace("%s\n", wine_dbgstr_guid(iid));
1240 if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_ITest1))
1241 {
1242 *out = iface;
1243 return S_OK;
1244 }
1245 *out = NULL;
1246 return E_NOINTERFACE;
1247}
1248
1250{
1251 return 2;
1252}
1253
1255{
1256 return 1;
1257}
1258
1260{
1261 *clsid = CLSID_test1;
1262 return S_OK;
1263}
1264
1265static int WINAPI test1_square(ITest1 *iface, int x)
1266{
1267 return x * x;
1268}
1269
1270static const ITest1Vtbl test1_vtbl =
1271{
1277};
1278
1280{
1282 {
1283 *out = iface;
1284 return S_OK;
1285 }
1286 *out = NULL;
1287 return E_NOINTERFACE;
1288}
1289
1291{
1292 return 2;
1293}
1294
1296{
1297 return 1;
1298}
1299
1301{
1302 ITest1 *obj = malloc(sizeof(*obj));
1303
1304 obj->lpVtbl = &test1_vtbl;
1305
1306 return ITest1_QueryInterface(obj, iid, out);
1307}
1308
1310{
1311 return S_OK;
1312}
1313
1314static const IClassFactoryVtbl test_cf_vtbl =
1315{
1321};
1322
1324
1326extern const ProxyFileInfo * aProxyFileList;
1327
1328static void local_server_proc(void)
1329{
1330 DWORD obj_cookie, ps_cookie, index;
1331 HANDLE stop_event, ready_event;
1332 IPSFactoryBuffer *ps;
1333 HRESULT hr;
1334
1335 stop_event = OpenEventA(EVENT_ALL_ACCESS, FALSE, "wine_cstub_test_server_stop");
1336 ready_event = OpenEventA(EVENT_ALL_ACCESS, FALSE, "wine_cstub_test_server_ready");
1337
1339
1340 hr = CoRegisterClassObject(&CLSID_test1, (IUnknown *)&test_cf,
1341 CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &obj_cookie);
1342 ok(hr == S_OK, "got %#lx\n", hr);
1343
1344 hr = NdrDllGetClassObject(&CLSID_test_ps, &IID_IPSFactoryBuffer, (void **)&ps,
1345 &aProxyFileList, &CLSID_test_ps, &gPFactory);
1346 ok(hr == S_OK, "got %#lx\n", hr);
1347
1348 hr = CoRegisterClassObject(&CLSID_test_ps, (IUnknown *)ps,
1349 CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &ps_cookie);
1350 ok(hr == S_OK, "got %#lx\n", hr);
1351
1352 hr = CoRegisterPSClsid(&IID_ITest1, &CLSID_test_ps);
1353 ok(hr == S_OK, "got %#lx\n", hr);
1354
1355 SetEvent(ready_event);
1356
1357 hr = CoWaitForMultipleHandles(0, 1000, 1, &stop_event, &index);
1358 ok(hr == S_OK, "got %#lx\n", hr);
1359 ok(!index, "got %lu\n", index);
1360
1361 hr = CoRevokeClassObject(ps_cookie);
1362 ok(hr == S_OK, "got %#lx\n", hr);
1363
1364 hr = CoRevokeClassObject(obj_cookie);
1365 ok(hr == S_OK, "got %#lx\n", hr);
1366
1368 ExitProcess(0);
1369}
1370
1371static void test_delegated_methods(void)
1372{
1373 HANDLE process, stop_event, ready_event;
1374 IPSFactoryBuffer *ps;
1375 ITest1 *test_obj;
1376 DWORD ps_cookie;
1377 CLSID clsid;
1378 HRESULT hr;
1379 int ret;
1380
1381 stop_event = CreateEventA(NULL, TRUE, FALSE, "wine_cstub_test_server_stop");
1382 ready_event = CreateEventA(NULL, TRUE, FALSE, "wine_cstub_test_server_ready");
1383
1384 process = create_process("server");
1385 ok(!WaitForSingleObject(ready_event, 5000), "wait failed\n");
1386
1387 hr = NdrDllGetClassObject(&CLSID_test_ps, &IID_IPSFactoryBuffer, (void **)&ps,
1388 &aProxyFileList, &CLSID_test_ps, &gPFactory);
1389 ok(hr == S_OK, "got %#lx\n", hr);
1390
1391 hr = CoRegisterClassObject(&CLSID_test_ps, (IUnknown *)ps,
1392 CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &ps_cookie);
1393 ok(hr == S_OK, "got %#lx\n", hr);
1394
1395 hr = CoRegisterPSClsid(&IID_ITest1, &CLSID_test_ps);
1396 ok(hr == S_OK, "got %#lx\n", hr);
1397
1398 hr = CoCreateInstance(&CLSID_test1, NULL, CLSCTX_LOCAL_SERVER, &IID_ITest1, (void **)&test_obj);
1399 ok(hr == S_OK, "got %#lx\n", hr);
1400
1401 ret = ITest1_square(test_obj, 3);
1402 ok(ret == 9, "got %d\n", ret);
1403
1404 hr = ITest1_GetClassID(test_obj, &clsid);
1405 ok(hr == S_OK, "got %#lx\n", hr);
1406 ok(IsEqualGUID(&clsid, &CLSID_test1), "got %s\n", wine_dbgstr_guid(&clsid));
1407
1408 ITest1_Release(test_obj);
1409
1411 ok(!WaitForSingleObject(process, 1000), "wait failed\n");
1412
1413 hr = CoRevokeClassObject(ps_cookie);
1414 ok(hr == S_OK, "got %#lx\n", hr);
1415}
1416
1418{
1422
1424{
1425 return CONTAINING_RECORD(iface, CChannelBufferRefCount, IRpcChannelBuffer_iface);
1426}
1427
1429 REFIID iid,
1430 void** ppv)
1431{
1432 if (IsEqualGUID(&IID_IRpcChannelBuffer, iid))
1433 {
1434 *ppv = pchan;
1435 IRpcChannelBuffer_AddRef(pchan);
1436 return S_OK;
1437 }
1438 return E_NOINTERFACE;
1439}
1440
1442{
1444 return InterlockedIncrement(&This->RefCount);
1445}
1446
1448{
1450 return InterlockedDecrement(&This->RefCount);
1451}
1452
1454 RPCOLEMESSAGE* msg,
1455 REFIID iid)
1456{
1457 ok(0, "call to GetBuffer not expected\n");
1458 return E_NOTIMPL;
1459}
1460
1462 RPCOLEMESSAGE* pMessage,
1463 ULONG* pStatus)
1464{
1465 ok(0, "call to SendReceive not expected\n");
1466 return E_NOTIMPL;
1467}
1468
1470 RPCOLEMESSAGE* pMessage)
1471{
1472 ok(0, "call to FreeBuffer not expected\n");
1473 return E_NOTIMPL;
1474}
1475
1477 DWORD* pdwDestContext,
1478 void** ppvDestContext)
1479{
1480 *pdwDestContext = MSHCTX_LOCAL;
1481 *ppvDestContext = NULL;
1482 return S_OK;
1483}
1484
1486{
1487 ok(0, "call to IsConnected not expected\n");
1488 return E_NOTIMPL;
1489}
1490
1491static IRpcChannelBufferVtbl test_chanbuf_refcount_test_rpc_chan_vtbl =
1492{
1501};
1502
1504{
1505 IRpcProxyBuffer* proxy_buffer = NULL;
1506 IUnknown* proxy_if1 = NULL;
1508
1509 RPC_MESSAGE rpcMessage = {0};
1510 MIDL_STUB_MESSAGE stubMessage = {0};
1511 MIDL_STUB_DESC stubDesc = {0};
1512 ULONG refs;
1513
1514 HRESULT hr = IPSFactoryBuffer_CreateProxy(ppsf, NULL, &IID_if1, &proxy_buffer, (void**)&proxy_if1);
1515 ok(hr == S_OK, "got %#lx\n", hr);
1516
1517 ok(test_chanbuf.RefCount == 1, "got %ld\n", test_chanbuf.RefCount);
1518 hr = IRpcProxyBuffer_Connect(proxy_buffer, &test_chanbuf.IRpcChannelBuffer_iface);
1519 ok(hr == S_OK, "got %#lx\n", hr);
1520 /* proxy_buffer should have acquired its own refcount on test_chanbuf */
1521 ok(test_chanbuf.RefCount == 2, "got %ld\n", test_chanbuf.RefCount);
1522
1523 /* which therefore survives releasing the initial one */
1524 refs = IRpcChannelBuffer_Release(&test_chanbuf.IRpcChannelBuffer_iface);
1525 ok(refs == 1, "got %ld\n", refs);
1526
1527 NdrProxyInitialize(proxy_if1, &rpcMessage, &stubMessage, &stubDesc, 0);
1528 /* stubMessage should add its own refcount on test_chanbuf */
1529 ok(test_chanbuf.RefCount == 2, "got %ld\n", test_chanbuf.RefCount);
1530 ok(stubMessage.pRpcChannelBuffer != NULL, "NULL pRocChannelBuffer\n");
1531
1532 /* stubMessage doesn't add its own refcounts on proxy_if1 or proxy_buffer,
1533 * so it's possible these are freed out from under it.
1534 * E.g. an event sink might unadvise upon receiving the event it was waiting for;
1535 * this unadvise could be reentrant to Invoke because SendReceive pumps STA messages.
1536 * The source would then erase that connection point entry and Release the proxy. */
1537 IRpcProxyBuffer_Disconnect(proxy_buffer);
1538 ok(test_chanbuf.RefCount == 1, "got %ld\n", test_chanbuf.RefCount);
1539 IRpcProxyBuffer_Release(proxy_buffer);
1540 refs = IUnknown_Release(proxy_if1);
1541 ok(refs == 0, "got %ld\n", refs);
1542 ok(test_chanbuf.RefCount == 1, "got %ld\n", test_chanbuf.RefCount);
1543
1544 /* NdrProxyFreeBuffer must not dereference the now-freed proxy_if1,
1545 * yet should still free the remaining reference on test_chanbuf */
1546 NdrProxyFreeBuffer(proxy_if1, &stubMessage);
1547 ok(test_chanbuf.RefCount == 0, "got %ld\n", test_chanbuf.RefCount);
1548 ok(!stubMessage.pRpcChannelBuffer, "dangling pRpcChannelBuffer = %p\n", stubMessage.pRpcChannelBuffer);
1549}
1550
1552{
1553 IPSFactoryBuffer *ppsf;
1554 int argc;
1555 char **argv;
1556
1558 if (argc > 2 && !strcmp(argv[2], "server"))
1559 {
1561 return;
1562 }
1563
1565
1568 test_CreateProxy(ppsf);
1569 test_CreateStub(ppsf);
1570 test_Connect(ppsf);
1571 test_Disconnect(ppsf);
1572 test_Release(ppsf);
1577
1579}
static ULONG STDMETHODCALLTYPE dummy_Release()
static ULONG STDMETHODCALLTYPE dummy_AddRef()
static int argc
Definition: ServiceArgs.c:12
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#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 START_TEST(x)
Definition: atltest.h:75
#define msg(x)
Definition: auth_time.c:54
#define index(s, c)
Definition: various.h:29
#define ARRAY_SIZE(A)
Definition: main.h:20
const GUID IID_IUnknown
const GUID IID_IClassFactory
_In_ BOOLEAN Release
Definition: cdrom.h:920
ULONG WINAPI IUnknown_AddRef_Proxy(LPUNKNOWN iface)
Definition: cproxy.c:249
void WINAPI NdrProxyInitialize(void *This, PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg, PMIDL_STUB_DESC pStubDescriptor, unsigned int ProcNum)
Definition: cproxy.c:266
ULONG WINAPI IUnknown_Release_Proxy(LPUNKNOWN iface)
Definition: cproxy.c:256
void WINAPI NdrProxyFreeBuffer(void *This, PMIDL_STUB_MESSAGE pStubMsg)
Definition: cproxy.c:348
HRESULT WINAPI IUnknown_QueryInterface_Proxy(LPUNKNOWN iface, REFIID riid, LPVOID *ppvObj)
Definition: cproxy.c:240
HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid)
Definition: cpsf.c:218
HRESULT WINAPI NdrDllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid, CStdPSFactoryBuffer *pPSFactoryBuffer)
Definition: cpsf.c:179
HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid)
Definition: cpsf.c:286
HRESULT create_stub(REFIID iid, IUnknown *pUnk, IRpcStubBuffer **ppstub)
Definition: ndr_ole.c:430
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
static LPVOID LPUNKNOWN
Definition: dinput.c:53
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define GetProcAddress(x, y)
Definition: compat.h:753
#define CALLBACK
Definition: compat.h:35
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1489
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
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 CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, ULONG cHandles, LPHANDLE pHandles, LPDWORD lpdwindex)
Definition: compobj.c:4578
HRESULT WINAPI DECLSPEC_HOTPATCH CoRevokeClassObject(DWORD dwRegister)
Definition: compobj.c:1086
HRESULT WINAPI CoRegisterPSClsid(REFIID riid, REFCLSID rclsid)
Definition: compobj.c:2778
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
HRESULT WINAPI DECLSPEC_HOTPATCH OleInitialize(LPVOID reserved)
Definition: ole2.c:169
void WINAPI DECLSPEC_HOTPATCH OleUninitialize(void)
Definition: ole2.c:230
ULONG WINAPI CStdStubBuffer_CountRefs(LPRPCSTUBBUFFER iface)
Definition: cstub.c:326
void WINAPI CStdStubBuffer_DebugServerRelease(LPRPCSTUBBUFFER iface, LPVOID pv)
Definition: cstub.c:341
HRESULT WINAPI CStdStubBuffer_QueryInterface(LPRPCSTUBBUFFER iface, REFIID riid, LPVOID *obj)
Definition: cstub.c:185
ULONG WINAPI CStdStubBuffer_AddRef(LPRPCSTUBBUFFER iface)
Definition: cstub.c:203
void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer *iface, IRpcChannelBuffer *pChannel, PRPC_MESSAGE pMsg, DWORD *pdwStubPhase)
Definition: cstub.c:421
void WINAPI CStdStubBuffer_Disconnect(LPRPCSTUBBUFFER iface)
Definition: cstub.c:270
LPRPCSTUBBUFFER WINAPI CStdStubBuffer_IsIIDSupported(LPRPCSTUBBUFFER iface, REFIID riid)
Definition: cstub.c:314
HRESULT WINAPI CStdStubBuffer_Invoke(LPRPCSTUBBUFFER iface, PRPCOLEMESSAGE pMsg, LPRPCCHANNELBUFFER pChannel)
Definition: cstub.c:282
ULONG WINAPI NdrCStdStubBuffer2_Release(LPRPCSTUBBUFFER iface, LPPSFACTORYBUFFER pPSF)
Definition: cstub.c:231
HRESULT WINAPI CStdStubBuffer_DebugServerQueryInterface(LPRPCSTUBBUFFER iface, LPVOID *ppv)
Definition: cstub.c:333
ULONG WINAPI NdrCStdStubBuffer_Release(LPRPCSTUBBUFFER iface, LPPSFACTORYBUFFER pPSF)
Definition: cstub.c:210
HRESULT WINAPI CStdStubBuffer_Connect(LPRPCSTUBBUFFER iface, LPUNKNOWN lpUnkServer)
Definition: cstub.c:254
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS
Definition: ntddk_ex.h:187
struct _IMAGE_DOS_HEADER * PIMAGE_DOS_HEADER
int proxy
Definition: main.c:67
__in WDFDMATRANSACTION __out NTSTATUS * pStatus
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID LPVOID * ppv
Definition: atlbase.h:39
Definition: cstub.idl:30
#define S_OK
Definition: intsafe.h:52
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
_In_ PKSPIN_CONNECT Connect
Definition: ks.h:4536
int winetest_debug
#define todo_wine
Definition: minitest.h:80
static PVOID ptr
Definition: dispmode.c:27
#define sprintf
Definition: sprintf.c:45
static PEXPLICIT_ACCESSW *static HMODULE hmod
Definition: security.c:143
BOOL expected
Definition: store.c:2000
const char * expected_result
Definition: mimeole.c:1468
#define create_process(cmd, pi)
Definition: process.c:2408
static HRESULT QueryInterface(REFIID, void **)
Definition: events.c:2587
static CInterfaceStubVtbl if2_stub_vtbl
Definition: cstub.c:273
static void test_ChannelBufferRefCount(IPSFactoryBuffer *ppsf)
Definition: cstub.c:1503
#define VTBL_TEST_CHANGE_TO(name, i)
static CInterfaceStubVtbl if3_stub_vtbl
Definition: cstub.c:313
static HRESULT WINAPI connect_test_new_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:864
static ULONG WINAPI delegating_invoke_test_addref(ITypeLib *pUnk)
Definition: cstub.c:1030
static UINT WINAPI delegating_invoke_test_get_type_info_count(ITypeLib *pUnk)
Definition: cstub.c:1040
static const unsigned short if3_FormatStringOffsetTable[]
Definition: cstub.c:296
static const unsigned short if4_FormatStringOffsetTable[]
Definition: cstub.c:337
static BOOL check_address(void *actual, void *expected)
Definition: cstub.c:418
static IUnknownVtbl connect_test_orig_vtbl
Definition: cstub.c:857
static HRESULT WINAPI test_chanbuf_refcount_chan_get_dest_ctx(IRpcChannelBuffer *pchan, DWORD *pdwDestContext, void **ppvDestContext)
Definition: cstub.c:1476
static HRESULT WINAPI test_cf_LockServer(IClassFactory *iface, BOOL lock)
Definition: cstub.c:1309
static int connect_test_base_Connect_called
Definition: cstub.c:893
static const IID * base_iid_list[]
Definition: cstub.c:395
static ULONG WINAPI delegating_invoke_test_release(ITypeLib *pUnk)
Definition: cstub.c:1035
static void test_delegated_methods(void)
Definition: cstub.c:1371
static HRESULT WINAPI base_buffer_Invoke(IRpcStubBuffer *This, RPCOLEMESSAGE *msg, IRpcChannelBuffer *channel)
Definition: cstub.c:668
static const PRPC_STUB_FUNCTION if2_table[]
Definition: cstub.c:259
static HRESULT WINAPI delegating_invoke_test_QI(ITypeLib *pUnk, REFIID iid, void **ppv)
Definition: cstub.c:1023
static void test_CreateProxy(IPSFactoryBuffer *ppsf)
Definition: cstub.c:812
static int base_buffer_invoke_called
Definition: cstub.c:667
static const unsigned short if1_FormatStringOffsetTable[]
Definition: cstub.c:167
static const unsigned short if2_FormatStringOffsetTable[]
Definition: cstub.c:232
static const CInterfaceStubVtbl * cstub_StubVtblList[]
Definition: cstub.c:377
static ULONG WINAPI test_chanbuf_refcount_chan_release(IRpcChannelBuffer *pchan)
Definition: cstub.c:1447
static PCInterfaceName const if_name_list[]
Definition: cstub.c:386
static CStdPSFactoryBuffer PSFactoryBuffer
Definition: cstub.c:41
static PCInterfaceName const if_name_list2[]
Definition: cstub.c:1164
static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString
Definition: cstub.c:87
static IUnknownVtbl connect_test_new_vtbl
Definition: cstub.c:872
static HRESULT WINAPI test_chanbuf_refcount_chan_query_interface(IRpcChannelBuffer *pchan, REFIID iid, void **ppv)
Definition: cstub.c:1428
struct tagChannelBufferRefCount CChannelBufferRefCount
static HRESULT WINAPI test_chanbuf_refcount_chan_free_buffer(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *pMessage)
Definition: cstub.c:1469
static int connect_test_orig_release_called
Definition: cstub.c:850
static HRESULT WINAPI test_chanbuf_refcount_chan_is_connected(IRpcChannelBuffer *pchan)
Definition: cstub.c:1485
static const MIDL_STUB_DESC Object_StubDesc
Definition: cstub.c:103
const ProxyFileInfo * aProxyFileList
static void create_proxy_test(IPSFactoryBuffer *ppsf, REFIID iid, const void *expected_vtbl)
Definition: cstub.c:783
static const IClassFactoryVtbl test_cf_vtbl
Definition: cstub.c:1314
static ULONG WINAPI delegating_invoke_chan_release(IRpcChannelBuffer *pchan)
Definition: cstub.c:1075
static IUnknownVtbl create_stub_test_fail_vtbl
Definition: cstub.c:739
static void __RPC_STUB if1_fn2_Stub(IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase)
Definition: cstub.c:146
static IClassFactory test_cf
Definition: cstub.c:1323
static int release_test_psfacbuf_release_called
Definition: cstub.c:979
static void test_NdrDllRegisterProxy(void)
Definition: cstub.c:1194
static HRESULT WINAPI dummy_QueryInterface(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:757
static HRESULT WINAPI test_chanbuf_refcount_chan_send_receive(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *pMessage, ULONG *pStatus)
Definition: cstub.c:1461
static const MIDL_SERVER_INFO if3_server_info
Definition: cstub.c:302
static ULONG WINAPI test_cf_AddRef(IClassFactory *iface)
Definition: cstub.c:1290
static HRESULT WINAPI create_stub_test_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:718
static int my_free_called
Definition: cstub.c:60
static IUnknownVtbl release_test_pretend_psfacbuf_vtbl
Definition: cstub.c:986
static HRESULT WINAPI test_cf_QueryInterface(IClassFactory *iface, REFIID iid, void **out)
Definition: cstub.c:1279
static CLSID CLSID_psfact
Definition: cstub.c:57
static HRESULT WINAPI test1_QueryInterface(ITest1 *iface, REFIID iid, void **out)
Definition: cstub.c:1237
static ULONG WINAPI delegating_invoke_chan_add_ref(IRpcChannelBuffer *pchan)
Definition: cstub.c:1070
static IRpcStubBufferVtbl connect_test_base_stub_buffer_vtbl
Definition: cstub.c:901
static IUnknownVtbl connect_test_new_fail_vtbl
Definition: cstub.c:886
static HRESULT WINAPI connect_test_new_fail_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:879
static IUnknownVtbl create_stub_test_vtbl
Definition: cstub.c:725
#define VTBL_TEST_NOT_CHANGE_TO(name, i)
static HRESULT WINAPI delegating_invoke_chan_is_connected(IRpcChannelBuffer *pchan)
Definition: cstub.c:1112
static const CInterfaceStubVtbl * cstub_StubVtblList2[]
Definition: cstub.c:1159
static void test_delegating_Invoke(IPSFactoryBuffer *ppsf)
Definition: cstub.c:1130
#define VTBL_TEST_ZERO(name, i)
static HRESULT WINAPI delegating_invoke_chan_free_buffer(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *pMessage)
Definition: cstub.c:1096
static const ITest1Vtbl test1_vtbl
Definition: cstub.c:1270
static IRpcStubBufferVtbl base_buffer_vtbl
Definition: cstub.c:676
static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString
Definition: cstub.c:95
static HRESULT WINAPI connect_test_orig_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:842
static HRESULT WINAPI create_stub_test_fail_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:732
static const PRPC_STUB_FUNCTION if1_table[]
Definition: cstub.c:185
static CInterfaceStubVtbl if1_stub_vtbl
Definition: cstub.c:191
static const MIDL_SERVER_INFO if1_server_info
Definition: cstub.c:173
static IRpcChannelBufferVtbl delegating_invoke_test_rpc_chan_vtbl
Definition: cstub.c:1118
static struct dummy_unknown * impl_from_IUnknown(IUnknown *iface)
Definition: cstub.c:752
static HRESULT WINAPI connect_test_base_Connect(IRpcStubBuffer *pstub, IUnknown *obj)
Definition: cstub.c:894
static ULONG WINAPI test1_Release(ITest1 *iface)
Definition: cstub.c:1254
static HRESULT WINAPI delegating_invoke_chan_get_dest_ctx(IRpcChannelBuffer *pchan, DWORD *pdwDestContext, void **ppvDestContext)
Definition: cstub.c:1103
static void *CALLBACK my_alloc(SIZE_T size)
Definition: cstub.c:62
static const MIDL_SERVER_INFO if2_server_info
Definition: cstub.c:247
static GUID IID_if2
Definition: cstub.c:54
static CChannelBufferRefCount * impl_from_IRpcChannelBuffer(IRpcChannelBuffer *iface)
Definition: cstub.c:1423
static HRESULT WINAPI if1_fn2_Proxy(void *This)
Definition: cstub.c:141
static ULONG WINAPI connect_test_orig_release(IUnknown *This)
Definition: cstub.c:851
static const IID * base_iid_list2[]
Definition: cstub.c:1169
static IUnknownVtbl dummy_unknown_vtbl
Definition: cstub.c:775
static ULONG WINAPI test_CStdStubBuffer_Release(IRpcStubBuffer *This)
Definition: cstub.c:43
static void test_Connect(IPSFactoryBuffer *ppsf)
Definition: cstub.c:915
static int my_alloc_called
Definition: cstub.c:59
static ULONG WINAPI test_chanbuf_refcount_chan_add_ref(IRpcChannelBuffer *pchan)
Definition: cstub.c:1441
static ITypeLibVtbl delegating_invoke_test_obj_vtbl
Definition: cstub.c:1045
static HRESULT WINAPI test_chanbuf_refcount_chan_get_buffer(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *msg, REFIID iid)
Definition: cstub.c:1453
static HRESULT WINAPI test_cf_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID iid, void **out)
Definition: cstub.c:1300
static IRpcChannelBufferVtbl test_chanbuf_refcount_test_rpc_chan_vtbl
Definition: cstub.c:1491
static const ExtendedProxyFileInfo my_proxy_file_info
Definition: cstub.c:456
static GUID IID_if1
Definition: cstub.c:53
#define VTBL_PROXY_TEST(i, num, ptr)
struct _MIDL_PROC_FORMAT_STRING MIDL_PROC_FORMAT_STRING
static void test_Release(IPSFactoryBuffer *ppsf)
Definition: cstub.c:993
static ULONG WINAPI test1_AddRef(ITest1 *iface)
Definition: cstub.c:1249
static void local_server_proc(void)
Definition: cstub.c:1328
static const ProxyFileInfo * proxy_file_list2[]
Definition: cstub.c:1189
static HRESULT WINAPI delegating_invoke_chan_get_buffer(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *msg, REFIID iid)
Definition: cstub.c:1080
static ULONG WINAPI test_CStdStubBuffer2_Release(IRpcStubBuffer *This)
Definition: cstub.c:48
#define VTBL_PROXY_TEST_NOT_ZERO(i, num)
static HRESULT WINAPI delegating_invoke_chan_query_interface(IRpcChannelBuffer *pchan, REFIID iid, void **ppv)
Definition: cstub.c:1062
static HRESULT WINAPI if1_fn1_Proxy(void *This)
Definition: cstub.c:127
static void CALLBACK my_free(void *ptr)
Definition: cstub.c:68
static const ExtendedProxyFileInfo my_proxy_file_info2
Definition: cstub.c:1174
static HRESULT WINAPI test1_GetClassID(ITest1 *iface, CLSID *clsid)
Definition: cstub.c:1259
static void test_CreateStub(IPSFactoryBuffer *ppsf)
Definition: cstub.c:820
static ULONG WINAPI release_test_pretend_psfacbuf_release(IUnknown *pUnk)
Definition: cstub.c:980
static GUID IID_if3
Definition: cstub.c:55
static HRESULT WINAPI delegating_invoke_chan_send_receive(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *pMessage, ULONG *pStatus)
Definition: cstub.c:1088
static const MIDL_SERVER_INFO if4_server_info
Definition: cstub.c:346
static void __RPC_STUB if1_fn1_Stub(IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase)
Definition: cstub.c:132
static IPSFactoryBuffer * test_NdrDllGetClassObject(void)
Definition: cstub.c:477
static const ProxyFileInfo * proxy_file_list[]
Definition: cstub.c:471
static const CInterfaceProxyVtbl * cstub_ProxyVtblList2[]
Definition: cstub.c:1154
static const CInterfaceProxyVtbl * cstub_ProxyVtblList[]
Definition: cstub.c:368
static GUID IID_if4
Definition: cstub.c:56
CStdPSFactoryBuffer gPFactory
static ULONG WINAPI test_cf_Release(IClassFactory *iface)
Definition: cstub.c:1295
static int __stdcall iid_lookup(const IID *pIID, int *pIndex)
Definition: cstub.c:406
static void test_Disconnect(IPSFactoryBuffer *ppsf)
Definition: cstub.c:964
static int WINAPI test1_square(ITest1 *iface, int x)
Definition: cstub.c:1265
static void test_NdrStubForwardingFunction(void)
Definition: cstub.c:689
struct _MIDL_TYPE_FORMAT_STRING MIDL_TYPE_FORMAT_STRING
static CInterfaceStubVtbl if4_stub_vtbl
Definition: cstub.c:357
static refpint_t pi[]
Definition: server.c:112
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:83
#define argv
Definition: mplay32.c:18
const CLSID * clsid
Definition: msctf.cpp:50
_Out_ PULONG _Out_ PULONG pIndex
Definition: ndis.h:4565
unsigned int UINT
Definition: ndis.h:50
HANDLE stop_event
Definition: nfs41_daemon.c:55
@ REGCLS_MULTIPLEUSE
Definition: objbase.h:393
const GUID IID_IDispatch
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 IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:68
#define STUB_FORWARDING_FUNCTION
Definition: rpcproxy.h:121
#define IID_BS_LOOKUP_RETURN_RESULT(name, sz, index)
Definition: rpcproxy.h:223
#define IID_BS_LOOKUP_INITIAL_TEST(name, sz, split)
Definition: rpcproxy.h:221
void(__RPC_STUB * PRPC_STUB_FUNCTION)(IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *pdwStubPhase)
Definition: rpcproxy.h:83
const char * PCInterfaceName
Definition: rpcproxy.h:41
#define IID_BS_LOOKUP_SETUP
Definition: rpcproxy.h:219
#define IID_BS_LOOKUP_NEXT_TEST(name, split)
Definition: rpcproxy.h:222
#define CINTERFACE_PROXY_VTABLE(n)
Definition: rpcproxy.h:70
#define __RPC_STUB
Definition: rpc.h:62
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
int winetest_get_mainargs(char ***pargv)
#define memset(x, y, z)
Definition: compat.h:39
HRESULT hr
Definition: shlfolder.c:183
TCHAR * cmdline
Definition: stretchblt.cpp:32
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
unsigned char Format[PROC_FORMAT_STRING_SIZE]
Definition: client.c:20
struct IRpcChannelBuffer * pRpcChannelBuffer
Definition: rpcndr.h:236
unsigned char Format[TYPE_FORMAT_STRING_SIZE]
Definition: client.c:14
LONG ref
Definition: cstub.c:749
IUnknown IUnknown_iface
Definition: cstub.c:748
Definition: send.c:48
CInterfaceProxyHeader header
Definition: rpcproxy.h:79
struct IUnknown * pvServerObject
Definition: rpcproxy.h:107
const IRpcStubBufferVtbl * lpVtbl
Definition: rpcproxy.h:105
struct IPSFactoryBuffer * pPSFactory
Definition: rpcproxy.h:110
IRpcChannelBuffer IRpcChannelBuffer_iface
Definition: cstub.c:1419
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
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define __stdcall
Definition: typedefs.h:25
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_HANDLE
Definition: winerror.h:4117
#define E_ACCESSDENIED
Definition: winerror.h:4116
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:3772