Module: wine Branch: master Commit: 87a3357900015b3da18fbdf216b2a0d4c90140a6 URL: https://gitlab.winehq.org/wine/wine/-/commit/87a3357900015b3da18fbdf216b2a0d...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Nov 16 20:54:51 2022 +0100
winevulkan: Return error if vkMapMemory would truncate pointer on wow64.
---
dlls/winevulkan/make_vulkan | 1 + dlls/winevulkan/vulkan.c | 21 +++++++++++++++++++++ dlls/winevulkan/vulkan_thunks.c | 4 ++-- dlls/winevulkan/vulkan_thunks.h | 1 + 4 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index d02ebbe6b0d..71571bec180 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -209,6 +209,7 @@ FUNCTION_OVERRIDES = { "vkGetDeviceProcAddr" : {"dispatch" : False, "driver" : True, "thunk" : ThunkType.NONE, "loader_thunk" : ThunkType.NONE}, "vkGetDeviceQueue" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.NONE}, "vkGetDeviceQueue2" : {"dispatch": True, "driver" : False, "thunk" : ThunkType.NONE}, + "vkMapMemory" : {"dispatch" : True, "driver" : False, "thunk" : ThunkType.PRIVATE},
# VK_KHR_surface "vkDestroySurfaceKHR" : {"dispatch" : True, "driver" : True, "thunk" : ThunkType.NONE}, diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index ac586c4dbf6..bd02edde4b6 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1441,6 +1441,27 @@ void wine_vkDestroySurfaceKHR(VkInstance handle, VkSurfaceKHR surface, free(object); }
+VkResult wine_vkMapMemory(VkDevice handle, VkDeviceMemory memory, VkDeviceSize offset, + VkDeviceSize size, VkMemoryMapFlags flags, void **data) +{ + struct wine_device *device = wine_device_from_handle(handle); + VkResult result; + + result = device->funcs.p_vkMapMemory(device->device, memory, offset, size, flags, data); + +#ifdef _WIN64 + if (NtCurrentTeb()->WowTebOffset && result == VK_SUCCESS && (UINT_PTR)*data >> 32) + { + FIXME("returned mapping %p does not fit 32-bit pointer\n", *data); + device->funcs.p_vkUnmapMemory(device->device, memory); + *data = NULL; + result = VK_ERROR_OUT_OF_HOST_MEMORY; + } +#endif + + return result; +} + static inline void adjust_max_image_count(struct wine_phys_dev *phys_dev, VkSurfaceCapabilitiesKHR* capabilities) { /* Many Windows games, for example Strange Brigade, No Man's Sky, Path of Exile diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 3cb8762f146..98dd8b5eb97 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -38235,7 +38235,7 @@ static NTSTATUS thunk64_vkMapMemory(void *args)
TRACE("%p, 0x%s, 0x%s, 0x%s, %#x, %p\n", params->device, wine_dbgstr_longlong(params->memory), wine_dbgstr_longlong(params->offset), wine_dbgstr_longlong(params->size), params->flags, params->ppData);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkMapMemory(wine_device_from_handle(params->device)->device, params->memory, params->offset, params->size, params->flags, params->ppData); + params->result = wine_vkMapMemory(params->device, params->memory, params->offset, params->size, params->flags, params->ppData); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -38255,7 +38255,7 @@ static NTSTATUS thunk32_vkMapMemory(void *args)
TRACE("%#x, 0x%s, 0x%s, 0x%s, %#x, %#x\n", params->device, wine_dbgstr_longlong(params->memory), wine_dbgstr_longlong(params->offset), wine_dbgstr_longlong(params->size), params->flags, params->ppData);
- params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkMapMemory(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->device, params->memory, params->offset, params->size, params->flags, (void **)UlongToPtr(params->ppData)); + params->result = wine_vkMapMemory((VkDevice)UlongToPtr(params->device), params->memory, params->offset, params->size, params->flags, (void **)UlongToPtr(params->ppData)); return STATUS_SUCCESS; }
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index 24c94e2b5ee..62e92c8a59f 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -50,6 +50,7 @@ VkResult wine_vkGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physica VkResult wine_vkGetPhysicalDeviceImageFormatProperties2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo, VkImageFormatProperties2 *pImageFormatProperties) DECLSPEC_HIDDEN; VkResult wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, VkSurfaceCapabilities2KHR *pSurfaceCapabilities) DECLSPEC_HIDDEN; VkResult wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) DECLSPEC_HIDDEN; +VkResult wine_vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) DECLSPEC_HIDDEN;
/* For use by vkDevice and children */ struct vulkan_device_funcs