ReactOS  0.4.13-dev-52-g0efcfec
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 #ifdef __REACTOS__
26 #define CONST_VTABLE
27 #endif
28 
29 #include <windef.h>
30 #include <winbase.h>
31 #include <winnt.h>
32 #include <winerror.h>
33 
34 #include "initguid.h"
35 #include <ole2.h>
36 #include "rpc.h"
37 #include "rpcdce.h"
38 #include "rpcproxy.h"
39 
40 #include "wine/heap.h"
41 #include "wine/test.h"
42 
43 #include "cstub_p.h"
44 
46 
48 {
50 }
51 
53 {
55 }
56 
57 static GUID IID_if1 = {0x12345678, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
58 static GUID IID_if2 = {0x12345679, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
59 static GUID IID_if3 = {0x1234567a, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
60 static GUID IID_if4 = {0x1234567b, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
61 static CLSID CLSID_psfact = {0x1234567c, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}};
62 
63 static int my_alloc_called;
64 static int my_free_called;
65 
66 static void * CALLBACK my_alloc(SIZE_T size)
67 {
69  return NdrOleAllocate(size);
70 }
71 
72 static void CALLBACK my_free(void *ptr)
73 {
75  NdrOleFree(ptr);
76 }
77 
78 typedef struct _MIDL_PROC_FORMAT_STRING
79 {
80  short Pad;
81  unsigned char Format[ 2 ];
83 
84 typedef struct _MIDL_TYPE_FORMAT_STRING
85 {
86  short Pad;
87  unsigned char Format[ 2 ];
89 
90 
92 {
93  0,
94  {
95  0, 0
96  }
97 };
98 
100 {
101  0,
102  {
103  0, 0
104  }
105 };
106 
108  {
109  NULL,
110  my_alloc,
111  my_free,
112  { 0 },
113  0,
114  0,
115  0,
116  0,
118  1, /* -error bounds_check flag */
119  0x20000, /* Ndr library version */
120  0,
121  0x50100a4, /* MIDL Version 5.1.164 */
122  0,
123  NULL,
124  0, /* notify & notify_flag routine table */
125  1, /* Flags */
126  0, /* Reserved3 */
127  0, /* Reserved4 */
128  0 /* Reserved5 */
129  };
130 
132 {
133  return S_OK;
134 }
135 
138  IRpcChannelBuffer *_pRpcChannelBuffer,
139  PRPC_MESSAGE _pRpcMessage,
140  DWORD *_pdwStubPhase)
141 {
142  trace("fn1 stub\n");
143 }
144 
146 {
147  return S_OK;
148 }
149 
152  IRpcChannelBuffer *_pRpcChannelBuffer,
153  PRPC_MESSAGE _pRpcMessage,
154  DWORD *_pdwStubPhase)
155 {
156  trace("fn2 stub\n");
157 }
158 
159 static CINTERFACE_PROXY_VTABLE(5) if1_proxy_vtbl =
160 {
161  { &IID_if1 },
167  }
168 };
169 
170 
171 static const unsigned short if1_FormatStringOffsetTable[] =
172  {
173  0,
174  0
175  };
176 
178  {
180  0,
183  0,
184  0,
185  0,
186  0};
187 
188 
190 {
191  if1_fn1_Stub,
193 };
194 
196 {
197  {
198  &IID_if1,
200  5,
201  &if1_table[-3]
202  },
203  {
214  }
215 };
216 
217 static CINTERFACE_PROXY_VTABLE(13) if2_proxy_vtbl =
218 {
219  { &IID_if2 },
223  0,
224  0,
225  0,
226  0,
227  0,
228  0,
229  0,
230  0,
231  0,
232  0
233  }
234 };
235 
236 static const unsigned short if2_FormatStringOffsetTable[] =
237  {
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  (unsigned short) -1,
245  (unsigned short) -1,
246  (unsigned short) -1,
247  (unsigned short) -1,
248  0
249  };
250 
252  {
254  0,
257  0,
258  0,
259  0,
260  0};
261 
262 
264 {
275 };
276 
278 {
279  {
280  &IID_if2,
282  13,
283  &if2_table[-3]
284  },
285  { 0, 0, test_CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0 }
286 };
287 
288 static CINTERFACE_PROXY_VTABLE(5) if3_proxy_vtbl =
289 {
290  { &IID_if3 },
295  0
296  }
297 };
298 
299 
300 static const unsigned short if3_FormatStringOffsetTable[] =
301  {
302  0,
303  0
304  };
305 
307  {
309  0,
312  0,
313  0,
314  0,
315  0};
316 
318 {
319  {
320  &IID_if3,
322  5,
323  &if1_table[-3]
324  },
325  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
326 };
327 
328 static CINTERFACE_PROXY_VTABLE(7) if4_proxy_vtbl =
329 {
330  { &IID_if4 },
334  0,
335  0,
336  0,
337  0
338  }
339 };
340 
341 static const unsigned short if4_FormatStringOffsetTable[] =
342  {
343  (unsigned short) -1,
344  (unsigned short) -1,
345  (unsigned short) -1,
346  (unsigned short) -1,
347  0
348  };
349 
351  {
353  0,
356  0,
357  0,
358  0,
359  0};
360 
362 {
363  {
364  &IID_if4,
366  7,
367  &if2_table[-3]
368  },
369  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
370 };
371 
373 {
374  (const CInterfaceProxyVtbl *) &if1_proxy_vtbl,
375  (const CInterfaceProxyVtbl *) &if2_proxy_vtbl,
376  (const CInterfaceProxyVtbl *) &if3_proxy_vtbl,
377  (const CInterfaceProxyVtbl *) &if4_proxy_vtbl,
378  NULL
379 };
380 
382 {
383  &if1_stub_vtbl,
384  &if2_stub_vtbl,
385  &if3_stub_vtbl,
386  &if4_stub_vtbl,
387  NULL
388 };
389 
391 {
392  "if1",
393  "if2",
394  "if3",
395  "if4",
396  NULL
397 };
398 
399 static const IID *base_iid_list[] =
400 {
401  NULL,
402  &IID_ITypeLib,
403  NULL,
404  &IID_IDispatch,
405  NULL
406 };
407 
408 #define cstub_CHECK_IID(n) IID_GENERIC_CHECK_IID( cstub, pIID, n)
409 
410 static int __stdcall iid_lookup( const IID * pIID, int * pIndex )
411 {
413 
414  IID_BS_LOOKUP_INITIAL_TEST( cstub, 4, 4 )
415  IID_BS_LOOKUP_NEXT_TEST( cstub, 2 )
416  IID_BS_LOOKUP_NEXT_TEST( cstub, 1 )
417  IID_BS_LOOKUP_RETURN_RESULT( cstub, 4, *pIndex )
418 
419 }
420 
421 
422 static BOOL check_address(void *actual, void *expected)
423 {
424  static void *ole32_start = NULL;
425  static void *ole32_end = NULL;
426  static void *combase_start = NULL;
427  static void *combase_end = NULL;
428 
429  if (actual == expected)
430  return TRUE;
431 
432  /* On Win7, actual can be located inside ole32.dll */
433  if (ole32_start == NULL || ole32_end == NULL)
434  {
435  PIMAGE_NT_HEADERS nt_headers;
436  ole32_start = (void *) GetModuleHandleA("ole32.dll");
437  if (ole32_start == NULL)
438  return FALSE;
439  nt_headers = (PIMAGE_NT_HEADERS)((char *) ole32_start + ((PIMAGE_DOS_HEADER) ole32_start)->e_lfanew);
440  ole32_end = (void *)((char *) ole32_start + nt_headers->OptionalHeader.SizeOfImage);
441  }
442 
443  if (ole32_start <= actual && actual < ole32_end)
444  return TRUE;
445 
446  /* On Win8, actual can be located inside combase.dll */
447  if (combase_start == NULL || combase_end == NULL)
448  {
449  PIMAGE_NT_HEADERS nt_headers;
450  combase_start = (void *) GetModuleHandleA("combase.dll");
451  if (combase_start == NULL)
452  return FALSE;
453  nt_headers = (PIMAGE_NT_HEADERS)((char *) combase_start + ((PIMAGE_DOS_HEADER) combase_start)->e_lfanew);
454  combase_end = (void *)((char *) combase_start + nt_headers->OptionalHeader.SizeOfImage);
455  }
456 
457  return (combase_start <= actual && actual < combase_end);
458 }
459 
461 {
464  (const PCInterfaceName *) &if_name_list,
465  (const IID **) &base_iid_list,
466  &iid_lookup,
467  4,
468  1,
469  NULL,
470  0,
471  0,
472  0
473 };
474 
475 static const ProxyFileInfo *proxy_file_list[] = {
477  NULL
478 };
479 
480 
482 {
483  HMODULE rpcrt4 = GetModuleHandleA("rpcrt4.dll");
484  IPSFactoryBuffer *ppsf = NULL;
485  const PCInterfaceProxyVtblList* proxy_vtbl;
486  const PCInterfaceStubVtblList* stub_vtbl;
487  const CLSID CLSID_Unknown = {0x45678, 0x1234, 0x6666, {0xff, 0x67, 0x45, 0x98, 0x76, 0x12, 0x34, 0x56}};
488  static const GUID * const interfaces[] = { &IID_if1, &IID_if2, &IID_if3, &IID_if4 };
489  UINT i;
490  HRESULT r;
491  HMODULE hmod = GetModuleHandleA("rpcrt4.dll");
492  void *CStd_QueryInterface = GetProcAddress(hmod, "CStdStubBuffer_QueryInterface");
493  void *CStd_AddRef = GetProcAddress(hmod, "CStdStubBuffer_AddRef");
494  void *CStd_Release = GetProcAddress(hmod, "NdrCStdStubBuffer_Release");
495  void *CStd_Connect = GetProcAddress(hmod, "CStdStubBuffer_Connect");
496  void *CStd_Disconnect = GetProcAddress(hmod, "CStdStubBuffer_Disconnect");
497  void *CStd_Invoke = GetProcAddress(hmod, "CStdStubBuffer_Invoke");
498  void *CStd_IsIIDSupported = GetProcAddress(hmod, "CStdStubBuffer_IsIIDSupported");
499  void *CStd_CountRefs = GetProcAddress(hmod, "CStdStubBuffer_CountRefs");
500  void *CStd_DebugServerQueryInterface = GetProcAddress(hmod, "CStdStubBuffer_DebugServerQueryInterface");
501  void *CStd_DebugServerRelease = GetProcAddress(hmod, "CStdStubBuffer_DebugServerRelease");
502 
503  r = NdrDllGetClassObject(&CLSID_Unknown, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
505  ok(r == CLASS_E_CLASSNOTAVAILABLE, "NdrDllGetClassObject with unknown clsid should have returned CLASS_E_CLASSNOTAVAILABLE instead of 0x%x\n", r);
506  ok(ppsf == NULL, "NdrDllGetClassObject should have set ppsf to NULL on failure\n");
507 
508  r = NdrDllGetClassObject(&CLSID_psfact, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
510 
511  ok(r == S_OK, "ret %08x\n", r);
512  ok(ppsf != NULL, "ppsf == NULL\n");
513 
514  proxy_vtbl = PSFactoryBuffer.pProxyFileList[0]->pProxyVtblList;
515  stub_vtbl = PSFactoryBuffer.pProxyFileList[0]->pStubVtblList;
516  ok(PSFactoryBuffer.pProxyFileList == proxy_file_list, "pfl not the same\n");
517  ok(proxy_vtbl == (PCInterfaceProxyVtblList *) &cstub_ProxyVtblList, "proxy vtbllist not the same\n");
518  ok(stub_vtbl == (PCInterfaceStubVtblList *) &cstub_StubVtblList, "stub vtbllist not the same\n");
519 
520  /* if1 is non-delegating, if2 is delegating, if3 is non-delegating
521  but I've zero'ed the vtbl entries, similarly if4 is delegating
522  with zero'ed vtbl entries */
523 
524 #define VTBL_TEST_NOT_CHANGE_TO(name, i) \
525  ok(stub_vtbl[i]->Vtbl.name != CStd_##name, #name "vtbl %d updated %p %p\n", \
526  i, stub_vtbl[i]->Vtbl.name, CStd_##name )
527 #define VTBL_TEST_CHANGE_TO(name, i) \
528  ok(check_address(stub_vtbl[i]->Vtbl.name, CStd_##name), #name "vtbl %d not updated %p %p\n", \
529  i, stub_vtbl[i]->Vtbl.name, CStd_##name )
530 #define VTBL_TEST_ZERO(name, i) \
531  ok(stub_vtbl[i]->Vtbl.name == NULL, #name "vtbl %d not null %p\n", \
532  i, stub_vtbl[i]->Vtbl.name )
533 
538  VTBL_TEST_NOT_CHANGE_TO(Disconnect, 0);
539  VTBL_TEST_NOT_CHANGE_TO(Invoke, 0);
540  VTBL_TEST_NOT_CHANGE_TO(IsIIDSupported, 0);
541  VTBL_TEST_NOT_CHANGE_TO(CountRefs, 0);
542  VTBL_TEST_NOT_CHANGE_TO(DebugServerQueryInterface, 0);
543  VTBL_TEST_NOT_CHANGE_TO(DebugServerRelease, 0);
544 
549  VTBL_TEST_NOT_CHANGE_TO(Disconnect, 1);
550  VTBL_TEST_CHANGE_TO(Invoke, 1);
551  VTBL_TEST_CHANGE_TO(IsIIDSupported, 1);
552  VTBL_TEST_NOT_CHANGE_TO(CountRefs, 1);
553  VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 1);
554  VTBL_TEST_CHANGE_TO(DebugServerRelease, 1);
555 
560  VTBL_TEST_CHANGE_TO(Disconnect, 2);
561  VTBL_TEST_CHANGE_TO(Invoke, 2);
562  VTBL_TEST_CHANGE_TO(IsIIDSupported, 2);
563  VTBL_TEST_CHANGE_TO(CountRefs, 2);
564  VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 2);
565  VTBL_TEST_CHANGE_TO(DebugServerRelease, 2);
566 
571  VTBL_TEST_NOT_CHANGE_TO(Disconnect, 3);
572  VTBL_TEST_CHANGE_TO(Invoke, 3);
573  VTBL_TEST_CHANGE_TO(IsIIDSupported, 3);
574  VTBL_TEST_NOT_CHANGE_TO(CountRefs, 3);
575  VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 3);
576  VTBL_TEST_CHANGE_TO(DebugServerRelease, 3);
577 
578 #define VTBL_PROXY_TEST(i,num,ptr) \
579  ok( check_address(proxy_vtbl[i]->Vtbl[num], (ptr)), "wrong proxy %u func %u %p/%p\n", \
580  (i), (num), proxy_vtbl[i]->Vtbl[num], (ptr) )
581 #define VTBL_PROXY_TEST_NOT_ZERO(i,num) \
582  ok( proxy_vtbl[i]->Vtbl[num] != NULL, "wrong proxy %u func %u is NULL\n", (i), (num))
583 
589 
590  VTBL_PROXY_TEST(1, 0, GetProcAddress(rpcrt4,"IUnknown_QueryInterface_Proxy"));
591  VTBL_PROXY_TEST(1, 1, GetProcAddress(rpcrt4,"IUnknown_AddRef_Proxy"));
592  VTBL_PROXY_TEST(1, 2, GetProcAddress(rpcrt4,"IUnknown_Release_Proxy"));
603 
609 
610  VTBL_PROXY_TEST(3, 0, GetProcAddress(rpcrt4,"IUnknown_QueryInterface_Proxy"));
611  VTBL_PROXY_TEST(3, 1, GetProcAddress(rpcrt4,"IUnknown_AddRef_Proxy"));
612  VTBL_PROXY_TEST(3, 2, GetProcAddress(rpcrt4,"IUnknown_Release_Proxy"));
617 
618 #undef VTBL_TEST_NOT_CHANGE_TO
619 #undef VTBL_TEST_CHANGE_TO
620 #undef VTBL_TEST_ZERO
621 #undef VTBL_PROXY_TEST
622 #undef VTBL_PROXY_TEST_NOT_ZERO
623 
624  for (i = 0; i < ARRAY_SIZE(interfaces); i++)
625  ok( proxy_vtbl[i]->header.piid == interfaces[i],
626  "wrong proxy %u iid %p/%p\n", i, proxy_vtbl[i]->header.piid, interfaces[i] );
627 
628  ok(PSFactoryBuffer.RefCount == 1, "ref count %d\n", PSFactoryBuffer.RefCount);
629  IPSFactoryBuffer_Release(ppsf);
630 
631  /* One can also search by IID */
632  r = NdrDllGetClassObject(&IID_if3, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
634  ok(r == S_OK, "ret %08x\n", r);
635  ok(ppsf != NULL, "ppsf == NULL\n");
636  IPSFactoryBuffer_Release(ppsf);
637 
638  r = NdrDllGetClassObject(&IID_if3, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
640  ok(r == S_OK, "ret %08x\n", r);
641  ok(ppsf != NULL, "ppsf == NULL\n");
642  IPSFactoryBuffer_Release(ppsf);
643 
644  /* but only if the PS factory implements it */
645  r = NdrDllGetClassObject(&IID_IDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
647  ok(r == CLASS_E_CLASSNOTAVAILABLE, "ret %08x\n", r);
648 
649  /* Create it again to return */
650  r = NdrDllGetClassObject(&CLSID_psfact, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
652  ok(r == S_OK, "ret %08x\n", r);
653  ok(ppsf != NULL, "ppsf == NULL\n");
654 
655  /* Because this PS factory is not loaded as a dll in the normal way, Windows 8 / 10
656  get confused and will crash when one of the proxies for the delegated ifaces is created.
657  Registering the ifaces fixes this (in fact calling CoRegisterPSClsid() with any IID / CLSID is enough). */
658 
660  ok(r == S_OK, "ret %08x\n", r);
662  ok(r == S_OK, "ret %08x\n", r);
664  ok(r == S_OK, "ret %08x\n", r);
666  ok(r == S_OK, "ret %08x\n", r);
667 
668  return ppsf;
669 }
670 
673 {
675  ok(msg == (RPCOLEMESSAGE*)0xcafebabe, "msg ptr changed\n");
676  ok(channel == (IRpcChannelBuffer*)0xdeadbeef, "channel ptr changed\n");
677  return S_OK; /* returning any failure here results in an exception */
678 }
679 
680 static IRpcStubBufferVtbl base_buffer_vtbl = {
681  (void*)0xcafebab0,
682  (void*)0xcafebab1,
683  (void*)0xcafebab2,
684  (void*)0xcafebab3,
685  (void*)0xcafebab4,
687  (void*)0xcafebab6,
688  (void*)0xcafebab7,
689  (void*)0xcafebab8,
690  (void*)0xcafebab9
691 };
692 
694 {
695  void *This[5];
696  void *real_this;
697  IRpcChannelBuffer *channel = (IRpcChannelBuffer*)0xdeadbeef;
698  RPC_MESSAGE *msg = (RPC_MESSAGE*)0xcafebabe;
699  DWORD *phase = (DWORD*)0x12345678;
700  IRpcStubBufferVtbl *base_buffer_vtbl_ptr = &base_buffer_vtbl;
701  IRpcStubBuffer *base_stub_buffer = (IRpcStubBuffer*)&base_buffer_vtbl_ptr;
702 
703  memset(This, 0xcc, sizeof(This));
704  This[0] = base_stub_buffer;
705  real_this = &This[1];
706 
707  NdrStubForwardingFunction( real_this, channel, msg, phase );
708  ok(base_buffer_invoke_called == 1, "base_buffer_invoke called %d times\n", base_buffer_invoke_called);
709 
710 }
711 
713 {
714  IRpcStubBuffer *pstub = NULL;
715  HRESULT r;
716 
717  r = IPSFactoryBuffer_CreateStub(ppsf, iid, obj, &pstub);
718  ok(r == expected_result, "CreateStub returned %08x expected %08x\n", r, expected_result);
719  return pstub;
720 }
721 
723 {
724  ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
725  *ppv = (void*)0xdeadbeef;
726  return S_OK;
727 }
728 
729 static IUnknownVtbl create_stub_test_vtbl =
730 {
732  NULL,
733  NULL
734 };
735 
737 {
738  ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
739  *ppv = NULL;
740  return E_NOINTERFACE;
741 }
742 
743 static IUnknownVtbl create_stub_test_fail_vtbl =
744 {
746  NULL,
747  NULL
748 };
749 
751 {
754 };
755 
756 static inline struct dummy_unknown *impl_from_IUnknown(IUnknown *iface)
757 {
758  return CONTAINING_RECORD(iface, struct dummy_unknown, IUnknown_iface);
759 }
760 
762 {
763  *ppv = NULL;
764  return E_NOINTERFACE;
765 }
766 
768 {
769  struct dummy_unknown *this = impl_from_IUnknown(iface);
770  return InterlockedIncrement( &this->ref );
771 }
772 
774 {
775  struct dummy_unknown *this = impl_from_IUnknown(iface);
776  return InterlockedDecrement( &this->ref );
777 }
778 
779 static IUnknownVtbl dummy_unknown_vtbl =
780 {
782  dummy_AddRef,
784 };
785 static struct dummy_unknown dummy_unknown = { { &dummy_unknown_vtbl }, 0 };
786 
787 static void create_proxy_test( IPSFactoryBuffer *ppsf, REFIID iid, const void *expected_vtbl )
788 {
790  IUnknown *iface = NULL;
791  HRESULT r;
792  ULONG count;
793 
794  r = IPSFactoryBuffer_CreateProxy(ppsf, NULL, iid, &proxy, (void **)&iface);
795  ok( r == S_OK, "IPSFactoryBuffer_CreateProxy failed %x\n", r );
796  ok( *(void **)iface == expected_vtbl, "wrong iface pointer %p/%p\n", *(void **)iface, expected_vtbl );
797  count = IUnknown_Release( iface );
798  ok( count == 1, "wrong refcount %u\n", count );
799  count = IRpcProxyBuffer_Release( proxy );
800  ok( count == 0, "wrong refcount %u\n", count );
801 
802  dummy_unknown.ref = 4;
803  r = IPSFactoryBuffer_CreateProxy(ppsf, &dummy_unknown.IUnknown_iface, iid, &proxy,
804  (void **)&iface);
805  ok( r == S_OK, "IPSFactoryBuffer_CreateProxy failed %x\n", r );
806  ok( dummy_unknown.ref == 5, "wrong refcount %u\n", dummy_unknown.ref );
807  ok( *(void **)iface == expected_vtbl, "wrong iface pointer %p/%p\n", *(void **)iface, expected_vtbl );
808  count = IUnknown_Release( iface );
809  ok( count == 4, "wrong refcount %u\n", count );
810  ok( dummy_unknown.ref == 4, "wrong refcount %u\n", dummy_unknown.ref );
811  count = IRpcProxyBuffer_Release( proxy );
812  ok( count == 0, "wrong refcount %u\n", count );
813  ok( dummy_unknown.ref == 4, "wrong refcount %u\n", dummy_unknown.ref );
814 }
815 
816 static void test_CreateProxy( IPSFactoryBuffer *ppsf )
817 {
818  create_proxy_test( ppsf, &IID_if1, if1_proxy_vtbl.Vtbl );
819  create_proxy_test( ppsf, &IID_if2, if2_proxy_vtbl.Vtbl );
820  create_proxy_test( ppsf, &IID_if3, if3_proxy_vtbl.Vtbl );
821  create_proxy_test( ppsf, &IID_if4, if4_proxy_vtbl.Vtbl );
822 }
823 
825 {
826  IUnknownVtbl *vtbl = &create_stub_test_vtbl;
827  IUnknown *obj = (IUnknown*)&vtbl;
828  IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
829  CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
830  const CInterfaceStubHeader *header = &CONTAINING_RECORD(cstd_stub->lpVtbl, const CInterfaceStubVtbl, Vtbl)->header;
831 
832  ok(IsEqualIID(header->piid, &IID_if1), "header iid differs\n");
833  ok(cstd_stub->RefCount == 1, "ref count %d\n", cstd_stub->RefCount);
834  /* 0xdeadbeef returned from create_stub_test_QI */
835  ok(cstd_stub->pvServerObject == (void*)0xdeadbeef, "pvServerObject %p\n", cstd_stub->pvServerObject);
836  ok(cstd_stub->pPSFactory != NULL, "pPSFactory was NULL\n");
837  cstd_stub->pvServerObject = NULL;
838  IRpcStubBuffer_Release(pstub);
839 
841  pstub = create_stub(ppsf, &IID_if1, obj, E_NOINTERFACE);
842  ok(pstub == S_OK, "create_stub failed: %u\n", GetLastError());
843 
844 }
845 
847 {
848  ok(IsEqualIID(iid, &IID_if1) ||
849  IsEqualIID(iid, &IID_if2), "incorrect iid\n");
850  *ppv = (void*)This;
851  return S_OK;
852 }
853 
856 {
858  return 0;
859 }
860 
861 static IUnknownVtbl connect_test_orig_vtbl =
862 {
864  NULL,
866 };
867 
869 {
870  ok(IsEqualIID(iid, &IID_if1) ||
871  IsEqualIID(iid, &IID_if2), "incorrect iid\n");
872  *ppv = (void*)0xcafebabe;
873  return S_OK;
874 }
875 
876 static IUnknownVtbl connect_test_new_vtbl =
877 {
879  NULL,
880  NULL
881 };
882 
884 {
885  ok(IsEqualIID(iid, &IID_if1), "incorrect iid\n");
886  *ppv = (void*)0xdeadbeef;
887  return E_NOINTERFACE;
888 }
889 
890 static IUnknownVtbl connect_test_new_fail_vtbl =
891 {
893  NULL,
894  NULL
895 };
896 
899 {
901  ok(*(void**)obj == (void*)0xbeefcafe, "unexpected obj %p\n", obj);
902  return S_OK;
903 }
904 
905 static IRpcStubBufferVtbl connect_test_base_stub_buffer_vtbl =
906 {
907  (void*)0xcafebab0,
908  (void*)0xcafebab1,
909  (void*)0xcafebab2,
911  (void*)0xcafebab4,
912  (void*)0xcafebab5,
913  (void*)0xcafebab6,
914  (void*)0xcafebab7,
915  (void*)0xcafebab8,
916  (void*)0xcafebab9
917 };
918 
919 static void test_Connect(IPSFactoryBuffer *ppsf)
920 {
921  IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl;
922  IUnknownVtbl *new_vtbl = &connect_test_new_vtbl;
923  IUnknownVtbl *new_fail_vtbl = &connect_test_new_fail_vtbl;
924  IUnknown *obj = (IUnknown*)&orig_vtbl;
925  IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
926  CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
927  IRpcStubBufferVtbl *base_stub_buf_vtbl = &connect_test_base_stub_buffer_vtbl;
928  HRESULT r;
929 
930  obj = (IUnknown*)&new_vtbl;
931  r = IRpcStubBuffer_Connect(pstub, obj);
932  ok(r == S_OK, "r %08x\n", r);
934  ok(cstd_stub->pvServerObject == (void*)0xcafebabe, "pvServerObject %p\n", cstd_stub->pvServerObject);
935 
936  cstd_stub->pvServerObject = (IUnknown*)&orig_vtbl;
937  obj = (IUnknown*)&new_fail_vtbl;
938  r = IRpcStubBuffer_Connect(pstub, obj);
939  ok(r == E_NOINTERFACE, "r %08x\n", r);
940  ok(cstd_stub->pvServerObject == (void*)0xdeadbeef, "pvServerObject %p\n", cstd_stub->pvServerObject);
942 
943  /* Now use a delegated stub.
944 
945  We know from the NdrStubForwardFunction test that
946  (void**)pstub-1 is the base interface stub buffer. This shows
947  that (void**)pstub-2 contains the address of a vtable that gets
948  passed to the base interface's Connect method. Note that
949  (void**)pstub-2 itself gets passed to Connect and not
950  *((void**)pstub-2), so it should contain the vtable ptr and not
951  an interface ptr. */
952 
953  obj = (IUnknown*)&orig_vtbl;
954  pstub = create_stub(ppsf, &IID_if2, obj, S_OK);
955  *((void**)pstub-1) = &base_stub_buf_vtbl;
956  *((void**)pstub-2) = (void*)0xbeefcafe;
957 
958  obj = (IUnknown*)&new_vtbl;
959  r = IRpcStubBuffer_Connect(pstub, obj);
960  ok(r == S_OK, "r %08x\n", r);
961  ok(connect_test_base_Connect_called == 1, "connect_test_bsae_Connect called %d times\n",
964  cstd_stub = (CStdStubBuffer*)pstub;
965  ok(cstd_stub->pvServerObject == (void*)0xcafebabe, "pvServerObject %p\n", cstd_stub->pvServerObject);
966 }
967 
969 {
970  IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl;
971  IUnknown *obj = (IUnknown*)&orig_vtbl;
972  IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
973  CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
974 
976  IRpcStubBuffer_Disconnect(pstub);
978  ok(cstd_stub->pvServerObject == NULL, "pvServerObject %p\n", cstd_stub->pvServerObject);
979  IRpcStubBuffer_Release(pstub);
980 }
981 
982 
985 {
987  return 1;
988 }
989 
991 {
992  NULL,
993  NULL,
995 };
996 
997 static void test_Release(IPSFactoryBuffer *ppsf)
998 {
999  LONG facbuf_refs;
1000  IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl;
1001  IUnknown *obj = (IUnknown*)&orig_vtbl;
1002  IUnknownVtbl *pretend_psfacbuf_vtbl = &release_test_pretend_psfacbuf_vtbl;
1003  IUnknown *pretend_psfacbuf = (IUnknown *)&pretend_psfacbuf_vtbl;
1004  IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
1005  CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub;
1006 
1007  facbuf_refs = PSFactoryBuffer.RefCount;
1008 
1009  /* This shows that NdrCStdStubBuffer_Release doesn't call Disconnect */
1010  ok(cstd_stub->RefCount == 1, "ref count %d\n", cstd_stub->RefCount);
1012  IRpcStubBuffer_Release(pstub);
1013 todo_wine {
1015 }
1016  ok(PSFactoryBuffer.RefCount == facbuf_refs - 1, "factory buffer refs %d orig %d\n", PSFactoryBuffer.RefCount, facbuf_refs);
1017 
1018  /* This shows that NdrCStdStubBuffer_Release calls Release on its 2nd arg, rather than on This->pPSFactory
1019  (which are usually the same and indeed it's odd that _Release requires this 2nd arg). */
1020  pstub = create_stub(ppsf, &IID_if1, obj, S_OK);
1021  ok(PSFactoryBuffer.RefCount == facbuf_refs, "factory buffer refs %d orig %d\n", PSFactoryBuffer.RefCount, facbuf_refs);
1022  NdrCStdStubBuffer_Release(pstub, (IPSFactoryBuffer*)pretend_psfacbuf);
1023  ok(release_test_psfacbuf_release_called == 1, "pretend_psfacbuf_release called %d\n", release_test_psfacbuf_release_called);
1024  ok(PSFactoryBuffer.RefCount == facbuf_refs, "factory buffer refs %d orig %d\n", PSFactoryBuffer.RefCount, facbuf_refs);
1025 }
1026 
1028 {
1029 
1030  *ppv = pUnk;
1031  return S_OK;
1032 }
1033 
1035 {
1036  return 1;
1037 }
1038 
1040 {
1041  return 1;
1042 }
1043 
1045 {
1046  return 0xabcdef;
1047 }
1048 
1049 static ITypeLibVtbl delegating_invoke_test_obj_vtbl =
1050 {
1055  NULL,
1056  NULL,
1057  NULL,
1058  NULL,
1059  NULL,
1060  NULL,
1061  NULL,
1062  NULL,
1063  NULL
1064 };
1065 
1067  REFIID iid,
1068  void **ppv)
1069 {
1070  ok(0, "call to QueryInterface not expected\n");
1071  return E_NOINTERFACE;
1072 }
1073 
1075 {
1076  return 2;
1077 }
1078 
1080 {
1081  return 1;
1082 }
1083 
1085  RPCOLEMESSAGE *msg,
1086  REFIID iid)
1087 {
1088  msg->Buffer = HeapAlloc(GetProcessHeap(), 0, msg->cbBuffer);
1089  return S_OK;
1090 }
1091 
1093  RPCOLEMESSAGE *pMessage,
1094  ULONG *pStatus)
1095 {
1096  ok(0, "call to SendReceive not expected\n");
1097  return E_NOTIMPL;
1098 }
1099 
1101  RPCOLEMESSAGE *pMessage)
1102 {
1103  ok(0, "call to FreeBuffer not expected\n");
1104  return E_NOTIMPL;
1105 }
1106 
1108  DWORD *pdwDestContext,
1109  void **ppvDestContext)
1110 {
1111  *pdwDestContext = MSHCTX_LOCAL;
1112  *ppvDestContext = NULL;
1113  return S_OK;
1114 }
1115 
1117 {
1118  ok(0, "call to IsConnected not expected\n");
1119  return E_NOTIMPL;
1120 }
1121 
1122 static IRpcChannelBufferVtbl delegating_invoke_test_rpc_chan_vtbl =
1123 {
1132 };
1133 
1135 {
1136  ITypeLibVtbl *obj_vtbl = &delegating_invoke_test_obj_vtbl;
1137  IUnknown *obj = (IUnknown*)&obj_vtbl;
1138  IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if2, obj, S_OK);
1139  IRpcChannelBufferVtbl *pchan_vtbl = &delegating_invoke_test_rpc_chan_vtbl;
1140  IRpcChannelBuffer *pchan = (IRpcChannelBuffer *)&pchan_vtbl;
1141  HRESULT r = E_FAIL;
1142  RPCOLEMESSAGE msg;
1143 
1144  memset(&msg, 0, sizeof(msg));
1145  msg.dataRepresentation = NDR_LOCAL_DATA_REPRESENTATION;
1146  msg.iMethod = 3;
1147  r = IRpcStubBuffer_Invoke(pstub, &msg, pchan);
1148  ok(r == S_OK, "ret %08x\n", r);
1149  if(r == S_OK)
1150  {
1151  ok(*(DWORD*)msg.Buffer == 0xabcdef, "buf[0] %08x\n", *(DWORD*)msg.Buffer);
1152  ok(*((DWORD*)msg.Buffer + 1) == S_OK, "buf[1] %08x\n", *((DWORD*)msg.Buffer + 1));
1153  }
1154  /* free the buffer allocated by delegating_invoke_chan_get_buffer */
1155  HeapFree(GetProcessHeap(), 0, msg.Buffer);
1156  IRpcStubBuffer_Release(pstub);
1157 }
1159 {
1160  NULL
1161 };
1162 
1164 {
1165  NULL
1166 };
1167 
1169 {
1170  NULL
1171 };
1172 
1173 static const IID *base_iid_list2[] =
1174 {
1175  NULL,
1176 };
1177 
1179 {
1182  (const PCInterfaceName *) &if_name_list2,
1183  (const IID **) &base_iid_list2,
1184  &iid_lookup,
1185  0,
1186  1,
1187  NULL,
1188  0,
1189  0,
1190  0
1191 };
1192 
1193 static const ProxyFileInfo *proxy_file_list2[] = {
1195  NULL
1196 };
1197 
1198 static void test_NdrDllRegisterProxy( void )
1199 {
1200  HRESULT res;
1201  const ExtendedProxyFileInfo *pf;
1203 
1204 
1206  ok(res == E_HANDLE, "Incorrect return code %x\n",res);
1207  pf = NULL;
1208  res = NdrDllRegisterProxy(hmod, &pf, NULL);
1209  ok(res == E_NOINTERFACE, "Incorrect return code %x\n",res);
1211  ok(res == E_NOINTERFACE, "Incorrect return code %x\n",res);
1212  /* This fails on Vista and Windows 7 due to permissions */
1214  ok(res == S_OK || res == E_ACCESSDENIED, "NdrDllRegisterProxy failed %x\n",res);
1215  if (res == S_OK)
1216  {
1218  ok(res == S_OK, "NdrDllUnregisterProxy failed %x\n",res);
1219  }
1220 }
1221 
1222 static HANDLE create_process(const char *arg)
1223 {
1225  STARTUPINFOA si = {0};
1226  char cmdline[200];
1227  char **argv;
1228  BOOL ret;
1229 
1230  si.cb = sizeof(si);
1232  sprintf(cmdline, "\"%s\" %s %s", argv[0], argv[1], arg);
1233  ret = CreateProcessA(argv[0], cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
1234  ok(ret, "CreateProcess failed: %u\n", GetLastError());
1235  CloseHandle(pi.hThread);
1236  return pi.hProcess;
1237 }
1238 
1239 DEFINE_GUID(CLSID_test1,0xdeadf00d,0x0001,0x44c7,0x85,0x0f,0x2a,0x0f,0x46,0x5c,0x0c,0x6c);
1240 
1242 {
1243  if (winetest_debug > 1) trace("%s\n", wine_dbgstr_guid(iid));
1244  if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_ITest1))
1245  {
1246  *out = iface;
1247  return S_OK;
1248  }
1249  *out = NULL;
1250  return E_NOINTERFACE;
1251 }
1252 
1254 {
1255  return 2;
1256 }
1257 
1259 {
1260  return 1;
1261 }
1262 
1264 {
1265  *clsid = CLSID_test1;
1266  return S_OK;
1267 }
1268 
1269 static int WINAPI test1_square(ITest1 *iface, int x)
1270 {
1271  return x * x;
1272 }
1273 
1274 static const ITest1Vtbl test1_vtbl =
1275 {
1277  test1_AddRef,
1278  test1_Release,
1280  test1_square,
1281 };
1282 
1284 {
1286  {
1287  *out = iface;
1288  return S_OK;
1289  }
1290  *out = NULL;
1291  return E_NOINTERFACE;
1292 }
1293 
1295 {
1296  return 2;
1297 }
1298 
1300 {
1301  return 1;
1302 }
1303 
1305 {
1306  ITest1 *obj = heap_alloc(sizeof(*obj));
1307 
1308  obj->lpVtbl = &test1_vtbl;
1309 
1310  return ITest1_QueryInterface(obj, iid, out);
1311 }
1312 
1314 {
1315  return S_OK;
1316 }
1317 
1318 static const IClassFactoryVtbl test_cf_vtbl =
1319 {
1325 };
1326 
1328 
1330 extern const ProxyFileInfo * aProxyFileList;
1331 
1332 static void local_server_proc(void)
1333 {
1334  DWORD obj_cookie, ps_cookie, index;
1335  HANDLE stop_event, ready_event;
1336  IPSFactoryBuffer *ps;
1337  HRESULT hr;
1338 
1339  stop_event = OpenEventA(EVENT_ALL_ACCESS, FALSE, "wine_cstub_test_server_stop");
1340  ready_event = OpenEventA(EVENT_ALL_ACCESS, FALSE, "wine_cstub_test_server_ready");
1341 
1342  CoInitialize(NULL);
1343 
1344  hr = CoRegisterClassObject(&CLSID_test1, (IUnknown *)&test_cf,
1345  CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &obj_cookie);
1346  ok(hr == S_OK, "got %#x\n", hr);
1347 
1348  hr = NdrDllGetClassObject(&CLSID_test_ps, &IID_IPSFactoryBuffer, (void **)&ps,
1349  &aProxyFileList, &CLSID_test_ps, &gPFactory);
1350  ok(hr == S_OK, "got %#x\n", hr);
1351 
1352  hr = CoRegisterClassObject(&CLSID_test_ps, (IUnknown *)ps,
1353  CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &ps_cookie);
1354  ok(hr == S_OK, "got %#x\n", hr);
1355 
1356  hr = CoRegisterPSClsid(&IID_ITest1, &CLSID_test_ps);
1357  ok(hr == S_OK, "got %#x\n", hr);
1358 
1359  SetEvent(ready_event);
1360 
1361  hr = CoWaitForMultipleHandles(0, 1000, 1, &stop_event, &index);
1362  ok(hr == S_OK, "got %#x\n", hr);
1363  ok(!index, "got %u\n", index);
1364 
1365  hr = CoRevokeClassObject(ps_cookie);
1366  ok(hr == S_OK, "got %#x\n", hr);
1367 
1368  hr = CoRevokeClassObject(obj_cookie);
1369  ok(hr == S_OK, "got %#x\n", hr);
1370 
1371  CoUninitialize();
1372  ExitProcess(0);
1373 }
1374 
1375 static void test_delegated_methods(void)
1376 {
1377  HANDLE process, stop_event, ready_event;
1378  IPSFactoryBuffer *ps;
1379  ITest1 *test_obj;
1380  DWORD ps_cookie;
1381  CLSID clsid;
1382  HRESULT hr;
1383  int ret;
1384 
1385  stop_event = CreateEventA(NULL, TRUE, FALSE, "wine_cstub_test_server_stop");
1386  ready_event = CreateEventA(NULL, TRUE, FALSE, "wine_cstub_test_server_ready");
1387 
1388  process = create_process("server");
1389  ok(!WaitForSingleObject(ready_event, 1000), "wait failed\n");
1390 
1391  hr = NdrDllGetClassObject(&CLSID_test_ps, &IID_IPSFactoryBuffer, (void **)&ps,
1392  &aProxyFileList, &CLSID_test_ps, &gPFactory);
1393  ok(hr == S_OK, "got %#x\n", hr);
1394 
1395  hr = CoRegisterClassObject(&CLSID_test_ps, (IUnknown *)ps,
1396  CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &ps_cookie);
1397  ok(hr == S_OK, "got %#x\n", hr);
1398 
1399  hr = CoRegisterPSClsid(&IID_ITest1, &CLSID_test_ps);
1400  ok(hr == S_OK, "got %#x\n", hr);
1401 
1402  hr = CoCreateInstance(&CLSID_test1, NULL, CLSCTX_LOCAL_SERVER, &IID_ITest1, (void **)&test_obj);
1403  ok(hr == S_OK, "got %#x\n", hr);
1404 
1405  ret = ITest1_square(test_obj, 3);
1406  ok(ret == 9, "got %d\n", ret);
1407 
1408  hr = ITest1_GetClassID(test_obj, &clsid);
1409  ok(hr == S_OK, "got %#x\n", hr);
1410  ok(IsEqualGUID(&clsid, &CLSID_test1), "got %s\n", wine_dbgstr_guid(&clsid));
1411 
1412  ITest1_Release(test_obj);
1413 
1415  ok(!WaitForSingleObject(process, 1000), "wait failed\n");
1416 
1417  hr = CoRevokeClassObject(ps_cookie);
1418  ok(hr == S_OK, "got %#x\n", hr);
1419 }
1420 
1421 START_TEST( cstub )
1422 {
1423  IPSFactoryBuffer *ppsf;
1424  int argc;
1425  char **argv;
1426 
1428  if (argc > 2 && !strcmp(argv[2], "server"))
1429  {
1431  return;
1432  }
1433 
1435 
1436  ppsf = test_NdrDllGetClassObject();
1438  test_CreateProxy(ppsf);
1439  test_CreateStub(ppsf);
1440  test_Connect(ppsf);
1441  test_Disconnect(ppsf);
1442  test_Release(ppsf);
1443  test_delegating_Invoke(ppsf);
1446 
1447  OleUninitialize();
1448 }
static const ProxyFileInfo * proxy_file_list[]
Definition: cstub.c:475
HRESULT WINAPI CStdStubBuffer_QueryInterface(LPRPCSTUBBUFFER iface, REFIID riid, LPVOID *obj)
Definition: cstub.c:378
static HRESULT WINAPI delegating_invoke_chan_free_buffer(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *pMessage)
Definition: cstub.c:1100
static const unsigned short if4_FormatStringOffsetTable[]
Definition: cstub.c:341
static int argc
Definition: ServiceArgs.c:12
static CLSID CLSID_psfact
Definition: cstub.c:61
static IUnknownVtbl connect_test_new_vtbl
Definition: cstub.c:876
static const ExtendedProxyFileInfo my_proxy_file_info
Definition: cstub.c:460
#define trace(...)
Definition: kmt_test.h:217
static ULONG WINAPI delegating_invoke_test_addref(ITypeLib *pUnk)
Definition: cstub.c:1034
static const MIDL_SERVER_INFO if3_server_info
Definition: cstub.c:306
#define E_ACCESSDENIED
Definition: winerror.h:2849
static struct dummy_unknown * impl_from_IUnknown(IUnknown *iface)
Definition: cstub.c:756
int proxy
Definition: main.c:67
#define REFIID
Definition: guiddef.h:113
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
#define E_NOINTERFACE
Definition: winerror.h:2364
static int connect_test_base_Connect_called
Definition: cstub.c:897
#define E_HANDLE
Definition: winerror.h:2850
rwlock_t lock
Definition: tcpcore.h:1163
static const CInterfaceStubVtbl * cstub_StubVtblList[]
Definition: cstub.c:381
_In_ PKSPIN_CONNECT Connect
Definition: ks.h:4565
ULONG WINAPI IUnknown_AddRef_Proxy(LPUNKNOWN iface)
Definition: cproxy.c:434
HRESULT hr
Definition: shlfolder.c:183
_In_ BOOLEAN Release
Definition: classpnp.h:929
HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid)
Definition: cpsf.c:302
static GUID IID_if4
Definition: cstub.c:60
static void test_CreateProxy(IPSFactoryBuffer *ppsf)
Definition: cstub.c:816
static const unsigned short if1_FormatStringOffsetTable[]
Definition: cstub.c:171
static ULONG WINAPI test1_Release(ITest1 *iface)
Definition: cstub.c:1258
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint GLuint GLsizei count
Definition: gl.h:1545
static HRESULT WINAPI if1_fn1_Proxy(void *This)
Definition: cstub.c:131
static CInterfaceStubVtbl if2_stub_vtbl
Definition: cstub.c:277
unsigned char Format[TYPE_FORMAT_STRING_SIZE]
Definition: client.c:14
IUnknown IUnknown_iface
Definition: cstub.c:752
#define CALLBACK
Definition: compat.h:27
static void test_delegated_methods(void)
Definition: cstub.c:1375
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define VTBL_TEST_NOT_CHANGE_TO(name, i)
static HANDLE process
Definition: process.c:76
const char * wine_dbgstr_guid(const GUID *guid)
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1517
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
static HRESULT WINAPI base_buffer_Invoke(IRpcStubBuffer *This, RPCOLEMESSAGE *msg, IRpcChannelBuffer *channel)
Definition: cstub.c:672
static ULONG WINAPI test_cf_Release(IClassFactory *iface)
Definition: cstub.c:1299
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS
Definition: ntddk_ex.h:187
static IPSFactoryBuffer * test_NdrDllGetClassObject(void)
Definition: cstub.c:481
#define IID_BS_LOOKUP_SETUP
Definition: rpcproxy.h:229
HRESULT WINAPI CoRegisterPSClsid(REFIID riid, REFCLSID rclsid)
Definition: compobj.c:2687
struct IPSFactoryBuffer * pPSFactory
Definition: rpcproxy.h:115
TCHAR * cmdline
Definition: stretchblt.cpp:32
void(__RPC_STUB * PRPC_STUB_FUNCTION)(IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *pdwStubPhase)
Definition: rpcproxy.h:88
NTSTATUS QueryInterface(IN PDEVICE_OBJECT DeviceObject, IN CONST GUID InterfaceType, IN LONG Size, IN LONG Version, OUT PVOID Interface)
Definition: fdo.c:532
#define argv
Definition: mplay32.c:18
static ULONG WINAPI test_CStdStubBuffer_Release(IRpcStubBuffer *This)
Definition: cstub.c:47
static const unsigned short if2_FormatStringOffsetTable[]
Definition: cstub.c:236
#define E_FAIL
Definition: ddrawi.h:102
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663
static int WINAPI test1_square(ITest1 *iface, int x)
Definition: cstub.c:1269
int winetest_debug
Definition: send.c:47
static IUnknownVtbl release_test_pretend_psfacbuf_vtbl
Definition: cstub.c:990
static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString
Definition: cstub.c:99
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
Definition: cstub.idl:29
static HRESULT WINAPI create_stub_test_fail_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:736
static HRESULT WINAPI dummy_QueryInterface(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:761
static IRpcStubBufferVtbl base_buffer_vtbl
Definition: cstub.c:680
static CInterfaceStubVtbl if1_stub_vtbl
Definition: cstub.c:195
static void test_Release(IPSFactoryBuffer *ppsf)
Definition: cstub.c:997
static void test_Disconnect(IPSFactoryBuffer *ppsf)
Definition: cstub.c:968
#define sprintf(buf, format,...)
Definition: sprintf.c:55
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE stop_event
Definition: nfs41_daemon.c:55
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:93
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
#define STUB_FORWARDING_FUNCTION
Definition: rpcproxy.h:126
#define VTBL_PROXY_TEST_NOT_ZERO(i, num)
static HRESULT WINAPI test_cf_QueryInterface(IClassFactory *iface, REFIID iid, void **out)
Definition: cstub.c:1283
static ULONG WINAPI dummy_Release(LPUNKNOWN iface)
Definition: cstub.c:773
static HRESULT WINAPI connect_test_new_fail_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:883
static HRESULT WINAPI test1_QueryInterface(ITest1 *iface, REFIID iid, void **out)
Definition: cstub.c:1241
static IUnknownVtbl dummy_unknown_vtbl
Definition: cstub.c:779
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
HANDLE WINAPI DECLSPEC_HOTPATCH OpenEventA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: synch.c:615
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
static ITypeLibVtbl delegating_invoke_test_obj_vtbl
Definition: cstub.c:1049
static LPUNKNOWN
Definition: ndr_ole.c:49
ULONG WINAPI IUnknown_Release_Proxy(LPUNKNOWN iface)
Definition: cproxy.c:441
static CInterfaceStubVtbl if4_stub_vtbl
Definition: cstub.c:361
static HRESULT WINAPI delegating_invoke_chan_get_dest_ctx(IRpcChannelBuffer *pchan, DWORD *pdwDestContext, void **ppvDestContext)
Definition: cstub.c:1107
static PVOID ptr
Definition: dispmode.c:27
#define ok(value,...)
static IUnknownVtbl create_stub_test_fail_vtbl
Definition: cstub.c:743
smooth NULL
Definition: ftsmooth.c:416
ULONG WINAPI CStdStubBuffer_CountRefs(LPRPCSTUBBUFFER iface)
Definition: cstub.c:516
static int __stdcall iid_lookup(const IID *pIID, int *pIndex)
Definition: cstub.c:410
struct _IMAGE_DOS_HEADER * PIMAGE_DOS_HEADER
HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid)
Definition: cpsf.c:225
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:583
static const IID * base_iid_list[]
Definition: cstub.c:399
static void test_delegating_Invoke(IPSFactoryBuffer *ppsf)
Definition: cstub.c:1134
GLuint index
Definition: glext.h:6031
#define __RPC_STUB
Definition: rpc.h:66
static const ITest1Vtbl test1_vtbl
Definition: cstub.c:1274
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
HRESULT WINAPI DECLSPEC_HOTPATCH CoRevokeClassObject(DWORD dwRegister)
Definition: compobj.c:1089
static IUnknownVtbl connect_test_orig_vtbl
Definition: cstub.c:861
static IUnknownVtbl connect_test_new_fail_vtbl
Definition: cstub.c:890
void WINAPI CStdStubBuffer_DebugServerRelease(LPRPCSTUBBUFFER iface, LPVOID pv)
Definition: cstub.c:531
HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, ULONG cHandles, LPHANDLE pHandles, LPDWORD lpdwindex)
Definition: compobj.c:4487
CInterfaceProxyHeader header
Definition: rpcproxy.h:80
static ULONG WINAPI dummy_AddRef(LPUNKNOWN iface)
Definition: cstub.c:767
void WINAPI CStdStubBuffer_Disconnect(LPRPCSTUBBUFFER iface)
Definition: cstub.c:465
static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString
Definition: cstub.c:91
static void *CALLBACK my_alloc(SIZE_T size)
Definition: cstub.c:66
GLsizeiptr size
Definition: glext.h:5919
DWORD cb
Definition: winbase.h:796
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define IID_BS_LOOKUP_NEXT_TEST(name, split)
Definition: rpcproxy.h:232
LPRPCSTUBBUFFER WINAPI CStdStubBuffer_IsIIDSupported(LPRPCSTUBBUFFER iface, REFIID riid)
Definition: cstub.c:508
LONG HRESULT
Definition: typedefs.h:77
static ULONG WINAPI release_test_pretend_psfacbuf_release(IUnknown *pUnk)
Definition: cstub.c:984
static HRESULT WINAPI delegating_invoke_chan_is_connected(IRpcChannelBuffer *pchan)
Definition: cstub.c:1116
const GUID IID_IUnknown
#define IID_BS_LOOKUP_INITIAL_TEST(name, sz, split)
Definition: rpcproxy.h:231
static ULONG WINAPI delegating_invoke_chan_release(IRpcChannelBuffer *pchan)
Definition: cstub.c:1079
static PCInterfaceName const if_name_list[]
Definition: cstub.c:390
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:4772
static const MIDL_SERVER_INFO if4_server_info
Definition: cstub.c:350
static void test_CreateStub(IPSFactoryBuffer *ppsf)
Definition: cstub.c:824
#define WINAPI
Definition: msvc.h:8
static const MIDL_SERVER_INFO if2_server_info
Definition: cstub.c:251
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
#define VTBL_PROXY_TEST(i, num, ptr)
struct _MIDL_TYPE_FORMAT_STRING MIDL_TYPE_FORMAT_STRING
#define __stdcall
Definition: typedefs.h:25
static ULONG WINAPI delegating_invoke_chan_add_ref(IRpcChannelBuffer *pchan)
Definition: cstub.c:1074
ULONG WINAPI NdrCStdStubBuffer2_Release(LPRPCSTUBBUFFER iface, LPPSFACTORYBUFFER pPSF)
Definition: cstub.c:424
static IClassFactory test_cf
Definition: cstub.c:1327
HRESULT WINAPI IUnknown_QueryInterface_Proxy(LPUNKNOWN iface, REFIID riid, LPVOID *ppvObj)
Definition: cproxy.c:425
int winetest_get_mainargs(char ***pargv)
static int my_free_called
Definition: cstub.c:64
static ULONG WINAPI test_cf_AddRef(IClassFactory *iface)
Definition: cstub.c:1294
static IRpcChannelBufferVtbl delegating_invoke_test_rpc_chan_vtbl
Definition: cstub.c:1122
static ULONG WINAPI delegating_invoke_test_release(ITypeLib *pUnk)
Definition: cstub.c:1039
static DWORD pi
Definition: protocol.c:150
static HRESULT WINAPI connect_test_base_Connect(IRpcStubBuffer *pstub, IUnknown *obj)
Definition: cstub.c:898
const GUID IID_IDispatch
static CInterfaceStubVtbl if3_stub_vtbl
Definition: cstub.c:317
int ret
static void __RPC_STUB if1_fn2_Stub(IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase)
Definition: cstub.c:150
void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer *iface, IRpcChannelBuffer *pChannel, PRPC_MESSAGE pMsg, DWORD *pdwStubPhase)
Definition: cstub.c:610
REFCLSID clsid
Definition: msctf.c:84
#define index(s, c)
Definition: various.h:29
#define todo_wine
Definition: test.h:154
#define InterlockedDecrement
Definition: armddk.h:52
static int my_alloc_called
Definition: cstub.c:63
static GUID IID_if2
Definition: cstub.c:58
static void __RPC_STUB if1_fn1_Stub(IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase)
Definition: cstub.c:136
HRESULT WINAPI NdrDllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid, CStdPSFactoryBuffer *pPSFactoryBuffer)
Definition: cpsf.c:186
static const PRPC_STUB_FUNCTION if2_table[]
Definition: cstub.c:263
struct IUnknown * pvServerObject
Definition: rpcproxy.h:112
static HRESULT WINAPI create_stub_test_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:722
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:819
static const MIDL_SERVER_INFO if1_server_info
Definition: cstub.c:177
void *WINAPI NdrOleAllocate(SIZE_T Size)
Definition: ndr_ole.c:423
static IRpcStubBuffer * create_stub(IPSFactoryBuffer *ppsf, REFIID iid, IUnknown *obj, HRESULT expected_result)
Definition: cstub.c:712
static const CInterfaceProxyVtbl * cstub_ProxyVtblList2[]
Definition: cstub.c:1158
const ProxyFileInfo * aProxyFileList
static HRESULT WINAPI connect_test_orig_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:846
static HRESULT WINAPI test1_GetClassID(ITest1 *iface, CLSID *clsid)
Definition: cstub.c:1263
static HRESULT WINAPI delegating_invoke_chan_get_buffer(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *msg, REFIID iid)
Definition: cstub.c:1084
static PEXPLICIT_ACCESSW *static HMODULE hmod
Definition: security.c:141
static HRESULT WINAPI test_cf_LockServer(IClassFactory *iface, BOOL lock)
Definition: cstub.c:1313
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3234
#define IID_BS_LOOKUP_RETURN_RESULT(name, sz, index)
Definition: rpcproxy.h:233
ULONG WINAPI CStdStubBuffer_AddRef(LPRPCSTUBBUFFER iface)
Definition: cstub.c:396
HRESULT WINAPI DECLSPEC_HOTPATCH OleInitialize(LPVOID reserved)
Definition: ole2.c:172
static void create_proxy_test(IPSFactoryBuffer *ppsf, REFIID iid, const void *expected_vtbl)
Definition: cstub.c:787
ULONG_PTR SIZE_T
Definition: typedefs.h:78
HRESULT WINAPI CoRegisterClassObject(REFCLSID rclsid, LPUNKNOWN pUnk, DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister)
Definition: compobj.c:2806
#define S_OK
Definition: intsafe.h:59
static const CInterfaceProxyVtbl * cstub_ProxyVtblList[]
Definition: cstub.c:372
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:107
_Out_ PULONG _Out_ PULONG pIndex
Definition: ndis.h:4546
#define InterlockedIncrement
Definition: armddk.h:53
static BOOL check_address(void *actual, void *expected)
Definition: cstub.c:422
const char * PCInterfaceName
Definition: rpcproxy.h:42
static void test_Connect(IPSFactoryBuffer *ppsf)
Definition: cstub.c:919
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:1991
void WINAPI NdrOleFree(void *NodeToFree)
Definition: ndr_ole.c:432
#define ARRAY_SIZE(a)
Definition: main.h:24
HRESULT WINAPI CStdStubBuffer_DebugServerQueryInterface(LPRPCSTUBBUFFER iface, LPVOID *ppv)
Definition: cstub.c:523
static IUnknownVtbl create_stub_test_vtbl
Definition: cstub.c:729
#define E_NOTIMPL
Definition: ddrawi.h:99
static HRESULT WINAPI test_cf_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID iid, void **out)
Definition: cstub.c:1304
static ULONG WINAPI connect_test_orig_release(IUnknown *This)
Definition: cstub.c:855
unsigned int UINT
Definition: ndis.h:50
#define VTBL_TEST_CHANGE_TO(name, i)
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
static const ExtendedProxyFileInfo my_proxy_file_info2
Definition: cstub.c:1178
static void CALLBACK my_free(void *ptr)
Definition: cstub.c:72
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:90
static void test_NdrDllRegisterProxy(void)
Definition: cstub.c:1198
HRESULT WINAPI CStdStubBuffer_Invoke(LPRPCSTUBBUFFER iface, PRPCOLEMESSAGE pMsg, LPRPCCHANNELBUFFER pChannel)
Definition: cstub.c:477
LONG ref
Definition: cstub.c:753
static HRESULT WINAPI connect_test_new_QI(IUnknown *This, REFIID iid, void **ppv)
Definition: cstub.c:868
const char * expected_result
Definition: mimeole.c:1468
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1897
#define msg(x)
Definition: auth_time.c:54
static const MIDL_STUB_DESC Object_StubDesc
Definition: cstub.c:107
GLuint res
Definition: glext.h:9613
DEFINE_GUID(CLSID_test1, 0xdeadf00d, 0x0001, 0x44c7, 0x85, 0x0f, 0x2a, 0x0f, 0x46, 0x5c, 0x0c, 0x6c)
static PCInterfaceName const if_name_list2[]
Definition: cstub.c:1168
unsigned int ULONG
Definition: retypes.h:1
static const IID * base_iid_list2[]
Definition: cstub.c:1173
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
static ULONG WINAPI test1_AddRef(ITest1 *iface)
Definition: cstub.c:1253
static HRESULT WINAPI delegating_invoke_chan_query_interface(IRpcChannelBuffer *pchan, REFIID iid, void **ppv)
Definition: cstub.c:1066
struct _MIDL_PROC_FORMAT_STRING MIDL_PROC_FORMAT_STRING
static const CInterfaceStubVtbl * cstub_StubVtblList2[]
Definition: cstub.c:1163
static const unsigned short if3_FormatStringOffsetTable[]
Definition: cstub.c:300
#define GetProcAddress(x, y)
Definition: compat.h:410
static int connect_test_orig_release_called
Definition: cstub.c:854
static HRESULT WINAPI delegating_invoke_chan_send_receive(IRpcChannelBuffer *pchan, RPCOLEMESSAGE *pMessage, ULONG *pStatus)
Definition: cstub.c:1092
static IRpcStubBufferVtbl connect_test_base_stub_buffer_vtbl
Definition: cstub.c:905
static HANDLE create_process(const char *arg)
Definition: cstub.c:1222
static const PRPC_STUB_FUNCTION if1_table[]
Definition: cstub.c:189
START_TEST(cstub)
Definition: cstub.c:1421
CStdPSFactoryBuffer gPFactory
static CStdPSFactoryBuffer PSFactoryBuffer
Definition: cstub.c:45
static ULONG WINAPI test_CStdStubBuffer2_Release(IRpcStubBuffer *This)
Definition: cstub.c:52
static const IClassFactoryVtbl test_cf_vtbl
Definition: cstub.c:1318
static int base_buffer_invoke_called
Definition: cstub.c:671
const GUID IID_IClassFactory
void WINAPI DECLSPEC_HOTPATCH OleUninitialize(void)
Definition: ole2.c:233
#define memset(x, y, z)
Definition: compat.h:39
static UINT WINAPI delegating_invoke_test_get_type_info_count(ITypeLib *pUnk)
Definition: cstub.c:1044
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
static GUID IID_if1
Definition: cstub.c:57
unsigned char Format[PROC_FORMAT_STRING_SIZE]
Definition: client.c:20
static GUID IID_if3
Definition: cstub.c:59
static const ProxyFileInfo * proxy_file_list2[]
Definition: cstub.c:1193
#define HeapFree(x, y, z)
Definition: compat.h:394
struct CFHEADER header
Definition: fdi.c:109
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:90
BOOL expected
Definition: store.c:2063
#define VTBL_TEST_ZERO(name, i)
const IRpcStubBufferVtbl * lpVtbl
Definition: rpcproxy.h:110
static HRESULT WINAPI delegating_invoke_test_QI(ITypeLib *pUnk, REFIID iid, void **ppv)
Definition: cstub.c:1027
static CINTERFACE_PROXY_VTABLE(5)
Definition: cstub.c:159
HRESULT WINAPI CStdStubBuffer_Connect(LPRPCSTUBBUFFER iface, LPUNKNOWN lpUnkServer)
Definition: cstub.c:449
ULONG WINAPI NdrCStdStubBuffer_Release(LPRPCSTUBBUFFER iface, LPPSFACTORYBUFFER pPSF)
Definition: cstub.c:403
static HRESULT WINAPI if1_fn2_Proxy(void *This)
Definition: cstub.c:145
static void test_NdrStubForwardingFunction(void)
Definition: cstub.c:693
static void local_server_proc(void)
Definition: cstub.c:1332
static int release_test_psfacbuf_release_called
Definition: cstub.c:983