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

📄 vhd_driver.cpp

📁 类似Linux操作系统0.11版文件系统的文件系统设计和Windows下的操作程序
💻 CPP
字号:
/*
 * vhd_driver.c 虚拟硬盘驱动程序
 */
#include "stdafx.h"
#include "UL_FileSys.h"
#include "BlkDev.h"

/* 定义虚拟硬盘的主设备号 */
#define MAJOR_NR 3

unsigned long vhd_length = 0;

CFile file;

// HANDLE hFile;


//// 结束请求
void end_request (int uptodate)
{
	if (CURRENT_REQUEST->bh)
	{				// CURRENT 为指定主设备号的当前请求结构。
		CURRENT_REQUEST->bh->b_uptodate = uptodate;	// 置更新标志。
		unlock_buffer (CURRENT_REQUEST->bh);	// 解锁缓冲区。
	}
	if (!uptodate)
	{				// 如果更新标志为0 则显示设备错误信息。
		printk ("%s: I/O error\n\r",CURRENT_DEV.name);
		printk ("dev %04x, block %d\n\r", CURRENT_REQUEST->dev, CURRENT_REQUEST->bh->b_blocknr);
	}
	//wake_up (&CURRENT->waiting);	// 唤醒等待该请求项的进程。
	//wake_up (&wait_for_request);	// 唤醒等待请求的进程。
	CURRENT_REQUEST->dev = -1;		// 释放该请求项。
	CURRENT_REQUEST = CURRENT_REQUEST->next;	// 从请求链表中删除该请求项。
}

/*
* 这是很重要的一个函数,用于处理文件系统对虚拟硬盘的读写请求
*/
void do_vhd_request(void)
{
	unsigned long len;
	unsigned long addr;

	if ( CURRENT_REQUEST ) 
	{
		addr = CURRENT_REQUEST->sector << 9;
		len = CURRENT_REQUEST->nr_sectors << 9;

		if ((MINOR(CURRENT_REQUEST->dev) != 1) || (addr+len > vhd_length)) 
		{
			end_request (0);
			return;
		}
		if (CURRENT_REQUEST->cmd == WRITE) 
		{
			file.Seek(addr, CFile::begin);
			file.Write(CURRENT_REQUEST->buffer, len);
		} 
		else if (CURRENT_REQUEST->cmd == READ) 
		{
			file.Seek(addr, CFile::begin);
			file.Read(CURRENT_REQUEST->buffer, len);
		} 
		else
		{
			panic("Unknown VDisk-Command");
		}
		end_request (1);
	}
}

/* 虚拟盘初始化 */
int vhd_init(char* filename)
{
	try
	{
		file.Open(filename, CFile::modeReadWrite | CFile::typeBinary);
		vhd_length = (unsigned long)file.GetLength();
		blk_dev[MAJOR_NR].request_fn = do_vhd_request;
	}
	catch (...)
	{
		return -1;
	}
	return 0;
}

void vhd_release()
{
	file.Close();
}

⌨️ 快捷键说明

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