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