CProcessesHandles::CEntry::CMemBlock::~CMemBlock() { SIZE_T nSize; if (lpBaseAddress != NULL && nFreeCount >= (65536 / nSlotSize)) { nSize = 0; NktNtFreeVirtualMemory(hProc, (PVOID*)&lpBaseAddress, &nSize, MEM_RELEASE); } if (lpFreeEntries != NULL) NktHookLibHelpers::MemFree(lpFreeEntries); return; }
NTSTATUS NtFreeVirtualMemory64(__in HANDLE ProcessHandle, __inout ULONGLONG *BaseAddress, __inout PSIZE_T RegionSize, __in ULONG FreeType) { #if defined(_M_IX86) ULONGLONG nRegionSize; NTSTATUS nNtStatus; Initialize(); //---- if (NktHookLib_fnNtFreeVirtualMemory64 == 0ui64) return STATUS_NOT_IMPLEMENTED; nRegionSize = (ULONGLONG)(*RegionSize); nNtStatus = NktHookLib_CallWow64(NktHookLib_fnNtFreeVirtualMemory64, Handle2Ull(ProcessHandle), Ptr2Ull(BaseAddress), Ptr2Ull(&nRegionSize), Ul2Ull(FreeType), 0ui64, 0ui64, 0ui64, 0ui64, 0ui64, 0ui64, 0ui64); *RegionSize = (SIZE_T)nRegionSize; return nNtStatus; #elif defined(_M_X64) return NktNtFreeVirtualMemory(ProcessHandle, (PVOID*)BaseAddress, RegionSize, FreeType); #endif }