Index: sandbox/win/src/process_thread_dispatcher.cc |
diff --git a/sandbox/win/src/process_thread_dispatcher.cc b/sandbox/win/src/process_thread_dispatcher.cc |
index 8debd1e0fbe02be65e703e4d94fa15d690b0da8b..886017c9a2cd26a30cc93759274c8730c078d87d 100644 |
--- a/sandbox/win/src/process_thread_dispatcher.cc |
+++ b/sandbox/win/src/process_thread_dispatcher.cc |
@@ -124,11 +124,22 @@ ThreadProcessDispatcher::ThreadProcessDispatcher(PolicyBase* policy_base) |
reinterpret_cast<CallbackGeneric>( |
&ThreadProcessDispatcher::CreateProcessW)}; |
+ // NOTE(liamjm): 2nd param is size_t: Using VOIDPTR_TYPE as they are |
+ // the same size on windows. |
+ static_assert(sizeof(size_t) == sizeof(void*), |
+ "VOIDPTR_TYPE not same size as size_t"); |
+ static const IPCCall create_thread_params = { |
+ {IPC_CREATETHREAD_TAG, |
+ {VOIDPTR_TYPE, VOIDPTR_TYPE, VOIDPTR_TYPE, UINT32_TYPE}}, |
+ reinterpret_cast<CallbackGeneric>( |
+ &ThreadProcessDispatcher::CreateThread)}; |
+ |
ipc_calls_.push_back(open_thread); |
ipc_calls_.push_back(open_process); |
ipc_calls_.push_back(process_token); |
ipc_calls_.push_back(process_tokenex); |
ipc_calls_.push_back(create_params); |
+ ipc_calls_.push_back(create_thread_params); |
} |
bool ThreadProcessDispatcher::SetupService(InterceptionManager* manager, |
@@ -138,6 +149,7 @@ bool ThreadProcessDispatcher::SetupService(InterceptionManager* manager, |
case IPC_NTOPENPROCESS_TAG: |
case IPC_NTOPENPROCESSTOKEN_TAG: |
case IPC_NTOPENPROCESSTOKENEX_TAG: |
+ case IPC_CREATETHREAD_TAG: |
// There is no explicit policy for these services. |
NOTREACHED(); |
return false; |
@@ -244,4 +256,23 @@ bool ThreadProcessDispatcher::CreateProcessW(IPCInfo* ipc, base::string16* name, |
return true; |
} |
+bool ThreadProcessDispatcher::CreateThread(IPCInfo* ipc, |
+ SIZE_T stack_size, |
+ LPTHREAD_START_ROUTINE start_address, |
+ LPVOID parameter, |
+ DWORD creation_flags) { |
+ if (!start_address) { |
+ return false; |
+ } |
+ |
+ HANDLE handle; |
+ DWORD ret = ProcessPolicy::CreateThreadAction(*ipc->client_info, stack_size, |
+ start_address, parameter, |
+ creation_flags, NULL, &handle); |
+ |
+ ipc->return_info.nt_status = ret; |
+ ipc->return_info.handle = handle; |
+ return true; |
+} |
+ |
} // namespace sandbox |