Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
4b559f02
Commit
4b559f02
authored
Jan 03, 2015
by
Erich E. Hoover
Committed by
Alexandre Julliard
Apr 23, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kernel32: Invalid console handles for new processes are 0, not INVALID_HANDLE_VALUE.
parent
0c525e79
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
66 additions
and
14 deletions
+66
-14
console.c
dlls/kernel32/console.c
+8
-7
environ.c
dlls/kernel32/environ.c
+6
-6
process.c
dlls/kernel32/tests/process.c
+52
-1
No files found.
dlls/kernel32/console.c
View file @
4b559f02
...
...
@@ -3119,24 +3119,25 @@ BOOL CONSOLE_Init(RTL_USER_PROCESS_PARAMETERS *params)
}
/* convert value from server:
* + 0 => INVALID_HANDLE_VALUE
* + INVALID_HANDLE_VALUE => TEB: 0, STARTUPINFO: INVALID_HANDLE_VALUE
* + 0 => TEB: 0, STARTUPINFO: INVALID_HANDLE_VALUE
* + console handle needs to be mapped
*/
if
(
!
params
->
hStdInput
)
params
->
hStdInput
=
INVALID_HANDLE_VALUE
;
if
(
!
params
->
hStdInput
||
params
->
hStdInput
==
INVALID_HANDLE_VALUE
)
params
->
hStdInput
=
0
;
else
if
(
VerifyConsoleIoHandle
(
console_handle_map
(
params
->
hStdInput
)))
{
params
->
hStdInput
=
console_handle_map
(
params
->
hStdInput
);
save_console_mode
(
params
->
hStdInput
);
}
if
(
!
params
->
hStdOutput
)
params
->
hStdOutput
=
INVALID_HANDLE_VALUE
;
if
(
!
params
->
hStdOutput
||
params
->
hStdOutput
==
INVALID_HANDLE_VALUE
)
params
->
hStdOutput
=
0
;
else
if
(
VerifyConsoleIoHandle
(
console_handle_map
(
params
->
hStdOutput
)))
params
->
hStdOutput
=
console_handle_map
(
params
->
hStdOutput
);
if
(
!
params
->
hStdError
)
params
->
hStdError
=
INVALID_HANDLE_VALUE
;
if
(
!
params
->
hStdError
||
params
->
hStdError
==
INVALID_HANDLE_VALUE
)
params
->
hStdError
=
0
;
else
if
(
VerifyConsoleIoHandle
(
console_handle_map
(
params
->
hStdError
)))
params
->
hStdError
=
console_handle_map
(
params
->
hStdError
);
...
...
dlls/kernel32/environ.c
View file @
4b559f02
...
...
@@ -464,9 +464,9 @@ void ENV_CopyStartupInformation(void)
startup_infoW
.
wShowWindow
=
rupp
->
wShowWindow
;
startup_infoW
.
cbReserved2
=
rupp
->
RuntimeInfo
.
MaximumLength
;
startup_infoW
.
lpReserved2
=
rupp
->
RuntimeInfo
.
MaximumLength
?
(
void
*
)
rupp
->
RuntimeInfo
.
Buffer
:
NULL
;
startup_infoW
.
hStdInput
=
rupp
->
hStdInput
;
startup_infoW
.
hStdOutput
=
rupp
->
hStdOutput
;
startup_infoW
.
hStdError
=
rupp
->
hStdError
;
startup_infoW
.
hStdInput
=
rupp
->
hStdInput
?
rupp
->
hStdInput
:
INVALID_HANDLE_VALUE
;
startup_infoW
.
hStdOutput
=
rupp
->
hStdOutput
?
rupp
->
hStdOutput
:
INVALID_HANDLE_VALUE
;
startup_infoW
.
hStdError
=
rupp
->
hStdError
?
rupp
->
hStdError
:
INVALID_HANDLE_VALUE
;
startup_infoA
.
cb
=
sizeof
(
startup_infoA
);
startup_infoA
.
lpReserved
=
NULL
;
...
...
@@ -485,9 +485,9 @@ void ENV_CopyStartupInformation(void)
startup_infoA
.
wShowWindow
=
rupp
->
wShowWindow
;
startup_infoA
.
cbReserved2
=
rupp
->
RuntimeInfo
.
MaximumLength
;
startup_infoA
.
lpReserved2
=
rupp
->
RuntimeInfo
.
MaximumLength
?
(
void
*
)
rupp
->
RuntimeInfo
.
Buffer
:
NULL
;
startup_infoA
.
hStdInput
=
rupp
->
hStdInput
;
startup_infoA
.
hStdOutput
=
rupp
->
hStdOutput
;
startup_infoA
.
hStdError
=
rupp
->
hStdError
;
startup_infoA
.
hStdInput
=
rupp
->
hStdInput
?
rupp
->
hStdInput
:
INVALID_HANDLE_VALUE
;
startup_infoA
.
hStdOutput
=
rupp
->
hStdOutput
?
rupp
->
hStdOutput
:
INVALID_HANDLE_VALUE
;
startup_infoA
.
hStdError
=
rupp
->
hStdError
?
rupp
->
hStdError
:
INVALID_HANDLE_VALUE
;
RtlReleasePebLock
();
}
...
...
dlls/kernel32/tests/process.c
View file @
4b559f02
...
...
@@ -57,7 +57,7 @@
wine_dbgstr_w(expected), wine_dbgstr_w(value)); \
} while (0)
static
HINSTANCE
hkernel32
;
static
HINSTANCE
hkernel32
,
hntdll
;
static
void
(
WINAPI
*
pGetNativeSystemInfo
)(
LPSYSTEM_INFO
);
static
BOOL
(
WINAPI
*
pGetSystemRegistryQuota
)(
PDWORD
,
PDWORD
);
static
BOOL
(
WINAPI
*
pIsWow64Process
)(
HANDLE
,
PBOOL
);
...
...
@@ -66,6 +66,7 @@ static BOOL (WINAPI *pVirtualFreeEx)(HANDLE, LPVOID, SIZE_T, DWORD);
static
BOOL
(
WINAPI
*
pQueryFullProcessImageNameA
)(
HANDLE
hProcess
,
DWORD
dwFlags
,
LPSTR
lpExeName
,
PDWORD
lpdwSize
);
static
BOOL
(
WINAPI
*
pQueryFullProcessImageNameW
)(
HANDLE
hProcess
,
DWORD
dwFlags
,
LPWSTR
lpExeName
,
PDWORD
lpdwSize
);
static
DWORD
(
WINAPI
*
pK32GetProcessImageFileNameA
)(
HANDLE
,
LPSTR
,
DWORD
);
static
struct
_TEB
*
(
WINAPI
*
pNtCurrentTeb
)(
void
);
static
HANDLE
(
WINAPI
*
pCreateJobObjectW
)(
LPSECURITY_ATTRIBUTES
sa
,
LPCWSTR
name
);
static
BOOL
(
WINAPI
*
pAssignProcessToJobObject
)(
HANDLE
job
,
HANDLE
process
);
static
BOOL
(
WINAPI
*
pIsProcessInJob
)(
HANDLE
process
,
HANDLE
job
,
PBOOL
result
);
...
...
@@ -208,6 +209,8 @@ static BOOL init(void)
if
((
p
=
strrchr
(
exename
,
'/'
))
!=
NULL
)
exename
=
p
+
1
;
hkernel32
=
GetModuleHandleA
(
"kernel32"
);
hntdll
=
GetModuleHandleA
(
"ntdll.dll"
);
pGetNativeSystemInfo
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"GetNativeSystemInfo"
);
pGetSystemRegistryQuota
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"GetSystemRegistryQuota"
);
pIsWow64Process
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"IsWow64Process"
);
...
...
@@ -216,6 +219,7 @@ static BOOL init(void)
pQueryFullProcessImageNameA
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"QueryFullProcessImageNameA"
);
pQueryFullProcessImageNameW
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"QueryFullProcessImageNameW"
);
pK32GetProcessImageFileNameA
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"K32GetProcessImageFileNameA"
);
pNtCurrentTeb
=
(
void
*
)
GetProcAddress
(
hntdll
,
"NtCurrentTeb"
);
pCreateJobObjectW
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"CreateJobObjectW"
);
pAssignProcessToJobObject
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"AssignProcessToJobObject"
);
pIsProcessInJob
=
(
void
*
)
GetProcAddress
(
hkernel32
,
"IsProcessInJob"
);
...
...
@@ -291,6 +295,16 @@ static void doChild(const char* file, const char* option)
siA
.
dwFlags
,
siA
.
wShowWindow
,
(
DWORD_PTR
)
siA
.
hStdInput
,
(
DWORD_PTR
)
siA
.
hStdOutput
,
(
DWORD_PTR
)
siA
.
hStdError
);
if
(
pNtCurrentTeb
)
{
RTL_USER_PROCESS_PARAMETERS
*
params
=
pNtCurrentTeb
()
->
Peb
->
ProcessParameters
;
/* check the console handles in the TEB */
childPrintf
(
hFile
,
"[TEB]
\n
hStdInput=%lu
\n
hStdOutput=%lu
\n
hStdError=%lu
\n\n
"
,
(
DWORD_PTR
)
params
->
hStdInput
,
(
DWORD_PTR
)
params
->
hStdOutput
,
(
DWORD_PTR
)
params
->
hStdError
);
}
/* since GetStartupInfoW is only implemented in win2k,
* zero out before calling so we can notice the difference
*/
...
...
@@ -2642,6 +2656,42 @@ static void test_BreakawayOk(HANDLE job)
ok
(
ret
,
"SetInformationJobObject error %u
\n
"
,
GetLastError
());
}
void
test_StartupNoConsole
(
void
)
{
#ifndef _WIN64
char
buffer
[
MAX_PATH
];
STARTUPINFOA
startup
;
PROCESS_INFORMATION
info
;
DWORD
code
;
if
(
!
pNtCurrentTeb
)
{
win_skip
(
"NtCurrentTeb not supported
\n
"
);
return
;
}
memset
(
&
startup
,
0
,
sizeof
(
startup
));
startup
.
cb
=
sizeof
(
startup
);
startup
.
dwFlags
=
STARTF_USESHOWWINDOW
;
startup
.
wShowWindow
=
SW_SHOWNORMAL
;
get_file_name
(
resfile
);
sprintf
(
buffer
,
"
\"
%s
\"
tests/process.c dump
\"
%s
\"
"
,
selfname
,
resfile
);
ok
(
CreateProcessA
(
NULL
,
buffer
,
NULL
,
NULL
,
TRUE
,
DETACHED_PROCESS
,
NULL
,
NULL
,
&
startup
,
&
info
),
"CreateProcess
\n
"
);
ok
(
WaitForSingleObject
(
info
.
hProcess
,
30000
)
==
WAIT_OBJECT_0
,
"Child process termination
\n
"
);
ok
(
GetExitCodeProcess
(
info
.
hProcess
,
&
code
),
"Getting exit code
\n
"
);
WritePrivateProfileStringA
(
NULL
,
NULL
,
NULL
,
resfile
);
okChildInt
(
"StartupInfoA"
,
"hStdInput"
,
(
UINT
)
INVALID_HANDLE_VALUE
);
okChildInt
(
"StartupInfoA"
,
"hStdOutput"
,
(
UINT
)
INVALID_HANDLE_VALUE
);
okChildInt
(
"StartupInfoA"
,
"hStdError"
,
(
UINT
)
INVALID_HANDLE_VALUE
);
okChildInt
(
"TEB"
,
"hStdInput"
,
0
);
okChildInt
(
"TEB"
,
"hStdOutput"
,
0
);
okChildInt
(
"TEB"
,
"hStdError"
,
0
);
release_memory
();
DeleteFileA
(
resfile
);
#endif
}
START_TEST
(
process
)
{
HANDLE
job
;
...
...
@@ -2690,6 +2740,7 @@ START_TEST(process)
test_SystemInfo
();
test_RegistryQuota
();
test_DuplicateHandle
();
test_StartupNoConsole
();
/* things that can be tested:
* lookup: check the way program to be executed is searched
* handles: check the handle inheritance stuff (+sec options)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment