Skip to content

Commit 72067db

Browse files
committed
i#1885: false pos in TppIsWorkerThread
Adds handling of the special extra write in NtQueryInformationThread.ThreadTebInformation. Fixes DynamoRIO#1885 Review-URL: https://codereview.appspot.com/292610043
1 parent f7d2329 commit 72067db

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

Diff for: drsyscall/drsyscall_windows.c

+24
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "../wininc/ntddk.h"
4141
#include "../wininc/ntifs.h"
4242
#include "../wininc/tls.h"
43+
#include "../wininc/ntpsapi.h"
4344

4445
static app_pc ntdll_base;
4546
dr_os_version_info_t win_ver = {sizeof(win_ver),};
@@ -329,6 +330,7 @@ drsys_sysnum_t sysnum_CreateThread = {-1,0};
329330
drsys_sysnum_t sysnum_CreateThreadEx = {-1,0};
330331
drsys_sysnum_t sysnum_CreateUserProcess = {-1,0};
331332
drsys_sysnum_t sysnum_DeviceIoControlFile = {-1,0};
333+
drsys_sysnum_t sysnum_QueryInformationThread = {-1,0};
332334
drsys_sysnum_t sysnum_QuerySystemInformation = {-1,0};
333335
drsys_sysnum_t sysnum_QuerySystemInformationWow64 = {-1,0};
334336
drsys_sysnum_t sysnum_QuerySystemInformationEx = {-1,0};
@@ -1877,6 +1879,24 @@ handle_post_CreateUserProcess(void *drcontext, cls_syscall_t *pt, sysarg_iter_in
18771879
}
18781880
}
18791881

1882+
static void
1883+
handle_QueryInformationThread(void *drcontext, cls_syscall_t *pt, sysarg_iter_info_t *ii)
1884+
{
1885+
/* Some cases are more complex than a single write. */
1886+
THREADINFOCLASS cls = (THREADINFOCLASS) pt->sysarg[1];
1887+
if (cls == ThreadTebInformation) { /* i#1885 */
1888+
THREAD_TEB_INFORMATION info;
1889+
if (!ii->arg->pre &&
1890+
NT_SUCCESS(dr_syscall_get_result(drcontext)) &&
1891+
safe_read((byte *) pt->sysarg[2], sizeof(info), &info)) {
1892+
if (!report_memarg_type(ii, 1, SYSARG_WRITE,
1893+
info.OutputBuffer, info.BytesToRead, "TebInfo",
1894+
DRSYS_TYPE_STRUCT, NULL))
1895+
return;
1896+
}
1897+
}
1898+
}
1899+
18801900
static void
18811901
handle_QuerySystemInformation(void *drcontext, cls_syscall_t *pt, sysarg_iter_info_t *ii)
18821902
{
@@ -3036,6 +3056,8 @@ os_handle_pre_syscall(void *drcontext, cls_syscall_t *pt, sysarg_iter_info_t *ii
30363056
handle_SetInformationProcess(drcontext, pt, ii);
30373057
else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_SetInformationFile))
30383058
handle_SetInformationFile(drcontext, pt, ii);
3059+
else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QueryInformationThread))
3060+
handle_QueryInformationThread(drcontext, pt, ii);
30393061
else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QuerySystemInformation) ||
30403062
drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QuerySystemInformationWow64) ||
30413063
drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QuerySystemInformationEx))
@@ -3121,6 +3143,8 @@ os_handle_post_syscall(void *drcontext, cls_syscall_t *pt, sysarg_iter_info_t *i
31213143
handle_post_CreateUserProcess(drcontext, pt, ii);
31223144
else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_DeviceIoControlFile))
31233145
handle_DeviceIoControlFile(drcontext, pt, ii);
3146+
else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QueryInformationThread))
3147+
handle_QueryInformationThread(drcontext, pt, ii);
31243148
else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_SetSystemInformation))
31253149
handle_SetSystemInformation(drcontext, pt, ii);
31263150
else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_SetInformationProcess))

Diff for: drsyscall/table_windows_ntoskrnl.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ extern drsys_sysnum_t sysnum_CreateThread;
8787
extern drsys_sysnum_t sysnum_CreateThreadEx;
8888
extern drsys_sysnum_t sysnum_CreateUserProcess;
8989
extern drsys_sysnum_t sysnum_DeviceIoControlFile;
90+
extern drsys_sysnum_t sysnum_QueryInformationThread;
9091
extern drsys_sysnum_t sysnum_QuerySystemInformation;
9192
extern drsys_sysnum_t sysnum_QuerySystemInformationWow64;
9293
extern drsys_sysnum_t sysnum_QuerySystemInformationEx;
@@ -1535,7 +1536,7 @@ syscall_info_t syscall_ntdll_info[] = {
15351536
{2, -4, WI},
15361537
{3, sizeof(ULONG), SYSARG_INLINED, DRSYS_TYPE_UNSIGNED_INT},
15371538
{4, sizeof(ULONG), W|HT, DRSYS_TYPE_UNSIGNED_INT},
1538-
}
1539+
}, &sysnum_QueryInformationThread
15391540
},
15401541
{{0,0},"NtQueryInformationToken", OK|SYSINFO_RET_SMALL_WRITE_LAST, RNTST, 5,
15411542
{

Diff for: wininc/ndk_psfuncs.h

+5
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ typedef enum _THREADINFOCLASS
111111
ThreadActualBasePriority,
112112
ThreadTebInformation,
113113
ThreadCSwitchMon,
114+
ThreadWow64Context,
115+
ThreadGroupInformation,
116+
ThreadUmsInformation,
117+
ThreadCounterProfiling,
118+
ThreadIdealProcessorEx,
114119
MaxThreadInfoClass
115120
} THREADINFOCLASS;
116121

Diff for: wininc/ntpsapi.h

+13
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
#ifndef __PHLIB_NTPSAPI_H
1616
#define __PHLIB_NTPSAPI_H
1717

18+
typedef DWORD MEMORY_RESERVE_TYPE;
19+
typedef PVOID PPS_APC_ROUTINE;
20+
1821
/**************************************************
1922
* Syscalls added in Win7
2023
*/
@@ -63,6 +66,16 @@ NtUmsThreadYield(
6366
__in PVOID SchedulerParam
6467
);
6568

69+
/**************************************************
70+
* NtQueryThreadInformation
71+
*/
72+
73+
typedef struct _THREAD_TEB_INFORMATION {
74+
PVOID OutputBuffer;
75+
ULONG TebOffset;
76+
ULONG BytesToRead;
77+
} THREAD_TEB_INFORMATION, *PTHREAD_TEB_INFORMATION;
78+
6679
#endif /* __PHLIB_NTPSAPI_H */
6780

6881
/* EOF */

0 commit comments

Comments
 (0)