| /* A part of the Native C Library for Windows NT |
| Copyright 2007-2015 PC GO Ld. |
| |
| This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
| */ |
| |
| #include <windows.h> |
| #include <nt.h> |
| #include <errno.h> |
| #include <stdio.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) { |
| int free_success = RtlFreeHeap(get_process_heap(), 0, ptr); |
| //assert(free_success); |
| if(!free_success) { |
| printf("*** nativelibc: free failed: %p ***\n", ptr); |
| abort(); |
| } |
| } |