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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? fat16.c

?? 一個(gè)SD卡和FAT16讀寫源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*  * Copyright (c) 2006-2007 by Roland Riegel <feedback@roland-riegel.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */#include "partition.h"#include "fat16.h"#include "fat16_config.h"#include "sd-reader_config.h"#include <string.h>#if USE_DYNAMIC_MEMORY    #include <stdlib.h>#endif/** * \addtogroup fat16 FAT16 support * * This module implements FAT16 read and write access. *  * The following features are supported: * - File names up to 31 characters long. * - Unlimited depth of subdirectories. * - Short 8.3 and long filenames. * - Creating and deleting files. * - Reading and writing from and to files. * - File resizing. * - File sizes of up to 4 gigabytes. *  * @{ *//** * \file * FAT16 implementation. * * \author Roland Riegel *//** * \addtogroup fat16_config FAT16 configuration * Preprocessor defines to configure the FAT16 implementation. *//** * \addtogroup fat16_fs FAT16 access * Basic functions for handling a FAT16 filesystem. *//** * \addtogroup fat16_file FAT16 file functions * Functions for managing files. *//** * \addtogroup fat16_dir FAT16 directory functions * Functions for managing directories. *//** * @} */#define FAT16_CLUSTER_FREE 0x0000#define FAT16_CLUSTER_RESERVED_MIN 0xfff0#define FAT16_CLUSTER_RESERVED_MAX 0xfff6#define FAT16_CLUSTER_BAD 0xfff7#define FAT16_CLUSTER_LAST_MIN 0xfff8#define FAT16_CLUSTER_LAST_MAX 0xffff#define FAT16_DIRENTRY_DELETED 0xe5#define FAT16_DIRENTRY_LFNLAST (1 << 6)#define FAT16_DIRENTRY_LFNSEQMASK ((1 << 6) - 1)/* Each entry within the directory table has a size of 32 bytes * and either contains a 8.3 DOS-style file name or a part of a * long file name, which may consist of several directory table * entries at once. * * multi-byte integer values are stored little-endian! * * 8.3 file name entry: * ==================== * offset  length  description *      0       8  name (space padded) *      8       3  extension (space padded) *     11       1  attributes (FAT16_ATTRIB_*) * * long file name (lfn) entry ordering for a single file name: * =========================================================== * LFN entry n *     ... * LFN entry 2 * LFN entry 1 * 8.3 entry (see above) *  * lfn entry: * ========== * offset  length  description *      0       1  ordinal field *      1       2  unicode character 1 *      3       3  unicode character 2 *      5       3  unicode character 3 *      7       3  unicode character 4 *      9       3  unicode character 5 *     11       1  attribute (always 0x0f) *     12       1  type (reserved, always 0) *     13       1  checksum *     14       2  unicode character 6 *     16       2  unicode character 7 *     18       2  unicode character 8 *     20       2  unicode character 9 *     22       2  unicode character 10 *     24       2  unicode character 11 *     26       2  cluster (unused, always 0) *     28       2  unicode character 12 *     30       2  unicode character 13 *  * The ordinal field contains a descending number, from n to 1. * For the n'th lfn entry the ordinal field is or'ed with 0x40. * For deleted lfn entries, the ordinal field is set to 0xe5. */struct fat16_header_struct{    uint32_t size;    uint32_t fat_offset;    uint32_t fat_size;    uint16_t sector_size;    uint16_t cluster_size;    uint32_t root_dir_offset;    uint32_t cluster_zero_offset;};struct fat16_fs_struct{    struct partition_struct* partition;    struct fat16_header_struct header;};struct fat16_file_struct{    struct fat16_fs_struct* fs;    struct fat16_dir_entry_struct dir_entry;    uint32_t pos;    uint16_t pos_cluster;};struct fat16_dir_struct{    struct fat16_fs_struct* fs;    struct fat16_dir_entry_struct dir_entry;    uint16_t entry_next;};struct fat16_read_callback_arg{    uint16_t entry_cur;    uint16_t entry_num;    uint32_t entry_offset;    uint8_t byte_count;};struct fat16_usage_count_callback_arg{    uint16_t cluster_count;    uint8_t buffer_size;};#if !USE_DYNAMIC_MEMORYstatic struct fat16_fs_struct fat16_fs_handlers[FAT16_FS_COUNT];static struct fat16_file_struct fat16_file_handlers[FAT16_FILE_COUNT];static struct fat16_dir_struct fat16_dir_handlers[FAT16_DIR_COUNT];#endifstatic uint8_t fat16_read_header(struct fat16_fs_struct* fs);static uint8_t fat16_read_root_dir_entry(const struct fat16_fs_struct* fs, uint16_t entry_num, struct fat16_dir_entry_struct* dir_entry);static uint8_t fat16_read_sub_dir_entry(const struct fat16_fs_struct* fs, uint16_t entry_num, const struct fat16_dir_entry_struct* parent, struct fat16_dir_entry_struct* dir_entry);static uint8_t fat16_dir_entry_seek_callback(uint8_t* buffer, uint32_t offset, void* p);static uint8_t fat16_dir_entry_read_callback(uint8_t* buffer, uint32_t offset, void* p);static uint8_t fat16_interpret_dir_entry(struct fat16_dir_entry_struct* dir_entry, const uint8_t* raw_entry);static uint16_t fat16_get_next_cluster(const struct fat16_fs_struct* fs, uint16_t cluster_num);static uint16_t fat16_append_clusters(const struct fat16_fs_struct* fs, uint16_t cluster_num, uint16_t count);static uint8_t fat16_free_clusters(const struct fat16_fs_struct* fs, uint16_t cluster_num);static uint8_t fat16_terminate_clusters(const struct fat16_fs_struct* fs, uint16_t cluster_num);static uint8_t fat16_clear_cluster(const struct fat16_fs_struct* fs, uint16_t cluster_num);static uint16_t fat16_clear_cluster_callback(uint8_t* buffer, uint32_t offset, void* p);static uint32_t fat16_find_offset_for_dir_entry(const struct fat16_fs_struct* fs, const struct fat16_dir_struct* parent, const struct fat16_dir_entry_struct* dir_entry);static uint8_t fat16_write_dir_entry(const struct fat16_fs_struct* fs, struct fat16_dir_entry_struct* dir_entry);static uint8_t fat16_get_fs_free_callback(uint8_t* buffer, uint32_t offset, void* p);static void fat16_set_file_modification_date(struct fat16_dir_entry_struct* dir_entry, uint16_t year, uint8_t month, uint8_t day);static void fat16_set_file_modification_time(struct fat16_dir_entry_struct* dir_entry, uint8_t hour, uint8_t min, uint8_t sec);/** * \ingroup fat16_fs * Opens a FAT16 filesystem. * * \param[in] partition Discriptor of partition on which the filesystem resides. * \returns 0 on error, a FAT16 filesystem descriptor on success. * \see fat16_open */struct fat16_fs_struct* fat16_open(struct partition_struct* partition){    struct fat16_fs_struct* fs;
#if USE_DYNAMIC_MEMORY==0
	uint8_t i;
