📄 msdos_super.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 + -