65.9K
CodeProject 正在变化。 阅读更多。
Home

强制 Vista ReadyBoost

2008年9月21日

CPOL

2分钟阅读

viewsIcon

33987

downloadIcon

373

强制 Vista ReadyBoost 用于特定可移动驱动器。

介绍 

ReadyBoost 是内置于 Windows Vista 中的一项技术,它将磁盘读取缓存到闪存设备上。它可以与 USB 存储密钥、闪存卡(如 SD 和 CompactFlash)以及其他类型的闪存设备配合使用。它缓存所有类型的的文件读取,而不仅仅是工作集,也不是仅仅缓存 DLL 或其他持久的操作系统数据。

注意

ReadyBoost 不缓存文件写入——它是一个直写缓存。 这样,您永远不会丢失任何宝贵的数据,这些数据原本应该写入硬盘驱动器。 毕竟,闪存密钥可以随时从系统中拔出。 缓存本身使用 AES-128 加密进行加密,因此没有人可以窃取您的闪存密钥并随意浏览缓存文件以查看您所做的事情。

背景

根据微软的说法,USB 存储设备要具备 ReadyBoost 能力的最低要求是 4K 随机访问读取速度为 2.5MB/sec,512K 随机写入速度为 1.5MB/sec——并且该速率必须在整个闪存空间中实现。 当您将 USB 存储设备插入系统时,Vista 实际上会执行性能检查,以查看该设备是否符合标准。 Vista 不允许您使用不符合标准的设备,而这个应用程序就是为此而构建的。

概述

微软的 Matt Ayers 回答的关于 Microsoft ReadyBoost 的常见问题可以在这里找到。

您可能还想阅读关于“Vista ReadyBoost 或 SnailBoost”的文章 这里

Using the Code

这段代码主要关于查找和编辑某个可移动驱动器的 Windows 注册表键,并伪造其读写速度值。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.Win32;

namespace QForce_Ready_Boost
{
    public partial class Form1 : Form
    {        
        RegistryKey key;   
        public Form1()
        {
            InitializeComponent();
        }

        string[] arDrives;
        string strDrive;
        DriveInfo di;

        private void load_drivers()
        {
            try
            {
                combo_Drives.Items.Clear();
                arDrives = System.Environment.GetLogicalDrives();
                foreach (string strDriveName in arDrives)
                {
                    di = new DriveInfo(strDriveName);
                    if (di.DriveType == DriveType.Removable)
                        combo_Drives.Items.Add(di.VolumeLabel + 
			" (" + strDriveName.Replace("\\", "") + ")");
                }
                if (combo_Drives.Items.Count > 0 && combo_Drives.Text.Length == 0)
                    combo_Drives.Text = combo_Drives.Items[0].ToString();
            }
            catch (Exception)
            { }
        }

当您单击“强制”按钮时,WriteSpeedKBsReadSpeedKBs 注册表值会被简单地更改为 ReadyBoost 兼容值(在本例中为 10,000,000)。

private void btn_Force_Click(object sender, EventArgs e)
{
    try
    {
	di = new DriveInfo(combo_Drives.Text.Substring
			(combo_Drives.Text.Length - 3, 2) + "\\");

	string keyLocation = @"Software\Microsoft\Windows NT\CurrentVersion\
	EMDMgmt\_??_USBSTOR#Disk&Ven_&Prod_USB_DISK_2.0&Rev_PMAP#077C0EA5004B&0#
	{53f56307-b6bf-11d0-94f2-00a0c91efb8b}" + strDrive + "_1078135262";

	key = Registry.LocalMachine.OpenSubKey(keyLocation, true);

	key.SetValue("ReadSpeedKBs", 10000000, RegistryValueKind.DWord);
	key.SetValue("WriteSpeedKBs", 10000000, RegistryValueKind.DWord);
	key.SetValue("PhysicalDeviceSizeMB",
		Math.Round(((double)di.TotalSize/1024)/1024) , 
		RegistryValueKind.DWord);
	key.SetValue("RecommendedCacheSizeMB", 
		Math.Round(((double)di.TotalFreeSpace / 1024) / 1024) / 2, 
		RegistryValueKind.DWord);
	key.SetValue("CacheSizeInMB", trackBar1.Value, RegistryValueKind.DWord);

	key.SetValue("HasSlowRegions", 00000000, RegistryValueKind.DWord);

	MessageBox.Show("Drive " + combo_Drives.Text + 
		"\nforced successfully!","Success",MessageBoxButtons.OK,
		MessageBoxIcon.Information);
    }
    catch (Exception ex)
    { 
	MessageBox.Show("Please select a valid drive", 
	"Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    }

    btn_Force.Enabled = false;           
}
//By Muammar Yacoob

兴趣点 

您可能注意到注册表键的奇怪名称,其中包含可移动驱动器的名称。

_??_USBSTOR#Disk&Ven_&Prod_USB_DISK_2.0&Rev_PMAP#077C0EA5004B&0#
{53f56307-b6bf-11d0-94f2-00a0c91efb8b}" + strDrive +
"_1078135262";

好吧,我只是注意到 Vista 无论使用哪个驱动器都会使用它,并将其作为代码中的常量!

如果您的情况不同,请告诉我,以便我们可以提出检测更改的新想法。

历史

  • 2008 年 9 月 21 日:初始发布
© . All rights reserved.