1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <winsock2.h> 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/winsock_init.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/lazy_instance.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass WinsockInitSingleton { 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WinsockInitSingleton() { 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott WORD winsock_ver = MAKEWORD(2, 2); 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott WSAData wsa_data; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool did_init = (WSAStartup(winsock_ver, &wsa_data) == 0); 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (did_init) { 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DCHECK(wsa_data.wVersion == winsock_ver); 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The first time WSAGetLastError is called, the delay load helper will 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // resolve the address with GetProcAddress and fixup the import. If a 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // third party application hooks system functions without correctly 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // restoring the error code, it is possible that the error code will be 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // overwritten during delay load resolution. The result of the first 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // call may be incorrect, so make sure the function is bound and future 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // results will be correct. 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott WSAGetLastError(); 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ~WinsockInitSingleton() { 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't call WSACleanup() since the worker pool threads can continue to 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // call getaddrinfo() after Winsock has shutdown, which can lead to crashes. 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstatic base::LazyInstance<WinsockInitSingleton> g_winsock_init_singleton( 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::LINKER_INITIALIZED); 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid EnsureWinsockInit() { 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen g_winsock_init_singleton.Get(); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 52