亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fatfs.c

?? 分享:Dos操作系統的源程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
		if(mode == XFR_WRITE && last_link(fnp))
			if(!extend(fnp))
			{
				dir_close(fnp);
				*err = DE_HNDLDSKFULL;
				return ret_cnt;
			}
#endif

		/* Compute the block within the cluster and the offset  */
		/* within the block.                                    */
		fnp -> f_sector =
		 (fnp -> f_offset / secsize) & fnp -> f_dpb -> dpb_clsmask;
		fnp -> f_boff = fnp -> f_offset % secsize;

#ifdef DSK_DEBUG
	printf("%d links; dir offset %ld, starting at cluster %d\n",
		fnp -> f_count,
		fnp -> f_diroff,
		fnp -> f_cluster);
#endif
		/* Do an EOF test and return whatever was transferred   */
		/* but only for regular files in XFR_READ mode          */
		if((mode == XFR_READ) && !(fnp -> f_flags.f_ddir)
		  && (fnp -> f_offset >= fnp -> f_dir.dir_size))
		{
			*err = SUCCESS;
			return ret_cnt;
		}
		
		/* Get the block we need from cache                     */
		bp = getblock(
			(LONG)clus2phys(fnp -> f_cluster,
				fnp -> f_dpb -> dpb_clssize,
				fnp -> f_dpb -> dpb_data) + fnp -> f_sector,
			fnp -> f_dpb -> dpb_unit);
		
		if(bp == (struct buffer *)0)
		{
			*err = DE_BLKINVLD;
			return ret_cnt;
		}

		/* transfer a block                                     */
		/* Transfer size as either a full block size, or the    */
		/* requested transfer size, whichever is smaller.       */
		/* Then compare to what is left, since we can transfer  */
		/* a maximum of what is left.                           */
		switch(mode)
		{
		case XFR_READ:
			if(fnp -> f_flags.f_ddir)
				xfr_cnt = min(to_xfer,
				 secsize - fnp -> f_boff);
			else
				xfr_cnt = min(min(to_xfer,
				 secsize - fnp -> f_boff),
				  fnp -> f_dir.dir_size - fnp -> f_offset);
			fbcopy((BYTE FAR *)&bp -> b_buffer[fnp -> f_boff],
			 buffer,
			  xfr_cnt);
			break;

#ifndef IPL
		case XFR_WRITE:
			xfr_cnt = min(to_xfer, secsize - fnp -> f_boff);
			fbcopy(buffer,
			 (BYTE FAR *)&bp -> b_buffer[fnp -> f_boff],
			  xfr_cnt);
			bp -> b_flag |= BFR_DIRTY;
			break;
#endif

		default:
			*err =  DE_INVLDACC;
			return ret_cnt;
		}

		/* update pointers and counters                         */
		ret_cnt += xfr_cnt;
		to_xfer -= xfr_cnt;
		fnp -> f_offset += xfr_cnt;
		buffer = add_far((VOID FAR *)buffer, (ULONG)xfr_cnt);
		if(mode == XFR_WRITE && (fnp -> f_offset > fnp -> f_highwater))
			fnp -> f_highwater = fnp -> f_offset;
	}
	*err = SUCCESS;
	return ret_cnt;
}

COUNT 
dos_read (COUNT fd, VOID FAR *buffer, UCOUNT count)
{
	COUNT err, xfr;

	xfr = rdwrblock(fd, buffer, count, XFR_READ, &err);
	return err != SUCCESS ? err : xfr;
}


#ifndef IPL
COUNT 
dos_write (COUNT fd, VOID FAR *buffer, UCOUNT count)
{
	REG struct f_node FAR *fnp;
	COUNT err, xfr;

	/* First test if we need to fill to new EOF.			*/

	/* Translate the fd into an fnode pointer, since all internal   */
	/* operations are achieved through fnodes.                      */
	fnp = xlt_fd(fd);

	/* If the fd was invalid because it was out of range or the     */
	/* requested file was not open, tell the caller and exit        */
	/* note: an invalid fd is indicated by a 0 return               */
	if(fnp == (struct f_node FAR *)0 || fnp -> f_count <= 0)
	{
		return DE_INVLDHNDL;
	}

	/* Future note: for security purposes, this should be set to	*/
	/* blocks of 0.  This satisfies spec and guarantees no secure	*/
	/* info is written to disk.					*/
	/* Also, with real memory management, this may cause a page	*/
	/* fault.							*/
	if(fnp -> f_offset > fnp -> f_highwater)
	{
		ULONG lCount = fnp -> f_offset - fnp -> f_highwater;

		while(lCount > 0)
		{
			rdwrblock(fd, buffer,
				lCount > 512l ? 512 : (UCOUNT)lCount,
				XFR_WRITE, &err);
			lCount -= 512;
		}
	}
	
	xfr = rdwrblock(fd, buffer, count, XFR_WRITE, &err);
	return err != SUCCESS ? err : xfr;
}
#endif


