曲径通幽论坛

标题: USB 磁盘写保护 [打印本页]

作者: beyes    时间: 2013-4-18 23:54
标题: USB 磁盘写保护
可以通过修改注册表来打开 U 盘的写保护功能。比如在 XP 下面,当你复制一个文件到 USB 磁盘上时,会看到类似下面的错误提示:
[attach]1523[/attach]
若是在 VISTA 或 WIN7 下同样会看到:
[attach]1524[/attach]

实际上是修改了 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\StorageDevicePolicies 下的键值 WriteProtect 的值为 1 的缘故。在默认情况下,可能没有 StorageDevicePolicies 这个子键,我们可以自行添加。如果要恢复 USB 磁盘的写功能,那么将 WriteProtect 的值设置为 0 。

下面用程序来实现这个功能:
[C++] 纯文本查看 复制代码
// UProtector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
#include <winreg.h>

int protecter(DWORD dw, HKEY hKey)
{
    HKEY hSubKey;

    RegCreateKeyEx(hKey, _T("StorageDevicePolicies"), 0, NULL, NULL, KEY_READ | KEY_WRITE, NULL, &hSubKey, NULL);

    if (ERROR_SUCCESS != RegSetValueEx(hSubKey, _T("WriteProtect"), NULL, REG_DWORD, (const byte *)&dw, sizeof(DWORD)))
        return 0;   
    else
        return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int flag = 0;
    DWORD lck;

    if (argc != 2 || (_tstoi(argv[1]) != 0 && _tstoi(argv[1]) != 1) ) {
        _tprintf(_T("Usage: DiskLock.exe 0 | 1\n"));
        exit (EXIT_FAILURE);
    }

    HKEY  hSDP;

    if ( RegOpenKeyEx ( HKEY_LOCAL_MACHINE,
                        _T("SYSTEM\\CurrentControlSet\\Control"),
                        0, KEY_READ | KEY_WRITE, &hSDP
                        ) == ERROR_SUCCESS )
    {
            lck = _tstoi(argv[1]);

            flag = protecter(lck, hSDP);

            if(flag && lck == 1) {
                _tprintf(_T("Lock disk Successful!\n"));
                exit(EXIT_SUCCESS);
            }
            else if (flag && lck == 0) {
                _tprintf(_T("Unlock disk Successful!\n"));
                exit(EXIT_SUCCESS);
            }
            if (flag == 0 && lck == 1) {
                _tprintf(_T("Lock disk Failure!\n"));
                exit(EXIT_FAILURE);
            }
            else if (flag == 0 && lck == 0) {
                _tprintf (_T("Unlock disk failure!\n"));
                exit(EXIT_FAILURE);
            }
    }
    else {
            _tprintf(_T("Can not access to registry key\n"));
            exit(EXIT_FAILURE);
    }

    return 0;

}

运行方法:
[attach]1525[/attach]
接参数 1 时启动写保护,0 时解锁。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2