时间:2023-03-17 18:01:41
绪论:在寻找写作灵感吗?爱发表网为您精选了8篇计算机毕业论文,愿这些内容能够启迪您的思维,激发您的创作热情,欢迎您的阅读与分享!
转眼间,我已在美丽的中山大学度过了将近两个年头。也正是这两年的研究生生涯,让我的人生有了不同的轨迹。
在这宝贵的两年的研究生生活中,首先我要感谢我的导师——郭清顺老师。“授人以鱼,不如授之以渔”,郭老师正是这样以言传身教来教导着我们。
在这里,还要特别感谢我另外一位老师——道焰老师,她雷厉风行的性格、干净利落的做事风格永远是我学习的榜样。无论是在学习上还是在生活,她总给在我最需要的时候给予帮助。
不得不提,王竹立老师,他慈父一样的关怀曾使我感激不已。他使我懂得,踏踏实实做人,认认真真做事,应付别人就是应付自己。
感谢在研究生学习期间给我诸多教诲和帮助的信息与网络中心的各位老师,感谢陈铁老师、苏顺开老师、黄海老师、张汶老师给予我的指导和帮助!
感谢317实验室的兄弟姐妹,是你们给我带来了欢乐,是你们让我知道了什么是手足情深。
感谢我的三位同学——陈颂丽、路昉硕和郭泽平,我们之间的友谊足以使我今生不忘。
感谢我的朋友——淦鑫、马伟杰、王海洋、贺明威、林诸鸣、甘荣伟,感谢你们在我失意时给我鼓励,在失落时给我支持,感谢你们和我一路走来,让我在此过程中倍感温暖!
相关的论文致谢样本
·毕业论文致谢如何写·课程设计论文致谢词·博士生论文致谢范例
·硕士研究生毕业论文感谢信·本科毕业论文致谢·大专毕业论文致谢词
开题报告
经过大学四年理论课程的学习,以及校内校外的实践,极大的丰富了自身的理论基础,并且也具备了一些处理简单问题的能力,但即将踏上社会的我深知这还远远不够,因此我利用了毕业设计的机会,在老师的指导下去完成一个具有挑战性的,其具体应用及社会服务相结合的项目,深知通过对它的开发,将对我的能力有更高层次的突破。
开发软件的一个目的是针对目前普遍的图书管理系统存在的功能不全,操作复杂,系统要求高等一系列问题,而设想一个具有个性化的图书管理系统。该管理系统与MIS系统相联系,在图书馆内部建成可靠,方便,并且功能齐全的MIS系统。从而在图书馆对新旧书的反应;对书籍借阅的管理能力;对读者和图书馆工作人员的管理能力;对图书馆管理人员软件操作的适应时间和操作感觉这些方面都将大大的提高。当然对该软件的态度是渴望获得显著的社会效益。
开发软件的另一个目的是使其具有强大的实用价值,即它可以满足中小型图书馆的借阅与管理的需要。在一般的学校与科研机构,其下属的很多分支的研究中心,试验中心,各个学院,它们往往都有着自己的规模较大的图书资料室。而这些图书资料室由于本身规模不大因此其对书籍或资料的管理模式一般都比较旧,而且在没有能力也没有必要引进大型的图书馆管理软硬件的基础上,寻求一个针对中小型图书资料室的管理软件是必要的。
这种管理软件对硬件的要求很低,一般有一个比较简单的服务器与PC机组成的网络即可,再加上使用比较廉价、性能不错的软件,这样就可以以较低的成本来实现一个足够使用的功能,而这种模式也正满足了那种中小型资料室,图书馆的要求。但是目前对这种管理软件的开发还处于一种比较原始的阶段。开发者往往都是出于资金和时间的顾虑使用比较陈旧的技术,并且各为己见,并且很少涉及网络。可是当今是一个网络化的社会,像资料室,图书馆这样的信息机构不能与网络联系起来岂不可惜,再加上如今单机版的图书管理软件多如牛毛,去开发一个类似的软件无疑是一种在时间上、精神上和资源上的极大浪费。所以出于多方面的考虑觉得有必要为这种有需要的中小型图书馆,资料室开发一种基于网络的图书资料管理软件。
项目的具体目的:
1.
实现图书馆对外借书,还书的简易操作,提高图书馆对最平凡工作的效率。
2.
实现图书馆对所藏图书的按类别,书名等多方面的查询,最大的方便读者和图书馆工作人员对所需图书的查询。
3.
建立图书馆外借读者数据库,方便工作人员对读者进行有效管理。
4.
建立图书馆工作人员数据库,限定每个工作人员对软件操作的权限,最大限度的保护数据库。
5.
实现图书馆对新书入库,旧书注销的简单处理,并且建立书籍档案,方便进货。
实现方法:
后台数据库支持:采用PowerBuild 8.0,主要是由于PowerBuild 8.0是美国Sybase公司PowerSoft的新一代数据库应用开发工具,它能够设计传统的高性能、基于客户/服务器体系结构的应用系统,也能够用于开发基于Internet的应用系统。它具有容易使用,便于维护的优点,使使用部门可以节省培训费用,加快磨合周期,同时有利于操作人员的培训,是对数据的安全性要求不是特别高,同时又有比较大的数据量的单位的较好选择。作为PowerBuild 7.0的后续版本,PowerBuild 8.0 扩展了 PowerBuild 7.0 版的性能、可靠性、质量和易用性。PowerBuild 8.0增加了几种新的功能,由此成为数据仓库和电子商务应用程序的优秀数据库平台。这些功能如:
l
新的开发调试界面,使程序员对于工作环境有了直观的了解,最大的方便了程序员的工作,新增的剪贴板能够让你保存最常用的代码段,避免了重复输入。
l
新的Web特性,这是PB8.0相对于7.0最大的改进,它提供了因特网浏览器中使用数据窗口控件的瘦客户端的解决方式。普通数据窗口和数据存储中可以使用的方法和属性现在大部分可以使用于Web数据窗口了。
l
新的数据库连接,在改进已有接口的前提下,使用新的数据库连接接口jdbc/jbd数据接口。它封装了jdbc函数功能于一个PB数据库接口,不仅支持使用SUN公司的jdk/jre1.1,还支持使用微软的java vm。因此它具有对现在windows操作平台更加好的兼容性。 外部网/internet
图书馆内部局域网
数据库
图书馆管理系统
读者查询系统
power builder具有的独特的报表系统使制作表格变的极其方便,同时根据用户的需要可以随意调节表格的形式,而不象其他的语言,当用户的需要改变时,需要很大的工作量来更改程序适应用户的需要,同时,由于该语言具有良好的数据库接口,可以比较方便的进行数据库操作。虽然power builder的语法较为简单,对于算法和其他的一些复杂的表示方式缺乏有效的方法,但对于数据库运用,这些缺点并不是经常出现。 因此,同时也用power builder作为前台客户端界面的实现语言。即整个系统均使用power builder,以提高可靠性和安全性。
数据的安全性:
由于该系统统计管理单位的各种书目,人员数据及出入库数据,因此需要保证数据的可靠性和安全性。对于软件方面,采用手动或定时对数据库采取备份,使由于数据破坏所产生的损失降到最低,同时便于恢复。
总体功能结构:
根据图书馆的基本要求和功能目标,总体框架是建立二个功能系统和二个支持系统(具体见图--1)。二个功能系统是:1.图书馆管理系统(下称1号系统);2.外部读者查
询系统(下称2号系统)。二个支持系统是:1.网络支持系统(WAN和LAN);2.数据库支持系统。
需求分析:
A:
图书馆管理系统即1号系统是该系统软件的重要内容之一,该子系统为图书馆的库存书籍的动态调整提供了决策依据,有利于及时对有大量需求的新书进行订货入库。它的主要功能包括:新书入库,旧书注销,借书,还书,馆内图书详细信息,图书查询,读者管理,馆内图书统计,读者信息管理,图书馆工作人员权限管理,名称设计,数据库备份等功能。
下面是2号系统的主要功能的简单描述(图—2简单数据流图):
1.
图书管理(图—3系统流图):
这是图书馆最重要的模块之一,它将对图书馆中的书籍进行管理操作,所有的原始数据输入都是在这里实现的,有了这里的数据输入,才能开始以后的诸如借书、还书等操作。
。新书入库管理:
该功能允许用户输入图书单,在输入过程中,程序自动生成图书单编号以加以区分两次不同的入库书单,同时程序也检查输入的合法性,并自动记录当日入库的图书。
。当日入库图书查询
该功能允许用户对当日的入库书单针对不同条件进行查询,并且提供二次修改,避免出错。
。旧书注销:
该功能允许用户输入注销单,在输入过程中,程序自动生成注销单编号以加以区分两次不同的注销书单,并且自动记录当日注销的图书。
。当日注销图书查询:
该功能允许用户对当日的注销单针对不同条件进行查询,并且提供还原,避免出错。
2.
业务管理:
这是图书馆使用频率最高的模块,因此他在功能上应该直观明确,在操作上应该简单易用。
。图书借阅:
该功能要求用户输入图书编号或者图书条码,并且检查输入合法性,然后程序动态生成该书的详细信息;再输入借书证号,并且检查输入合法性,然后程序动态生成该读者的详细信息;系统记录借书的经手人,最后由借书按钮实现操作。
。图书归还:
与图书借阅类似,追加图书超期罚款功能,自动根据预设值计算出罚款金额。
3.
人员档案管理:
这是针对读者和图书馆工作人员而设计的一个人士管理模块,它将完整的记录读者的信息,以及图书馆工作人员的信息,并且他还具有限制图书馆工作人员操作权限的功能,最大限度的保证了数据的安全。
。读者管理:
记录读者的详细信息,并提供增加、撤除、查询等操作。
。图书馆工作人员管理:
在读者管理子模块的基础上增加权限管理功能,保证数据安全。
4.
数据库备份:
这是一个涉及到安全问题的重要模块,它可以保证数据库的安全,防止因外界的突发事件所造成的损失,避免因数据流失而重复输入的困扰。该功能分为自动备份,和手动立即备份两部分,满足用户需要。
5.
名称设计:
这是一个很具个性化的功能,实现很简单,但非常吸引人,你可以任意为你的管理系统命名,比如“杭州X中学图书管理系统”。
B:
外部读者查询系统,即2号系统,这是一个面向读者的综合查询系统,采用与管理系统相同的数据库,具有唯一的功能:查询。他可以按照读者的要求,用不同方法对所藏书籍进行查询,并能进行书名的模糊查询,还可以查询读者所借书的到期日,和观看读者本人的详细资料,力争最大的满足读者的需求。(图-4简单数据流图)
性能要求:
对新书入库单,注销单的处理及查询;图书查询;借书还书速度应较快
登录仓库管理系统时应输入密码,以保证系统的安全性。
系统要有较强的兼容性,能在各种PC机上正常运行。在系统运行异常及数据文件损坏时能给出出错提示,保证系统的可靠性。
运行环境:
1. 推荐配置:
cpu:Intel Pentium 以上
内存:64M
硬盘:100M空闲空间
2.支持软件:
操作系统:Windows98 , Windows2000 , WindowsMe.
本人开发进度计划:
转眼间,我已在美丽的中山大学度过了将近两个年头,也正是这两年的研究生生涯,让我的人生有了不同的轨迹。
在这宝贵的两年的研究生生活中,首先我要感谢我的导师——郭清顺老师。“授人以鱼,不如授之以渔”,郭老师正是这样以言传身教来教导着我们。
在这里,还要特别感谢我另外一位老师——道焰老师,她雷厉风行的性格、干净利落的做事风格永远是我学习的榜样。无论是在学习上还是在生活,她总给在我最需要的时候给予帮助。
不得不提,王竹立老师,他慈父一样的关怀曾使我感激不已。他使我懂得,踏踏实实做人,认认真真做事,应付别人就是应付自己。
感谢在研究生学习期间给我诸多教诲和帮助的信息与网络中心的各位老师,感谢陈铁老师、苏顺开老师、黄海老师、张汶老师给予我的指导和帮助!
感谢317实验室的兄弟姐妹,是你们给我带来了欢乐,是你们让我知道了什么是手足情深。
感谢我的三位同学——陈颂丽、路昉硕和郭泽平,我们之间的友谊足以使我今生不忘。
感谢我的朋友——淦鑫、马伟杰、王海洋、贺明威、林诸鸣、甘荣伟,感谢你们在我失意时给我鼓励,在失落时给我支持,感谢你们和我一路走来,让我在此过程中倍感温暖!
1.合肥IT业(市场)现状
合肥,位于安徽省中部,可辐射面积大;背靠内陆一些欠发达的地区如大别山区。由于历史、体制等方面的原因,信息化建设起步晚,基础薄,合肥地区生产计算机及其设备、通信器材产品的企业很少,基本上完全是一个消费性市场,无论是规模还是容量,合肥的IT市场只是一个中等规模的市场,这种条件下的市场究竟是什么样子?我们具体来看看合肥IT市场的现状。
邮电通信业
合肥邮电通信业比较发达,四通八达的光纤主干网已敷设完毕。目前,合肥地区拥有固定电话用户和中国电信移动电话用户共计40多万。中国联通目前开通了合肥、芜湖两地130移动电话业务,下一步目标是在安徽全省各中等城市开通130移动电话业务。合肥地区无线寻呼台目前有20多家,除国信、联通、中北、政讯等较大的全国卫星连网寻呼台之外,还有皖讯等全省连网的寻呼台。目前合肥电信局开放的数据通信网有:公用分组交换网、数字数据网、中国公众多媒体通信网和CHINANET。中国公众多媒体通信网棗安徽热线也于98年开通,网络覆盖全省各地市,;合肥地区三大互连网也于98年实现互通互连:省邮电多媒体通信网(169)以64KDDN专线与教育科研网、安徽信息网互连,三网互连为合肥地区信息高速公路建设打下了良好的基础。合肥目前较大的通信商城有天地通信商城,经营业务涉及语音、数据、图象、微波等通信业务。
电脑软硬件市场
合肥的电脑软硬件经销商,除了个别实力雄厚的大公司拥有自己独立的大本营之外,象其他城市一样,绝大部分都集中在电脑城经营。
说到合肥的电脑城,首推步瑞祺电脑城。步瑞祺电脑城,是安徽省内目前规模最大、产品最集中、挑选余地最大的电脑电子专业市场,位于合肥金寨路和黄山路交汇处,毗邻中国科大、安徽大学、合肥联合大学、安徽电力职工大学、炮兵学院、电子工程学院和电子部43所等一批高校和科研所。良好的科研学术氛围加上良好的经营环境创造了无限的商机,引来大批经销商入驻。到目前为止,进驻的公司有60余家,经营品种2000多种,涵盖了计算机软硬件(主要是硬件)各个方面,从各种板卡到各种电脑耗材、外设,应有尽有。众多的经销商的加盟也给步瑞祺电脑城带来了大量的客流,每天的成交额(包括零售和批发)逾50万元。电脑城的发展和繁荣,也带动了电脑城周围餐饮业、交通运输业、打字复印业、电脑图书业的迅猛发展。靠近步瑞祺大厦的合肥科菀电脑书店,号称合肥最具有特色的专业电脑书店,发展已初具规模,开展了热线查询、电话售书、送书上门等一系列服务。
步瑞祺电脑城的对面,就是合肥另一个电脑市场棗科大高科技广场,依托中国科学技术大学的品牌效应和雄厚的科研创新能力,科大高技术广场也吸引了诸如方正、同创、康柏、TCL、海尔、IBM等一大批厂商加盟,中国科大也在高科技广场开办了许多计算机公司、系统集成公司和培训中心。
合肥另外一处电脑市场是工大电子城,位于合肥工业大学附近,交通便利,人员密集,生意也十分兴隆。合肥新开张的一座电脑城棗南方大厦电脑城也位于科大高科技广场的对面,看来不管是电脑城的经营者还是电脑软硬件的经营商,都善于利用已有的优势和影响去开拓更大的市场。
近年来,在合肥市科教书店的计算机广场内聚集了以连邦为代表的一批软件销售商,均取得了不错的业绩。据合肥连邦软件专卖店的负责人介绍,合肥连邦于1994年底正式开业,在1995、1996、1997年度连续三年销售翻番,销售额始终位居全国200多家连邦专卖点的前十名之列。
IT业与教育、科研联合体
IT业是一个新兴的产业,IT业同时也是一个高新技术产业,因此,要求从业人员要有一定的素质和专业技能。所以IT业必然会和教育、科研走到一起,组成联合体。合肥目前这样的联合体有四家:联想集团与中国科大组建科大联想计算机学院联想棗科大通信软件研究发展中心;同创集团与安徽省科技研究院组建安徽同创科力信息产业有限公司;合肥工业大学与合肥永信电脑公司组建合肥永信软件系统工程公司;合肥工业大学与合肥安达电子技术公司组建合肥安达数控技术公司。99年3月合肥电信局与中国科技大学共同组建中国科大电话局,开创了在高等院校组建电话局的先例,将从根本上改善中国科大电话和网络的质量,为中国科大的继续发展奠定了基础。科研、教育和IT企业的联合已成为安徽省信息产业界的一大趋势。
IT业与传媒业
IT业由于自身具有的特点,决定了其与传媒业的密切关系:IT业通过传媒业扩大影响,传媒业因IT业而加强传媒手段。在合肥,从事IT业的传媒业有以下几家:中国计算机专修学院主办的《电脑知识与技术》和《计算机考试与指导》,一种传播电脑基本知识和技术的刊物和一种计算机等级考试的辅导刊物;安徽省计算机学会主办的《计算机与信息技术》,一种计算机应用类的技术性刊物;《新安晚报都市节拍电脑视窗》,合肥地区最大的晚报之一《新安晚报》每周也在《电脑视窗》栏目中普及电脑知识、最新电脑行情。《金通商讯》、《每周快递》、《安徽电子报》等一批引导IT消费潮流、最新市场行情的刊物。所有这些,为合肥乃至整个安徽的IT业(市场)的发展,作出了巨大的贡献。
IT业自有品牌
合肥自有品牌不多,目前较有影响的是安徽长安电子股份有限公司生产的“长安”系列电脑。长安公司实力较雄厚,已通过ISO9002质量体系认证。为了扩大影响、提高品牌知名度,长安公司与安徽有线电视台探索(Discovery)栏目联举办有奖收视活动,每月评出一名优胜者,奖长安多媒体电脑一台,其宣传口号是:探索你的世界,探索你的人生;看探索节目,当探索奔腾王,得长安电脑。合肥地区另一自有品牌是由安徽丰利电子有限公司生产的“丰利”系列电脑。安徽丰利的宣传口号是“平易近人的价格,无微不至的服务”。当然还有更多具有行业特色的专业公司在默默无闻的发展着,说不定哪天也能一鸣惊人,打出自己的一片天地。
二.合肥IT业(市场)现状分析与对策展望
总的说来,合肥地区IT业(市场)目前还处在一个刚刚起步,还很不成熟的三级、四级市场,与北京的中关村电子市场、深圳、武汉的电脑市场相比,还有相当大的差距。合肥地区IT企业规模较小,在与省外公司竞争中处于不利地位,有不少省内工程都被南京、深圳、北京等地的公司拿走;由于合肥是一个内地城市,经济节奏相对缓慢,信息流通也稍慢一些,因此,合肥成了商家和IT企业专业服务商容易遗忘的地方。如去年下半年,在合肥地区举行的IT企业展览就只有三次:联想百城巡礼、科利华“学习的革命”和微软世纪行。但也正是在这种“被人遗忘的地方”,却存在着实实在在需求,蕴含着无限的商机(别忘了世界上第一台VCD——万燕VCD就诞生在这里)。IT领域变化快,“后发效应”明显,后来居上也不是没有可能的,因为在IT业(市场)里,“只有失败者,没有后来者”。因此,针对合肥地区IT业(市场)的现状——电信市场容量巨大,潜力足;PC市场起步较晚,不成熟;IT企业发展不平衡,实力弱,我们因当采取正确的策略,来发展合肥地区的IT业(市场)。
市场开拓和完善
电信市场因当在电信资费调整、开放引入竞争的前提下,放下架子,端正思想,加强服务。电信市场的改革要溶入整个信息产业改革的大潮中。国家信息产业改革的基本框架已经制订:对中国电信实行分解式重组;对中国联通实行整合式重组;对中国有线电视进行产业化改造;按集约化经营的思想,对原有体制进行改革,重新划分原有资产并进行业务和人员的重组。国信寻呼的成立,迈开了电信改革的第一步。今年1月27日到2月2日,合肥电信举办了一个名为“回报老用户”的活动:有合肥市固定电话担保,申请移动电话的用户可以免入网费。一时之间,电信局营业大厅排起了购买移动电话入中国电信网的长队。事实雄辩的证明合肥地区电信市场具有巨大的潜力,关键是电信部门想不想挖掘这个潜力。
在市场开拓和完善上:
首先,政府应该制订良好的产业政策,在宏观上把信息产业放到优先发展的地位,大力扶持,在资金、技术、人才等方面给予一定的优惠政策;创造有利的条件,在信息产业发展的软、硬件上下工夫。目前在这些方面有了长足的进步,新建成的合肥高新技术开发区在土地使用、税收减免等诸多优惠条件的吸引下,吸引大批高新技术入驻,其中包括许多从事信息产业的企业;由安徽省电子信息系统推广办公室联合中国计算机用户协会主办的第二届安徽省计算机文化周暨99安徽(春季)计算机产品与技术展销交流会也于99年4月3日~5日在合肥胜利召开。98年度全年完成工业总产值37.49亿元,比97年同期增长72.45%,创历史最好水平,增长速度高于全国电子行业增长幅度40个百分点,实现销售收入18亿元,与97年同期相比增长50.44。
其次,是市场定位问题,市场定位要准确。单从PC消费市场来看,PC消费市场分为三大部分:集团、中小企业和个人。在这种既定的市场份额条件下,PC市场该如何定位?对于集团大批需求,中、小企业难以插手,如去年中国科大和合肥炮兵学院就一次性购买了200台金长城PII266。
第三,是市场依托问题。在完善制的同时,是走科技创新的新路,还是走永远别人产品的老路?当然是走科技创新的新路,所以合肥地区信息产业的发展应该依托中国科大等大专院校和科研院所的科研实力,只有这样才有可能出现第二个“北大方正”、“东大阿尔派”。
第四,是市场渠道问题。“开源节流”开源是第一位的,在开拓市场渠道这个问题上,不应该受地理因素的影响,放弃只吃“窝边草”的惯性思维模式,放眼全国这个大市场;开拓渠道要体现增值的作用,以合肥为中心,辐射安徽全省乃至江西等电脑市场发展较慢的地区,充分发挥合棸哺咚俟贰⒑蠗九铁路的作用,拓宽渠道,重振“徽商”风采。
企业经营运作
由于起步较晚等客观原因,合肥地区企业规模普遍较小,即大部分是中、小企业,中小企业在充分认识自身特点的基础上,应作好以下几个方面:
企业的发展的道路,应该走兼容配件棗品牌棗树立名牌的三步走的战略,逐步发展壮大,逐步树立自己的品牌。
企业应该采取多元化的经营策略,分散投资风险。既做电脑配件、耗材,又做电脑整机;既做软件开发,又做网络集成。
企业之间应保持良好的联系,相互协调和相互帮助。企业应处在一种“良性竞争”的环境中,避免企业间因相互杀价等恶性竞争带来的两败俱伤的恶果。
NTFS是WindowsNT引入的新型文件系统,它具有许多新特性。本文旨在探索NTFS的底层结构,所叙述的也仅是文件在NTFS卷上的分布。NTFS中,卷中所有存放的数据均在一个叫$MFT的文件中,叫主文件表(MasterFileTable)。而$MFT则由文件记录(FileRecord)数组构成。FileRecord的大小一般是固定的,通常情况下均为1KB,这个概念相当于Linux中的inode。FileRecord在$MFT文件中物理上是连续的,且从0开始编号。$MFT仅供FileSystem本身组织、架构文件系统使用,这在NTFS中称为元数据(Metadata)。以下列出Windows2000Release出的NTFS的元数据文件(我将要给出的示例代码的部分输出结果)。
FileRecord(inode)FileName
--------------------------
0$MFT
1$MFTMirr
2$LogFile
3$Volume
4$AttrDef
5.
6$Bitmap
7$Boot
8$BadClus
9$Secure
10$UpCase
11$Extend
Windows2000中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出这些元数据文件。实际上FileSystemDriver(ntfs.sys)维护了一个系统变量NtfsProtectSystemFiles用于隐藏这些元数据。默认情况下,这个变量被设为TRUE,所以使用dir/ah将得不到任何文件。知道这个行为后使用i386kd修改NtfsProtectSystemFiles后即可以列出元数据文件:
kd>xntfs!NtfsProtect*
fe213498Ntfs!NtfsProtectSystemFiles
fe21349cNtfs!NtfsProtectSystemAttributes
kd>ddntfs!NtfsProtectSystemFilesl2
fe2134980000000100000001
kd>edntfs!NtfsProtectSystemFiles0
kd>ddntfs!NtfsProtectSystemFilesl2
fe2134980000000000000001
kd>
D:\>ver
MicrosoftWindows2000[Version5.00.2195]
D:\>dir/ah$*
驱动器D中的卷是W2KNTFS
卷的序列号是E831-9D04
D:\的目录
2000-04-2719:3136,000$AttrDef
2000-04-2719:310$BadClus
2000-04-2719:3167,336$Bitmap
2000-04-2719:318,192$Boot
2000-04-2719:31<DIR>$Extend
2000-04-2719:3113,139,968$LogFile
2000-04-2719:3127,575,296$MFT
2000-04-2719:314,096$MFTMirr
2000-04-2719:31131,072$UpCase
2000-04-2719:310$Volume
9个文件40,961,960字节
1个目录51,863,552可用字节
需要指出的是ntfs.sys将元数据文件以一种特殊的方式打开,所以在打开NtfsProtectSystemFiles后,如果使用ReadFile等产生IRP_MJ_READ等IRP包时将会导致PageFault(详见GaryNebbett的《WindowsNT/2000NativeAPIReference》)。
以上的讨论均是基于$MFT文件而讨论的,即基于$MFT中的FileRecord(inode)讨论的。为更好的继续以下的讨论,这儿我列出FileRecordHeader的结构:
typedefstruct{
ULONGType;
USHORTUsaOffset;
USHORTUsaCount;
USNUsn;
}NTFS_RECORD_HEADER,*PNTFS_RECORD_HEADER;
typedefstruct{
NTFS_RECORD_HEADERNtfs;
USHORTSequenceNumber;
USHORTLinkCount;
USHORTAttributesOffset;
USHORTFlags;//0x0001=InUse,0x0002=Directory
ULONGBytesInUse;
ULONGBytesAllocated;
ULONGLONGBaseFileRecord;
USHORTNextAttributeNumber;
}FILE_RECORD_HEADER,*PFILE_RECORD_HEADER;
下面我将讨论如何定位$MFT。稍微有点操作系统知识的人都会知道引导扇区(BootSector),其物理位置为卷中的第一个扇区。以下由dskprobe.exe(Windows2000ResourceKit中的一个小工具)分析的第一个扇区(当然也可以使用WinHex等其他应用程序):
file:d:\Sector00.bin
Size:0x00000200(512)
Address|00010203-04050607:08090A0B-0C0D0E0F|0123456789ABCDEF
---------|-------------------------:-------------------------|-----------------
00000000|EB52904E-54465320:20202000-02080000|?R?NTFS.....
00000010|00000000-00F80000:3F00F000-3F000000|.....?..?.e.?...
00000020|00000000-80008000:90C04100-00000000|....€.€.惱A.....
00000030|04000000-00000000:091C0400-00000000|................
00000040|F6000000-01000000:049D31E8-BB31E894|?.......?杌1钄
..
..
..
000001F0|00000000-00000000:83A0B3C9-000055AA|........儬成..U?
这512字节为如下的格式:(摘自GaryNebbett书中,本文许多代码均来自或参考此书。)
#pragmapack(push,1)
typedefstruct{
UCHARJump[3];
UCHARFormat[8];
USHORTBytesPerSector;
UCHARSectorsPerCluster;
USHORTBootSectors;
UCHARMbz1;
USHORTMbz2;
USHORTReserved1;
UCHARMediaType;
USHORTMbz3;
USHORTSectorsPerTrack;
USHORTNumberOfHeads;
ULONGPartitionOffset;
ULONGReserved2[2];
ULONGLONGTotalSectors;
ULONGLONGMftStartLcn;
ULONGLONGMft2StartLcn;
ULONGClustersPerFileRecord;
ULONGClustersPerIndexBlock;
ULONGLONGVolumeSerialNumber;
UCHARCode[0x1AE];
USHORTBootSignature;
}BOOT_BLOCK,*PBOOT_BLOCK;
#pragmapack(pop)
各个字段的详细意义从字段名中即可大致清楚。在linux-ntfs的GNU工程(/projects/linux-ntfs)中也有详细的文档,限于篇幅我不将其列出。可以使用如下代码读出卷中的第一个扇区:
hVolume=CreateFile(drive,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,0,
OPEN_EXISTING,0,0);
ReadFile(hVolume,&bootb,sizeof(bootb),&n,0);
bootb是一个BOOT_BLOCK结构,在我的卷中如下格式(请对应Sector00.bin分析):
DumpBootBlockatbelow:
BytesPerSector:200
SectorsPerCluster:8
BootSectors:0
SectorsPerTrack:3F
NumberOfHeads:F0
PartitionOffset:3F
TotalSectors:41C090
MftStartLcn:4
Mft2StartLcn:41C09
ClustersPerFileRecord:F6
ClustersPerIndexBlock:1
VolumeSerialNumber:E8319D04
BootSignature:AA55
以上的MftStartLcn其实是$MFT在卷中的簇(Cluster)号。簇是NTFS的基本单位,最小单位。一个只有1Byte的文件也要占用一簇的空间。NTFS使用LCN(LogicalClusterNumber)来代表NTFS卷中的物理位置,其简单的从0到卷中的总簇数减一进行编号。对于一个特定的文件NTFS则使用VCN(VirtualClusterNumber)来映射LCN实现文件的组织。从MftStartLcn的值4可以知道$MFT的LCN为4与SectorsPerCluster、BytesPerSector的大小即可定位$MFT的位置。得到$MFT的位置后,如果遍历$MFT中所有的FileRecord即可以得到卷中所有的文件列表(前面已经提到FileRecord只是简单的从0开始编号)。也就是说到目前为止已经可以对文件组织有最简单的认识,但如何得到文件的信息呢,如文件名等等。NTFS中所有文件包括普通的用户文件、元数据文件均用同样的方式组织数据、属性等。我将nfi.exe(来自WindowsNT/2000OEMSupportTools)的输出结果列出,作为我叙述的开始:
D:\>copyconfile
testforntfs^Z
已复制1个文件。
D:\>nfid:\file
NTFSFileSectorInformationUtility.
Copyright(C)MicrosoftCorporation1999.Allrightsreserved.
\file
$STANDARD_INFORMATION(resident)
$FILE_NAME(resident)
$DATA(resident)
D:\>echotestforattr>file:ATTR
D:\>nfid:\file
NTFSFileSectorInformationUtility.
Copyright(C)MicrosoftCorporation1999.Allrightsreserved.
\file
$STANDARD_INFORMATION(resident)
$FILE_NAME(resident)
$DATA(resident)
$DATAATTR(resident)
nfi的输出结果$STANDARD_INFORMATION、$FILE_NAME、$DATA等在NTFS中称为属性(Attribute)。属性分为常驻属性(ResidentAttribute)与非常驻属性(NonresidentAttribute)。文件的数据也包含在属性中,似乎与属性这个名称有点混谣。不过这又让NTFS有了更加统一的组织文件的形式。这也同时让NTFS有MultiStreams的特性(上面也演示了这个特性)。通过指定的FileRecord定位给定的Attribute的实现代码如下:
template<classT1,classT2>inline
T1*Padd(T1*p,T2n){return(T1*)((char*)p+n);}
PATTRIBUTEFindAttribute(PFILE_RECORD_HEADERfile,
ATTRIBUTE_TYPEtype,PWSTRname)
{
for(PATTRIBUTEattr=PATTRIBUTE(Padd(file,file->AttributesOffset));
attr->AttributeType!=-1;
attr=Padd(attr,attr->Length)){
if(attr->AttributeType==type){
if(name==0&&attr->NameLength==0)returnattr;
if(name!=0&&wcslen(name)==attr->NameLength
&&_wcsicmp(name,PWSTR(Padd(attr,attr->NameOffset)))==0)returnattr;
}
}
return0;
}
GaryNebbett提供的这个FindAttribute函数在Attributename(即第三个参数)不为空串时可能会出现bug,主要原因是_wcsicmp对UNICODE字符串比较时应该是以\0结束的标准的C字符串。我在提供的代码中已经纠正了这个错误。
下面我将通过使用SoftICE来分析这段代码得到$MFT的$FILE_NAME属性来得到$MFT的filename。这个示例同样适用于得到其它文件的$FILE_NAME(如上面的file)、还有其它的属性如$DATA等等。
:bpxFindAttribute
BreakduetoBPXFindAttribute(ET=6.89seconds)
:locals
[EBP-4]+structATTRIBUTE*attr=0x00344D68<{...}>
[EBP+8]+structFILE_RECORD_HEADER*file=0x00344D38<{...}>
[EBP+C]enumATTRIBUTE_TYPEtype=AttributeFileName(30)
[EBP+10]+unsignedshort*name=0x004041BC<"$MFT">
:?file
structFILE_RECORD_HEADER*=0x00344D38<{...}>
structNTFS_RECORD_HEADERNtfs={...}
unsignedshortSequenceNumber=0x1,"\0\x01"
unsignedshortLinkCount=0x1,"\0\x01"
unsignedshortAttributesOffset=0x30,"\00"
unsignedshortFlags=0x1,"\0\x01"
unsignedlongBytesInUse=0x2D8,"\0\0\x02\xD8"
unsignedlongBytesAllocated=0x400,"\0\0\x04\0"
unsignedquadBaseFileRecord=0x0,"\0\0\0\0\0\0\0\0"
unsignedshortNextAttributeNumber=0x6,"\0\x06"
file参数我传入的是$MFT,从$MFT的LCN=4可以得到其在卷中的物理地址,这在上面已说明。你也可以使用dskprobe(我机子中为第LCN*SectorsPerCluster=4*8扇区)得到底下SoftICE的输出结果:
:dd@file//以下的注释可对照文中开头列出的FILE_RECORD_HEADER定义。
0023:00344D38454C49460003002A6D4AC04D00000000FILE*...M.Jm....
0023:00344D480001000100010030000002D800000400....0...........
----
|__AttributeOffset
0023:00344D580000000000000000043400060000FA0D..........4.....
0023:00344D6800000010000000600018000000000000....`...........
----------------
||_指出这个Attribute的长度。定义如下。
|_根据AttributeOffset得到的Attribute头,定义如下。00000010指出这个Attribute为StandardInformation
0023:00344D7800000048000000182C1761D001BFB03CH........a.,<...
Attribute头如下定义:
typedefstruct{
ATTRIBUTE_TYPEAttributeType;
ULONGLength;
BOOLEANNonresident;
UCHARNameLength;
USHORTNameOffset;
USHORTFlags;//0x0001=Compressed
USHORTAttributeNumber;
}ATTRIBUTE,*PATTRIBUTE;
typedefstruct{
ATTRIBUTEAttribute;
ULONGValueLength;
USHORTValueOffset;
USHORTFlags;//0x0001=Indexed
}RESIDENT_ATTRIBUTE,*PRESIDENT_ATTRIBUTE;
typedefstruct{
ULONGLONGDirectoryFileReferenceNumber;
ULONGLONGCreationTime;//Savedwhenfilenamelastchanged
ULONGLONGChangeTime;//ditto
ULONGLONGLastWriteTime;//ditto
ULONGLONGLastAccessTime;//ditto
ULONGLONGAllocatedSize;//ditto
ULONGLONGDataSize;//ditto
ULONGFileAttributes;//ditto
ULONGAlignmentOrReserved;
UCHARNameLength;
UCHARNameType;//0x01=Long,0x02=Short
WCHARName[1];
}FILENAME_ATTRIBUTE,*PFILENAME_ATTRIBUTE;
ATTRIBUTE_TYPE是一个Enum型定义。其中00000010为StandardInformation。30为FileName。因为FileNameAttribute总是一个常驻Attribute,所以我将RESIDENT_ATTRIBUTE定义也给出。OK,现在可以继续Dump下一个Attribute:
//dd@file+file->AttributeOffset+length(StandardInformationAttribute)
:dd@file+30+60
0023:00344DC8000000300000006800180000000300000...h...........
--------------
||___这里的NameLength与NameOffset指FileNameAttribute名。不要与$MFTFileName混谣。
|_指出这是一个FileNameAttribute。
0023:00344DD80000004A000100180000000500050000J...............
--------------------
|||_根据ValueOffset的值,得到FILENAME_ATTRIBUTE的具置。
||_ValueOffset值
|_ValueLength值
0023:00344DE82C1761D001BFB03C2C1761D001BFB03C.a.,<....a.,<...
0023:00344DF82C1761D001BFB03C2C1761D001BFB03C.a.,<....a.,<...
0023:00344E0800004000000000000000400000000000.@.......@......
0023:00344E180000000600000000002403040046004D..........$.M.F.
----------
||___找到$MFT的FileName了吧。
|_NameLength
0023:00344E2800000054000000000000008000000190T...............
0023:00344E3800400001000100000000000000000000..@.............
这儿给出了DumpAttribute的一个具体方法。最后我将给出遍历FileRecord的代码,在给出代码前应该说明一下$MFT中$BITMAP属性。NTFS的这个Attribute相当于LINUXEXT2的s_inode_bitmap数组(Linux2.0版本)。所以很容易明白$BITMAP的作用,即每bit指出相应FileRecord的在用情况。以下是DumpAllFileRecord的代码:
BOOLbitset(PUCHARbitmap,ULONGi)
{
return(bitmap[i>>3]&(1<<(i&7)))!=0;
}
VOIDDumpAllFileRecord()
{
PATTRIBUTEattr=FindAttribute(MFT,AttributeBitmap,0);
PUCHARbitmap=newUCHAR[AttributeLengthAllocated(attr)];
ReadAttribute(attr,bitmap);
ULONGn=AttributeLength(FindAttribute(MFT,AttributeData,0))/BytesPerFileRecord;
PFILE_RECORD_HEADERfile=PFILE_RECORD_HEADER(newUCHAR[BytesPerFileRecord]);
for(ULONGi=0;i<n;i++){
if(!bitset(bitmap,i))continue;
ReadFileRecord(i,file);
if(file->Ntfs.Type==''''ELIF''''&&(file->Flags&3)){
attr=FindAttribute(file,AttributeFileName,0);
if(attr==0)continue;
PFILENAME_ATTRIBUTEname
=PFILENAME_ATTRIBUTE(Padd(attr,PRESIDENT_ATTRIBUTE(attr)->ValueOffset));
printf("%8lu%.*ws\n",i,int(name->NameLength),name->Name)
}
}
}
本文引用GaryNebbett的些定义可能对Windows2000版本有些很小的出入,不过Internet有其神奇的地方,虽然Microsoft不提供这些信息,但诸如linux-ntfsGNU工程等均是学习NTFS的一个很好的资料,本文也参考了很多它提供的文档。另外MarkRussinovich的《InsideWin2KNTFS》、《InsideNTFS》、《ExploringNTFSOn-diskStructures》等也是很好的NTFS资料。本文仍未涉及NTFS中目录的组织(B+树)等等,可能的话我会另行介绍。文中介绍的完整代码可到下载。出现的错误也欢迎来信指教(tsu00@)!
最后感谢AntonAltaparmakov,感谢我的同事在出差时抽空给我买到GaryNebbett的书。感谢我看到的所有资料的原作者们。感谢他们!
参考资料:
1.GaryNebbett《WindowsNT/2000NativeAPIReference》
2.Linux-NTFSProjectNTFSDocumentationVersion0.4
计算机辅助教学系统在教学上的运用,标志着教学媒体质的飞跃。计算机的应用,使教学手段更加丰富,将对教学效果的提高起到促进作用。由于计算机是人脑的延伸,是人脑思维活动的模拟,是对人类思维活动的结构、功能及其规律的把握,因此,其在教学上的运用十分有利于学生的发展,符合现代化教学规律的要求。
多媒体是90年展起来的新技术。它是一种把文本、图形、形象、视频图像、动画和声言等运载信息的媒体集成在一起,并通过计算机综合处理和控制的一种信息技术。多媒体技术是信息领域的又一次革命,在教学上,它既能向学生快速提供丰富多彩的集图、文、声于一体的教学信息,又能为学生提供生动、友好、多样化的交互方式。
多媒体教学可产生优良的视听效果。因为人的视觉、听觉是接收信息的主要渠道,获得的信息也最大。多媒体教学有利于信息传递和学生对信息的接受、储存。其特有的优势对学生产生一定强度的刺激,引起学生的注意。如果没有注意,感知就不会产生强烈观察力。而观察力是在感知过程中并以感知为基础形成起来的,离开了感知也就没有了观察。利用多媒体的优势引人入胜,可以不断提高学生注意的品质,使学生心理活动处于积极状态。
以往的教学活动是由教师、学生、媒体三个要素构成的,缺一不可。大多数教学媒体都具有直观性,但各有所长,也各所短。传统教学媒体中有教师语言、课本、板书、实物、模型、挂图等,都具有一定的局限性。而多媒体能使学生不由自主地集中全部注意力,引起学生的浓厚兴趣,激发学生强烈的情感,从中获得直接、生动、形象的感性知识。教师在授课过程中,恰当地选用教学媒体,能更好地把知识技能传授给学生,加快师生间的信息传递,优化教学过程,从而获得良好的教学效果。
不管是美国的亚马逊还是中国的8848,都选择书籍作为电子商务的突破口,这是有着内在的必然性的。
书籍的特点是数量大,产品的差别性小,因此最适宜网络营销。这是国内与国外的共性。
但中国书籍市场与美国书籍市场也有很大的不同,最大的不同主要有两点:一个是网民对书籍的消费水平和消费比例,二者有着极大的差别,另一点是通过网络营销对书籍成本的影响,在美国,网络营销大大减小了书籍的运营成本,因此,亚马逊公司能够以大大低于市场的价格进行销售,而在中国,市场规模的限制使网上营销书籍的成本变化不大,而相对高昂的网络费用与物流费用又使表面上降低的书籍费用大大增加。
在这种情况下,8848提出B2B也是无可奈何之举。与其说是看到了B2B的希望,毋宁说是感觉到B2C的无奈。在书籍、CD等无差别、无维护产品不能获得成功的话,其他领域的成功希望更是渺茫。
那么,书籍领域的B2B又没有希望呢?希望当然是有的,但必须看到B2B的难度并不比B2C的难度小。专业人员知道:B2B的前提是企业内部的信息化,而在中国,企业经营的信息化程度还很不够,各企业信息化运作对WEB的考虑也不够,这些都是限制国内B2B市场迅速发展的瓶颈。
二、地域性的选择
从地域的定位来说,8848将定位定在全国范围并没有太大的错误,8848也确实在全国有着很大的影响。从这点来看,8848的定位是比较成功的。
但也不是说8848的定位没有问题,至少,8848没有区分城市与非城市的差别是有很大问题的,在电子商务的初始阶段,将目标限定在更小的范围是一种务实的做法。
这一点:上海梅林的做法很好。首先,在上海建立根据地,作为一个窗口,一个试点,上海梅林迅速取得了经济效益。上海梅林的有自己管理的物流网络是成功的一个很重要的因素,也是成功的一个必要的因素,但这种物流网络的形成在目前国内的情形下只能在大城市才最有成功的可能。
上海梅林进一步向北京、广州发展,可以说,他们的做法是成功的,成功的基础在于有一个很好的策略目标。
三、从网上到网下
不管是B2B,B2C,还是物流网,一个很关键的因素就是如何覆盖网下的人口,尤其在中国这个经济发展水平较低的国家,将会在一个很长的过程中,上网人口的比例偏低。
只有在使用好的办法能够将电子商务的优势用于包括网上、网下的人口的情形下,中国的电子商务才能够获得成功,否则,电子商务的设想将会类同于空中楼阁的建设。
一、所用控件
在程序中将使用Winsock控件。Winsock控件是一个ActiveX控件,使用TCP协议或UDP协
议连接到远程计算机上并与之交换数据。和定时器控件一样,Winsock控件在运行时是不可见的。Winsock的工作原理是:客户端向服务器端发出连接请求,服务器端则不停地监听客户端的请求,当两者的协议沟通时,客户端和服务器端之间就建立了连接,这时客户端和服务器端就可以实现双向数据传输。实际编程中,必须分别建立一个服务器端应用程序和一个客户端应用程序,两个应用程序中分别有自己的Winsock控件。首先设置Winsock控件使用的协议,这里我们使用TCP协议。现在,让我们开始用VB建立两个程序,一个是客户端程序myclient,另一个是服务器端程序myserver。
二、编写客户端程序
首先来建客户端程序myclient。在myclient程序中建立一个窗体,加载Winsock控件,称为tcpclient,表示使用的是TCP协议,再加入两个文本框(text1和text2),用来输入服务器的IP地址和端口号,然后建立一个按钮(cd1),用来建立连接,按下之后就可以对连接进行初始化了,代码如下:
privatesubcd1_click()
tcpclient.romotehost=text1.text
tcpclient.romoteport=val(text2.text)''''端口号,缺省为1001
tcpclient.connect''''调用connect方法,与指定IP地址的计算机进行连接
cd1.enabled=false
endsub
连接之后就是如何处理所收到的数据的问题了。客户端和服务器端建立连接后,如果有任何一端接收到新的数据,就会触发该端winsock控件的dataarrival事件,在响应这个事件时,可以使用getdata方法获得发送来的数据。比如可以在tcpclient的dataarrival事件中编写代码如下:
privatesubtcpclient_dataarrival(byvalbytestotalaslong)
dimxasstring
tcpclient.getdatax''''使用getdata获得发送来的数据
.......
Endsub
后面的省略部分表示对接收到的数据进行的具体处理,读者可以根据实际情况编写。
三、编写服务器端程序
先建立一个窗体,加载Winsock控件,名称为tcpserver。另外在窗体上加入一个文本框text1用来显示客户机的IP地址和客户机发送过来的数据信息。
当客户端程序运行时,在客户端程序按下连接按钮后,客户端向服务器端程序请求连接,这时服务器端的connectionrequest事件被触发,所以服务器端程序要解决连接问题,可以使用connectionrequest事件完成此功能。代码如下:
''''在窗体的load事件中对tcpserver控件进行初始化
privatesubform_load()
tcpserver.localport=1001
tcpserver.listen''''把服务器置于监听检测状态
endsub
''''服务器端接收到客户端的连接请求,首先检查当前状态是否处于连接关闭状态
Privatesubtcpclient_connectionrequest(ByvalrequestIDaslong)
Iftcpserver.state<>sckclosedthen''''检查控件的state属性是否为关闭
Tcpserver.close''''
Tcpserver.acceptrequestID''''
Endif
Endsub
现在我们在服务器端程序tcpserver的dataarrival事件中添加以下代码,以便让服务器端程序可以接收客户机端的指令,并运行相应的程序。