• win32-SetupDiSetClassInstallParamsW的使用


    SetupDiSetClassInstallParams函数一般是用来禁用/启用某个设备

    比如我们可以禁用网络适配器

    /* for Devpkey */
    #define INITGUID
    
    /* dependencies */
    #pragma comment (lib, "SetupAPI")
    #include <windows.h>
    #include <SetupAPI.h>
    #include <Devpkey.h>
    #include <iostream>
    #include <stdio.h>
    #include <devguid.h>
    
    using namespace std;
    
    VOID SetDeviceState(LPCWSTR lpszHardwareId, DWORD dwState)
    {
        HDEVINFO devInfo;
    
        if (devInfo = SetupDiGetClassDevsW(NULL, NULL, NULL, DIGCF_ALLCLASSES))
        {
            DWORD dwBuffersize;
            SP_DEVINFO_DATA devData;
            DEVPROPTYPE devProptype;
            LPWSTR devBuffer;
    
            devData.cbSize = sizeof(SP_DEVINFO_DATA);
            for (int i = 0; ; i++)
            {
                SetupDiEnumDeviceInfo(devInfo, i, &devData);
                if (GetLastError() == ERROR_NO_MORE_ITEMS) break;
    
                /* calculate buffer size */
                SetupDiGetDevicePropertyW(devInfo, &devData, &DEVPKEY_Device_HardwareIds, &devProptype, NULL, 0, &dwBuffersize, 0);
    
                /* real call */
                if (devBuffer = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, dwBuffersize))
                {
                    SetupDiGetDevicePropertyW(devInfo, &devData, &DEVPKEY_Device_HardwareIds, &devProptype, (PBYTE)devBuffer, dwBuffersize, NULL, 0);
    //                cout << devBuffer << endl;
    //                printf("%s
    ", devBuffer);
                    if (lstrcmpW(devBuffer, lpszHardwareId) == 0)
                    {
                        /* matched */
                        SP_CLASSINSTALL_HEADER ciHeader;
                        ciHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
                        ciHeader.InstallFunction = DIF_PROPERTYCHANGE;
    
                        SP_PROPCHANGE_PARAMS pcParams;
                        pcParams.ClassInstallHeader = ciHeader;
                        pcParams.StateChange = dwState;
                        pcParams.Scope = DICS_FLAG_GLOBAL;
                        pcParams.HwProfile = 0;
    
                        BOOL FLAG = SetupDiSetClassInstallParamsW(devInfo, &devData, (PSP_CLASSINSTALL_HEADER)&pcParams, sizeof(SP_PROPCHANGE_PARAMS));
                        SetupDiChangeState(devInfo, &devData);
                    }
                    HeapFree(GetProcessHeap(), 0, devBuffer);
                }
            }
            SetupDiDestroyDeviceInfoList(devInfo);
        }
    }
    
    
    int main()
    {
        SetDeviceState(L"PCI\VEN_8086&DEV_15E3&SUBSYS_07A11028&REV_00", DICS_DISABLE); 

    return 0;
    }

     我们可以从设备管理器中查看硬件的ID

  • 相关阅读:
    算法第四章上机实验报告
    算法第四章作业
    算法第三章上机实验报告
    算法第三章作业
    算法第二章上机实验报告
    算法第二章作业
    第五次c++作业总结
    第三次c++作业总结
    Linux上部署Java项目
    JVM类加载
  • 原文地址:https://www.cnblogs.com/strive-sun/p/12893190.html
Copyright © 2020-2023  润新知