【问题标题】:Programmable RAM Disk API for .NET?.NET 的可编程 RAM 磁盘 API?
【发布时间】:2011-01-25 01:32:17
【问题描述】:

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

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

【问题讨论】:

  • 从问题中删除了“快速” - 我认为这会导致人们误入歧途 - 现在更清楚了

标签: .net windows


【解决方案1】:

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】:

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

    所以这引出了一个问题,即你真正想要做什么。如果您的目标是为某些可执行文件创建沙箱,以便它们无法写入本地驱动器,那么这听起来不是正确的方法。如果目标是让一小部分可执行文件随时可用,以便它们快速运行,那么这似乎不是正确的方法 - Windows 无论如何都会缓存可执行文件,因此它们的第二次启动速度更快。如果目标是为运行可执行文件创建一个易于清理的小区域,则应该使用 windows 临时目录。如果您正在尝试制作像诺顿实用程序或幽灵这样的系统,可以不受限制地访问硬盘而不留下任何痕迹,我怀疑.NET 是否是正确的方法,因为.NET 将会受到打击反正你的高清又硬又重。如果您的目标是创建病毒或特洛伊木马,将其有效载荷隐藏在内存驱动器中,我怀疑您的动机。

    你真正想做什么?

    另一个替代 ramdisk 的选项是 Dokan,它是一个用户模式文件系统驱动程序。从中制作内存驱动器很简单——我做了一个快速的 .NET 应用程序,它使 TWAIN 扫描仪显示为驱动器作为演示,但我发现 dokan 在我使用它时使我的机器变得脆弱:任何我在使用它时的失误意味着重新启动土地的旅行。同样,它需要安装驱动程序。希望这会变得更好。

    【讨论】:

    【解决方案3】:

    “RAM 磁盘”是操作系统级别的构造,因为它必须实现文件系统和设备驱动程序来模拟磁盘。您不能在库级别执行此操作。

    如果你想追求OS级别,Windows自带内置ramdisk.sys驱动。

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

    【讨论】:

    • 这是一个需要启动的可执行文件,而不是标准数据本身。 ramdisk.sys 驱动听起来很有趣...
    • 这似乎是最好的方法,虽然你是对的,但它并不像我希望的那么简单。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2013-03-25
    • 1970-01-01
    • 2011-05-24
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多