MmDbg kernel thunk stubs
This commit is contained in:
parent
8766aa57bf
commit
dbc6b77434
|
@ -100,11 +100,17 @@ XBSYSAPI EXPORTNUM(173) PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress
|
|||
IN PVOID BaseAddress
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmIsAddressValid
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(174) BOOLEAN NTAPI MmIsAddressValid
|
||||
(
|
||||
IN PVOID VirtualAddress
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmLockUnlockBufferPages
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(175) VOID NTAPI MmLockUnlockBufferPages
|
||||
(
|
||||
IN PHYSICAL_ADDRESS BaseAddress,
|
||||
|
@ -112,6 +118,9 @@ XBSYSAPI EXPORTNUM(175) VOID NTAPI MmLockUnlockBufferPages
|
|||
IN ULONG Protect
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmLockUnlockPhysicalPage
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(176) VOID NTAPI MmLockUnlockPhysicalPage
|
||||
(
|
||||
IN ULONG_PTR PhysicalAddress,
|
||||
|
@ -138,6 +147,9 @@ XBSYSAPI EXPORTNUM(178) VOID NTAPI MmPersistContiguousMemory
|
|||
IN BOOLEAN Persist
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmQueryAddressProtect
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(179) ULONG NTAPI MmQueryAddressProtect
|
||||
(
|
||||
IN PVOID VirtualAddress
|
||||
|
@ -178,6 +190,47 @@ XBSYSAPI EXPORTNUM(183) NTSTATUS NTAPI MmUnmapIoSpace
|
|||
IN ULONG NumberOfBytes
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmDbgAllocateMemory
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(374) PVOID NTAPI MmDbgAllocateMemory
|
||||
(
|
||||
IN ULONG NumberOfBytes,
|
||||
IN ULONG Protect
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmDbgFreeMemory
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(375) ULONG NTAPI MmDbgFreeMemory
|
||||
(
|
||||
IN PVOID BaseAddress,
|
||||
IN ULONG NumberOfBytes
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmDbgQueryAvailablePages
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(376) ULONG NTAPI MmDbgQueryAvailablePages();
|
||||
|
||||
// ******************************************************************
|
||||
// * MmDbgReleaseAddress
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(377) VOID NTAPI MmDbgReleaseAddress
|
||||
(
|
||||
IN PVOID VirtualAddress,
|
||||
IN PULONG Opaque
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * MmDbgWriteCheck
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(378) PVOID NTAPI MmDbgWriteCheck
|
||||
(
|
||||
IN PVOID VirtualAddress,
|
||||
IN PULONG Opaque
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -543,3 +543,86 @@ XBSYSAPI EXPORTNUM(183) xboxkrnl::NTSTATUS NTAPI xboxkrnl::MmUnmapIoSpace
|
|||
RETURN(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0176 - MmDbgAllocateMemory
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(374) xboxkrnl::PVOID NTAPI xboxkrnl::MmDbgAllocateMemory
|
||||
(
|
||||
IN ULONG NumberOfBytes,
|
||||
IN ULONG Protect
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(NumberOfBytes)
|
||||
LOG_FUNC_ARG(Protect)
|
||||
LOG_FUNC_END;
|
||||
|
||||
LOG_UNIMPLEMENTED();
|
||||
|
||||
RETURN(NULL);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0177 - MmDbgFreeMemory
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(375) xboxkrnl::ULONG NTAPI xboxkrnl::MmDbgFreeMemory
|
||||
(
|
||||
IN PVOID BaseAddress,
|
||||
IN ULONG NumberOfBytes
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(BaseAddress)
|
||||
LOG_FUNC_ARG(NumberOfBytes)
|
||||
LOG_FUNC_END;
|
||||
|
||||
LOG_UNIMPLEMENTED();
|
||||
|
||||
RETURN(NULL);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0178 - MmDbgQueryAvailablePages
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(376) xboxkrnl::ULONG NTAPI xboxkrnl::MmDbgQueryAvailablePages()
|
||||
{
|
||||
LOG_UNIMPLEMENTED();
|
||||
|
||||
RETURN(NULL);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0179 - MmDbgReleaseAddress
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(377) xboxkrnl::VOID NTAPI xboxkrnl::MmDbgReleaseAddress
|
||||
(
|
||||
IN PVOID VirtualAddress,
|
||||
IN PULONG Opaque
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(VirtualAddress)
|
||||
LOG_FUNC_ARG(Opaque)
|
||||
LOG_FUNC_END;
|
||||
|
||||
LOG_UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x017A - MmDbgWriteCheck
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(378) xboxkrnl::PVOID NTAPI xboxkrnl::MmDbgWriteCheck
|
||||
(
|
||||
IN PVOID VirtualAddress,
|
||||
IN PULONG Opaque
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(VirtualAddress)
|
||||
LOG_FUNC_ARG(Opaque)
|
||||
LOG_FUNC_END;
|
||||
|
||||
LOG_UNIMPLEMENTED();
|
||||
|
||||
RETURN(NULL);
|
||||
}
|
||||
|
|
|
@ -440,11 +440,11 @@ uint32 CxbxKrnl_KernelThunkTable[379] =
|
|||
(uint32)FUNC(&xboxkrnl::XProfpGetData), // 0x0173 (371) PROFILING
|
||||
(uint32)FUNC(&xboxkrnl::IrtClientInitFast), // 0x0174 (372) PROFILING
|
||||
(uint32)FUNC(&xboxkrnl::IrtSweep), // 0x0175 (373) PROFILING
|
||||
(uint32)PANIC(0x0176), // 0x0177 (374) DEVKIT MmDbgAllocateMemory
|
||||
(uint32)PANIC(0x0177), // 0x0178 (375) DEVKIT MmDbgFreeMemory - Returns number of pages released.
|
||||
(uint32)PANIC(0x0178), // 0x0179 (376) DEVKIT MmDbgQueryAvailablePages
|
||||
(uint32)PANIC(0x0179), // 0x017A (377) DEVKIT MmDbgReleaseAddress
|
||||
(uint32)PANIC(0x017A), // 0x017A (378) DEVKIT MmDbgWriteCheck
|
||||
(uint32)FUNC(&xboxkrnl::MmDbgAllocateMemory), // 0x0176 (374) DEVKIT ONLY!
|
||||
(uint32)FUNC(&xboxkrnl::MmDbgFreeMemory), // 0x0177 (375) DEVKIT ONLY!
|
||||
(uint32)FUNC(&xboxkrnl::MmDbgQueryAvailablePages), // 0x0178 (376) DEVKIT ONLY!
|
||||
(uint32)FUNC(&xboxkrnl::MmDbgReleaseAddress), // 0x0179 (377) DEVKIT ONLY!
|
||||
(uint32)FUNC(&xboxkrnl::MmDbgWriteCheck), // 0x017A (378) DEVKIT ONLY!
|
||||
};
|
||||
|
||||
/* prevent name collisions */
|
||||
|
|
|
@ -53,8 +53,7 @@ bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const
|
|||
{
|
||||
assert(base + size == next.base);
|
||||
|
||||
if (permissions != next.permissions || type != next.type ||
|
||||
type == VMAType::Lock || next.type == VMAType::Lock) { return false; }
|
||||
if (permissions != next.permissions || type != next.type) { return false; }
|
||||
if (type == VMAType::Allocated && next.type == VMAType::Allocated) { return false; }
|
||||
|
||||
return true;
|
||||
|
@ -1298,57 +1297,8 @@ VMAIter VMManager::ReprotectVMA(VMAIter vma_handle, DWORD new_perms)
|
|||
return MergeAdjacentVMA(vma_handle);
|
||||
}
|
||||
|
||||
void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma)
|
||||
VMAIter VMManager::DestructVMA(VAddr addr, MemoryRegionType Type)
|
||||
{
|
||||
switch (vma.type)
|
||||
{
|
||||
case VMAType::Free:
|
||||
case VMAType::MemTiled:
|
||||
case VMAType::IO_DeviceNV2A:
|
||||
case VMAType::MemNV2A_PRAMIN:
|
||||
case VMAType::IO_DeviceAPU:
|
||||
case VMAType::IO_DeviceAC97:
|
||||
case VMAType::IO_DeviceUSB0:
|
||||
case VMAType::IO_DeviceUSB1:
|
||||
case VMAType::IO_DeviceNVNet:
|
||||
case VMAType::DeviceBIOS:
|
||||
case VMAType::DeviceMCPX:
|
||||
{
|
||||
UnmapRegion(vma.base, vma.size);
|
||||
}
|
||||
break;
|
||||
|
||||
case VMAType::Allocated:
|
||||
case VMAType::Stack:
|
||||
{
|
||||
MapMemoryRegion(vma.base, vma.size, vma.backing_block);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
CxbxKrnlCleanup("VMAType::Lock or Unknown type in UpdatePageTableForVMA");
|
||||
}
|
||||
}
|
||||
|
||||
VMAIter VMManager::DestructVMA(VMAIter vma_handle, VAddr addr, size_t size)
|
||||
{
|
||||
if (vma_handle->second.type == VMAType::Free) { return std::next(vma_handle); }
|
||||
|
||||
|
||||
if (vma_handle->second.type != VMAType::Stack)
|
||||
{
|
||||
vma_handle->second.permissions & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) ?
|
||||
m_ImageMemoryInUse -= size : m_NonImageMemoryInUse -= size;
|
||||
}
|
||||
else { m_StackMemoryInUse -= size; }
|
||||
|
||||
|
||||
if (vma_handle->second.type == VMAType::Allocated || vma_handle->second.type == VMAType::Stack)
|
||||
{
|
||||
if (vma_handle->second.bFragmented) { DeAllocateFragmented(vma_handle->second.backing_block); }
|
||||
else { DeAllocatePhysicalMemory(vma_handle->second.backing_block); }
|
||||
}
|
||||
|
||||
VMAIter vma = CarveVMARange(addr, size);
|
||||
|
||||
VAddr target_end = addr + size;
|
||||
|
@ -1362,48 +1312,3 @@ VMAIter VMManager::DestructVMA(VMAIter vma_handle, VAddr addr, size_t size)
|
|||
|
||||
return vma;
|
||||
}
|
||||
|
||||
void VMManager::ResizeVMA(VMAIter vma_handle, size_t offset, bool bStart)
|
||||
{
|
||||
if (!offset) { return; } // nothing to do
|
||||
|
||||
VirtualMemoryArea& old_vma = vma_handle->second;
|
||||
VirtualMemoryArea new_vma = old_vma;
|
||||
|
||||
if (bStart)
|
||||
{
|
||||
if (offset > old_vma.size) { return; } // sanity check
|
||||
VAddr new_base = old_vma.base + offset;
|
||||
new_vma.base = new_base;
|
||||
new_vma.size = old_vma.size - offset;
|
||||
|
||||
if (old_vma.type == VMAType::Allocated || old_vma.type == VMAType::Stack) {
|
||||
ShrinkPhysicalAllocation(vma_handle->second.backing_block, offset, vma_handle->second.bFragmented, bStart);
|
||||
}
|
||||
m_Vma_map.erase(old_vma.base);
|
||||
if(new_vma.size) { m_Vma_map.emplace(new_base, new_vma); }
|
||||
}
|
||||
else
|
||||
{
|
||||
if (offset > old_vma.size) { return; } // sanity check
|
||||
VAddr new_base = old_vma.base;
|
||||
new_vma.base = new_base;
|
||||
new_vma.size = old_vma.size - offset;
|
||||
|
||||
if (old_vma.type == VMAType::Allocated || old_vma.type == VMAType::Stack) {
|
||||
ShrinkPhysicalAllocation(vma_handle->second.backing_block, offset, vma_handle->second.bFragmented, bStart);
|
||||
}
|
||||
m_Vma_map.erase(old_vma.base);
|
||||
if (new_vma.size) { m_Vma_map.emplace(new_base, new_vma); }
|
||||
}
|
||||
|
||||
if (new_vma.type != VMAType::Free)
|
||||
{
|
||||
if (new_vma.type != VMAType::Stack)
|
||||
{
|
||||
new_vma.permissions & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) ?
|
||||
m_ImageMemoryInUse -= offset : m_NonImageMemoryInUse -= offset;
|
||||
}
|
||||
else { m_StackMemoryInUse -= offset; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -221,9 +221,7 @@ class VMManager : public PhysicalMemory
|
|||
// releases the critical section
|
||||
void Unlock();
|
||||
// destructs a vma if not free already
|
||||
VMAIter DestructVMA(VMAIter vma_handle, VAddr addr, size_t size);
|
||||
// changes the size/base of a vma
|
||||
void ResizeVMA(VMAIter vma_handle, size_t offset, bool bStart);
|
||||
VMAIter DestructVMA(VAddr addr, MemoryRegionType Type);
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue