host_memory: Support staged VirtualProtect calls
This commit is contained in:
		
				
					committed by
					
						 Markus Wick
						Markus Wick
					
				
			
			
				
	
			
			
			
						parent
						
							5ba28325b2
						
					
				
				
					commit
					ee67460ff0
				
			| @@ -110,10 +110,19 @@ public: | |||||||
|         } else { |         } else { | ||||||
|             UNIMPLEMENTED_MSG("Protection flag combination read={} write={}", read, write); |             UNIMPLEMENTED_MSG("Protection flag combination read={} write={}", read, write); | ||||||
|         } |         } | ||||||
|  |         const size_t virtual_end = virtual_offset + length; | ||||||
|  |  | ||||||
|  |         std::lock_guard lock{placeholder_mutex}; | ||||||
|  |         auto [it, end] = placeholders.equal_range({virtual_offset, virtual_end}); | ||||||
|  |         while (it != end) { | ||||||
|  |             const size_t offset = std::max(it->lower(), virtual_offset); | ||||||
|  |             const size_t protect_length = std::min(it->upper(), virtual_end) - offset; | ||||||
|             DWORD old_flags{}; |             DWORD old_flags{}; | ||||||
|         if (!VirtualProtect(virtual_base + virtual_offset, length, new_flags, &old_flags)) { |             if (!VirtualProtect(virtual_base + offset, protect_length, new_flags, &old_flags)) { | ||||||
|                 LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules"); |                 LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules"); | ||||||
|             } |             } | ||||||
|  |             ++it; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const size_t backing_size; ///< Size of the backing memory in bytes |     const size_t backing_size; ///< Size of the backing memory in bytes | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user