写文件到 .img

这篇博客详细介绍了如何利用C语言编写代码,将文件写入到FAT12格式的.img文件中。涉及到的源文件包括FAT12的头文件FAT12.h,实现文件FAT12.c,处理.img文件的img.c,以及整个项目的Makefile。
摘要由CSDN通过智能技术生成

FAT12.h

/*  FAT12.h
    操作 FAT12 文件系统的镜像文件的库函数申明
    四彩
    2015-12-08
*/


#ifndef _FAT12_H
#define _FAT12_H


#ifdef WINDOWS
    #define SEPARATOR   '\\'                 // Windows 系统下的分隔符
#else
    #define SEPARATOR   '/'                 // linux 系统下的分隔符
    #define stricmp     strcasecmp          // 比较字符串(不区分大小写)
#endif



//========================================================================================
/*  功能:
        创建一个新的空白镜像文件
    参数表:
        strImgName = 镜像文件名
    返回值:
        0 = 成功
        1 = 未能创建文件
*/
int CreateNewImg(char *strImgName);


/*  功能:
        复制引导扇区到镜像
    参数表:
        strImgName  = 镜像文件名
        strFileName = 引导扇区文件名
    返回值:
        0 = 成功
        1 = 失败
*/
int CopyBootSector2Img(char *strImgName, char *strFileName);


// 文件属性如下:
#define DIRATTR_READ_ONLY       0x01        //只读
#define DIRATTR_HIDDEN          0x02        //隐藏
#define DIRATTR_SYSTEM          0x04        //系统
//#define DIRATTR_VOLUME_ID       0x08        //卷标
//#define DIRATTR_DIRECTORY       0x10        //目录
#define DIRATTR_ARCHIVE         0x20        //文档
/*  功能:
        向镜像增加文件
    参数表:
        strImgName  = 镜像文件名
        strPathName = 源文件全路径
        ucFileAttr  = 文件属性
    返回值:
        0 = 成功
        1 = 失败
*/
int AddFile2Img(char *strImgName, char *strPathName, unsigned char ucFileAttr);


/*  功能:
        从镜像中删除文件
    参数表:
        strImgName  = 镜像文件名
        strFileName = 目标文件名
    返回值:
        无
*/
void DeleteFileFromImg(char *strImgName, char *strFileName);
//****************************************************************************************


#endif

FAT12.c

/*  FAT12.c
    操作 FAT12 文件系统的镜像文件的实现部分
    四彩
    2015-12-06
*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "FAT12.h"


//========================================================================================
// FAT12 文件系统 3.5 英寸软盘常量
#define TOTALSECTORS                2880    // 总扇区数
#define BYTESPERSECTOR              512     // 每扇区字节数

#define FIRSTOFFAT                  1       // FAT 表的起始逻辑扇区号
#define FIRSTOFROOTDIR              19      // 根目录的起始逻辑扇区号
#define FIRSTOFDATA                 33      // 数据区的起始逻辑扇区号
//****************************************************************************************


//========================================================================================
// 目录表项结构
typedef struct tag_DirectoryItem
{
    char            DIR_Name[11];           // 文件名, 8 + 3(注意:没有字符串结尾符 0)
    char            DIR_Attr;               // 文件属性
    char            DIR_Rsvd[10];           // 保留
    unsigned short  DIR_WrtTime;            // 2 位,最后修改时间
    unsigned short  DIR_WrtDate;            // 2 位,最后修改日期
    unsigned short  DIR_FstClus;            // 2 位,此条目对应的开始簇号(即扇区号)
    unsigned int    DIR_FileSize;           // 4 位,文件大小
} T_DIRECTORYITEM;
//****************************************************************************************


unsigned short ReadFatEntryValue(FILE *fpImg, unsigned short iEntry);
void WriteFatEntryValue(FILE *fpImg, unsigned short iEntry, unsigned short nValue);
void ConvertDirName2FileName(char *strDirName, char *strFileName);
void ConvertFileName2DirName(char *strFileName, char *strDirName);
unsigned short FindEmptyEntryInRootDirectory(FILE *fpImg);
unsigned short FindEmptyEntryInFat(FILE *fpImg, unsigned short iFirstEntry);
unsigned short FindFileInRootDirectory(FILE *fpImg, char *strFileName);
unsigned short GetRestSectors(FILE *fpImg);
void DeleteFile(FILE *fpImg, unsigned short iRootDirEntry);
void AddFile(FILE *fpImg, FILE *fpFile, char *strDirName, unsigned char ucFileAttr);

/*  功能:
        创建一个新的空白镜像文件
    参数表:
        strImgName = 镜像文件名
    返回值:
        0 = 成功
        1 = 未能创建文件
*/
int CreateNewImg(char *strImgName)
{
    // 下面这段神一样的数据就是 BootSector.sys 的 16 进制数而已
    unsigned char BootSector[BYTESPERSECTOR] =
    {
        0xEB,0x39,0x90,0x4E,0x41,0x53,0x4D,0x2B,0x47,0x43,0x43,0x00,0x02,0x01,0x01,0x00,
        0x02,0xE0,0x00,0x40,0x0B,0xF0,0x09,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
        0x40,0x0B,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x54,0x65,0x73,0x74,0x58,
        0x5F,0x76,0x30,0x2E,0x30,0x31,0x46,0x41,0x54,0x31,0x32,0x8C,0xC8,0x8E,0xD8,0x8E,
        0xD0,0xB8,0x00,0x7C,0x89,0xC5,0x89,0xC4,0xBE,0x7F,0x7D,0xE8,0x1C,0x00,0x83,0xF8,
        0x00,0x75,0x08,0xBE,0x75,0x7D,0xE8,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值