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
7bebf7db
Commit
7bebf7db
authored
Feb 01, 2021
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Implement NtSetInformationDebugObject().
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
46b84e7a
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
154 additions
and
37 deletions
+154
-37
debugger.c
dlls/kernel32/debugger.c
+7
-9
debugger.c
dlls/kernel32/tests/debugger.c
+23
-0
ntdll.spec
dlls/ntdll/ntdll.spec
+2
-2
info.c
dlls/ntdll/tests/info.c
+55
-0
sync.c
dlls/ntdll/unix/sync.c
+30
-0
server_protocol.h
include/wine/server_protocol.h
+9
-7
winternl.h
include/winternl.h
+7
-0
debugger.c
server/debugger.c
+7
-8
protocol.def
server/protocol.def
+4
-3
request.h
server/request.h
+5
-4
trace.c
server/trace.c
+5
-4
No files found.
dlls/kernel32/debugger.c
View file @
7bebf7db
...
@@ -23,8 +23,10 @@
...
@@ -23,8 +23,10 @@
#include "ntstatus.h"
#include "ntstatus.h"
#define WIN32_NO_STATUS
#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winerror.h"
#include "win
e/server
.h"
#include "win
ternl
.h"
#include "kernel_private.h"
#include "kernel_private.h"
#include "wine/asm.h"
#include "wine/asm.h"
#include "wine/debug.h"
#include "wine/debug.h"
...
@@ -165,13 +167,9 @@ BOOL WINAPI DebugBreakProcess(HANDLE process)
...
@@ -165,13 +167,9 @@ BOOL WINAPI DebugBreakProcess(HANDLE process)
*/
*/
BOOL
WINAPI
DebugSetProcessKillOnExit
(
BOOL
kill
)
BOOL
WINAPI
DebugSetProcessKillOnExit
(
BOOL
kill
)
{
{
BOOL
ret
=
FALSE
;
ULONG
flag
=
kill
?
DEBUG_KILL_ON_CLOSE
:
0
;
SERVER_START_REQ
(
set_debugger_kill_on_exit
)
return
set_ntstatus
(
NtSetInformationDebugObject
(
DbgUiGetThreadDebugObject
(),
{
DebugObjectKillProcessOnExitInformation
,
req
->
kill_on_exit
=
kill
;
&
flag
,
sizeof
(
flag
),
NULL
));
ret
=
!
wine_server_call_err
(
req
);
}
SERVER_END_REQ
;
return
ret
;
}
}
dlls/kernel32/tests/debugger.c
View file @
7bebf7db
...
@@ -46,6 +46,7 @@ static void (WINAPI *pDbgBreakPoint)(void);
...
@@ -46,6 +46,7 @@ static void (WINAPI *pDbgBreakPoint)(void);
static
NTSTATUS
(
WINAPI
*
pNtSuspendProcess
)(
HANDLE
process
);
static
NTSTATUS
(
WINAPI
*
pNtSuspendProcess
)(
HANDLE
process
);
static
NTSTATUS
(
WINAPI
*
pNtResumeProcess
)(
HANDLE
process
);
static
NTSTATUS
(
WINAPI
*
pNtResumeProcess
)(
HANDLE
process
);
static
NTSTATUS
(
WINAPI
*
pNtCreateDebugObject
)(
HANDLE
*
,
ACCESS_MASK
,
OBJECT_ATTRIBUTES
*
,
ULONG
);
static
NTSTATUS
(
WINAPI
*
pNtCreateDebugObject
)(
HANDLE
*
,
ACCESS_MASK
,
OBJECT_ATTRIBUTES
*
,
ULONG
);
static
NTSTATUS
(
WINAPI
*
pNtSetInformationDebugObject
)(
HANDLE
,
DEBUGOBJECTINFOCLASS
,
void
*
,
ULONG
,
ULONG
*
);
static
NTSTATUS
(
WINAPI
*
pDbgUiConnectToDbg
)(
void
);
static
NTSTATUS
(
WINAPI
*
pDbgUiConnectToDbg
)(
void
);
static
HANDLE
(
WINAPI
*
pDbgUiGetThreadDebugObject
)(
void
);
static
HANDLE
(
WINAPI
*
pDbgUiGetThreadDebugObject
)(
void
);
static
void
(
WINAPI
*
pDbgUiSetThreadDebugObject
)(
HANDLE
);
static
void
(
WINAPI
*
pDbgUiSetThreadDebugObject
)(
HANDLE
);
...
@@ -1735,6 +1736,7 @@ static void test_kill_on_exit(const char *argv0)
...
@@ -1735,6 +1736,7 @@ static void test_kill_on_exit(const char *argv0)
HANDLE
event
,
debug
;
HANDLE
event
,
debug
;
DWORD
exit_code
;
DWORD
exit_code
;
char
*
cmd
;
char
*
cmd
;
ULONG
val
;
event
=
CreateEventW
(
&
sa
,
FALSE
,
FALSE
,
NULL
);
event
=
CreateEventW
(
&
sa
,
FALSE
,
FALSE
,
NULL
);
ok
(
event
!=
NULL
,
"CreateEvent failed: %u
\n
"
,
GetLastError
());
ok
(
event
!=
NULL
,
"CreateEvent failed: %u
\n
"
,
GetLastError
());
...
@@ -1757,6 +1759,26 @@ static void test_kill_on_exit(const char *argv0)
...
@@ -1757,6 +1759,26 @@ static void test_kill_on_exit(const char *argv0)
status
=
pNtCreateDebugObject
(
&
debug
,
DEBUG_ALL_ACCESS
,
&
attr
,
0xfffe
);
status
=
pNtCreateDebugObject
(
&
debug
,
DEBUG_ALL_ACCESS
,
&
attr
,
0xfffe
);
ok
(
status
==
STATUS_INVALID_PARAMETER
,
"NtCreateDebugObject failed %x
\n
"
,
status
);
ok
(
status
==
STATUS_INVALID_PARAMETER
,
"NtCreateDebugObject failed %x
\n
"
,
status
);
status
=
pNtCreateDebugObject
(
&
debug
,
DEBUG_ALL_ACCESS
,
&
attr
,
0
);
ok
(
!
status
,
"NtCreateDebugObject failed %x
\n
"
,
status
);
pDbgUiSetThreadDebugObject
(
debug
);
val
=
DEBUG_KILL_ON_CLOSE
;
status
=
pNtSetInformationDebugObject
(
debug
,
DebugObjectKillProcessOnExitInformation
,
&
val
,
sizeof
(
val
),
NULL
);
ok
(
!
status
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
exit_code
=
run_child_wait
(
cmd
,
event
);
ok
(
exit_code
==
STATUS_DEBUGGER_INACTIVE
,
"exit code = %08x
\n
"
,
exit_code
);
status
=
pNtCreateDebugObject
(
&
debug
,
DEBUG_ALL_ACCESS
,
&
attr
,
DEBUG_KILL_ON_CLOSE
);
ok
(
!
status
,
"NtCreateDebugObject failed %x
\n
"
,
status
);
pDbgUiSetThreadDebugObject
(
debug
);
val
=
0
;
status
=
pNtSetInformationDebugObject
(
debug
,
DebugObjectKillProcessOnExitInformation
,
&
val
,
sizeof
(
val
),
NULL
);
ok
(
!
status
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
exit_code
=
run_child_wait
(
cmd
,
event
);
ok
(
exit_code
==
0
,
"exit code = %08x
\n
"
,
exit_code
);
status
=
pDbgUiConnectToDbg
();
status
=
pDbgUiConnectToDbg
();
ok
(
!
status
,
"DbgUiConnectToDbg failed %x
\n
"
,
status
);
ok
(
!
status
,
"DbgUiConnectToDbg failed %x
\n
"
,
status
);
exit_code
=
run_child_wait
(
cmd
,
event
);
exit_code
=
run_child_wait
(
cmd
,
event
);
...
@@ -1777,6 +1799,7 @@ START_TEST(debugger)
...
@@ -1777,6 +1799,7 @@ START_TEST(debugger)
pNtSuspendProcess
=
(
void
*
)
GetProcAddress
(
ntdll
,
"NtSuspendProcess"
);
pNtSuspendProcess
=
(
void
*
)
GetProcAddress
(
ntdll
,
"NtSuspendProcess"
);
pNtResumeProcess
=
(
void
*
)
GetProcAddress
(
ntdll
,
"NtResumeProcess"
);
pNtResumeProcess
=
(
void
*
)
GetProcAddress
(
ntdll
,
"NtResumeProcess"
);
pNtCreateDebugObject
=
(
void
*
)
GetProcAddress
(
ntdll
,
"NtCreateDebugObject"
);
pNtCreateDebugObject
=
(
void
*
)
GetProcAddress
(
ntdll
,
"NtCreateDebugObject"
);
pNtSetInformationDebugObject
=
(
void
*
)
GetProcAddress
(
ntdll
,
"NtSetInformationDebugObject"
);
pDbgUiConnectToDbg
=
(
void
*
)
GetProcAddress
(
ntdll
,
"DbgUiConnectToDbg"
);
pDbgUiConnectToDbg
=
(
void
*
)
GetProcAddress
(
ntdll
,
"DbgUiConnectToDbg"
);
pDbgUiGetThreadDebugObject
=
(
void
*
)
GetProcAddress
(
ntdll
,
"DbgUiGetThreadDebugObject"
);
pDbgUiGetThreadDebugObject
=
(
void
*
)
GetProcAddress
(
ntdll
,
"DbgUiGetThreadDebugObject"
);
pDbgUiSetThreadDebugObject
=
(
void
*
)
GetProcAddress
(
ntdll
,
"DbgUiSetThreadDebugObject"
);
pDbgUiSetThreadDebugObject
=
(
void
*
)
GetProcAddress
(
ntdll
,
"DbgUiSetThreadDebugObject"
);
...
...
dlls/ntdll/ntdll.spec
View file @
7bebf7db
...
@@ -373,7 +373,7 @@
...
@@ -373,7 +373,7 @@
@ stub NtSetHighEventPair
@ stub NtSetHighEventPair
@ stub NtSetHighWaitLowEventPair
@ stub NtSetHighWaitLowEventPair
@ stub NtSetHighWaitLowThread
@ stub NtSetHighWaitLowThread
# @ stub NtSetInformationDebugObject
@ stdcall -syscall NtSetInformationDebugObject(long long ptr long ptr)
@ stdcall -syscall NtSetInformationFile(long ptr ptr long long)
@ stdcall -syscall NtSetInformationFile(long ptr ptr long long)
@ stdcall -syscall NtSetInformationJobObject(long long ptr long)
@ stdcall -syscall NtSetInformationJobObject(long long ptr long)
@ stdcall -syscall NtSetInformationKey(long long ptr long)
@ stdcall -syscall NtSetInformationKey(long long ptr long)
...
@@ -1378,7 +1378,7 @@
...
@@ -1378,7 +1378,7 @@
@ stub ZwSetHighEventPair
@ stub ZwSetHighEventPair
@ stub ZwSetHighWaitLowEventPair
@ stub ZwSetHighWaitLowEventPair
@ stub ZwSetHighWaitLowThread
@ stub ZwSetHighWaitLowThread
# @ stub Zw
SetInformationDebugObject
@ stdcall -private -syscall ZwSetInformationDebugObject(long long ptr long ptr) Nt
SetInformationDebugObject
@ stdcall -private -syscall ZwSetInformationFile(long ptr ptr long long) NtSetInformationFile
@ stdcall -private -syscall ZwSetInformationFile(long ptr ptr long long) NtSetInformationFile
@ stdcall -private -syscall ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject
@ stdcall -private -syscall ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject
@ stdcall -private -syscall ZwSetInformationKey(long long ptr long) NtSetInformationKey
@ stdcall -private -syscall ZwSetInformationKey(long long ptr long) NtSetInformationKey
...
...
dlls/ntdll/tests/info.c
View file @
7bebf7db
...
@@ -43,6 +43,8 @@ static BOOL (WINAPI * pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_R
...
@@ -43,6 +43,8 @@ static BOOL (WINAPI * pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_R
static
DEP_SYSTEM_POLICY_TYPE
(
WINAPI
*
pGetSystemDEPPolicy
)(
void
);
static
DEP_SYSTEM_POLICY_TYPE
(
WINAPI
*
pGetSystemDEPPolicy
)(
void
);
static
NTSTATUS
(
WINAPI
*
pNtOpenThread
)(
HANDLE
*
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
,
const
CLIENT_ID
*
);
static
NTSTATUS
(
WINAPI
*
pNtOpenThread
)(
HANDLE
*
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
,
const
CLIENT_ID
*
);
static
NTSTATUS
(
WINAPI
*
pNtQueryObject
)(
HANDLE
,
OBJECT_INFORMATION_CLASS
,
void
*
,
ULONG
,
ULONG
*
);
static
NTSTATUS
(
WINAPI
*
pNtQueryObject
)(
HANDLE
,
OBJECT_INFORMATION_CLASS
,
void
*
,
ULONG
,
ULONG
*
);
static
NTSTATUS
(
WINAPI
*
pNtCreateDebugObject
)(
HANDLE
*
,
ACCESS_MASK
,
OBJECT_ATTRIBUTES
*
,
ULONG
);
static
NTSTATUS
(
WINAPI
*
pNtSetInformationDebugObject
)(
HANDLE
,
DEBUGOBJECTINFOCLASS
,
PVOID
,
ULONG
,
ULONG
*
);
static
BOOL
is_wow64
;
static
BOOL
is_wow64
;
...
@@ -92,6 +94,8 @@ static BOOL InitFunctionPtrs(void)
...
@@ -92,6 +94,8 @@ static BOOL InitFunctionPtrs(void)
NTDLL_GET_PROC
(
NtUnmapViewOfSection
);
NTDLL_GET_PROC
(
NtUnmapViewOfSection
);
NTDLL_GET_PROC
(
NtOpenThread
);
NTDLL_GET_PROC
(
NtOpenThread
);
NTDLL_GET_PROC
(
NtQueryObject
);
NTDLL_GET_PROC
(
NtQueryObject
);
NTDLL_GET_PROC
(
NtCreateDebugObject
);
NTDLL_GET_PROC
(
NtSetInformationDebugObject
);
/* not present before XP */
/* not present before XP */
pNtGetCurrentProcessorNumber
=
(
void
*
)
GetProcAddress
(
hntdll
,
"NtGetCurrentProcessorNumber"
);
pNtGetCurrentProcessorNumber
=
(
void
*
)
GetProcAddress
(
hntdll
,
"NtGetCurrentProcessorNumber"
);
...
@@ -2749,6 +2753,56 @@ static void test_wow64(void)
...
@@ -2749,6 +2753,56 @@ static void test_wow64(void)
ok
(
!
NtCurrentTeb
()
->
WowTebOffset
,
"WowTebOffset set to %x
\n
"
,
NtCurrentTeb
()
->
WowTebOffset
);
ok
(
!
NtCurrentTeb
()
->
WowTebOffset
,
"WowTebOffset set to %x
\n
"
,
NtCurrentTeb
()
->
WowTebOffset
);
}
}
static
void
test_debug_object
(
void
)
{
NTSTATUS
status
;
HANDLE
handle
;
OBJECT_ATTRIBUTES
attr
=
{
sizeof
(
attr
)
};
ULONG
len
,
flag
=
0
;
status
=
pNtCreateDebugObject
(
&
handle
,
DEBUG_ALL_ACCESS
,
&
attr
,
0
);
ok
(
!
status
,
"NtCreateDebugObject failed %x
\n
"
,
status
);
status
=
pNtSetInformationDebugObject
(
handle
,
0
,
&
flag
,
sizeof
(
ULONG
),
&
len
);
ok
(
status
==
STATUS_INVALID_PARAMETER
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
status
=
pNtSetInformationDebugObject
(
handle
,
2
,
&
flag
,
sizeof
(
ULONG
),
&
len
);
ok
(
status
==
STATUS_INVALID_PARAMETER
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
status
=
pNtSetInformationDebugObject
(
(
HANDLE
)
0xdead
,
DebugObjectKillProcessOnExitInformation
,
&
flag
,
sizeof
(
ULONG
),
&
len
);
ok
(
status
==
STATUS_INVALID_HANDLE
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
len
=
0xdead
;
status
=
pNtSetInformationDebugObject
(
handle
,
DebugObjectKillProcessOnExitInformation
,
&
flag
,
sizeof
(
ULONG
)
+
1
,
&
len
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
ok
(
len
==
sizeof
(
ULONG
),
"wrong len %u
\n
"
,
len
);
len
=
0xdead
;
status
=
pNtSetInformationDebugObject
(
handle
,
DebugObjectKillProcessOnExitInformation
,
&
flag
,
sizeof
(
ULONG
)
-
1
,
&
len
);
ok
(
status
==
STATUS_INFO_LENGTH_MISMATCH
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
ok
(
len
==
sizeof
(
ULONG
),
"wrong len %u
\n
"
,
len
);
len
=
0xdead
;
status
=
pNtSetInformationDebugObject
(
handle
,
DebugObjectKillProcessOnExitInformation
,
&
flag
,
sizeof
(
ULONG
),
&
len
);
ok
(
!
status
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
ok
(
!
len
,
"wrong len %u
\n
"
,
len
);
flag
=
DEBUG_KILL_ON_CLOSE
;
status
=
pNtSetInformationDebugObject
(
handle
,
DebugObjectKillProcessOnExitInformation
,
&
flag
,
sizeof
(
ULONG
),
&
len
);
ok
(
!
status
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
ok
(
!
len
,
"wrong len %u
\n
"
,
len
);
for
(
flag
=
2
;
flag
;
flag
<<=
1
)
{
status
=
pNtSetInformationDebugObject
(
handle
,
DebugObjectKillProcessOnExitInformation
,
&
flag
,
sizeof
(
ULONG
),
&
len
);
ok
(
status
==
STATUS_INVALID_PARAMETER
,
"NtSetInformationDebugObject failed %x
\n
"
,
status
);
}
pNtClose
(
handle
);
}
START_TEST
(
info
)
START_TEST
(
info
)
{
{
...
@@ -2808,6 +2862,7 @@ START_TEST(info)
...
@@ -2808,6 +2862,7 @@ START_TEST(info)
test_affinity
();
test_affinity
();
test_wow64
();
test_wow64
();
test_debug_object
();
/* belongs to its own file */
/* belongs to its own file */
test_readvirtualmemory
();
test_readvirtualmemory
();
...
...
dlls/ntdll/unix/sync.c
View file @
7bebf7db
...
@@ -934,6 +934,36 @@ NTSTATUS WINAPI NtCreateDebugObject( HANDLE *handle, ACCESS_MASK access,
...
@@ -934,6 +934,36 @@ NTSTATUS WINAPI NtCreateDebugObject( HANDLE *handle, ACCESS_MASK access,
}
}
/**********************************************************************
* NtSetInformationDebugObject (NTDLL.@)
*/
NTSTATUS
WINAPI
NtSetInformationDebugObject
(
HANDLE
handle
,
DEBUGOBJECTINFOCLASS
class
,
void
*
info
,
ULONG
len
,
ULONG
*
ret_len
)
{
NTSTATUS
ret
;
ULONG
flags
;
if
(
class
!=
DebugObjectKillProcessOnExitInformation
)
return
STATUS_INVALID_PARAMETER
;
if
(
len
!=
sizeof
(
ULONG
))
{
if
(
ret_len
)
*
ret_len
=
sizeof
(
ULONG
);
return
STATUS_INFO_LENGTH_MISMATCH
;
}
flags
=
*
(
ULONG
*
)
info
;
if
(
flags
&
~
DEBUG_KILL_ON_CLOSE
)
return
STATUS_INVALID_PARAMETER
;
SERVER_START_REQ
(
set_debug_obj_info
)
{
req
->
debug
=
wine_server_obj_handle
(
handle
);
req
->
flags
=
flags
;
ret
=
wine_server_call
(
req
);
}
SERVER_END_REQ
;
if
(
!
ret
&&
ret_len
)
*
ret_len
=
0
;
return
ret
;
}
/**************************************************************************
/**************************************************************************
* NtCreateDirectoryObject (NTDLL.@)
* NtCreateDirectoryObject (NTDLL.@)
*/
*/
...
...
include/wine/server_protocol.h
View file @
7bebf7db
...
@@ -2105,12 +2105,14 @@ struct debug_process_reply
...
@@ -2105,12 +2105,14 @@ struct debug_process_reply
struct
set_debug
ger_kill_on_exit
_request
struct
set_debug
_obj_info
_request
{
{
struct
request_header
__header
;
struct
request_header
__header
;
int
kill_on_exit
;
obj_handle_t
debug
;
unsigned
int
flags
;
char
__pad_20
[
4
];
};
};
struct
set_debug
ger_kill_on_exit
_reply
struct
set_debug
_obj_info
_reply
{
{
struct
reply_header
__header
;
struct
reply_header
__header
;
};
};
...
@@ -5447,7 +5449,7 @@ enum request
...
@@ -5447,7 +5449,7 @@ enum request
REQ_get_exception_status
,
REQ_get_exception_status
,
REQ_continue_debug_event
,
REQ_continue_debug_event
,
REQ_debug_process
,
REQ_debug_process
,
REQ_set_debug
ger_kill_on_exit
,
REQ_set_debug
_obj_info
,
REQ_read_process_memory
,
REQ_read_process_memory
,
REQ_write_process_memory
,
REQ_write_process_memory
,
REQ_create_key
,
REQ_create_key
,
...
@@ -5729,7 +5731,7 @@ union generic_request
...
@@ -5729,7 +5731,7 @@ union generic_request
struct
get_exception_status_request
get_exception_status_request
;
struct
get_exception_status_request
get_exception_status_request
;
struct
continue_debug_event_request
continue_debug_event_request
;
struct
continue_debug_event_request
continue_debug_event_request
;
struct
debug_process_request
debug_process_request
;
struct
debug_process_request
debug_process_request
;
struct
set_debug
ger_kill_on_exit_request
set_debugger_kill_on_exit
_request
;
struct
set_debug
_obj_info_request
set_debug_obj_info
_request
;
struct
read_process_memory_request
read_process_memory_request
;
struct
read_process_memory_request
read_process_memory_request
;
struct
write_process_memory_request
write_process_memory_request
;
struct
write_process_memory_request
write_process_memory_request
;
struct
create_key_request
create_key_request
;
struct
create_key_request
create_key_request
;
...
@@ -6009,7 +6011,7 @@ union generic_reply
...
@@ -6009,7 +6011,7 @@ union generic_reply
struct
get_exception_status_reply
get_exception_status_reply
;
struct
get_exception_status_reply
get_exception_status_reply
;
struct
continue_debug_event_reply
continue_debug_event_reply
;
struct
continue_debug_event_reply
continue_debug_event_reply
;
struct
debug_process_reply
debug_process_reply
;
struct
debug_process_reply
debug_process_reply
;
struct
set_debug
ger_kill_on_exit_reply
set_debugger_kill_on_exit
_reply
;
struct
set_debug
_obj_info_reply
set_debug_obj_info
_reply
;
struct
read_process_memory_reply
read_process_memory_reply
;
struct
read_process_memory_reply
read_process_memory_reply
;
struct
write_process_memory_reply
write_process_memory_reply
;
struct
write_process_memory_reply
write_process_memory_reply
;
struct
create_key_reply
create_key_reply
;
struct
create_key_reply
create_key_reply
;
...
@@ -6211,7 +6213,7 @@ union generic_reply
...
@@ -6211,7 +6213,7 @@ union generic_reply
/* ### protocol_version begin ### */
/* ### protocol_version begin ### */
#define SERVER_PROTOCOL_VERSION 6
59
#define SERVER_PROTOCOL_VERSION 6
60
/* ### protocol_version end ### */
/* ### protocol_version end ### */
...
...
include/winternl.h
View file @
7bebf7db
...
@@ -3015,6 +3015,12 @@ typedef struct _PS_CREATE_INFO
...
@@ -3015,6 +3015,12 @@ typedef struct _PS_CREATE_INFO
#define DEBUG_KILL_ON_CLOSE 0x1
#define DEBUG_KILL_ON_CLOSE 0x1
typedef
enum
_DEBUGOBJECTINFOCLASS
{
DebugObjectKillProcessOnExitInformation
=
1
,
MaxDebugObjectInfoClass
}
DEBUGOBJECTINFOCLASS
,
*
PDEBUGOBJECTINFOCLASS
;
/***********************************************************************
/***********************************************************************
* Function declarations
* Function declarations
*/
*/
...
@@ -3256,6 +3262,7 @@ NTSYSAPI NTSTATUS WINAPI NtSetEvent(HANDLE,LONG*);
...
@@ -3256,6 +3262,7 @@ NTSYSAPI NTSTATUS WINAPI NtSetEvent(HANDLE,LONG*);
NTSYSAPI
NTSTATUS
WINAPI
NtSetHighEventPair
(
HANDLE
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetHighEventPair
(
HANDLE
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetHighWaitLowEventPair
(
HANDLE
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetHighWaitLowEventPair
(
HANDLE
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetHighWaitLowThread
(
VOID
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetHighWaitLowThread
(
VOID
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetInformationDebugObject
(
HANDLE
,
DEBUGOBJECTINFOCLASS
,
PVOID
,
ULONG
,
ULONG
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetInformationFile
(
HANDLE
,
PIO_STATUS_BLOCK
,
PVOID
,
ULONG
,
FILE_INFORMATION_CLASS
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetInformationFile
(
HANDLE
,
PIO_STATUS_BLOCK
,
PVOID
,
ULONG
,
FILE_INFORMATION_CLASS
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetInformationJobObject
(
HANDLE
,
JOBOBJECTINFOCLASS
,
PVOID
,
ULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetInformationJobObject
(
HANDLE
,
JOBOBJECTINFOCLASS
,
PVOID
,
ULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetInformationKey
(
HANDLE
,
const
int
,
PVOID
,
ULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtSetInformationKey
(
HANDLE
,
const
int
,
PVOID
,
ULONG
);
...
...
server/debugger.c
View file @
7bebf7db
...
@@ -747,13 +747,12 @@ DECL_HANDLER(get_exception_status)
...
@@ -747,13 +747,12 @@ DECL_HANDLER(get_exception_status)
}
}
}
}
/* set debug
ger kill on exit flag
*/
/* set debug
object information
*/
DECL_HANDLER
(
set_debug
ger_kill_on_exit
)
DECL_HANDLER
(
set_debug
_obj_info
)
{
{
if
(
!
current
->
debug_obj
)
struct
debug_obj
*
debug_obj
;
{
set_error
(
STATUS_ACCESS_DENIED
);
if
(
!
(
debug_obj
=
get_debug_obj
(
current
->
process
,
req
->
debug
,
DEBUG_SET_INFORMATION
)))
return
;
return
;
debug_obj
->
flags
=
req
->
flags
;
}
release_object
(
debug_obj
);
current
->
debug_obj
->
flags
=
req
->
kill_on_exit
?
DEBUG_KILL_ON_CLOSE
:
0
;
}
}
server/protocol.def
View file @
7bebf7db
...
@@ -1645,9 +1645,10 @@ struct process_info
...
@@ -1645,9 +1645,10 @@ struct process_info
@END
@END
/* Set debugger kill on exit flag */
/* Set debug object information */
@REQ(set_debugger_kill_on_exit)
@REQ(set_debug_obj_info)
int kill_on_exit; /* 0=detach/1=kill debuggee when debugger dies */
obj_handle_t debug; /* debug object */
unsigned int flags; /* object flags */
@END
@END
...
...
server/request.h
View file @
7bebf7db
...
@@ -196,7 +196,7 @@ DECL_HANDLER(queue_exception_event);
...
@@ -196,7 +196,7 @@ DECL_HANDLER(queue_exception_event);
DECL_HANDLER
(
get_exception_status
);
DECL_HANDLER
(
get_exception_status
);
DECL_HANDLER
(
continue_debug_event
);
DECL_HANDLER
(
continue_debug_event
);
DECL_HANDLER
(
debug_process
);
DECL_HANDLER
(
debug_process
);
DECL_HANDLER
(
set_debug
ger_kill_on_exit
);
DECL_HANDLER
(
set_debug
_obj_info
);
DECL_HANDLER
(
read_process_memory
);
DECL_HANDLER
(
read_process_memory
);
DECL_HANDLER
(
write_process_memory
);
DECL_HANDLER
(
write_process_memory
);
DECL_HANDLER
(
create_key
);
DECL_HANDLER
(
create_key
);
...
@@ -477,7 +477,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
...
@@ -477,7 +477,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(
req_handler
)
req_get_exception_status
,
(
req_handler
)
req_get_exception_status
,
(
req_handler
)
req_continue_debug_event
,
(
req_handler
)
req_continue_debug_event
,
(
req_handler
)
req_debug_process
,
(
req_handler
)
req_debug_process
,
(
req_handler
)
req_set_debug
ger_kill_on_exit
,
(
req_handler
)
req_set_debug
_obj_info
,
(
req_handler
)
req_read_process_memory
,
(
req_handler
)
req_read_process_memory
,
(
req_handler
)
req_write_process_memory
,
(
req_handler
)
req_write_process_memory
,
(
req_handler
)
req_create_key
,
(
req_handler
)
req_create_key
,
...
@@ -1163,8 +1163,9 @@ C_ASSERT( FIELD_OFFSET(struct debug_process_request, handle) == 12 );
...
@@ -1163,8 +1163,9 @@ C_ASSERT( FIELD_OFFSET(struct debug_process_request, handle) == 12 );
C_ASSERT
(
FIELD_OFFSET
(
struct
debug_process_request
,
debug
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
debug_process_request
,
debug
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
debug_process_request
,
attach
)
==
20
);
C_ASSERT
(
FIELD_OFFSET
(
struct
debug_process_request
,
attach
)
==
20
);
C_ASSERT
(
sizeof
(
struct
debug_process_request
)
==
24
);
C_ASSERT
(
sizeof
(
struct
debug_process_request
)
==
24
);
C_ASSERT
(
FIELD_OFFSET
(
struct
set_debugger_kill_on_exit_request
,
kill_on_exit
)
==
12
);
C_ASSERT
(
FIELD_OFFSET
(
struct
set_debug_obj_info_request
,
debug
)
==
12
);
C_ASSERT
(
sizeof
(
struct
set_debugger_kill_on_exit_request
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
set_debug_obj_info_request
,
flags
)
==
16
);
C_ASSERT
(
sizeof
(
struct
set_debug_obj_info_request
)
==
24
);
C_ASSERT
(
FIELD_OFFSET
(
struct
read_process_memory_request
,
handle
)
==
12
);
C_ASSERT
(
FIELD_OFFSET
(
struct
read_process_memory_request
,
handle
)
==
12
);
C_ASSERT
(
FIELD_OFFSET
(
struct
read_process_memory_request
,
addr
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
read_process_memory_request
,
addr
)
==
16
);
C_ASSERT
(
sizeof
(
struct
read_process_memory_request
)
==
24
);
C_ASSERT
(
sizeof
(
struct
read_process_memory_request
)
==
24
);
...
...
server/trace.c
View file @
7bebf7db
...
@@ -2211,9 +2211,10 @@ static void dump_debug_process_request( const struct debug_process_request *req
...
@@ -2211,9 +2211,10 @@ static void dump_debug_process_request( const struct debug_process_request *req
fprintf
(
stderr
,
", attach=%d"
,
req
->
attach
);
fprintf
(
stderr
,
", attach=%d"
,
req
->
attach
);
}
}
static
void
dump_set_debug
ger_kill_on_exit_request
(
const
struct
set_debugger_kill_on_exit
_request
*
req
)
static
void
dump_set_debug
_obj_info_request
(
const
struct
set_debug_obj_info
_request
*
req
)
{
{
fprintf
(
stderr
,
" kill_on_exit=%d"
,
req
->
kill_on_exit
);
fprintf
(
stderr
,
" debug=%04x"
,
req
->
debug
);
fprintf
(
stderr
,
", flags=%08x"
,
req
->
flags
);
}
}
static
void
dump_read_process_memory_request
(
const
struct
read_process_memory_request
*
req
)
static
void
dump_read_process_memory_request
(
const
struct
read_process_memory_request
*
req
)
...
@@ -4475,7 +4476,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
...
@@ -4475,7 +4476,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(
dump_func
)
dump_get_exception_status_request
,
(
dump_func
)
dump_get_exception_status_request
,
(
dump_func
)
dump_continue_debug_event_request
,
(
dump_func
)
dump_continue_debug_event_request
,
(
dump_func
)
dump_debug_process_request
,
(
dump_func
)
dump_debug_process_request
,
(
dump_func
)
dump_set_debug
ger_kill_on_exit
_request
,
(
dump_func
)
dump_set_debug
_obj_info
_request
,
(
dump_func
)
dump_read_process_memory_request
,
(
dump_func
)
dump_read_process_memory_request
,
(
dump_func
)
dump_write_process_memory_request
,
(
dump_func
)
dump_write_process_memory_request
,
(
dump_func
)
dump_create_key_request
,
(
dump_func
)
dump_create_key_request
,
...
@@ -5031,7 +5032,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
...
@@ -5031,7 +5032,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"get_exception_status"
,
"get_exception_status"
,
"continue_debug_event"
,
"continue_debug_event"
,
"debug_process"
,
"debug_process"
,
"set_debug
ger_kill_on_exit
"
,
"set_debug
_obj_info
"
,
"read_process_memory"
,
"read_process_memory"
,
"write_process_memory"
,
"write_process_memory"
,
"create_key"
,
"create_key"
,
...
...
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