停用及启用磁盘设备、修改盘符代码

来源:互联网 发布:淘宝刷手会受到处罚吗 编辑:程序博客网 时间: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);
}

原创粉丝点击