急救!怎样读取被隐藏了的盘符?200分(200分)

  • 主题发起人 主题发起人 八神庵
  • 开始时间 开始时间

八神庵

Unregistered / Unconfirmed
GUEST, unregistred user!
急救!怎样读取被隐藏了的盘符?200分 请写出源码!
 
被谁隐藏了,讲清楚!
 
我想用程序把已隐藏的盘号显示出来,但读取注册的
HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer/NoDrives
只是数字?
 
删除这个键值或赋为0就可以了
 
不是这样!我是想读取出来,比如说:注册表的数值是9则A盘与C盘这两个盘就隐藏!
 
我想的是这样的:先读取注册表的数值,然后判别它的大小,比如说是7,在CheckListBox1中
的.Checked[0];.Checked[1];.Checked[2]则是True;像兔子设置中的隐藏驱动器的功能一样。当
窗口显示时读取注册表来判别CheckListBox1.Checked是True或False;
 
读取出来是一个DWORD值,用下面的公式
盘符A-Z分别用数值1-26代替
if (power(2,x-1) and 你取出的数值)=1 then x盘被隐藏
例,要看D盘是否被隐藏,则用
//uses Math
if (power(2,4-1) and 1234)=1 then showmessage('D盘被隐藏');
 
这个里面有个算法,我有段以前用VB写的代码,不知道您是否有用过VB?
关键代码如下:
S_nodrive = Hex(QueryValue(HKEY_CURRENT_USER, "Software/Microsoft/Windows/CurrentVersion/Policies/Explorer", "NoDrives"))
S_nodrive = Hex2Bin(S_nodrive)
For I_temp = 0 To Len(S_nodrive) - 1
If Mid(S_nodrive, Len(S_nodrive) - I_temp, 1) = "1" Then
ListView_mycomputer.ListItems(I_temp + 1).Checked = True
End If
Next
当时我是用的Listview保存驱动列表的。
大意思是将读取出来的NoDrives值转化为二进制字符串,然后便可知道到底哪个驱动隐藏。
记得当时在做设置隐藏驱动器时相对要简单些,而读取时有点复杂,不知道还有没有更好的方法。
 
ysai说的会出错呀!
Operator not applicable to this operand type
不知道是为什么???
 
错了错了,不好意思,power返回的类型不对
var
i:integer;
begin
i:=3;//C盘,A-Z分别为1-26
if (round(power(2,i-1)) and 13)=power(2,i-1) then showmessage('C盘被隐藏');
end;
 
这个也不对呀!在注册表读出来的数是Integer的。不知道怎样代入你的代码中?
如果是C盘被隐藏的话,他的数是4。
如果是ABC三个盘都隐藏的话,他的数是7。
 
就是那个13呀,如果是4,就把13换成4,i=3就可以了
同样,abc三个盘的话,把13换成7,i=3,也能得出结果
都怪我没写清楚~~~~~这下够清楚了吧,给你个函数
function IsDriveHide(const AValue:integer;const ADrive:integer):boolean;
begin
result:=(round(power(2,ADrive-1)) and AValue)=power(2,ADrive-1);
end;
 
多人接受答案了。
 
后退
顶部