Index: sandbox/win/src/service_resolver_64.cc |
diff --git a/sandbox/win/src/service_resolver_64.cc b/sandbox/win/src/service_resolver_64.cc |
index 96124187deb4b383708bca09645f81f3bced75f9..79c6b16ebef7c540462d80697f29ffac4548a2c7 100644 |
--- a/sandbox/win/src/service_resolver_64.cc |
+++ b/sandbox/win/src/service_resolver_64.cc |
@@ -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; |