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

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

?? cluster.cxx

?? EFI(Extensible Firmware Interface)是下一代BIOS
?? CXX
字號:
/*++

Copyright (c) 1991-1999 Microsoft Corporation

Module Name:

    cluster.cxx

--*/

#include <pch.cxx>

#define _UFAT_MEMBER_
#include "ufat.hxx"


#include "cmem.hxx"

extern "C" {
#ifdef DBLSPACE_ENABLED
#include "mrcf.h"
#endif // DBLSPACE_ENABLED

#if !defined( _EFICHECK_ )
#include "ntrtl.h"
#endif
}

extern VOID DoInsufMemory(VOID);

DEFINE_EXPORTED_CONSTRUCTOR( CLUSTER_CHAIN, OBJECT, UFAT_EXPORT );

VOID
CLUSTER_CHAIN::Construct (
    )
/*++

Routine Description:

    Constructor for CLUSTER_CHAIN which initializes private data to
    default values.

Arguments:

    None.

Return Value:

    None.

--*/
{
    _secruns = NULL;
    _num_secruns = 0;
    _length_of_chain = 0;
    _is_compressed = FALSE;
    _buf = NULL;
    _drive = NULL;
    _fat_sa = NULL;
    _secrun = NULL;
}

UFAT_EXPORT
CLUSTER_CHAIN::~CLUSTER_CHAIN(
    )
/*++

Routine Description:

    Destructor for CLUSTER_CHAIN.  Frees memory and returns references.

Arguments:

    None.

Return Value:

    None.

--*/
{
    Destroy();
}


UFAT_EXPORT
BOOLEAN
CLUSTER_CHAIN::Initialize(
    IN OUT  PMEM                Mem,
    IN OUT  PLOG_IO_DP_DRIVE    Drive,
    IN      PFAT_SA             FatSuperArea,
    IN      PCFAT               Fat,
    IN      ULONG               ClusterNumber,
    IN      ULONG               LengthOfChain
    )
