[Bug 47186] New: Star Wars - The Old Republic (SWTOR) client/ launcher fails with 'Installation of drivers require admin permission' ( BitRaider)( existing service dependencies must be preserved by SCM when passed NULL)

wine-bugs at winehq.org wine-bugs at winehq.org
Mon May 13 03:39:19 CDT 2019


https://bugs.winehq.org/show_bug.cgi?id=47186

            Bug ID: 47186
           Summary: Star Wars - The Old Republic (SWTOR) client/launcher
                    fails with 'Installation of drivers require admin
                    permission' (BitRaider)(existing service dependencies
                    must be preserved by SCM when passed NULL)
           Product: Wine
           Version: 4.8
          Hardware: x86-64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: -unknown
          Assignee: wine-bugs at winehq.org
          Reporter: focht at gmx.net
      Distribution: ---

Hello folks,

continuation of bug 47176

There is a helper (console) app which is used to install and configure
BitRaider. At least three log file locations are of interest during
boostrapping of the game installer/launcher which includes set up of BitRaider.

--- snip ---
.wine/drive_c/ProgramData/BitRaider/common/logs/BR_Debuglog.txt
...
.wine/drive_c/Star Wars-The Old Republic/bitraider/logs/swtor_swtor.txt
...
.wine/drive_c/Star Wars-The Old Republic/logs/launcher_20190511.log
--- snip ---

'swtor_swtor.txt'

--- snip ---
...
2019/05/11 10:18:36.921:[INFO]MachineId: LAV9AVgtU0VCMUctcjMVNSIAbgBuADMA  PID:
133
2019/05/11 10:18:36.921:[INFO]Language ID: 1033  Kernel:
C:\windows\system32\ntoskrnl.exe
2019/05/11 10:18:36.921:[INFO]Host OS: Windows 7 [6.1.7601.21863] - 64-Bit -
Release Client. - Process Elevated - User Fully Elevated
2019/05/11 10:18:36.921:[INFO]Exepath: c:\star wars-the old
republic\bitraider\bin\brwc.exe
2019/05/11 10:18:36.921:[INFO]Command Parms: brdestpath="c:\star wars-the old
republic" brlocalebank=0 id=swtor_swtor -brnolaunch -brnoui brcallingpid=8
2019/05/11 10:18:36.928:[INFO]Connecting to Service Core, command: 13
2019/05/11 10:18:36.929:[INFO]CBRWCApp: Loaded common path "c:\star wars-the
old republic\Bitraider\bin\" for ID=swtor_swtor
2019/05/11 10:18:36.976:[INFO]STLEFE: Skipping extract to c:\Star Wars-The Old
Republic\bitraider\bin\BRException.exe; identical to reource
2019/05/11 10:18:36.979:[INFO]STLEFE: Skipping extract to
C:\ProgramData\BitRaider\common\BRException.exe; identical to reource
2019/05/11 10:18:36.980:[INFO]STLEFE: Skipping extract to c:\Star Wars-The Old
Republic\bitraider\bin\BRExtPipe.dll; identical to reource
2019/05/11 10:18:36.981:[INFO]STLEFE: Skipping extract to
C:\ProgramData\BitRaider\BRExtPipe.dll; identical to reource
2019/05/11 10:18:37.009:[CRIT](BRDriver64_1_3_3_E02B25FC): reading
'DependOnService' string under key
System\CurrentControlSet\Services\BRDriver64_1_3_3_E02B25FC failed. error code
0
2019/05/11 10:18:37.012:[INFO]CSTL-StartStopSupportServiceStub: CurrentState: 3
2019/05/11 10:18:38.013:[INFO]CSTL-StartStopSupportServiceStub: CurrentState: 1
2019/05/11 10:18:38.021:[INFO]STLEFE: Skipping extract to
C:\ProgramData\BitRaider\BRSptStub.exe; identical to reource
2019/05/11 10:18:38.031:[INFO]Attempting to install a new copy of the service
helper.
2019/05/11 10:18:38.266:[INFO]Support Service Successfully installed
2019/05/11 10:18:38.266:[CRIT](BRDriver64_1_3_3_E02B25FC): read
...
--- snip ---

App creates the service registry keys prior to SCM (see bug 47175 and bug
47176) and then uses SCM API to create the service entry.

Relevant part of trace log.

--- snip ---
$ pwd
/home/focht/.wine/drive_c/Star Wars-The Old Republic/bitraider/bin

