|
|
|
@ -53,7 +53,7 @@ Result SetProcessMemoryPermission(Core::System& system, Handle process_handle, V
|
|
|
|
|
R_UNLESS(page_table.Contains(address, size), ResultInvalidCurrentMemory);
|
|
|
|
|
|
|
|
|
|
// Set the memory permission.
|
|
|
|
|
return page_table.SetProcessMemoryPermission(address, size, perm);
|
|
|
|
|
R_RETURN(page_table.SetProcessMemoryPermission(address, size, perm));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Result MapProcessMemory(Core::System& system, VAddr dst_address, Handle process_handle,
|
|
|
|
@ -93,10 +93,8 @@ Result MapProcessMemory(Core::System& system, VAddr dst_address, Handle process_
|
|
|
|
|
KMemoryAttribute::All, KMemoryAttribute::None));
|
|
|
|
|
|
|
|
|
|
// Map the group.
|
|
|
|
|
R_TRY(dst_pt.MapPageGroup(dst_address, pg, KMemoryState::SharedCode,
|
|
|
|
|
KMemoryPermission::UserReadWrite));
|
|
|
|
|
|
|
|
|
|
return ResultSuccess;
|
|
|
|
|
R_RETURN(dst_pt.MapPageGroup(dst_address, pg, KMemoryState::SharedCode,
|
|
|
|
|
KMemoryPermission::UserReadWrite));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Result UnmapProcessMemory(Core::System& system, VAddr dst_address, Handle process_handle,
|
|
|
|
@ -129,9 +127,7 @@ Result UnmapProcessMemory(Core::System& system, VAddr dst_address, Handle proces
|
|
|
|
|
ResultInvalidMemoryRegion);
|
|
|
|
|
|
|
|
|
|
// Unmap the memory.
|
|
|
|
|
R_TRY(dst_pt.UnmapProcessMemory(dst_address, size, src_pt, src_address));
|
|
|
|
|
|
|
|
|
|
return ResultSuccess;
|
|
|
|
|
R_RETURN(dst_pt.UnmapProcessMemory(dst_address, size, src_pt, src_address));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst_address,
|
|
|
|
@ -144,18 +140,18 @@ Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst
|
|
|
|
|
if (!Common::Is4KBAligned(src_address)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "src_address is not page-aligned (src_address=0x{:016X}).",
|
|
|
|
|
src_address);
|
|
|
|
|
return ResultInvalidAddress;
|
|
|
|
|
R_THROW(ResultInvalidAddress);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!Common::Is4KBAligned(dst_address)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "dst_address is not page-aligned (dst_address=0x{:016X}).",
|
|
|
|
|
dst_address);
|
|
|
|
|
return ResultInvalidAddress;
|
|
|
|
|
R_THROW(ResultInvalidAddress);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (size == 0 || !Common::Is4KBAligned(size)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "Size is zero or not page-aligned (size=0x{:016X})", size);
|
|
|
|
|
return ResultInvalidSize;
|
|
|
|
|
R_THROW(ResultInvalidSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!IsValidAddressRange(dst_address, size)) {
|
|
|
|
@ -163,7 +159,7 @@ Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst
|
|
|
|
|
"Destination address range overflows the address space (dst_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
dst_address, size);
|
|
|
|
|
return ResultInvalidCurrentMemory;
|
|
|
|
|
R_THROW(ResultInvalidCurrentMemory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!IsValidAddressRange(src_address, size)) {
|
|
|
|
@ -171,7 +167,7 @@ Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst
|
|
|
|
|
"Source address range overflows the address space (src_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
src_address, size);
|
|
|
|
|
return ResultInvalidCurrentMemory;
|
|
|
|
|
R_THROW(ResultInvalidCurrentMemory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable();
|
|
|
|
@ -179,7 +175,7 @@ Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst
|
|
|
|
|
if (process.IsNull()) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "Invalid process handle specified (handle=0x{:08X}).",
|
|
|
|
|
process_handle);
|
|
|
|
|
return ResultInvalidHandle;
|
|
|
|
|
R_THROW(ResultInvalidHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto& page_table = process->PageTable();
|
|
|
|
@ -188,7 +184,7 @@ Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst
|
|
|
|
|
"Source address range is not within the address space (src_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
src_address, size);
|
|
|
|
|
return ResultInvalidCurrentMemory;
|
|
|
|
|
R_THROW(ResultInvalidCurrentMemory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!page_table.IsInsideASLRRegion(dst_address, size)) {
|
|
|
|
@ -196,10 +192,10 @@ Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst
|
|
|
|
|
"Destination address range is not within the ASLR region (dst_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
dst_address, size);
|
|
|
|
|
return ResultInvalidMemoryRegion;
|
|
|
|
|
R_THROW(ResultInvalidMemoryRegion);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return page_table.MapCodeMemory(dst_address, src_address, size);
|
|
|
|
|
R_RETURN(page_table.MapCodeMemory(dst_address, src_address, size));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst_address,
|
|
|
|
@ -212,18 +208,18 @@ Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 d
|
|
|
|
|
if (!Common::Is4KBAligned(dst_address)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "dst_address is not page-aligned (dst_address=0x{:016X}).",
|
|
|
|
|
dst_address);
|
|
|
|
|
return ResultInvalidAddress;
|
|
|
|
|
R_THROW(ResultInvalidAddress);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!Common::Is4KBAligned(src_address)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "src_address is not page-aligned (src_address=0x{:016X}).",
|
|
|
|
|
src_address);
|
|
|
|
|
return ResultInvalidAddress;
|
|
|
|
|
R_THROW(ResultInvalidAddress);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (size == 0 || !Common::Is4KBAligned(size)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "Size is zero or not page-aligned (size=0x{:016X}).", size);
|
|
|
|
|
return ResultInvalidSize;
|
|
|
|
|
R_THROW(ResultInvalidSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!IsValidAddressRange(dst_address, size)) {
|
|
|
|
@ -231,7 +227,7 @@ Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 d
|
|
|
|
|
"Destination address range overflows the address space (dst_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
dst_address, size);
|
|
|
|
|
return ResultInvalidCurrentMemory;
|
|
|
|
|
R_THROW(ResultInvalidCurrentMemory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!IsValidAddressRange(src_address, size)) {
|
|
|
|
@ -239,7 +235,7 @@ Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 d
|
|
|
|
|
"Source address range overflows the address space (src_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
src_address, size);
|
|
|
|
|
return ResultInvalidCurrentMemory;
|
|
|
|
|
R_THROW(ResultInvalidCurrentMemory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable();
|
|
|
|
@ -247,7 +243,7 @@ Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 d
|
|
|
|
|
if (process.IsNull()) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "Invalid process handle specified (handle=0x{:08X}).",
|
|
|
|
|
process_handle);
|
|
|
|
|
return ResultInvalidHandle;
|
|
|
|
|
R_THROW(ResultInvalidHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto& page_table = process->PageTable();
|
|
|
|
@ -256,7 +252,7 @@ Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 d
|
|
|
|
|
"Source address range is not within the address space (src_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
src_address, size);
|
|
|
|
|
return ResultInvalidCurrentMemory;
|
|
|
|
|
R_THROW(ResultInvalidCurrentMemory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!page_table.IsInsideASLRRegion(dst_address, size)) {
|
|
|
|
@ -264,11 +260,11 @@ Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 d
|
|
|
|
|
"Destination address range is not within the ASLR region (dst_address=0x{:016X}, "
|
|
|
|
|
"size=0x{:016X}).",
|
|
|
|
|
dst_address, size);
|
|
|
|
|
return ResultInvalidMemoryRegion;
|
|
|
|
|
R_THROW(ResultInvalidMemoryRegion);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return page_table.UnmapCodeMemory(dst_address, src_address, size,
|
|
|
|
|
KPageTable::ICacheInvalidationStrategy::InvalidateAll);
|
|
|
|
|
R_RETURN(page_table.UnmapCodeMemory(dst_address, src_address, size,
|
|
|
|
|
KPageTable::ICacheInvalidationStrategy::InvalidateAll));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Result SetProcessMemoryPermission64(Core::System& system, Handle process_handle, uint64_t address,
|
|
|
|
|