как можно узнать по адресу кучи ее размер ? HANDLE HeapAdr = HANDLE WINAPI HeapCreate( _In_ DWORD flOptions, _In_ SIZE_T dwInitialSize, _In_ SIZE_T dwMaximumSize ); на входе только HeapAdr, нужно узнать dwInitialSize.
не вариант, сама куча может иметь размер 10 mb для примера , а мы выделили только 2 блока по 20 байт - вернет 40 байт
Код (Text): RtlCreateHeap ( IN ULONG Flags, IN PVOID HeapBase OPTIONAL, IN SIZE_T ReserveSize OPTIONAL, IN SIZE_T CommitSize OPTIONAL, IN PVOID Lock OPTIONAL, IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL ) Код (Text): CommitSize = ROUND_UP_TO_POWER2(CommitSize, PAGE_SIZE); if (!ARGUMENT_PRESENT( ReserveSize )) { ReserveSize = ROUND_UP_TO_POWER2( CommitSize, 16 * PAGE_SIZE ); } else { ReserveSize = ROUND_UP_TO_POWER2( ReserveSize, PAGE_SIZE ); } Тоесть какой вам параметр нужен и зачем ? Есть множество апи для получения инфы про хип. RtlSizeHeap() не годится ?
rmn был прав, недооценил я HeapWalk Код (C++): unsigned long GetHeapInitializedSize(HANDLE heap) { unsigned long sz = 0; HeapLock(heap); PROCESS_HEAP_ENTRY entry; memset(&entry, '\0', sizeof entry); while (HeapWalk(heap, &entry)) { if (entry.wFlags != PROCESS_HEAP_UNCOMMITTED_RANGE) { sz += entry.cbData; } } HeapUnlock(heap); return sz; } но вернет оно значение без размера служебной таблицы хипы, результат нужно округлить до размера страницы
Можно еще посмотреть в DEBUG_HEAP_INFORMATION информацию о куче: Код (C++): PDEBUG_BUFFER buffer; NTSTATUS ntStatus; buffer = RtlCreateQueryDebugBuffer(0,FALSE); ntStatus = RtlQueryProcessDebugInformation(GetCurrentProcessId(), PDI_HEAPS|PDI_HEAP_BLOCKS, buffer); PDEBUG_HEAP_INFORMATION heapInfo = PDEBUG_HEAP_INFORMATION(PULONG(buffer->HeapInformation) + 1); std::cout << "Base: " << heapInfo->Base << "\nAllocated: " << heapInfo->Allocated << "\nCommited: " << heapInfo->Committed << "\nBlockCount: " << heapInfo->BlockCount; RtlDestroyQueryDebugBuffer(buffer); Перебирать списки DEBUG_HEAP_INFORMATION пока не найдешь свой.
верно, остается еще служебная таблица хипы, не знаю насколько будет корректным округлить результирующее значение на величину страницы Код (C++): unsigned long GetHeapInitializedSize(HANDLE heap) { unsigned long sz = 0; HeapLock(heap); PROCESS_HEAP_ENTRY entry; memset(&entry, '\0', sizeof entry); while (HeapWalk(heap, &entry)) { if (entry.wFlags != PROCESS_HEAP_UNCOMMITTED_RANGE) { sz += entry.cbData + entry.cbOverhead; } } HeapUnlock(heap); return sz; }
а это вообще идеально выдает Код (C++): ULONG GetHeapInitializedSize2(HANDLE heap) { ULONG res = 0; PDEBUG_BUFFER db = (PDEBUG_BUFFER)RtlCreateQueryDebugBuffer(0, FALSE); RtlQueryProcessDebugInformation(GetCurrentProcessId(), PDI_HEAPS | PDI_HEAP_BLOCKS, db); ULONG heapNodeCount = db->HeapInformation ? *PULONG(db->HeapInformation) : 0; PDEBUG_HEAP_INFORMATION heapInfo = PDEBUG_HEAP_INFORMATION(PULONG(db->HeapInformation) + 1); for (unsigned int i = 0; i < heapNodeCount; i++) { if (heapInfo[i].Base == (ULONG)heap) { res = heapInfo[i].Committed; break; } } RtlDestroyQueryDebugBuffer(db); return res; }