示例#1
0
DWORD R0HeapAllocateCB(DWORD dwRef)
    {
    ULONG *pul = (ULONG *)dwRef;

    // _HeapAllocate(ULONG nbytes, ULONG flags);
    return (DWORD)_HeapAllocate(pul[0], pul[1]);
    }
示例#2
0
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;
    }
}