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);
}