首页
社区
课程
招聘
[原创]基于Windows的二级文件系统开发
2006-7-18 11:03 12933

[原创]基于Windows的二级文件系统开发

2006-7-18 11:03
12933
基于Windows的二级文件系统开发
使用前请务必仔细阅读下面的说明文档

一、        实验目标
设计二级文件系统,同时实现基本的功能,例如用户登陆、列举文件目录、创建/删除文件、创建/删除子目录等。

二、        系统的相关说明及使用注意事项
(1)        本系统是模仿FAT16文件系统开发的,以16位表示一个簇,并在此基础上做了相应的修改。在这个开发文档中并不会介绍FAT16系统(除非必要),只会详细描述此系统的特点及不同之处。如果要了解本系统的内部组织结构,请先查看关于FAT16文件系统的相关资料。
(2)        本系统主要包括两部分:文件系统低层本身逻辑存储结构的设计,文件系统基于Windows平台存储管理外壳的设计。需注意的是,目标不是软件本身而是静态的磁盘空间(以一定的规则储存数据),Windows界面的管理外壳只是提供一个可视化的平台,从而方便用户管理。
(3)        磁盘中一个扇区有512字节,每个簇由1/4/8/16个扇区组成,在本系统中忽略扇区这个概念,定义一个簇为4K(4096字节)。
(4)        文件系统的空间为256MB ( = 2^16 * 4096 B )
(5)        安装本系统的时候会产生一个大小为256 MB的文件,名为“FileSystem”,作为本系统的磁盘空间,所以在安装之前请先检查分区的磁盘的剩余空间是否大于256MB。所有对于本系统的测试都是在“FileSystem”中进行,不会设计此外的任何文件。
(6)        在Windows系统中有分区的概念,在本系统中所有的文件都建立在名为“system”的系统目录下。
(7)        与FAT16一样,每个文件(目录)都有一个文件目录项作为其标识。
(8)        每个文件目录项的长度为32字节。
(9)        每个文件目录下的子文件(包括子目录)的所有目录项所占有的空间不超过一个簇。即不超过MAX_DIR_ITEM_IN_PAGE = 4KB / 32B = 128 个。
(10)        每个文件的大小理论上不受限制,只局限于文件系统的空间大小。
(11)        本系统的用户中没有用户组的区分,即所有的用户都是同等,没有高低、主次之分。所有的文件(目录)都只属于某个用户,其他任何用户都无权打开或进入。
(12)        文件、子目录的名称最长8个字节
(13)        用户名、密码的长度不超过12个字节
(14)        本系统文件的后缀名不超过3个字节,且固定为“txt”
(15)        用户信息项(USER_INFO)的长度为32字节
(16)        软件中的“删除目录”功能会删除目标目录下的所有文件,包括所有的子目录和子文件。
(17)     支持多层文件目录及文件,双击某个目录则可以进入该目录,双击文件则可以打开该文件,双击".."则可以退出当前目录

三、        系统的设计
(1)        界面设计


(2)        系统的磁盘存储结构
磁盘空间 SYSTEM_SPACE_NAME = 256 MB ==> 总共65536醋
每簇大小        CLUSTER_SIZE = 4 KB
==> 256 MB / 4 KB * 2B = 128 KB ==> FAT 的空间为 128 KB(即32簇)
第0簇中存放根目录项及用户表。
第1 ~ 32 簇中存放FAT。
第33 ~ 65534 簇用于存储文件及目录项。
第65535簇,空闲不使用,作为尾簇标记。

(3)        文件系统的逻辑结构
<1> 定义文件目录项结构
typedef struct {
        BYTE        szFileName[8] ;                // 文件名
        BYTE        szFileExt[3] ;                // 扩展名
        BYTE        bAttribute ;                // 0:只读,1:可写, 2:目录
        unsigned short        nStartClu ;        // 起始簇
        UINT        nFileSize ;                        // 文件大小(字节)
        BYTE        szUserName[12] ;        // 所属用户
        BYTE        bReserve[2] ;                // 保留
} _DIRECTORY_ITEM ;
typedef _DIRECTORY_ITEM                DIRECTORY_ITEM ;
typedef _DIRECTORY_ITEM*                PDIRECTORY_ITEM ;

<2> 定义用户信息结构
typedef struct {
        BYTE        szUserName[12] ;        // 用户名
        BYTE        szUserPwd[12] ;                // 密码
        BYTE        bReserve[8] ;                // 保留
} _USER_INFO ;
typedef _USER_INFO USER_INFO ;
typedef _USER_INFO* PUSER_INFO ;

(4)        功能模块划分
        <1> . 安装文件系统
        <2> . 卸载文件系统
        <3> . 初始化文件系统
        <4> . 取得用户信息(可用于枚举用户信息)
<5> . 检测用户是否存在
        <6> . 检测登陆信息是否合法
        <7> . 添加用户
        <8> . 删除指定的用户
        <9> . 检测当前登陆用户的权限
        <10>. 枚举指定目录
        <11>. 检测在指定目录下的文件是否存在
        <12>. 创建新文件
        <13>. 删除指定文件
        <14>. 读取指定文件的内容
        <15>. 创建子目录
        <16>. 删除子目录
        <17>. 低级格式化
        <18>. 高级格式化

(5)面向对象设计
<1>. Info.h                                定义本系统的全局信息和存储结构
<2>. CSystem                        实现本系统所有功能的核心模块
<3>. CFATManger                        FAT管理模块
<4>. CDirManger                        文件目录项管理模块
<5>. CAddDirDlg                        添加目录模块
<6>. CAddUserDlg                添加用户模块
<7>. CFileDlg                        添加文件和显示文件模块
<8>. CLogDlg                        用户登陆模块
<9>. CShowUserDlg                显示用户列表
<10>. CFileSystemDlg        软件界面实现

