刚在老乡Tombkeeper的Blog上看到有这样一个奇怪的需求,功能需求相当于umount,要求在一秒种内只剩下C盘。不是很复杂,举手之劳,呵呵!给我C++和摇滚乐,我Show给你看。
/********************************************************************
created: 2007/03/28
created: 28:3:2007 22:25
filename: C:/VcWork/DosDevice/DosDevice.cpp
file path: C:/VcWork/DosDevice
file base: DosDevice
file ext: cpp
author: kruglinski
purpose: 快速隐藏和恢复分区的简单实现
Windows XP SP2 HOME 调试运行通过
Visual C++ 6.0,2003 SDK R2 编译通过
*********************************************************************/
#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct SaveContext
{
string strNtPath;
string strDosDevice;
};
typedef vector<SaveContext> svrVector;
void RestoreDevice(SaveContext &Context);
int main(void)
{
//读磁盘配置并排除C盘
DWORD dwDisks=GetLogicalDrives()&0xfffffffb;
svrVector NtDevices;
TCHAR chDosDevice[8]={0};
*(WORD*)chDosDevice=':A';
TCHAR chNtPath[MAX_PATH]={0};
for(int Mask=1;Mask;Mask<<=1,chDosDevice[0]++)
{
if(dwDisks&Mask)
{
QueryDosDevice(chDosDevice,chNtPath,MAX_PATH);
SaveContext Context;
Context.strDosDevice=chDosDevice;
Context.strNtPath=chNtPath;
//先保存符号名和设备之间的关系
NtDevices.push_back(Context);
cout<<Context.strDosDevice<<"<--->"<<Context.strNtPath<<endl;
//除了C:以外其它的盘符正一个一个的不见了
DefineDosDevice(DDD_REMOVE_DEFINITION,Context.strDosDevice.c_str(),NULL);
}
}
//现在打开"我的电脑"看看
system("pause");
//现在隐藏的盘符又出现了,呵呵
for_each(NtDevices.begin(),NtDevices.end(),RestoreDevice);
return 0;
}
void RestoreDevice(SaveContext &Context)
{
DefineDosDevice(DDD_RAW_TARGET_PATH,Context.strDosDevice.c_str(),Context.strNtPath.c_str());
}
在我的机器上输出下面的结果:
D:<--->/Device/HarddiskVolume2
E:<--->/Device/CdRom0
F:<--->/Device/CdRom1
G:<--->/Device/HarddiskVolume4
H:<--->/Device/HarddiskVolume5
I:<--->/Device/HarddiskVolume6
J:<--->/Device/HarddiskVolume7
Z:<--->/Device/PGPdisks/PGPdiskVolume1
请按任意键继续. . .