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

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

?? stream.c

?? 從大量的wince源代碼中剝離出的fat文件系統源代碼.移植性非常高. 里面帶有source i.rar
?? C
?? 第 1 頁 / 共 4 頁
字號:
        len = cb;

    while (len) {

        // If we can lock a range of blocks outside the buffer pool,
        // in order to read their contents directly from disk to memory
        // instead of through the pool, do so.

        DWORD blk, cblk;

        if (dwError = SeekStream(pstm, pos))
            break;

        DEBUGMSG(ZONE_LOGIO && (pstm->s_flags & STF_DEMANDPAGED),(DBGTEXT("FATFS!ReadStreamData(DP): begin lockblocks for '%.11hs'\n"), pstm->s_achOEM));
        if (LockBlocks(pstm, pos, len, &blk, &cblk, FALSE)) {

            __try {
                DEBUGMSG(ZONE_LOGIO && (pstm->s_flags & STF_DEMANDPAGED),(DBGTEXT("FATFS!ReadStreamData(DP): begin readvolume\n")));
                dwError = ReadVolume(pstm->s_pvol, blk, cblk, pvData);
                DEBUGMSG(ZONE_LOGIO && (pstm->s_flags & STF_DEMANDPAGED),(DBGTEXT("FATFS!ReadStreamData(DP): end readvolume\n")));
                if (!dwError) {
                    cb = cblk << BLOCK_LOG2;
                    (PBYTE)pvData += cb;
                    if (plenRead)
                        *plenRead += cb;
                }
            }
            __except (EXCEPTION_EXECUTE_HANDLER) {
                dwError = ERROR_INVALID_PARAMETER;
            }

            UnlockBlocks(blk, cblk, FALSE);
            if (dwError)
                break;
        }
        else {

            DEBUGMSG(ZONE_LOGIO && (pstm->s_flags & STF_DEMANDPAGED),(DBGTEXT("FATFS!ReadStreamData(DP): begin readstream\n")));
            dwError = ReadStream(pstm, pos, &pbStart, &pbEnd);
            DEBUGMSG(ZONE_LOGIO && (pstm->s_flags & STF_DEMANDPAGED),(DBGTEXT("FATFS!ReadStreamData(DP): begin readstream\n")));
            if (dwError)
                break;

            cb = pbEnd - pbStart;
            if (cb > len)
                cb = len;

            __try {
                memcpy(pvData, pbStart, cb);
                (PBYTE)pvData += cb;
                if (plenRead)
                    *plenRead += cb;
            }
            __except (EXCEPTION_EXECUTE_HANDLER) {
                dwError = ERROR_INVALID_PARAMETER;
            }

            ReleaseStreamBuffer(pstm, FALSE);
            if (dwError)
                break;
        }

#ifdef DEBUG
        if (ZONE_READVERIFY && ZONE_LOGIO) {
            DWORD i, j;
            for (i=0; i<cb; i++) {
                DEBUGMSG(TRUE,(DBGTEXT("%02x "), pbStart[i]));
                j = i+1;
                if (j == cb || j % 16 == 0) {
                    j = j % 16;
                    if (j == 0)
                        j = i - 15;
                    else
                        j = i - j + 1;
                    while (j <= i) {
                        DEBUGMSG(TRUE,(DBGTEXT("%c"), pbStart[j]<' ' || pbStart[j]>=0x7F? '.' : pbStart[j]));
                        j++;
                    }
                    DEBUGMSG(TRUE,(DBGTEXT("\n")));
                }
            }
        }
#endif
        len -= cb;
        pos += cb;
    }
    return dwError;
}


/*  WriteStreamData
 *
 *  Whereas ReadStream returns a pointer (to a buffer) and a length,
 *  and then the caller reads whatever data it wants up to that length
 *  (or modifies data up to that length and calls ModifyStreamBuffer), this
 *  function takes a pointer to data and its length, the position to write
 *  it, and simply writes it.
 *
 *  Thus, unlike ReadStream, where the caller can never get more than a
 *  buffer's worth of data back at a time and probably needs to put a loop
 *  around its ReadStream call, WriteStreamData can write any amount of data
 *  with one call (no external loop).
 *
 *  The same effect could be achieved with a ReadStream/ModifyStreamBuffer
 *  loop, but there are two important differences:  WriteStreamData can avoid
 *  the overhead of reading data that it's simply going to overwrite anyway,
 *  and it takes care of extending the stream if needed.
 *
 *  So, I've changed ReadStreamBuffer to accept an "advisory" lenMod parm,
 *  allowing us to advise it how many bytes we plan to modify.  This
 *  information percolates down to FindBuffer, allowing FindBuffer to avoid
 *  filling a buffer with disk data if the entire buffer contents are going
 *  to be modified anyway. -JTP
 *
 *  ENTRY
 *      pstm - pointer to DSTREAM
 *      pos - position within DSTREAM to write to
 *      pvData - pointer to data to write (or NULL to write zeros)
 *      len - length of data to write
 *      plenWritten - pointer to DWORD for length written (optional)
 *      fCommit - TRUE to commit buffers as they are written
 *
 *  EXIT
 *      0 if successful, error code if not (eg, disk full, or error reading
 *      the disk to fill the non-modified portion of a buffer)
 *
 *  NOTES
 *      If fCommit is FALSE, note that the last buffer modified will still
 *      be held (ie, the stream's current buffer).
 */

DWORD WriteStreamData(PDSTREAM pstm, DWORD pos, PCVOID pvData, DWORD len, PDWORD plenWritten, BOOL fCommit)
{
    DWORD dwError;
    PBYTE pbStart, pbEnd;

    ASSERT(OWNCRITICALSECTION(&pstm->s_cs));

    if (pstm->s_pvol->v_flags & VOLF_READONLY)
        return ERROR_WRITE_PROTECT;

    dwError = ERROR_SUCCESS;

    // A write of 0 bytes always succeeds, and is not supposed to do
    // anything other than cause the "last write" timestamp to eventually
    // get updated.

    if (len == 0) {
        pstm->s_flags |= STF_DIRTY_DATA;
        pstm->s_flags &= ~STF_WRITE_TIME;
        goto exit;
    }

    do {
        RewindStream(pstm, pos);

        do {
            // Locate the data run which contains the bytes requested.

            while (pos < pstm->s_run.r_end) {

                DWORD cb, blk, cblk;

                if (pvData && LockBlocks(pstm, pos, len, &blk, &cblk, TRUE)) {

                    __try {
                        dwError = WriteVolume(pstm->s_pvol, blk, cblk, (PVOID)pvData);
                        if (!dwError) {
                            cb = cblk << BLOCK_LOG2;
                            (PBYTE)pvData += cb;
                            if (plenWritten)
                                *plenWritten += cb;
                        }
                        else
                            DEBUGMSG(ZONE_ERRORS,(DBGTEXT("FATFS!WriteStreamData: WriteVolume(block %d, %d blocks) failed (%d)\n"), blk, cblk, dwError));
                    }
                    __except (EXCEPTION_EXECUTE_HANDLER) {
                        dwError = ERROR_INVALID_PARAMETER;
                    }

                    UnlockBlocks(blk, cblk, TRUE);
                    if (dwError)
                        goto exit;
                }
                else {

                    dwError = ReadStreamBuffer(pstm,
                                               pos,
                                               pos+len < pstm->s_size? len : pstm->s_run.r_end - pos,
                                               &pbStart,
                                               &pbEnd);

                    if (dwError) {
                        DEBUGMSG(ZONE_ERRORS,(DBGTEXT("FATFS!WriteStreamData: ReadStreamBuffer(block %d) failed (%d)\n"), pstm->s_run.r_blk + ((pos - pstm->s_run.r_start) >> BLOCK_LOG2), dwError));
                        goto exit;
                    }

                    cb = pbEnd - pbStart;
                    if (cb > len)
                        cb = len;

                    dwError = ModifyStreamBuffer(pstm, pbStart, cb);
                    if (dwError)
                        goto exit;

                    if (pvData) {
                        __try {
                            memcpy(pbStart, pvData, cb);
                            (PBYTE)pvData += cb;
                            if (plenWritten)
                                *plenWritten += cb;
                        }
                        __except (EXCEPTION_EXECUTE_HANDLER) {
                            dwError = ERROR_INVALID_PARAMETER;
                            goto exit;
                        }
                    }
                    else
                        memset(pbStart, 0, cb);
                }

                len -= cb;
                pos += cb;

                // Once we get this far at least once through the loop,
                // we need to make sure the stream data is flagged as dirty.

                pstm->s_flags |= STF_DIRTY;
                pstm->s_flags &= ~STF_WRITE_TIME;

                // Furthermore, if we just wrote beyond the "official"
                // size of the stream, then update the "official" size

                if (pos > pstm->s_size)
                    pstm->s_size = pos;

                // This is where all successful WriteStreamData calls
                // end up (except when len is ZERO to begin with, of course).

                if (len == 0)
                    goto exit;
            }

            
        } while (UnpackRun(pstm) == ERROR_SUCCESS);

        // We've run out of cluster runs, and we still have len bytes
        // to write at pos.  Resize the stream to encompass that boundary
        // and try to continue.

    } while ((dwError = ResizeStream(pstm, pos + len, RESIZESTREAM_SHRINK|RESIZESTREAM_UPDATEFAT)) == ERROR_SUCCESS);

    DEBUGMSG(ZONE_ERRORS,(DBGTEXT("FATFS!WriteStreamData failed (%d)\n"), dwError));

  exit:
    if (fCommit) {

        DWORD dw;

        
        if (pstm->s_flags & STF_DIRTY_CLUS) {
            dw = CommitStream(pstm, FALSE);
            if (!dwError)
                dwError = dw;
        }

        dw = ReleaseStreamBuffer(pstm, FALSE);
        if (!dwError)
            dwError = dw;
    }

    return dwError;
}