/*++

Routine Description:

    Prepares the CLUSTER_CHAIN object for reads and writes to disk.
    The length of the cluster chain may be specified by the
    LengthOfChain argument.  Setting this parameter to 0 will cause
    the length of the chain to be until the end of file.

Arguments:

    Mem             - Supplies memory for the cluster object.
    Drive           - Supplies the drive to which reads and writes will
                        take place.
    FatSuperArea    - Supplies the FAT super area which contains information
                        about the current FAT implementation.
    Fat             - Supplies the file allocation table for this drive.
    ClusterNumber   - Supplies the cluster number to map.
    LengthOfChain   - Supplies the number of clusters in the chain.
                        This value defaults to 0 which indicates that all
                        clusters until end of file will be addressed.

Return Value:

    FALSE   - Failure.
    TRUE    - Success.

--*/
{
    CONT_MEM    cmem;
    SECTORCOUNT sec_per_clus;
    ULONG       clus;
    LONG        size;
    PVOID       buf;
    ULONG       i, j;
    LBN         lbn;

    Destroy();

    if (!Mem ||
        !Drive ||
        !FatSuperArea ||
        !Fat ||
        !Fat->IsInRange(ClusterNumber)) {
        Destroy();
        return FALSE;
    }

    if (LengthOfChain) {
        _length_of_chain = LengthOfChain;
    } else {
        _length_of_chain = Fat->QueryLengthOfChain(ClusterNumber);
    }

    if (!_length_of_chain) {
        Destroy();
        return FALSE;
    }

    sec_per_clus = FatSuperArea->QuerySectorsPerCluster();
    size = sec_per_clus*Drive->QuerySectorSize()*_length_of_chain;

    _is_compressed = FatSuperArea->IsCompressed();
    _fat_sa = FatSuperArea;

#ifdef DBLSPACE_ENABLED
    if (_is_compressed) {

        _fat = Fat;
        _drive = Drive;
        _starting_cluster = ClusterNumber;
        if (!(_secrun = NEW SECRUN)) {
            Destroy();
        DoInsufMemory();
            return FALSE;
        }
        // This buf will hold the cluster chain's uncompressed data.
        if (!(_buf = (PUCHAR)Mem->Acquire(size, Drive->QueryAlignmentMask()))) {
            Destroy();
        DoInsufMemory();
            return FALSE;
        }
        if (!_hmem.Initialize()) {
            Destroy();
        DoInsufMemory();
            return FALSE;
        }
        return TRUE;

    }
#endif // DBLSPACE_ENABLED

    if (!(_secruns = (PSECRUN*) MALLOC(_length_of_chain*sizeof(PSECRUN)))) {
        Destroy();
    DoInsufMemory();
        return FALSE;
    }

    if (!(buf = Mem->Acquire(size, Drive->QueryAlignmentMask())) ||
        !cmem.Initialize(buf, size)) {

        Destroy();
    DoInsufMemory();
        return FALSE;
    }


    clus = ClusterNumber;
    i = 0;
    for (;;) {
        lbn = _fat_sa->QuerySectorFromCluster(clus);

        for (j = 1; !Fat->IsEndOfChain(clus) &&
                    (clus + 1) == Fat->QueryEntry(clus) &&
                    i + j < _length_of_chain; j++) {
            clus++;
        }
        i += j;

        if (!(_secruns[_num_secruns] = NEW SECRUN)) {
            Destroy();
        DoInsufMemory();
            return FALSE;
        }

        if (!_secruns[_num_secruns]->Initialize(&cmem, Drive, lbn,
                                                j*sec_per_clus)) {
            Destroy();
        DoInsufMemory();
            return FALSE;
        }

        _num_secruns++;

        if (i == _length_of_chain) {
            break;
        }

        clus = Fat->QueryEntry(clus);
        if (!Fat->IsInRange(clus)) {
            Destroy();
            return FALSE;
        }
    }

    return TRUE;
}


UFAT_EXPORT
BOOLEAN
CLUSTER_CHAIN::Read(
    )
/*++

Routine Description:

    This routine reads the cluster chain into memory.  This is done
    by making repetitive use of SECRUN's Read routine.

Arguments:

    None.

Return Value:

    FALSE   - Failure.
    TRUE    - Success.

--*/
{
    ULONG       i;
    BOOLEAN     b = TRUE;
#ifdef DBLSPACE_ENABLED
    MRCF_DECOMPRESS
                wkspc;
#endif // DBLSPACE_ENABLED

    if (!_is_compressed) {

        if (!_secruns) {
            return FALSE;
        }

        for (i = 0; i < _num_secruns; i++) {

            b = (BOOLEAN)(_secruns[i]->Read() && b);
        }

        return b;
    }

#ifdef DBLSPACE_ENABLED
    //
    // The volume is compressed.
    //

    sector_size = _drive->QuerySectorSize();
    cluster_size = sector_size * _fat_sa->QuerySectorsPerCluster();

    clus = _starting_cluster;

    i = 0;
    for (;;) {

        lbn = _fat_sa->QuerySectorFromCluster(clus, &nsec);

        if (!_secrun->Initialize(&_hmem, _drive, lbn, nsec)) {
        DoInsufMemory();
            return FALSE;
        }

        if (!_secrun->Read()) {
            return FALSE;
        }

        if (_fat_sa->IsClusterCompressed(clus)) {

            RtlZeroMemory(&_buf[i * sector_size], cluster_size);

            u = MrcfDecompress(&_buf[i * sector_size],
                _fat_sa->QuerySectorsRequiredForPlainData(clus) * sector_size,
                (PUCHAR)_secrun->GetBuf(),
                nsec * sector_size, &wkspc);

            if (0 == u) {
                // error: can't decompress data
                return TRUE;
            }

        } else {

            // This cluster isn't compressed; just copy.

            memcpy(&_buf[i * cluster_size], _secrun->GetBuf(), cluster_size);
        }

        if (++i == _length_of_chain) {
            return TRUE;
        }

        clus = _fat->QueryEntry(clus);
        if (!_fat->IsInRange(clus)) {
            return FALSE;
        }
    }

    //NOTREACHED
#endif // DBLSPACE_ENABLED
    return FALSE;
}


