您的位置:首页 > 其它

VC 隐藏驱动器 -win7下测试可用

2017-09-28 15:29 267 查看
BOOL ReadRegistryDword(LPCTSTR lpSubKey, LPCTSTR lpName, DWORD *dwValue)
{
HKEY hKey = 0;
DWORD dwSize = sizeof(*dwValue);
DWORD dwType;
LONG lStatus;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;

lStatus = RegOpenKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, KEY_READ, &hKey);
if (lStatus != ERROR_SUCCESS)
{
SetLastError(lStatus);
return FALSE;
}

lStatus = RegQueryValueEx(hKey, lpName, NULL, &dwType, (BYTE *)dwValue, &dwSize);
if (lStatus != ERROR_SUCCESS)
{
RegCloseKey(hKey);
SetLastError(lStatus);
return FALSE;
}

RegCloseKey(hKey);
return dwType == REG_DWORD;
}

BOOL WriteRegistryDword(LPCTSTR lpSubKey, LPCTSTR lpName, DWORD dwValue)
{
HKEY hKey = 0;
DWORD dwDisp;
LONG lStatus;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;

lStatus = RegCreateKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, &sa, &hKey, &dwDisp);
if (lStatus != ERROR_SUCCESS)
{
SetLastError(lStatus);
return FALSE;
}

lStatus = RegSetValueEx(hKey, lpName, 0, REG_DWORD, (BYTE *)&dwValue, sizeof dwValue);
if (lStatus != ERROR_SUCCESS)
{
RegCloseKey(hKey);
SetLastError(lStatus);
return FALSE;
}

RegCloseKey(hKey);
return TRUE;
}

void HideVolume( int nDriveNo)
{
DWORD dwResult;
DEV_BROADCAST_VOLUME* p01 = new DEV_BROADCAST_VOLUME;
p01->dbcv_devicetype = 2;
p01->dbcv_flags = 0;
p01->dbcv_size = 20;
p01->dbcv_unitmask = (1 << nDriveNo);

char szRoot[] = { (char)(nDriveNo + 'A'), ':', '\\', 0 };
SHChangeNotify(SHCNE_DRIVEREMOVED, SHCNF_PATH, szRoot, NULL);

DWORD dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, NULL);
dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVICEREMOVECOMPLETE, (LPARAM)p01);

DWORD value = 0;
LPCTSTR skey = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");
if (!ReadRegistryDword(skey, _T("NoDrives"), &value))
{
value = 0;
}
value |= (1 << nDriveNo);

WriteRegistryDword(skey, _T("NoDrives"), value);
SHChangeNotify(SHCNE_DRIVEREMOVED, SHCNF_PATH, szRoot, NULL);

//DWORD dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, NULL);
dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVICEREMOVECOMPLETE, (LPARAM)p01);

delete[] p01;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM("Policy"), SMTO_ABORTIFHUNG, 500, &dwResult);

}
void ShowVolume(int nDriveNo)
{
DWORD dwResult;
DEV_BROADCAST_VOLUME* p01 = new DEV_BROADCAST_VOLUME;
p01->dbcv_devicetype = 2;
p01->dbcv_flags = 0;
p01->dbcv_size = 20;
p01->dbcv_unitmask = (1 << nDriveNo);//H

char szRoot[] = { (char)(nDriveNo + 'A'), ':', '\\', 0 };
SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATH, szRoot, NULL);
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, szRoot, NULL);

DWORD dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, NULL);
dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVICEARRIVAL, (LPARAM)p01);
dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, NULL);

DWORD value = 0;
LPCTSTR skey = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");
if (!ReadRegistryDword(skey, _T("NoDrives"), &value))
{
value = 0;
}
value &= ~(1 << nDriveNo);

WriteRegistryDword(skey, _T("NoDrives"), value);
SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATH, szRoot, NULL);
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, szRoot, NULL);

// DWORD dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, NULL);
dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVICEARRIVAL, (LPARAM)p01);
dwRecipients = BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_POSTMESSAGE | BSF_FORCEIFHUNG, &dwRecipients,
WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, NULL);

delete[] p01;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM("Policy"), SMTO_ABORTIFHUNG, 500, &dwResult);
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: