zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    vue滑块拖拽校验
    vue和原生自动聚焦
    vue实现bar左右拖拽
    fastclick插件使用
    三大家族易忘点和案例
    移动端调试工具chrome+devtools
    restful 与 webapi 详解
    .NET Core 中依赖注入框架详解 Autofac
    .NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)
    C# 通过DataSet 获取SQL 存储过程返回的多个结果集(tables)
  • 原文地址:https://www.cnblogs.com/strive-sun/p/12893190.html
Copyright © 2011-2022 走看看