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

📄 msdos_super.c

📁 阿基米德操作系统的源代码
💻 C
字号:
#include "general.h"

#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"

#include "common_head.h"
//////////////////////////////////////////////////////////////////////
int	msdos_read_super(void)
{
	struct buffer_head * temp_buffer;
	int	temp_block;
	int	temp_flag;
	union {
		unsigned char  * temp_pChar;
		unsigned short * temp_pShort;
	} u;

	temp_buffer = start_buffer;
	for (temp_block = 0; temp_block < 17; temp_block++)
	{
		if (temp_buffer->b_next)
			temp_buffer->b_next->b_prev = temp_buffer->b_prev;
		if (temp_buffer->b_prev)
			temp_buffer->b_prev->b_next = temp_buffer->b_next;
		if (hash_table[temp_buffer->b_blocknr % NR_HASH] == temp_buffer)
			hash_table[temp_buffer->b_blocknr % NR_HASH] = temp_buffer->b_next;
		temp_buffer->b_prev = NULL;
		temp_buffer->b_next = NULL;
		temp_buffer++;
	}

	temp_buffer = sys_buffer;
	while (temp_buffer < end_buffer)
	{
		if ((temp_buffer->b_dev == 0) && (temp_buffer->b_count == 0))
		{
			while (temp_buffer->b_lock);
			
			if (temp_buffer->b_dirt == 0)
			{
				if (temp_buffer->b_next)
					temp_buffer->b_next->b_prev = temp_buffer->b_prev;
				if (temp_buffer->b_prev)
					temp_buffer->b_prev->b_next = temp_buffer->b_next;
				if (hash_table[temp_buffer->b_blocknr % NR_HASH] == temp_buffer)
					hash_table[temp_buffer->b_blocknr % NR_HASH] = temp_buffer->b_next;
				temp_buffer->b_prev = NULL;
				temp_buffer->b_next = NULL;
			}
		}
		temp_buffer++;
	}

	temp_buffer	= start_buffer;
	temp_flag	= 1;
	for (temp_block = 0; temp_block < 17; temp_block++)
	{
		temp_buffer = msdos_raw_rblock(temp_buffer);
		if (temp_buffer == NULL)
		{
			temp_flag = 0;
			break;
		}
		temp_buffer++;
	}

	if (temp_flag)
	{
		temp_buffer	 = start_buffer;
		u.temp_pChar = temp_buffer->b_data + 0x0b;
		if ((*u.temp_pShort++ != 0x0200) ||
			(*u.temp_pChar++  != 0x01)   ||
			(*u.temp_pShort++ != 0x0001) ||
			(*u.temp_pChar++  != 0x02)   ||
			(*u.temp_pShort++ != 0x00e0) ||
			(*u.temp_pShort++ != 0x0b40) ||
			(*u.temp_pChar++  != 0xf0)   ||
			(*u.temp_pShort++ != 0x0009) ||
			(*u.temp_pShort++ != 0x0012) ||
			(*u.temp_pShort++ != 0x0002) ||
			(*u.temp_pShort++ != 0x0000))
			temp_flag = 0;
		u.temp_pChar = temp_buffer->b_data + 510;
		if ((*u.temp_pChar++ != 0x55) ||
			(*u.temp_pChar++ != 0xaa))
			temp_flag = 0;

		u.temp_pChar = temp_buffer->b_data + 512;
		if ((u.temp_pChar[0] != 0xf0) ||
			(u.temp_pChar[1] != 0xff) ||
			(u.temp_pChar[2] != 0xff))
			temp_flag = 0;
		
		u.temp_pChar = temp_buffer->b_data + 512 * 10;
		if ((u.temp_pChar[0] != 0xf0) ||
			(u.temp_pChar[1] != 0xff) ||
			(u.temp_pChar[2] != 0xff))
			temp_flag = 0;
	}

	temp_buffer = start_buffer;
	if (temp_flag)
	{
		for (temp_block = 0; temp_block < 17; temp_block++)
		{
			temp_buffer->b_next = hash_table[temp_buffer->b_blocknr % NR_HASH];
			hash_table[temp_buffer->b_blocknr % NR_HASH] = temp_buffer;
			if (temp_buffer->b_next)
				temp_buffer->b_next->b_prev = temp_buffer;
			temp_buffer++;
		}
	}
	else
	{
		for (temp_block = 0; temp_block < 17; temp_block++)
		{
			temp_buffer->b_uptodate = temp_buffer->b_uptodate & 0xfe;
			temp_buffer->b_dirt		= 0;
			temp_buffer++;
		}
		floppy_workstate = -1;
	}

	return temp_flag;
	///////////////////////////////////////////////////////////////////////////////////
}

void invalid_fd(int invalid_flag)
{
	struct buffer_head * temp_buffer;
	struct m_inode * temp_inode;
	int temp_i;

	if (current_driver == 0)
	{
		current_pwd->i_count--;
		current_root->i_count++;
		current_pwd = current_root;
		current_pwd_pathlength = 2;
	}
	else
	{
		the_super_block[current_driver].s_driver_pwd->i_count--;
		the_super_block[current_driver].s_driver_root->i_count++;
		the_super_block[current_driver].s_driver_pwd = the_super_block[current_driver].s_driver_root;
		pwd_pathlength_table[current_driver] = 2;		
	}

	if (dir_file.f_count && dir_file.f_inode)
	{
		temp_inode = dir_file.f_inode;
		if ((temp_inode->i_dev == 0) && (temp_inode->i_num > MSDOS_ROOT_INO))
			dir_file.f_inode = NULL;
	}

	for (temp_i = 0; temp_i < NR_FILE; temp_i++)
		if (file_table[temp_i].f_count && file_table[temp_i].f_inode)
		{
			temp_inode = file_table[temp_i].f_inode;
			if ((temp_inode->i_dev == 0) && (temp_inode->i_num > MSDOS_ROOT_INO))
				file_table[temp_i].f_inode	= NULL;
		}
	
	for (temp_i = 0, temp_inode = inode_table; temp_i < NR_INODE; temp_i++, temp_inode++)
		if ((temp_inode->i_dev == 0) && (temp_inode->i_num > MSDOS_ROOT_INO))
			memset(temp_inode,0,sizeof(*temp_inode));

	cache_inval_dev();

	temp_buffer = start_buffer;
	for (temp_i = 0; temp_i < 17; temp_i++)
	{
		while (temp_buffer->b_lock);
		if (invalid_flag)
		{
			temp_buffer->b_uptodate = temp_buffer->b_uptodate & 0xfe;
			temp_buffer->b_dirt		= 0;
		}

		if (temp_buffer->b_next)
			temp_buffer->b_next->b_prev = temp_buffer->b_prev;
		if (temp_buffer->b_prev)
			temp_buffer->b_prev->b_next = temp_buffer->b_next;
		if (hash_table[temp_buffer->b_blocknr % NR_HASH] == temp_buffer)
			hash_table[temp_buffer->b_blocknr % NR_HASH] = temp_buffer->b_next;
		temp_buffer->b_prev = NULL;
		temp_buffer->b_next = NULL;
		temp_buffer++;
	}

	floppy_workstate = -1;
	return;
}

⌨️ 快捷键说明

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