/* Position the file pointer to the desired offset                      */
/* Returns a long current offset or a negative error code               */
LONG 
dos_lseek (COUNT fd, LONG foffset, COUNT origin)
{
	REG struct f_node FAR *fnp;

	/* Translate the fd into a useful pointer                       */

	fnp = xlt_fd(fd);

	/* If the fd was invalid because it was out of range or the     */
	/* requested file was not open, tell the caller and exit                */
	/* note: an invalid fd is indicated by a 0 return               */

	if(fnp == (struct f_node FAR *)0 || fnp -> f_count <= 0)
		return (LONG)DE_INVLDHNDL;

	/* now do the actual lseek adjustment to the file poitner       */

	switch(origin)
	{
	/* offset from beginning of file                                */
	case 0:
		return fnp -> f_offset = (ULONG)foffset;

	/* offset from current location                                 */
	case 1:
		return fnp -> f_offset += foffset;

	/* offset from eof						*/
	case 2:
		return fnp -> f_offset = fnp -> f_highwater + foffset;

	/* default to an invalid function                               */
	default:
		return (LONG)DE_INVLDFUNC;
	}
}


UWORD 
dos_free (struct dpb *dpbp)
{
	/* There's an unwritten rule here. All fs       */
	/* cluster start at 2 and run to max_cluster+2  */
	REG UWORD i, cnt = 0;
	UWORD max_cluster = ((ULONG)dpbp -> dpb_size
			    * (ULONG)dpbp -> dpb_clssize - dpbp -> dpb_data + 1)
			    / dpbp -> dpb_clssize + 2; 
	
	if(dpbp -> dpb_nfreeclst != UNKNCLUSTER)
		return dpbp -> dpb_nfreeclst;
	else
	{
		for(i = 2; i < max_cluster; i++)
		{
			if(next_cluster(dpbp, i) == 0)
				++cnt;
		}
		dpbp -> dpb_nfreeclst = cnt;
		return cnt;
	}
}

VOID 
dos_pwd (struct dpb *dpbp, BYTE FAR *s)
{
	fsncopy((BYTE FAR *)&dpbp -> dpb_path[1], s, 64);
}

#ifndef IPL
COUNT 
dos_cd (struct dpb *dpbp, BYTE FAR *s)
{
	BYTE FAR *p;
	struct f_node FAR *fnp;

	/* Get the current directory so that we initialize all access   */
	/* relative to root.                                            */
	truename(s, PriPathName);

	/* now test for its existance. If it doesn't, return an error.  */
	/* If it does, copy the path to the current directory           */
	/* structure.                                                   */
	if((fnp = dir_open((BYTE FAR *)PriPathName)) == NULL)
		return DE_PATHNOTFND;
	else
	{
		dir_close(fnp);
		scopy(&PriPathName[2], dpbp -> dpb_path);
		return SUCCESS;
	}
}
#endif


struct f_node FAR *
get_f_node (void)
{
	REG i;
	
	for(i = 0; i < NFILES; i++)
	{
		if(f_nodes[i].f_count == 0)
		{
			++f_nodes[i].f_count;
			return &f_nodes[i];
		}
	}
	return (struct f_node FAR *)0;
}


VOID 
release_f_node (struct f_node FAR *fnp)
{
	if(fnp -> f_count > 0)
		--fnp -> f_count;
	else
		fnp -> f_count = 0;
}


#ifndef IPL
VOID 
dos_setdta (BYTE FAR *newdta)
{
	dta = newdta;
}


