谁能用API禁用光驱?谢了!

ylm0101 2002-07-05 12:20:28
谁能用API禁用光驱?谢了!
...全文
887 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
black_fox 2002-07-06
  • 打赏
  • 举报
回复
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;
ylm0101 2002-07-06
  • 打赏
  • 举报
回复
to kenns2000:
请问你能提供一下实现这个功能的代码吗?
烟灰 2002-07-06
  • 打赏
  • 举报
回复
API 绝对可以,不知道大家完过 红色警戒 2 光盘版没有,只要一进入游戏,光驱就被锁定,按弹出键就没反应
ylm0101 2002-07-06
  • 打赏
  • 举报
回复
API也许不是万能的,但我想它应该是要想深入编程的程序员所必须掌握的。
Drate 2002-07-06
  • 打赏
  • 举报
回复
API不是万能的吧!?
ylm0101 2002-07-06
  • 打赏
  • 举报
回复
能用API函数实现吗?!
johnsonrao 2002-07-05
  • 打赏
  • 举报
回复
一、 手工在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;

search_you 2002-07-05
  • 打赏
  • 举报
回复
等待中......
search_you 2002-07-05
  • 打赏
  • 举报
回复
johnsonrao(johnson):
不是修改注册表,而是用API函数实现啊!
hezchuan168 2002-07-05
  • 打赏
  • 举报
回复
我也看看,觉得真的有点研究价值

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