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

来源:互联网 发布:阿里巴巴 借壳 数据港 编辑:程序博客网 时间:2024/06/05 20:59
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);}


 
原创粉丝点击