UFAT_EXPORT
BOOLEAN
CLUSTER_CHAIN::Write(
    )
/*++

Routine Description:

    This routine writes the cluster chain to disk.  This is done
    by making repetitive use of SECRUN's Write routine.

Arguments:

    None.

Return Value:

    FALSE   - Failure.
    TRUE    - Success.

--*/
{
    ULONG       i;
    BOOLEAN     b = TRUE;
#ifdef DBLSPACE_ENABLED
    MRCF_STANDARD_COMPRESS
                wkspc;
#endif // DBLSPACE_ENABLED
    HMEM        work_buf;

    if (!_is_compressed) {

       if (!_secruns) {
          return FALSE;
       }
       for (i = 0; i < _num_secruns; i++) {
          b = (BOOLEAN)(_secruns[i]->Write() && b);
       }
       return b;
    }

#ifdef DBLSPACE_ENABLED
    //
    // The volume is compressed.
    //

    sector_size = _drive->QuerySectorSize();
    cluster_size = _fat_sa->QuerySectorsPerCluster() * sector_size;

    if (!work_buf.Initialize() ||
        !work_buf.Acquire(cluster_size, _drive->QueryAlignmentMask())) {
    DoInsufMemory();
        return FALSE;
    }

    clus = _starting_cluster;
    i = 0;
    for (;;) {
        lbn = _fat_sa->QuerySectorFromCluster(clus, &nsec);

        u = MrcfStandardCompress((PUCHAR)work_buf.GetBuf(), cluster_size,
            &_buf[i * cluster_size], cluster_size, &wkspc);
        if (0 == u) {
            // the data could not be compressed

            if (nsec < _fat_sa->QuerySectorsPerCluster()) {

                //
                // previously the data had been compressed; need to allocate
                // more disk space.
                //

                nsec = _fat_sa->QuerySectorsPerCluster();
                _fat_sa->FreeClusterData(clus);
                if (!_fat_sa->AllocateClusterData(clus, nsec, FALSE,
                    _fat_sa->QuerySectorsPerCluster())) {
                    // error: no space
                    return FALSE;
                }
                lbn = _fat_sa->QuerySectorFromCluster(clus);
            }
            DbgAssert(nsec == _fat_sa->QuerySectorsPerCluster());

            _fat_sa->SetClusterCompressed(clus, FALSE);

        } else {

           new_nsec = (u + sector_size - 1)/sector_size;

           if (new_nsec != nsec) {

              //
              // The data has been changed, and it won't compress into
              // the same size as it used to.
              //
              _fat_sa->FreeClusterData(clus);
              if (!_fat_sa->AllocateClusterData(clus, new_nsec, TRUE,
                                                _fat_sa->QuerySectorsPerCluster())) {

                 // error: not enough free space
                 return FALSE;
              }
              lbn = _fat_sa->QuerySectorFromCluster(clus, &nsec);

           } else {

                //
                // The cluster may not have been compressed before,
                // but we still need the same amount of space even though
                // it's now compressed.
                //
                _fat_sa->SetClusterCompressed(clus, TRUE);
            }
        }

    if (!_hmem.Initialize()) {
        DoInsufMemory();
            return FALSE;
    }
        if (!_secrun->Initialize(&_hmem, _drive, lbn, nsec)) {
        DoInsufMemory();
            return FALSE;
        }

        memcpy(_secrun->GetBuf(), work_buf.GetBuf(),
            nsec * sector_size);

        b = (BOOLEAN)(_secrun->Write() && b);

        if (++i == _length_of_chain) {
            return b;
        }

        clus = _fat->QueryEntry(clus);
        if (!_fat->IsInRange(clus)) {
            return FALSE;
        }
    }

    //NOTREACHED
#endif // DBLSPACE_ENABLED
    return FALSE;
}


