ReactOS 0.4.17-dev-573-g8315b8c
binding.c
Go to the documentation of this file.
1/*
2 * Copyright 2005-2007 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "urlmon_main.h"
20#include "winreg.h"
21#include "shlwapi.h"
22
23#include "wine/debug.h"
24
26
27static WCHAR cbinding_contextW[] = L"CBinding Context";
28static WCHAR bscb_holderW[] = L"_BSCB_Holder_";
29
30typedef struct {
32
34
36
39
42
44
45typedef struct {
46 void (*release)(stgmed_obj_t*);
47 HRESULT (*fill_stgmed)(stgmed_obj_t*,STGMEDIUM*);
48 HRESULT (*get_result)(stgmed_obj_t*,DWORD,void**);
50
53};
54
55typedef enum {
60
61#define BINDING_LOCKED 0x0001
62#define BINDING_STOPPED 0x0002
63#define BINDING_OBJAVAIL 0x0004
64#define BINDING_ABORTED 0x0008
65
66typedef struct {
67 IBinding IBinding_iface;
72
73 LONG ref;
74
77
79
82
83 BINDINFO bindinfo;
101
103} Binding;
104
105static void read_protocol_data(stgmed_buf_t *stgmed_buf)
106{
107 BYTE buf[8192];
108 DWORD read;
110
111 do hres = IInternetProtocolEx_Read(stgmed_buf->protocol, buf, sizeof(buf), &read);
112 while(hres == S_OK);
113}
114
115static void dump_BINDINFO(BINDINFO *bi)
116{
117 static const char * const BINDINFOF_str[] = {
118 "#0",
119 "BINDINFOF_URLENCODESTGMEDDATA",
120 "BINDINFOF_URLENCODEDEXTRAINFO"
121 };
122
123 static const char * const BINDVERB_str[] = {
124 "BINDVERB_GET",
125 "BINDVERB_POST",
126 "BINDVERB_PUT",
127 "BINDVERB_CUSTOM"
128 };
129
130 TRACE("\n"
131 "BINDINFO = {\n"
132 " %ld, %s,\n"
133 " {%ld, %p, %p},\n"
134 " %s,\n"
135 " %s,\n"
136 " %s,\n"
137 " %ld, %08lx, %ld, %ld\n"
138 " {%ld %p %x},\n"
139 " %s\n"
140 " %p, %ld\n"
141 "}\n",
142
143 bi->cbSize, debugstr_w(bi->szExtraInfo),
144 bi->stgmedData.tymed, bi->stgmedData.hGlobal, bi->stgmedData.pUnkForRelease,
145 bi->grfBindInfoF > BINDINFOF_URLENCODEDEXTRAINFO
146 ? "unknown" : BINDINFOF_str[bi->grfBindInfoF],
147 bi->dwBindVerb > BINDVERB_CUSTOM
148 ? "unknown" : BINDVERB_str[bi->dwBindVerb],
149 debugstr_w(bi->szCustomVerb),
150 bi->cbstgmedData, bi->dwOptions, bi->dwOptionsFlags, bi->dwCodePage,
151 bi->securityAttributes.nLength,
152 bi->securityAttributes.lpSecurityDescriptor,
153 bi->securityAttributes.bInheritHandle,
154 debugstr_guid(&bi->iid),
155 bi->pUnk, bi->dwReserved
156 );
157}
158
160{
161 free(This->mime);
162 This->mime = wcsdup(mime);
163
164 if(!This->mime || !This->report_mime)
165 return;
166
167 IBindStatusCallback_OnProgress(This->callback, 0, 0, BINDSTATUS_MIMETYPEAVAILABLE, This->mime);
168
169 This->clipboard_format = RegisterClipboardFormatW(This->mime);
170}
171
173{
174 if(binding->state & BINDING_LOCKED) {
175 IInternetProtocolEx_UnlockRequest(&binding->protocol->IInternetProtocolEx_iface);
176 binding->state &= ~BINDING_LOCKED;
177 }
178
179 if(!(binding->state & BINDING_STOPPED)) {
180 binding->state |= BINDING_STOPPED;
181
182 binding->hres = hres;
183 IBindStatusCallback_OnStopBinding(binding->callback, hres, str);
184 }
185}
186
188{
190 DWORD res, type, size;
191 HKEY hkey;
192 int len;
194
195 static const WCHAR mime_keyW[] =
196 {'M','I','M','E','\\','D','a','t','a','b','a','s','e','\\',
197 'C','o','n','t','e','n','t',' ','T','y','p','e','\\'};
198
199 len = lstrlenW(mime)+1;
200 key_name = malloc(sizeof(mime_keyW) + len * sizeof(WCHAR));
201 memcpy(key_name, mime_keyW, sizeof(mime_keyW));
202 lstrcpyW(key_name + ARRAY_SIZE(mime_keyW), mime);
203
205 free(key_name);
206 if(res != ERROR_SUCCESS) {
207 WARN("Could not open MIME key: %lx\n", res);
208 return NULL;
209 }
210
211 size = 50*sizeof(WCHAR);
212 ret = malloc(size);
213 res = RegQueryValueExW(hkey, L"CLSID", NULL, &type, (BYTE*)ret, &size);
214 RegCloseKey(hkey);
215 if(res != ERROR_SUCCESS) {
216 WARN("Could not get CLSID: %08lx\n", res);
217 free(ret);
218 return NULL;
219 }
220
222 if(FAILED(hres)) {
223 WARN("Could not parse CLSID: %08lx\n", hres);
224 free(ret);
225 return NULL;
226 }
227
228 return ret;
229}
230
232{
233 IBindCtx *bctx;
235
236 hres = CreateAsyncBindCtxEx(binding->bctx, 0, NULL, NULL, &bctx, 0);
237 if(FAILED(hres)) {
238 WARN("CreateAsyncBindCtxEx failed: %08lx\n", hres);
239 return;
240 }
241
242 IBindCtx_RevokeObjectParam(bctx, bscb_holderW);
243 IBindCtx_RegisterObjectParam(bctx, cbinding_contextW, (IUnknown*)&binding->IBinding_iface);
244
245 hres = IPersistMoniker_Load(persist, binding->download_state == END_DOWNLOAD, binding->mon, bctx, 0x12);
246 IBindCtx_RevokeObjectParam(bctx, cbinding_contextW);
247 IBindCtx_Release(bctx);
248 if(FAILED(hres))
249 FIXME("Load failed: %08lx\n", hres);
250}
251
253{
254 IPersistMoniker *persist;
256
257 hres = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
258 &binding->iid, (void**)&binding->obj);
259 if(FAILED(hres)) {
260 WARN("CoCreateInstance failed: %08lx\n", hres);
262 }
263
264 binding->state |= BINDING_OBJAVAIL;
265
266 hres = IUnknown_QueryInterface(binding->obj, &IID_IPersistMoniker, (void**)&persist);
267 if(SUCCEEDED(hres)) {
268 IMonikerProp *prop;
269
270 hres = IPersistMoniker_QueryInterface(persist, &IID_IMonikerProp, (void**)&prop);
271 if(SUCCEEDED(hres)) {
272 IMonikerProp_PutProperty(prop, MIMETYPEPROP, binding->mime);
273 IMonikerProp_PutProperty(prop, CLASSIDPROP, clsid_str);
274 IMonikerProp_Release(prop);
275 }
276
277 load_doc_mon(binding, persist);
278
279 IPersistMoniker_Release(persist);
280 }else {
281 FIXME("Could not get IPersistMoniker: %08lx\n", hres);
282 /* FIXME: Try query IPersistFile */
283 }
284
285 IBindStatusCallback_OnObjectAvailable(binding->callback, &binding->iid, binding->obj);
286
287 return S_OK;
288}
289
291{
292 LPWSTR clsid_str;
293 CLSID clsid;
295
296 if(!binding->mime) {
297 FIXME("MIME not available\n");
298 return;
299 }
300
301 if((clsid_str = get_mime_clsid(binding->mime, &clsid)))
302 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_CLASSIDAVAILABLE, clsid_str);
303
304 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_BEGINSYNCOPERATION, NULL);
305
306 if(clsid_str) {
307 hres = create_mime_object(binding, &clsid, clsid_str);
308 free(clsid_str);
309 }else {
310 FIXME("Could not find object for MIME %s\n", debugstr_w(binding->mime));
312 }
313
314 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_ENDSYNCOPERATION, NULL);
315 binding->clsid = CLSID_NULL;
316
318 if(FAILED(hres))
319 IInternetProtocolEx_Terminate(&binding->protocol->IInternetProtocolEx_iface, 0);
320}
321
323{
324 free(This->stgmed_buf->cache_file);
325 This->stgmed_buf->cache_file = wcsdup(file_name);
326
327 if(This->use_cache_file) {
330 if(This->stgmed_buf->file == INVALID_HANDLE_VALUE)
331 WARN("CreateFile failed: %lu\n", GetLastError());
332 }
333}
334
336{
337 return CONTAINING_RECORD(iface, stgmed_buf_t, IUnknown_iface);
338}
339
341{
343
344 *ppv = NULL;
345
347 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
348
349 *ppv = &This->IUnknown_iface;
350 IUnknown_AddRef(&This->IUnknown_iface);
351 return S_OK;
352 }
353
354 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
355 return E_NOINTERFACE;
356}
357
359{
362
363 TRACE("(%p) ref=%ld\n", This, ref);
364
365 return ref;
366}
367
369{
372
373 TRACE("(%p) ref=%ld\n", This, ref);
374
375 if(!ref) {
376 if(This->file != INVALID_HANDLE_VALUE)
377 CloseHandle(This->file);
378 IInternetProtocolEx_Release(This->protocol);
379 free(This->cache_file);
380 free(This);
381
383 }
384
385 return ref;
386}
387
388static const IUnknownVtbl StgMedUnkVtbl = {
392};
393
395{
396 stgmed_buf_t *ret = malloc(sizeof(*ret));
397
398 ret->IUnknown_iface.lpVtbl = &StgMedUnkVtbl;
399 ret->ref = 1;
401 ret->hres = S_OK;
402 ret->cache_file = NULL;
403
404 IInternetProtocolEx_AddRef(protocol);
405 ret->protocol = protocol;
406
408
409 return ret;
410}
411
412typedef struct {
415
417
420
422{
423 return CONTAINING_RECORD(iface, ProtocolStream, IStream_iface);
424}
425
427 REFIID riid, void **ppv)
428{
430
431 *ppv = NULL;
432
434 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
435 *ppv = &This->IStream_iface;
436 }else if(IsEqualGUID(&IID_ISequentialStream, riid)) {
437 TRACE("(%p)->(IID_ISequentialStream %p)\n", This, ppv);
438 *ppv = &This->IStream_iface;
439 }else if(IsEqualGUID(&IID_IStream, riid)) {
440 TRACE("(%p)->(IID_IStream %p)\n", This, ppv);
441 *ppv = &This->IStream_iface;
442 }
443
444 if(*ppv) {
445 IStream_AddRef(&This->IStream_iface);
446 return S_OK;
447 }
448
449 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
450 return E_NOINTERFACE;
451}
452
454{
457
458 TRACE("(%p) ref=%ld\n", This, ref);
459
460 return ref;
461}
462
464{
467
468 TRACE("(%p) ref=%ld\n", This, ref);
469
470 if(!ref) {
471 IUnknown_Release(&This->buf->IUnknown_iface);
472 free(This);
473
475 }
476
477 return ref;
478}
479
481 ULONG cb, ULONG *pcbRead)
482{
484 DWORD read = 0;
486
487 TRACE("(%p)->(%p %ld %p)\n", This, pv, cb, pcbRead);
488
489 if(This->buf->file == INVALID_HANDLE_VALUE) {
490 hres = This->buf->hres = IInternetProtocolEx_Read(This->buf->protocol, (PBYTE)pv, cb, &read);
491 }else {
492 hres = ReadFile(This->buf->file, pv, cb, &read, NULL) ? S_OK : INET_E_DOWNLOAD_FAILURE;
493 }
494
495 if (pcbRead)
496 *pcbRead = read;
497
498 if(hres == E_PENDING)
499 return E_PENDING;
500 else if(FAILED(hres))
501 FIXME("Read failed: %08lx\n", hres);
502
503 return read ? S_OK : S_FALSE;
504}
505
506static HRESULT WINAPI ProtocolStream_Write(IStream *iface, const void *pv,
507 ULONG cb, ULONG *pcbWritten)
508{
510
511 TRACE("(%p)->(%p %ld %p)\n", This, pv, cb, pcbWritten);
512
513 return STG_E_ACCESSDENIED;
514}
515
517 DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
518{
520 LARGE_INTEGER new_pos;
522
523 TRACE("(%p)->(%ld %08lx %p)\n", This, dlibMove.LowPart, dwOrigin, plibNewPosition);
524
525 if(This->buf->file == INVALID_HANDLE_VALUE) {
526 /* We should probably call protocol handler's Seek. */
527 FIXME("no cache file, not supported\n");
528 return E_FAIL;
529 }
530
531 switch(dwOrigin) {
532 case STREAM_SEEK_SET:
534 break;
535 case STREAM_SEEK_CUR:
537 break;
538 case STREAM_SEEK_END:
540 break;
541 default:
542 WARN("Invalid origin %lx\n", dwOrigin);
543 return E_FAIL;
544 }
545
546 if(!SetFilePointerEx(This->buf->file, dlibMove, &new_pos, method)) {
547 FIXME("SetFilePointerEx failed: %lu\n", GetLastError());
548 return E_FAIL;
549 }
550
551 if(plibNewPosition)
552 plibNewPosition->QuadPart = new_pos.QuadPart;
553 return S_OK;
554}
555
557{
559 FIXME("(%p)->(%ld)\n", This, libNewSize.LowPart);
560 return E_NOTIMPL;
561}
562
564 ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
565{
567 FIXME("(%p)->(%p %ld %p %p)\n", This, pstm, cb.LowPart, pcbRead, pcbWritten);
568 return E_NOTIMPL;
569}
570
571static HRESULT WINAPI ProtocolStream_Commit(IStream *iface, DWORD grfCommitFlags)
572{
574
575 TRACE("(%p)->(%08lx)\n", This, grfCommitFlags);
576
577 return E_NOTIMPL;
578}
579
581{
583
584 TRACE("(%p)\n", This);
585
586 return E_NOTIMPL;
587}
588
590 ULARGE_INTEGER cb, DWORD dwLockType)
591{
593 FIXME("(%p)->(%ld %ld %ld)\n", This, libOffset.LowPart, cb.LowPart, dwLockType);
594 return E_NOTIMPL;
595}
596
598 ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
599{
601 FIXME("(%p)->(%ld %ld %ld)\n", This, libOffset.LowPart, cb.LowPart, dwLockType);
602 return E_NOTIMPL;
603}
604
605static HRESULT WINAPI ProtocolStream_Stat(IStream *iface, STATSTG *pstatstg,
606 DWORD dwStatFlag)
607{
609 TRACE("(%p)->(%p %08lx)\n", This, pstatstg, dwStatFlag);
610
611 if(!pstatstg)
612 return E_FAIL;
613
614 memset(pstatstg, 0, sizeof(STATSTG));
615
616 if(!(dwStatFlag&STATFLAG_NONAME) && This->buf->cache_file) {
617 pstatstg->pwcsName = CoTaskMemAlloc((lstrlenW(This->buf->cache_file)+1)*sizeof(WCHAR));
618 if(!pstatstg->pwcsName)
620
621 lstrcpyW(pstatstg->pwcsName, This->buf->cache_file);
622 }
623
624 pstatstg->type = STGTY_STREAM;
625 if(This->buf->file != INVALID_HANDLE_VALUE) {
626 GetFileSizeEx(This->buf->file, (PLARGE_INTEGER)&pstatstg->cbSize);
627 GetFileTime(This->buf->file, &pstatstg->ctime, &pstatstg->atime, &pstatstg->mtime);
628 if(pstatstg->cbSize.QuadPart)
629 pstatstg->grfMode = GENERIC_READ;
630 }
631
632 return S_OK;
633}
634
636{
638 FIXME("(%p)->(%p)\n", This, ppstm);
639 return E_NOTIMPL;
640}
641
642static const IStreamVtbl ProtocolStreamVtbl = {
657};
658
660{
662 IStream_Release(&stream->IStream_iface);
663}
664
666{
668
669 stgmed->tymed = TYMED_ISTREAM;
670 stgmed->pstm = &stream->IStream_iface;
671 stgmed->pUnkForRelease = &stream->buf->IUnknown_iface;
672
673 return S_OK;
674}
675
677{
679
680 if(!(bindf & BINDF_ASYNCHRONOUS) && stream->buf->file == INVALID_HANDLE_VALUE
681 && stream->buf->hres != S_FALSE)
683
684 IStream_AddRef(&stream->IStream_iface);
686 return S_OK;
687}
688
693};
694
695typedef struct {
699
701{
703
704 ret->stgmed_obj.vtbl = &stgmed_stream_vtbl;
705 ret->IStream_iface.lpVtbl = &ProtocolStreamVtbl;
706 ret->ref = 1;
707
708 IUnknown_AddRef(&buf->IUnknown_iface);
709 ret->buf = buf;
710
712
713 return &ret->stgmed_obj;
714}
715
717{
719
720 IUnknown_Release(&file_obj->buf->IUnknown_iface);
721 free(file_obj);
722}
723
725{
727
728 if(!file_obj->buf->cache_file) {
729 WARN("cache_file not set\n");
731 }
732
733 read_protocol_data(file_obj->buf);
734
735 stgmed->tymed = TYMED_FILE;
736 stgmed->lpszFileName = file_obj->buf->cache_file;
737 stgmed->pUnkForRelease = &file_obj->buf->IUnknown_iface;
738
739 return S_OK;
740}
741
743{
744 return bindf & BINDF_ASYNCHRONOUS ? MK_S_ASYNCHRONOUS : S_OK;
745}
746
751};
752
754{
755 stgmed_file_obj_t *ret = malloc(sizeof(*ret));
756
757 ret->stgmed_obj.vtbl = &stgmed_file_vtbl;
758
759 IUnknown_AddRef(&buf->IUnknown_iface);
760 ret->buf = buf;
761
762 return &ret->stgmed_obj;
763}
764
765static inline Binding *impl_from_IBinding(IBinding *iface)
766{
767 return CONTAINING_RECORD(iface, Binding, IBinding_iface);
768}
769
771{
773
774 *ppv = NULL;
775
777 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
778 *ppv = &This->IBinding_iface;
779 }else if(IsEqualGUID(&IID_IBinding, riid)) {
780 TRACE("(%p)->(IID_IBinding %p)\n", This, ppv);
781 *ppv = &This->IBinding_iface;
782 }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) {
783 TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv);
784 *ppv = &This->IInternetProtocolSink_iface;
785 }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) {
786 TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv);
787 *ppv = &This->IInternetBindInfo_iface;
788 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
789 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
790 *ppv = &This->IServiceProvider_iface;
791 }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
792 IWinInetInfo *wininet_info;
794
795 TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
796
797 /* NOTE: This violidates COM rules, but tests prove that we should do it */
798 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
799 &IID_IWinInetInfo, (void**)&wininet_info);
800 if(SUCCEEDED(hres)) {
801 IWinInetInfo_Release(wininet_info);
802 *ppv = &This->IWinInetHttpInfo_iface;
803 }
804 }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
805 IWinInetHttpInfo *http_info;
807
808 TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv);
809
810 /* NOTE: This violidates COM rules, but tests prove that we should do it */
811 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
812 &IID_IWinInetHttpInfo, (void**)&http_info);
813 if(SUCCEEDED(hres)) {
814 IWinInetHttpInfo_Release(http_info);
815 *ppv = &This->IWinInetHttpInfo_iface;
816 }
817 }
818
819 if(*ppv) {
820 IBinding_AddRef(&This->IBinding_iface);
821 return S_OK;
822 }
823
824 WARN("Unsupported interface %s\n", debugstr_guid(riid));
825 return E_NOINTERFACE;
826}
827
829{
832
833 TRACE("(%p) ref=%ld\n", This, ref);
834
835 return ref;
836}
837
839{
842
843 TRACE("(%p) ref=%ld\n", This, ref);
844
845 if(!ref) {
846 if(This->notif_hwnd)
847 release_notif_hwnd(This->notif_hwnd);
848 if(This->mon)
849 IMoniker_Release(This->mon);
850 if(This->callback)
851 IBindStatusCallback_Release(This->callback);
852 if(This->protocol)
853 IInternetProtocolEx_Release(&This->protocol->IInternetProtocolEx_iface);
854 if(This->service_provider)
855 IServiceProvider_Release(This->service_provider);
856 if(This->stgmed_buf)
857 IUnknown_Release(&This->stgmed_buf->IUnknown_iface);
858 if(This->stgmed_obj)
859 This->stgmed_obj->vtbl->release(This->stgmed_obj);
860 if(This->obj)
861 IUnknown_Release(This->obj);
862 if(This->bctx)
863 IBindCtx_Release(This->bctx);
864
865 ReleaseBindInfo(&This->bindinfo);
866 This->section.DebugInfo->Spare[0] = 0;
867 DeleteCriticalSection(&This->section);
868 SysFreeString(This->url);
869 free(This->mime);
870 free(This->redirect_url);
871 free(This);
872
874 }
875
876 return ref;
877}
878
880{
883
884 TRACE("(%p)\n", This);
885
886 if(This->state & BINDING_ABORTED)
887 return E_FAIL;
888
889 hres = IInternetProtocolEx_Abort(&This->protocol->IInternetProtocolEx_iface, E_ABORT,
891 if(FAILED(hres))
892 return hres;
893
894 This->state |= BINDING_ABORTED;
895 return S_OK;
896}
897
899{
901 FIXME("(%p)\n", This);
902 return E_NOTIMPL;
903}
904
906{
908 FIXME("(%p)\n", This);
909 return E_NOTIMPL;
910}
911
913{
915 FIXME("(%p)->(%ld)\n", This, nPriority);
916 return E_NOTIMPL;
917}
918
919static HRESULT WINAPI Binding_GetPriority(IBinding *iface, LONG *pnPriority)
920{
922 FIXME("(%p)->(%p)\n", This, pnPriority);
923 return E_NOTIMPL;
924}
925
926static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtocol,
927 DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved)
928{
930
931 TRACE("(%p)->(%p %p %p %p)\n", This, pclsidProtocol, pdwResult, pszResult, pdwReserved);
932
933 if(!pdwResult || !pszResult || pdwReserved)
934 return E_INVALIDARG;
935
936 if(!(This->state & BINDING_STOPPED)) {
937 *pclsidProtocol = CLSID_NULL;
938 *pdwResult = 0;
939 *pszResult = NULL;
940 return S_OK;
941 }
942
943 *pclsidProtocol = This->hres==S_OK ? CLSID_NULL : This->clsid;
944 *pdwResult = This->hres;
945 *pszResult = NULL;
946 return S_OK;
947}
948
949static const IBindingVtbl BindingVtbl = {
959};
960
962{
964 IUnknown *unk;
966
967 hres = IBindCtx_GetObjectParam(bctx, cbinding_contextW, &unk);
968 if(FAILED(hres))
969 return NULL;
970
971 hres = IUnknown_QueryInterface(unk, &IID_IBinding, (void**)&binding);
972 IUnknown_Release(unk);
973 if(FAILED(hres))
974 return NULL;
975
976 if (binding->lpVtbl != &BindingVtbl)
977 return NULL;
979}
980
982{
983 return CONTAINING_RECORD(iface, Binding, IInternetProtocolSink_iface);
984}
985
987 REFIID riid, void **ppv)
988{
990 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
991}
992
994{
996 return IBinding_AddRef(&This->IBinding_iface);
997}
998
1000{
1002 return IBinding_Release(&This->IBinding_iface);
1003}
1004
1006 PROTOCOLDATA *pProtocolData)
1007{
1009
1010 WARN("(%p)->(%p)\n", This, pProtocolData);
1011
1012 return E_FAIL;
1013}
1014
1015static void on_progress(Binding *This, ULONG progress, ULONG progress_max,
1016 ULONG status_code, LPCWSTR status_text)
1017{
1018 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1019 status_code, status_text);
1020}
1021
1023 ULONG ulStatusCode, LPCWSTR szStatusText)
1024{
1026
1027 TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(ulStatusCode), debugstr_w(szStatusText));
1028
1029 switch(ulStatusCode) {
1030 case BINDSTATUS_FINDINGRESOURCE:
1031 on_progress(This, 0, 0, BINDSTATUS_FINDINGRESOURCE, szStatusText);
1032 break;
1033 case BINDSTATUS_CONNECTING:
1034 on_progress(This, 0, 0, BINDSTATUS_CONNECTING, szStatusText);
1035 break;
1036 case BINDSTATUS_REDIRECTING:
1037 free(This->redirect_url);
1038 This->redirect_url = wcsdup(szStatusText);
1039 on_progress(This, 0, 0, BINDSTATUS_REDIRECTING, szStatusText);
1040 break;
1041 case BINDSTATUS_BEGINDOWNLOADDATA:
1042 break;
1043 case BINDSTATUS_SENDINGREQUEST:
1044 on_progress(This, 0, 0, BINDSTATUS_SENDINGREQUEST, szStatusText);
1045 break;
1046 case BINDSTATUS_PROTOCOLCLASSID:
1047 CLSIDFromString(szStatusText, &This->clsid);
1048 break;
1049 case BINDSTATUS_MIMETYPEAVAILABLE:
1050 case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE:
1051 mime_available(This, szStatusText);
1052 break;
1053 case BINDSTATUS_CACHEFILENAMEAVAILABLE:
1054 cache_file_available(This, szStatusText);
1055 break;
1056 case BINDSTATUS_DECODING:
1057 IBindStatusCallback_OnProgress(This->callback, 0, 0, BINDSTATUS_DECODING, szStatusText);
1058 break;
1059 case BINDSTATUS_LOADINGMIMEHANDLER:
1060 on_progress(This, 0, 0, BINDSTATUS_LOADINGMIMEHANDLER, szStatusText);
1061 break;
1062 case BINDSTATUS_DIRECTBIND: /* FIXME: Handle BINDSTATUS_DIRECTBIND in BindProtocol */
1063 This->report_mime = FALSE;
1064 break;
1065 case BINDSTATUS_ACCEPTRANGES:
1066 break;
1067 default:
1068 FIXME("Unhandled status code %ld\n", ulStatusCode);
1069 return E_NOTIMPL;
1070 };
1071
1072 return S_OK;
1073}
1074
1075static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progress_max)
1076{
1077 FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM};
1078 BOOL sent_begindownloaddata = FALSE;
1079
1080 TRACE("(%p)->(%ld %lu %lu)\n", This, bscf, progress, progress_max);
1081
1082 if(This->download_state == END_DOWNLOAD || (This->state & BINDING_ABORTED)) {
1083 read_protocol_data(This->stgmed_buf);
1084 return;
1085 }
1086
1087 if(This->state & BINDING_STOPPED)
1088 return;
1089
1090 if(This->stgmed_buf->file != INVALID_HANDLE_VALUE)
1091 read_protocol_data(This->stgmed_buf);
1092
1093 if(This->download_state == BEFORE_DOWNLOAD) {
1094 This->download_state = DOWNLOADING;
1095 sent_begindownloaddata = TRUE;
1096 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1097 BINDSTATUS_BEGINDOWNLOADDATA, This->url);
1098
1099 if(This->stgmed_buf->cache_file)
1100 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1101 BINDSTATUS_CACHEFILENAMEAVAILABLE, This->stgmed_buf->cache_file);
1102 }
1103
1104 if(This->stgmed_buf->hres == S_FALSE || (bscf & BSCF_LASTDATANOTIFICATION)) {
1105 This->download_state = END_DOWNLOAD;
1106 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1107 BINDSTATUS_ENDDOWNLOADDATA, This->url);
1108 }else if(!sent_begindownloaddata) {
1109 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1110 BINDSTATUS_DOWNLOADINGDATA, This->url);
1111 }
1112
1113 if(This->state & (BINDING_STOPPED|BINDING_ABORTED))
1114 return;
1115
1116 if(This->to_object) {
1117 if(!(This->state & BINDING_OBJAVAIL)) {
1118 IBinding_AddRef(&This->IBinding_iface);
1120 IBinding_Release(&This->IBinding_iface);
1121 }
1122 }else {
1123 STGMEDIUM stgmed;
1124 HRESULT hres;
1125
1126 if(!(This->state & BINDING_LOCKED)) {
1127 hres = IInternetProtocolEx_LockRequest(&This->protocol->IInternetProtocolEx_iface, 0);
1128 if(SUCCEEDED(hres))
1129 This->state |= BINDING_LOCKED;
1130 }
1131
1132 hres = This->stgmed_obj->vtbl->fill_stgmed(This->stgmed_obj, &stgmed);
1133 if(FAILED(hres)) {
1135 return;
1136 }
1137
1138 formatetc.tymed = stgmed.tymed;
1139 formatetc.cfFormat = This->clipboard_format;
1140
1141 hres = IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress,
1142 &formatetc, &stgmed);
1143 if(hres != S_OK) {
1144 if(This->download_state != END_DOWNLOAD) {
1145 This->download_state = END_DOWNLOAD;
1146 IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
1147 BINDSTATUS_ENDDOWNLOADDATA, This->url);
1148 }
1149
1150 WARN("OnDataAvailable returned %lx\n", hres);
1152 return;
1153 }
1154
1155 if(This->download_state == END_DOWNLOAD)
1157 }
1158}
1159
1161 DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
1162{
1164
1165 TRACE("(%p)->(%ld %lu %lu)\n", This, grfBSCF, ulProgress, ulProgressMax);
1166
1167 report_data(This, grfBSCF, ulProgress, ulProgressMax);
1168 return S_OK;
1169}
1170
1172 HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
1173{
1175
1176 TRACE("(%p)->(%08lx %ld %s)\n", This, hrResult, dwError, debugstr_w(szResult));
1177
1178 stop_binding(This, hrResult, szResult);
1179
1180 IInternetProtocolEx_Terminate(&This->protocol->IInternetProtocolEx_iface, 0);
1181 return S_OK;
1182}
1183
1184static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = {
1192};
1193
1195{
1196 return CONTAINING_RECORD(iface, Binding, IInternetBindInfo_iface);
1197}
1198
1200 REFIID riid, void **ppv)
1201{
1203 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
1204}
1205
1207{
1209 return IBinding_AddRef(&This->IBinding_iface);
1210}
1211
1213{
1215 return IBinding_Release(&This->IBinding_iface);
1216}
1217
1219 DWORD *grfBINDF, BINDINFO *pbindinfo)
1220{
1222
1223 TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
1224
1225 *grfBINDF = This->bindf;
1226 return CopyBindInfo(&This->bindinfo, pbindinfo);
1227}
1228
1230 ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
1231{
1233
1234 TRACE("(%p)->(%ld %p %ld %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched);
1235
1236 switch(ulStringType) {
1237 case BINDSTRING_ACCEPT_MIMES: {
1238 if(!ppwzStr || !pcElFetched)
1239 return E_INVALIDARG;
1240
1241 ppwzStr[0] = CoTaskMemAlloc(sizeof(L"*/*"));
1242 memcpy(ppwzStr[0], L"*/*", sizeof(L"*/*"));
1243 *pcElFetched = 1;
1244 return S_OK;
1245 }
1246 case BINDSTRING_USER_AGENT: {
1247 IInternetBindInfo *bindinfo = NULL;
1248 HRESULT hres;
1249
1250 hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IInternetBindInfo,
1251 (void**)&bindinfo);
1252 if(FAILED(hres))
1253 return hres;
1254
1255 hres = IInternetBindInfo_GetBindString(bindinfo, ulStringType, ppwzStr,
1256 cEl, pcElFetched);
1257 IInternetBindInfo_Release(bindinfo);
1258
1259 return hres;
1260 }
1261 case BINDSTRING_URL: {
1262 DWORD size = (SysStringLen(This->url)+1) * sizeof(WCHAR);
1263
1264 if(!ppwzStr || !pcElFetched)
1265 return E_INVALIDARG;
1266
1267 *ppwzStr = CoTaskMemAlloc(size);
1268 memcpy(*ppwzStr, This->url, size);
1269 *pcElFetched = 1;
1270 return S_OK;
1271 }
1272 }
1273
1274 FIXME("not supported string type %ld\n", ulStringType);
1275 return E_NOTIMPL;
1276}
1277
1278static const IInternetBindInfoVtbl InternetBindInfoVtbl = {
1284};
1285
1287{
1288 return CONTAINING_RECORD(iface, Binding, IWinInetHttpInfo_iface);
1289}
1290
1292{
1294 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
1295}
1296
1298{
1300 return IBinding_AddRef(&This->IBinding_iface);
1301}
1302
1304{
1306 return IBinding_Release(&This->IBinding_iface);
1307}
1308
1310 void *pBuffer, DWORD *pcbBuffer)
1311{
1313 IWinInetInfo *wininet_info;
1314 HRESULT hres;
1315
1316 TRACE("(%p)->(%lx %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
1317
1318 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
1319 &IID_IWinInetInfo, (void**)&wininet_info);
1320 if(FAILED(hres))
1321 return E_FAIL;
1322
1323 hres = IWinInetInfo_QueryOption(wininet_info, dwOption, pBuffer, pcbBuffer);
1324 IWinInetInfo_Release(wininet_info);
1325 return hres;
1326}
1327
1329 void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
1330{
1332 IWinInetHttpInfo *http_info;
1333 HRESULT hres;
1334
1335 TRACE("(%p)->(%lx %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
1336
1337 hres = IInternetProtocolEx_QueryInterface(&This->protocol->IInternetProtocolEx_iface,
1338 &IID_IWinInetHttpInfo, (void**)&http_info);
1339 if(FAILED(hres))
1340 return E_FAIL;
1341
1342 hres = IWinInetHttpInfo_QueryInfo(http_info, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
1343 IWinInetHttpInfo_Release(http_info);
1344 return hres;
1345}
1346
1347static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = {
1353};
1354
1356{
1357 return CONTAINING_RECORD(iface, Binding, IServiceProvider_iface);
1358}
1359
1361 REFIID riid, void **ppv)
1362{
1364 return IBinding_QueryInterface(&This->IBinding_iface, riid, ppv);
1365}
1366
1368{
1370 return IBinding_AddRef(&This->IBinding_iface);
1371}
1372
1374{
1376 return IBinding_Release(&This->IBinding_iface);
1377}
1378
1380 REFGUID guidService, REFIID riid, void **ppv)
1381{
1383 HRESULT hres;
1384
1385 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
1386
1387 if(This->service_provider) {
1388 hres = IServiceProvider_QueryService(This->service_provider, guidService,
1389 riid, ppv);
1390 if(SUCCEEDED(hres))
1391 return hres;
1392 }
1393
1394 WARN("unknown service %s\n", debugstr_guid(guidService));
1395 return E_NOINTERFACE;
1396}
1397
1398static const IServiceProviderVtbl ServiceProviderVtbl = {
1403};
1404
1406{
1407 IUnknown *unk;
1408 HRESULT hres;
1409
1410 hres = IBindCtx_GetObjectParam(pbc, bscb_holderW, &unk);
1411 if(FAILED(hres))
1413
1414 hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)callback);
1415 IUnknown_Release(unk);
1416 return hres;
1417}
1418
1420{
1421 DWORD scheme;
1422 HRESULT hres;
1423
1424 hres = IUri_GetScheme(uri, &scheme);
1425 if(FAILED(hres))
1426 return FALSE;
1427
1428 switch(scheme) {
1429 case URL_SCHEME_FILE:
1430 case URL_SCHEME_FTP:
1431 case URL_SCHEME_GOPHER:
1432 case URL_SCHEME_HTTP:
1433 case URL_SCHEME_HTTPS:
1434 case URL_SCHEME_MK:
1435 return TRUE;
1436 }
1437
1438 return FALSE;
1439}
1440
1441static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc,
1442 BOOL to_obj, REFIID riid, Binding **binding)
1443{
1444 Binding *ret;
1445 HRESULT hres;
1446
1448
1449 ret = calloc(1, sizeof(Binding));
1450
1451 ret->IBinding_iface.lpVtbl = &BindingVtbl;
1452 ret->IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkVtbl;
1453 ret->IInternetBindInfo_iface.lpVtbl = &InternetBindInfoVtbl;
1454 ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
1455 ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
1456
1457 ret->ref = 1;
1458
1459 ret->to_object = to_obj;
1460 ret->iid = *riid;
1461 ret->notif_hwnd = get_notif_hwnd();
1462 ret->report_mime = !binding_ctx;
1463 ret->download_state = BEFORE_DOWNLOAD;
1464
1465 if(to_obj) {
1466 IBindCtx_AddRef(pbc);
1467 ret->bctx = pbc;
1468 }
1469
1470 if(mon) {
1471 IMoniker_AddRef(mon);
1472 ret->mon = mon;
1473 }
1474
1475 ret->bindinfo.cbSize = sizeof(BINDINFO);
1476
1478 ret->section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": Binding.section");
1479
1480 hres = get_callback(pbc, &ret->callback);
1481 if(FAILED(hres)) {
1482 WARN("Could not get IBindStatusCallback\n");
1483 IBinding_Release(&ret->IBinding_iface);
1484 return hres;
1485 }
1486
1487 IBindStatusCallback_QueryInterface(ret->callback, &IID_IServiceProvider,
1488 (void**)&ret->service_provider);
1489
1490 if(binding_ctx) {
1491 ret->protocol = binding_ctx->protocol;
1492 IInternetProtocolEx_AddRef(&ret->protocol->IInternetProtocolEx_iface);
1493 }else {
1494 hres = create_binding_protocol(&ret->protocol);
1495 if(FAILED(hres)) {
1496 WARN("Could not get protocol handler\n");
1497 IBinding_Release(&ret->IBinding_iface);
1498 return hres;
1499 }
1500 }
1501
1502 hres = IBindStatusCallback_GetBindInfo(ret->callback, &ret->bindf, &ret->bindinfo);
1503 if(FAILED(hres)) {
1504 WARN("GetBindInfo failed: %08lx\n", hres);
1505 IBinding_Release(&ret->IBinding_iface);
1506 return hres;
1507 }
1508
1509 TRACE("bindf %08lx\n", ret->bindf);
1510 dump_BINDINFO(&ret->bindinfo);
1511
1512 ret->bindf |= BINDF_FROMURLMON;
1513 if(to_obj)
1514 ret->bindinfo.dwOptions |= 0x100000;
1515
1516 if(!(ret->bindf & BINDF_ASYNCHRONOUS) || !(ret->bindf & BINDF_PULLDATA)) {
1517 ret->bindf |= BINDF_NEEDFILE;
1518 ret->use_cache_file = TRUE;
1519 }else if(!is_urlmon_protocol(uri)) {
1520 ret->bindf |= BINDF_NEEDFILE;
1521 }
1522
1523 hres = IUri_GetDisplayUri(uri, &ret->url);
1524 if(FAILED(hres)) {
1525 IBinding_Release(&ret->IBinding_iface);
1526 return hres;
1527 }
1528
1529 if(binding_ctx) {
1530 ret->stgmed_buf = binding_ctx->stgmed_buf;
1531 IUnknown_AddRef(&ret->stgmed_buf->IUnknown_iface);
1532 ret->clipboard_format = binding_ctx->clipboard_format;
1533 }else {
1534 ret->stgmed_buf = create_stgmed_buf(&ret->protocol->IInternetProtocolEx_iface);
1535 }
1536
1537 if(to_obj) {
1538 ret->stgmed_obj = NULL;
1539 }else if(IsEqualGUID(&IID_IStream, riid)) {
1540 ret->stgmed_obj = create_stgmed_stream(ret->stgmed_buf);
1541 }else if(IsEqualGUID(&IID_IUnknown, riid)) {
1542 ret->bindf |= BINDF_NEEDFILE;
1543 ret->stgmed_obj = create_stgmed_file(ret->stgmed_buf);
1544 }else {
1545 FIXME("Unsupported riid %s\n", debugstr_guid(riid));
1546 IBinding_Release(&ret->IBinding_iface);
1547 return E_NOTIMPL;
1548 }
1549
1550 *binding = ret;
1551 return S_OK;
1552}
1553
1554static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc,
1555 BOOL to_obj, REFIID riid, Binding **ret)
1556{
1557 Binding *binding = NULL;
1558 HRESULT hres;
1559 MSG msg;
1560
1561 hres = Binding_Create(mon, binding_ctx, uri, pbc, to_obj, riid, &binding);
1562 if(FAILED(hres))
1563 return hres;
1564
1565 hres = IBindStatusCallback_OnStartBinding(binding->callback, 0, &binding->IBinding_iface);
1566 if(FAILED(hres)) {
1567 WARN("OnStartBinding failed: %08lx\n", hres);
1568 if(hres != E_ABORT && hres != E_NOTIMPL)
1570
1572 IBinding_Release(&binding->IBinding_iface);
1573 return hres;
1574 }
1575
1576 if(binding_ctx) {
1577 set_binding_sink(binding->protocol, &binding->IInternetProtocolSink_iface,
1578 &binding->IInternetBindInfo_iface);
1579 if(binding_ctx->redirect_url)
1580 IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url);
1581 report_data(binding, BSCF_FIRSTDATANOTIFICATION | (binding_ctx->download_state == END_DOWNLOAD ? BSCF_LASTDATANOTIFICATION : 0),
1582 0, 0);
1583 }else {
1584 hres = IInternetProtocolEx_StartEx(&binding->protocol->IInternetProtocolEx_iface, uri,
1585 &binding->IInternetProtocolSink_iface, &binding->IInternetBindInfo_iface,
1586 PI_APARTMENTTHREADED|PI_MIMEVERIFICATION, 0);
1587
1588 TRACE("start ret %08lx\n", hres);
1589
1590 if(FAILED(hres) && hres != E_PENDING) {
1592 IBinding_Release(&binding->IBinding_iface);
1593
1594 return hres;
1595 }
1596 }
1597
1598 while(!(binding->bindf & BINDF_ASYNCHRONOUS) &&
1599 !(binding->state & BINDING_STOPPED)) {
1601 while (PeekMessageW(&msg, binding->notif_hwnd, WM_USER, WM_USER+117, PM_REMOVE|PM_NOYIELD)) {
1604 }
1605 }
1606
1607 *ret = binding;
1608 return S_OK;
1609}
1610
1612{
1613 Binding *binding = NULL, *binding_ctx;
1614 HRESULT hres;
1615
1616 binding_ctx = get_bctx_binding(pbc);
1617
1618 hres = start_binding(NULL, binding_ctx, uri, pbc, FALSE, riid, &binding);
1619 if(binding_ctx)
1620 IBinding_Release(&binding_ctx->IBinding_iface);
1621 if(FAILED(hres))
1622 return hres;
1623
1624 if(binding->hres == S_OK && binding->download_state != BEFORE_DOWNLOAD /* FIXME */) {
1625 if((binding->state & BINDING_STOPPED) && (binding->state & BINDING_LOCKED))
1626 IInternetProtocolEx_UnlockRequest(&binding->protocol->IInternetProtocolEx_iface);
1627
1628 hres = binding->stgmed_obj->vtbl->get_result(binding->stgmed_obj, binding->bindf, ppv);
1629 }else if(binding->bindf & BINDF_ASYNCHRONOUS) {
1630 hres = MK_S_ASYNCHRONOUS;
1631 }else {
1632 hres = FAILED(binding->hres) ? binding->hres : S_OK;
1633 }
1634
1635 IBinding_Release(&binding->IBinding_iface);
1636
1637 return hres;
1638}
1639
1641{
1643 HRESULT hres;
1644
1645 *ppv = NULL;
1646
1647 hres = start_binding(mon, NULL, uri, pbc, TRUE, riid, &binding);
1648 if(FAILED(hres))
1649 return hres;
1650
1651 if(binding->hres != S_OK) {
1652 hres = SUCCEEDED(binding->hres) ? S_OK : binding->hres;
1653 }else if(binding->bindf & BINDF_ASYNCHRONOUS) {
1654 hres = MK_S_ASYNCHRONOUS;
1655 }else {
1656 *ppv = binding->obj;
1657 IUnknown_AddRef(binding->obj);
1658 hres = S_OK;
1659 }
1660
1661 IBinding_Release(&binding->IBinding_iface);
1662
1663 return hres;
1664}
#define read
Definition: acwin.h:97
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: binding.c:1379
static void stgmed_stream_release(stgmed_obj_t *obj)
Definition: binding.c:659
static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
Definition: binding.c:1229
#define BINDING_ABORTED
Definition: binding.c:64
static Binding * impl_from_IInternetBindInfo(IInternetBindInfo *iface)
Definition: binding.c:1194
static HRESULT create_mime_object(Binding *binding, const CLSID *clsid, LPCWSTR clsid_str)
Definition: binding.c:252
static Binding * impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
Definition: binding.c:1286
static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: binding.c:1022
static HRESULT WINAPI ProtocolStream_Stat(IStream *iface, STATSTG *pstatstg, DWORD dwStatFlag)
Definition: binding.c:605
static HRESULT WINAPI WinInetHttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
Definition: binding.c:1291
static stgmed_obj_t * create_stgmed_stream(stgmed_buf_t *buf)
Definition: binding.c:700
static HRESULT WINAPI ProtocolStream_Revert(IStream *iface)
Definition: binding.c:580
static HRESULT stgmed_file_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
Definition: binding.c:724
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
Definition: binding.c:1347
static const IInternetBindInfoVtbl InternetBindInfoVtbl
Definition: binding.c:1278
HRESULT bind_to_storage(IUri *uri, IBindCtx *pbc, REFIID riid, void **ppv)
Definition: binding.c:1611
static ULONG WINAPI InternetBindInfo_Release(IInternetBindInfo *iface)
Definition: binding.c:1212
static void load_doc_mon(Binding *binding, IPersistMoniker *persist)
Definition: binding.c:231
static void stgmed_file_release(stgmed_obj_t *obj)
Definition: binding.c:716
static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
Definition: binding.c:1373
static const stgmed_obj_vtbl stgmed_file_vtbl
Definition: binding.c:747
static ULONG WINAPI WinInetHttpInfo_AddRef(IWinInetHttpInfo *iface)
Definition: binding.c:1297
static HRESULT WINAPI ProtocolStream_Clone(IStream *iface, IStream **ppstm)
Definition: binding.c:635
static ULONG WINAPI InternetProtocolSink_Release(IInternetProtocolSink *iface)
Definition: binding.c:999
#define BINDING_STOPPED
Definition: binding.c:62
static HRESULT get_callback(IBindCtx *pbc, IBindStatusCallback **callback)
Definition: binding.c:1405
static void cache_file_available(Binding *This, const WCHAR *file_name)
Definition: binding.c:322
static void dump_BINDINFO(BINDINFO *bi)
Definition: binding.c:115
static ULONG WINAPI StgMedUnk_AddRef(IUnknown *iface)
Definition: binding.c:358
static HRESULT WINAPI Binding_SetPriority(IBinding *iface, LONG nPriority)
Definition: binding.c:912
static WCHAR cbinding_contextW[]
Definition: binding.c:27
download_state_t
Definition: binding.c:55
@ END_DOWNLOAD
Definition: binding.c:58
@ BEFORE_DOWNLOAD
Definition: binding.c:56
@ DOWNLOADING
Definition: binding.c:57
static ULONG WINAPI InternetBindInfo_AddRef(IInternetBindInfo *iface)
Definition: binding.c:1206
static HRESULT WINAPI WinInetHttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
Definition: binding.c:1328
static Binding * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: binding.c:1355
static HRESULT WINAPI WinInetHttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
Definition: binding.c:1309
static HRESULT WINAPI Binding_Suspend(IBinding *iface)
Definition: binding.c:898
static HRESULT WINAPI InternetProtocolSink_QueryInterface(IInternetProtocolSink *iface, REFIID riid, void **ppv)
Definition: binding.c:986
static void stop_binding(Binding *binding, HRESULT hres, LPCWSTR str)
Definition: binding.c:172
static Binding * get_bctx_binding(IBindCtx *bctx)
Definition: binding.c:961
static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progress_max)
Definition: binding.c:1075
static ProtocolStream * impl_from_IStream(IStream *iface)
Definition: binding.c:421
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
Definition: binding.c:1184
static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **binding)
Definition: binding.c:1441
static HRESULT WINAPI Binding_Abort(IBinding *iface)
Definition: binding.c:879
static HRESULT stgmed_file_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
Definition: binding.c:742
static HRESULT WINAPI Binding_GetPriority(IBinding *iface, LONG *pnPriority)
Definition: binding.c:919
static stgmed_buf_t * impl_from_IUnknown(IUnknown *iface)
Definition: binding.c:335
static HRESULT WINAPI InternetBindInfo_QueryInterface(IInternetBindInfo *iface, REFIID riid, void **ppv)
Definition: binding.c:1199
static HRESULT stgmed_stream_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
Definition: binding.c:665
static WCHAR bscb_holderW[]
Definition: binding.c:28
static stgmed_obj_t * create_stgmed_file(stgmed_buf_t *buf)
Definition: binding.c:753
static const IBindingVtbl BindingVtbl
Definition: binding.c:949
static const stgmed_obj_vtbl stgmed_stream_vtbl
Definition: binding.c:689
static ULONG WINAPI InternetProtocolSink_AddRef(IInternetProtocolSink *iface)
Definition: binding.c:993
static void create_object(Binding *binding)
Definition: binding.c:290
static HRESULT WINAPI ProtocolStream_Write(IStream *iface, const void *pv, ULONG cb, ULONG *pcbWritten)
Definition: binding.c:506
static ULONG WINAPI Binding_Release(IBinding *iface)
Definition: binding.c:838
static BOOL is_urlmon_protocol(IUri *uri)
Definition: binding.c:1419
static ULONG WINAPI Binding_AddRef(IBinding *iface)
Definition: binding.c:828
static ULONG WINAPI ProtocolStream_AddRef(IStream *iface)
Definition: binding.c:453
static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtocol, DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved)
Definition: binding.c:926
static HRESULT WINAPI ProtocolStream_UnlockRegion(IStream *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
Definition: binding.c:597
static HRESULT WINAPI ProtocolStream_CopyTo(IStream *iface, IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
Definition: binding.c:563
static Binding * impl_from_IInternetProtocolSink(IInternetProtocolSink *iface)
Definition: binding.c:981
static void on_progress(Binding *This, ULONG progress, ULONG progress_max, ULONG status_code, LPCWSTR status_text)
Definition: binding.c:1015
static HRESULT WINAPI InternetProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: binding.c:1005
static void mime_available(Binding *This, LPCWSTR mime)
Definition: binding.c:159
static ULONG WINAPI StgMedUnk_Release(IUnknown *iface)
Definition: binding.c:368
static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv)
Definition: binding.c:770
static HRESULT WINAPI ProtocolStream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
Definition: binding.c:589
static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: binding.c:1360
static HRESULT WINAPI ProtocolStream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize)
Definition: binding.c:556
static void read_protocol_data(stgmed_buf_t *stgmed_buf)
Definition: binding.c:105
static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
Definition: binding.c:1367
static const IUnknownVtbl StgMedUnkVtbl
Definition: binding.c:388
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: binding.c:1398
static Binding * impl_from_IBinding(IBinding *iface)
Definition: binding.c:765
static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **ret)
Definition: binding.c:1554
#define BINDING_LOCKED
Definition: binding.c:61
static HRESULT WINAPI ProtocolStream_QueryInterface(IStream *iface, REFIID riid, void **ppv)
Definition: binding.c:426
static stgmed_buf_t * create_stgmed_buf(IInternetProtocolEx *protocol)
Definition: binding.c:394
static HRESULT stgmed_stream_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
Definition: binding.c:676
static HRESULT WINAPI InternetProtocolSink_ReportData(IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
Definition: binding.c:1160
static const IStreamVtbl ProtocolStreamVtbl
Definition: binding.c:642
static HRESULT WINAPI StgMedUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: binding.c:340
static HRESULT WINAPI Binding_Resume(IBinding *iface)
Definition: binding.c:905
static HRESULT WINAPI ProtocolStream_Seek(IStream *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: binding.c:516
#define BINDING_OBJAVAIL
Definition: binding.c:63
static HRESULT WINAPI ProtocolStream_Read(IStream *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: binding.c:480
static HRESULT WINAPI InternetProtocolSink_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
Definition: binding.c:1171
static LPWSTR get_mime_clsid(LPCWSTR mime, CLSID *clsid)
Definition: binding.c:187
static ULONG WINAPI ProtocolStream_Release(IStream *iface)
Definition: binding.c:463
static ULONG WINAPI WinInetHttpInfo_Release(IWinInetHttpInfo *iface)
Definition: binding.c:1303
static HRESULT WINAPI InternetBindInfo_GetBindInfo(IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: binding.c:1218
static HRESULT WINAPI ProtocolStream_Commit(IStream *iface, DWORD grfCommitFlags)
Definition: binding.c:571
HRESULT create_binding_protocol(BindProtocol **protocol)
Definition: bindprot.c:1453
void set_binding_sink(BindProtocol *This, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
Definition: bindprot.c:560
void release_notif_hwnd(HWND hwnd)
Definition: bindprot.c:137
HWND get_notif_hwnd(void)
Definition: bindprot.c:107
#define RegCloseKey(hKey)
Definition: registry.h:49
cd_progress_ptr progress
Definition: cdjpeg.h:152
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
#define E_PENDING
Definition: dinput.h:172
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
#define CloseHandle
Definition: compat.h:739
#define FILE_BEGIN
Definition: compat.h:761
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define GetFileSizeEx
Definition: compat.h:757
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define lstrcpyW
Definition: compat.h:749
#define FILE_SHARE_READ
Definition: compat.h:136
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI GetFileTime(IN HANDLE hFile, OUT LPFILETIME lpCreationTime OPTIONAL, OUT LPFILETIME lpLastAccessTime OPTIONAL, OUT LPFILETIME lpLastWriteTime OPTIONAL)
Definition: fileinfo.c:880
BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod)
Definition: fileinfo.c:177
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
method
Definition: dragdrop.c:54
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
unsigned int UINT
Definition: sysinfo.c:13
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
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
const WCHAR * mime
Definition: mimefilter.c:487
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static IPrintDialogCallback callback
Definition: printdlg.c:326
HRESULT hres
Definition: protocol.c:465
static DWORD bindf
Definition: protocol.c:70
static RPC_BINDING_HANDLE binding
Definition: server.c:166
static LPCWSTR file_name
Definition: protocol.c:152
const WCHAR * uri
Definition: sec_mgr.c:1564
static BOOL bind_to_object
Definition: url.c:171
const CLSID * clsid
Definition: msctf.cpp:50
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define DWORD
Definition: nt_native.h:44
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:198
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
BYTE * PBYTE
Definition: pedump.c:66
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define CLSID_NULL
Definition: guiddef.h:99
#define REFIID
Definition: guiddef.h:118
_In_ UINT _In_ DWORD _Out_ DWORD * pdwResult
Definition: ntgdi.h:250
@ URL_SCHEME_MK
Definition: shlwapi.h:554
@ URL_SCHEME_HTTPS
Definition: shlwapi.h:555
@ URL_SCHEME_FTP
Definition: shlwapi.h:545
@ URL_SCHEME_HTTP
Definition: shlwapi.h:546
@ URL_SCHEME_FILE
Definition: shlwapi.h:553
@ URL_SCHEME_GOPHER
Definition: shlwapi.h:547
PVOID pBuffer
#define calloc
Definition: rosglue.h:14
const WCHAR * str
DWORD scheme
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
LPWSTR url
Definition: binding.c:88
IUnknown * obj
Definition: binding.c:97
CRITICAL_SECTION section
Definition: binding.c:102
DWORD bindf
Definition: binding.c:84
IBindCtx * bctx
Definition: binding.c:99
HRESULT hres
Definition: binding.c:94
IServiceProvider * service_provider
Definition: binding.c:76
BOOL use_cache_file
Definition: binding.c:92
IBindStatusCallback * callback
Definition: binding.c:75
IInternetBindInfo IInternetBindInfo_iface
Definition: binding.c:69
CLSID clsid
Definition: binding.c:95
UINT clipboard_format
Definition: binding.c:87
BOOL to_object
Definition: binding.c:85
BOOL report_mime
Definition: binding.c:91
stgmed_buf_t * stgmed_buf
Definition: binding.c:80
IMoniker * mon
Definition: binding.c:98
BINDINFO bindinfo
Definition: binding.c:83
IServiceProvider IServiceProvider_iface
Definition: binding.c:71
LPWSTR redirect_url
Definition: binding.c:89
IWinInetHttpInfo IWinInetHttpInfo_iface
Definition: binding.c:70
LPWSTR mime
Definition: binding.c:86
download_state_t download_state
Definition: binding.c:96
IInternetProtocolSink IInternetProtocolSink_iface
Definition: binding.c:68
DWORD state
Definition: binding.c:93
stgmed_obj_t * stgmed_obj
Definition: binding.c:81
HWND notif_hwnd
Definition: binding.c:100
BindProtocol * protocol
Definition: binding.c:78
IID iid
Definition: binding.c:90
stgmed_buf_t * buf
Definition: binding.c:418
stgmed_obj_t stgmed_obj
Definition: binding.c:413
IStream IStream_iface
Definition: binding.c:414
Definition: scsiwmi.h:51
$ULONG LowPart
Definition: ntbasedef.h:581
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
const stgmed_obj_vtbl * vtbl
Definition: binding.c:52
Definition: send.c:48
LPWSTR cache_file
Definition: binding.c:40
HRESULT hres
Definition: binding.c:38
LONG ref
Definition: binding.c:33
IUnknown IUnknown_iface
Definition: binding.c:31
IInternetProtocolEx * protocol
Definition: binding.c:35
HANDLE file
Definition: binding.c:37
stgmed_obj_t stgmed_obj
Definition: binding.c:696
stgmed_buf_t * buf
Definition: binding.c:697
Definition: parse.h:23
IStream IStream_iface
Definition: request.c:5732
#define DWORD_PTR
Definition: treelist.c:76
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
LONGLONG QuadPart
Definition: typedefs.h:114
ULONG LowPart
Definition: typedefs.h:106
HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx *ibind, DWORD options, IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx **pbind, DWORD reserved)
Definition: bindctx.c:929
void WINAPI ReleaseBindInfo(BINDINFO *pbindinfo)
Definition: urlmon_main.c:561
HRESULT WINAPI CopyBindInfo(const BINDINFO *pcbiSrc, BINDINFO *pcbiDest)
Definition: urlmon_main.c:643
const char * debugstr_bindstatus(ULONG status)
Definition: urlmon_main.c:173
static void URLMON_LockModule(void)
Definition: urlmon_main.h:64
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:65
HRESULT create_default_callback(IBindStatusCallback **ret)
Definition: download.c:361
#define FILE_END
Definition: winbase.h:117
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FILE_CURRENT
Definition: winbase.h:116
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:3801
#define INET_E_DATA_NOT_AVAILABLE
Definition: winerror.h:4657
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define STG_E_ACCESSDENIED
Definition: winerror.h:3663
#define INET_E_CANNOT_INSTANTIATE_OBJECT
Definition: winerror.h:4666
#define STG_E_INSUFFICIENTMEMORY
Definition: winerror.h:3665
#define INET_E_DOWNLOAD_FAILURE
Definition: winerror.h:4658
#define E_ABORT
Definition: winerror.h:3481
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
BOOL WINAPI TranslateMessage(_In_ const MSG *)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
DWORD WINAPI MsgWaitForMultipleObjects(_In_ DWORD nCount, _In_reads_opt_(nCount) CONST HANDLE *pHandles, _In_ BOOL fWaitAll, _In_ DWORD dwMilliseconds, _In_ DWORD dwWakeMask)
#define PM_NOYIELD
Definition: winuser.h:1208
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define PM_REMOVE
Definition: winuser.h:1207
#define QS_POSTMESSAGE
Definition: winuser.h:888
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define WM_USER
Definition: winuser.h:1923
unsigned char BYTE
Definition: xxhash.c:193