$ WINEDEBUG=+seh,+relay,+server,+reg,+service wine ./brwc.exe
brdestpath="c:\star wars-the old republic" brlocalebank=0 id=swtor_swtor
-brnolaunch -brnoui brcallingpid=8 >>log.txt 2>&1
...
003c:Call advapi32.RegCreateKeyExW(80000002,0032f5d4
L"System\\CurrentControlSet\\Services\\BRDriver64_1_3_3_E02B25FC",00000000,0042ab4c,00000000,0000000e,00000000,0032efd0,0032efc8)
ret=0040b176
003c:trace:reg:NtCreateKey
(0x24,L"System\\CurrentControlSet\\Services\\BRDriver64_1_3_3_E02B25FC",L"",0,e,0x32ee14)
003c: create_key( access=0000000e, options=00000000,
objattr={rootdir=0024,attributes=00000000,sd={},name=L"System\\CurrentControlSet\\Services\\BRDriver64_1_3_3_E02B25FC"},
class=L"" )
003c: create_key() = 0 { hkey=0054, created=0 }
003c:trace:reg:NtCreateKey <- 0x54
003c:Ret  advapi32.RegCreateKeyExW() retval=00000000 ret=0040b176
003c:Call advapi32.RegSetValueExW(00000054,0042d644
L"DisplayName",00000000,00000001,005f2aa0,00000032) ret=0040b1b6
003c:trace:reg:NtSetValueKey (0x54,L"DisplayName",1,0x5f2aa0,52)
003c: set_key_value( hkey=0054, type=1, namelen=22, name=L"DisplayName",
data={42,00,52,00,44,00,72,00,69,00,76,00,65,00,72,00,36,00,34,00,5f,00,31,00,5f,00,33,00,5f,00,33,00,5f,00,45,00,30,00,32,00,42,00,32,00,35,00,46,00,43,00,00,00}
)
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b1b6
003c:Call advapi32.RegSetValueExW(00000054,0042d65c
L"ErrorControl",00000000,00000004,0032efbc,00000004) ret=0040b1e2
003c:trace:reg:NtSetValueKey (0x54,L"ErrorControl",4,0x32efbc,4)
003c: set_key_value( hkey=0054, type=4, namelen=24, name=L"ErrorControl",
data={01,00,00,00} )
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b1e2
003c:Call advapi32.RegSetValueExW(00000054,0042d684
L"ImagePath",00000000,00000001,0032efd4,00000084) ret=0040b26c
003c:trace:reg:NtSetValueKey (0x54,L"ImagePath",1,0x32efd4,134)
003c: set_key_value( hkey=0054, type=1, namelen=18, name=L"ImagePath",
data={5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,44,00,61,00,74,00,61,00,5c,00,42,00,69,00,74,00,52,00,61,00,69,00,64,00,65,00,72,00,5c,00,73,00,75,00,70,00,70,00,6f,00,72,00,74,00,5c,00,31,00,2e,00,33,00,2e,00,33,00,5c,00,45,00,30,00,32,00,42,00,32,00,35,00,46,00,43,00,5c,00,42,00,52,00,44,00,72,00,69,00,76,00,65,00,72,00,36,00,34,00,2e,00,73,00,79,00,73,00,00,00}
)
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b26c
003c:Call advapi32.RegSetValueExW(00000054,0042d698
L"Start",00000000,00000004,0032efb8,00000004) ret=0040b298
003c:trace:reg:NtSetValueKey (0x54,L"Start",4,0x32efb8,4)
003c: set_key_value( hkey=0054, type=4, namelen=10, name=L"Start",
data={03,00,00,00} )
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b298
003c:Call advapi32.RegSetValueExW(00000054,0042d6a4
L"Type",00000000,00000004,0032efc0,00000004) ret=0040b2c6
003c:trace:reg:NtSetValueKey (0x54,L"Type",4,0x32efc0,4)
003c: set_key_value( hkey=0054, type=4, namelen=8, name=L"Type",
data={02,00,00,00} )
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b2c6
003c:Call advapi32.RegSetValueExW(00000054,0042d6b0
L"Tag",00000000,00000004,0032efcc,00000004) ret=0040b2ee
003c:trace:reg:NtSetValueKey (0x54,L"Tag",4,0x32efcc,4)
003c: set_key_value( hkey=0054, type=4, namelen=6, name=L"Tag",
data={02,00,00,00} )
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b2ee
003c:Call advapi32.RegSetValueExW(00000054,0042d6c8
L"DependOnService",00000000,00000007,0032f1d4,0000000c) ret=0040b361
003c:trace:reg:NtSetValueKey (0x54,L"DependOnService",7,0x32f1d4,14)
003c: set_key_value( hkey=0054, type=7, namelen=30, name=L"DependOnService",
data={46,00,6c,00,74,00,4d,00,67,00,72,00,00,00} )
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b361
003c:Call advapi32.RegSetValueExW(00000054,0042d71c
L"Group",00000000,00000007,0032f3d4,00000032) ret=0040b3db
003c:trace:reg:NtSetValueKey (0x54,L"Group",7,0x32f3d4,52)
003c: set_key_value( hkey=0054, type=7, namelen=10, name=L"Group",
data={46,00,73,00,46,00,69,00,6c,00,74,00,65,00,72,00,20,00,41,00,63,00,74,00,69,00,76,00,69,00,74,00,79,00,20,00,4d,00,6f,00,6e,00,69,00,74,00,6f,00,72,00,00,00}
)
003c: set_key_value() = 0
003c:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040b3db
003c:Call advapi32.RegCloseKey(00000054) ret=0040b4be
003c: close_handle( handle=0054 )
003c: close_handle() = 0
003c:Ret  advapi32.RegCloseKey() retval=00000000 ret=0040b4be
003c:Call advapi32.RegCreateKeyExW(80000002,0032f5d4
L"System\\CurrentControlSet\\Services\\BRDriver64_1_3_3_E02B25FC\\Instances",00000000,0042ab4c,00000000,0000000e,00000000,0032efd0,0032efc8)
ret=0040b504
003c:trace:reg:NtCreateKey
(0x24,L"System\\CurrentControlSet\\Services\\BRDriver64_1_3_3_E02B25FC\\Instances",L"",0,e,0x32ee14)
003c: create_key( access=0000000e, options=00000000,
objattr={rootdir=0024,attributes=00000000,sd={},name=L"System\\CurrentControlSet\\Services\\BRDriver64_1_3_3_E02B25FC\\Instances"},
class=L"" )
003c: create_key() = 0 { hkey=0054, created=0 }
003c:trace:reg:NtCreateKey <- 0x54
003c:Ret  advapi32.RegCreateKeyExW() retval=00000000 ret=0040b504 
...
003c:Call advapi32.CreateServiceW(0014f2a0,005f2aa0
L"BRDriver64_1_3_3_E02B25FC",005f2aa0
L"BRDriver64_1_3_3_E02B25FC",000f01ff,00000002,00000003,00000001,005f2bd8
L"C:\\ProgramData\\BitRaider\\support\\1.3.3\\E02B25FC\\BRDriver64.sys",00000000,00000000,00000000,00000000,00000000)
ret=0040b048
003c:trace:service:CreateServiceW 0x14f2a0 L"BRDriver64_1_3_3_E02B25FC"
L"BRDriver64_1_3_3_E02B25FC" 
...
--- snip ---

