dosh详解.docx
《dosh详解.docx》由会员分享,可在线阅读,更多相关《dosh详解.docx(54页珍藏版)》请在冰豆网上搜索。
![dosh详解.docx](https://file1.bdocx.com/fileroot1/2023-4/16/898c29af-6590-41ae-88f4-81735c7f8688/898c29af-6590-41ae-88f4-81735c7f86881.gif)
dosh详解
Dos.h函数详解
@函数名称:
absread
函数原型:
intabsread(intdrive,intnsects,intsectnum,void*buffer)
函数功能:
对磁盘扇区读数据
函数返回:
0-操作成功,其他-操作失败
参数说明:
driver-读取的驱动器号0-表示驱动器A,以此类推
sectnum-读取的扇区号
nsects-读取的扇区数
所属文件:
#include
#include
#include
#include
intmain()
{
inti,strt,ch_out,sector;charbuf[512];
printf("InsertadisketteintodriveAandpressanykey");
getch();
sector=0;
if(absread(0,1,sector,&buf)!
=0)
{
perror("Diskproblem");
exit
(1);
}
printf("ReadOK");
strt=3;
for(i=0;i<80;i++)
{
ch_out=buf[strt+i];
putchar(ch_out);
}
printf("\n");
return(0);
}
@函数名称:
abswrite
函数原型:
intabswrite(intdrive,intnsects,intsectnum,void*buffer)
函数功能:
对磁盘扇区写数据
函数返回:
0-操作成功,其他-操作失败
参数说明:
driver-写入的驱动器号
sectnum-写入的扇区号
nsects-写入的扇区数
buf-写入内容
所属文件:
#include
#include
unsignedcharbuff[512];
/*此程企图将FAT区和ROOT区清空从而快速格式化磁盘*/
intmain()
{
inti;charc;
printf("QuickFormat1.44MB");
printf("ALLDATAINTHEFLOPPYDISKWILLBELOST!
!
");
printf("InsertadiskettefordriveA:
");
printf("andpressENTERwhenready...");c=getchar();
printf("CleaningFATarea...");
buff[0]=0xf0;buff[1]=buff[2]=0xff;
for(i=3;i<512;i++)buff=0;
abswrite(0,1,1,buff);
abswrite(0,1,10,buff);
for(i=0;i<512;i++)buff=0;
for(i=2;i<10;i++)abswrite(0,1,i,buff);
for(i=11;i<19;i++)abswrite(0,1,i,buff);
printf("CleaningROOTarea...");
for(i=19;i<33;i++)abswrite(0,1,i,buff);
printf("QuickFormatCompleted!
");
return0;
}
@函数名称:
allocmem
函数原型:
intallocmem(unsignedsize,unsigned*seg)
函数功能:
按节(16字节)分配内存块
函数返回:
-1:
分配成功,其他数值:
实际分配的节数
参数说明:
size-分配的节数,seg-分配后的段地址
所属文件:
#include
#include
#include
intmain()
{
unsignedintsize,segp;
intstat;
size=64;/*(64x16)=1024bytes*/
stat=allocmem(size,&segp);
if(stat==-1)
printf("Allocatedmemoryatsegment:
%x",segp);
else
printf("Failed:
maximumnumberofparagraphsavailableis%u",stat);
return0;
}
@函数名称:
bdos
函数原型:
intbdos(intfnum,unsigneddx,unsignedal)
函数功能:
执行DOS系统调用INT21H
函数返回:
寄存器AX的值
参数说明:
fnum-系统调用号,dx,al-赋给DX,AL寄存器的值
所属文件:
#include
#include
charcurrent_drive(void)
{
charcurdrive;
curdrive=bdos(0x19,0,0);
return('A'+curdrive);
}
intmain()
{
printf("Thecurrentdriveis%c:
",current_drive());
return0;
}
@函数名称:
country
函数原型:
structcountry*country(intcountrycode,structcountry*countryptr)
函数功能:
用于设置一些与国家相关的项目,如货币,时间日期的表示方式等
函数返回:
国家相关信息
参数说明:
结构定义:
structcountry{
intco_date;/*日期格式*/
charco_curr[5];/*货币符号*/
charco_thsep[2];/*数字分隔符*/
charco_desep[2];/*小数点*/
charco_dtsep[2];/*日期分隔符*/
charco_tmsep[2];/*时间分隔符*/
charco_currstyle;/*货币形式*/
charco_digits;/*有效数字*/
int(far*co_case)();/*事件处理函数*/
charco_dasep;/*数据分隔符*/
charco_fill[10];/*补充字符*/
}
所属文件:
#include
#include
#defineUSA0
intmain()
{
structCOUNTRYcountry_info;
country(USA,&country_info);
printf("ThecurrencysymbolfortheUSAis:
%s",country_info.co_curr);
return0;
}
@函数名称:
ctrlbrk
函数原型:
voidctrlbrk(int(*pfun)(vpod))
函数功能:
设置当Ctrl-Break组合键按下时,应执行的函数
函数返回:
参数说明:
pfun-要执行的函数指针,该函数应返回0值
所属文件:
#include
#include
#defineABORT0
intc_break()
{
printf("Control-Breakpressed.Programaborting...");
return(ABORT);
}
intmain()
{
ctrlbrk(c_break);
for(;;)
printf("Looping...Presstoquit:
");
return0;
}
@函数名称:
dosexterr
函数原型:
intdosexterr(structDOSERR*err)
函数功能:
得到DOS扩展调用失败时的错误信息
函数返回:
错误信息保存在err结构中
参数说明:
err-用于保存错误信息的结构指针
关于DOSextendederror代码(即:
structDOSERR.exterror)各系统差别极大,不一一列出
所属文件:
#include
#include
intmain()
{
FILE*fp;
structDOSERRORinfo;
fp=fopen("perror.dat","r");
if(!
fp)perror("Unabletoopenfileforreading");
dosexterr(&info);
printf("ExtendedDOSerrorinformation:
\n");
printf("Extendederror:
%d\t",info.exterror);
printf("Class:
%x\n",info.class);
printf("Action:
%x\t",info.action);
printf("ErrorLocus:
%x\n",info.locus);
return0;
}
@函数名称:
getcbrk
函数原型:
intgetcbrk(void)
函数功能:
检测对Ctrl-Break按下的检测是否允许
函数返回:
0-允许检测,1-不允许检测
参数说明:
所属文件:
#include
#include
intmain()
{
if(getcbrk())
printf("Cntrl-brkflagison");
else
printf("Cntrl-brkflagisoff");
return0;
}
@函数名称:
getdate
函数原型:
voidgetdate(structdate*d)
函数功能:
得到系统日期
函数返回:
参数说明:
d存放得到的日期信息
所属文件:
#include
#include
intmain()
{
structdated;
getdate(&d);
printf("Thecurrentyearis:
%d",d.da_year);
printf("Thecurrentdayis:
%d",d.da_day);
printf("Thecurrentmonthis:
%d",d.da_mon);
return0;
}
@函数名称:
setdate
函数原型:
voidsetdate(structdate*datep)
函数功能:
设置DOS日期
函数返回:
参数说明:
datep-要设置的日期数值,structdate定义格式如下:
structdate{
intda_year;
charda_day;
charda_mon;
};
所属文件:
#include
#include
#include
intmain()
{
structdatereset;
structdatesave_date;
getdate(&save_date);
printf("Originaldate:
");
system("date");
reset.da_year=2001;
reset.da_day=1;
reset.da_mon=1;
setdate(&reset);
printf("Dateaftersetting:
");
system("date");
setdate(&save_date);
printf("Backtooriginaldate:
");
system("date");
return0;
}
@函数名称:
settime
函数原型:
voidsettime(structtime*timep)
函数功能:
设置DOS时间
函数返回:
参数说明:
timep-要设置的时间数值,structtime定义格式如下:
structtime{
unsignedcharti_min;
unsignedcharti_hour;
unsignedcharti_hund;
unsignedcharti_sec;
};
所属文件:
#include
#include
intmain()
{
structtimet;
gettime(&t);
printf("Thecurrentminuteis:
%d",t.ti_min);
printf("Thecurrenthouris:
%d",t.ti_hour);
printf("Thecurrenthundredthofasecondis:
%d",t.ti_hund);
printf("Thecurrentsecondis:
%d",t.ti_sec);
t.ti_min++;
settime(&t);
return0;
}
@函数名称:
gettime
函数原型:
voidgettime(structdate*t)
函数功能:
得到系统时间
函数返回:
参数说明:
d存放得到的日期信息
所属文件:
#include
#include
intmain()
{
structtimet;
gettime(&t);
printf("Thecurrenttimeis:
%2d:
%02d:
%02d.%02d",t.ti_hour,t.ti_min,t.ti_sec,t.ti_hund);
return0;
}
@函数名称:
getdfree
函数原型:
voidgetdfree(intdrive,structdfree*dfptr)
函数功能:
得到驱动器的剩余磁盘空间
函数返回:
以结构返回:
structdfree{
unsigneddf_avail;/*可用簇数*/
unsigneddf_total;/*总簇数*/
unsigneddf_bsec;/*每扇区字节数*/
unsigneddf_sclus;/*每簇扇区数*/
}
参数说明:
drive-驱动器号:
1-A盘,2-B盘……
所属文件:
#include
#include
#include
#include
intmain()
{
structdfreefree;
longavail;
intdrive;
drive=getdisk();
getdfree(drive+1,&free);
if(free.df_sclus==0xFFFF)
{
printf("Erroringetdfree()call\n");
exit
(1);
}
avail=(long)free.df_avail*(long)free.df_bsec*(long)free.df_sclus;
printf("Drive%c:
has%ldbytesavailable\n",'A'+drive,avail);
return0;
}
@函数名称:
setdta
函数原型:
voidsetdta(charfar*dta)
函数功能:
设置DTA(磁盘传送区)地址
函数返回:
参数说明:
dta-缓冲区地址指针
所属文件:
#include
#include
#include
#include
intmain()
{
charline[80],far*save_dta;
charbuffer[256]="SETDTAtest!
";
structfcbblk;
intresult;
/*getnewfilenamefromuser*/
printf("Enterafilenametocreate:
");
gets(line);
/*passthenewfilenametothedta*/
parsfnm(line,&blk,1);
printf("%d%s\n",blk.fcb_drive,blk.fcb_name);
/*requestDOSservicestocreatefile*/
if(bdosptr(0x16,&blk,0)==-1)
{
perror("Errorcreatingfile");
exit
(1);
}
/*saveolddtaandsetnewdta*/
save_dta=getdta();
setdta(buffer);
/*writenewrecords*/
blk.fcb_recsize=256;
blk.fcb_random=0L;
result=randbwr(&blk,1);
printf("result=%d\n",result);
if(!
result)
printf("WriteOK\n");
else
{
perror("Diskerror");
exit
(1);
}
/*requestDOSservicestoclosethefile*/
if(bdosptr(0x10,&blk,0)==-1)
{
perror("Errorclosingfile");
exit
(1);
}
/*resettheolddta*/
setdta(save_dta);
return0;
}
@函数名称:
getdta
函数原型:
charfar*getdta(void)
函数功能:
得到磁盘传送地址(DTA)的指针
函数返回:
磁盘传送地址(DTA)的指针
参数说明:
所属文件:
#include
#include
intmain()
{
charfar*dta;
dta=getdta();
printf("Thecurrentdisktransferaddressis:
%Fp",dta);
return0;
}
@函数名称:
getfat
函数原型:
voidgetfat(intdrive,structfatinfo*fptr)
函数功能:
得到磁盘驱动器的信息
函数返回:
参数说明:
drive-驱动器号:
1-A盘,2-B盘,以此类推.fptr-磁盘驱动器的信息
所属文件:
#include
#include
intmain()
{
structfatinfodiskinfo;
intflag=0;
printf("leaseinsertdiskindriveA");
getchar();
getfat(1,&diskinfo);
printf("DriveA:
is");
switch((unsignedchar)diskinfo.fi_fatid)
{
case0xFD:
printf("360Klowdensity");break;
case0xF9:
printf("1.2Meghighdensity");break;
default:
printf("unformatted");flag=1;
}
if(!
flag)
{
printf("sectorspercluster%5d",diskinfo.fi_sclus);
printf("numberofclusters%5d",diskinfo.fi_nclus);
printf("bytespersector%5d",diskinfo.fi_bysec);
}
return0;
}
@函数名称:
getfatd
函数原型:
voidgetfatd(structfatinfo*fptr)
函数功能:
得到缺省驱动磁盘驱动器的信息
函数返回:
参数说明:
fptr-磁盘驱动器的信息
所属文件:
#include
#include
intmain()
{
structfatinfodiskinfo;
intflag=0;
printf("leaseinsertdiskindriveA");
getchar();
getfat(1,&diskinfo);
printf("DriveA:
is");
switch((unsignedchar)diskinfo.fi_fatid)
{
case0xFD:
printf("360Klowdensity");break;
case0xF9:
printf("1.2Meghighdensity");break;
default:
printf("unformatted");flag=1;
}
if(!
flag)
{
printf("sectorspercluster%5d",diskinfo.fi_sclus);
printf("numberofclusters%5d",diskinfo.fi_nclus);
printf("bytespersector%5d",diskinfo.fi_bysec);
}
return0;
}
@函数名称:
getpsp
函数原型:
unsignedgetpsp(void)
函数功能:
得到程序段前缀PSP的段地址(dos3.0的产物)
函数返回:
PSP的段地址
参数说明:
所属文件:
include
#include
intmain()
{
staticcharcommand[128];
charfar*cp;
intlen,i;
printf("Theprogramsegmentprefixis:
%u\n",getpsp());
/*_pspispresettosegmentofthePSP
Commandlineislocatedatoffset