#endif
    if(!partition ||#if FAT16_WRITE_SUPPORT       !partition->device_write ||       !partition->device_write_interval#else       0#endif      )        return 0;#if USE_DYNAMIC_MEMORY    fs = malloc(sizeof(*fs));    if(!fs)        return 0;#else    fs = fat16_fs_handlers;    for(i = 0; i < FAT16_FS_COUNT; ++i)    {        if(!fs->partition)            break;        ++fs;    }    if(i >= FAT16_FS_COUNT)        return 0;#endif    memset(fs, 0, sizeof(*fs));    fs->partition = partition;    if(!fat16_read_header(fs))    {#if USE_DYNAMIC_MEMORY        free(fs);#else        fs->partition = 0;#endif        return 0;    }        return fs;}/** * \ingroup fat16_fs * Closes a FAT16 filesystem. * * When this function returns, the given filesystem descriptor * will be invalid. * * \param[in] fs The filesystem to close. * \see fat16_open */void fat16_close(struct fat16_fs_struct* fs){    if(!fs)        return;#if USE_DYNAMIC_MEMORY    free(fs);#else    fs->partition = 0;#endif}/** * \ingroup fat16_fs * Reads and parses the header of a FAT16 filesystem. * * \param[inout] fs The filesystem for which to parse the header. * \returns 0 on failure, 1 on success. */uint8_t fat16_read_header(struct fat16_fs_struct* fs){    
	uint8_t buffer[25];
	uint32_t partition_offset;
	uint16_t bytes_per_sector;    uint8_t sectors_per_cluster;    uint16_t reserved_sectors;    uint8_t fat_copies;    uint16_t max_root_entries;    uint16_t sector_count_16;    uint16_t sectors_per_fat;    uint32_t sector_count;

	struct partition_struct* partition;
	struct fat16_header_struct* header;

    /* ensure we really have a FAT16 fs here */    uint32_t data_sector_count;    uint32_t data_cluster_count;

	if(!fs)        return 0;    partition = fs->partition;    if(!partition)        return 0;    /* read fat parameters */    partition_offset = partition->offset * 512;    if(!partition->device_read(partition_offset + 0x0b, buffer, sizeof(buffer)))        return 0;    bytes_per_sector = ((uint16_t) buffer[0x00]) |                                ((uint16_t) buffer[0x01] << 8);    sectors_per_cluster = buffer[0x02];    reserved_sectors = ((uint16_t) buffer[0x03]) |                                ((uint16_t) buffer[0x04] << 8);    fat_copies = buffer[0x05];    max_root_entries = ((uint16_t) buffer[0x06]) |                                ((uint16_t) buffer[0x07] << 8);    sector_count_16 = ((uint16_t) buffer[0x08]) |                               ((uint16_t) buffer[0x09] << 8);    sectors_per_fat = ((uint16_t) buffer[0x0b]) |                               ((uint16_t) buffer[0x0c] << 8);    sector_count = ((uint32_t) buffer[0x15]) |                            ((uint32_t) buffer[0x16] << 8) |                            ((uint32_t) buffer[0x17] << 16) |                            ((uint32_t) buffer[0x18] << 24);        if(sectors_per_fat == 0)        /* this is not a FAT16 */        return 0;    if(sector_count == 0)    {        if(sector_count_16 == 0)            /* illegal volume size */            return 0;        else            sector_count = sector_count_16;    }    /* ensure we really have a FAT16 fs here */    data_sector_count = sector_count                                 - reserved_sectors                                 - (uint32_t) sectors_per_fat * fat_copies                                 - ((max_root_entries * 32 + bytes_per_sector - 1) / bytes_per_sector);    data_cluster_count = data_sector_count / sectors_per_cluster;    if(data_cluster_count < 4085 || data_cluster_count >= 65525)        /* this is not a FAT16 */        return 0;    partition->type = PARTITION_TYPE_FAT16;    /* fill header information */    header = &fs->header;    memset(header, 0, sizeof(*header));        header->size = sector_count * bytes_per_sector;    header->fat_offset = /* jump to partition */                         partition_offset +                         /* jump to fat */                         (uint32_t) reserved_sectors * bytes_per_sector;    header->fat_size = (data_cluster_count + 2) * 2;    header->sector_size = bytes_per_sector;    header->cluster_size = (uint16_t) ( (uint32_t) bytes_per_sector * sectors_per_cluster );    header->root_dir_offset = /* jump to fats */                              header->fat_offset +                              /* jump to root directory entries */                              (uint32_t) fat_copies * sectors_per_fat * bytes_per_sector;    header->cluster_zero_offset = /* jump to root directory entries */                                  header->root_dir_offset +                                  /* skip root directory entries */                                  (uint32_t) max_root_entries * 32;    return 1;}/** * \ingroup fat16_fs * Reads a directory entry of the root directory. * * \param[in] fs Descriptor of file system to use. * \param[in] entry_num The index of the directory entry to read. * \param[out] dir_entry Directory entry descriptor which will get filled. * \returns 0 on failure, 1 on success * \see fat16_read_sub_dir_entry, fat16_read_dir_entry_by_path */uint8_t fat16_read_root_dir_entry(const struct fat16_fs_struct* fs, uint16_t entry_num, struct fat16_dir_entry_struct* dir_entry){    uint8_t buffer[32];    const struct fat16_header_struct* header = &fs->header;    device_read_interval_t device_read_interval;
	struct fat16_read_callback_arg arg;

    if(!fs || !dir_entry)        return 0;    /* we read from the root directory entry */    device_read_interval = fs->partition->device_read_interval;    /* seek to the n-th entry */    memset(&arg, 0, sizeof(arg));    arg.entry_num = entry_num;    if(!device_read_interval(header->root_dir_offset,                             buffer,                             sizeof(buffer),                             header->cluster_zero_offset - header->root_dir_offset,                             fat16_dir_entry_seek_callback,                             &arg) ||       arg.entry_offset == 0      )        return 0;    /* read entry */    memset(dir_entry, 0, sizeof(*dir_entry));    if(!device_read_interval(arg.entry_offset,                             buffer,                             sizeof(buffer),                             arg.byte_count,                             fat16_dir_entry_read_callback,                             dir_entry))        return 0;    return dir_entry->long_name[0] != '\0' ? 1 : 0;}/** * \ingroup fat16_fs * Reads a directory entry of a given parent directory.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品996| 国产精品家庭影院| 91精品在线观看入口| 色8久久人人97超碰香蕉987| 成人av电影在线观看| 成人午夜私人影院| 成人不卡免费av| 一本一本大道香蕉久在线精品| 成人av午夜电影| 99精品视频在线免费观看| 成人av在线资源网站| 91网站在线播放| 色狠狠一区二区| 欧美亚洲高清一区| 8x福利精品第一导航| 欧美一级久久久| 久久精品一区二区| 亚洲视频一区在线| 亚洲第一主播视频| 免费看日韩精品| 国产高清视频一区| 99精品久久久久久| 欧美无乱码久久久免费午夜一区| 欧美日韩精品欧美日韩精品一综合| 在线不卡中文字幕| 精品福利一区二区三区| 国产欧美视频一区二区三区| 亚洲男人的天堂在线aⅴ视频| 亚洲一二三专区| 日韩av中文在线观看| 国产精品综合视频| 色综合天天做天天爱| 欧美一区二区三区性视频| 精品88久久久久88久久久| 中文字幕一区二区三区乱码在线| 一区二区三区不卡视频 | 视频一区视频二区中文| 日韩**一区毛片| 国产精品一区二区男女羞羞无遮挡| 成人黄色在线视频| 欧美日韩黄色影视| 久久精品免视看| 亚洲国产wwwccc36天堂| 精品一区二区在线免费观看| a美女胸又www黄视频久久| 欧美日韩精品一区二区| 久久久亚洲午夜电影| 亚洲一区二区三区中文字幕| 美女脱光内衣内裤视频久久网站| 成人黄色大片在线观看| 欧美丰满美乳xxx高潮www| 中文字幕欧美区| 天堂va蜜桃一区二区三区| 国产不卡视频在线播放| 欧美日韩国产在线观看| 国产精品美女久久久久久久久久久 | 成人午夜电影网站| 欧美日韩亚洲另类| 国产欧美日韩卡一| 性久久久久久久久| 成人av电影在线| 日韩一区二区三区免费看| 亚洲欧洲在线观看av| 久久不见久久见免费视频1| 99国产精品一区| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲一区二区三区在线看| 国产91精品精华液一区二区三区 | 亚洲综合色视频| 国产经典欧美精品| 欧美一区二区三区在线视频| 亚洲欧美色综合| 国产高清成人在线| 日韩一卡二卡三卡| 亚洲午夜免费福利视频| 成人丝袜18视频在线观看| 日韩精品中文字幕在线不卡尤物| 亚洲网友自拍偷拍| 99精品视频免费在线观看| xnxx国产精品| 日韩精品视频网站| 91黄色免费版| 亚洲色图制服诱惑| 成人在线视频一区| 久久综合色婷婷| 热久久免费视频| 欧美男人的天堂一二区| 一区二区三区在线视频免费| 国产.欧美.日韩| 久久久国产精华| 国产一区二区精品久久| 日韩欧美视频一区| 日韩精品亚洲专区| 7777女厕盗摄久久久| 亚洲国产日韩a在线播放性色| 99国产精品久久久| 亚洲三级小视频| 91亚洲精品久久久蜜桃网站| 国产精品国产三级国产aⅴ中文 | 国产成人精品亚洲777人妖| 欧美videos大乳护士334| 婷婷开心激情综合| 欧美久久久影院| 天天综合天天综合色| 7777精品伊人久久久大香线蕉的 | 99精品欧美一区| 亚洲欧洲日产国产综合网| 成人久久18免费网站麻豆| 国产欧美视频一区二区| 不卡影院免费观看| 中文字幕一区二区不卡 | 国产亚洲欧美在线| 国产a级毛片一区| 国产精品福利一区| 色八戒一区二区三区| 一区二区三区在线视频免费| 欧美在线观看你懂的| 亚洲成a人v欧美综合天堂| 欧美乱熟臀69xxxxxx| 免费成人在线观看视频| 精品久久久网站| 成人夜色视频网站在线观看| 国产精品国产馆在线真实露脸| 91在线观看美女| 亚洲一区二区三区爽爽爽爽爽| 欧美老肥妇做.爰bbww| 日韩电影在线一区二区| 精品久久久久久综合日本欧美| 国产在线精品免费| 亚洲色图.com| 欧美精品自拍偷拍| 国产一区二区三区美女| 中文字幕亚洲综合久久菠萝蜜| 日本韩国欧美在线| 日韩高清在线不卡| 久久精品在线免费观看| 色婷婷一区二区| 免费成人av在线播放| 久久精品人人做人人综合| 91片在线免费观看| 日本亚洲视频在线| 国产欧美一区二区精品性色超碰| 在线这里只有精品| 麻豆国产一区二区| 国产精品色在线观看| 欧美日韩中文另类| 国产精品自拍毛片| 亚洲综合精品自拍| 精品国产在天天线2019| 一本到高清视频免费精品| 美女诱惑一区二区| 亚洲少妇中出一区| 精品美女一区二区| 色综合视频一区二区三区高清| 日本美女一区二区| 亚洲欧洲成人精品av97| 欧美一区二区三区视频免费播放| 粉嫩欧美一区二区三区高清影视| 性久久久久久久久| 国产精品精品国产色婷婷| 欧美一区二区成人| 色先锋资源久久综合| 国内精品在线播放| 亚洲v中文字幕| 国产精品久久久久久久久久久免费看| 欧美日韩一区不卡| av在线播放一区二区三区| 捆绑调教美女网站视频一区| 一区二区日韩电影| 国产三级三级三级精品8ⅰ区| 欧美日韩在线不卡| 99精品国产99久久久久久白柏| 久久草av在线| 亚洲国产三级在线| 国产精品福利影院| 久久色视频免费观看| 宅男在线国产精品| 在线中文字幕一区二区| 丁香啪啪综合成人亚洲小说| 久久精品国产网站| 亚洲不卡一区二区三区| 亚洲欧美一区二区三区孕妇| 国产亚洲人成网站| 精品久久国产老人久久综合| 欧美日韩精品一区二区天天拍小说 | 日本大胆欧美人术艺术动态| 国产91富婆露脸刺激对白| 天天亚洲美女在线视频| 一区二区国产视频| 国产精品久久久久精k8| 国产日产欧美一区二区三区| 日韩一级精品视频在线观看| 欧美日韩精品一区二区在线播放| 一本一本久久a久久精品综合麻豆| 成人综合在线观看| 国产高清精品在线| 国产做a爰片久久毛片| 蜜桃av噜噜一区| 麻豆91精品视频| 麻豆成人综合网|