| #include <windows.h> |
| #include <nt.h> |
| #include <errno.h> |
| |
| static void *get_process_heap() { |
| static void *process_heap = NULL; |
| if(!process_heap) { |
| PROCESS_BASIC_INFORMATION pbi; |
| NtQueryInformationProcess((void *)-1, ProcessBasicInformation, &pbi, sizeof(pbi), NULL); |
| process_heap = pbi.PebBaseAddress->ProcessHeap; |
| } |
| return process_heap; |
| } |
| |
| void *malloc(size_t size) { |
| void *r = RtlAllocateHeap(get_process_heap(), 0, size); |
| if(!r) errno = ENOMEM; |
| return r; |
| } |
| |
| void *realloc(void *ptr, size_t size) { |
| if(!ptr) return malloc(size); |
| if(!size) { |
| free(ptr); |
| return NULL; |
| } |
| void *r = RtlReAllocateHeap(get_process_heap(), 0, ptr, size); |
| if(!r) errno = ENOMEM; |
| return r; |
| } |
| |
| void free(void *ptr) { |
| RtlFreeHeap(get_process_heap(), 0, ptr); |
| } |