'services.exe' side:

--- snip ---
...
0014:trace:service:svcctl_CreateServiceWOW64W Call
msvcrt._vsnprintf(00bbeff0,00000400,0041b0aa "(%s, %s, 0x%x, %s)\n",00bbf430)
ret=00401def
0014:Ret  msvcrt._vsnprintf() retval=0000008f ret=00401def
(L"BRDriver64_1_3_3_E02B25FC", L"BRDriver64_1_3_3_E02B25FC", 0xf01ff,
L"C:\\ProgramData\\BitRaider\\support\\1.3.3\\E02B25FC\\BRDriver64.sys") 
...
0014:trace:service:create_serviceW Call
msvcrt._vsnprintf(00bbf020,00000400,0041b0aa "(%s, %s, 0x%x, %s)\n",00bbf460)
ret=00401def 
...
0014:Call advapi32.RegCreateKeyW(00000024,00033d30
L"BRDriver64_1_3_3_E02B25FC",00bbf3c8) ret=004066d8
0014:trace:reg:NtCreateKey
(0x24,L"BRDriver64_1_3_3_E02B25FC",(null),0,2000000,0xbbf128)
0014: create_key( access=02000000, options=00000000,
objattr={rootdir=0024,attributes=00000000,sd={},name=L"BRDriver64_1_3_3_E02B25FC"},
class=L"" )
0014: create_key() = 0 { hkey=01a0, created=0 }
0014:trace:reg:NtCreateKey <- 0x1a0
0014:Ret  advapi32.RegCreateKeyW() retval=00000000 ret=004066d8
0014:Call advapi32.RegSetValueExW(000001a0,0041c670
L"DisplayName",00000000,00000001,00033e20,00000034) ret=0040655e
0014:trace:reg:NtSetValueKey (0x1a0,L"DisplayName",1,0x33e20,52)
0014: set_key_value( hkey=01a0, type=1, namelen=22, name=L"DisplayName",
data={42,00,52,00,44,00,72,00,69,00,76,00,65,00,72,00,36,00,34,00,5f,00,31,00,5f,00,33,00,5f,00,33,00,5f,00,45,00,30,00,32,00,42,00,32,00,35,00,46,00,43,00,00,00}
)
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040655e
0014:Call advapi32.RegSetValueExW(000001a0,0041c610
L"ImagePath",00000000,00000001,00033d80,00000086) ret=0040655e
0014:trace:reg:NtSetValueKey (0x1a0,L"ImagePath",1,0x33d80,134)
0014: set_key_value( hkey=01a0, type=1, namelen=18, name=L"ImagePath",
data={5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,44,00,61,00,74,00,61,00,5c,00,42,00,69,00,74,00,52,00,61,00,69,00,64,00,65,00,72,00,5c,00,73,00,75,00,70,00,70,00,6f,00,72,00,74,00,5c,00,31,00,2e,00,33,00,2e,00,33,00,5c,00,45,00,30,00,32,00,42,00,32,00,35,00,46,00,43,00,5c,00,42,00,52,00,44,00,72,00,69,00,76,00,65,00,72,00,36,00,34,00,2e,00,73,00,79,00,73,00,00,00}
)
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040655e
0014:Call advapi32.RegDeleteValueW(000001a0,0041c600 L"Group") ret=00406568
0014:trace:reg:NtDeleteValueKey (0x1a0,L"Group")
0014: delete_key_value( hkey=01a0, name=L"Group" )
0014: delete_key_value() = 0
0014:Ret  advapi32.RegDeleteValueW() retval=00000000 ret=00406568
0014:Call advapi32.RegSetValueExW(000001a0,0041c590
L"ObjectName",00000000,00000001,00034770,00000018) ret=0040655e
0014:trace:reg:NtSetValueKey (0x1a0,L"ObjectName",1,0x34770,24)
0014: set_key_value( hkey=01a0, type=1, namelen=20, name=L"ObjectName",
data={4c,00,6f,00,63,00,61,00,6c,00,53,00,79,00,73,00,74,00,65,00,6d,00,00,00}
)
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040655e
0014:Call advapi32.RegDeleteValueW(000001a0,0041c570 L"Description")
ret=00406568
0014:trace:reg:NtDeleteValueKey (0x1a0,L"Description")
0014: delete_key_value( hkey=01a0, name=L"Description" )
0014: delete_key_value() = OBJECT_NAME_NOT_FOUND
0014:Ret  advapi32.RegDeleteValueW() retval=00000002 ret=00406568
0014:Call advapi32.RegDeleteValueW(000001a0,0041c5e0 L"DependOnService")
ret=0040622f
0014:trace:reg:NtDeleteValueKey (0x1a0,L"DependOnService")
0014: delete_key_value( hkey=01a0, name=L"DependOnService" )
0014: delete_key_value() = 0
0014:Ret  advapi32.RegDeleteValueW() retval=00000000 ret=0040622f
0014:Call advapi32.RegDeleteValueW(000001a0,0041c5b0 L"DependOnGroup")
ret=0040622f
0014:trace:reg:NtDeleteValueKey (0x1a0,L"DependOnGroup")
0014: delete_key_value( hkey=01a0, name=L"DependOnGroup" )
0014: delete_key_value() = OBJECT_NAME_NOT_FOUND
0014:Ret  advapi32.RegDeleteValueW() retval=00000002 ret=0040622f
0014:Call advapi32.RegSetValueExW(000001a0,0041c650
L"Start",00000000,00000004,00033c94,00000004) ret=004067f9
0014:trace:reg:NtSetValueKey (0x1a0,L"Start",4,0x33c94,4)
0014: set_key_value( hkey=01a0, type=4, namelen=10, name=L"Start",
data={03,00,00,00} )
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=004067f9
0014:Call advapi32.RegSetValueExW(000001a0,0041c630
L"ErrorControl",00000000,00000004,00033c98,00000004) ret=0040682e
0014:trace:reg:NtSetValueKey (0x1a0,L"ErrorControl",4,0x33c98,4)
0014: set_key_value( hkey=01a0, type=4, namelen=24, name=L"ErrorControl",
data={01,00,00,00} )
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040682e
0014:Call advapi32.RegSetValueExW(000001a0,0041c660
L"Type",00000000,00000004,00033c90,00000004) ret=00406863
0014:trace:reg:NtSetValueKey (0x1a0,L"Type",4,0x33c90,4)
0014: set_key_value( hkey=01a0, type=4, namelen=8, name=L"Type",
data={02,00,00,00} )
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=00406863
0014:Call advapi32.RegSetValueExW(000001a0,0041c540
L"PreshutdownTimeout",00000000,00000004,00033cd0,00000004) ret=0040689b
0014:trace:reg:NtSetValueKey (0x1a0,L"PreshutdownTimeout",4,0x33cd0,4)
0014: set_key_value( hkey=01a0, type=4, namelen=36, name=L"PreshutdownTimeout",
data={20,bf,02,00} )
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040689b
0014:Call advapi32.RegSetValueExW(000001a0,0041c540
L"PreshutdownTimeout",00000000,00000004,00033cd0,00000004) ret=004068cc
0014:trace:reg:NtSetValueKey (0x1a0,L"PreshutdownTimeout",4,0x33cd0,4)
0014: set_key_value( hkey=01a0, type=4, namelen=36, name=L"PreshutdownTimeout",
data={20,bf,02,00} )
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=004068cc
0014:Call advapi32.RegSetValueExW(000001a0,0041c518
L"WOW64",00000000,00000004,00bbf3c4,00000004) ret=0040694c
0014:trace:reg:NtSetValueKey (0x1a0,L"WOW64",4,0xbbf3c4,4)
0014: set_key_value( hkey=01a0, type=4, namelen=10, name=L"WOW64",
data={01,00,00,00} )
0014: set_key_value() = 0
0014:Ret  advapi32.RegSetValueExW() retval=00000000 ret=0040694c
0014:Call advapi32.RegDeleteValueW(000001a0,0041c588 L"Tag") ret=00406969
0014:trace:reg:NtDeleteValueKey (0x1a0,L"Tag")
0014: delete_key_value( hkey=01a0, name=L"Tag" )
0014: delete_key_value() = 0
0014:Ret  advapi32.RegDeleteValueW() retval=00000000 ret=00406969
0014:Call advapi32.RegCloseKey(000001a0) ret=004066e8
0014: close_handle( handle=01a0 )
0014: close_handle() = 0
0014:Ret  advapi32.RegCloseKey() retval=00000000 ret=004066e8  
--- snip ---

