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

  • 相关阅读:
    jQuery轮播图(一)轮播实现并封装
    openSUSE 12.3 默认启动项
    最大堆(最小堆)
    二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)
    二叉树基本操作续一:二叉树建立、节点数统计
    二叉树基本操作:前序、中序、后序遍历(递归方式)
    Android如何打印std::cout/printf(重定向stdout)
    textarea高度跟随文字高度而变化
    箭头函数与普通函数的区别
    浏览器兼容问题
  • 原文地址:https://www.cnblogs.com/strive-sun/p/12893190.html
Copyright © 2011-2022 走看看