[Memory] Add HostToGuestVirtual and use it in a couple of places

This commit is contained in:
Triang3l
2019-08-13 23:49:49 +03:00
parent f1b9e1afce
commit 741b5ae2ec
7 changed files with 80 additions and 40 deletions

View File

@@ -314,11 +314,11 @@ X_STATUS UserModule::GetOptHeader(xex2_header_keys key,
if (!header) {
return X_STATUS_UNSUCCESSFUL;
}
return GetOptHeader(memory()->virtual_membase(), header, key,
out_header_guest_ptr);
return GetOptHeader(memory(), header, key, out_header_guest_ptr);
}
X_STATUS UserModule::GetOptHeader(uint8_t* membase, const xex2_header* header,
X_STATUS UserModule::GetOptHeader(const Memory* memory,
const xex2_header* header,
xex2_header_keys key,
uint32_t* out_header_guest_ptr) {
assert_not_null(out_header_guest_ptr);
@@ -337,14 +337,11 @@ X_STATUS UserModule::GetOptHeader(uint8_t* membase, const xex2_header* header,
break;
case 0x01:
// Return pointer to data stored in header value.
field_value = static_cast<uint32_t>(
reinterpret_cast<const uint8_t*>(&opt_header.value) - membase);
field_value = memory->HostToGuestVirtual(&opt_header.value);
break;
default:
// Data stored at offset to header.
field_value = static_cast<uint32_t>(
reinterpret_cast<const uint8_t*>(header) - membase) +
opt_header.offset;
field_value = memory->HostToGuestVirtual(header) + opt_header.offset;
break;
}
break;

View File

@@ -81,7 +81,7 @@ class UserModule : public XModule {
// Get optional header that can safely be returned to guest code.
X_STATUS GetOptHeader(xex2_header_keys key, uint32_t* out_header_guest_ptr);
static X_STATUS GetOptHeader(uint8_t* membase, const xex2_header* header,
static X_STATUS GetOptHeader(const Memory* memory, const xex2_header* header,
xex2_header_keys key,
uint32_t* out_header_guest_ptr);

View File

@@ -341,8 +341,8 @@ pointer_result_t RtlImageXexHeaderField(pointer_t<xex2_header> xex_header,
uint32_t field_value = 0;
uint32_t field = field_dword; // VS acts weird going from dword_t -> enum
UserModule::GetOptHeader(kernel_memory()->virtual_membase(), xex_header,
xex2_header_keys(field), &field_value);
UserModule::GetOptHeader(kernel_memory(), xex_header, xex2_header_keys(field),
&field_value);
return field_value;
}