COUNT 
dos_getfattr (BYTE FAR *name, UWORD FAR *attrp)
{
	struct f_node FAR *fnp;
	COUNT fd;

	/* Translate the fd into an fnode pointer, since all internal   */
	/* operations are achieved through fnodes.                      */
	if((fd = dos_open(name, O_RDONLY)) < SUCCESS)
		return DE_FILENOTFND;
	/* note: an invalid fd is indicated by a 0 return               */
	if((fnp = xlt_fd(fd)) == (struct f_node FAR *)0)
		return DE_TOOMANY;

	/* If the fd was invalid because it was out of range or the     */
	/* requested file was not open, tell the caller and exit        */
	if(fnp -> f_count <= 0)
		return DE_FILENOTFND;

	/* Get the attribute from the fnode and return          */
	*attrp = fnp -> f_dir.dir_attrib;
	dos_close(fd);
	return SUCCESS;
}


COUNT 
dos_setfattr (BYTE FAR *name, UWORD FAR *attrp)
{
	struct f_node FAR *fnp;
	COUNT fd;

	/* Translate the fd into an fnode pointer, since all internal   */
	/* operations are achieved through fnodes.                      */
	if((fd = dos_open(name, O_RDONLY)) < SUCCESS)
		return DE_FILENOTFND;
	/* note: an invalid fd is indicated by a 0 return               */
	if((fnp = xlt_fd(fd)) == (struct f_node FAR *)0)
		return DE_TOOMANY;

	/* If the fd was invalid because it was out of range or the     */
	/* requested file was not open, tell the caller and exit        */
	if(fnp -> f_count <= 0)
		return DE_FILENOTFND;

	/* Set the attribute from the fnode and return          */
	fnp -> f_dir.dir_attrib = *attrp;
	fnp -> f_flags.f_dmod = TRUE;
	dos_close(fd);
	return SUCCESS;
}
#endif


COUNT 
media_check (REG struct dpb *dpbp)
{
	bpb FAR *bpbp;
	ULONG   size;
	REG     COUNT i;

	/* First test if anyone has changed the removable media         */
	FOREVER
	{
		MediaReqHdr.r_length = sizeof(request);
		MediaReqHdr.r_unit = dpbp -> dpb_subunit;
		MediaReqHdr.r_command = C_MEDIACHK;
		MediaReqHdr.r_mcmdesc = dpbp -> dpb_mdb;
		MediaReqHdr.r_status = 0;
		execrh((request FAR *)&MediaReqHdr, dpbp -> dpb_device);
		if(!(MediaReqHdr.r_status & S_ERROR) && (MediaReqHdr.r_status & S_DONE))
			break;
		else
		{
		loop1:
			switch(block_error(&MediaReqHdr, dpbp -> dpb_unit))
			{
			case ABORT:
			case FAIL:
				return DE_INVLDDRV;

			case RETRY:
				continue;

			case CONTINUE:
				break;

			default:
				goto loop1;
			}
		}
	}

	switch(MediaReqHdr.r_mcretcode | dpbp -> dpb_flags)
	{
	case M_NOT_CHANGED:
		/* It was definitely not changed, so ignore it          */
		return SUCCESS;

		/* If it is forced or the media may have changed,       */
		/* rebuild the bpb                                      */
	case M_DONT_KNOW:
		flush_buffers(dpbp -> dpb_unit);

		/* If it definitely changed, don't know (falls through) */
		/* or has been changed, rebuild the bpb.                */
	case M_CHANGED:
	default:
		setinvld(dpbp -> dpb_unit);
		FOREVER
		{
			MediaReqHdr.r_length = sizeof(request);
			MediaReqHdr.r_unit = dpbp -> dpb_subunit;
			MediaReqHdr.r_command = C_BLDBPB;
			MediaReqHdr.r_mcmdesc = dpbp -> dpb_mdb;
			MediaReqHdr.r_status = 0;
			execrh((request FAR *)&MediaReqHdr, dpbp -> dpb_device);
			if(!(MediaReqHdr.r_status & S_ERROR) && (MediaReqHdr.r_status & S_DONE))
				break;
			else
			{
			loop2:
				switch(block_error(&MediaReqHdr, dpbp -> dpb_unit))
				{
				case ABORT:
				case FAIL:
					return DE_INVLDDRV;

				case RETRY:
					continue;

				case CONTINUE:
					break;

				default:
					goto loop2;
				}
			}
		}
		bpbp = MediaReqHdr.r_bpptr;
		dpbp -> dpb_mdb = bpbp -> bpb_mdesc;
		dpbp -> dpb_secsize = bpbp -> bpb_nbyte;
		dpbp -> dpb_clssize = bpbp -> bpb_nsector;
		dpbp -> dpb_clsmask = bpbp -> bpb_nsector - 1;
		dpbp -> dpb_fatstrt = bpbp -> bpb_nreserved;
		dpbp -> dpb_fats = bpbp -> bpb_nfat;
		dpbp -> dpb_dirents = bpbp -> bpb_ndirent;
		size =  bpbp -> bpb_nsize == 0 ?
		 bpbp -> bpb_huge :
		 (ULONG)bpbp -> bpb_nsize;
		dpbp -> dpb_size = size / ((ULONG)bpbp -> bpb_nsector);
		dpbp -> dpb_fatsize = bpbp -> bpb_nfsect;
		dpbp -> dpb_dirstrt = dpbp -> dpb_fatstrt
			+ dpbp -> dpb_fats * dpbp -> dpb_fatsize + 1;
		dpbp -> dpb_data = dpbp -> dpb_dirstrt
			+ ((DIRENT_SIZE * dpbp -> dpb_dirents
			+ (dpbp -> dpb_secsize - 1))
			/ dpbp -> dpb_secsize);
		dpbp -> dpb_flags = 0;
		dpbp -> dpb_next = (struct dpb FAR *)-1;
		dpbp -> dpb_cluster = UNKNCLUSTER;
		dpbp -> dpb_nfreeclst = UNKNCLUSTER;
		for(i = 1, dpbp -> dpb_shftcnt = 0;
		 i < (sizeof(dpbp -> dpb_shftcnt) * 8); /* 8 bit bytes in C */
		 dpbp -> dpb_shftcnt++, i <<= 1)
		{
			if(i >= bpbp -> bpb_nsector)
				break;
		}
		return SUCCESS;
	}
}


