⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskio.c

📁 T-kernel 的extension源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
					MAP_FSTSK, mid, fsinfo);	setSyncAtExit(SAE_FSTSK, fsinfo);	return (DfFileHeaderBlock*)mapadr;err_ret:	DEBUG_PRINT(("fmpMapFileHeader err = %d\n", *mid));	return NULL;}/* ======================================================================== *//* * File system format and endian check *	Normal return value (>=0) *	bit 0 (LSB)  -  15	File system format *	bit 16			Endian format (1 when big endian) *	bit 17  -  31 (MSB)	Always 0. *	Return value when the format is abnormal. *	E_ILFMT */EXPORT WER fmCheckDiskFormat( DfSystemHeader *sh ){	W	diskform = E_ILFMT;	if ( (sh->fsid == StdfsDiskMagic)	  || (sh->fsid == StdfsDiskMagic_E) ) {		switch ( sh->diskid ) {		  case StdfsDiskID_A:		/* STDFS standard format */		  case StdfsDiskID_A2:		/* STDFS standard format (HD) */			diskform = TSD_FCD_SFT_MC1 | DiskForm_A;			break;		  case StdfsDiskID_B:		/* STDFS extended format 1 */			diskform = TSD_FCD_SFT_MC1 | DiskForm_B;			break;		  case StdfsDiskID_C:		/* STDFS extended format 2 */			diskform = TSD_FCD_SFT_MC1 | DiskForm_C;			break;		  default:			/* nothing to do */			break;		}	}	if ( (sh->fsid == swapH(StdfsDiskMagic))	  || (sh->fsid == swapH(StdfsDiskMagic_E)) ) {		switch ( swapH(sh->diskid) ) {		  case StdfsDiskID_A:		/* STDFS standard format */		  case StdfsDiskID_A2:		/* STDFS standard format (HD) */			diskform = TSD_FCD_SFT_MC2 | DiskForm_A;			break;		  case StdfsDiskID_B:		/* STDFS extended format 1 */			diskform = TSD_FCD_SFT_MC2 | DiskForm_B;			break;		  case StdfsDiskID_C:		/* STDFS extended format 2 */			diskform = TSD_FCD_SFT_MC2 | DiskForm_C;			break;		  default:			/* nothing to do */			break;		}	}	return diskform;}/* * Disk mapping (for common section task) */LOCAL VP fmcMapPhyBlks( PhyBlk padr[], DiskMapInfo *dmInfo, ID_ERR *mid ){	MapMode		mode = FmTskMapMode;	ER		err;	mode.info = (VW)MAP_FMTSK;	*mid = err = MapDisk(dmInfo->dskid, padr, &mode);	if ( err < E_OK ) {		if ( err == E_TMOUT ) {			*mid = E_SYSMEM;		}		DEBUG_PRINT(("fmcMapPhyBlks err = %d\n", err));		return NULL;	}	return mode.addr;}/* * Map the one logical block. */LOCAL VP fmcMapLogBlk( UW lblk, W sblk, DiskMapInfo *dmInfo, ID_ERR *mid ){	PhyBlk		pblk[TSD_DIO_BLK_2];	W		blkRatio;	blkRatio = sblk / dmInfo->dskInfo.blocksize;	pblk[0].blk = (lblk * (UW)blkRatio) + (UW)dmInfo->pbadj;	pblk[0].len = (UW)blkRatio;	pblk[1].len = 0;	return fmcMapPhyBlks(pblk, dmInfo, mid);}/* * Find the file system header and set the DiskMapInfo. */LOCAL ER fmcScanFileSystemHeader( DiskMapInfo *dmInfo, PhyBlk pblk[TSD_DIO_BLK_2] ){	static const UW	bootsz[] = StdBootBlkSizeList;#define	N_BOOTSZ	( sizeof(bootsz)/sizeof(UW) )	DfSystemHeader	*sh = NULL;	ID		mid;	W		i;	FsSpec		fsspec;	ER		err;	/*	 * Retrieve the boot block size.	 *	Try several sizes.	 */	for ( i = 0; i < (W)N_BOOTSZ; ++i ) {		if ( (UW)dmInfo->dskInfo.blocksize > bootsz[i] ) {			continue;		}		/* Location of the system header */		pblk[0].blk = bootsz[i] / (UW)dmInfo->dskInfo.blocksize;		pblk[0].len = ((sizeof(DfSystemHeader) - 1)					/ (UW)dmInfo->dskInfo.blocksize) + 1;		pblk[1].len = 0;		/* Map the system header. */		sh = fmcMapPhyBlks(pblk, dmInfo, &mid);		if ( sh == NULL ) {			err = (ER)mid;			goto err_ret;		}		/* Check the disk format. */		err = fmCheckDiskFormat(sh);		if ( err >= 0 ) {			/* OK: Set the file system format and endian format. */			dmInfo->diskform = DiskFormVersion(err);			dmInfo->big      = DiskFormEndian(err);			break;		}		(void)fmcUnmapDisk(mid, MD_RDONLY);	}	if ( i >= (W)N_BOOTSZ ) {		err = E_ILFMT;		goto err_ret;	}	/* Correction value for computing the physical block number	   Correction value when the boot block size and logical block size are not equal. */	dmInfo->pbadj =		((W)bootsz[i] - (W)fmConvEndianH(sh->sblk, dmInfo->big))						/ dmInfo->dskInfo.blocksize;#if !MisalignLogBlk	if ( dmInfo->pbadj != 0 ) {		(void)fmcUnmapDisk(mid, MD_RDONLY);		err = E_ILFMT;		goto err_ret;	}#endif	/* Notify the segment management of the file system information. */	fsspec.lbsz = fmConvEndianH(sh->sblk, dmInfo->big);	fsspec.btsz = (UH)bootsz[i];	(void)fmcUnmapDisk(mid, MD_RDONLY);	err = InformFS(dmInfo->dskid, &fsspec);	if ( err < E_OK ) {		if ( err == E_BUSY ) {			err = E_SYS;		}		goto err_ret;	}	return E_OK;err_ret:	DEBUG_PRINT(("fmcScanFileSystemHeader err = %d\n", err));	return err;}/* * Map the file system header. *	Check also the disk format when the file system is not connected. */EXPORT DfSystemHeader* fmcMapFileSystemHeader( DiskMapInfo *dmInfo,						FsInfo *fsinfo, ID_ERR *mid ){	PhyBlk		pblk[TSD_DIO_BLK_2];	DfSystemHeader	*sh;	ER		err;	if ( fsinfo == NULL ) {		/* The file system is not connected. */		err = fmcScanFileSystemHeader(dmInfo, pblk);		if ( err < E_OK ) {			goto err_ret;		}	} else {		/* The file system has already connected. */		dmInfo->big = fsinfo->bigEndian;		dmInfo->pbadj = fsinfo->pbadj;		/* Location of the system header */		pblk[0].blk = fsinfo->blkRatio + (UW)dmInfo->pbadj;		pblk[0].len = ((sizeof(DfSystemHeader) - 1U)					/ (UW)dmInfo->dskInfo.blocksize) + 1U;		pblk[1].len = 0;	}	/* Map the file system header. */	sh = fmcMapPhyBlks(pblk, dmInfo, mid);	if ( sh == NULL ) {		err = (ER)*mid;		goto err_ret;	}	return sh;err_ret:	DEBUG_PRINT(("fmcMapFileSystemHeader err = %d\n", err));	*mid = err;	return NULL;}/* * Map the root file header. */EXPORT DfFileHeader* fmcMapRootFileHeader( DfSystemHeader *sh,					DiskMapInfo *dmInfo, ID_ERR *mid ){	W		ssys, sblk;	DfFileID	*fidt, f;	DfFileHeader	*fh;	ER		err;	/* Logical block size */	sblk = (W)fmConvEndianH(sh->sblk, dmInfo->big);	/* System block size */	ssys = (W)fmConvEndianH(sh->ssys, dmInfo->big);	/* Map the file ID table. */	fidt = fmcMapLogBlk((UW)(ssys + 1), sblk, dmInfo, mid);	if ( fidt == NULL ) {		err = (ER)*mid;		goto err_ret;	}	/* Obtain the file header block address. */	f = fmConvEndianFileID(*fidt, dmInfo->big);	err = fmcUnmapDisk(*mid, MD_RDONLY);	if ( err < E_OK ) {		goto err_ret;	}	/* Map the file header. */	fh = fmcMapLogBlk(f.s.blkadr, sblk, dmInfo, mid);	if ( fh == NULL ) {		err = (ER)*mid;		goto err_ret;	}	return fh;err_ret:	DEBUG_PRINT(("fmcMapRootFileHeader err = %d\n", err));	*mid = err;	return NULL;}/* * Map the root file abbreviated name. */EXPORT DfShortName* fmcMapRootFileShortName( DfSystemHeader *sh,					DiskMapInfo *dmInfo, ID_ERR *mid ){	W		sblk, ssys, sfidt;	DfShortName	*sfnt;	ER		err;	/* Logical block size */	sblk = (W)fmConvEndianH(sh->sblk, dmInfo->big);	/* System block size */	ssys = (W)fmConvEndianH(sh->ssys, dmInfo->big);	/* File ID table size */	sfidt = (W)fmConvEndianH(sh->sfidt, dmInfo->big);	/* Map the first one block of the file abbreviated name table. */	sfnt = fmcMapLogBlk((UW)(ssys + sfidt + 1), sblk, dmInfo, mid);	if ( sfnt == NULL ) {		err = (ER)*mid;		goto err_ret;	}	return sfnt;err_ret:	DEBUG_PRINT(("fmcMapRootFileShortName err = %d\n", err));	*mid = err;	return NULL;}/* ======================================================================== */#if !USE_DEVICE_MANAGERLOCAL UB devname[L_DEVNM + 1];#endif/* * Check the disk partition information. */EXPORT ER fmCheckPartitionID( DevName devnm ){	DiskPartInfo	info;	W		dd, asz;	ER		err, chk;#if USE_DEVICE_MANAGER	dd = tkse_opn_dev2(devnm, D_READ, NULL);	if ( dd < E_OK ) {		err = dd;		goto err_ret1;	}	err = tkse_rea_dev2(dd, DN_DISKPARTINFO, (B*)&info, sizeof(info),							&asz, NULL);	if ( err < E_OK ) {		if ( !((err == E_NOSPT) || (err == E_PAR)) ) {			goto err_ret2;		}		chk = E_OK;	} else {		chk = isSTDFS_SID(info.systemid)? E_OK: E_ILFMT;	}	err = tkse_cls_dev2(dd, 0, NULL);	if ( err < E_OK ) {		goto err_ret1;	}#else	/* Convert the device name. TC -> ASCII */	if ( tcstoeucs(NULL, devnm) > L_DEVNM	  || tcstoeucs(devname, devnm) < 0 ) {		err = E_PAR;		goto err_ret1;	}	/* Disk connection */	dd = tk_opn_dev(devname, TD_READ);	if ( dd < E_OK ) {		err = ERtoERR(dd);		goto err_ret1;	}	/* Obtain the disk information. */	err = tk_srea_dev(dd, DN_DISKPARTINFO, (B*)&info,			  sizeof(info), &asz);	if ( err < E_OK ) {		err = ERtoERR(err);		if ( !((err == E_NOSPT) || (err == E_PAR)) ) {			goto err_ret2;		}		chk = E_OK;	} else {		chk = isSTDFS_SID(info.systemid)? E_OK: E_ILFMT;	}	err = tk_cls_dev(dd, 0);	if ( err < E_OK ) {		err = ERtoERR(err);		goto err_ret1;	}#endif	return chk;err_ret2:#if USE_DEVICE_MANAGER	(void)tkse_cls_dev2(dd, 0, NULL);#else	(void)tk_cls_dev(dd, 0);#endiferr_ret1:	DEBUG_PRINT(("fmCheckPartitionID err = %d\n", err));	return err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -