• 大小: 1.15MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-10-24
  • 语言: 其他
  • 标签: filedisk  

资源简介

filedisk 源码 分析 分为核心层和应用层两个部分,特别的详细,有助于对虚拟磁盘的深入研究。

资源截图

代码片段和文件信息

///////////////////////////////////////////////////////
//该版本的ARG PARSER部分存在问题
//在带有5个参数,但是缺少文件名的状况没有办法进行解析
//BUG一个
////////////////////////////////////////////////////////

#include 
#include 
#include 
#include “filedisk.h“

int Syntax(void)
{
    fprintf(stderr “syntax:\n“);
    fprintf(stderr “filedisk /mount  devicenumber filename [size[k|M|G] | /ro | /cd] driveletter\n“);
    fprintf(stderr “filedisk /umount driveletter\n“);
    fprintf(stderr “\n“);
    fprintf(stderr “example:\n“);
    fprintf(stderr “filedisk /mount  0 c:\\temp\\filedisk.img 8M f:\n“);
    fprintf(stderr “filedisk /mount  1 c:\\temp\\cdimage.iso /cd i:\n“);
    fprintf(stderr “filedisk /umount f:\n“);
    fprintf(stderr “filedisk /umount i:\n“);

    return -1;
}

void PrintLastError(char* Prefix)
{
    LPVOID lpMsgBuf;

    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS
        NULL
        GetLastError()
        0
        (LPTSTR) &lpMsgBuf
        0
        NULL
        );

    fprintf(stderr “%s %s“ Prefix (LPTSTR) lpMsgBuf);

    LocalFree(lpMsgBuf);
}

int
Mount(
    int                     DeviceNumber
    POPEN_FILE_INFORMATION  OpenFileInformation
    char                    DriveLetter

{
    char    VolumeName[] = “\\\\.\\ :“;
    char    DeviceName[255];
    HANDLE  Device;
    DWORD   BytesReturned;

    VolumeName[4] = DriveLetter; //处理结果类似“\\\\.\\D:“

////////////////////////////////////////////////////////////////
//测试该虚拟卷是否已经存在,
//如果已经存在
//则输出错误
////////////////////////////////////////////////////////////////
    Device = CreateFile(
        VolumeName
        GENERIC_READ | GENERIC_WRITE
        FILE_SHARE_READ | FILE_SHARE_WRITE
        NULL
        OPEN_EXISTING
        FILE_FLAG_NO_BUFFERING
        NULL
        );

    if (Device != INVALID_HANDLE_VALUE) //这里判断的是合法的情况
    {
        SetLastError(ERROR_BUSY);
        PrintLastError(&VolumeName[4]);
        return -1;
    }

////////////////////////////////////////////////////////////////
//如果不存在
//则开始建立虚拟盘符
//DEVICE_NAME_PREFIX=“\Device\FileDisk\FileDisk”
////////////////////////////////////////////////////////////////
    
sprintf(DeviceName DEVICE_NAME_PREFIX “%u“ DeviceNumber);

    ////////////////////////////////////////////////////////////////
//所有到VolumeName的IO请求都将被重定向到DeviceName
//执行到这里,在系统中应该可以看见一个虚拟的盘符出现
//但是还不能对该盘符做任何操作
////////////////////////////////////////////////////////////////

if (!DefineDosDevice(
        DDD_RAW_TARGET_PATH
        &VolumeName[4]
        DeviceName
        ))
    {
        PrintLastError(&VolumeName[4]);
        return -1;
    }
    
////////////////////////////////////////////////////////////////
//打开虚拟盘符
//如果打开设备成功,则向其发送IOCTL_FILE_DISK_OPEN_FILE IRP
//其中IOCTL_FILE_DISK_OPEN_FILE在filedisk

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        356  2002-08-08 14:14  ccdeath-filedisk\filedisk.reg

     文件      10556  2004-06-09 08:14  ccdeath-filedisk\filedisk.sys

     文件      24455  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug\filedisk.obj

     文件     176263  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug\filedisk应用层.exe

     文件     185200  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug\filedisk应用层.ilk

    I.A....   3715948  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug\filedisk应用层.pch

     文件     361472  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug\filedisk应用层.pdb

     文件      41984  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug\vc60.idb

     文件      69632  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug\vc60.pdb

     文件      10574  2007-12-26 10:15  ccdeath-filedisk\filedisk应用层\filedisk.c

     文件       1057  2007-12-26 10:20  ccdeath-filedisk\filedisk应用层\filedisk.h

     文件       4435  2007-12-26 08:50  ccdeath-filedisk\filedisk应用层\filedisk应用层.dsp

     文件        553  2009-08-21 20:19  ccdeath-filedisk\filedisk应用层\filedisk应用层.dsw

     文件      50176  2009-08-21 20:57  ccdeath-filedisk\filedisk应用层\filedisk应用层.ncb

     文件      48640  2009-08-21 20:57  ccdeath-filedisk\filedisk应用层\filedisk应用层.opt

     文件       1386  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\filedisk应用层.plg

    .......      1760  2007-12-26 08:45  ccdeath-filedisk\filedisk核心层\buildchk.log

     文件      42187  2009-08-22 22:32  ccdeath-filedisk\filedisk核心层\filedisk.c

     文件       1158  2007-12-26 09:45  ccdeath-filedisk\filedisk核心层\filedisk.h

     文件       4069  2007-12-26 08:40  ccdeath-filedisk\filedisk核心层\filedisk核心层.dsp

     文件        757  2007-12-26 08:53  ccdeath-filedisk\filedisk核心层\filedisk核心层.dsw

     文件      66560  2009-08-20 23:58  ccdeath-filedisk\filedisk核心层\filedisk核心层.ncb

     文件      53760  2009-08-20 23:58  ccdeath-filedisk\filedisk核心层\filedisk核心层.opt

     文件       1296  2007-12-26 08:39  ccdeath-filedisk\filedisk核心层\filedisk核心层.plg

     文件        267  2006-11-03 20:33  ccdeath-filedisk\filedisk核心层\MAKEFILE

     文件         91  2007-12-26 08:44  ccdeath-filedisk\filedisk核心层\Sources

     文件        307  2002-08-08 14:25  ccdeath-filedisk\install.txt

     文件        179  2007-12-26 13:24  ccdeath-filedisk\阅读之前说明.txt

     目录          0  2009-08-21 20:24  ccdeath-filedisk\filedisk应用层\Debug

     目录          0  2009-08-20 23:57  ccdeath-filedisk\filedisk核心层\Debug

............此处省略6个文件信息

评论

共有 条评论