[Bug 42939] NOX App Player v3.8.x (Android Emulator) fails in post-installation step (VirtualBox COM Server raises assert: failed to set self TLS. lasterr=87 thread 'CGMgr')
wine-bugs at winehq.org
wine-bugs at winehq.org
Fri Mar 15 10:36:31 CDT 2019
https://bugs.winehq.org/show_bug.cgi?id=42939
Anastasius Focht <focht at gmx.net> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |focht at gmx.net
Component|-unknown |kernel32
Summary|NOX App Player - Not |NOX App Player v3.8.x
|installing properly |(Android Emulator) fails in
| |post-installation step
| |(VirtualBox COM Server
| |raises assert: failed to
| |set self TLS. lasterr=87
| |thread 'CGMgr')
Fixed by SHA1| |e99811aee2dff88c41d6e287540
| |1810a85325839
Resolution|--- |FIXED
Status|UNCONFIRMED |RESOLVED
URL| |https://web.archive.org/web
| |/20170519011527/https://res
| |05.bignox.com/g5/M00/00/E4/
| |CqtxtVkNc5mAOV1_EXe7iLa6_6E
| |123.exe?filename=nox_setup_
| |v3.8.2.0_full_intl.exe
Keywords| |download, Installer
--- Comment #5 from Anastasius Focht <focht at gmx.net> ---
Hello folks,
confirming with old version of the app (newer version v6.x suffers from
different bugs).
This was fixed some time ago (Wine 2.16) by commit
https://source.winehq.org/git/wine.git/commitdiff/e99811aee2dff88c41d6e2875401810a85325839
("kernel32: Implement SetDefaultDllDirectories.")
Thanks Alexandre
--- snip ---
$ WINEDEBUG=+seh,+relay,+service,+msi wine ./nox_setup_v3.8.2.0_full_intl.exe
>>log.txt 2>&1
...
0043:Call KERNEL32.CreateProcessW(00000000,021ed110 L"\"C:\\Program Files
(x86)\\Bignox\\BigNoxVM\\RT\\BigNoxVMMgr.exe\" list
vms",00000000,00000000,00000001,00000000,00000000,00000000,021ed0b8,021ed510)
ret=0040ffc1
...
0124:Call KERNEL32.__wine_kernel_init() ret=7bcd8235
...
0043:Ret KERNEL32.CreateProcessW() retval=00000001 ret=0040ffc1
...
0124:Call KERNEL32.CreateProcessW(00000000,0023efc0 L"\"C:\\Program Files
(x86)\\Bignox\\BigNoxVM\\RT\\NoxVMSVC.exe\"
-Embedding",00000000,00000000,00000000,00000008,00000000,00000000,0023ef50,0023ef30)
ret=7fb6bb517a01
...
012e:Call KERNEL32.__wine_kernel_init() ret=7bcd8235
0124:Ret KERNEL32.CreateProcessW() retval=00000001 ret=7fb6bb517a01
...
0124:Call PE DLL (proc=0x2e632c,module=0x240000
L"VBoxRT.dll",reason=PROCESS_ATTACH,res=0x1)
...
013c:Call
msvcr100._beginthreadex(00000000,00000000,002e3490,00772fb0,00000000,011abf00)
ret=002e35a4
013c:Call
KERNEL32.CreateThread(00000000,00000000,002e3490,00772fb0,00000000,011abf00)
ret=7fd10ce8279c
013c:Ret KERNEL32.CreateThread() retval=00000130 ret=7fd10ce8279c
013c:Ret msvcr100._beginthreadex() retval=00000130 ret=002e35a4
...
0141:Starting thread proc 0x2e3490 (arg=0x772fb0)
0141:Call KERNEL32.TlsSetValue(ffffffff,00772fb0) ret=002e34b9
0141:Ret KERNEL32.TlsSetValue() retval=00000000 ret=002e34b9
0141:Call msvcr100.memcpy(00580920,00441600,00000022) ret=0028a95b
0141:Ret msvcr100.memcpy() retval=00580920 ret=0028a95b
0141:Call msvcr100.memcpy(00580942,00447394,00000006) ret=0028a95b
0141:Ret msvcr100.memcpy() retval=00580942 ret=0028a95b
0141:Call msvcr100.memcpy(00580948,00441624,0000000d) ret=0028a95b
0141:Ret msvcr100.memcpy() retval=00580948 ret=0028a95b
0141:Call msvcr100.memcpy(00580955,0045ca08,00000034) ret=0028a95b
0141:Ret msvcr100.memcpy() retval=00580955 ret=0028a95b
0141:Call msvcr100.memcpy(00580989,00441633,00000001) ret=0028a95b
0141:Ret msvcr100.memcpy() retval=00580989 ret=0028a95b
...
0141:Call KERNEL32.GetLastError() ret=002d9d75
0141:Ret KERNEL32.GetLastError() retval=00000057 ret=002d9d75
...
0141:Call ws2_32.WSASetLastError(00000057) ret=002d9dcd
0141:Ret ws2_32.WSASetLastError() retval=00000057 ret=002d9dcd
0141:Call KERNEL32.GetLastError() ret=002d9d75
0141:Ret KERNEL32.GetLastError() retval=00000057 ret=002d9d75
0141:Call ws2_32.WSAGetLastError() ret=002d9d7e
0141:Ret ws2_32.WSAGetLastError() retval=00000057 ret=002d9d7e
0141:Call msvcr100._errno() ret=002d9d87
0141:Ret msvcr100._errno() retval=000af490 ret=002d9d87
0141:Call msvcr100.getenv(00458f68 "VBOX_ASSERT") ret=002cc79d
0141:Ret msvcr100.getenv() retval=00000000 ret=002cc79d
0141:Call msvcr100._errno() ret=002d9db7
0141:Ret msvcr100._errno() retval=000af490 ret=002d9db7
0141:Call ws2_32.WSASetLastError(00000057) ret=002d9dcd
0141:Ret ws2_32.WSASetLastError() retval=00000057 ret=002d9dcd
trace:seh:raise_exception code=80000003 flags=0 addr=0x2e34f8 ip=2e34f8
tid=0141
trace:seh:raise_exception info[0]=0000000000000000
trace:seh:raise_exception rax=0000000000000001 rbx=0000000000000000
rcx=0000000000000057 rdx=00000000014aeac0
trace:seh:raise_exception rsi=0000000000000141 rdi=0000000000772fb0
rbp=00000000014ae650 rsp=00000000014ae4e0
trace:seh:raise_exception r8=0000000000000000 r9=00000000014ae002
r10=0000000000000000 r11=0000000000000000
trace:seh:raise_exception r12=00000000011ab77e r13=00000000011ab77f
r14=00000000011ab910 r15=00000000011ab910
trace:seh:RtlVirtualUnwind type 1 rip 2e34f7 rsp 14ae4e0
...
wine: Unhandled exception 0x80000003 in thread 141 at address 0x2e34f8 (thread
0141), starting debugger...
--- snip ---
For easier reproduce, start the BigNoxVMMgr app with some command which starts
the COM server:
--- snip ---
$ pwd
/home/focht/.wine/drive_c/Program Files (x86)/Bignox/BigNoxVM/RT
$ wine BigNoxVMMgr.exe list vms
...
--- snip ---
The app creates a few log files.
'.wine/drive_c/users/focht/.BigNox/NoxVMSVC.log':
--- snip ---
VirtualBox COM Server 4.3.12_OSE r2807 win.amd64 (Jan 20 2017 20:57:39) release
log
00:00:00.000000 Log opened 2019-03-15T11:34:16.289886000Z
00:00:00.000000 Build Type: release
00:00:00.000000 OS Product: Windows 7
00:00:00.000000 OS Release: 6.1.7601
00:00:00.000000 OS Service Pack: 1
00:00:00.000000 Host RAM: 15920MB total, 12411MB available
00:00:00.000000 Executable: unknown
00:00:00.000000 Process ID: 301
00:00:00.000000 Package type: WINDOWS_64BITS_GENERIC (OSE)
00:00:00.000000
00:00:00.000000 !!Assertion Failed!!
00:00:00.000000 Expression: <NULL>
00:00:00.000000 Location :
C:\vm\vboxOld\src\VBox\Runtime\r3\win\thread-win.cpp(209) unsigned int __cdecl
rtThreadNativeMain(void *)
00:00:00.000000 failed to set self TLS. lasterr=87 thread 'CGMgr'
00:00:00.000000 main USBLibInit: USB Service not found
00:00:00.000000 main failed to get the sun_VBoxNetFlt component, error
(0x80004001)
00:00:00.000000 main netIfListHostAdapters: EnumComponents error
(0x80004001)HostDnsMonitorProxy: Host's DNS information updated:
00:00:00.000000 main Support driver version mismatch: DriverVersion=too-old
ClientVersion=0x1a0007
00:00:00.000000 main VDInit finished
--- snip ---
'.wine/drive_c/users/focht/2019-03-15-11-34-17.010-VBox-301.log':
--- snip ---
Log created: 2019-03-15T11:34:17.109176000Z
Executable: VBox
Commandline: "C:\Program Files (x86)\Bignox\BigNoxVM\RT\NoxVMSVC.exe"
-Embedding
failed to set self TLS. lasterr=87 thread 'CGMgr'
--- snip ---
Since they forked off from VirtualBox Open-Source project, the corresponding
source can be traced back.
https://github.com/mirror/vbox/blob/master/src/VBox/Runtime/r3/win/thread-win.cpp#L239
--- snip ---
/*******************************************************************************
* Defined Constants And Macros
*
*******************************************************************************/
/** The TLS index allocated for storing the RTTHREADINT pointer. */
static DWORD g_dwSelfTLS = TLS_OUT_OF_INDEXES;
...
DECLHIDDEN(int) rtThreadNativeInit(void)
{
g_dwSelfTLS = TlsAlloc();
if (g_dwSelfTLS == TLS_OUT_OF_INDEXES)
return VERR_NO_TLS_FOR_SELF;
return VINF_SUCCESS;
}
...
/**
* Wrapper which unpacks the param stuff and calls thread function.
*/
static unsigned __stdcall rtThreadNativeMain(void *pvArgs)
{
DWORD dwThreadId = GetCurrentThreadId();
PRTTHREADINT pThread = (PRTTHREADINT)pvArgs;
if (!TlsSetValue(g_dwSelfTLS, pThread))
AssertReleaseMsgFailed(("failed to set self TLS. lasterr=%d thread
'%s'\n", GetLastError(), pThread->szName));
if (IsDebuggerPresent())
rtThreadWinTellDebuggerThreadName(dwThreadId, &pThread->szName[0]);
int rc = rtThreadMain(pThread, dwThreadId, &pThread->szName[0]);
TlsSetValue(g_dwSelfTLS, NULL);
rtThreadNativeUninitComAndOle();
_endthreadex(rc);
return rc;
}
--- snip ---
https://github.com/mirror/vbox/blob/b9657cd5351cf17432b664009cc25bb480dc64c1/src/VBox/Runtime/common/misc/thread.cpp#L126
--- snip ---
/**
* Initializes the thread database.
*
* @returns iprt status code.
*/
DECLHIDDEN(int) rtThreadInit(void)
{
#ifdef IN_RING3
int rc = VINF_ALREADY_INITIALIZED;
if (g_ThreadRWSem == NIL_RTSEMRW)
{
/*
* We assume the caller is the 1st thread, which we'll call 'main'.
* But first, we'll create the semaphore.
*/
rc = RTSemRWCreateEx(&g_ThreadRWSem, RTSEMRW_FLAGS_NO_LOCK_VAL,
NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_NONE, NULL);
if (RT_SUCCESS(rc))
{
rc = rtThreadNativeInit();
if (RT_SUCCESS(rc))
rc = rtThreadAdopt(RTTHREADTYPE_DEFAULT, 0,
RTTHREADINT_FLAGS_MAIN, "main");
if (RT_SUCCESS(rc))
rc = rtSchedNativeCalcDefaultPriority(RTTHREADTYPE_DEFAULT);
if (RT_SUCCESS(rc))
{
g_frtThreadInitialized = true;
return VINF_SUCCESS;
}
/* failed, clear out */
RTSemRWDestroy(g_ThreadRWSem);
g_ThreadRWSem = NIL_RTSEMRW;
}
}
...
--- snip ---
https://github.com/mirror/vbox/blob/b9657cd5351cf17432b664009cc25bb480dc64c1/src/VBox/Runtime/r3/win/init-win.cpp#L228
--- snip ---
static int rtR3InitNativeObtrusiveWorker(void)
{
/*
* Disable error popups.
*/
UINT fOldErrMode = SetErrorMode(SEM_FAILCRITICALERRORS |
SEM_NOOPENFILEERRORBOX);
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX |
fOldErrMode);
/*
* Restrict DLL searching for the process on windows versions which allow
* us to do so.
* - The first trick works on XP SP1+ and disables the searching of the
* current directory.
* - The second trick is W7 w/ KB2533623 and W8+, it restrict the DLL
* searching to the application directory and the System32 directory.
*/
int rc = VINF_SUCCESS;
typedef BOOL (WINAPI *PFNSETDLLDIRECTORY)(LPCWSTR);
PFNSETDLLDIRECTORY pfnSetDllDir =
(PFNSETDLLDIRECTORY)GetProcAddress(g_hModKernel32, "SetDllDirectoryW");
if (pfnSetDllDir)
{
if (pfnSetDllDir(L""))
g_enmWinLdrProt = RTR3WINLDRPROT_NO_CWD;
else
rc = VERR_INTERNAL_ERROR_3;
}
/** @bugref 6861: Observed GUI issues on Vista (32-bit and 64-bit). */
if (g_enmWinVer > kRTWinOSType_VISTA)
{
typedef BOOL(WINAPI *PFNSETDEFAULTDLLDIRECTORIES)(DWORD);
PFNSETDEFAULTDLLDIRECTORIES pfnSetDefDllDirs;
pfnSetDefDllDirs =
(PFNSETDEFAULTDLLDIRECTORIES)GetProcAddress(g_hModKernel32,
"SetDefaultDllDirectories");
if (pfnSetDefDllDirs)
{
if (pfnSetDefDllDirs(LOAD_LIBRARY_SEARCH_APPLICATION_DIR |
LOAD_LIBRARY_SEARCH_SYSTEM32))
g_enmWinLdrProt = RTR3WINLDRPROT_SAFE;
else if (RT_SUCCESS(rc))
rc = VERR_INTERNAL_ERROR_4;
}
}
return rc;
}
...
DECLHIDDEN(int) rtR3InitNativeFirst(uint32_t fFlags)
{
/*
* Make sure we've got the handles of the two main Windows NT dlls.
*/
g_hModKernel32 = GetModuleHandleW(L"kernel32.dll");
if (g_hModKernel32 == NULL)
return VERR_INTERNAL_ERROR_2;
g_hModNtDll = GetModuleHandleW(L"ntdll.dll");
if (g_hModNtDll == NULL)
return VERR_INTERNAL_ERROR_2;
rtR3InitWindowsVersion();
int rc = VINF_SUCCESS;
if (!(fFlags & RTR3INIT_FLAGS_UNOBTRUSIVE))
rc = rtR3InitNativeObtrusiveWorker();
return rc;
}
--- snip ---
https://github.com/mirror/vbox/blob/b9657cd5351cf17432b664009cc25bb480dc64c1/src/VBox/Runtime/r3/init.cpp#L368
--- snip ---
**
* rtR3Init worker.
*/
static int rtR3InitBody(uint32_t fFlags, int cArgs, char ***papszArgs, const
char *pszProgramPath)
{
/*
* Early native initialization.
*/
int rc = rtR3InitNativeFirst(fFlags);
AssertMsgRCReturn(rc, ("rtR3InitNativeFirst failed with %Rrc\n", rc), rc);
/*
* Disable error popups.
*/
#if defined(RT_OS_OS2) /** @todo move to private code. */
DosError(FERR_DISABLEHARDERR);
#endif
/*
* Init C runtime locale before we do anything that may end up converting
* paths or we'll end up using the "C" locale for path conversion.
*/
setlocale(LC_CTYPE, "");
/*
* The Process ID.
*/
#ifdef _MSC_VER
g_ProcessSelf = _getpid(); /* crappy ansi compiler */
#else
g_ProcessSelf = getpid();
#endif
/*
* Save the init flags.
*/
g_fInitFlags |= fFlags;
#if !defined(IN_GUEST) && !defined(RT_NO_GIP)
# ifdef VBOX
/*
* This MUST be done as the very first thing, before any file is opened.
* The log is opened on demand, but the first log entries may be caused
* by rtThreadInit() below.
*/
const char *pszDisableHostCache = getenv("VBOX_DISABLE_HOST_DISK_CACHE");
if ( pszDisableHostCache != NULL
&& *pszDisableHostCache
&& strcmp(pszDisableHostCache, "0") != 0)
{
RTFileSetForceFlags(RTFILE_O_WRITE, RTFILE_O_WRITE_THROUGH, 0);
RTFileSetForceFlags(RTFILE_O_READWRITE, RTFILE_O_WRITE_THROUGH, 0);
}
# endif /* VBOX */
#endif /* !IN_GUEST && !RT_NO_GIP */
/*
* Thread Thread database and adopt the caller thread as 'main'.
* This must be done before everything else or else we'll call into
threading
* without having initialized TLS entries and suchlike.
*/
rc = rtThreadInit();
AssertMsgRCReturn(rc, ("Failed to initialize threads, rc=%Rrc!\n", rc),
rc);
...
--- snip ---
The failing 'SetDefaultDllDirectories' call in 'rtR3InitNativeObtrusiveWorker'
causes an internal assert in main thread. The logging functionality which is
used by the assert() implementation gathers/dumps various system info which
uses helper threads. The helper threads rely on the app's thread "database"
initialization. Since the assert() was raised very early in main thread,
'rtThreadInit' had not been called yet. This results in a failure to set TLS
data upon thread entry, causing another debug assert (int 3).
$ sha1sum nox_setup_v3.8.2.0_full_intl.exe
duc79f8639c3ae13352dea3362766d54334152351a nox_setup_v3.8.2.0_full_intl.exe
$ du -sh nox_setup_v3.8.2.0_full_intl.exe
280M nox_setup_v3.8.2.0_full_intl.exe
$ wine --version
wine-4.3-338-gf34f13825f
Regards
--
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.
More information about the wine-bugs
mailing list