资源描述:
《用windows终端仿真程序实现微机远程文件传送论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、用Windows终端仿真程序实现微机远程文件传送论文有些硬盘防拷贝是通过对硬盘FAT表中的簇链的检测来实现的,这与本文所推荐的方法原理一样,都是通过检测文件位置信息是否被改变来判断文件是否已被移动的。但前者涉及到定位FAT表及文件所在目录等繁琐工作,而且还和硬盘型号及格式化信息有关,编程很不方便。本文所介绍的方法则不然,它直接与操作系统打交道,取出操作系统内核中现成的数据,即利用DOS系统文件表(SYSTEMFILETABLE简称SFT)来实现防拷贝。当您打开硬盘上的一个文件并移动读写指针时.freele的"当前钥匙"*/unsignedlon
2、gcurentlocation-key(charfilename){unsignedlongsecc;intfilehandle;inti,iii,jjj1,jjj2;unsignedcharu-char=0;unsignedintu-int=0;unsignedlongu-long=0;unsignedintoffst1,segmnt1,offst2,segmnt2;voidpsp-ptrr;unsignedcharfarptrr1,ptrr2;FILEStream;Stream=fopen(filename,"r+b");if(Stream
3、==NULL){cputs("openerror");exit(1);}filehandle=fileno(Stream);//取文件句柄;fseek(Stream,6000,0);//将文件指针置于6000处;fread(i,2,1,.freel);//读一次,使DOS按此文件指针修正SFT;asmpushesasmmovah,51hasmint21h//取程序段前缀(PSP)段地址;asmmoves,bxasmmovax,movbx,axaxmmovax,moves,axasmaddbx,filehandle//文件句柄表中偏移fileha
4、ndle处的一字节;asmmoval,byteptres:bx//为该文件的SFT在SFT数组中的序号;asmxorah,ahasmpopesasmmoviii,ax//iii中存放文件的SFT在SFT数组中的序号;asmpushesasmmovah,52h//取DOS多重表指针;asmint21h//es为段地址,bx为偏移量;asmmovax,movoffst1,ax//offset1为第一个SFT数组控制块偏移量;asmmovax,movsegmnt1,ax//segment1为第一个SFT数组控制块段地址;asmmoves,segmnt
5、1asmmovbx,offst1asmmovax,movoffst2,ax//offset2为第二个SFT数组控制块偏移量;asmmovax,movsegmnt2,ax//segment2为第二个SFT数组控制块段地址;asmmovax,movjjj1,ax//jjj1中存放第一个SFT数组的项数,一般为五asmmoves,segmnt2//个(系统保留的五个常用文件的SFT);asmmovbx,offst2asmmovax,movjjj2,ax//jjj2中存放第二个SFT数组的项数,它一般等于asmpopes//CONFIG.SYS中FIL
6、ES=N的N值减去第一个SFT//数组中SFT项数jjj1;ptrr1=(unsignedcharfar*)MK-FP(segmnt1,offst1+6);//ptrr1指向第一个SFT数组中第一个SFTPtrr2=(unsignedcharfar*)MK-FP(segmnt2,offst2+6);//ptrr2指向第二个SFT数组中第一个SFTif(iiijjj1)//若该文件的SFT序号小于第一个SFT数组的项数,则它的SFT{//一定在第一个SFT数组中;//for(i=0;i0x3b;i++)//这两行可用来显示该文件的SFT;//pr
7、intf("%2x",ptrr1iii*0x3b+i);//在DOS4.0-6.0中共0x3b个字节;asmpushesasmpushdiasmlesbx,ptrr1//第0个SFT的地址;asmmovax,iiiasmmovcx,3bhasmmulcxasmmovdi,ax//第iii个SFT的地址,即要找的本文件的SFT;asmmovax,movmovax,movmoval,byteptres:bx+di+1fh//偏移1fH处是目录项的相对索引号,即目asmmovu-char,al//录项在目录扇区中的序号,也可用于定位//文件的位置,取
8、出存于u-char中;asmmovax,movu-int,ax//绝对簇号(2字节),取出存于u-int中;asmpopdiasmpopes}else