停用及启用磁盘设备、修改盘符代码
来源:互联网 发布:淘宝刷手会受到处罚吗 编辑:程序博客网 时间:2024/04/28 12:49
void ResetHDState(bool bEnable)
{
GUID guid = DiskClassGuid;
HDEVINFO hDevinfo = SetupDiGetClassDevs(&guid, NULL, NULL, /*DIGCF_PRESENT*/DIGCF_DEVICEINTERFACE);
SP_DEVINFO_DATA spDevInfo = {0};
spDevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA didata = {0};
didata.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
for(int i = 0; SetupDiEnumDeviceInterfaces(hDevinfo, /*&spDevInfo*/NULL, &guid, i, &didata); i++)
{
SP_DEVICE_INTERFACE_DETAIL_DATA* spDId = NULL;
DWORD dwt;
wchar_t szBig[500] = {0};
spDId = (PSP_DEVICE_INTERFACE_DETAIL_DATA)szBig;
spDId->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if(SetupDiGetDeviceInterfaceDetail(hDevinfo, &didata, spDId, 500, &dwt, NULL))
{
HANDLE hDisk = CreateFile(spDId->DevicePath, // 文件名
GENERIC_READ | GENERIC_WRITE, // 读写方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件
if(INVALID_HANDLE_VALUE != hDisk)
{
int er5 = 4;
DWORD InBufferSize=1024;
wchar_t sztmpBuf[1024] = {0};
BOOL rlt = FALSE;
HDEVINFO m_hDevInfo = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA m_DeviceInfoData;
RtlZeroMemory(&m_DeviceInfoData, sizeof(SP_DEVINFO_DATA));
m_DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevinfo, i, &m_DeviceInfoData); i++ )
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
while(!SetupDiGetDeviceRegistryProperty(m_hDevInfo, &m_DeviceInfoData,
SPDRP_DEVICEDESC, &DataT, (PBYTE)buffer, buffersize, &buffersize))
{
if(buffer)
LocalFree(buffer);
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
}
else
{
break;
}
}
SP_PROPCHANGE_PARAMS propChange = { sizeof ( SP_CLASSINSTALL_HEADER ) };
propChange.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
propChange.Scope = DICS_FLAG_GLOBAL;
if(bEnable == true)
propChange.StateChange = DICS_ENABLE; // 启用
else
propChange.StateChange = DICS_DISABLE; // 停用
if (m_DeviceInfoData.DevInst != NULL)
{
rlt = SetupDiSetClassInstallParams(hDevinfo, &m_DeviceInfoData,
(SP_CLASSINSTALL_HEADER*) &propChange, sizeof(propChange));
if(rlt)
rlt = SetupDiCallClassInstaller ( DIF_PROPERTYCHANGE, hDevinfo, &m_DeviceInfoData );
}
}
}
CloseHandle(hDisk);
}
}
}
void ResetDriverLetter()
{
ResetHDState(false);
ResetHDState(true);
TCHAR szVol[MAX_PATH] = {0};
HANDLE hFind = FindFirstVolume(szVol, MAX_PATH);
if(hFind == INVALID_HANDLE_VALUE)
return ;
int s = 0;
while(true)
{
TCHAR szTv[MAX_PATH] ={0};
if(!FindNextVolume(hFind, szTv, MAX_PATH))
break;
CHAR szBuf[MAX_PATH] ={0};
DWORD dw;
GetVolumePathNamesForVolumeName(szTv, szBuf, MAX_PATH, &dw);
wprintf(L"%s %s/n", szTv, szBuf);
if(wcscmp(L"", (wchar_t*)szBuf) == 0)
{
wsprintf(szVol, "%c://", GetDriver());
if(!SetVolumeMountPoint(szVol, szTv))
wprintf(L"fail to set %s from %s/n", szVol, szTv);
}
}
FindClose(hFind);
}
- 停用及启用磁盘设备、修改盘符代码
- 启用与停用设备
- SetupDi* 启用与停用设备
- SetupDi* 启用与停用设备
- VC++实现启用与停用设备
- VC++实现启用与停用设备
- SetupDi*系列之启用与停用设备
- 用代码实现"停用/启用"网络连接
- 简单的 C++ .net 启用/停用网络连接 代码
- Anaconda的安装、启用及停用的步骤
- 设备管理器中 停用启用设备后设备上有YB 错误代码Code 31
- crm2011停用启用记录
- 用VB启用 停用服务
- chrome停用和启用插件
- crm2011 停用和启用记录
- crm创建启用停用用户
- 如何启用 Service ,如何停用
- 索引停用与启用方法
- 奇遇blog搬家啦~
- WAP文本分页显示
- 在IE6 下父层DIV宽度受子层DIV宽度影响
- 进出异常
- 页面无法实时加载图片
- 停用及启用磁盘设备、修改盘符代码
- 【实例化调用】将汉字转化为拼音的类
- 从网上档的关于在SAP中调用MEDIA PLAYER的代码,自己添加完整
- 好代码,坏代码
- 一些经典的SQL语句
- error LNK2005:*** already defined in ***
- 状态机编程
- Hibernate 的saveOrUpdate方法
- 用Java代码来触发生成ThreadDump