四、总结
        本次开发流程:1天总体设计,3天详细设计(包含局部测试),1天的总体测试与文档)。总体还算顺利,由于时间比较紧,前期准备不够充足,使得在开发的时候遇到一些困难。对于面向对象的设计,又多了份感觉。看着二千多行的代码在手指下渐渐诞生,感觉不错!!

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (22)
雪    币: 235
活跃值: (41)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
alpsdew 4 2006-7-18 11:26
2
0
好文章是要顶的!
呵呵
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-7-18 20:05
3
0
最好能用驱动实现虚拟硬盘,这样格式化,目录,文件的操作就可以由操作系统来完成了.
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
快雪时晴 4 2006-7-18 21:52
4
0
未试,不知性能如何
雪    币: 208
活跃值: (371)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
moodsky 8 2006-7-19 09:00
5
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Ivanov 2006-7-19 10:54
6
0
这有啥用处?模仿中断? 不过倒是可以穿透 还原卡,哈哈
你将GUI改成 CUI将代码拿去正好做病毒用
至于日常软件应用我还是喜欢使用 中断 来帮我读写硬盘

wind_men先生的文章,很有吸取价值

http://www.xfocus.net/articles/200312/646.html
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2006-7-19 16:04
7
0
pf一下~~看看~~~
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-7-20 15:27
8
0
最初由 Ivanov 发布
这有啥用处?模仿中断? 不过倒是可以穿透 还原卡,哈哈
你将GUI改成 CUI将代码拿去正好做病毒用
至于日常软件应用我还是喜欢使用 中断 来帮我读写硬盘


........


你推荐的这篇文章写的很好
我写的这个主要目标是完成我们段学期的任务
二就是回顾下文件系统的构架
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
红火蚁 3 2006-7-20 19:06
9
0
LZ牛人啊
小弟佩服
雪    币: 156
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
sbright 2 2006-7-20 20:19
10
0
只能先顶啦..
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
w三二dasm 2006-7-23 16:22
11
0
“总共65536醋"是什么意思?
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
非安全 17 2006-7-23 16:49
12
0
看得不是很明白
不过帮顶下,如果能用汇编写个就太好了
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
寒冷的风 2006-8-22 00:40
13
0
bug还多,不输入密码也可以登陆,还有新建文件出错
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-8-22 13:47
14
0
最初由 寒冷的风 发布
bug还多,不输入密码也可以登陆,还有新建文件出错


第一个bug确实存在,新建文件怎么出错的,能不能给个截图
因为我作个比较多的测试也没发现
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
masmprogra 2006-8-22 15:02
15
0
楼主真是牛人,非常感谢你的无私奉献!!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是横刀 2006-8-23 11:28
16
0
不错的,谢谢分享了,支持下
雪    币: 139
活跃值: (111)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
bookworm 3 2006-8-23 12:09
17
0
更多的改进可以参考:TurboPower B-Tree Filer (http://sourceforge.net/projects/tpbtreefiler)

B-Tree Filer is a fast library of file-based database routines for Borland Turbo Pascal & Delphi. B-Tree Filer supports stand-alone programs or those running on Microsoft-compatible networks including Novell Netware.
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
寒冷的风 2006-8-23 22:36
18
0
新建文件没事,是我这边编译的问题,呵呵
雪    币: 228
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
machoman 1 2006-8-27 09:20
19
0
四、总结
  本次开发流程:1天总体设计,3天详细设计(包含局部测试),1天的总体测试与文档)。总体还算顺利,由于时间比较紧,前期准备不够充足,使得在开发的时候遇到一些困难。对于面向对象的设计,又多了份感觉。看着二千多行的代码在手指下渐渐诞生,感觉不错!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
厉害,每天能写500行以上的SourceCode的人确实不多,敬佩一下.

看了一下你的代码,好象是自己在APP构造 dirent 和对metadata 进行操作,看来老兄一定是熟读fat spc,另外老兄在使用USER_INFO使用上非常有新意,嘿嘿.VMM操纵文件读写也是老到的很.收藏收藏!
雪    币: 228
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
machoman 1 2006-8-27 09:29
20
0
最初由 bookworm 发布
更多的改进可以参考:TurboPower B-Tree Filer (http://sourceforge.net/projects/tpbtreefiler)

B-Tree Filer is a fast library of file-based database routines for Borland Turbo Pascal & Delphi. B-Tree Filer supports stand-alone programs or those running on Microsoft-compatible networks including Novell Netware.

B-tree 是好,可是在fat 这个垃圾玩意上压根就没考虑用B-tree 结构组织目录结构,要自己实现可能难度比较大,而且采用filter性能能提高的量可能大不了多少,如果下边是fat的话.不过NFS,NTFS等都对B-tree 支持比较好了,另M$在襁褓中的winfs可能在这方面的创新就更大,SQL+database+NTFS的方式实现的(database+FileSystem)怪物,在查询方面的速度只有用可怕来形容.
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-8-27 12:17
21
0
最初由 machoman 发布襁褓中的winfs


这是啥玩意
MS在酝酿这个?
雪    币: 228
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
machoman 1 2006-8-29 22:44
22
0
最初由 北极星2003 发布
这是啥玩意
MS在酝酿这个?

http://channel9.msdn.com/Showpost.aspx?postid=106356
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
寒冷的风 2006-9-5 12:02
23
0
据说低级格式化10次硬盘,硬盘就报废了,不知道是不是真的,大家试试?
游客
登录 | 注册 方可回帖
返回