一、 手工在Windows 98中隐藏光驱。
  Windows 98提供了隐藏某个磁盘驱动器(包括软驱、硬盘、光驱)的功能,我
们只需手工对注册表数据库进行修改即可达到隐藏光驱的目的,当然也就同样达到
了禁用光驱的目的。为此,可采用如下步骤:
  1. 单击“开始”按钮,然后选择“运行”命令,打开“运行”对话框。
  2. 在“运行”对话框的“打开”栏中输入“REGEDIT”,然后单击“确定”按
钮,启动Windows 98的注册表编辑器。
  3. 在注册表编辑器左边依次双击HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies
\Explorer,展开Explorer分支。
  4. 右击注册表编辑器右边空白处,然后执行“新建”菜单中的“二进制值”命
令,在Explorer主键下新建一个名为“新值 #1”的二进制值。
  5. 右击该二进制值,然后执行快捷菜单中的“重命名”命令,将“新值 #1”
二进制值改名为“NoDrives”。 该值就是用于设置是否隐藏某个驱动器的,它由四
个二进制字节构成(缺省值为00 00 00 00),每个字节的每一位都分别对应一个磁
盘驱动器的盘符,当某位为1时,资源管理器及“我的电脑”中的相应驱动器图标即
会隐藏起来。具体来说,“NoDrives”的第一个字节代表从A到H的八个盘(其中01
为A、02为B、04为C、08为D、10为E、20为F、40为G、80为H),第二个字节代表I
到P;第三个字节代表Q到X;第四个字节代表Y和Z。
  6. 双击NoDrives,系统弹出“编辑二进制值”对话框。
  7. 根据自己光驱盘符的实际情况对“NoDrives”的值进行修改,若光驱盘符为
D则应修改为08000000;若光驱盘符为E则应修改为10000000;若光驱盘符为F则应
修改为20000000……(将“NoDrives”改为FF FF FF FF则可隐藏所有驱动器)。
  8. 单击“确定”按钮,关闭“编辑二进制值”对话框。
  9. 执行注册表编辑器“注册表”菜单的“退出”命令,关闭注册表编辑器。
  10. 重新启动Windows 98。
  这样,光驱的图标就会从Windows 98的图形界面中消失,我们无论是从资源管
理器、我的电脑及打开文件、保存文件对话框中,还是在其他外挂文件管理器(如
Windows Command等)中都无法发现这些隐藏了的光驱的踪迹,从而达到了禁止他
人使用光驱的目的。--------------------------------------------------------------------------------
procedure ShieldCDs;
  function IsCDROM(DriveChar: Char): Boolean;
  begin
    Result := GetDriveType(PChar(DriveChar + ':\')) = DRIVE_CDROM;
  end;
const
  _PATH = '\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer';
var
  I, T: Integer;
  Buffer, Mask: DWORD;
  R: TRegistry;
begin
  Mask := 0;
  for I := 0 to 25 do
    if IsCDROM(Char(I + Ord('A'))) then Mask := Mask + 1 shl I;
  R := TRegistry.Create;
  R.Rootkey := HKEY_CURRENT_USER;
  R.CreateKey(_PATH);
  R.OpenKey(_PATH, False);
  if R.ReadBinaryData('NoDrives', Buffer, SizeOf(Buffer)) = 0 then Buffer := 0;
  Buffer := Buffer and not Mask or Mask; // 为了不破坏对其它驱动器的设置。
  R.WriteBinaryData('NoDrives', Buffer, SizeOf(Buffer));
  R.Free;
end;

解决方案 »

  1.   

    johnsonrao(johnson):
     不是修改注册表,而是用API函数实现啊!
      

  2.   

    API也许不是万能的,但我想它应该是要想深入编程的程序员所必须掌握的。
      

  3.   

    API 绝对可以,不知道大家完过 红色警戒 2 光盘版没有,只要一进入游戏,光驱就被锁定,按弹出键就没反应
      

  4.   

    to kenns2000:
    请问你能提供一下实现这个功能的代码吗?
      

  5.   

    NT下面还是可以实现。这是一个函数
    {****************************************************************************
      函数: LockCDROM
      作者: BlackFox
      日期: 2002-5-6
      功能: 锁定一个光驱
      入口: CONST strName: STRING; CONST lock: boolean
            strName。光驱盘符
            lock.是否锁定
      返回: boolean
            成功返回TURE
    ****************************************************************************}function LockCDROM(const strName: string; const lock: boolean): boolean;
    const
      IOCTL_STORAGE_MEDIA_REMOVAL = 2967556;var
      CDRomHandle: thandle;
      Remove: TPREVENT_MEDIA_REMOVAL;
      CB: dword;
      OverLapped: _OVERLAPPED;begin  if not GetCDROMOpen(strName) then
        self.OpenOrClose(strName);  CDRomHandle := CreateFile(pchar('\\.\' + CurrentCDROM[1] + ':'), GENERIC_READ, FILE_SHARE_READ,
        nil, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, 0);  if CDRomHandle = 0 then
        Exit;
      ZeroMemory(@OverLapped, sizeof(OverLapped));
      Remove.PreventMediaRemoval := lock;
      result := DeviceIoControl(CDRomHandle, IOCTL_STORAGE_MEDIA_REMOVAL,
        @Remove, sizeof(Remove), nil, 0,
        CB, @OverLapped);
      // '释放光驱句柄
      CloseHandle(CDRomHandle);end;
    这也只是锁住光驱门而以。。呵呵。我可以提供一个思路。你可以用IShellExecuteHook实现一个外挂。

    function TShell.Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult;
    begin if ShellExecuteInfo.lpFile是光驱下的文件 then
     begin
            MessageBox(0,PCHAR('拒绝访问'),PCHAR(''),MB_OK);
    result:=S_FALSE;
    exit;
    end;
            result:=S_OK;
    end;