diff options
Diffstat (limited to 'chromium/sandbox/win/src/service_resolver_64.cc')
-rw-r--r-- | chromium/sandbox/win/src/service_resolver_64.cc | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/chromium/sandbox/win/src/service_resolver_64.cc b/chromium/sandbox/win/src/service_resolver_64.cc index 473ddbc7f16..03795f7c9d0 100644 --- a/chromium/sandbox/win/src/service_resolver_64.cc +++ b/chromium/sandbox/win/src/service_resolver_64.cc @@ -56,7 +56,7 @@ struct ServiceEntryW8 { ULONG mov_r10_rcx_mov_eax; // = 4C 8B D1 B8 ULONG service_id; USHORT syscall; // = 0F 05 - BYTE ret; // = C2 + BYTE ret; // = C3 BYTE nop; // = 90 }; @@ -116,6 +116,30 @@ size_t ServiceResolverThunk::GetThunkSize() const { return sizeof(ServiceFullThunk); } +NTSTATUS ServiceResolverThunk::CopyThunk(const void* target_module, + const char* target_name, + BYTE* thunk_storage, + size_t storage_bytes, + size_t* storage_used) { + NTSTATUS ret = ResolveTarget(target_module, target_name, &target_); + if (!NT_SUCCESS(ret)) + return ret; + + size_t thunk_bytes = GetThunkSize(); + if (storage_bytes < thunk_bytes) + return STATUS_UNSUCCESSFUL; + + ServiceFullThunk* thunk = reinterpret_cast<ServiceFullThunk*>(thunk_storage); + + if (!IsFunctionAService(&thunk->original)) + return STATUS_UNSUCCESSFUL; + + if (NULL != storage_used) + *storage_used = thunk_bytes; + + return ret; +} + bool ServiceResolverThunk::IsFunctionAService(void* local_thunk) const { ServiceFullThunk function_code; SIZE_T read; @@ -185,9 +209,4 @@ bool Wow64ResolverThunk::IsFunctionAService(void* local_thunk) const { return false; } -bool Win2kResolverThunk::IsFunctionAService(void* local_thunk) const { - NOTREACHED_NT(); - return false; -} - } // namespace sandbox |