here's the implementation and some corrections of some unimplemented
functions at lib/rtl/heap.c
NTSTATUS NTAPI
RtlEnumProcessHeaps(PHEAP_ENUMERATION_ROUTINE HeapEnumerationRoutine,
PVOID lParam)
{
#if 1
NTSTATUS Status = STATUS_SUCCESS;
struct list *ptr=NULL;
RtlEnterHeapLock(&processHeap->critSection);
Status=HeapEnumerationRoutine(processHeap,lParam);
LIST_FOR_EACH( ptr, &processHeap->entry )
{
if (!NT_SUCCESS(Status))
break;
Status = HeapEnumerationRoutine(ptr,lParam);
}
RtlLeaveHeapLock(&processHeap->critSection);
return Status;
#endif
}
/*
* @implemented
*/
ULONG NTAPI
RtlGetProcessHeaps(ULONG count,
HANDLE *heaps )
{
ULONG total = 1; /* main heap */
struct list *ptr;
ULONG i=0;
RtlEnterHeapLock( &processHeap->critSection );
LIST_FOR_EACH( ptr, &processHeap->entry ) total++;
//if (total <= count)
{
*(heaps++) = processHeap;
i++;
LIST_FOR_EACH( ptr, &processHeap->entry )
{
if(i>=count)
{
break;
}
i++;
*(heaps++) = LIST_ENTRY( ptr, HEAP, entry );
}
}
RtlLeaveHeapLock( &processHeap->critSection );
return i;
}
/*
* @implemented
*/
BOOLEAN NTAPI
RtlValidateProcessHeaps(VOID)
{
#if 1
BOOLEAN Result = TRUE;
HEAP ** pptr;
RtlEnterHeapLock( &processHeap->critSection );
for (pptr = (HEAP**)&NtCurrentPeb()->ProcessHeaps; *pptr; pptr++)
{
if (!RtlValidateHeap(*pptr, 0, NULL))
{
Result = FALSE;
break;
}
}
RtlLeaveHeapLock( &processHeap->critSection );
return Result;
#endif
}
is it correct?
______________________________________________
LLama Gratis a cualquier PC del Mundo.
Llamadas a fijos y móviles desde 1 céntimo por minuto.
http://es.voice.yahoo.com