SystemBigPoolInformation 大内存池枚举

#include <windows.h>
#include <winternl.h>
#include <stdio.h>

#include <memory>

#define SystemBigPoolInformation 66

typedef NTSTATUS(WINAPI* FNtQuerySystemInformation)(
	SYSTEM_INFORMATION_CLASS SystemInformationClass,
	PVOID SystemInformation,
	ULONG SystemInformationLength,
	PULONG ReturnLength);

typedef struct _SYSTEM_BIGPOOL_ENTRY
{
	union 
	{
		PVOID VirtualAddress;
		ULONG_PTR NonPaged : 1;
	};
	ULONG_PTR SizeInBytes;
	union 
	{
		UCHAR Tag[4];
		ULONG TagUlong;
	};
} SYSTEM_BIGPOOL_ENTRY, * PSYSTEM_BIGPOOL_ENTRY;

typedef struct _SYSTEM_BIGPOOL_INFORMATION 
{
	ULONG Count;
	SYSTEM_BIGPOOL_ENTRY AllocatedInfo[ANYSIZE_ARRAY];
} SYSTEM_BIGPOOL_INFORMATION, * PSYSTEM_BIGPOOL_INFORMATION;

int main(int argc, char* argv[])
{
	HMODULE m = GetModuleHandleW(L"ntdll.dll");
	if (!m) return 0;

	FNtQuerySystemInformation NtQuerySystemInformation = (FNtQuerySystemInformation)GetProcAddress(m, "NtQuerySystemInformation");
	if (!NtQuerySystemInformation) return 0;

	// 一定要确保内存空间够大
	ULONG SystemInformationLength = 800000 * 2;
	ULONG ReturnLength = 0;
	
	std::unique_ptr<char> buffer(new char[SystemInformationLength]);
	memset(buffer.get(), 0, SystemInformationLength);
	
	NTSTATUS status = NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemBigPoolInformation, buffer.get(), SystemInformationLength, &ReturnLength);
	if (status) return 0;

	PSYSTEM_BIGPOOL_INFORMATION bigpools = (PSYSTEM_BIGPOOL_INFORMATION)buffer.get();
	for (ULONG i = 0; i < bigpools->Count; i++)
	{
		SYSTEM_BIGPOOL_ENTRY& entry = bigpools->AllocatedInfo[i];
#ifdef _WIN64
		printf("%lld Tag: %.*s, Address: 0x%llx, Size: 0x%x \n", i, 4, entry.Tag, entry.VirtualAddress, entry.SizeInBytes);
#else
		printf("%ld Tag: %.*s, Address: 0x%x, Size: 0x%x \n", i, 4, entry.Tag, entry.VirtualAddress, entry.SizeInBytes);
#endif
	}

	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值