ReactOS 0.4.16-dev-2332-g4cba65d
moniker.c
Go to the documentation of this file.
1/*
2 * Monikers
3 *
4 * Copyright 1998 Marcus Meissner
5 * Copyright 1999 Noomen Hamza
6 * Copyright 2005 Robert Shearman (for CodeWeavers)
7 * Copyright 2007 Robert Shearman
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <stdarg.h>
25#include <string.h>
26
27#define COBJMACROS
28
29#include "wine/list.h"
30#include "wine/debug.h"
31
32#include "compobj_private.h"
33#include "moniker.h"
34#include "irot.h"
35#include "pathcch.h"
36
38
39/* Combase exports */
42 const InterfaceData *object, const InterfaceData *moniker,
43 const FILETIME *time, DWORD flags, IrotCookie *cookie, IrotContextHandle *ctxt_handle);
45HRESULT WINAPI InternalIrotGetObject(const MonikerComparisonData *moniker_data, PInterfaceData *obj,
46 IrotCookie *cookie);
50HRESULT WINAPI InternalIrotRevoke(IrotCookie cookie, IrotContextHandle *ctxt_handle, PInterfaceData *object,
51 PInterfaceData *moniker);
52
53/* define the structure of the running object table elements */
54struct rot_entry
55{
56 struct list entry;
57 InterfaceData* object; /* marshaled running object*/
58 MonikerComparisonData* moniker_data; /* moniker comparison data that identifies this object */
59 DWORD cookie; /* cookie identifying this object */
61 IrotContextHandle ctxt_handle;
62};
63
64/* define the RunningObjectTableImpl structure */
66{
68 struct list rot; /* list of ROT entries */
71
72/* define the EnumMonikerImpl structure */
73typedef struct EnumMonikerImpl
74{
76 LONG ref;
77
81
83{
84 return CONTAINING_RECORD(iface, RunningObjectTableImpl, IRunningObjectTable_iface);
85}
86
88{
89 return CONTAINING_RECORD(iface, EnumMonikerImpl, IEnumMoniker_iface);
90}
91
92/* IEnumMoniker Local functions*/
94 ULONG pos, IEnumMoniker **ppenumMoniker);
95
96static HRESULT create_stream_on_mip_ro(const InterfaceData *mip, IStream **stream)
97{
98 HGLOBAL hglobal = GlobalAlloc(0, mip->ulCntData);
99 void *pv = GlobalLock(hglobal);
100 memcpy(pv, mip->abData, mip->ulCntData);
101 GlobalUnlock(hglobal);
102 return CreateStreamOnHGlobal(hglobal, TRUE, stream);
103}
104
106{
107 if (rot_entry->cookie)
108 {
109 InterfaceData *object = NULL;
110 InterfaceData *moniker = NULL;
111
113 MIDL_user_free(object);
114 if (moniker)
115 {
117 HRESULT hr;
119 if (hr == S_OK)
120 {
122 IStream_Release(stream);
123 }
124 }
126 }
127 if (rot_entry->object)
128 {
130 HRESULT hr;
132 if (hr == S_OK)
133 {
135 IStream_Release(stream);
136 }
137 }
141}
142
143/* moniker_data must be freed with HeapFree when no longer in use */
145{
146 HRESULT hr;
147 IROTData *pROTData = NULL;
148 hr = IMoniker_QueryInterface(pMoniker, &IID_IROTData, (void *)&pROTData);
149 if (SUCCEEDED(hr))
150 {
151 ULONG size = ROT_COMPARE_MAX;
152 *moniker_data = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MonikerComparisonData, abData[size]));
153 if (!*moniker_data)
154 {
155 IROTData_Release(pROTData);
156 return E_OUTOFMEMORY;
157 }
158 hr = IROTData_GetComparisonData(pROTData, (*moniker_data)->abData, size, &size);
159 IROTData_Release(pROTData);
160 if (hr != S_OK)
161 {
162 ERR("Failed to copy comparison data into buffer, hr = %#lx\n", hr);
163 HeapFree(GetProcessHeap(), 0, *moniker_data);
164 *moniker_data = NULL;
165 return hr;
166 }
167 (*moniker_data)->ulCntData = size;
168 }
169 else
170 {
171 IBindCtx *pbc;
172 LPOLESTR pszDisplayName;
173 CLSID clsid;
174 int len;
175
176 TRACE("generating comparison data from display name\n");
177
178 hr = CreateBindCtx(0, &pbc);
179 if (FAILED(hr))
180 return hr;
181 hr = IMoniker_GetDisplayName(pMoniker, pbc, NULL, &pszDisplayName);
182 IBindCtx_Release(pbc);
183 if (FAILED(hr))
184 return hr;
185 hr = IMoniker_GetClassID(pMoniker, &clsid);
186 if (FAILED(hr))
187 {
188 CoTaskMemFree(pszDisplayName);
189 return hr;
190 }
191
192 len = lstrlenW(pszDisplayName);
193 *moniker_data = HeapAlloc(GetProcessHeap(), 0,
194 FIELD_OFFSET(MonikerComparisonData, abData[sizeof(CLSID) + (len+1)*sizeof(WCHAR)]));
195 if (!*moniker_data)
196 {
197 CoTaskMemFree(pszDisplayName);
198 return E_OUTOFMEMORY;
199 }
200 (*moniker_data)->ulCntData = sizeof(CLSID) + (len+1)*sizeof(WCHAR);
201
202 memcpy(&(*moniker_data)->abData[0], &clsid, sizeof(clsid));
203 memcpy(&(*moniker_data)->abData[sizeof(clsid)], pszDisplayName, (len+1)*sizeof(WCHAR));
204 CoTaskMemFree(pszDisplayName);
205 }
206 return S_OK;
207}
208
209static HRESULT reduce_moniker(IMoniker *pmk, IBindCtx *pbc, IMoniker **pmkReduced)
210{
211 IBindCtx *pbcNew = NULL;
212 HRESULT hr;
213 if (!pbc)
214 {
215 hr = CreateBindCtx(0, &pbcNew);
216 if (FAILED(hr))
217 return hr;
218 pbc = pbcNew;
219 }
220 hr = IMoniker_Reduce(pmk, pbc, MKRREDUCE_ALL, NULL, pmkReduced);
221 if (FAILED(hr))
222 ERR("reducing moniker failed with error %#lx.\n", hr);
223 if (pbcNew) IBindCtx_Release(pbcNew);
224 return hr;
225}
226
227/***********************************************************************
228 * RunningObjectTable_QueryInterface
229 */
230static HRESULT WINAPI
232 REFIID riid,void** ppvObject)
233{
235
236 TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppvObject);
237
238 /* validate arguments */
239
240 if (ppvObject==0)
241 return E_INVALIDARG;
242
243 *ppvObject = 0;
244
246 IsEqualIID(&IID_IRunningObjectTable, riid))
247 *ppvObject = &This->IRunningObjectTable_iface;
248
249 if ((*ppvObject)==0)
250 return E_NOINTERFACE;
251
252 IRunningObjectTable_AddRef(iface);
253
254 return S_OK;
255}
256
258{
259 TRACE("%p\n", iface);
260
261 return 2;
262}
263
265{
266 TRACE("%p\n", iface);
267
268 return 1;
269}
270
271/***********************************************************************
272 * RunningObjectTable_Register
273 *
274 * PARAMS
275 * grfFlags [in] Registration options
276 * punkObject [in] the object being registered
277 * pmkObjectName [in] the moniker of the object being registered
278 * pdwRegister [out] the value identifying the registration
279 */
280static HRESULT WINAPI
282 IUnknown *punkObject, IMoniker *pmkObjectName, DWORD *pdwRegister)
283{
285 struct rot_entry *rot_entry;
286 HRESULT hr = S_OK;
287 IStream *pStream = NULL;
288 DWORD mshlflags;
289 IBindCtx *pbc;
290 InterfaceData *moniker = NULL;
291
292 TRACE("%p, %#lx, %p, %p, %p\n", iface, flags, punkObject, pmkObjectName, pdwRegister);
293
294 if (flags & ~(ROTFLAGS_REGISTRATIONKEEPSALIVE|ROTFLAGS_ALLOWANYCLIENT))
295 {
296 ERR("Invalid flags: %#lx\n", flags & ~(ROTFLAGS_REGISTRATIONKEEPSALIVE|ROTFLAGS_ALLOWANYCLIENT));
297 return E_INVALIDARG;
298 }
299
300 if (punkObject==NULL || pmkObjectName==NULL || pdwRegister==NULL)
301 return E_INVALIDARG;
302
304 if (!rot_entry)
305 return E_OUTOFMEMORY;
306
307 /* marshal object */
308 hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
309 if (hr != S_OK)
310 {
312 return hr;
313 }
314 mshlflags = flags & ROTFLAGS_REGISTRATIONKEEPSALIVE ? MSHLFLAGS_TABLESTRONG : MSHLFLAGS_TABLEWEAK;
315 hr = CoMarshalInterface(pStream, &IID_IUnknown, punkObject, MSHCTX_LOCAL | MSHCTX_NOSHAREDMEM, NULL, mshlflags);
316 /* FIXME: a cleaner way would be to create an IStream class that writes
317 * directly to an MInterfacePointer */
318 if (hr == S_OK)
319 {
320 HGLOBAL hglobal;
321 hr = GetHGlobalFromStream(pStream, &hglobal);
322 if (hr == S_OK)
323 {
324 SIZE_T size = GlobalSize(hglobal);
325 const void *pv = GlobalLock(hglobal);
326 rot_entry->object = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MInterfacePointer, abData[size]));
327 rot_entry->object->ulCntData = size;
328 memcpy(rot_entry->object->abData, pv, size);
329 GlobalUnlock(hglobal);
330 }
331 }
332 IStream_Release(pStream);
333 if (hr != S_OK)
334 {
336 return hr;
337 }
338
339 hr = CreateBindCtx(0, &pbc);
340 if (FAILED(hr))
341 {
343 return hr;
344 }
345
346 hr = reduce_moniker(pmkObjectName, pbc, &pmkObjectName);
347 if (FAILED(hr))
348 {
350 IBindCtx_Release(pbc);
351 return hr;
352 }
353
354 hr = IMoniker_GetTimeOfLastChange(pmkObjectName, pbc, NULL,
356 IBindCtx_Release(pbc);
357 if (FAILED(hr))
358 {
360 hr = S_OK;
361 }
362
363 hr = get_moniker_comparison_data(pmkObjectName,
365 if (hr != S_OK)
366 {
368 IMoniker_Release(pmkObjectName);
369 return hr;
370 }
371
372 hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
373 if (hr != S_OK)
374 {
376 IMoniker_Release(pmkObjectName);
377 return hr;
378 }
379 /* marshal moniker */
380 hr = CoMarshalInterface(pStream, &IID_IMoniker, (IUnknown *)pmkObjectName,
381 MSHCTX_LOCAL | MSHCTX_NOSHAREDMEM, NULL, MSHLFLAGS_TABLESTRONG);
382 /* FIXME: a cleaner way would be to create an IStream class that writes
383 * directly to an MInterfacePointer */
384 if (hr == S_OK)
385 {
386 HGLOBAL hglobal;
387 hr = GetHGlobalFromStream(pStream, &hglobal);
388 if (hr == S_OK)
389 {
390 SIZE_T size = GlobalSize(hglobal);
391 const void *pv = GlobalLock(hglobal);
392 moniker = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(InterfaceData, abData[size]));
393 moniker->ulCntData = size;
394 memcpy(moniker->abData, pv, size);
395 GlobalUnlock(hglobal);
396 }
397 }
398 IStream_Release(pStream);
399 IMoniker_Release(pmkObjectName);
400 if (hr != S_OK)
401 {
404 return hr;
405 }
406
409
411 if (FAILED(hr))
412 {
414 return hr;
415 }
416
417 /* gives a registration identifier to the registered object*/
418 *pdwRegister = rot_entry->cookie;
419
423
424 return hr;
425}
426
427/***********************************************************************
428 * RunningObjectTable_Revoke
429 *
430 * PARAMS
431 * dwRegister [in] Value identifying registration to be revoked
432 */
433static HRESULT WINAPI
435{
437 struct rot_entry *rot_entry;
438
439 TRACE("%p, %ld.\n", iface, dwRegister);
440
443 {
444 if (rot_entry->cookie == dwRegister)
445 {
448
450 return S_OK;
451 }
452 }
454
455 return E_INVALIDARG;
456}
457
458/***********************************************************************
459 * RunningObjectTable_IsRunning
460 *
461 * PARAMS
462 * pmkObjectName [in] moniker of the object whose status is desired
463 */
464static HRESULT WINAPI
466{
469 HRESULT hr;
470 const struct rot_entry *rot_entry;
471
472 TRACE("(%p,%p)\n",This,pmkObjectName);
473
474 hr = reduce_moniker(pmkObjectName, NULL, &pmkObjectName);
475 if (FAILED(hr))
476 return hr;
478 IMoniker_Release(pmkObjectName);
479 if (hr != S_OK)
480 return hr;
481
482 hr = S_FALSE;
484 LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, const struct rot_entry, entry)
485 {
488 {
489 hr = S_OK;
490 break;
491 }
492 }
494
495 if (hr == S_FALSE)
497
499
500 return hr;
501}
502
503/***********************************************************************
504 * RunningObjectTable_GetObject
505 *
506 * PARAMS
507 * pmkObjectName [in] Pointer to the moniker on the object
508 * ppunkObject [out] variable that receives the IUnknown interface pointer
509 */
510static HRESULT WINAPI
512 IMoniker *pmkObjectName, IUnknown **ppunkObject)
513{
516 InterfaceData *object = NULL;
517 IrotCookie cookie;
518 HRESULT hr;
519 struct rot_entry *rot_entry;
520
521 TRACE("(%p,%p,%p)\n",This,pmkObjectName,ppunkObject);
522
523 if (ppunkObject == NULL)
524 return E_POINTER;
525
526 *ppunkObject = NULL;
527
528 hr = reduce_moniker(pmkObjectName, NULL, &pmkObjectName);
529 if (FAILED(hr))
530 return hr;
532 IMoniker_Release(pmkObjectName);
533 if (hr != S_OK)
534 return hr;
535
538 {
541 {
542 IStream *pStream;
545
546 if (hr == S_OK)
547 {
548 hr = CoUnmarshalInterface(pStream, &IID_IUnknown, (void **)ppunkObject);
549 IStream_Release(pStream);
550 }
551
553
554 return hr;
555 }
556 }
558
559 TRACE("moniker unavailable locally, calling SCM\n");
560
562 if (SUCCEEDED(hr))
563 {
564 IStream *pStream;
565 hr = create_stream_on_mip_ro(object, &pStream);
566 if (hr == S_OK)
567 {
568 hr = CoUnmarshalInterface(pStream, &IID_IUnknown, (void **)ppunkObject);
569 IStream_Release(pStream);
570 }
571 }
572 else
573 WARN("Moniker unavailable, IrotGetObject returned %#lx\n", hr);
574
576
577 return hr;
578}
579
580/***********************************************************************
581 * RunningObjectTable_NoteChangeTime
582 *
583 * PARAMS
584 * dwRegister [in] Value identifying registration being updated
585 * pfiletime [in] Pointer to structure containing object's last change time
586 */
587static HRESULT WINAPI
589 DWORD dwRegister, FILETIME *pfiletime)
590{
592 struct rot_entry *rot_entry;
594
595 TRACE("%p, %ld, %p.\n", iface, dwRegister, pfiletime);
596
599 {
600 if (rot_entry->cookie == dwRegister)
601 {
602 rot_entry->last_modified = *pfiletime;
604
605 hr = InternalIrotNoteChangeTime(dwRegister, pfiletime);
606
607 goto done;
608 }
609 }
611
612done:
613 TRACE("-- %#lx\n", hr);
614 return hr;
615}
616
617/***********************************************************************
618 * RunningObjectTable_GetTimeOfLastChange
619 *
620 * PARAMS
621 * pmkObjectName [in] moniker of the object whose status is desired
622 * pfiletime [out] structure that receives object's last change time
623 */
624static HRESULT WINAPI
626 IMoniker *pmkObjectName, FILETIME *pfiletime)
627{
631 const struct rot_entry *rot_entry;
632
633 TRACE("(%p,%p,%p)\n",This,pmkObjectName,pfiletime);
634
635 if (pmkObjectName==NULL || pfiletime==NULL)
636 return E_INVALIDARG;
637
638 hr = reduce_moniker(pmkObjectName, NULL, &pmkObjectName);
639 if (FAILED(hr))
640 return hr;
642 IMoniker_Release(pmkObjectName);
643 if (hr != S_OK)
644 return hr;
645
647
649 LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, const struct rot_entry, entry)
650 {
653 {
654 *pfiletime = rot_entry->last_modified;
655 hr = S_OK;
656 break;
657 }
658 }
660
661 if (hr != S_OK)
663
665
666 TRACE("-- %#lx\n", hr);
667 return hr;
668}
669
670/***********************************************************************
671 * RunningObjectTable_EnumRunning
672 *
673 * PARAMS
674 * ppenumMoniker [out] receives the IEnumMoniker interface pointer
675 */
676static HRESULT WINAPI
678 IEnumMoniker **ppenumMoniker)
679{
682 HRESULT hr;
683
684 TRACE("(%p, %p)\n", This, ppenumMoniker);
685
686 *ppenumMoniker = NULL;
687
689 if (SUCCEEDED(hr))
691
692 return hr;
693}
694
695/* Virtual function table for the IRunningObjectTable class. */
696static const IRunningObjectTableVtbl VT_RunningObjectTableImpl =
697{
708};
709
711
713{
714 0, 0, &rot.lock,
716 0, 0, { (DWORD_PTR)(__FILE__ ": RunningObjectTable_section") }
717};
718
720{
722 .lock = { &critsect_debug, -1, 0, 0, 0, 0 },
723 .rot = LIST_INIT(rot.rot),
724};
725
726/***********************************************************************
727 * GetRunningObjectTable (OLE32.@)
728 */
730{
731 TRACE("%#lx, %p\n", reserved, ret);
732
733 if (reserved!=0)
734 return E_UNEXPECTED;
735
737 return CO_E_NOTINITIALIZED;
738
740 IRunningObjectTable_AddRef(*ret);
741
742 return S_OK;
743}
744
745/***********************************************************************
746 * DestroyRunningObjectTable (ole32.@)
747*/
749{
750 struct rot_entry *rot_entry, *cursor2;
751
752 TRACE("\n");
753
756 {
759 }
761}
762
764 LPCOLESTR szDisplayName,
765 LPDWORD pchEaten,
766 LPMONIKER *ppmk)
767{
768 CLSID clsid;
769 HRESULT hr;
771 LPCWSTR start = szDisplayName;
772 LPCWSTR end;
773 int len;
774 IMoniker *class_moniker;
775
776 if (*start == '@')
777 start++;
778
779 /* find end delimiter */
780 for (end = start; *end; end++)
781 if (*end == ':')
782 break;
783
784 len = end - start;
785
786 /* must start with '@' or have a ':' somewhere and mustn't be one character
787 * long (since that looks like an absolute path) */
788 if (((start == szDisplayName) && (*end == '\0')) || (len <= 1))
789 return MK_E_SYNTAX;
790
791 progid = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
792 if (progid)
793 {
794 memcpy(progid, start, len * sizeof(WCHAR));
795 progid[len] = '\0';
796 }
799 if (FAILED(hr))
800 return MK_E_SYNTAX;
801
802 hr = CreateClassMoniker(&clsid, &class_moniker);
803 if (SUCCEEDED(hr))
804 {
806 hr = IMoniker_BindToObject(class_moniker, pbc, NULL,
807 &IID_IParseDisplayName, (void **)&pdn);
808 /* fallback to using IClassFactory to get IParseDisplayName -
809 * adsldp.dll depends on this */
810 if (FAILED(hr))
811 {
812 IClassFactory *pcf;
813 hr = IMoniker_BindToObject(class_moniker, pbc, NULL,
814 &IID_IClassFactory, (void **)&pcf);
815 if (SUCCEEDED(hr))
816 {
817 hr = IClassFactory_CreateInstance(pcf, NULL,
819 (void **)&pdn);
820 IClassFactory_Release(pcf);
821 }
822 }
823 IMoniker_Release(class_moniker);
824 if (SUCCEEDED(hr))
825 {
826 hr = IParseDisplayName_ParseDisplayName(pdn, pbc,
827 (LPOLESTR)szDisplayName,
828 pchEaten, ppmk);
829 IParseDisplayName_Release(pdn);
830 }
831 }
832 return hr;
833}
834
835/******************************************************************************
836 * MkParseDisplayName [OLE32.@]
837 */
838HRESULT WINAPI MkParseDisplayName(LPBC pbc, LPCOLESTR szDisplayName,
839 LPDWORD pchEaten, LPMONIKER *ppmk)
840{
843 DWORD chEaten;
844
845 TRACE("(%p, %s, %p, %p)\n", pbc, debugstr_w(szDisplayName), pchEaten, ppmk);
846
847 if (!pbc || !IsValidInterface((LPUNKNOWN) pbc))
848 return E_INVALIDARG;
849
850 if (!szDisplayName || !*szDisplayName)
851 return E_INVALIDARG;
852
853 if (!pchEaten || !ppmk)
854 return E_INVALIDARG;
855
856 *pchEaten = 0;
857 *ppmk = NULL;
858
859 if (!wcsnicmp(szDisplayName, L"clsid:", 6))
860 {
861 hr = ClassMoniker_CreateFromDisplayName(pbc, szDisplayName, &chEaten, &moniker);
862 if (FAILED(hr) && (hr != MK_E_SYNTAX))
863 return hr;
864 }
865 else
866 {
867 hr = get_moniker_for_progid_display_name(pbc, szDisplayName, &chEaten, &moniker);
868 if (FAILED(hr) && (hr != MK_E_SYNTAX))
869 return hr;
870 }
871
872 if (FAILED(hr))
873 {
874 hr = FileMoniker_CreateFromDisplayName(pbc, szDisplayName, &chEaten, &moniker);
875 if (FAILED(hr) && (hr != MK_E_SYNTAX))
876 return hr;
877 }
878
879 if (SUCCEEDED(hr))
880 {
881 while (TRUE)
882 {
883 IMoniker *next_moniker;
884 *pchEaten += chEaten;
885 szDisplayName += chEaten;
886 if (!*szDisplayName)
887 {
888 *ppmk = moniker;
889 return S_OK;
890 }
891 chEaten = 0;
892 hr = IMoniker_ParseDisplayName(moniker, pbc, NULL,
893 (LPOLESTR)szDisplayName, &chEaten,
894 &next_moniker);
895 IMoniker_Release(moniker);
896 if (FAILED(hr))
897 {
898 *pchEaten = 0;
899 break;
900 }
901 moniker = next_moniker;
902 }
903 }
904
905 return hr;
906}
907
908/***********************************************************************
909 * GetClassFile (OLE32.@)
910 *
911 * Retrieves the class ID associated with the given filename.
912 *
913 * PARAMS
914 * filePathName [I] Filename to retrieve the class ID for.
915 * pclsid [O] Address that receives the class ID for the file.
916 *
917 * RETURNS
918 * Success: S_OK.
919 * Failure: Any HRESULT code.
920 */
921HRESULT WINAPI GetClassFile(LPCOLESTR filePathName,CLSID *pclsid)
922{
923 IStorage *pstg=0;
924 HRESULT res;
925 LONG sizeProgId, ret;
926 LPOLESTR progId=0;
927 const WCHAR *extension;
928
929 TRACE("%s, %p\n", debugstr_w(filePathName), pclsid);
930
931 /* if the file contain a storage object the return the CLSID written by IStorage_SetClass method*/
932 if((StgIsStorageFile(filePathName))==S_OK){
933
935
936 if (SUCCEEDED(res)) {
937 res=ReadClassStg(pstg,pclsid);
938 IStorage_Release(pstg);
939 }
940
941 return res;
942 }
943 /* If the file is not a storage object then attempt to match various bits in the file against a
944 pattern in the registry. This case is not frequently used, so I present only the pseudocode for
945 this case.
946
947 for(i=0;i<nFileTypes;i++)
948
949 for(i=0;j<nPatternsForType;j++){
950
951 PATTERN pat;
952 HANDLE hFile;
953
954 pat=ReadPatternFromRegistry(i,j);
955 hFile=CreateFileW(filePathName,,,,,,hFile);
956 SetFilePosition(hFile,pat.offset);
957 ReadFile(hFile,buf,pat.size,&r,NULL);
958 if (memcmp(buf&pat.mask,pat.pattern.pat.size)==0){
959
960 *pclsid=ReadCLSIDFromRegistry(i);
961 return S_OK;
962 }
963 }
964 */
965
966 /* if the above strategies fail then search for the extension key in the registry */
967
968 res = PathCchFindExtension(filePathName, PATHCCH_MAX_CCH, &extension);
969 if (FAILED(res) || !extension || !*extension || !wcscmp(extension, L"."))
971
972 ret = RegQueryValueW(HKEY_CLASSES_ROOT, extension, NULL, &sizeProgId);
973 if (!ret) {
974 /* get the progId associated to the extension */
975 progId = CoTaskMemAlloc(sizeProgId);
976 ret = RegQueryValueW(HKEY_CLASSES_ROOT, extension, progId, &sizeProgId);
977 if (!ret)
978 /* return the clsid associated to the progId */
979 res = CLSIDFromProgID(progId, pclsid);
980 else
982 CoTaskMemFree(progId);
983 }
984 else
986
987 return res != S_OK ? MK_E_INVALIDEXTENSION : res;
988}
989
990/***********************************************************************
991 * EnumMoniker_QueryInterface
992 */
994{
996
997 TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppvObject);
998
999 /* validate arguments */
1000 if (ppvObject == NULL)
1001 return E_INVALIDARG;
1002
1003 *ppvObject = NULL;
1004
1006 *ppvObject = &This->IEnumMoniker_iface;
1007 else
1008 return E_NOINTERFACE;
1009
1010 IEnumMoniker_AddRef(iface);
1011 return S_OK;
1012}
1013
1014/***********************************************************************
1015 * EnumMoniker_AddRef
1016 */
1018{
1020
1021 TRACE("(%p)\n",This);
1022
1023 return InterlockedIncrement(&This->ref);
1024}
1025
1026/***********************************************************************
1027 * EnumMoniker_release
1028 */
1030{
1032 ULONG ref;
1033
1034 TRACE("(%p)\n",This);
1035
1036 ref = InterlockedDecrement(&This->ref);
1037
1038 /* uninitialize ROT structure if there are no more references to it */
1039 if (ref == 0)
1040 {
1041 ULONG i;
1042
1043 TRACE("(%p) Deleting\n",This);
1044
1045 for (i = 0; i < This->moniker_list->size; i++)
1046 free(This->moniker_list->interfaces[i]);
1047 free(This->moniker_list);
1049 }
1050
1051 return ref;
1052}
1053/***********************************************************************
1054 * EnumMoniker_Next
1055 */
1056static HRESULT WINAPI EnumMonikerImpl_Next(IEnumMoniker* iface, ULONG celt, IMoniker** rgelt, ULONG * pceltFetched)
1057{
1058 ULONG i;
1060 HRESULT hr = S_OK;
1061
1062 TRACE("%p, %lu, %p, %p.\n", iface, celt, rgelt, pceltFetched);
1063
1064 /* retrieve the requested number of moniker from the current position */
1065 for(i = 0; (This->pos < This->moniker_list->size) && (i < celt); i++)
1066 {
1067 IStream *stream;
1068 hr = create_stream_on_mip_ro(This->moniker_list->interfaces[This->pos++], &stream);
1069 if (hr != S_OK) break;
1070 hr = CoUnmarshalInterface(stream, &IID_IMoniker, (void **)&rgelt[i]);
1071 IStream_Release(stream);
1072 if (hr != S_OK) break;
1073 }
1074
1075 if (pceltFetched != NULL)
1076 *pceltFetched= i;
1077
1078 if (hr != S_OK)
1079 return hr;
1080
1081 if (i == celt)
1082 return S_OK;
1083 else
1084 return S_FALSE;
1085
1086}
1087
1088/***********************************************************************
1089 * EnumMoniker_Skip
1090 */
1092{
1094
1095 TRACE("(%p)\n",This);
1096
1097 if (This->pos + celt >= This->moniker_list->size)
1098 return S_FALSE;
1099
1100 This->pos += celt;
1101
1102 return S_OK;
1103}
1104
1105/***********************************************************************
1106 * EnumMoniker_Reset
1107 */
1109{
1111
1112 This->pos = 0; /* set back to start of list */
1113
1114 TRACE("(%p)\n",This);
1115
1116 return S_OK;
1117}
1118
1119/***********************************************************************
1120 * EnumMoniker_Clone
1121 */
1123{
1125 InterfaceList *moniker_list;
1126 ULONG i;
1127
1128 TRACE("(%p)\n",This);
1129
1130 *ppenum = NULL;
1131
1132 moniker_list = malloc(FIELD_OFFSET(InterfaceList, interfaces[This->moniker_list->size]));
1133 if (!moniker_list)
1134 return E_OUTOFMEMORY;
1135
1136 moniker_list->size = This->moniker_list->size;
1137 for (i = 0; i < This->moniker_list->size; i++)
1138 {
1139 SIZE_T size = FIELD_OFFSET(InterfaceData, abData[This->moniker_list->interfaces[i]->ulCntData]);
1140 moniker_list->interfaces[i] = malloc(size);
1141 if (!moniker_list->interfaces[i])
1142 {
1143 ULONG end = i;
1144 for (i = 0; i < end; i++)
1145 free(moniker_list->interfaces[i]);
1146 free(moniker_list);
1147 return E_OUTOFMEMORY;
1148 }
1149 memcpy(moniker_list->interfaces[i], This->moniker_list->interfaces[i], size);
1150 }
1151
1152 /* copy the enum structure */
1153 return EnumMonikerImpl_CreateEnumROTMoniker(moniker_list, This->pos, ppenum);
1154}
1155
1156/* Virtual function table for the IEnumMoniker class. */
1157static const IEnumMonikerVtbl VT_EnumMonikerImpl =
1158{
1166};
1167
1168/***********************************************************************
1169 * EnumMonikerImpl_CreateEnumROTMoniker
1170 * Used by EnumRunning to create the structure and EnumClone
1171 * to copy the structure
1172 */
1174 ULONG current_pos,
1175 IEnumMoniker **ppenumMoniker)
1176{
1178
1179 if (!ppenumMoniker)
1180 return E_INVALIDARG;
1181
1183 if (!This) return E_OUTOFMEMORY;
1184
1185 TRACE("(%p)\n", This);
1186
1187 /* initialize the virtual table function */
1188 This->IEnumMoniker_iface.lpVtbl = &VT_EnumMonikerImpl;
1189
1190 /* the initial reference is set to "1" */
1191 This->ref = 1; /* set the ref count to one */
1192 This->pos = current_pos; /* Set the list start posn */
1193 This->moniker_list = moniker_list;
1194
1195 *ppenumMoniker = &This->IEnumMoniker_iface;
1196
1197 return S_OK;
1198}
1199
1200
1201/* Shared implementation of moniker marshaler based on saving and loading of
1202 * monikers */
1203
1204typedef struct MonikerMarshal
1205{
1208
1212
1214{
1215 return CONTAINING_RECORD(iface, MonikerMarshal, IUnknown_iface);
1216}
1217
1219{
1220 return CONTAINING_RECORD(iface, MonikerMarshal, IMarshal_iface);
1221}
1222
1224{
1226 TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
1227 *ppv = NULL;
1228 if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IMarshal, riid))
1229 {
1230 *ppv = &This->IMarshal_iface;
1231 IMarshal_AddRef(&This->IMarshal_iface);
1232 return S_OK;
1233 }
1234 FIXME("No interface for %s\n", debugstr_guid(riid));
1235 return E_NOINTERFACE;
1236}
1237
1239{
1241 return InterlockedIncrement(&This->ref);
1242}
1243
1245{
1248
1249 if (!ref) HeapFree(GetProcessHeap(), 0, This);
1250 return ref;
1251}
1252
1253static const IUnknownVtbl VT_MonikerMarshalInner =
1254{
1258};
1259
1261{
1263 return IMoniker_QueryInterface(This->moniker, riid, ppv);
1264}
1265
1267{
1269 return IMoniker_AddRef(This->moniker);
1270}
1271
1273{
1275 return IMoniker_Release(This->moniker);
1276}
1277
1279 LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
1280 void* pvDestContext, DWORD mshlflags, CLSID* pCid)
1281{
1283
1284 TRACE("%s, %p, %lx, %p, %lx, %p.\n", debugstr_guid(riid), pv,
1285 dwDestContext, pvDestContext, mshlflags, pCid);
1286
1287 return IMoniker_GetClassID(This->moniker, pCid);
1288}
1289
1291 LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
1292 void* pvDestContext, DWORD mshlflags, DWORD* pSize)
1293{
1295 HRESULT hr;
1297
1298 TRACE("%s, %p, %lx, %p, %lx, %p.\n", debugstr_guid(riid), pv,
1299 dwDestContext, pvDestContext, mshlflags, pSize);
1300
1301 hr = IMoniker_GetSizeMax(This->moniker, &size);
1302 if (hr == S_OK)
1303 *pSize = (DWORD)size.QuadPart;
1304 return hr;
1305}
1306
1308 REFIID riid, void* pv, DWORD dwDestContext,
1309 void* pvDestContext, DWORD mshlflags)
1310{
1312
1313 TRACE("%p, %s, %p, %lx, %p, %lx.\n", pStm, debugstr_guid(riid), pv,
1314 dwDestContext, pvDestContext, mshlflags);
1315
1316 return IMoniker_Save(This->moniker, pStm, FALSE);
1317}
1318
1320{
1322 HRESULT hr;
1323
1324 TRACE("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv);
1325
1326 hr = IMoniker_Load(This->moniker, pStm);
1327 if (hr == S_OK)
1328 hr = IMoniker_QueryInterface(This->moniker, riid, ppv);
1329 return hr;
1330}
1331
1333{
1334 TRACE("()\n");
1335 /* can't release a state-based marshal as nothing on server side to
1336 * release */
1337 return S_OK;
1338}
1339
1341{
1342 TRACE("()\n");
1343 /* can't disconnect a state-based marshal as nothing on server side to
1344 * disconnect from */
1345 return S_OK;
1346}
1347
1348static const IMarshalVtbl VT_MonikerMarshal =
1349{
1359};
1360
1362{
1363 MonikerMarshal *This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
1364 if (!This) return E_OUTOFMEMORY;
1365
1366 This->IUnknown_iface.lpVtbl = &VT_MonikerMarshalInner;
1367 This->IMarshal_iface.lpVtbl = &VT_MonikerMarshal;
1368 This->ref = 1;
1369 This->moniker = inner;
1370
1371 *outer = &This->IUnknown_iface;
1372 return S_OK;
1373}
1374
1376{
1377 return malloc(size);
1378}
1379
1381{
1382 free(p);
1383}
#define CO_E_NOTINITIALIZED
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
const GUID IID_IClassFactory
Definition: list.h:37
HRESULT ClassMoniker_CreateFromDisplayName(LPBC pbc, const WCHAR *display_name, DWORD *eaten, IMoniker **moniker)
Definition: classmoniker.c:634
HRESULT WINAPI CreateClassMoniker(REFCLSID rclsid, IMoniker **moniker)
Definition: classmoniker.c:627
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
static LPVOID LPUNKNOWN
Definition: dinput.c:53
static struct regsvr_interface const interface_list[]
Definition: regsvr.c:477
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LSTATUS WINAPI RegQueryValueW(HKEY hkey, LPCWSTR name, LPWSTR data, LPLONG count)
Definition: reg.c:4241
HRESULT WINAPI DECLSPEC_HOTPATCH CLSIDFromProgID(LPCOLESTR progid, CLSID *clsid)
Definition: combase.c:1437
HRESULT WINAPI CoFileTimeNow(FILETIME *filetime)
Definition: combase.c:1007
HRESULT WINAPI GetHGlobalFromStream(IStream *stream, HGLOBAL *phglobal)
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL delete_on_release, IStream **stream)
HRESULT WINAPI CoMarshalInterface(IStream *stream, REFIID riid, IUnknown *unk, DWORD dest_context, void *pvDestContext, DWORD mshlFlags)
Definition: marshal.c:483
HRESULT WINAPI CoReleaseMarshalData(IStream *stream)
Definition: marshal.c:673
HRESULT WINAPI CoUnmarshalInterface(IStream *stream, REFIID riid, void **ppv)
Definition: marshal.c:793
HRESULT WINAPI ReadClassStg(IStorage *pstg, CLSID *pclsid)
Definition: storage32.c:72
HRESULT WINAPI StgIsStorageFile(LPCOLESTR fn)
Definition: storage32.c:191
#define GetProcessHeap()
Definition: compat.h:736
#define wcsnicmp
Definition: compat.h:14
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrlenW
Definition: compat.h:750
HRESULT WINAPI PathCchFindExtension(const WCHAR *path, SIZE_T size, const WCHAR **extension)
Definition: path.c:730
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
static HRESULT WINAPI MonikerMarshal_MarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags)
Definition: moniker.c:1307
static HRESULT WINAPI RunningObjectTableImpl_QueryInterface(IRunningObjectTable *iface, REFIID riid, void **ppvObject)
Definition: moniker.c:231
HRESULT WINAPI GetClassFile(LPCOLESTR filePathName, CLSID *pclsid)
Definition: moniker.c:921
static HRESULT WINAPI MonikerMarshal_DisconnectObject(LPMARSHAL iface, DWORD dwReserved)
Definition: moniker.c:1340
HRESULT WINAPI InternalIrotEnumRunning(PInterfaceList *list)
Definition: rpc.c:353
HRESULT WINAPI InternalIrotGetObject(const MonikerComparisonData *moniker_data, PInterfaceData *obj, IrotCookie *cookie)
Definition: rpc.c:331
HRESULT WINAPI GetRunningObjectTable(DWORD reserved, IRunningObjectTable **ret)
Definition: moniker.c:729
static HRESULT WINAPI RunningObjectTableImpl_GetObject(IRunningObjectTable *iface, IMoniker *pmkObjectName, IUnknown **ppunkObject)
Definition: moniker.c:511
static HRESULT WINAPI EnumMonikerImpl_Reset(IEnumMoniker *iface)
Definition: moniker.c:1108
static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MonikerComparisonData **moniker_data)
Definition: moniker.c:144
static HRESULT WINAPI MonikerMarshalInner_QueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppv)
Definition: moniker.c:1223
static HRESULT reduce_moniker(IMoniker *pmk, IBindCtx *pbc, IMoniker **pmkReduced)
Definition: moniker.c:209
static EnumMonikerImpl * impl_from_IEnumMoniker(IEnumMoniker *iface)
Definition: moniker.c:87
static ULONG WINAPI EnumMonikerImpl_Release(IEnumMoniker *iface)
Definition: moniker.c:1029
static HRESULT WINAPI EnumMonikerImpl_Clone(IEnumMoniker *iface, IEnumMoniker **ppenum)
Definition: moniker.c:1122
void WINAPI DestroyRunningObjectTable(void)
Definition: moniker.c:748
HRESULT WINAPI MkParseDisplayName(LPBC pbc, LPCOLESTR szDisplayName, LPDWORD pchEaten, LPMONIKER *ppmk)
Definition: moniker.c:838
static void rot_entry_delete(struct rot_entry *rot_entry)
Definition: moniker.c:105
static HRESULT WINAPI EnumMonikerImpl_Skip(IEnumMoniker *iface, ULONG celt)
Definition: moniker.c:1091
static HRESULT get_moniker_for_progid_display_name(LPBC pbc, LPCOLESTR szDisplayName, LPDWORD pchEaten, LPMONIKER *ppmk)
Definition: moniker.c:763
static HRESULT WINAPI MonikerMarshal_GetMarshalSizeMax(LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD *pSize)
Definition: moniker.c:1290
void *__RPC_USER MIDL_user_allocate(SIZE_T size)
Definition: moniker.c:1375
static HRESULT WINAPI RunningObjectTableImpl_EnumRunning(IRunningObjectTable *iface, IEnumMoniker **ppenumMoniker)
Definition: moniker.c:677
static ULONG WINAPI MonikerMarshal_AddRef(IMarshal *iface)
Definition: moniker.c:1266
HRESULT MonikerMarshal_Create(IMoniker *inner, IUnknown **outer)
Definition: moniker.c:1361
static ULONG WINAPI MonikerMarshalInner_Release(IUnknown *iface)
Definition: moniker.c:1244
static RTL_CRITICAL_SECTION_DEBUG critsect_debug
Definition: moniker.c:712
static HRESULT WINAPI RunningObjectTableImpl_Revoke(IRunningObjectTable *iface, DWORD dwRegister)
Definition: moniker.c:434
static HRESULT EnumMonikerImpl_CreateEnumROTMoniker(InterfaceList *moniker_list, ULONG pos, IEnumMoniker **ppenumMoniker)
Definition: moniker.c:1173
static HRESULT create_stream_on_mip_ro(const InterfaceData *mip, IStream **stream)
Definition: moniker.c:96
static HRESULT WINAPI RunningObjectTableImpl_Register(IRunningObjectTable *iface, DWORD flags, IUnknown *punkObject, IMoniker *pmkObjectName, DWORD *pdwRegister)
Definition: moniker.c:281
static MonikerMarshal * impl_from_IUnknown(IUnknown *iface)
Definition: moniker.c:1213
static MonikerMarshal * impl_from_IMarshal(IMarshal *iface)
Definition: moniker.c:1218
static const IUnknownVtbl VT_MonikerMarshalInner
Definition: moniker.c:1253
HRESULT WINAPI InternalIrotNoteChangeTime(IrotCookie cookie, const FILETIME *time)
Definition: rpc.c:339
static RunningObjectTableImpl * impl_from_IRunningObjectTable(IRunningObjectTable *iface)
Definition: moniker.c:82
HRESULT WINAPI InternalIrotIsRunning(const MonikerComparisonData *moniker_data)
Definition: rpc.c:324
HRESULT WINAPI InternalIrotGetTimeOfLastChange(const MonikerComparisonData *moniker_data, FILETIME *time)
Definition: rpc.c:346
static HRESULT WINAPI MonikerMarshal_GetUnmarshalClass(LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *pCid)
Definition: moniker.c:1278
static HRESULT WINAPI MonikerMarshal_QueryInterface(IMarshal *iface, REFIID riid, LPVOID *ppv)
Definition: moniker.c:1260
static ULONG WINAPI MonikerMarshalInner_AddRef(IUnknown *iface)
Definition: moniker.c:1238
static ULONG WINAPI MonikerMarshal_Release(IMarshal *iface)
Definition: moniker.c:1272
static HRESULT WINAPI EnumMonikerImpl_Next(IEnumMoniker *iface, ULONG celt, IMoniker **rgelt, ULONG *pceltFetched)
Definition: moniker.c:1056
static ULONG WINAPI RunningObjectTableImpl_Release(IRunningObjectTable *iface)
Definition: moniker.c:264
static HRESULT WINAPI RunningObjectTableImpl_NoteChangeTime(IRunningObjectTable *iface, DWORD dwRegister, FILETIME *pfiletime)
Definition: moniker.c:588
static ULONG WINAPI EnumMonikerImpl_AddRef(IEnumMoniker *iface)
Definition: moniker.c:1017
BOOL WINAPI InternalIsProcessInitialized(void)
Definition: combase.c:391
static HRESULT WINAPI EnumMonikerImpl_QueryInterface(IEnumMoniker *iface, REFIID riid, void **ppvObject)
Definition: moniker.c:993
HRESULT WINAPI InternalIrotRegister(const MonikerComparisonData *moniker_data, const InterfaceData *object, const InterfaceData *moniker, const FILETIME *time, DWORD flags, IrotCookie *cookie, IrotContextHandle *ctxt_handle)
Definition: rpc.c:315
static RunningObjectTableImpl rot
Definition: moniker.c:710
static ULONG WINAPI RunningObjectTableImpl_AddRef(IRunningObjectTable *iface)
Definition: moniker.c:257
static HRESULT WINAPI MonikerMarshal_ReleaseMarshalData(LPMARSHAL iface, IStream *pStm)
Definition: moniker.c:1332
static HRESULT WINAPI RunningObjectTableImpl_GetTimeOfLastChange(IRunningObjectTable *iface, IMoniker *pmkObjectName, FILETIME *pfiletime)
Definition: moniker.c:625
static HRESULT WINAPI RunningObjectTableImpl_IsRunning(IRunningObjectTable *iface, IMoniker *pmkObjectName)
Definition: moniker.c:465
void __RPC_USER MIDL_user_free(void *p)
Definition: moniker.c:1380
static HRESULT WINAPI MonikerMarshal_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, void **ppv)
Definition: moniker.c:1319
static const IRunningObjectTableVtbl VT_RunningObjectTableImpl
Definition: moniker.c:696
static const IMarshalVtbl VT_MonikerMarshal
Definition: moniker.c:1348
static const IEnumMonikerVtbl VT_EnumMonikerImpl
Definition: moniker.c:1157
HRESULT WINAPI InternalIrotRevoke(IrotCookie cookie, IrotContextHandle *ctxt_handle, PInterfaceData *object, PInterfaceData *moniker)
Definition: rpc.c:360
HRESULT WINAPI StgOpenStorage(const OLECHAR *pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstgOpen)
Definition: storage32.c:8701
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
r reserved
Definition: btrfs.c:3006
#define progid(str)
Definition: exdisp.idl:31
HRESULT FileMoniker_CreateFromDisplayName(LPBC pbc, LPCOLESTR szDisplayName, LPDWORD pchEaten, IMoniker **ppmk)
Definition: filemoniker.c:1396
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
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
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
uint32_t entry
Definition: isohybrid.c:63
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
__u16 time
Definition: mkdosfs.c:8
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static IUnknown * outer
Definition: compobj.c:82
static BSTR *static LPOLESTR
Definition: varformat.c:44
const CLSID * clsid
Definition: msctf.cpp:50
IID CLSID
Definition: mstsclib_i.c:62
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
#define DWORD
Definition: nt_native.h:44
#define STGM_SHARE_DENY_WRITE
Definition: objbase.h:939
#define STGM_READ
Definition: objbase.h:934
interface IMoniker * LPMONIKER
Definition: objfwd.h:9
interface IBindCtx * LPBC
Definition: objfwd.h:18
interface IMarshal * LPMARSHAL
Definition: objfwd.h:11
HRESULT WINAPI CreateBindCtx(DWORD reserved, IBindCtx **bind_context)
Definition: bindctx.c:491
BOOL WINAPI IsValidInterface(LPUNKNOWN punk)
Definition: ole32_main.c:172
const GUID IID_IParseDisplayName
const GUID IID_IEnumMoniker
#define PATHCCH_MAX_CCH
Definition: pathcch.h:52
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define __RPC_USER
Definition: rpc.h:61
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
IEnumMoniker IEnumMoniker_iface
Definition: mediacatenum.c:36
InterfaceList * moniker_list
Definition: moniker.c:78
IMarshal IMarshal_iface
Definition: moniker.c:1207
IUnknown IUnknown_iface
Definition: moniker.c:1206
IMoniker * moniker
Definition: moniker.c:1210
struct list rot
Definition: moniker.c:68
IRunningObjectTable IRunningObjectTable_iface
Definition: moniker.c:67
CRITICAL_SECTION lock
Definition: moniker.c:69
Definition: cookie.c:34
Definition: main.c:40
Definition: send.c:48
Definition: irotp.c:37
IrotContextHandle ctxt_handle
Definition: moniker.c:61
struct list entry
Definition: irotp.c:38
InterfaceData * object
Definition: irotp.c:39
MonikerComparisonData * moniker_data
Definition: irotp.c:41
DWORD cookie
Definition: irotp.c:42
InterfaceData * moniker
Definition: irotp.c:40
FILETIME last_modified
Definition: irotp.c:43
Definition: parse.h:23
#define LIST_INIT(head)
Definition: queue.h:197
#define DWORD_PTR
Definition: treelist.c:76
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
_In_ PUSBD_INTERFACE_LIST_ENTRY InterfaceList
Definition: usbdlib.h:181
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define MK_E_UNAVAILABLE
Definition: winerror.h:3894
#define E_NOINTERFACE
Definition: winerror.h:3479
#define MK_E_SYNTAX
Definition: winerror.h:3896
#define E_UNEXPECTED
Definition: winerror.h:3528
#define E_POINTER
Definition: winerror.h:3480
#define MK_E_INVALIDEXTENSION
Definition: winerror.h:3900
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184