The app passes NULL 'lpDependencies' in call to 'advapi32.CreateServiceW' hence
Wine deletes the registry data for 'DependOnService'. This leads to validation
failure leading, causing another instance of infamous "Installation of the
driver and support components require administrative permission acknowledgment.
Try invoking the client again. nInstaller cannot continue. Exiting." message.

Microsoft documentation:

https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-createservicea

--- quote ---
lpDependencies

A pointer to a double null-terminated array of null-separated names of services
or load ordering groups that the system must start before this service. Specify
NULL or an empty string if the service has no dependencies. Dependency on a
group means that this service can run if at least one member of the group is
running after an attempt to start all members of the group.

You must prefix group names with SC_GROUP_IDENTIFIER so that they can be
distinguished from a service name, because services and service groups share
the same name space. 
--- quote ---

"Specify NULL or an empty string if the service has no dependencies."
apparently the documentation is not accurate if Windows SCM keeps the existing
data.

Wine source:

https://source.winehq.org/git/wine.git/blob/HEAD:/programs/services/services.c#l204

--- snip ---
 204 static DWORD reg_set_string_value(HKEY hKey, LPCWSTR value_name, LPCWSTR
string)
 205 {
 206     if (!string)
 207     {
 208         DWORD err;
 209         err = RegDeleteValueW(hKey, value_name);
 210         if (err != ERROR_FILE_NOT_FOUND)
 211             return err;
 212 
 213         return ERROR_SUCCESS;
 214     }
 215 
 216     return RegSetValueExW(hKey, value_name, 0, REG_SZ, (const
BYTE*)string, sizeof(WCHAR)*(lstrlenW(string) + 1));
 217 }
--- snip ---

$ sha1sum SWTOR_setup.exe 
c538935eff4ec90ce2e48dc7e515a8dec2f15f58  SWTOR_setup.exe

$ du -sh SWTOR_setup.exe 
32M    SWTOR_setup.exe

$ wine --version
wine-4.8

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