DWORD R0HeapAllocateCB(DWORD dwRef) { ULONG *pul = (ULONG *)dwRef; // _HeapAllocate(ULONG nbytes, ULONG flags); return (DWORD)_HeapAllocate(pul[0], pul[1]); }
LW_API PVOID API_RegionGet (LW_OBJECT_HANDLE ulId, size_t stByteSize) { REGISTER PLW_CLASS_HEAP pheap; REGISTER UINT16 usIndex; REGISTER PVOID pvAllocate; usIndex = _ObjectGetIndex(ulId); if (LW_CPU_GET_CUR_NESTING()) { /* 不能在中断中调用 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (LW_NULL); } #if LW_CFG_ARG_CHK_EN > 0 if (!stByteSize) { _DebugHandle(__ERRORMESSAGE_LEVEL, "ulByteSize invalidate\r\n"); _ErrorHandle(ERROR_REGION_SIZE); return (LW_NULL); } if (!_ObjectClassOK(ulId, _OBJECT_REGION)) { /* 对象类型检查 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n"); _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (LW_NULL); } __KERNEL_ENTER(); /* 进入内核 */ if (_Heap_Index_Invalid(usIndex)) { /* 缓冲区索引检查 */ __KERNEL_EXIT(); /* 退出内核 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n"); _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (LW_NULL); } #else __KERNEL_ENTER(); /* 进入内核 */ #endif pheap = &_K_heapBuffer[usIndex]; __KERNEL_EXIT(); /* 退出内核 */ pvAllocate = _HeapAllocate(pheap, stByteSize, __func__); if (!pvAllocate) { /* 是否分配成功 */ _ErrorHandle(ERROR_REGION_NULL); } return (pvAllocate); }
void * _cdecl DebugNewHelper(size_t n) { PGPUInt8 *p; PGPUInt32 dataSize, totalSize; dataSize = n; totalSize = dataSize + 3*sizeof(PGPUInt32); do { p = (PGPUInt8 *) _HeapAllocate(totalSize, 0); } while ((!p) && __newhandler(totalSize)); if (NULL!=(int)(p)) { PGPUInt8 *returnMe, *temp; pgpDebugWhackMemory(p, totalSize); // upside the head temp = (PGPUInt8 *) p; returnMe = temp + 2*sizeof(PGPUInt32); ((PGPUInt32 *) temp)[0] = dataSize; ((PGPUInt32 *) temp)[1] = kGuardDWord; temp += 2*sizeof(PGPUInt32) + dataSize; ((PGPUInt32 *) temp)[0] = kGuardDWord; #if PGPDISK_DEBUGMEMORYLEAKS totalBytesAllocated += n; DebugOut("PGPdisk New: Alloced %d bytes, have %d total allocated\n", n, totalBytesAllocated); #endif // PGPDISK_DEBUGMEMORYLEAKS return returnMe; } else { return NULL; } }