ReactOS 0.4.16-dev-2491-g3dc6630
session.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 Hans Leidekker 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 <stdarg.h>
20
21#include "windef.h"
22#include "winbase.h"
23#include "winsock2.h"
24#include "ws2ipdef.h"
25#include "ws2tcpip.h"
26#include "winhttp.h"
27#include "winreg.h"
28#include "winternl.h"
29#include "iphlpapi.h"
30#include "dhcpcsdk.h"
31#define COBJMACROS
32#include "ole2.h"
33#include "dispex.h"
34#include "activscp.h"
35
36#include "wine/debug.h"
37#include "winhttp_private.h"
38
40
41#define DEFAULT_RESOLVE_TIMEOUT 0
42#define DEFAULT_CONNECT_TIMEOUT 20000
43#define DEFAULT_SEND_TIMEOUT 30000
44#define DEFAULT_RECEIVE_TIMEOUT 30000
45#define DEFAULT_RECEIVE_RESPONSE_TIMEOUT ~0u
46
47void send_callback( struct object_header *hdr, DWORD status, void *info, DWORD buflen )
48{
49 if (hdr->callback && (hdr->notify_mask & status))
50 {
51 TRACE( "%p, %#lx, %p, %lu, %lu\n", hdr, status, info, buflen, hdr->recursion_count );
52 InterlockedIncrement( &hdr->recursion_count );
53 hdr->callback( hdr->handle, hdr->context, status, info, buflen );
54 InterlockedDecrement( &hdr->recursion_count );
55 TRACE("returning from %#lx callback\n", status);
56 }
57}
58
59/***********************************************************************
60 * WinHttpCheckPlatform (winhttp.@)
61 */
63{
64 TRACE("\n");
65 return TRUE;
66}
67
68static void session_destroy( struct object_header *hdr )
69{
70 struct session *session = (struct session *)hdr;
71
72 TRACE("%p\n", session);
73
76
77 session->cs.DebugInfo->Spare[0] = 0;
79 free( session->agent );
84 free( session );
85}
86
87static BOOL validate_buffer( void *buffer, DWORD *buflen, DWORD required )
88{
89 if (!buffer || *buflen < required)
90 {
91 *buflen = required;
93 return FALSE;
94 }
95 return TRUE;
96}
97
99{
100 struct session *session = (struct session *)hdr;
101
102 switch (option)
103 {
105 {
106 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
107
108 *(DWORD *)buffer = hdr->redirect_policy;
109 *buflen = sizeof(DWORD);
110 return TRUE;
111 }
113 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
114
116 *buflen = sizeof(DWORD);
117 return TRUE;
118
120 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
121
123 *buflen = sizeof(DWORD);
124 return TRUE;
125
127 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
128
130 *buflen = sizeof(DWORD);
131 return TRUE;
132
134 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
135
137 *buflen = sizeof(DWORD);
138 return TRUE;
139
141 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
142
144 *buflen = sizeof(DWORD);
145 return TRUE;
146
148 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
149
151 *buflen = sizeof(DWORD);
152 return TRUE;
153
155 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
156
158 *buflen = sizeof(DWORD);
159 return TRUE;
160
161 default:
162 FIXME( "unimplemented option %lu\n", option );
164 return FALSE;
165 }
166}
167
169{
170 struct session *session = (struct session *)hdr;
171
172 switch (option)
173 {
175 {
177
178 FIXME( "%lu %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass) );
179 return TRUE;
180 }
182 {
184
185 if (buflen != sizeof(policy))
186 {
188 return FALSE;
189 }
190
191 policy = *(DWORD *)buffer;
192 TRACE( "%#lx\n", policy );
193 hdr->redirect_policy = policy;
194 return TRUE;
195 }
197 {
198 if (buflen != sizeof(session->secure_protocols))
199 {
201 return FALSE;
202 }
206 TRACE( "%#lx\n", session->secure_protocols );
207 return TRUE;
208 }
211 return FALSE;
212
215 return TRUE;
216
219 return TRUE;
220
223 return TRUE;
224
227 return TRUE;
228
231 return TRUE;
232
235 return TRUE;
236
238 TRACE("WINHTTP_OPTION_UNLOAD_NOTIFY_EVENT: %p\n", *(HANDLE *)buffer);
240 return TRUE;
241
243 FIXME( "WINHTTP_OPTION_MAX_CONNS_PER_SERVER: %lu\n", *(DWORD *)buffer );
244 return TRUE;
245
247 FIXME( "WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER: %lu\n", *(DWORD *)buffer );
248 return TRUE;
249
251 {
253
254 if (buflen != sizeof(buffer_size))
255 {
257 return FALSE;
258 }
259
261 TRACE( "%#lx\n", buffer_size );
263 return TRUE;
264 }
265
267 {
269
270 if (buflen != sizeof(buffer_size))
271 {
273 return FALSE;
274 }
275
277 TRACE( "%#lx\n", buffer_size );
279 return TRUE;
280 }
281
282 default:
283 FIXME( "unimplemented option %lu\n", option );
285 return FALSE;
286 }
287}
288
289static const struct object_vtbl session_vtbl =
290{
291 NULL,
295};
296
297#ifdef __REACTOS__
298void winsock_init(void);
299#endif
300
301/***********************************************************************
302 * WinHttpOpen (winhttp.@)
303 */
305{
306 struct session *session;
308
309 TRACE( "%s, %lu, %s, %s, %#lx\n", debugstr_w(agent), access, debugstr_w(proxy), debugstr_w(bypass), flags );
310
311 if (!(session = calloc( 1, sizeof(*session) ))) return NULL;
312
314 session->hdr.vtbl = &session_vtbl;
315 session->hdr.flags = flags;
316 session->hdr.refs = 1;
327 session->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": session.cs");
328
329 if (agent && !(session->agent = wcsdup( agent ))) goto end;
331 {
333
335 session->access = info.dwAccessType;
336 if (info.lpszProxy && !(session->proxy_server = wcsdup( info.lpszProxy )))
337 {
338 GlobalFree( info.lpszProxy );
339 GlobalFree( info.lpszProxyBypass );
340 goto end;
341 }
342 if (info.lpszProxyBypass && !(session->proxy_bypass = wcsdup( info.lpszProxyBypass )))
343 {
344 GlobalFree( info.lpszProxy );
345 GlobalFree( info.lpszProxyBypass );
346 goto end;
347 }
348 }
350 {
352 if (proxy && !(session->proxy_server = wcsdup( proxy ))) goto end;
353 if (bypass && !(session->proxy_bypass = wcsdup( bypass ))) goto end;
354 }
355
357
358#ifdef __REACTOS__
359 winsock_init();
360#endif
361
362end:
364 TRACE("returning %p\n", handle);
366 return handle;
367}
368
369static void connect_destroy( struct object_header *hdr )
370{
371 struct connect *connect = (struct connect *)hdr;
372
373 TRACE("%p\n", connect);
374
376
381 free( connect );
382}
383
385{
386 struct connect *connect = (struct connect *)hdr;
387
388 switch (option)
389 {
391 {
392 if (!validate_buffer( buffer, buflen, sizeof(HINTERNET) )) return FALSE;
393
394 *(HINTERNET *)buffer = connect->session->hdr.handle;
395 *buflen = sizeof(HINTERNET);
396 return TRUE;
397 }
399 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
400
401 *(DWORD *)buffer = connect->session->resolve_timeout;
402 *buflen = sizeof(DWORD);
403 return TRUE;
404
406 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
407
408 *(DWORD *)buffer = connect->session->connect_timeout;
409 *buflen = sizeof(DWORD);
410 return TRUE;
411
413 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
414
415 *(DWORD *)buffer = connect->session->send_timeout;
416 *buflen = sizeof(DWORD);
417 return TRUE;
418
420 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
421
422 *(DWORD *)buffer = connect->session->receive_timeout;
423 *buflen = sizeof(DWORD);
424 return TRUE;
425
427 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
428
429 *(DWORD *)buffer = connect->session->receive_response_timeout;
430 *buflen = sizeof(DWORD);
431 return TRUE;
432
433 default:
434 FIXME( "unimplemented option %lu\n", option );
436 return FALSE;
437 }
438}
439
440static const struct object_vtbl connect_vtbl =
441{
442 NULL,
445 NULL
446};
447
449{
450 BOOL ret = FALSE;
451
452 if (!wcsicmp( domain, L"<local>" ) && !wcschr( server, '.' ))
453 ret = TRUE;
454 else if (*domain == '*')
455 {
456 if (domain[1] == '.')
457 {
458 LPCWSTR dot;
459
460 /* For a hostname to match a wildcard, the last domain must match
461 * the wildcard exactly. E.g. if the wildcard is *.a.b, and the
462 * hostname is www.foo.a.b, it matches, but a.b does not.
463 */
464 dot = wcschr( server, '.' );
465 if (dot)
466 {
467 int len = lstrlenW( dot + 1 );
468
469 if (len > lstrlenW( domain + 2 ))
470 {
471 LPCWSTR ptr;
472
473 /* The server's domain is longer than the wildcard, so it
474 * could be a subdomain. Compare the last portion of the
475 * server's domain.
476 */
477 ptr = dot + len + 1 - lstrlenW( domain + 2 );
478 if (!wcsicmp( ptr, domain + 2 ))
479 {
480 /* This is only a match if the preceding character is
481 * a '.', i.e. that it is a matching domain. E.g.
482 * if domain is '*.b.c' and server is 'www.ab.c' they
483 * do not match.
484 */
485 ret = *(ptr - 1) == '.';
486 }
487 }
488 else
489 ret = !wcsicmp( dot + 1, domain + 2 );
490 }
491 }
492 }
493 else
494 ret = !wcsicmp( server, domain );
495 return ret;
496}
497
498/* Matches INTERNET_MAX_HOST_NAME_LENGTH in wininet.h, also RFC 1035 */
499#define MAX_HOST_NAME_LENGTH 256
500
502{
503 LPCWSTR ptr;
504 BOOL ret = FALSE;
505
506 if (!session->proxy_bypass) return FALSE;
508 do {
509 LPCWSTR tmp = ptr;
510
511 ptr = wcschr( ptr, ';' );
512 if (!ptr)
513 ptr = wcschr( tmp, ' ' );
514 if (ptr)
515 {
516 if (ptr - tmp < MAX_HOST_NAME_LENGTH)
517 {
519
520 memcpy( domain, tmp, (ptr - tmp) * sizeof(WCHAR) );
521 domain[ptr - tmp] = 0;
523 }
524 ptr += 1;
525 }
526 else if (*tmp)
527 ret = domain_matches( server, tmp );
528 } while (ptr && !ret);
529 return ret;
530}
531
533{
534 struct session *session = connect->session;
535 BOOL ret = TRUE;
536
538 {
539 LPCWSTR colon;
540
541 if ((colon = wcschr( session->proxy_server, ':' )))
542 {
544 session->proxy_server, colon - session->proxy_server - 1 ))
545 {
548 if (!(connect->servername = malloc( (colon - session->proxy_server + 1) * sizeof(WCHAR) )))
549 {
550 ret = FALSE;
551 goto end;
552 }
554 connect->servername[colon - session->proxy_server] = 0;
555 if (*(colon + 1))
556 connect->serverport = wcstol( colon + 1, NULL, 10 );
557 else
559 }
560 }
561 else
562 {
564 {
568 {
569 ret = FALSE;
570 goto end;
571 }
573 }
574 }
575 }
576 else if (server)
577 {
580 if (!(connect->servername = wcsdup( server )))
581 {
582 ret = FALSE;
583 goto end;
584 }
586 }
587end:
588 return ret;
589}
590
591/***********************************************************************
592 * WinHttpConnect (winhttp.@)
593 */
595{
596 struct connect *connect;
597 struct session *session;
598 HINTERNET hconnect = NULL;
599
600 TRACE( "%p, %s, %u, %#lx\n", hsession, debugstr_w(server), port, reserved );
601
602 if (!server)
603 {
605 return NULL;
606 }
607 if (!(session = (struct session *)grab_object( hsession )))
608 {
610 return NULL;
611 }
613 {
616 return NULL;
617 }
618 if (!(connect = calloc( 1, sizeof(*connect) )))
619 {
621 return NULL;
622 }
624 connect->hdr.vtbl = &connect_vtbl;
625 connect->hdr.refs = 1;
626 connect->hdr.flags = session->hdr.flags;
627 connect->hdr.callback = session->hdr.callback;
628 connect->hdr.notify_mask = session->hdr.notify_mask;
629 connect->hdr.context = session->hdr.context;
630 connect->hdr.redirect_policy = session->hdr.redirect_policy;
631
634
635 if (!(connect->hostname = wcsdup( server ))) goto end;
638
639 if ((hconnect = alloc_handle( &connect->hdr )))
640 {
641 send_callback( &session->hdr, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, &hconnect, sizeof(hconnect) );
642 }
643
644end:
647 TRACE("returning %p\n", hconnect);
648 if (hconnect) SetLastError( ERROR_SUCCESS );
649 return hconnect;
650}
651
652static void request_destroy( struct object_header *hdr )
653{
654 struct request *request = (struct request *)hdr;
655 unsigned int i, j;
656
657 TRACE("%p\n", request);
658
661
665
668
669 free( request->verb );
670 free( request->path );
671 free( request->version );
674 for (i = 0; i < request->num_headers; i++)
675 {
676 free( request->headers[i].field );
677 free( request->headers[i].value );
678 }
679 free( request->headers );
680 for (i = 0; i < TARGET_MAX; i++)
681 {
682 for (j = 0; j < SCHEME_MAX; j++)
683 {
684 free( request->creds[i][j].username );
685 free( request->creds[i][j].password );
686 }
687 }
688
689 free( request );
690}
691
693{
694 int len = sizeof(WCHAR);
695 if (str) len += lstrlenW( str ) * sizeof(WCHAR);
696 if (buffer && *buflen >= len)
697 {
698 if (str) memcpy( buffer, str, len );
699 len -= sizeof(WCHAR);
700 buffer[len / sizeof(WCHAR)] = 0;
701 *buflen = len;
702 return TRUE;
703 }
704 else
705 {
706 *buflen = len;
708 return FALSE;
709 }
710}
711
713{
714 WCHAR *ret;
716
717 size = CertNameToStrW( encoding, blob, format, NULL, 0 );
718 if ((ret = LocalAlloc( 0, size * sizeof(WCHAR) )))
719 CertNameToStrW( encoding, blob, format, ret, size );
720
721 return ret;
722}
723
724static BOOL copy_sockaddr( const struct sockaddr *addr, SOCKADDR_STORAGE *addr_storage )
725{
726 switch (addr->sa_family)
727 {
728 case AF_INET:
729 {
730 struct sockaddr_in *addr_in = (struct sockaddr_in *)addr_storage;
731
732 memcpy( addr_in, addr, sizeof(*addr_in) );
733 memset( addr_in + 1, 0, sizeof(*addr_storage) - sizeof(*addr_in) );
734 return TRUE;
735 }
736 case AF_INET6:
737 {
738 struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)addr_storage;
739
740 memcpy( addr_in6, addr, sizeof(*addr_in6) );
741 memset( addr_in6 + 1, 0, sizeof(*addr_storage) - sizeof(*addr_in6) );
742 return TRUE;
743 }
744 default:
745 ERR("unhandled family %u\n", addr->sa_family);
746 return FALSE;
747 }
748}
749
750static WCHAR *build_url( struct request *request )
751{
753 DWORD len = 0;
754 WCHAR *ret;
755
756 memset( &uc, 0, sizeof(uc) );
757 uc.dwStructSize = sizeof(uc);
759 uc.lpszHostName = request->connect->hostname;
761 uc.nPort = request->connect->hostport;
762 uc.lpszUserName = request->connect->username;
763 uc.dwUserNameLength = request->connect->username ? wcslen( request->connect->username ) : 0;
764 uc.lpszPassword = request->connect->password;
765 uc.dwPasswordLength = request->connect->password ? wcslen( request->connect->password ) : 0;
768
769 WinHttpCreateUrl( &uc, 0, NULL, &len );
770 if (GetLastError() != ERROR_INSUFFICIENT_BUFFER || !(ret = malloc( len * sizeof(WCHAR) ))) return NULL;
771
772 if (WinHttpCreateUrl( &uc, 0, ret, &len )) return ret;
773 free( ret );
774 return NULL;
775}
776
778{
779 struct request *request = (struct request *)hdr;
780
781 switch (option)
782 {
784 {
785 if (!validate_buffer( buffer, buflen, sizeof(HINTERNET) )) return FALSE;
786
787 *(HINTERNET *)buffer = request->connect->hdr.handle;
788 *buflen = sizeof(HINTERNET);
789 return TRUE;
790 }
792 {
793 DWORD flags;
794 int bits;
795
796 if (!validate_buffer( buffer, buflen, sizeof(flags) )) return FALSE;
797
799 if (request->netconn)
800 {
802 if (bits >= 128)
804 else if (bits >= 56)
806 else
808 }
809 *(DWORD *)buffer = flags;
810 *buflen = sizeof(flags);
811 return TRUE;
812 }
814 {
815 const CERT_CONTEXT *cert;
816
817 if (!validate_buffer( buffer, buflen, sizeof(cert) )) return FALSE;
818
821 *buflen = sizeof(cert);
822 return TRUE;
823 }
825 {
827 const CRYPT_OID_INFO *oidInfo;
829
830 FIXME("partial stub\n");
831
832 if (!validate_buffer( buffer, buflen, sizeof(*ci) ) || !cert) return FALSE;
833
834 ci->ftExpiry = cert->pCertInfo->NotAfter;
835 ci->ftStart = cert->pCertInfo->NotBefore;
836 ci->lpszSubjectInfo = blob_to_str( cert->dwCertEncodingType, &cert->pCertInfo->Subject );
837 ci->lpszIssuerInfo = blob_to_str( cert->dwCertEncodingType, &cert->pCertInfo->Issuer );
839 oidInfo = CryptFindOIDInfo( CRYPT_OID_INFO_OID_KEY, cert->pCertInfo->SignatureAlgorithm.pszObjId, 0 );
840 if (oidInfo)
841 ci->lpszSignatureAlgName = (LPWSTR)oidInfo->pwszName;
842 else
846
847 *buflen = sizeof(*ci);
848 return TRUE;
849 }
851 {
852 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
853
855 *buflen = sizeof(DWORD);
856 return TRUE;
857 }
859 {
860 WINHTTP_CONNECTION_INFO *info = buffer;
861 struct sockaddr local;
862 socklen_t len = sizeof(local);
863 const struct sockaddr *remote = (const struct sockaddr *)&request->connect->sockaddr;
864
865 if (!validate_buffer( buffer, buflen, sizeof(*info) )) return FALSE;
866
867 if (!request->netconn)
868 {
870 return FALSE;
871 }
872 if (getsockname( request->netconn->socket, &local, &len )) return FALSE;
873 if (!copy_sockaddr( &local, &info->LocalAddress )) return FALSE;
874 if (!copy_sockaddr( remote, &info->RemoteAddress )) return FALSE;
875 info->cbSize = sizeof(*info);
876 return TRUE;
877 }
879 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
880
882 *buflen = sizeof(DWORD);
883 return TRUE;
884
886 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
887
889 *buflen = sizeof(DWORD);
890 return TRUE;
891
893 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
894
896 *buflen = sizeof(DWORD);
897 return TRUE;
898
900 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
901
903 *buflen = sizeof(DWORD);
904 return TRUE;
905
907 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
908
910 *buflen = sizeof(DWORD);
911 return TRUE;
912
914 return return_string_option( buffer, request->connect->username, buflen );
915
917 return return_string_option( buffer, request->connect->password, buflen );
918
920 return return_string_option( buffer, request->connect->session->proxy_username, buflen );
921
923 return return_string_option( buffer, request->connect->session->proxy_password, buflen );
924
926 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
927
929 *buflen = sizeof(DWORD);
930 return TRUE;
931
933 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
934
935 FIXME("WINHTTP_OPTION_HTTP_PROTOCOL_USED\n");
936 *(DWORD *)buffer = 0;
937 *buflen = sizeof(DWORD);
938 return TRUE;
939
941 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
942
944 *buflen = sizeof(DWORD);
945 return TRUE;
946
948 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
949
951 *buflen = sizeof(DWORD);
952 return TRUE;
953
955 {
956 WCHAR *url;
957 BOOL ret;
958
959 if (!(url = build_url( request ))) return FALSE;
960 ret = return_string_option( buffer, url, buflen );
961 free( url );
962 return ret;
963 }
964
965 default:
966 FIXME( "unimplemented option %lu\n", option );
968 return FALSE;
969 }
970}
971
973{
974 WCHAR *ret;
975 if ((ret = malloc( (buflen + 1) * sizeof(WCHAR))))
976 {
977 memcpy( ret, buffer, buflen * sizeof(WCHAR) );
978 ret[buflen] = 0;
979 return ret;
980 }
982 return NULL;
983}
984
986{
987 struct request *request = (struct request *)hdr;
988
989 switch (option)
990 {
992 {
994
995 FIXME( "%lu %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass) );
996 return TRUE;
997 }
999 {
1000 DWORD disable;
1001
1002 if (buflen != sizeof(DWORD))
1003 {
1005 return FALSE;
1006 }
1007
1008 disable = *(DWORD *)buffer;
1009 TRACE( "%#lx\n", disable );
1010 hdr->disable_flags |= disable;
1011 return TRUE;
1012 }
1014 {
1015 DWORD policy;
1016
1017 if (buflen != sizeof(DWORD))
1018 {
1020 return FALSE;
1021 }
1022
1023 policy = *(DWORD *)buffer;
1024 TRACE( "%#lx\n", policy );
1025 hdr->logon_policy = policy;
1026 return TRUE;
1027 }
1029 {
1030 DWORD policy;
1031
1032 if (buflen != sizeof(DWORD))
1033 {
1035 return FALSE;
1036 }
1037
1038 policy = *(DWORD *)buffer;
1039 TRACE( "%#lx\n", policy );
1040 hdr->redirect_policy = policy;
1041 return TRUE;
1042 }
1044 {
1045 DWORD flags;
1050
1051 if (buflen < sizeof(DWORD))
1052 {
1054 return FALSE;
1055 }
1056 flags = *(DWORD *)buffer;
1057 TRACE( "%#lx\n", flags );
1058 if (flags && (flags & ~accepted))
1059 {
1061 return FALSE;
1062 }
1064 return TRUE;
1065 }
1068 return TRUE;
1069
1072 return TRUE;
1073
1076 return TRUE;
1077
1080 return TRUE;
1081
1084 return TRUE;
1085
1087 {
1088 struct connect *connect = request->connect;
1089
1090 free( connect->username );
1091 if (!(connect->username = buffer_to_str( buffer, buflen ))) return FALSE;
1092 return TRUE;
1093 }
1095 {
1096 struct connect *connect = request->connect;
1097
1098 free( connect->password );
1099 if (!(connect->password = buffer_to_str( buffer, buflen ))) return FALSE;
1100 return TRUE;
1101 }
1103 {
1104 struct session *session = request->connect->session;
1105
1107 if (!(session->proxy_username = buffer_to_str( buffer, buflen ))) return FALSE;
1108 return TRUE;
1109 }
1111 {
1112 struct session *session = request->connect->session;
1113
1115 if (!(session->proxy_password = buffer_to_str( buffer, buflen ))) return FALSE;
1116 return TRUE;
1117 }
1119 {
1120 const CERT_CONTEXT *cert;
1121
1122 if (!(hdr->flags & WINHTTP_FLAG_SECURE))
1123 {
1125 return FALSE;
1126 }
1127 if (!buffer)
1128 {
1131 }
1132 else if (buflen >= sizeof(*cert))
1133 {
1137 }
1138 else
1139 {
1141 return FALSE;
1142 }
1143
1145 {
1148 }
1149
1150 return TRUE;
1151 }
1153 if(buflen == sizeof( DWORD ) && *(DWORD *)buffer == WINHTTP_ENABLE_SSL_REVOCATION)
1154 {
1157 return TRUE;
1158 }
1159 else
1160 {
1162 return FALSE;
1163 }
1164
1167 return TRUE;
1168
1170 FIXME("WINHTTP_OPTION_CONNECT_RETRIES\n");
1171 return TRUE;
1172
1174 if (buflen == sizeof(DWORD))
1175 {
1178 return TRUE;
1179 }
1180
1182 return FALSE;
1183
1185 FIXME("WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE\n");
1186 return TRUE;
1187
1189 FIXME("WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE\n");
1190 return TRUE;
1191
1193 if (buflen == sizeof(DWORD))
1194 {
1195 FIXME( "WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL %#lx\n", *(DWORD *)buffer );
1196 return TRUE;
1197 }
1199 return FALSE;
1200
1202 {
1204
1205 if (buflen != sizeof(buffer_size))
1206 {
1208 return FALSE;
1209 }
1210
1211 buffer_size = *(DWORD *)buffer;
1212 WARN( "Setting websocket receive buffer size currently has not effct, size %lu\n", buffer_size );
1214 return TRUE;
1215 }
1216
1218 {
1220
1221 if (buflen != sizeof(buffer_size))
1222 {
1224 return FALSE;
1225 }
1226
1227 buffer_size = *(DWORD *)buffer;
1229 TRACE( "Websocket send buffer size %lu.\n", buffer_size);
1230 return TRUE;
1231 }
1232
1233 default:
1234 FIXME( "unimplemented option %lu\n", option );
1236 return FALSE;
1237 }
1238}
1239
1240static const struct object_vtbl request_vtbl =
1241{
1242 NULL,
1246};
1247
1249{
1251
1252 if (!types) return TRUE;
1253 while (*types)
1254 {
1255 if (process_header( request, L"Accept", *types, flags, TRUE )) return FALSE;
1256 types++;
1257 }
1258 return TRUE;
1259}
1260
1261static WCHAR *get_request_path( const WCHAR *object )
1262{
1263 int len = object ? lstrlenW(object) : 0;
1264 WCHAR *p, *ret;
1265
1266 if (!object || object[0] != '/') len++;
1267 if (!(p = ret = malloc( (len + 1) * sizeof(WCHAR) ))) return NULL;
1268 if (!object || object[0] != '/') *p++ = '/';
1269 if (object) lstrcpyW( p, object );
1270 ret[len] = 0;
1271 return ret;
1272}
1273
1274/***********************************************************************
1275 * WinHttpOpenRequest (winhttp.@)
1276 */
1277HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, const WCHAR *verb, const WCHAR *object, const WCHAR *version,
1278 const WCHAR *referrer, const WCHAR **types, DWORD flags )
1279{
1280 struct request *request;
1281 struct connect *connect;
1282 HINTERNET hrequest = NULL;
1283
1284 TRACE( "%p, %s, %s, %s, %s, %p, %#lx\n", hconnect, debugstr_w(verb), debugstr_w(object),
1285 debugstr_w(version), debugstr_w(referrer), types, flags );
1286
1287 if (types && TRACE_ON(winhttp))
1288 {
1289 const WCHAR **iter;
1290 TRACE("accept types:\n");
1291 for (iter = types; *iter; iter++) TRACE(" %s\n", debugstr_w(*iter));
1292 }
1293
1294 if (!(connect = (struct connect *)grab_object( hconnect )))
1295 {
1297 return NULL;
1298 }
1300 {
1303 return NULL;
1304 }
1305 if (!(request = calloc( 1, sizeof(*request) )))
1306 {
1308 return NULL;
1309 }
1311 request->hdr.vtbl = &request_vtbl;
1312 request->hdr.refs = 1;
1313 request->hdr.flags = flags;
1314 request->hdr.callback = connect->hdr.callback;
1315 request->hdr.notify_mask = connect->hdr.notify_mask;
1316 request->hdr.context = connect->hdr.context;
1317 request->hdr.redirect_policy = connect->hdr.redirect_policy;
1319
1322
1323 request->resolve_timeout = connect->session->resolve_timeout;
1324 request->connect_timeout = connect->session->connect_timeout;
1325 request->send_timeout = connect->session->send_timeout;
1326 request->receive_timeout = connect->session->receive_timeout;
1327 request->receive_response_timeout = connect->session->receive_response_timeout;
1328 request->max_redirects = 10;
1329 request->websocket_receive_buffer_size = connect->session->websocket_receive_buffer_size;
1330 request->websocket_send_buffer_size = connect->session->websocket_send_buffer_size;
1333
1334 if (!verb || !verb[0]) verb = L"GET";
1335 if (!(request->verb = wcsdup( verb ))) goto end;
1336 if (!(request->path = get_request_path( object ))) goto end;
1337
1338 if (!version || !version[0]) version = L"HTTP/1.1";
1339 if (!(request->version = wcsdup( version ))) goto end;
1340 if (!(add_accept_types_header( request, types ))) goto end;
1341
1342 if ((hrequest = alloc_handle( &request->hdr )))
1343 {
1344 send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, &hrequest, sizeof(hrequest) );
1345 }
1346
1347end:
1350 TRACE("returning %p\n", hrequest);
1351 if (hrequest) SetLastError( ERROR_SUCCESS );
1352 return hrequest;
1353}
1354
1355/***********************************************************************
1356 * WinHttpCloseHandle (winhttp.@)
1357 */
1359{
1360 struct object_header *hdr;
1361
1362 TRACE("%p\n", handle);
1363
1364 if (!(hdr = grab_object( handle )))
1365 {
1367 return FALSE;
1368 }
1372 return TRUE;
1373}
1374
1375static BOOL query_option( struct object_header *hdr, DWORD option, void *buffer, DWORD *buflen )
1376{
1377 BOOL ret = FALSE;
1378
1379 if (!buflen)
1380 {
1382 return FALSE;
1383 }
1384
1385 switch (option)
1386 {
1388 {
1389 FIXME( "WINHTTP_OPTION_WORKER_THREAD_COUNT semi-stub.\n" );
1390 if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE;
1391
1392 *(DWORD *)buffer = 0;
1393 *buflen = sizeof(DWORD);
1394 return TRUE;
1395 }
1397 {
1398 if (!validate_buffer( buffer, buflen, sizeof(DWORD_PTR) )) return FALSE;
1399
1400 *(DWORD_PTR *)buffer = hdr->context;
1401 *buflen = sizeof(DWORD_PTR);
1402 return TRUE;
1403 }
1404 default:
1405 if (hdr->vtbl->query_option) ret = hdr->vtbl->query_option( hdr, option, buffer, buflen );
1406 else
1407 {
1408 FIXME( "unimplemented option %lu\n", option );
1410 return FALSE;
1411 }
1412 break;
1413 }
1414 return ret;
1415}
1416
1417/***********************************************************************
1418 * WinHttpQueryOption (winhttp.@)
1419 */
1421{
1422 BOOL ret = FALSE;
1423 struct object_header *hdr;
1424
1425 TRACE( "%p, %lu, %p, %p\n", handle, option, buffer, buflen );
1426
1427 if (!(hdr = grab_object( handle )))
1428 {
1430 return FALSE;
1431 }
1432
1433 ret = query_option( hdr, option, buffer, buflen );
1434
1437 return ret;
1438}
1439
1440static BOOL set_option( struct object_header *hdr, DWORD option, void *buffer, DWORD buflen )
1441{
1442 BOOL ret = TRUE;
1443
1444 if (!buffer && buflen)
1445 {
1447 return FALSE;
1448 }
1449
1450 switch (option)
1451 {
1453 {
1454 if (buflen != sizeof(DWORD_PTR))
1455 {
1457 return FALSE;
1458 }
1459
1460 hdr->context = *(DWORD_PTR *)buffer;
1461 return TRUE;
1462 }
1463 default:
1464 if (hdr->vtbl->set_option) ret = hdr->vtbl->set_option( hdr, option, buffer, buflen );
1465 else
1466 {
1467 FIXME( "unimplemented option %lu\n", option );
1469 return FALSE;
1470 }
1471 break;
1472 }
1473 return ret;
1474}
1475
1476/***********************************************************************
1477 * WinHttpSetOption (winhttp.@)
1478 */
1480{
1481 BOOL ret = FALSE;
1482 struct object_header *hdr;
1483
1484 TRACE( "%p, %lu, %p, %lu\n", handle, option, buffer, buflen );
1485
1486 if (!(hdr = grab_object( handle )))
1487 {
1489 return FALSE;
1490 }
1491
1492 ret = set_option( hdr, option, buffer, buflen );
1493
1496 return ret;
1497}
1498
1499static IP_ADAPTER_ADDRESSES *get_adapters(void)
1500{
1501 ULONG err, size = 1024, flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST |
1502 GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME;
1503 IP_ADAPTER_ADDRESSES *tmp, *ret;
1504
1505 if (!(ret = malloc( size ))) return NULL;
1506 err = GetAdaptersAddresses( AF_UNSPEC, flags, NULL, ret, &size );
1507 while (err == ERROR_BUFFER_OVERFLOW)
1508 {
1509 if (!(tmp = realloc( ret, size ))) break;
1510 ret = tmp;
1511 err = GetAdaptersAddresses( AF_UNSPEC, flags, NULL, ret, &size );
1512 }
1513 if (err == ERROR_SUCCESS) return ret;
1514 free( ret );
1515 return NULL;
1516}
1517
1519{
1520 IP_ADAPTER_ADDRESSES *adapters, *ptr;
1521 DHCPCAPI_PARAMS_ARRAY send_params, recv_params;
1524 DWORD err, size;
1525 BYTE *tmp, *buf = NULL;
1526
1527 if (!(adapters = get_adapters())) return NULL;
1528
1529 memset( &send_params, 0, sizeof(send_params) );
1530 memset( &param, 0, sizeof(param) );
1531 param.OptionId = OPTION_MSFT_IE_PROXY;
1532 recv_params.nParams = 1;
1533 recv_params.Params = &param;
1534
1535 for (ptr = adapters; ptr; ptr = ptr->Next)
1536 {
1537 MultiByteToWideChar( CP_ACP, 0, ptr->AdapterName, -1, name, ARRAY_SIZE(name) );
1538 TRACE( "adapter '%s' type %lu dhcpv4 enabled %d\n", wine_dbgstr_w(name), ptr->IfType, ptr->Dhcpv4Enabled );
1539
1540 if (ptr->IfType == IF_TYPE_SOFTWARE_LOOPBACK) continue;
1541 /* FIXME: also skip adapters where DHCP is disabled */
1542
1543 size = 256;
1544 if (!(buf = malloc( size ))) goto done;
1545 err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, name, NULL, send_params, recv_params,
1546 buf, &size, NULL );
1547 while (err == ERROR_MORE_DATA)
1548 {
1549 if (!(tmp = realloc( buf, size ))) goto done;
1550 buf = tmp;
1551 err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, name, NULL, send_params, recv_params,
1552 buf, &size, NULL );
1553 }
1554 if (err == ERROR_SUCCESS && param.nBytesData)
1555 {
1556 int len = MultiByteToWideChar( CP_ACP, 0, (const char *)param.Data, param.nBytesData, NULL, 0 );
1557 if ((ret = malloc( (len + 1) * sizeof(WCHAR) )))
1558 {
1559 MultiByteToWideChar( CP_ACP, 0, (const char *)param.Data, param.nBytesData, ret, len );
1560 ret[len] = 0;
1561 }
1562 TRACE("returning %s\n", debugstr_w(ret));
1563 break;
1564 }
1565 }
1566
1567done:
1568 free( buf );
1569 free( adapters );
1570 return ret;
1571}
1572
1573static char *get_computer_name( COMPUTER_NAME_FORMAT format )
1574{
1575 char *ret;
1576 DWORD size = 0;
1577
1579 if (GetLastError() != ERROR_MORE_DATA) return NULL;
1580 if (!(ret = malloc( size ))) return NULL;
1581 if (!GetComputerNameExA( format, ret, &size ))
1582 {
1583 free( ret );
1584 return NULL;
1585 }
1586 return ret;
1587}
1588
1589static BOOL is_domain_suffix( const char *domain, const char *suffix )
1590{
1591 int len_domain = strlen( domain ), len_suffix = strlen( suffix );
1592
1593 if (len_suffix > len_domain) return FALSE;
1594 if (!stricmp( domain + len_domain - len_suffix, suffix )) return TRUE;
1595 return FALSE;
1596}
1597
1598static int reverse_lookup( const struct addrinfo *ai, char *hostname, size_t len )
1599{
1600 return getnameinfo( ai->ai_addr, ai->ai_addrlen, hostname, len, NULL, 0, 0 );
1601}
1602
1603static WCHAR *build_wpad_url( const char *hostname, const struct addrinfo *ai )
1604{
1605 char name[NI_MAXHOST];
1606 WCHAR *ret, *p;
1607 int len;
1608
1609 while (ai && ai->ai_family != AF_INET && ai->ai_family != AF_INET6) ai = ai->ai_next;
1610 if (!ai) return NULL;
1611
1612 if (!reverse_lookup( ai, name, sizeof(name) )) hostname = name;
1613
1614 len = lstrlenW( L"http://" ) + strlen( hostname ) + lstrlenW( L"/wpad.dat" );
1615 if (!(ret = p = GlobalAlloc( 0, (len + 1) * sizeof(WCHAR) ))) return NULL;
1616 lstrcpyW( p, L"http://" );
1617 p += lstrlenW( L"http://" );
1618 while (*hostname) { *p++ = *hostname++; }
1619 lstrcpyW( p, L"/wpad.dat" );
1620 return ret;
1621}
1622
1624{
1625 char *fqdn, *domain, *p;
1626 WCHAR *ret = NULL;
1627
1628 if (!(fqdn = get_computer_name( ComputerNamePhysicalDnsFullyQualified ))) return NULL;
1629 if (!(domain = get_computer_name( ComputerNamePhysicalDnsDomain )))
1630 {
1631 free( fqdn );
1632 return NULL;
1633 }
1634 p = fqdn;
1635 while ((p = strchr( p, '.' )) && is_domain_suffix( p + 1, domain ))
1636 {
1637 char *name;
1638 struct addrinfo *ai, hints;
1639 int res;
1640
1641 if (!(name = malloc( sizeof("wpad") + strlen(p) )))
1642 {
1643 free( fqdn );
1644 free( domain );
1645 return NULL;
1646 }
1647 strcpy( name, "wpad" );
1648 strcat( name, p );
1649 memset( &hints, 0, sizeof(hints) );
1650 hints.ai_flags = AI_ALL | AI_DNS_ONLY;
1651 hints.ai_family = AF_UNSPEC;
1652 res = getaddrinfo( name, NULL, &hints, &ai );
1653 if (!res)
1654 {
1655 ret = build_wpad_url( name, ai );
1656 freeaddrinfo( ai );
1657 if (ret)
1658 {
1659 TRACE("returning %s\n", debugstr_w(ret));
1660 free( name );
1661 break;
1662 }
1663 }
1664 free( name );
1665 p++;
1666 }
1667 free( domain );
1668 free( fqdn );
1669 return ret;
1670}
1671
1672/***********************************************************************
1673 * WinHttpDetectAutoProxyConfigUrl (winhttp.@)
1674 */
1676{
1677 TRACE( "%#lx, %p\n", flags, url );
1678
1679 if (!flags || !url)
1680 {
1682 return FALSE;
1683 }
1684 *url = NULL;
1686 {
1688 }
1690 {
1692 }
1693 if (!*url)
1694 {
1696 return FALSE;
1697 }
1699 return TRUE;
1700}
1701
1702static const WCHAR path_connections[] =
1703 L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections";
1704
1705static const DWORD WINHTTP_SETTINGS_MAGIC = 0x18;
1706static const DWORD WININET_SETTINGS_MAGIC = 0x46;
1707static const DWORD PROXY_TYPE_DIRECT = 1;
1708static const DWORD PROXY_TYPE_PROXY = 2;
1711
1713{
1715 DWORD unknown; /* always zero? */
1716 DWORD flags; /* one or more of PROXY_* */
1717};
1718
1719static inline void copy_char_to_wchar_sz(const BYTE *src, DWORD len, WCHAR *dst)
1720{
1721 const BYTE *begin;
1722
1723 for (begin = src; src - begin < len; src++, dst++)
1724 *dst = *src;
1725 *dst = 0;
1726}
1727
1728/***********************************************************************
1729 * WinHttpGetDefaultProxyConfiguration (winhttp.@)
1730 */
1732{
1733 LONG l;
1734 HKEY key;
1735 BOOL got_from_reg = FALSE, direct = TRUE;
1736 WCHAR *envproxy;
1737
1738 TRACE("%p\n", info);
1739
1741 if (!l)
1742 {
1743 DWORD type, size = 0;
1744
1745 l = RegQueryValueExW( key, L"WinHttpSettings", NULL, &type, NULL, &size );
1746 if (!l && type == REG_BINARY &&
1747 size >= sizeof(struct connection_settings_header) + 2 * sizeof(DWORD))
1748 {
1749 BYTE *buf = malloc( size );
1750
1751 if (buf)
1752 {
1755 DWORD *len = (DWORD *)(hdr + 1);
1756
1757 l = RegQueryValueExW( key, L"WinHttpSettings", NULL, NULL, buf,
1758 &size );
1759 if (!l && hdr->magic == WINHTTP_SETTINGS_MAGIC &&
1760 hdr->unknown == 0)
1761 {
1762 if (hdr->flags & PROXY_TYPE_PROXY)
1763 {
1764 BOOL sane = FALSE;
1765 LPWSTR proxy = NULL;
1766 LPWSTR proxy_bypass = NULL;
1767
1768 /* Sanity-check length of proxy string */
1769 if ((BYTE *)len - buf + *len <= size)
1770 {
1771 sane = TRUE;
1772 proxy = GlobalAlloc( 0, (*len + 1) * sizeof(WCHAR) );
1773 if (proxy)
1774 copy_char_to_wchar_sz( (BYTE *)(len + 1), *len, proxy );
1775 len = (DWORD *)((BYTE *)(len + 1) + *len);
1776 }
1777 if (sane)
1778 {
1779 /* Sanity-check length of proxy bypass string */
1780 if ((BYTE *)len - buf + *len <= size)
1781 {
1782 proxy_bypass = GlobalAlloc( 0, (*len + 1) * sizeof(WCHAR) );
1783 if (proxy_bypass)
1784 copy_char_to_wchar_sz( (BYTE *)(len + 1), *len, proxy_bypass );
1785 }
1786 else
1787 {
1788 sane = FALSE;
1789 GlobalFree( proxy );
1790 proxy = NULL;
1791 }
1792 }
1793 info->lpszProxy = proxy;
1794 info->lpszProxyBypass = proxy_bypass;
1795 if (sane)
1796 {
1797 got_from_reg = TRUE;
1798 direct = FALSE;
1799 info->dwAccessType =
1801 TRACE("http proxy (from registry) = %s, bypass = %s\n",
1802 debugstr_w(info->lpszProxy),
1803 debugstr_w(info->lpszProxyBypass));
1804 }
1805 }
1806 }
1807 free( buf );
1808 }
1809 }
1810 RegCloseKey( key );
1811 }
1812 if (!got_from_reg && (envproxy = _wgetenv( L"http_proxy" )))
1813 {
1814 WCHAR *colon, *http_proxy = NULL;
1815
1816 if (!(colon = wcschr( envproxy, ':' ))) http_proxy = envproxy;
1817 else
1818 {
1819 if (*(colon + 1) == '/' && *(colon + 2) == '/')
1820 {
1821 /* It's a scheme, check that it's http */
1822 if (!wcsncmp( envproxy, L"http://", 7 )) http_proxy = envproxy + 7;
1823 else WARN("unsupported scheme in $http_proxy: %s\n", debugstr_w(envproxy));
1824 }
1825 else http_proxy = envproxy;
1826 }
1827
1828 if (http_proxy && http_proxy[0])
1829 {
1830 direct = FALSE;
1831 info->dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
1832 info->lpszProxy = GlobalAlloc( 0, (lstrlenW(http_proxy) + 1) * sizeof(WCHAR) );
1833 wcscpy( info->lpszProxy, http_proxy );
1834 info->lpszProxyBypass = NULL;
1835 TRACE("http proxy (from environment) = %s\n", debugstr_w(info->lpszProxy));
1836 }
1837 }
1838 if (direct)
1839 {
1840 info->dwAccessType = WINHTTP_ACCESS_TYPE_NO_PROXY;
1841 info->lpszProxy = NULL;
1842 info->lpszProxyBypass = NULL;
1843 }
1845 return TRUE;
1846}
1847
1848/***********************************************************************
1849 * WinHttpGetIEProxyConfigForCurrentUser (winhttp.@)
1850 */
1852{
1853 HKEY hkey = NULL;
1855 DWORD type, offset, len, size = 0;
1856 BOOL ret = FALSE;
1857
1858 TRACE("%p\n", config);
1859
1860 if (!config)
1861 {
1863 return FALSE;
1864 }
1865 memset( config, 0, sizeof(*config) );
1866 config->fAutoDetect = TRUE;
1867
1869 RegQueryValueExW( hkey, L"DefaultConnectionSettings", NULL, &type, NULL, &size ) ||
1870 type != REG_BINARY || size < sizeof(struct connection_settings_header))
1871 {
1872 ret = TRUE;
1873 goto done;
1874 }
1875 if (!(hdr = malloc( size ))) goto done;
1876 if (RegQueryValueExW( hkey, L"DefaultConnectionSettings", NULL, &type, (BYTE *)hdr, &size ) ||
1877 hdr->magic != WININET_SETTINGS_MAGIC)
1878 {
1879 ret = TRUE;
1880 goto done;
1881 }
1882
1883 config->fAutoDetect = (hdr->flags & PROXY_AUTODETECT_SETTINGS) != 0;
1884 offset = sizeof(*hdr);
1885 if (offset + sizeof(DWORD) > size) goto done;
1886 len = *(DWORD *)((char *)hdr + offset);
1887 offset += sizeof(DWORD);
1888 if (len && hdr->flags & PROXY_TYPE_PROXY)
1889 {
1890 if (!(config->lpszProxy = GlobalAlloc( 0, (len + 1) * sizeof(WCHAR) ))) goto done;
1891 copy_char_to_wchar_sz( (const BYTE *)hdr + offset , len, config->lpszProxy );
1892 }
1893 offset += len;
1894 if (offset + sizeof(DWORD) > size) goto done;
1895 len = *(DWORD *)((char *)hdr + offset);
1896 offset += sizeof(DWORD);
1897 if (len && (hdr->flags & PROXY_TYPE_PROXY))
1898 {
1899 if (!(config->lpszProxyBypass = GlobalAlloc( 0, (len + 1) * sizeof(WCHAR) ))) goto done;
1900 copy_char_to_wchar_sz( (const BYTE *)hdr + offset , len, config->lpszProxyBypass );
1901 }
1902 offset += len;
1903 if (offset + sizeof(DWORD) > size) goto done;
1904 len = *(DWORD *)((char *)hdr + offset);
1905 offset += sizeof(DWORD);
1906 if (len && (hdr->flags & PROXY_USE_PAC_SCRIPT))
1907 {
1908 if (!(config->lpszAutoConfigUrl = GlobalAlloc( 0, (len + 1) * sizeof(WCHAR) ))) goto done;
1909 copy_char_to_wchar_sz( (const BYTE *)hdr + offset , len, config->lpszAutoConfigUrl );
1910 }
1911 ret = TRUE;
1912
1913done:
1914 RegCloseKey( hkey );
1915 free( hdr );
1916 if (!ret)
1917 {
1918 GlobalFree( config->lpszAutoConfigUrl );
1919 config->lpszAutoConfigUrl = NULL;
1920 GlobalFree( config->lpszProxy );
1921 config->lpszProxy = NULL;
1922 GlobalFree( config->lpszProxyBypass );
1923 config->lpszProxyBypass = NULL;
1924 }
1926 return ret;
1927}
1928
1930{
1931 const char *p;
1932 WCHAR *q;
1933 int len;
1934
1935 info->dwAccessType = WINHTTP_ACCESS_TYPE_NO_PROXY;
1936 info->lpszProxy = NULL;
1937 info->lpszProxyBypass = NULL;
1938
1939 TRACE("%s\n", debugstr_a( result ));
1940
1941 p = result;
1942 while (*p == ' ') p++;
1943 len = strlen( p );
1944 if (len >= 5 && !_strnicmp( p, "PROXY", sizeof("PROXY") - 1 ))
1945 {
1946 p += 5;
1947 while (*p == ' ') p++;
1948 if (!*p || *p == ';') return TRUE;
1949 if (!(q = strdupAW( p ))) return FALSE;
1950 len = wcslen( q );
1951 info->lpszProxy = GlobalAlloc( 0, (len + 1) * sizeof(WCHAR) );
1952 if (!info->lpszProxy)
1953 {
1954 free( q );
1955 return FALSE;
1956 }
1957 memcpy( info->lpszProxy, q, (len + 1) * sizeof(WCHAR) );
1958 free( q );
1959 q = info->lpszProxy;
1960 info->dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
1961 for (; *q; q++)
1962 {
1963 if (*q == ' ' || *q == ';')
1964 {
1965 *q = 0;
1966 break;
1967 }
1968 }
1969 }
1970 return TRUE;
1971}
1972
1973static SRWLOCK cache_lock = SRWLOCK_INIT;
1976static char *cached_script;
1978
1980{
1981 BOOL ret = FALSE;
1982
1983 *buffer = NULL;
1984 *out_size = 0;
1985
1988 {
1989 ret = TRUE;
1991 {
1994 }
1995 }
1997 return ret;
1998}
1999
2000static void cache_script( const WCHAR *url, char *buffer, DWORD size )
2001{
2003 free( cached_url );
2007
2008 if ((cached_url = wcsdup( url )) && buffer && (cached_script = malloc( size )))
2009 {
2012 }
2015}
2016
2017static char *download_script( const WCHAR *url, DWORD *out_size )
2018{
2019 static const WCHAR *acceptW[] = {L"*/*", NULL};
2020 HINTERNET ses, con = NULL, req = NULL;
2021 WCHAR *hostname;
2022 URL_COMPONENTSW uc;
2023 DWORD status, size = sizeof(status), offset, to_read, bytes_read, flags = 0;
2024 char *tmp, *buffer;
2025
2027 {
2028 TRACE( "Returning cached result.\n" );
2030 return buffer;
2031 }
2032
2033 memset( &uc, 0, sizeof(uc) );
2034 uc.dwStructSize = sizeof(uc);
2035 uc.dwHostNameLength = -1;
2036 uc.dwUrlPathLength = -1;
2037 if (!WinHttpCrackUrl( url, 0, 0, &uc )) return NULL;
2038 if (!(hostname = malloc( (uc.dwHostNameLength + 1) * sizeof(WCHAR) ))) return NULL;
2039 memcpy( hostname, uc.lpszHostName, uc.dwHostNameLength * sizeof(WCHAR) );
2040 hostname[uc.dwHostNameLength] = 0;
2041
2042 if (!(ses = WinHttpOpen( NULL, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0 ))) goto done;
2043 WinHttpSetTimeouts( ses, 5000, 60000, 30000, 30000 );
2044 if (!(con = WinHttpConnect( ses, hostname, uc.nPort, 0 ))) goto done;
2046 if (!(req = WinHttpOpenRequest( con, NULL, uc.lpszUrlPath, NULL, NULL, acceptW, flags ))) goto done;
2047 if (!WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 )) goto done;
2048
2049 if (!WinHttpReceiveResponse( req, 0 )) goto done;
2051 &size, NULL ) || status != HTTP_STATUS_OK) goto done;
2052
2053 size = 4096;
2054 if (!(buffer = malloc( size ))) goto done;
2055 to_read = size;
2056 offset = 0;
2057 for (;;)
2058 {
2059 if (!WinHttpReadData( req, buffer + offset, to_read, &bytes_read )) goto done;
2060 if (!bytes_read) break;
2061 to_read -= bytes_read;
2062 offset += bytes_read;
2063 *out_size += bytes_read;
2064 if (!to_read)
2065 {
2066 to_read = size;
2067 size *= 2;
2068 if (!(tmp = realloc( buffer, size ))) goto done;
2069 buffer = tmp;
2070 }
2071 }
2072
2073done:
2074 WinHttpCloseHandle( req );
2075 WinHttpCloseHandle( con );
2076 WinHttpCloseHandle( ses );
2077 free( hostname );
2080 return buffer;
2081}
2082
2084{
2088};
2089
2093
2094#define MAX_SCHEME_LENGTH 32
2096{
2098 BOOL ret;
2099 char *result, *urlA, *hostnameA;
2100 DWORD len, len_scheme, len_hostname;
2102 URL_COMPONENTSW uc;
2103
2104 memset( &uc, 0, sizeof(uc) );
2105 uc.dwStructSize = sizeof(uc);
2106 uc.dwSchemeLength = -1;
2107 uc.dwHostNameLength = -1;
2108
2109 if (!WinHttpCrackUrl( url, 0, 0, &uc ))
2110 return FALSE;
2111
2112 memcpy( scheme, uc.lpszScheme, uc.dwSchemeLength * sizeof(WCHAR) );
2113 scheme[uc.dwSchemeLength] = 0;
2114 wcslwr( scheme );
2115 len_scheme = WideCharToMultiByte( CP_ACP, 0, scheme, uc.dwSchemeLength, NULL, 0, NULL, NULL );
2116
2118 {
2119 memcpy( buf, uc.lpszHostName, uc.dwHostNameLength * sizeof(WCHAR) );
2120 buf[uc.dwHostNameLength] = 0;
2121 wcslwr( buf );
2122 hostname = buf;
2123 }
2124 else
2125 {
2126 hostname = uc.lpszHostName;
2127 }
2128 len_hostname = WideCharToMultiByte( CP_ACP, 0, hostname, uc.dwHostNameLength, NULL, 0, NULL, NULL );
2129
2130 len = WideCharToMultiByte( CP_ACP, 0, uc.lpszHostName + uc.dwHostNameLength, -1, NULL, 0, NULL, NULL );
2131 if (!(urlA = malloc( len + len_scheme + len_hostname + 3 ))) return FALSE;
2132 WideCharToMultiByte( CP_ACP, 0, scheme, uc.dwSchemeLength, urlA, len_scheme, NULL, NULL );
2133 urlA[len_scheme++] = ':';
2134 urlA[len_scheme++] = '/';
2135 urlA[len_scheme++] = '/';
2136 WideCharToMultiByte( CP_ACP, 0, hostname, uc.dwHostNameLength, urlA + len_scheme, len_hostname, NULL, NULL );
2137 hostnameA = urlA + len_scheme;
2138 WideCharToMultiByte( CP_ACP, 0, uc.lpszHostName + uc.dwHostNameLength, -1,
2139 urlA + len_scheme + len_hostname, len, NULL, NULL );
2140
2141 buffer.dwStructSize = sizeof(buffer);
2142 buffer.lpszScriptBuffer = script;
2143 buffer.dwScriptBufferSize = size;
2144
2146 {
2147 free( urlA );
2148 return FALSE;
2149 }
2150
2151 if ((ret = InternetGetProxyInfo( urlA, strlen(urlA), hostnameA, len_hostname, &result, &len )))
2152 {
2154 free( result );
2155 }
2156
2157 free( urlA );
2159 return ret;
2160}
2161
2162/***********************************************************************
2163 * WinHttpGetProxyForUrl (winhttp.@)
2164 */
2167{
2168 WCHAR *pac_url;
2169 struct session *session;
2170 char *script = NULL;
2171 DWORD size;
2172 BOOL ret = FALSE;
2173
2174 TRACE("%p, %s, %p, %p\n", hsession, debugstr_w(url), options, info);
2175
2176 if (!(session = (struct session *)grab_object( hsession )))
2177 {
2179 return FALSE;
2180 }
2182 {
2185 return FALSE;
2186 }
2187 if (!url || !options || !info ||
2189 ((options->dwFlags & WINHTTP_AUTOPROXY_AUTO_DETECT) && !options->dwAutoDetectFlags) ||
2190 (options->dwFlags & WINHTTP_AUTOPROXY_CONFIG_URL && !options->lpszAutoConfigUrl))
2191 {
2194 return FALSE;
2195 }
2196
2197 if (options->dwFlags & WINHTTP_AUTOPROXY_AUTO_DETECT &&
2198 WinHttpDetectAutoProxyConfigUrl( options->dwAutoDetectFlags, &pac_url ))
2199 {
2200 script = download_script( pac_url, &size );
2201 GlobalFree( pac_url );
2202 }
2203
2204 if (!script && options->dwFlags & WINHTTP_AUTOPROXY_CONFIG_URL)
2205 script = download_script( options->lpszAutoConfigUrl, &size );
2206
2207 if (script)
2208 {
2209 ret = run_script( script, size, url, info, options->dwFlags );
2210 free( script );
2211 }
2212
2215 return ret;
2216}
2217
2218/***********************************************************************
2219 * WinHttpSetDefaultProxyConfiguration (winhttp.@)
2220 */
2222{
2223 LONG l;
2224 HKEY key;
2225 BOOL ret = FALSE;
2226 const WCHAR *src;
2227
2228 TRACE("%p\n", info);
2229
2230 if (!info)
2231 {
2233 return FALSE;
2234 }
2235 switch (info->dwAccessType)
2236 {
2238 break;
2240 if (!info->lpszProxy)
2241 {
2243 return FALSE;
2244 }
2245 /* Only ASCII characters are allowed */
2246 for (src = info->lpszProxy; *src; src++)
2247 if (*src > 0x7f)
2248 {
2250 return FALSE;
2251 }
2252 if (info->lpszProxyBypass)
2253 {
2254 for (src = info->lpszProxyBypass; *src; src++)
2255 if (*src > 0x7f)
2256 {
2258 return FALSE;
2259 }
2260 }
2261 break;
2262 default:
2264 return FALSE;
2265 }
2266
2268 KEY_WRITE, NULL, &key, NULL );
2269 if (!l)
2270 {
2271 DWORD size = sizeof(struct connection_settings_header) + 2 * sizeof(DWORD);
2272 BYTE *buf;
2273
2274 if (info->dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY)
2275 {
2276 size += lstrlenW( info->lpszProxy );
2277 if (info->lpszProxyBypass)
2278 size += lstrlenW( info->lpszProxyBypass );
2279 }
2280 if ((buf = malloc( size )))
2281 {
2284 DWORD *len = (DWORD *)(hdr + 1);
2285
2286 hdr->magic = WINHTTP_SETTINGS_MAGIC;
2287 hdr->unknown = 0;
2288 if (info->dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY)
2289 {
2290 BYTE *dst;
2291
2292 hdr->flags = PROXY_TYPE_PROXY;
2293 *len++ = lstrlenW( info->lpszProxy );
2294 for (dst = (BYTE *)len, src = info->lpszProxy; *src;
2295 src++, dst++)
2296 *dst = *src;
2297 len = (DWORD *)dst;
2298 if (info->lpszProxyBypass)
2299 {
2300 *len++ = lstrlenW( info->lpszProxyBypass );
2301 for (dst = (BYTE *)len, src = info->lpszProxyBypass; *src;
2302 src++, dst++)
2303 *dst = *src;
2304 }
2305 else
2306 *len++ = 0;
2307 }
2308 else
2309 {
2310 hdr->flags = PROXY_TYPE_DIRECT;
2311 *len++ = 0;
2312 *len++ = 0;
2313 }
2314 l = RegSetValueExW( key, L"WinHttpSettings", 0, REG_BINARY, buf, size );
2315 if (!l)
2316 ret = TRUE;
2317 free( buf );
2318 }
2319 RegCloseKey( key );
2320 }
2322 return ret;
2323}
2324
2325/***********************************************************************
2326 * WinHttpCreateProxyResolver (winhttp.@)
2327 */
2329{
2330 FIXME("%p, %p\n", hsession, hresolver);
2332}
2333
2334/***********************************************************************
2335 * WinHttpFreeProxyResult (winhttp.@)
2336 */
2338{
2339 FIXME("%p\n", result);
2340}
2341
2342/***********************************************************************
2343 * WinHttpFreeProxyResultEx (winhttp.@)
2344 */
2346{
2347 FIXME("%p\n", result);
2348}
2349
2350/***********************************************************************
2351 * WinHttpFreeProxySettings (winhttp.@)
2352 */
2354{
2355 FIXME("%p\n", settings);
2356}
2357
2358/***********************************************************************
2359 * WinHttpGetProxyForUrlEx (winhttp.@)
2360 */
2362 DWORD_PTR ctx )
2363{
2364 FIXME( "%p, %s, %p, %Ix\n", hresolver, debugstr_w(url), options, ctx );
2366}
2367
2368/***********************************************************************
2369 * WinHttpGetProxyForUrlEx2 (winhttp.@)
2370 */
2372 DWORD selection_len, BYTE *selection, DWORD_PTR ctx )
2373{
2374 FIXME( "%p, %s, %p, %lu, %p, %Ix\n", hresolver, debugstr_w(url), options, selection_len, selection, ctx );
2376}
2377
2378/***********************************************************************
2379 * WinHttpGetProxyResult (winhttp.@)
2380 */
2382{
2383 FIXME("%p, %p\n", hresolver, result);
2385}
2386
2387/***********************************************************************
2388 * WinHttpGetProxyResultEx (winhttp.@)
2389 */
2391{
2392 FIXME("%p, %p\n", hresolver, result);
2394}
2395
2396/***********************************************************************
2397 * WinHttpGetProxySettingsVersion (winhttp.@)
2398 */
2400{
2401 FIXME("%p, %p\n", hsession, version);
2403}
2404
2405/***********************************************************************
2406 * WinHttpReadProxySettings (winhttp.@)
2407 */
2408DWORD WINAPI WinHttpReadProxySettings( HINTERNET hsession, const WCHAR *connection, BOOL use_defaults,
2409 BOOL set_autodiscover, DWORD *version, BOOL *defaults_returned,
2411{
2412 FIXME("%p, %s, %d, %d, %p, %p, %p\n", hsession, debugstr_w(connection), use_defaults, set_autodiscover,
2413 version, defaults_returned, settings);
2415}
2416
2417/***********************************************************************
2418 * WinHttpResetAutoProxy (winhttp.@)
2419 */
2421{
2422 FIXME( "%p, %#lx\n", hsession, flags );
2424}
2425
2427{
2428 FIXME("%p, %d, %p\n", hsession, force, settings);
2430}
2431
2432/***********************************************************************
2433 * WinHttpSetStatusCallback (winhttp.@)
2434 */
2437{
2438 struct object_header *hdr;
2440
2441 TRACE( "%p, %p, %#lx, %Ix\n", handle, callback, flags, reserved );
2442
2443 if (!(hdr = grab_object( handle )))
2444 {
2447 }
2448 ret = hdr->callback;
2449 hdr->callback = callback;
2450 hdr->notify_mask = flags;
2451
2454 return ret;
2455}
2456
2457/***********************************************************************
2458 * WinHttpSetTimeouts (winhttp.@)
2459 */
2460BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int send, int receive )
2461{
2462 BOOL ret = TRUE;
2463 struct object_header *hdr;
2464
2465 TRACE("%p, %d, %d, %d, %d\n", handle, resolve, connect, send, receive);
2466
2467 if (resolve < -1 || connect < -1 || send < -1 || receive < -1)
2468 {
2470 return FALSE;
2471 }
2472
2473 if (!(hdr = grab_object( handle )))
2474 {
2476 return FALSE;
2477 }
2478
2479 switch(hdr->type)
2480 {
2482 {
2483 struct request *request = (struct request *)hdr;
2485
2486 if (resolve < 0) resolve = 0;
2487 request->resolve_timeout = resolve;
2488
2489 if (send < 0) send = 0;
2491
2492 if (receive < 0) receive = 0;
2493 request->receive_timeout = receive;
2494
2495 if (request->netconn)
2496 {
2498 if (netconn_set_timeout( request->netconn, FALSE, receive )) ret = FALSE;
2499 }
2500 break;
2501 }
2503 {
2504 struct session *session = (struct session *)hdr;
2506
2507 if (resolve < 0) resolve = 0;
2508 session->resolve_timeout = resolve;
2509
2510 if (send < 0) send = 0;
2512
2513 if (receive < 0) receive = 0;
2514 session->receive_timeout = receive;
2515 break;
2516 }
2517 default:
2519 ret = FALSE;
2520 }
2523 return ret;
2524}
2525
2526static const WCHAR wkday[7][4] =
2527 {L"Sun", L"Mon", L"Tue", L"Wed", L"Thu", L"Fri", L"Sat"};
2528static const WCHAR month[12][4] =
2529 {L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec"};
2530
2531/***********************************************************************
2532 * WinHttpTimeFromSystemTime (WININET.@)
2533 */
2535{
2536 TRACE("%p, %p\n", time, string);
2537
2538 if (!time || !string)
2539 {
2541 return FALSE;
2542 }
2543
2544 swprintf( string, WINHTTP_TIME_FORMAT_BUFSIZE / sizeof(WCHAR),
2545 L"%s, %02d %s %4d %02d:%02d:%02d GMT",
2546 wkday[time->wDayOfWeek],
2547 time->wDay,
2548 month[time->wMonth - 1],
2549 time->wYear,
2550 time->wHour,
2551 time->wMinute,
2552 time->wSecond );
2553
2555 return TRUE;
2556}
2557
2558/***********************************************************************
2559 * WinHttpTimeToSystemTime (WININET.@)
2560 */
2562{
2563 unsigned int i;
2564 const WCHAR *s = string;
2565 WCHAR *end;
2566
2567 TRACE("%s, %p\n", debugstr_w(string), time);
2568
2569 if (!string || !time)
2570 {
2572 return FALSE;
2573 }
2574
2575 /* Windows does this too */
2577
2578 /* Convert an RFC1123 time such as 'Fri, 07 Jan 2005 12:06:35 GMT' into
2579 * a SYSTEMTIME structure.
2580 */
2581
2583
2584 while (*s && !iswalpha( *s )) s++;
2585 if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE;
2586 time->wDayOfWeek = 7;
2587
2588 for (i = 0; i < 7; i++)
2589 {
2590 if (towupper( wkday[i][0] ) == towupper( s[0] ) &&
2591 towupper( wkday[i][1] ) == towupper( s[1] ) &&
2592 towupper( wkday[i][2] ) == towupper( s[2] ) )
2593 {
2594 time->wDayOfWeek = i;
2595 break;
2596 }
2597 }
2598
2599 if (time->wDayOfWeek > 6) return TRUE;
2600 while (*s && !iswdigit( *s )) s++;
2601 time->wDay = wcstol( s, &end, 10 );
2602 s = end;
2603
2604 while (*s && !iswalpha( *s )) s++;
2605 if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE;
2606 time->wMonth = 0;
2607
2608 for (i = 0; i < 12; i++)
2609 {
2610 if (towupper( month[i][0]) == towupper( s[0] ) &&
2611 towupper( month[i][1]) == towupper( s[1] ) &&
2612 towupper( month[i][2]) == towupper( s[2] ) )
2613 {
2614 time->wMonth = i + 1;
2615 break;
2616 }
2617 }
2618 if (time->wMonth == 0) return TRUE;
2619
2620 while (*s && !iswdigit( *s )) s++;
2621 if (*s == '\0') return TRUE;
2622 time->wYear = wcstol( s, &end, 10 );
2623 s = end;
2624
2625 while (*s && !iswdigit( *s )) s++;
2626 if (*s == '\0') return TRUE;
2627 time->wHour = wcstol( s, &end, 10 );
2628 s = end;
2629
2630 while (*s && !iswdigit( *s )) s++;
2631 if (*s == '\0') return TRUE;
2632 time->wMinute = wcstol( s, &end, 10 );
2633 s = end;
2634
2635 while (*s && !iswdigit( *s )) s++;
2636 if (*s == '\0') return TRUE;
2637 time->wSecond = wcstol( s, &end, 10 );
2638
2639 time->wMilliseconds = 0;
2640 return TRUE;
2641}
struct mke2fs_defaults settings[]
WINBASEAPI _Check_return_ _Out_ AppPolicyProcessTerminationMethod * policy
Definition: appmodel.h:73
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
char * hostname
Definition: ftp.c:88
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define RegCloseKey(hKey)
Definition: registry.h:49
r l[0]
Definition: byte_order.h:168
int selection
Definition: ctm.c:92
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
#define ERROR_SUCCESS
Definition: deptool.c:10
#define DHCPCAPI_REQUEST_SYNCHRONOUS
Definition: dhcpcsdk.h:115
#define OPTION_MSFT_IE_PROXY
Definition: dhcpcsdk.h:87
DWORD APIENTRY DhcpRequestParams(DWORD Flags, PVOID Reserved, LPWSTR AdapterName, LPDHCPCAPI_CLASSID ClassId, DHCPCAPI_PARAMS_ARRAY SendParams, DHCPCAPI_PARAMS_ARRAY RecdParams, LPBYTE Buffer, LPDWORD pSize, LPWSTR RequestIdStr)
Definition: dhcpcsvc.c:500
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
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
static WCHAR * strdupAW(const char *src)
Definition: main.c:31
BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:371
PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:360
static struct list oidInfo
Definition: oid.c:1206
PCCRYPT_OID_INFO WINAPI CryptFindOIDInfo(DWORD dwKeyType, void *pvKey, DWORD dwGroupId)
Definition: oid.c:1799
DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, DWORD dwStrType, LPWSTR psz, DWORD csz)
Definition: str.c:702
#define wcschr
Definition: compat.h:17
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define wcsnicmp
Definition: compat.h:14
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define TRACE_ON(x)
Definition: compat.h:75
#define _strnicmp(_String1, _String2, _MaxCount)
Definition: compat.h:23
#define stricmp(_String1, _String2)
Definition: compat.h:24
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define lstrcpyW
Definition: compat.h:749
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define wcsicmp
Definition: compat.h:15
#define lstrlenW
Definition: compat.h:750
static const WCHAR version[]
Definition: asmname.c:66
VOID WINAPI GetSystemTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:327
VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:8
VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:36
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void)
Definition: sync.c:192
BOOL force
Definition: metahost.c:100
wchar_t *CDECL _wgetenv(const wchar_t *name)
Definition: environ.c:254
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2747
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
_ACRTIMP int __cdecl wcsncmp(const wchar_t *, const wchar_t *, size_t)
Definition: wcs.c:518
_ACRTIMP char *__cdecl strchr(const char *, int)
Definition: string.c:3286
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
static wchar_t * wcslwr(wchar_t *str)
Definition: string.h:96
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
static BOOL alloc_handle(struct handle_table *lpTable, OBJECTHDR *lpObject, HCRYPTKEY *lpHandle)
Definition: handle.c:183
USHORT port
Definition: uri.c:228
BOOL free_handle(HINTERNET hinternet)
Definition: handle.c:123
struct object_header * grab_object(HINTERNET hinternet)
Definition: handle.c:55
void release_object(struct object_header *hdr)
Definition: handle.c:71
struct object_header * addref_object(struct object_header *hdr)
Definition: handle.c:48
DWORD netconn_set_timeout(struct netconn *netconn, BOOL send, int value)
Definition: net.c:686
int netconn_get_cipher_strength(struct netconn *conn)
Definition: net.c:860
HINTERNET WINAPI WinHttpOpenRequest(HINTERNET hconnect, const WCHAR *verb, const WCHAR *object, const WCHAR *version, const WCHAR *referrer, const WCHAR **types, DWORD flags)
Definition: session.c:1277
static BOOL request_set_option(struct object_header *hdr, DWORD option, void *buffer, DWORD buflen)
Definition: session.c:985
BOOL WINAPI WinHttpGetDefaultProxyConfiguration(WINHTTP_PROXY_INFO *info)
Definition: session.c:1731
void WINAPI WinHttpFreeProxyResult(WINHTTP_PROXY_RESULT *result)
Definition: session.c:2337
static const struct object_vtbl session_vtbl
Definition: session.c:289
static void session_destroy(struct object_header *hdr)
Definition: session.c:68
static BOOL should_bypass_proxy(struct session *session, LPCWSTR server)
Definition: session.c:501
BOOL WINAPI WinHttpQueryOption(HINTERNET handle, DWORD option, void *buffer, DWORD *buflen)
Definition: session.c:1420
static const WCHAR wkday[7][4]
Definition: session.c:2526
static const struct object_vtbl request_vtbl
Definition: session.c:1240
HINTERNET WINAPI WinHttpOpen(LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWSTR bypass, DWORD flags)
Definition: session.c:304
#define DEFAULT_RECEIVE_TIMEOUT
Definition: session.c:44
static BOOL request_query_option(struct object_header *hdr, DWORD option, void *buffer, DWORD *buflen)
Definition: session.c:777
static WCHAR * detect_autoproxyconfig_url_dhcp(void)
Definition: session.c:1518
#define DEFAULT_RESOLVE_TIMEOUT
Definition: session.c:41
static void connect_destroy(struct object_header *hdr)
Definition: session.c:369
static const DWORD PROXY_AUTODETECT_SETTINGS
Definition: session.c:1710
DWORD WINAPI WinHttpResetAutoProxy(HINTERNET hsession, DWORD flags)
Definition: session.c:2420
static WCHAR * buffer_to_str(WCHAR *buffer, DWORD buflen)
Definition: session.c:972
BOOL WINAPI WinHttpGetIEProxyConfigForCurrentUser(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG *config)
Definition: session.c:1851
static WCHAR * build_wpad_url(const char *hostname, const struct addrinfo *ai)
Definition: session.c:1603
static int reverse_lookup(const struct addrinfo *ai, char *hostname, size_t len)
Definition: session.c:1598
void WINAPI WinHttpFreeProxySettings(WINHTTP_PROXY_SETTINGS *settings)
Definition: session.c:2353
static const WCHAR path_connections[]
Definition: session.c:1702
HINTERNET WINAPI WinHttpConnect(HINTERNET hsession, const WCHAR *server, INTERNET_PORT port, DWORD reserved)
Definition: session.c:594
#define MAX_HOST_NAME_LENGTH
Definition: session.c:499
static const DWORD WININET_SETTINGS_MAGIC
Definition: session.c:1706
BOOL WINAPI WinHttpSetOption(HINTERNET handle, DWORD option, void *buffer, DWORD buflen)
Definition: session.c:1479
static void cache_script(const WCHAR *url, char *buffer, DWORD size)
Definition: session.c:2000
BOOL WINAPI WinHttpGetProxyForUrl(HINTERNET hsession, LPCWSTR url, WINHTTP_AUTOPROXY_OPTIONS *options, WINHTTP_PROXY_INFO *info)
Definition: session.c:2165
static const DWORD PROXY_TYPE_PROXY
Definition: session.c:1708
static BOOL set_option(struct object_header *hdr, DWORD option, void *buffer, DWORD buflen)
Definition: session.c:1440
void WINAPI WinHttpFreeProxyResultEx(WINHTTP_PROXY_RESULT_EX *result)
Definition: session.c:2345
BOOL WINAPI InternetDeInitializeAutoProxyDll(LPSTR, DWORD)
Definition: main.c:111
static WCHAR * detect_autoproxyconfig_url_dns(void)
Definition: session.c:1623
static const DWORD PROXY_USE_PAC_SCRIPT
Definition: session.c:1709
static BOOL session_set_option(struct object_header *hdr, DWORD option, void *buffer, DWORD buflen)
Definition: session.c:168
static WCHAR * blob_to_str(DWORD encoding, CERT_NAME_BLOB *blob)
Definition: session.c:712
DWORD WINAPI WinHttpGetProxyForUrlEx(HINTERNET hresolver, const WCHAR *url, WINHTTP_AUTOPROXY_OPTIONS *options, DWORD_PTR ctx)
Definition: session.c:2361
static char * download_script(const WCHAR *url, DWORD *out_size)
Definition: session.c:2017
BOOL WINAPI WinHttpTimeFromSystemTime(const SYSTEMTIME *time, LPWSTR string)
Definition: session.c:2534
DWORD WINAPI WinHttpGetProxyResult(HINTERNET hresolver, WINHTTP_PROXY_RESULT *result)
Definition: session.c:2381
#define MAX_SCHEME_LENGTH
Definition: session.c:2094
#define DEFAULT_SEND_TIMEOUT
Definition: session.c:43
BOOL WINAPI InternetInitializeAutoProxyDll(DWORD, LPSTR, LPSTR, void *, struct AUTO_PROXY_SCRIPT_BUFFER *)
BOOL WINAPI WinHttpSetDefaultProxyConfiguration(WINHTTP_PROXY_INFO *info)
Definition: session.c:2221
BOOL set_server_for_hostname(struct connect *connect, const WCHAR *server, INTERNET_PORT port)
Definition: session.c:532
BOOL WINAPI WinHttpCloseHandle(HINTERNET handle)
Definition: session.c:1358
static char * get_computer_name(COMPUTER_NAME_FORMAT format)
Definition: session.c:1573
static BOOL query_option(struct object_header *hdr, DWORD option, void *buffer, DWORD *buflen)
Definition: session.c:1375
static BOOL copy_sockaddr(const struct sockaddr *addr, SOCKADDR_STORAGE *addr_storage)
Definition: session.c:724
BOOL WINAPI WinHttpSetTimeouts(HINTERNET handle, int resolve, int connect, int send, int receive)
Definition: session.c:2460
static ULONGLONG cache_update_time
Definition: session.c:1975
DWORD WINAPI WinHttpWriteProxySettings(HINTERNET hsession, BOOL force, WINHTTP_PROXY_SETTINGS *settings)
Definition: session.c:2426
static const DWORD PROXY_TYPE_DIRECT
Definition: session.c:1707
BOOL WINAPI WinHttpDetectAutoProxyConfigUrl(DWORD flags, WCHAR **url)
Definition: session.c:1675
DWORD WINAPI WinHttpGetProxyResultEx(HINTERNET hresolver, WINHTTP_PROXY_RESULT_EX *result)
Definition: session.c:2390
static char * cached_script
Definition: session.c:1976
static WCHAR * get_request_path(const WCHAR *object)
Definition: session.c:1261
static BOOL parse_script_result(const char *result, WINHTTP_PROXY_INFO *info)
Definition: session.c:1929
#define DEFAULT_RECEIVE_RESPONSE_TIMEOUT
Definition: session.c:45
static const WCHAR month[12][4]
Definition: session.c:2528
DWORD WINAPI WinHttpReadProxySettings(HINTERNET hsession, const WCHAR *connection, BOOL use_defaults, BOOL set_autodiscover, DWORD *version, BOOL *defaults_returned, WINHTTP_PROXY_SETTINGS *settings)
Definition: session.c:2408
static SRWLOCK cache_lock
Definition: session.c:1973
static BOOL return_string_option(WCHAR *buffer, const WCHAR *str, LPDWORD buflen)
Definition: session.c:692
DWORD WINAPI WinHttpGetProxyForUrlEx2(HINTERNET hresolver, const WCHAR *url, WINHTTP_AUTOPROXY_OPTIONS *options, DWORD selection_len, BYTE *selection, DWORD_PTR ctx)
Definition: session.c:2371
#define DEFAULT_CONNECT_TIMEOUT
Definition: session.c:42
static BOOL validate_buffer(void *buffer, DWORD *buflen, DWORD required)
Definition: session.c:87
static void copy_char_to_wchar_sz(const BYTE *src, DWORD len, WCHAR *dst)
Definition: session.c:1719
DWORD WINAPI WinHttpGetProxySettingsVersion(HINTERNET hsession, DWORD *version)
Definition: session.c:2399
static const struct object_vtbl connect_vtbl
Definition: session.c:440
BOOL WINAPI WinHttpCheckPlatform(void)
Definition: session.c:62
static IP_ADAPTER_ADDRESSES * get_adapters(void)
Definition: session.c:1499
DWORD WINAPI WinHttpCreateProxyResolver(HINTERNET hsession, HINTERNET *hresolver)
Definition: session.c:2328
static BOOL session_query_option(struct object_header *hdr, DWORD option, void *buffer, DWORD *buflen)
Definition: session.c:98
static WCHAR * build_url(struct request *request)
Definition: session.c:750
static BOOL is_domain_suffix(const char *domain, const char *suffix)
Definition: session.c:1589
static DWORD cached_script_size
Definition: session.c:1974
static BOOL run_script(char *script, DWORD size, const WCHAR *url, WINHTTP_PROXY_INFO *info, DWORD flags)
Definition: session.c:2095
static BOOL get_cached_script(const WCHAR *url, char **buffer, DWORD *out_size)
Definition: session.c:1979
static BOOL domain_matches(LPCWSTR server, LPCWSTR domain)
Definition: session.c:448
BOOL WINAPI WinHttpTimeToSystemTime(LPCWSTR string, SYSTEMTIME *time)
Definition: session.c:2561
static BOOL add_accept_types_header(struct request *request, const WCHAR **types)
Definition: session.c:1248
WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(HINTERNET handle, WINHTTP_STATUS_CALLBACK callback, DWORD flags, DWORD_PTR reserved)
Definition: session.c:2435
static BOOL connect_query_option(struct object_header *hdr, DWORD option, void *buffer, DWORD *buflen)
Definition: session.c:384
static const DWORD WINHTTP_SETTINGS_MAGIC
Definition: session.c:1705
static WCHAR * cached_url
Definition: session.c:1977
static void request_destroy(struct object_header *hdr)
Definition: session.c:652
BOOL WINAPI InternetGetProxyInfo(LPCSTR, DWORD, LPSTR, DWORD, LPSTR *, LPDWORD)
BOOL WINAPI WinHttpCreateUrl(URL_COMPONENTS *uc, DWORD flags, WCHAR *url, DWORD *required)
Definition: url.c:440
BOOL WINAPI WinHttpCrackUrl(const WCHAR *url, DWORD len, DWORD flags, URL_COMPONENTSW *uc)
Definition: url.c:173
#define swprintf
Definition: precomp.h:40
INT WSAAPI send(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags)
Definition: send.c:23
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
r reserved
Definition: btrfs.c:3006
ULONG to_read
Definition: btrfs.c:4260
#define AF_INET
Definition: tcpip.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define local
Definition: zutil.h:30
int proxy
Definition: main.c:67
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLenum const GLvoid * addr
Definition: glext.h:9621
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866
GLuint64EXT * result
Definition: glext.h:11304
GLfloat GLfloat p
Definition: glext.h:8902
GLfloat param
Definition: glext.h:5796
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
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 GLint GLint j
Definition: glfuncs.h:250
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
#define bits
Definition: infblock.c:15
#define GAA_FLAG_SKIP_FRIENDLY_NAME
BOOL WINAPI GetComputerNameExA(COMPUTER_NAME_FORMAT, LPSTR, LPDWORD)
Definition: compname.c:376
#define IF_TYPE_SOFTWARE_LOOPBACK
Definition: ipifcons.h:44
char hdr[14]
Definition: iptest.cpp:33
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
#define wine_dbgstr_w
Definition: kernel32.h:34
if(dx< 0)
Definition: linetemp.h:194
__u16 time
Definition: mkdosfs.c:8
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
char string[160]
Definition: util.h:11
int socklen_t
Definition: tcp.c:35
static PVOID ptr
Definition: dispmode.c:27
static IPrintDialogCallback callback
Definition: printdlg.c:326
static const WCHAR url[]
Definition: encode.c:1384
static BYTE cert[]
Definition: msg.c:1374
static PROCESS_INFORMATION pi
Definition: debugger.c:2303
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
Definition: file.c:100
int disable
Definition: msacm.c:1365
script
Definition: msipriv.h:383
#define REG_BINARY
Definition: nt_native.h:1499
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_WRITE
Definition: nt_native.h:1034
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
#define MAX_ADAPTER_NAME_LENGTH
Definition: iptypes.h:16
#define err(...)
void init_queue(struct queue *queue)
Definition: request.c:137
BOOL WINAPI WinHttpQueryHeaders(HINTERNET hrequest, DWORD level, const WCHAR *name, void *buffer, DWORD *buflen, DWORD *index)
Definition: request.c:814
void stop_queue(struct queue *queue)
Definition: request.c:144
BOOL WINAPI WinHttpReadData(HINTERNET hrequest, void *buffer, DWORD to_read, DWORD *read)
Definition: request.c:3252
DWORD process_header(struct request *request, const WCHAR *field, const WCHAR *value, DWORD flags, BOOL request_only)
Definition: request.c:424
BOOL WINAPI WinHttpSendRequest(HINTERNET hrequest, const WCHAR *headers, DWORD headers_len, void *optional, DWORD optional_len, DWORD total_len, DWORD_PTR context)
Definition: request.c:2397
BOOL WINAPI WinHttpReceiveResponse(HINTERNET hrequest, LPVOID reserved)
Definition: request.c:3068
#define calloc
Definition: rosglue.h:14
static void accepted(enum accept_stat, struct rpc_err *)
Definition: rpc_prot.c:280
const WCHAR * str
static void destroy_authinfo(struct authinfo *info)
DWORD scheme
#define iswdigit(_c)
Definition: ctype.h:667
#define iswalpha(_c)
Definition: ctype.h:664
wcscpy
strcat
Definition: string.h:92
strcpy
Definition: string.h:131
#define memset(x, y, z)
Definition: compat.h:39
#define towupper(c)
Definition: wctype.h:99
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213
#define TRACE(s)
Definition: solgame.cpp:4
wchar_t const *const size_t const buffer_size
Definition: stat.cpp:95
DWORD dwStructSize
Definition: wininet.h:211
DWORD dwUrlPathLength
Definition: wininet.h:223
LPWSTR lpszHostName
Definition: wininet.h:215
DWORD dwHostNameLength
Definition: wininet.h:216
INTERNET_SCHEME nScheme
Definition: wininet.h:214
LPWSTR lpszUrlPath
Definition: wininet.h:222
INTERNET_PORT nPort
Definition: wininet.h:217
INTERNET_PORT nPort
Definition: winhttp.h:543
LPWSTR lpszUserName
Definition: winhttp.h:544
DWORD dwPasswordLength
Definition: winhttp.h:547
LPWSTR lpszUrlPath
Definition: winhttp.h:548
DWORD dwHostNameLength
Definition: winhttp.h:542
DWORD dwUrlPathLength
Definition: winhttp.h:549
LPWSTR lpszHostName
Definition: winhttp.h:541
LPWSTR lpszPassword
Definition: winhttp.h:546
INTERNET_SCHEME nScheme
Definition: winhttp.h:540
DWORD dwStructSize
Definition: winhttp.h:537
DWORD dwUserNameLength
Definition: winhttp.h:545
LPWSTR lpszEncryptionAlgName
Definition: winhttp.h:570
LPDHCPCAPI_PARAMS Params
Definition: dhcpcsdk.h:104
PRTL_CRITICAL_SECTION_DEBUG DebugInfo
Definition: rtltypes.h:1450
size_t ai_addrlen
Definition: ws2def.h:675
struct sockaddr * ai_addr
Definition: ws2def.h:677
struct addrinfo * ai_next
Definition: ws2def.h:678
int ai_family
Definition: ws2def.h:672
Definition: image.c:134
WCHAR * hostname
struct session * session
WCHAR * password
WCHAR * servername
INTERNET_PORT hostport
WCHAR * username
INTERNET_PORT serverport
struct object_header hdr
Definition: cookie.c:42
Definition: format.c:58
Definition: copy.c:22
Definition: name.c:39
Definition: getopt.h:109
Definition: tftpd.h:86
unsigned int websocket_set_send_buffer_size
DWORD read_reply_status
struct queue queue
struct request::@633 creds[TARGET_MAX][SCHEME_MAX]
const CERT_CONTEXT * server_cert
DWORD max_redirects
WCHAR * version
char path[256]
Definition: tftpd.h:94
const CERT_CONTEXT * client_cert
int send_timeout
struct header * headers
struct object_header hdr
WCHAR * verb
DWORD security_flags
enum request_flags flags
struct authinfo * authinfo
DWORD num_headers
CredHandle cred_handle
WCHAR * status_text
unsigned int websocket_receive_buffer_size
int receive_timeout
BOOL check_revocation
int connect_timeout
int resolve_timeout
WCHAR * raw_headers
struct connect * connect
unsigned int websocket_send_buffer_size
int receive_response_timeout
BOOL cred_handle_initialized
struct netconn * netconn
struct authinfo * proxy_authinfo
int resolve_timeout
WCHAR * proxy_password
DWORD passport_flags
WCHAR * proxy_bypass
int receive_response_timeout
CRITICAL_SECTION cs
int receive_timeout
DWORD access
HANDLE unload_event
unsigned int websocket_receive_buffer_size
DWORD secure_protocols
WCHAR * agent
WCHAR * proxy_server
struct object_header hdr
int send_timeout
WCHAR * proxy_username
int connect_timeout
unsigned int websocket_send_buffer_size
struct list cookie_cache
Definition: ps.c:97
Definition: cmds.c:130
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define DWORD_PTR
Definition: treelist.c:76
uint32_t DWORD_PTR
Definition: typedefs.h:65
uint32_t * LPDWORD
Definition: typedefs.h:59
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
static rfbScreenInfoPtr server
Definition: vnc.c:74
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define CERT_SIMPLE_NAME_STR
Definition: wincrypt.h:3642
#define CERT_NAME_STR_CRLF_FLAG
Definition: wincrypt.h:3648
#define CRYPT_OID_INFO_OID_KEY
Definition: wincrypt.h:1955
#define WINAPI
Definition: msvc.h:6
#define ERROR_BUFFER_OVERFLOW
Definition: winerror.h:307
void destroy_cookies(struct session *session)
Definition: cookie.c:120
#define HTTP_STATUS_OK
Definition: winhttp.h:301
#define WINHTTP_OPTION_PROXY
Definition: winhttp.h:118
#define WINHTTP_HANDLE_TYPE_REQUEST
Definition: winhttp.h:503
#define SECURITY_FLAG_STRENGTH_MEDIUM
Definition: winhttp.h:349
#define WINHTTP_OPTION_WEB_SOCKET_RECEIVE_BUFFER_SIZE
Definition: winhttp.h:164
#define WINHTTP_OPTION_PROXY_PASSWORD
Definition: winhttp.h:185
#define WINHTTP_OPTION_USERNAME
Definition: winhttp.h:182
WORD INTERNET_PORT
Definition: winhttp.h:43
#define WINHTTP_AUTO_DETECT_TYPE_DHCP
Definition: winhttp.h:601
#define WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH
Definition: winhttp.h:135
#define WINHTTP_OPTION_MAX_CONNS_PER_SERVER
Definition: winhttp.h:127
#define WINHTTP_OPTION_CONTEXT_VALUE
Definition: winhttp.h:121
#define WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS
Definition: winhttp.h:141
#define WINHTTP_OPTION_HTTP_PROTOCOL_USED
Definition: winhttp.h:169
#define SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE
Definition: winhttp.h:346
#define WINHTTP_OPTION_SEND_TIMEOUT
Definition: winhttp.h:106
#define WINHTTP_OPTION_UNLOAD_NOTIFY_EVENT
Definition: winhttp.h:150
#define WINHTTP_OPTION_CONNECTION_INFO
Definition: winhttp.h:145
#define WINHTTP_OPTION_SERVER_CERT_CONTEXT
Definition: winhttp.h:130
#define WINHTTP_OPTION_SECURITY_FLAGS
Definition: winhttp.h:114
#define WINHTTP_HANDLE_TYPE_CONNECT
Definition: winhttp.h:502
#define WINHTTP_HANDLE_TYPE_SESSION
Definition: winhttp.h:501
#define SECURITY_FLAG_STRENGTH_WEAK
Definition: winhttp.h:348
#define WINHTTP_OPTION_PROXY_USERNAME
Definition: winhttp.h:184
#define WINHTTP_OPTION_ENABLE_FEATURE
Definition: winhttp.h:131
#define WINHTTP_INVALID_STATUS_CALLBACK
Definition: winhttp.h:492
#define WINHTTP_OPTION_PASSWORD
Definition: winhttp.h:183
#define WINHTTP_OPTION_URL
Definition: winhttp.h:116
#define WINHTTP_OPTION_RESOLVE_TIMEOUT
Definition: winhttp.h:103
#define WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE
Definition: winhttp.h:144
#define WINHTTP_OPTION_DISABLE_FEATURE
Definition: winhttp.h:125
#define WINHTTP_OPTION_CLIENT_CERT_CONTEXT
Definition: winhttp.h:122
#define WINHTTP_ENABLE_SSL_REVOCATION
Definition: winhttp.h:218
#define WINHTTP_AUTOPROXY_AUTO_DETECT
Definition: winhttp.h:604
#define WINHTTP_QUERY_STATUS_CODE
Definition: winhttp.h:379
#define WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
Definition: winhttp.h:69
#define WINHTTP_ACCESS_TYPE_NAMED_PROXY
Definition: winhttp.h:71
#define WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP
Definition: winhttp.h:204
#define ERROR_WINHTTP_INCORRECT_HANDLE_STATE
Definition: winhttp.h:246
#define ERROR_WINHTTP_INVALID_OPTION
Definition: winhttp.h:240
#define WINHTTP_ADDREQ_FLAG_ADD
Definition: winhttp.h:92
#define WINHTTP_OPTION_CONNECT_RETRIES
Definition: winhttp.h:105
#define WINHTTP_QUERY_FLAG_NUMBER
Definition: winhttp.h:439
#define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
Definition: winhttp.h:344
#define ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT
Definition: winhttp.h:267
#define WINHTTP_AUTO_DETECT_TYPE_DNS_A
Definition: winhttp.h:602
#define WINHTTP_OPTION_CONNECT_TIMEOUT
Definition: winhttp.h:104
#define WINHTTP_OPTION_AUTOLOGON_POLICY
Definition: winhttp.h:129
VOID(CALLBACK * WINHTTP_STATUS_CALLBACK)(_In_ HINTERNET, _In_ DWORD_PTR, _In_ DWORD, _In_ LPVOID, _In_ DWORD)
Definition: winhttp.h:592
#define WINHTTP_OPTION_RECEIVE_TIMEOUT
Definition: winhttp.h:107
#define INTERNET_DEFAULT_PORT
Definition: winhttp.h:40
#define ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR
Definition: winhttp.h:274
#define ERROR_WINHTTP_AUTODETECTION_FAILED
Definition: winhttp.h:276
#define INTERNET_SCHEME_HTTP
Definition: winhttp.h:47
#define ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
Definition: winhttp.h:245
#define WINHTTP_ACCESS_TYPE_NO_PROXY
Definition: winhttp.h:70
#define WINHTTP_AUTOPROXY_HOST_KEEPCASE
Definition: winhttp.h:606
#define WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT
Definition: winhttp.h:115
#define WINHTTP_AUTOPROXY_HOST_LOWERCASE
Definition: winhttp.h:607
#define WINHTTP_CALLBACK_STATUS_HANDLE_CREATED
Definition: winhttp.h:453
#define WINHTTP_FLAG_SECURE
Definition: winhttp.h:67
#define WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT
Definition: winhttp.h:108
#define WINHTTP_OPTION_WEB_SOCKET_SEND_BUFFER_SIZE
Definition: winhttp.h:165
#define INTERNET_SCHEME_HTTPS
Definition: winhttp.h:48
#define WINHTTP_OPTION_REDIRECT_POLICY
Definition: winhttp.h:140
#define WINHTTP_OPTION_SECURITY_KEY_BITNESS
Definition: winhttp.h:117
#define WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL
Definition: winhttp.h:168
#define WINHTTP_OPTION_SECURE_PROTOCOLS
Definition: winhttp.h:136
#define WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET
Definition: winhttp.h:160
#define SECURITY_FLAG_STRENGTH_STRONG
Definition: winhttp.h:350
#define SECURITY_FLAG_IGNORE_UNKNOWN_CA
Definition: winhttp.h:343
#define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA
Definition: winhttp.h:93
#define WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER
Definition: winhttp.h:128
#define WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE
Definition: winhttp.h:143
#define WINHTTP_OPTION_PARENT_HANDLE
Definition: winhttp.h:112
#define WINHTTP_AUTOPROXY_CONFIG_URL
Definition: winhttp.h:605
#define SECURITY_FLAG_IGNORE_CERT_CN_INVALID
Definition: winhttp.h:345
#define WINHTTP_TIME_FORMAT_BUFSIZE
Definition: winhttp.h:533
#define WINHTTP_OPTION_WORKER_THREAD_COUNT
Definition: winhttp.h:132
@ TARGET_MAX
@ REQUEST_FLAG_WEBSOCKET_UPGRADE
@ SCHEME_MAX
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define AF_INET6
Definition: winsock.h:363
#define AF_UNSPEC
Definition: winsock.h:338
BOOL winsock_init(void)
Definition: wintirpc.c:77
SECURITY_STATUS WINAPI FreeCredentialsHandle(PCredHandle phCredential)
Definition: wrapper.c:151
#define AI_ALL
Definition: ws2def.h:298
#define AI_DNS_ONLY
Definition: ws2def.h:312
#define NI_MAXHOST
Definition: ws2def.h:365
#define getaddrinfo
Definition: wspiapi.h:44
#define getnameinfo
Definition: wspiapi.h:45
#define freeaddrinfo
Definition: wspiapi.h:46
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182
unsigned char BYTE
Definition: xxhash.c:193