亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mem.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998  Microsoft Corporation

Module Name:  
    mem.cpp

Abstract:  
    Memory management routines for OHCD driver.
    
Notes: 

--*/

// There are four warnings that I like from Warning level 4.  Since we build
// at warning level 3, I'm setting these four down to level 3 so I still get
// them.
// C4100 unrefrenced formal parameter
// C4101 unrefrenced local variable
// C4705 statement has no effect
// C4706 assignment in conditional
#pragma warning (3 : 4100 4101 4705 4706)

#include <windows.h>
#include <nkintr.h>
#include <ohcdddsi.h>
#include <ceddk.h>

#include "usbtypes.h"
#include "globals.hpp"
#include "mem.hpp"

typedef unsigned long FAR * LPULONG;
typedef LPVOID * LPLPVOID;


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
CPhysMem::CPhysMem(
    DWORD   cbSize, 
    DWORD   cbHighPrioritySize, 
    PUCHAR  pVirtAddr, 
    PUCHAR  pPhysAddr
    )
{
    PMEMLIST pNode;

    //
    // The PDD can pass in a physical buffer, or we'll try to allocate one from 
    // system RAM.
    //
    if (pVirtAddr && pPhysAddr) 
	{
        DEBUGMSG(ZONE_INIT,(TEXT("DMA buffer passed in from PDD\r\n")));
        m_pPhysicalBufferAddr = pVirtAddr;
        m_dwNormalVA = (DWORD) pVirtAddr;
        m_dwNormalPA = (DWORD) pPhysAddr;
    }
    else 
	{
        DEBUGMSG(ZONE_INIT,(TEXT("Allocating DMA buffer from system RAM\r\n")));
        m_pPhysicalBufferAddr = (PUCHAR)AllocatePhysicalMemory(cbSize,
                                                               &m_dwNormalPA);
        m_dwNormalVA = (DWORD) m_pPhysicalBufferAddr;
    }
    
    m_dwTotalPhysMemSize = cbSize;
    m_PaVaConversion = m_dwNormalPA - m_dwNormalVA;
    
    DEBUGMSG(ZONE_INIT || ZONE_ALLOC,
        (TEXT("OHCD :   Total Alloc Region PhysAddr = 0x%08X, VirtAddr = 0x%08X, size = %d\r\n"),
        m_dwNormalPA, m_dwNormalVA, m_dwTotalPhysMemSize));

    //
    // Set aside a page for the special request.
    //
    m_dwSpecialVA = (DWORD) m_dwNormalVA;
    m_dwSpecialPA = (DWORD) m_dwNormalPA;
    m_dwNormalVA += USBPAGESIZE;
    m_dwNormalPA += USBPAGESIZE;
    cbSize -= USBPAGESIZE;
    m_bSpecialTaken = FALSE;
    memset((PVOID) m_dwSpecialVA, 0x00, USBPAGESIZE);

    DEBUGMSG(ZONE_INIT || ZONE_ALLOC,
        (TEXT("OHCD : Special Alloc Region PhysAddr = 0x%08X, VirtAddr = 0x%08X, size = %d\r\n"),
        m_dwSpecialPA, m_dwSpecialVA, USBPAGESIZE));

    //
    // Set aside the High Priority region.
    //
    m_dwHighPriorityVA = (DWORD) m_dwNormalVA;
    m_dwHighPriorityPA = (DWORD) m_dwNormalPA;
    m_dwNormalVA += cbHighPrioritySize;
    m_dwNormalPA += cbHighPrioritySize;
    cbSize -= cbHighPrioritySize;
    m_dwHighPrioritySize = cbHighPrioritySize;
    memset((PVOID) m_dwHighPriorityVA, 0x00, m_dwHighPrioritySize);

    DEBUGMSG(ZONE_INIT || ZONE_ALLOC,
        (TEXT("OHCD : HighPri Alloc Region PhysAddr = 0x%08X, VirtAddr = 0x%08X, size = %d\r\n"),
        m_dwHighPriorityPA, m_dwHighPriorityVA, m_dwHighPrioritySize));

    //
    // And the rest is for normal allocations.
    //
    m_dwNormalSize = cbSize;
    memset((PVOID) m_dwNormalVA, 0x00, m_dwNormalSize);
    
    DEBUGMSG(ZONE_INIT || ZONE_ALLOC,
        (TEXT("OHCD :  Normal Alloc Region PhysAddr = 0x%08X, VirtAddr = 0x%08X, size = %d\r\n"),
        m_dwNormalPA, m_dwNormalVA, m_dwNormalSize));

    m_hFreeMemEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    m_fHaveWaited = FALSE;

    InitializeCriticalSection(&m_csLock);
    EnterCriticalSection(&m_csLock);
    //
    // Create dummy entries for the list head (simpler linked list code)
    //
    m_pNodeFreeListHead = CreateNewNode(0, 0, 0);
    InitializeListHead(m_pNodeFreeListHead);

    DEBUGMSG(ZONE_ALLOC, (TEXT("OHCD : Init : NodeFreeListHead = 0x%08X\r\n"),
                          m_pNodeFreeListHead));
    
    m_pFreeListHead = CreateNewNode(0, 0, 0);
    InitializeListHead(m_pFreeListHead);

    m_pInUseListHead = CreateNewNode(0, 0, 0);
    InitializeListHead(m_pInUseListHead);
    
    DEBUGMSG(ZONE_ALLOC, (TEXT("OHCD : Init : FreeListHead = 0x%08X, InUseListHead = 0x%08X\r\n"),
                          m_pFreeListHead, m_pInUseListHead));

    m_pHighPriorityFreeListHead = CreateNewNode(0, 0, 0);
    InitializeListHead(m_pHighPriorityFreeListHead);

    m_pHighPriorityInUseListHead = CreateNewNode(0, 0, 0);
    InitializeListHead(m_pHighPriorityInUseListHead);

    DEBUGMSG(ZONE_ALLOC, (TEXT("OHCD : Init : HighPriFreeListHead = 0x%08X, HighPriInUseListHead = 0x%08X\r\n"),
                          m_pHighPriorityFreeListHead, m_pHighPriorityInUseListHead));
    
    //
    // One big chunk on the free list to start things off.
    //
    pNode = CreateNewNode(m_dwNormalSize, m_dwNormalVA, m_dwNormalPA);
    
    DEBUGMSG(ZONE_ALLOC, (TEXT("OHCD : Init : Main Free Heap Node = 0x%08X\r\n"),
                          pNode));
    
    InsertNodeBefore(pNode, FirstNode(m_pFreeListHead));

    VALIDATE_HEAPS(FALSE);
    
    //
    // Same thing for High Priority Region
    //
    pNode = CreateNewNode(m_dwHighPrioritySize, m_dwHighPriorityVA, m_dwHighPriorityPA);
    
    DEBUGMSG(ZONE_ALLOC, (TEXT("OHCD : Init : HighPri Free Heap Node = 0x%08X\r\n"),
                          pNode));
    
    InsertNodeBefore(pNode, FirstNode(m_pHighPriorityFreeListHead));
    
    VALIDATE_HEAPS(TRUE);

    LeaveCriticalSection(&m_csLock);
}


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#ifdef DEBUG
BOOL
CPhysMem::ValidateHeaps(BOOL fHighPri)
{
    PMEMLIST pNode = FirstNode(FREELIST(fHighPri));
    DWORD dwSizeTotal = 0;
    DWORD dwSizePrev = 0;
    DWORD dwSizeFree = 0;
    DWORD dwNodesFree = 0;

    while (!EndOfList(FREELIST(fHighPri), pNode)) {
        
        DEBUGMSG(ZONE_VERBOSE && ZONE_ALLOC, (TEXT("FL : pNode = 0x%08X, size = %4d, VA = 0x%08X\r\n"),
                              pNode, pNode->dwSize, pNode->dwVirtAddr));

        dwSizeTotal += pNode->dwSize;
        dwSizeFree  += pNode->dwSize;
        
        if (dwSizePrev > pNode->dwSize) {
            DEBUGMSG(1, (TEXT("OHCD : ValidateHeaps : Free List not sorted (%d > %d)\r\n"), 
                         dwSizePrev, pNode->dwSize));
            DEBUGCHK(0);
            return(FALSE);
        }

        if ((pNode->next->prev != pNode) || (pNode->prev->next != pNode)) {
            DEBUGMSG(1, (TEXT("OHCD : ValidateHeaps : Invalid linked list (free)\r\n")));
            DEBUGCHK(0);
            return(FALSE);
        }

        dwSizePrev = pNode->dwSize;
        pNode = pNode->next;
    }
    
    pNode = FirstNode(INUSELIST(fHighPri));

    while (!EndOfList(INUSELIST(fHighPri), pNode)) {
        
        DEBUGMSG(ZONE_VERBOSE && ZONE_ALLOC, (TEXT("IL : pNode = 0x%08X, size = %4d, VA = 0x%08X\r\n"),
                              pNode, pNode->dwSize, pNode->dwVirtAddr));

        dwSizeTotal += pNode->dwSize;
        
        if ((pNode->next->prev != pNode) || (pNode->prev->next != pNode)) {
            DEBUGMSG(1, (TEXT("OHCD : ValidateHeaps : Invalid linked list (inuse)\r\n")));
            DEBUGCHK(0);
            return(FALSE);
        }

        pNode = pNode->next;
    }
    
    DEBUGMSG(ZONE_VERBOSE, (TEXT("OHCD : ValidateHeaps : FreeSize = %d bytes; TotalSize = %d bytes\r\n"),
                          dwSizeFree, dwSizeTotal));

    if (dwSizeTotal != (fHighPri ? m_dwHighPrioritySize : m_dwNormalSize)) {
        DEBUGMSG(1, (TEXT("OHCD : ValidateHeaps : We've lost some memory somewhere\r\n")));
        DEBUGCHK(0);
        return(FALSE);
    }
    
    //
    // Validate the NODES free list.
    //
    pNode = FirstNode(m_pNodeFreeListHead);
    while (!EndOfList(m_pNodeFreeListHead, pNode)) {
        
        DEBUGMSG(ZONE_VERBOSE && ZONE_ALLOC, (TEXT("FL : pNode = 0x%08X, size = %4d, VA = 0x%08X\r\n"),
                              pNode, pNode->dwSize, pNode->dwVirtAddr));
        dwNodesFree++;
        
        if ((pNode->next->prev != pNode) || (pNode->prev->next != pNode)) {
            DEBUGMSG(1, (TEXT("OHCD : ValidateHeaps : Invalid linked list (nodefree)\r\n")));
            DEBUGCHK(0);
            return(FALSE);
        }
        pNode = pNode->next;
    }
    DEBUGMSG(ZONE_VERBOSE, (TEXT("OHCD : ValidateHeaps : Nodes Free = %d\r\n"),dwNodesFree));
    
    return (TRUE);
}
#endif


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
PMEMLIST 
CPhysMem::CreateNewNode(
    DWORD   dwSize,
    DWORD   dwVirtAddr,
    DWORD   dwPhysAddr
    )
{
    PMEMLIST pNode;
    //
    // If we already have a node allocated and sitting around, use it.
    //
    if ((dwSize == 0) || IsListEmpty(m_pNodeFreeListHead)) {
        pNode = (PMEMLIST) OHCD_Alloc(LPTR, sizeof(MEMLIST));
    } else {
        pNode = FirstNode(m_pNodeFreeListHead);
        RemoveNode(pNode);
    }

    if (pNode != NULL) {
        pNode->dwVirtAddr = dwVirtAddr;
        pNode->dwPhysAddr = dwPhysAddr;
        pNode->dwSize = dwSize;
        pNode->next = NULL;
        pNode->prev = NULL;
    }
    
    return (pNode);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
EError
CPhysMem::DeleteNode(
    PMEMLIST pNode
    )
{
    //
    // We don't actually delete any of the nodes. We just keep them on our
    // free list to use later. Keeps us from thrashing on the heap.
    //
    InsertNodeBefore(pNode, FirstNode(m_pNodeFreeListHead));
    return(successful);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
PMEMLIST 
CPhysMem::FindFreeBlock(
    DWORD   dwSize,
    BOOL    fHighPri
    )
{
    //
    // The free list is sorted by increasing block sizes, so just find the 
    // first block that's at least DWSIZE big.
    //
    PMEMLIST pNode = FirstNode(FREELIST(fHighPri));
    
    while (!EndOfList(FREELIST(fHighPri), pNode)) {
        if (dwSize <= pNode->dwSize) {
            RemoveNode(pNode);
            return (pNode);
        }
        pNode = pNode->next;
    }
    
    return (NULL);
}



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
EError
CPhysMem::AddNodeToFreeList(
    PMEMLIST pNode,
    BOOL     fHighPri
    )
{
    //
    // The free list is sorted by increasing block sizes, not by increasing
    // address so we must scan the list for any possible connecting free blocks,
    // and then coalesce them into a single free block. There will be at most
    // two blocks to find (one on either end) so scan for both of them.
    //
    PMEMLIST pNodeTraverse = FirstNode(FREELIST(fHighPri));
    
    PMEMLIST pNodePrevious = NULL; // Points to the previous connecting free block
    PMEMLIST pNodeNext = NULL;     // Points to the next connecting free block
    //
    // The endpoints that we are trying to match up to.
    //
    DWORD dwThisPA = pNode->dwPhysAddr;
    DWORD dwNextPA = MEMLIST_NEXT_PA(pNode);

    //
    // Walk the list looking for blocks that are next to this one.
    //
    while (!EndOfList(FREELIST(fHighPri), pNodeTraverse)) {

        if (dwThisPA == MEMLIST_NEXT_PA(pNodeTraverse)) {
            //
            // We've found the block just ahead of this one. Remember it.
            //
            pNodePrevious = pNodeTraverse;

        } else if (dwNextPA == pNodeTraverse->dwPhysAddr) {
            //
            // We've found the block just after of this one.
            //
            pNodeNext = pNodeTraverse;
        }

        if ((pNodePrevious == NULL) || (pNodeNext == NULL)) {
            //
            // We haven't connected both ends, so keep on looking...
            //
            pNodeTraverse = pNodeTraverse->next;
        } else {
            //
            // We've found blocks to connect on both ends, let's get on with it.
            //
            break;
        }
    }
    

    if (pNodePrevious != NULL) {
        //
        // Combine with the previous block.
        //
        RemoveNode(pNodePrevious);
        //
        // Grow pNode to hold both.
        //
        pNode->dwSize = pNode->dwSize + pNodePrevious->dwSize;
        pNode->dwVirtAddr = pNodePrevious->dwVirtAddr;
        pNode->dwPhysAddr = pNodePrevious->dwPhysAddr;
        DeleteNode(pNodePrevious);
    }

    if (pNodeNext != NULL) {
        //
        // Combine with the next block.
        //
        RemoveNode(pNodeNext);
        //
        // Grow pNode to hold both.
        //
        pNode->dwSize = pNode->dwSize + pNodeNext->dwSize;
        DeleteNode(pNodeNext);
    }

    //
    // Add pNode to the free list in sorted size order.
    //
    pNodeTraverse = FirstNode(FREELIST(fHighPri));
    
    while (!EndOfList(FREELIST(fHighPri), pNodeTraverse)) {

        if (pNode->dwSize <= pNodeTraverse->dwSize) {
            break;
        }
        pNodeTraverse = pNodeTraverse->next;
    }

    //
    // Insert this node before the traverse node.
    //
    InsertNodeBefore(pNode, pNodeTraverse);

    return (successful);
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品1024| 欧美日韩国产小视频在线观看| 国产91精品一区二区麻豆网站| 99久久精品免费精品国产| 国产91露脸合集magnet| 欧美亚洲动漫另类| 亚洲精品在线一区二区| 一区二区三区中文字幕精品精品 | 国产一区二区网址| 色婷婷综合久久久| 欧美成人猛片aaaaaaa| 亚洲男人的天堂在线aⅴ视频 | 亚洲天堂成人网| 麻豆一区二区三区| 欧洲国内综合视频| 日本一区二区三区四区在线视频| 亚洲一区二区三区四区五区黄 | 成人一区在线观看| 欧美一区二区国产| 国产精品久久99| 精品中文字幕一区二区小辣椒 | 中文字幕一区二区不卡 | 色综合一区二区三区| 26uuu色噜噜精品一区二区| 亚洲午夜私人影院| 91丨九色丨尤物| 国产亚洲va综合人人澡精品| 首页综合国产亚洲丝袜| 色视频成人在线观看免| 欧美国产精品一区二区| 久久疯狂做爰流白浆xx| 在线综合视频播放| 亚洲国产精品天堂| 色乱码一区二区三区88| 国产精品成人网| 国产精品综合久久| 欧美一区二区三区色| 亚洲成a人v欧美综合天堂下载| 99精品偷自拍| 中文字幕在线观看一区| 国产福利不卡视频| 26uuu欧美日本| 狠狠色丁香婷婷综合| 精品国产123| 麻豆91精品视频| 欧美videos中文字幕| 男人的天堂亚洲一区| 99国产精品久久久久久久久久| 日本一区二区视频在线观看| 国产精品66部| 亚洲国产精品ⅴa在线观看| 日本午夜一区二区| 欧美电影免费观看高清完整版在线 | 精品视频在线免费观看| 亚洲图片欧美综合| 国产黄色成人av| 国产精品伦理一区二区| 成人aaaa免费全部观看| 亚洲欧美一区二区三区极速播放| 91视频免费播放| 亚洲欧美日韩精品久久久久| 色天天综合色天天久久| 午夜精品福利一区二区三区蜜桃| 欧美麻豆精品久久久久久| 蜜桃视频一区二区| 国产亚洲欧美一级| av成人动漫在线观看| 亚洲综合视频在线| 欧美成人欧美edvon| 日韩二区三区在线观看| 精品91自产拍在线观看一区| 成人精品一区二区三区中文字幕| 亚洲激情五月婷婷| 69久久夜色精品国产69蝌蚪网| 亚洲狼人国产精品| 色诱亚洲精品久久久久久| 天堂一区二区在线免费观看| 精品乱人伦小说| av激情综合网| 成人免费在线播放视频| 欧美视频一区在线观看| 激情文学综合丁香| 亚洲精品久久7777| 精品国产a毛片| 欧美在线高清视频| 国产一区二区0| 一区2区3区在线看| 精品美女一区二区| 在线观看一区二区视频| 国产在线不卡视频| 亚洲综合成人在线| 久久久噜噜噜久久人人看| 99国产精品久久久| 狠狠色丁香婷婷综合久久片| 亚洲精品成人在线| 久久久精品影视| 欧美亚洲一区三区| 国产不卡在线一区| 蜜臀av一区二区三区| 亚洲色图都市小说| 国产欧美日韩另类一区| 欧美日韩国产精品自在自线| 亚洲精品一区二区精华| 久久97超碰国产精品超碰| 性感美女久久精品| 亚洲一区二区视频在线| 亚洲色图.com| 国产精品成人免费精品自在线观看 | 精品sm在线观看| 日韩欧美电影一二三| 69av一区二区三区| 欧美精品少妇一区二区三区| 欧美午夜精品一区| 欧美性猛片xxxx免费看久爱| 色婷婷一区二区三区四区| 色乱码一区二区三区88| 色婷婷亚洲婷婷| 欧美在线观看你懂的| 欧美日韩久久久久久| 欧美巨大另类极品videosbest | 中文字幕精品在线不卡| 中文字幕巨乱亚洲| 中文字幕亚洲区| 亚洲三级电影网站| 亚洲国产另类精品专区| 午夜精品久久久久久久99樱桃| 亚洲福中文字幕伊人影院| 午夜精品福利一区二区蜜股av| 亚洲成人免费视频| 六月丁香综合在线视频| 国产不卡免费视频| 99v久久综合狠狠综合久久| 91福利在线观看| 欧美肥妇bbw| 久久久精品国产免费观看同学| 国产精品久久久久久妇女6080 | 亚洲欧美一区二区在线观看| 亚洲人成精品久久久久久| 亚洲风情在线资源站| 美女视频免费一区| 成人在线视频一区二区| 欧美在线高清视频| 精品欧美久久久| 国产精品久久久久久久久久久免费看 | 欧美四级电影在线观看| 日韩一区二区三区高清免费看看| 久久久久久久久久电影| 亚洲欧美日韩国产综合在线 | 日韩欧美激情在线| 中文字幕一区二区在线播放| 亚洲一区二区精品久久av| 精品一区二区三区视频| 91麻豆成人久久精品二区三区| 91精品国产色综合久久ai换脸 | av一区二区三区四区| 4hu四虎永久在线影院成人| 久久人人97超碰com| 一区二区三区四区在线免费观看| 蜜桃91丨九色丨蝌蚪91桃色| 91美女片黄在线观看91美女| 欧美一区二区三区婷婷月色| 中文字幕视频一区| 久久丁香综合五月国产三级网站| 99久久婷婷国产综合精品 | 欧美区一区二区三区| 欧美高清在线一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 成人av高清在线| 久久久久久久综合| 日韩av在线播放中文字幕| 99九九99九九九视频精品| 欧美videossexotv100| 亚洲二区在线观看| 99久久婷婷国产综合精品电影 | 欧美一区二区三区四区在线观看| 国产精品久久久久aaaa樱花| 国产一区二区久久| 在线播放/欧美激情| 一区二区三区毛片| 97精品国产露脸对白| 久久青草国产手机看片福利盒子 | 亚洲一区在线视频| 99国产精品国产精品毛片| 久久久久久久国产精品影院| 免费观看久久久4p| 欧美色电影在线| 一区二区日韩av| 一本一道综合狠狠老| 中文字幕一区二区三区色视频| 国产精品综合在线视频| 久久一区二区三区四区| 美日韩一区二区| 欧美成人精品1314www| 日韩电影在线看| 91精品久久久久久久99蜜桃| 亚洲成a人v欧美综合天堂下载| 欧美三级中文字幕| 图片区小说区区亚洲影院| 欧美挠脚心视频网站| 日韩成人免费电影|