VOID
CLUSTER_CHAIN::Destroy(
    )
/*++

Routine Description:

    This routine cleans up the objects internal components.  It does not
    need to be called before Init as Init does this automatically.

Arguments:

    None.

Return Value:

    None.

--*/
{
    ULONG i;

#ifdef DBLSPACE_ENABLED
    if (_is_compressed) {
        DELETE(_secrun);
        _num_secruns = 0;
        _length_of_chain = 0;
        _buf = NULL;
        _drive = NULL;
        return;
    }
#endif // DBLSPACE_ENABLED

    for (i = 0; i < _num_secruns; i++) {
        DELETE(_secruns[i]);
    }

    DELETE(_secruns);
    _num_secruns = 0;
    _length_of_chain = 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丰满一区二区免费视频| 欧美一区二区精品| 日本欧美一区二区在线观看| 国产欧美日韩精品a在线观看| 欧美三级电影在线看| 国产激情视频一区二区在线观看| 亚洲成av人片在线| 1000部国产精品成人观看| 精品久久久久久无| 欧美精三区欧美精三区| 9色porny自拍视频一区二区| 韩国v欧美v亚洲v日本v| 丝袜脚交一区二区| 一区二区三区四区av| 国产欧美日韩视频一区二区 | 91福利在线播放| 豆国产96在线|亚洲| 久久99久久99| 蜜臀精品一区二区三区在线观看| 一区二区三区在线影院| 最新国产の精品合集bt伙计| 国产香蕉久久精品综合网| 欧美大黄免费观看| 欧美一区二区三区视频在线| 欧美人牲a欧美精品| 欧美日韩五月天| 91网站黄www| 欧美极品美女视频| 日韩电影免费一区| 一级中文字幕一区二区| 亚洲女人的天堂| 国产精品区一区二区三| 日本一二三不卡| 国产精品天干天干在线综合| 欧美国产禁国产网站cc| 久久九九国产精品| 国产精品区一区二区三区| 中文在线免费一区三区高中清不卡| 久久亚洲精品小早川怜子| 日韩你懂的电影在线观看| 欧美一级免费观看| 日韩欧美一级二级三级久久久| 91精品欧美久久久久久动漫| 日韩一级二级三级| 精品欧美一区二区在线观看| 精品成人一区二区三区| 久久嫩草精品久久久精品| 国产视频一区二区在线| 中文字幕欧美日韩一区| 亚洲图片激情小说| 亚洲成人激情av| 久久电影网电视剧免费观看| 一区二区三区四区在线| 色哟哟一区二区在线观看| 国产一区二区三区在线观看精品| 天天综合色天天综合色h| 亚洲精品日韩一| 国产精品久久久久久久久快鸭 | 另类小说综合欧美亚洲| 亚洲bt欧美bt精品| 五月天久久比比资源色| 日韩电影网1区2区| 国内一区二区视频| 成人黄色片在线观看| 色成人在线视频| 欧美久久久一区| 久久精品一区二区三区不卡| 亚洲欧美在线视频| 午夜激情久久久| 精品亚洲成av人在线观看| 成人国产精品免费观看视频| 在线一区二区三区做爰视频网站| 欧美日韩精品一区二区三区蜜桃| 精品美女在线播放| 亚洲私人影院在线观看| 午夜精彩视频在线观看不卡| 国产一区二区三区视频在线播放| 色综合中文字幕国产 | 大桥未久av一区二区三区中文| 91麻豆产精品久久久久久| 欧美日韩中文字幕精品| 2024国产精品| 亚洲午夜精品在线| 国产一区二区三区精品视频| 色婷婷国产精品| 久久午夜色播影院免费高清| 亚洲综合视频在线观看| 国产综合色精品一区二区三区| 欧美中文字幕不卡| 欧美国产欧美综合| 五月天欧美精品| 91原创在线视频| 精品欧美一区二区久久| 亚洲成人av一区二区| 成人黄色一级视频| 精品乱码亚洲一区二区不卡| 一级日本不卡的影视| 国产毛片精品视频| 欧美精品xxxxbbbb| 亚洲免费电影在线| 国产.欧美.日韩| 日韩精品中文字幕一区| 亚洲一区二区综合| av影院午夜一区| 久久久天堂av| 久久97超碰色| 欧美老人xxxx18| 亚洲美女视频在线| 国产69精品久久99不卡| 日韩欧美一区二区视频| 亚洲6080在线| 欧美午夜在线一二页| 中文字幕中文字幕在线一区 | 99精品久久久久久| 欧美国产日本视频| 国产麻豆精品一区二区| 精品精品国产高清a毛片牛牛| 亚洲国产wwwccc36天堂| 91麻豆国产香蕉久久精品| 国产精品伦理在线| 成人在线视频首页| 国产婷婷色一区二区三区四区| 久久99精品国产麻豆婷婷| 日韩一级二级三级精品视频| 日韩1区2区3区| 3atv一区二区三区| 三级精品在线观看| 欧美精三区欧美精三区| 日韩主播视频在线| 欧美精品一二三区| 日本欧美一区二区三区| 欧美二区三区的天堂| 奇米777欧美一区二区| 欧美一区二区三区在线视频| 日韩成人精品在线观看| 欧美一区二区精品在线| 精品一区二区免费视频| 欧美电影精品一区二区| 国产乱色国产精品免费视频| 久久久久久9999| 成人av在线资源网| 一区二区三区四区精品在线视频 | 国产亚洲一区字幕| 精品一区二区免费| 日本一区二区不卡视频| 91在线一区二区三区| 一区二区三区.www| 欧美精品日韩综合在线| 久久精品噜噜噜成人88aⅴ| 2023国产精品自拍| 成人免费看视频| 亚洲欧洲美洲综合色网| 欧美性色黄大片| 日本欧美一区二区| 欧美激情一二三区| 日本韩国欧美一区二区三区| 亚洲福利视频导航| 欧美精品一区二区在线播放| 成人黄色电影在线| 亚洲一区二区精品3399| 欧美一级日韩不卡播放免费| 国产成人欧美日韩在线电影| 中文字幕色av一区二区三区| 欧美优质美女网站| 免费av网站大全久久| 欧美激情综合网| 欧美视频一区二区三区在线观看| 日本视频一区二区| 国产精品水嫩水嫩| 欧美性猛交xxxx乱大交退制版| 麻豆视频一区二区| 亚洲欧美一区二区三区极速播放 | 日韩视频在线你懂得| 国产成人鲁色资源国产91色综| 一区二区三区精品视频在线| 欧美r级电影在线观看| 日本高清无吗v一区| 狠狠色狠狠色综合日日91app| 国产精品第一页第二页第三页| 欧美丰满美乳xxx高潮www| 粉嫩av一区二区三区| 日本成人在线不卡视频| 中文字幕一区二区三| 日韩一区二区在线免费观看| 91首页免费视频| 国产综合色在线视频区| 香蕉加勒比综合久久| 亚洲欧洲av另类| 精品99999| 欧美日韩大陆一区二区| aa级大片欧美| 国产精品夜夜嗨| 日本亚洲视频在线| 亚洲黄网站在线观看| 中文字幕的久久| 精品久久久久久无| 91精品在线免费| 91官网在线免费观看| bt欧美亚洲午夜电影天堂| 久久99久久99|