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
85df0c61
Commit
85df0c61
authored
Dec 10, 2015
by
Sebastian Lackner
Committed by
Alexandre Julliard
Dec 10, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll/tests: Add more tests for ProcessDebugFlags.
Signed-off-by:
Sebastian Lackner
<
sebastian@fds-team.de
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
e44f8eaa
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
123 additions
and
37 deletions
+123
-37
info.c
dlls/ntdll/tests/info.c
+123
-37
No files found.
dlls/ntdll/tests/info.c
View file @
85df0c61
...
@@ -1273,27 +1273,27 @@ static void test_query_process_debug_object_handle(int argc, char **argv)
...
@@ -1273,27 +1273,27 @@ static void test_query_process_debug_object_handle(int argc, char **argv)
static
void
test_query_process_debug_flags
(
int
argc
,
char
**
argv
)
static
void
test_query_process_debug_flags
(
int
argc
,
char
**
argv
)
{
{
static
const
DWORD
test_flags
[]
=
{
DEBUG_PROCESS
,
DEBUG_ONLY_THIS_PROCESS
,
DEBUG_PROCESS
|
DEBUG_ONLY_THIS_PROCESS
,
CREATE_SUSPENDED
};
DWORD
debug_flags
=
0xdeadbeef
;
DWORD
debug_flags
=
0xdeadbeef
;
char
cmdline
[
MAX_PATH
];
char
cmdline
[
MAX_PATH
];
PROCESS_INFORMATION
pi
;
PROCESS_INFORMATION
pi
;
STARTUPINFOA
si
=
{
0
};
STARTUPINFOA
si
=
{
0
};
NTSTATUS
status
;
NTSTATUS
status
;
DEBUG_EVENT
ev
;
DWORD
result
;
BOOL
ret
;
BOOL
ret
;
int
i
,
j
;
sprintf
(
cmdline
,
"%s %s %s"
,
argv
[
0
],
argv
[
1
],
"debuggee"
);
/* test invalid arguments */
status
=
pNtQueryInformationProcess
(
NULL
,
ProcessDebugFlags
,
NULL
,
0
,
NULL
);
si
.
cb
=
sizeof
(
si
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* WOW64 */
,
ret
=
CreateProcessA
(
NULL
,
cmdline
,
NULL
,
NULL
,
FALSE
,
DEBUG_PROCESS
|
DEBUG_ONLY_THIS_PROCESS
,
NULL
,
NULL
,
&
si
,
&
pi
);
"Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.
\n
"
,
status
);
ok
(
ret
,
"CreateProcess failed, last error %#x.
\n
"
,
GetLastError
());
if
(
!
ret
)
return
;
status
=
pNtQueryInformationProcess
(
NULL
,
ProcessDebugFlags
,
NULL
,
0
,
NULL
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.
\n
"
,
status
);
status
=
pNtQueryInformationProcess
(
NULL
,
ProcessDebugFlags
,
status
=
pNtQueryInformationProcess
(
NULL
,
ProcessDebugFlags
,
NULL
,
sizeof
(
debug_flags
),
NULL
);
NULL
,
sizeof
(
debug_flags
),
NULL
);
ok
(
status
==
STATUS_INVALID_HANDLE
||
status
==
STATUS_ACCESS_VIOLATION
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* WOW64 */
,
ok
(
status
==
STATUS_INVALID_HANDLE
||
status
==
STATUS_ACCESS_VIOLATION
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* W7PROX64 (32-bit) */
,
"Expected STATUS_INVALID_HANDLE, got %#x.
\n
"
,
status
);
"Expected STATUS_INVALID_HANDLE, got %#x.
\n
"
,
status
);
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
...
@@ -1302,45 +1302,131 @@ static void test_query_process_debug_flags(int argc, char **argv)
...
@@ -1302,45 +1302,131 @@ static void test_query_process_debug_flags(int argc, char **argv)
status
=
pNtQueryInformationProcess
(
NULL
,
ProcessDebugFlags
,
status
=
pNtQueryInformationProcess
(
NULL
,
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
ok
(
status
==
STATUS_INVALID_HANDLE
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"Expected STATUS_INVALID_HANDLE, got %#x.
\n
"
,
status
);
ok
(
status
==
STATUS_INVALID_HANDLE
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* WOW64 */
,
"Expected STATUS_INVALID_HANDLE, got %#x.
\n
"
,
status
);
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
)
-
1
,
NULL
);
&
debug_flags
,
sizeof
(
debug_flags
)
-
1
,
NULL
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.
\n
"
,
status
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
,
"Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.
\n
"
,
status
);
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
)
+
1
,
NULL
);
&
debug_flags
,
sizeof
(
debug_flags
)
+
1
,
NULL
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.
\n
"
,
status
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
,
"Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.
\n
"
,
status
);
/* test ProcessDebugFlags of current process */
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
status
=
pNtQueryInformationProcess
(
GetCurrentProcess
(),
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
ok
(
!
status
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
ok
(
!
status
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
ok
(
debug_flags
==
TRUE
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"Expected flag TRUE, got %x.
\n
"
,
debug_flags
);
ok
(
debug_flags
==
TRUE
,
"Expected flag TRUE, got %x.
\n
"
,
debug_flags
);
status
=
pNtQueryInformationProcess
(
pi
.
hProcess
,
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
ok
(
!
status
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
ok
(
debug_flags
==
FALSE
||
broken
(
status
==
STATUS_INVALID_INFO_CLASS
)
/* NT4 */
,
"Expected flag FALSE, got %x.
\n
"
,
debug_flags
);
for
(
;;
)
for
(
i
=
0
;
i
<
sizeof
(
test_flags
)
/
sizeof
(
test_flags
[
0
]);
i
++
)
{
{
DEBUG_EVENT
ev
;
DWORD
expected_flags
=
!
(
test_flags
[
i
]
&
DEBUG_ONLY_THIS_PROCESS
);
sprintf
(
cmdline
,
"%s %s %s"
,
argv
[
0
],
argv
[
1
],
"debuggee"
);
ret
=
WaitForDebugEvent
(
&
ev
,
INFINITE
);
si
.
cb
=
sizeof
(
si
);
ok
(
ret
,
"WaitForDebugEvent failed, last error %#x.
\n
"
,
GetLastError
()
);
ret
=
CreateProcessA
(
NULL
,
cmdline
,
NULL
,
NULL
,
FALSE
,
test_flags
[
i
],
NULL
,
NULL
,
&
si
,
&
pi
);
if
(
!
ret
)
break
;
ok
(
ret
,
"CreateProcess failed, last error %#x.
\n
"
,
GetLastError
())
;
if
(
ev
.
dwDebugEventCode
==
EXIT_PROCESS_DEBUG_EVENT
)
break
;
if
(
!
(
test_flags
[
i
]
&
(
DEBUG_PROCESS
|
DEBUG_ONLY_THIS_PROCESS
)))
{
/* test ProcessDebugFlags before attaching with debugger */
status
=
pNtQueryInformationProcess
(
pi
.
hProcess
,
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
ok
(
!
status
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
ok
(
debug_flags
==
TRUE
,
"Expected flag TRUE, got %x.
\n
"
,
debug_flags
);
ret
=
DebugActiveProcess
(
pi
.
dwProcessId
);
ok
(
ret
,
"DebugActiveProcess failed, last error %#x.
\n
"
,
GetLastError
());
expected_flags
=
FALSE
;
}
ret
=
ContinueDebugEvent
(
ev
.
dwProcessId
,
ev
.
dwThreadId
,
DBG_CONTINUE
);
/* test ProcessDebugFlags after attaching with debugger */
ok
(
ret
,
"ContinueDebugEvent failed, last error %#x.
\n
"
,
GetLastError
());
status
=
pNtQueryInformationProcess
(
pi
.
hProcess
,
ProcessDebugFlags
,
if
(
!
ret
)
break
;
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
}
ok
(
!
status
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
if
(
!
expected_flags
)
ok
(
debug_flags
==
expected_flags
,
"Expected flag %x, got %x.
\n
"
,
expected_flags
,
debug_flags
);
else
todo_wine
ok
(
debug_flags
==
expected_flags
,
"Expected flag %x, got %x.
\n
"
,
expected_flags
,
debug_flags
);
ret
=
CloseHandle
(
pi
.
hThread
);
if
(
!
(
test_flags
[
i
]
&
CREATE_SUSPENDED
))
ok
(
ret
,
"CloseHandle failed, last error %#x.
\n
"
,
GetLastError
());
{
ret
=
CloseHandle
(
pi
.
hProcess
);
/* Continue a couple of times to make sure the process is fully initialized,
ok
(
ret
,
"CloseHandle failed, last error %#x.
\n
"
,
GetLastError
());
* otherwise Windows XP deadlocks in the following DebugActiveProcess(). */
for
(;;)
{
ret
=
WaitForDebugEvent
(
&
ev
,
1000
);
ok
(
ret
,
"WaitForDebugEvent failed, last error %#x.
\n
"
,
GetLastError
());
if
(
!
ret
)
break
;
if
(
ev
.
dwDebugEventCode
==
LOAD_DLL_DEBUG_EVENT
)
break
;
ret
=
ContinueDebugEvent
(
ev
.
dwProcessId
,
ev
.
dwThreadId
,
DBG_CONTINUE
);
ok
(
ret
,
"ContinueDebugEvent failed, last error %#x.
\n
"
,
GetLastError
());
if
(
!
ret
)
break
;
}
result
=
SuspendThread
(
pi
.
hThread
);
ok
(
result
==
0
,
"Expected 0, got %u.
\n
"
,
result
);
}
ret
=
DebugActiveProcessStop
(
pi
.
dwProcessId
);
ok
(
ret
,
"DebugActiveProcessStop failed, last error %#x.
\n
"
,
GetLastError
());
/* test ProcessDebugFlags after detaching debugger */
status
=
pNtQueryInformationProcess
(
pi
.
hProcess
,
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
ok
(
!
status
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
if
(
expected_flags
)
ok
(
debug_flags
==
expected_flags
,
"Expected flag %x, got %x.
\n
"
,
expected_flags
,
debug_flags
);
else
todo_wine
ok
(
debug_flags
==
expected_flags
,
"Expected flag %x, got %x.
\n
"
,
expected_flags
,
debug_flags
);
ret
=
DebugActiveProcess
(
pi
.
dwProcessId
);
ok
(
ret
,
"DebugActiveProcess failed, last error %#x.
\n
"
,
GetLastError
());
/* test ProcessDebugFlags after re-attaching debugger */
status
=
pNtQueryInformationProcess
(
pi
.
hProcess
,
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
ok
(
!
status
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
ok
(
debug_flags
==
FALSE
,
"Expected flag FALSE, got %x.
\n
"
,
debug_flags
);
result
=
ResumeThread
(
pi
.
hThread
);
todo_wine
ok
(
result
==
2
,
"Expected 2, got %u.
\n
"
,
result
);
/* Wait until the process is terminated. On Windows XP the process randomly
* gets stuck in a non-continuable exception, so stop after 100 iterations.
* On Windows 2003, the debugged process disappears (or stops?) without
* any EXIT_PROCESS_DEBUG_EVENT after a couple of events. */
for
(
j
=
0
;
j
<
100
;
j
++
)
{
ret
=
WaitForDebugEvent
(
&
ev
,
1000
);
ok
(
ret
||
broken
(
GetLastError
()
==
ERROR_SEM_TIMEOUT
),
"WaitForDebugEvent failed, last error %#x.
\n
"
,
GetLastError
());
if
(
!
ret
)
break
;
if
(
ev
.
dwDebugEventCode
==
EXIT_PROCESS_DEBUG_EVENT
)
break
;
ret
=
ContinueDebugEvent
(
ev
.
dwProcessId
,
ev
.
dwThreadId
,
DBG_CONTINUE
);
ok
(
ret
,
"ContinueDebugEvent failed, last error %#x.
\n
"
,
GetLastError
());
if
(
!
ret
)
break
;
}
ok
(
j
<
100
||
broken
(
j
>=
100
)
/* Win XP */
,
"Expected less than 100 debug events.
\n
"
);
/* test ProcessDebugFlags after process has terminated */
status
=
pNtQueryInformationProcess
(
pi
.
hProcess
,
ProcessDebugFlags
,
&
debug_flags
,
sizeof
(
debug_flags
),
NULL
);
ok
(
!
status
,
"NtQueryInformationProcess failed, status %#x.
\n
"
,
status
);
ok
(
debug_flags
==
FALSE
,
"Expected flag FALSE, got %x.
\n
"
,
debug_flags
);
ret
=
CloseHandle
(
pi
.
hThread
);
ok
(
ret
,
"CloseHandle failed, last error %#x.
\n
"
,
GetLastError
());
ret
=
CloseHandle
(
pi
.
hProcess
);
ok
(
ret
,
"CloseHandle failed, last error %#x.
\n
"
,
GetLastError
());
}
}
}
static
void
test_readvirtualmemory
(
void
)
static
void
test_readvirtualmemory
(
void
)
...
...
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