适用于.NET的可编程RAM磁盘API?

时间:2010-03-08 16:37:59

标签: .net windows

寻找RAM磁盘API(或实现的等效软件集)临时存储文件,以便在物理硬盘环境之外进行读/写操作。

更新 Exe文件将被写入RAM磁盘并执行。

3 个答案:

答案 0 :(得分:7)

“RAM磁盘”是操作系统级别构造,因为它必须实现文件系统和设备驱动程序来模拟磁盘。你不能在图书馆一级这样做。

如果您想要追求操作系统级别,Windows附带内置的ramdisk.sys驱动程序。

否则,将文件读入应用程序中的数据结构将具有与使用RAM磁盘相同的性能特征。通常,当应用程序不知道它正在运行RAM缓存文件时,会使用RAM磁盘。如果您的应用程序知道它想要这样做的事实,只需直接将数据读入您的应用程序。

答案 1 :(得分:4)

ImDisk是一个RAM磁盘应用程序,它从内存扇区创建一个虚拟驱动器,并且有一个可以从.NET调用的API。

class RamDisk
{
    public const string MountPoint = "X:";

    public void createRamDisk()
    {

        try
        {
            string initializeDisk   = "imdisk -a ";
            string imdiskSize       = "-s 1024M ";
            string mountPoint       = "-m "+ MountPoint + " ";


            ProcessStartInfo procStartInfo  = new ProcessStartInfo();
            procStartInfo.UseShellExecute   = false;
            procStartInfo.CreateNoWindow    = true;
            procStartInfo.FileName          = "cmd";
            procStartInfo.Arguments         = "/C " + initializeDisk + imdiskSize + mountPoint;
            Process.Start(procStartInfo);

            formatRAMDisk();

        }
        catch (Exception objException)
        {
            Console.WriteLine("There was an Error, while trying to create a ramdisk! Do you have imdisk installed?");
            Console.WriteLine(objException);
        }

    }

    /**
     * since the format option with imdisk doesn't seem to work
     * use the fomat X: command via cmd
     * 
     * as I would say in german:
     * "Von hinten durch die Brust ins Auge"
     * **/
    private void formatRAMDisk(){

        string cmdFormatHDD = "format " + MountPoint + "/Q /FS:NTFS";

        SecureString password = new SecureString();
        password.AppendChar('0');
        password.AppendChar('8');
        password.AppendChar('1');
        password.AppendChar('5');

        ProcessStartInfo formatRAMDiskProcess   = new ProcessStartInfo();
        formatRAMDiskProcess.UseShellExecute    = false;
        formatRAMDiskProcess.CreateNoWindow     = true;
        formatRAMDiskProcess.RedirectStandardInput     = true;
        formatRAMDiskProcess.FileName           = "cmd";
        formatRAMDiskProcess.Verb               = "runas";
        formatRAMDiskProcess.UserName           = "Administrator";
        formatRAMDiskProcess.Password           = password;
        formatRAMDiskProcess.Arguments          = "/C " + cmdFormatHDD;
        Process process                         = Process.Start(formatRAMDiskProcess);

        sendCMDInput(process);
    }

    private void sendCMDInput(Process process)
    {
        StreamWriter inputWriter = process.StandardInput;
        inputWriter.WriteLine("J");
        inputWriter.Flush();
        inputWriter.WriteLine("RAMDisk for valueable data");
        inputWriter.Flush();
    }

    public string getMountPoint()
    {
        return MountPoint;
    }
}

答案 2 :(得分:3)

ramdisk.sys是一个驱动程序,您可以从Microsoft获得作为驱动程序演示,但显然不能保证在Windows 7上运行,所以祝你好运。你可以找到其他ramdisk实现,但是你必须安装它们,这意味着修改你的驱动器(即第1步:安装一个粗略的驱动程序)。

所以这就引出了你想要做的事情的问题,真的。如果您的目标是为某些可执行文件创建一个沙箱,以便它们无法写入本地驱动器,这听起来不是正确的方法。如果目标是使一小组可执行文件随时可用,以便它们快速运行,那么这似乎不是正确的方法 - Windows无论如何都会缓存可执行文件,因此它们的第二次启动速度更快。如果目标是为可执行文件生成一个小的,易于清理的区域,则应该将windows临时目录放在那里。如果您正在尝试制作类似Norton实用程序或ghost的系统,以便在不留痕迹的情况下提供对硬盘驱动器的自由访问,那么我怀疑.NET是否是正确的方法,因为.NET将会受到影响无论如何,你的高清硬盘很重。如果你的目标是创建一个病毒或特洛伊木马,将其有效载荷隐藏在ram驱动器中,我会质疑你的动机。

你真的想做什么?

另一个选项而不是ramdisk是Dokan,它是一个用户模式文件系统驱动程序。从中做出内存驱动器是直截了当的 - 我做了一个快速的.NET应用程序,使TWAIN扫描仪显示为驱动器作为演示,但我发现dokan,当我使用它时,使我的机器易碎:任何在我工作时失误意味着重启土地之旅。而且,它需要安装驱动程序。希望这会变得更好。