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,