/* translate the fd into an f_node pointer                              */

struct f_node FAR *
xlt_fd (COUNT fd)
{
	return fd > NFILES ? (struct f_node FAR *)0 : &f_nodes[fd];
}


COUNT 
xlt_fnp (struct f_node FAR *fnp)
{
	return fnp - f_nodes;
}


struct dhdr FAR *
select_unit (COUNT drive)
{
	/* Just get the header from the dhdr array                      */
	return blk_devices[drive].dpb_device;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美人妇做爰xxxⅹ性高电影| 亚洲视频一区二区在线| 国产在线一区观看| 欧美人牲a欧美精品| 久久精品国产一区二区三区免费看| 日韩三级伦理片妻子的秘密按摩| 九九热在线视频观看这里只有精品| 久久久精品影视| 色噜噜狠狠成人网p站| 五月天欧美精品| 久久午夜色播影院免费高清| a在线欧美一区| 日日欢夜夜爽一区| 精品不卡在线视频| 成人激情综合网站| 亚洲成a人片综合在线| 久久久久久久久久看片| 在线一区二区三区四区| 捆绑变态av一区二区三区| 国产精品久久久久国产精品日日| 欧美日韩另类国产亚洲欧美一级| 国产一区亚洲一区| 久久精品夜色噜噜亚洲a∨| 裸体一区二区三区| 国产精品久久久久三级| 欧美精品第1页| 成人av网在线| 久久国产福利国产秒拍| 亚洲精品一区在线观看| 97se亚洲国产综合自在线| 五月激情六月综合| 中文字幕亚洲综合久久菠萝蜜| 欧美一区二区免费视频| jlzzjlzz国产精品久久| 精品中文字幕一区二区| 一区二区三区不卡在线观看| 久久噜噜亚洲综合| 欧美日韩在线直播| 91在线视频免费91| 国产精品自拍av| 免播放器亚洲一区| 亚洲国产精品欧美一二99| 国产精品入口麻豆九色| 精品国产乱子伦一区| 欧洲另类一二三四区| 成人免费av网站| 狠狠久久亚洲欧美| 日本成人在线一区| 亚洲午夜在线电影| 亚洲色图制服丝袜| 国产精品视频在线看| 久久久美女毛片| 日韩视频在线一区二区| 欧美日韩aaaaaa| 在线免费亚洲电影| 日本黄色一区二区| 91小视频免费观看| 99热99精品| 成人国产一区二区三区精品| 久久精品999| 久久99精品一区二区三区| 午夜av一区二区三区| 午夜电影一区二区三区| 亚洲成a人片综合在线| 亚洲亚洲精品在线观看| 亚洲尤物在线视频观看| 亚洲精品中文在线影院| 亚洲色图视频网| 亚洲精品免费看| 亚洲午夜久久久久久久久久久| 亚洲免费观看高清完整版在线 | 亚洲精品成a人| 椎名由奈av一区二区三区| 日韩一区在线播放| 成人免费在线观看入口| 亚洲色大成网站www久久九九| 中文字幕一区免费在线观看| 中文字幕欧美一| 亚洲欧美福利一区二区| 亚洲午夜一区二区三区| 日韩中文字幕麻豆| 激情欧美日韩一区二区| 国内精品久久久久影院薰衣草 | 久久久久久久av麻豆果冻| 精品国产乱码久久久久久闺蜜| 精品国产一区二区三区久久久蜜月| 久久综合网色—综合色88| 国产日本欧洲亚洲| 亚洲免费在线观看| 视频在线观看一区| 国产毛片精品视频| 99久久国产综合精品色伊| 欧美在线视频不卡| 日韩欧美二区三区| 国产清纯白嫩初高生在线观看91 | 久久久久久久综合| 亚洲色欲色欲www在线观看| 亚洲国产视频a| 久久国产精品免费| www.爱久久.com| 欧美系列日韩一区| 欧美变态tickling挠脚心| 国产精品三级久久久久三级| 亚洲成av人片一区二区梦乃| 国产一区二三区| 91官网在线观看| 精品国产乱码久久久久久图片| 国产精品久久久久久久蜜臀| 午夜精品久久久久久久久| 日本亚洲天堂网| 99国产精品国产精品久久| 91麻豆精品国产91久久久久| 亚洲国产经典视频| 日本欧美在线观看| av一二三不卡影片| 日韩欧美一二区| 亚洲伦理在线精品| 狠狠色狠狠色综合日日91app| 色老头久久综合| 国产日韩成人精品| 日韩高清一区在线| 91在线无精精品入口| 精品国产一二三| 午夜激情久久久| 97久久超碰精品国产| 久久婷婷色综合| 日韩国产一区二| 欧美亚洲国产怡红院影院| 国产亚洲一区字幕| 另类人妖一区二区av| 欧美性视频一区二区三区| 国产精品色哟哟网站| 久久不见久久见免费视频1| 欧美在线一区二区三区| 亚洲国产精品传媒在线观看| 另类成人小视频在线| 欧美猛男超大videosgay| 亚洲人成网站精品片在线观看 | 亚洲视频一区在线观看| 国产毛片精品视频| 日韩欧美色综合网站| 午夜视黄欧洲亚洲| 欧美在线制服丝袜| 日韩理论片一区二区| 成人精品国产一区二区4080| 精品91自产拍在线观看一区| 日韩av一区二区在线影视| 欧美专区日韩专区| 一区二区国产视频| 色一情一乱一乱一91av| 国产精品免费视频观看| 国产suv一区二区三区88区| 亚洲精品在线观| 国产综合色精品一区二区三区| 91精品国产高清一区二区三区| 亚洲国产精品一区二区www在线| 色综合天天天天做夜夜夜夜做| 中文字幕精品一区二区三区精品| 黄页视频在线91| 精品国产成人在线影院 | 欧美日韩久久久久久| 久久99国产精品免费| 国产伦精品一区二区三区免费 | 91网站在线观看视频| 国产精品免费av| 国产精品一级片| 久久久久亚洲蜜桃| 国产99精品国产| 国产精品美女久久久久aⅴ| 粉嫩一区二区三区性色av| 国产精品情趣视频| 99久久久国产精品| 一区二区三区成人| 欧美人狂配大交3d怪物一区| 石原莉奈在线亚洲二区| 91精品国产免费| 国内成人精品2018免费看| 日韩美女视频一区二区在线观看| 久久99精品久久久久久| 国产偷国产偷亚洲高清人白洁| 福利视频网站一区二区三区| 一色屋精品亚洲香蕉网站| 欧洲另类一二三四区| 午夜精品久久久久久| 日韩视频永久免费| 成人一级片网址| 中文字幕日韩欧美一区二区三区| 成人视屏免费看| 亚洲精选免费视频| 欧美电影一区二区三区| 国产一区二三区| 亚洲精品国产一区二区精华液| 欧美日韩一区二区在线视频| 蜜臀av性久久久久蜜臀aⅴ| 国产欧美精品在线观看| 色av一区二区| 狠狠色丁香久久婷婷综合_中| 国产精品美女一区二区在线观看| 欧美视频精品在线| 国产毛片精品一区|