Websockets uses boost asio. And asio has a Static variable to ensure that winsock is initialised before main. Looks like in case of a dll, it may not be safe to initialise Winsock from global object constructors.
Asio exposes an option to prevent asio from initializing winsock and let the user code do the same.
See winsock_init.cpp:
// To prevent asio from initialising Winsock, the object must be constructed
// before any Asio's own global objects. With MSVC, this may be accomplished
// by adding the following code to the DLL:
//
// #pragma warning(push)
// #pragma warning(disable:4073)
// #pragma init_seg(lib)
// boost::asio::detail::winsock_init<>::manual manual_winsock_init;
// #pragma warning(pop)
Run any casablanca sample under AppVerifier and the below error is seen for this issue:
Error:
<avrf:message>Illegal networking API called from DllMain</avrf:message>
Stack:
<avrf:trace>vfnet!+7ff99efc444d ( @ 0)</avrf:trace>
<avrf:trace>vfnet!+7ff99efcb415 ( @ 0)</avrf:trace>
<avrf:trace>cpprest110d_2_1!boost::asio::detail::winsock_init_base::startup+8f (c:\work\dd\casa\tools\packages\boost.1.55.0.16\lib\native\include\boost\asio\detail\impl\winsock_init.ipp @ 39)</avrf:trace>
<avrf:trace>cpprest110d_2_1!boost::asio::detail::winsock_init<2,0>::winsock_init<2,0>+33 (c:\work\dd\casa\tools\packages\boost.1.55.0.16\lib\native\include\boost\asio\detail\winsock_init.hpp @ 58)</avrf:trace>
<avrf:trace>cpprest110d_2_1!boost::asio::detail::`dynamic initializer for 'winsock_init_instance''+2f (c:\work\dd\casa\tools\packages\boost.1.55.0.16\lib\native\include\boost\asio\detail\winsock_init.hpp @ 116)</avrf:trace>
<avrf:trace>MSVCR110D!initterm+2c ( @ 0)</avrf:trace>
<avrf:trace>cpprest110d_2_1!_CRT_INIT+105 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtdll.c @ 300)</avrf:trace>
<avrf:trace>cpprest110d_2_1!__DllMainCRTStartup+8b (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtdll.c @ 502)</avrf:trace>
<avrf:trace>cpprest110d_2_1!_DllMainCRTStartup+31 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtdll.c @ 473)</avrf:trace>
<avrf:trace>verifier!VerifierGetPropertyValueByName+671e ( @ 0)</avrf:trace>
Asio exposes an option to prevent asio from initializing winsock and let the user code do the same.
See winsock_init.cpp:
// To prevent asio from initialising Winsock, the object must be constructed
// before any Asio's own global objects. With MSVC, this may be accomplished
// by adding the following code to the DLL:
//
// #pragma warning(push)
// #pragma warning(disable:4073)
// #pragma init_seg(lib)
// boost::asio::detail::winsock_init<>::manual manual_winsock_init;
// #pragma warning(pop)
Run any casablanca sample under AppVerifier and the below error is seen for this issue:
Error:
<avrf:message>Illegal networking API called from DllMain</avrf:message>
Stack:
<avrf:trace>vfnet!+7ff99efc444d ( @ 0)</avrf:trace>
<avrf:trace>vfnet!+7ff99efcb415 ( @ 0)</avrf:trace>
<avrf:trace>cpprest110d_2_1!boost::asio::detail::winsock_init_base::startup+8f (c:\work\dd\casa\tools\packages\boost.1.55.0.16\lib\native\include\boost\asio\detail\impl\winsock_init.ipp @ 39)</avrf:trace>
<avrf:trace>cpprest110d_2_1!boost::asio::detail::winsock_init<2,0>::winsock_init<2,0>+33 (c:\work\dd\casa\tools\packages\boost.1.55.0.16\lib\native\include\boost\asio\detail\winsock_init.hpp @ 58)</avrf:trace>
<avrf:trace>cpprest110d_2_1!boost::asio::detail::`dynamic initializer for 'winsock_init_instance''+2f (c:\work\dd\casa\tools\packages\boost.1.55.0.16\lib\native\include\boost\asio\detail\winsock_init.hpp @ 116)</avrf:trace>
<avrf:trace>MSVCR110D!initterm+2c ( @ 0)</avrf:trace>
<avrf:trace>cpprest110d_2_1!_CRT_INIT+105 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtdll.c @ 300)</avrf:trace>
<avrf:trace>cpprest110d_2_1!__DllMainCRTStartup+8b (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtdll.c @ 502)</avrf:trace>
<avrf:trace>cpprest110d_2_1!_DllMainCRTStartup+31 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtdll.c @ 473)</avrf:trace>
<avrf:trace>verifier!VerifierGetPropertyValueByName+671e ( @ 0)</avrf:trace>