/*  ResizeStream - truncate or extend a stream
 *
 *  ENTRY
 *      pstm - pointer to DSTREAM
 *      cbNew - new size of stream
 *      dwResizeFlags - zero or more RESIZESTREAM flags;  RESIZESTREAM_SHRINK
 *      forces shrinking (instead of simply insuring that the stream is at least
 *      as large as cbNew), and RESIZESTREAM_UPDATEFAT requests that changes to 
 *      the FAT be written.
 *
 *  EXIT
 *      ERROR_SUCCESS (0) if successful, non-zero if not
 *
 *      Truncating streams should only fail due to "hard" error conditions
 *      (eg, write-protected media), whereas extending a stream can also fail
 *      due to "soft" error conditions (eg, disk is full, or non-cluster-mapped
 *      stream -- like the root directory -- is full).
 */

DWORD ResizeStream(PDSTREAM pstm, DWORD cbNew, DWORD dwResizeFlags)
{
    PVOLUME pvol;
    DWORD dwError = ERROR_SUCCESS;
    DWORD posEnd, clus, clusEnd, clusPrev;
    DWORD clusRun, clusRunEnd, cclusRun, cbRun;

    ASSERT(OWNCRITICALSECTION(&pstm->s_cs));

    DEBUGMSG(ZONE_STREAMS,(DBGTEXT("FATFS!ResizeStream: changing size from 0x%x to 0x%x for '%.11hs'\n"), pstm->s_size, cbNew, pstm->s_achOEM));

    // Early exit if stream size already matches desired size.

    if (pstm->s_size == cbNew)
        return ERROR_SUCCESS;

    

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av成人高清| 国产精品欧美极品| 亚洲精品一区二区三区99| 2欧美一区二区三区在线观看视频| 91麻豆精品视频| 99久久精品99国产精品| 91精品国产91久久久久久一区二区 | 国产成人免费在线观看不卡| 色天天综合色天天久久| 久久在线观看免费| 亚洲6080在线| av午夜一区麻豆| 亚洲精品欧美激情| 国产一区二区女| 欧美妇女性影城| 亚洲激情图片一区| 国产成人自拍在线| 欧美草草影院在线视频| 亚洲综合久久av| av不卡一区二区三区| 国产精品视频第一区| 亚洲国产va精品久久久不卡综合| 国产成人免费视频网站| 欧美一级搡bbbb搡bbbb| 亚洲一区视频在线观看视频| 国产成人精品亚洲777人妖| 欧美一区二区三区性视频| 亚洲一区二区精品视频| 色综合天天综合网天天看片| 国产精品私人影院| 国产91丝袜在线播放0| 久久亚洲免费视频| 韩日av一区二区| 日韩免费一区二区| 久久成人羞羞网站| 欧美成人福利视频| 美女精品自拍一二三四| 日韩精品一区二区三区swag| 丝袜诱惑制服诱惑色一区在线观看| 日本道色综合久久| 亚洲一区在线观看网站| 在线亚洲高清视频| 亚洲综合男人的天堂| 欧美性猛交一区二区三区精品| 一区二区三区四区不卡在线 | 成人永久免费视频| 国产午夜精品久久久久久免费视| 国产又黄又大久久| 中文字幕欧美日韩一区| 91小视频在线| 亚洲一区二区影院| 欧美电影一区二区三区| 黑人巨大精品欧美黑白配亚洲| 久久精品网站免费观看| 成人性色生活片| 亚洲靠逼com| 欧美精选在线播放| 久久66热re国产| 中文字幕的久久| 91香蕉国产在线观看软件| 亚洲在线成人精品| 精品久久一二三区| av在线这里只有精品| 亚洲影院理伦片| 欧美zozo另类异族| 91美女在线观看| 日韩中文字幕一区二区三区| 久久免费看少妇高潮| 色偷偷成人一区二区三区91| 天使萌一区二区三区免费观看| 久久蜜桃香蕉精品一区二区三区| 成人av在线播放网址| 丝瓜av网站精品一区二区| 久久精品人人做人人爽97| 91麻豆6部合集magnet| 日韩av中文字幕一区二区三区| 久久久国产一区二区三区四区小说 | 久久久午夜精品理论片中文字幕| 播五月开心婷婷综合| 婷婷中文字幕综合| 国产精品久久一级| 日韩午夜电影av| 91免费看`日韩一区二区| 久久66热re国产| 亚洲第一久久影院| 中文字幕第一区综合| 欧美一区二区网站| 日本韩国一区二区三区视频| 九色|91porny| 亚洲高清免费在线| 久国产精品韩国三级视频| 最新欧美精品一区二区三区| 欧美一区二区三区四区久久| 色综合天天综合色综合av| 激情久久五月天| 日韩黄色免费电影| 亚洲激情在线激情| 中文字幕欧美激情| 欧美精品一区二区三区蜜桃| 欧美在线观看视频一区二区 | 99精品热视频| 久久99久久99| 丝袜美腿一区二区三区| 亚洲综合在线电影| 中文字幕第一区| 国产色91在线| 久久久久久久久久久久电影| 日韩欧美激情在线| 91精品国产欧美一区二区成人| 在线精品观看国产| 91麻豆视频网站| 99re这里都是精品| 成人ar影院免费观看视频| 国产·精品毛片| 国产成人免费在线视频| 国产成人aaa| 高清不卡一区二区| 国产91高潮流白浆在线麻豆| 国产成人午夜电影网| 精品一区二区三区免费播放| 麻豆成人av在线| 久久超碰97人人做人人爱| 美腿丝袜亚洲一区| 久久精品国产一区二区| 九色综合国产一区二区三区| 精品中文字幕一区二区小辣椒| 免费久久精品视频| 久久国产精品区| 国产一区二区三区观看| 国产成人在线观看| 波多野结衣91| 91免费观看视频| 欧美日韩成人综合在线一区二区| 欧美日韩久久久| 日韩欧美不卡一区| 国产日韩欧美综合一区| 国产精品区一区二区三| 亚洲天堂免费看| 国产69精品久久久久毛片| 成人夜色视频网站在线观看| 成人h动漫精品一区二区| 91美女在线看| 91精品国产高清一区二区三区 | 亚洲一区二区三区精品在线| 一区二区三区鲁丝不卡| 日日嗨av一区二区三区四区| 精品一区二区影视| eeuss国产一区二区三区| 在线欧美一区二区| 精品精品国产高清a毛片牛牛| 久久久久免费观看| 亚洲日本丝袜连裤袜办公室| 亚洲一区二区影院| 久久成人免费电影| 99精品在线观看视频| 欧美一级视频精品观看| 国产精品婷婷午夜在线观看| 亚洲国产精品视频| 韩国欧美国产一区| 色综合久久综合网| 日韩欧美精品三级| 亚洲另类在线视频| 精品在线观看视频| 日本精品视频一区二区三区| 欧美成人精品福利| 一区二区三区免费网站| av在线综合网| 精品视频免费在线| 亚洲精品一区二区三区精华液| 国产精品久久久久影院老司| 日韩激情视频在线观看| 成人高清av在线| 日韩女优电影在线观看| 一区二区三区四区中文字幕| 免费成人在线网站| 色综合久久久久| 国产三级精品三级在线专区| 五月婷婷欧美视频| 91在线精品一区二区| 久久精品综合网| 日产国产欧美视频一区精品| 色婷婷综合久久久久中文一区二区| 精品免费日韩av| 成人综合在线视频| 日韩一区二区在线播放| 一卡二卡欧美日韩| bt7086福利一区国产| 久久久不卡网国产精品二区| 日本成人在线一区| 欧美日韩精品一区二区天天拍小说| 国产精品青草久久| 国产精品1区二区.| 久久久久国产精品人| 久久成人麻豆午夜电影| 国产欧美精品区一区二区三区| 亚洲一区二区黄色| 91免费看片在线观看| 18成人在线观看| 99精品视频一区二区| 国产精品国产三级国产普通话99|