|
40 | 40 | #include "../wininc/ntddk.h"
|
41 | 41 | #include "../wininc/ntifs.h"
|
42 | 42 | #include "../wininc/tls.h"
|
| 43 | +#include "../wininc/ntpsapi.h" |
43 | 44 |
|
44 | 45 | static app_pc ntdll_base;
|
45 | 46 | dr_os_version_info_t win_ver = {sizeof(win_ver),};
|
@@ -329,6 +330,7 @@ drsys_sysnum_t sysnum_CreateThread = {-1,0};
|
329 | 330 | drsys_sysnum_t sysnum_CreateThreadEx = {-1,0};
|
330 | 331 | drsys_sysnum_t sysnum_CreateUserProcess = {-1,0};
|
331 | 332 | drsys_sysnum_t sysnum_DeviceIoControlFile = {-1,0};
|
| 333 | +drsys_sysnum_t sysnum_QueryInformationThread = {-1,0}; |
332 | 334 | drsys_sysnum_t sysnum_QuerySystemInformation = {-1,0};
|
333 | 335 | drsys_sysnum_t sysnum_QuerySystemInformationWow64 = {-1,0};
|
334 | 336 | drsys_sysnum_t sysnum_QuerySystemInformationEx = {-1,0};
|
@@ -1877,6 +1879,24 @@ handle_post_CreateUserProcess(void *drcontext, cls_syscall_t *pt, sysarg_iter_in
|
1877 | 1879 | }
|
1878 | 1880 | }
|
1879 | 1881 |
|
| 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 | + |
1880 | 1900 | static void
|
1881 | 1901 | handle_QuerySystemInformation(void *drcontext, cls_syscall_t *pt, sysarg_iter_info_t *ii)
|
1882 | 1902 | {
|
@@ -3036,6 +3056,8 @@ os_handle_pre_syscall(void *drcontext, cls_syscall_t *pt, sysarg_iter_info_t *ii
|
3036 | 3056 | handle_SetInformationProcess(drcontext, pt, ii);
|
3037 | 3057 | else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_SetInformationFile))
|
3038 | 3058 | handle_SetInformationFile(drcontext, pt, ii);
|
| 3059 | + else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QueryInformationThread)) |
| 3060 | + handle_QueryInformationThread(drcontext, pt, ii); |
3039 | 3061 | else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QuerySystemInformation) ||
|
3040 | 3062 | drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QuerySystemInformationWow64) ||
|
3041 | 3063 | 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
|
3121 | 3143 | handle_post_CreateUserProcess(drcontext, pt, ii);
|
3122 | 3144 | else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_DeviceIoControlFile))
|
3123 | 3145 | handle_DeviceIoControlFile(drcontext, pt, ii);
|
| 3146 | + else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_QueryInformationThread)) |
| 3147 | + handle_QueryInformationThread(drcontext, pt, ii); |
3124 | 3148 | else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_SetSystemInformation))
|
3125 | 3149 | handle_SetSystemInformation(drcontext, pt, ii);
|
3126 | 3150 | else if (drsys_sysnums_equal(&ii->arg->sysnum, &sysnum_SetInformationProcess))
|
|
0 commit comments