首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言呼叫 Windows SetupAPI 停用網路介面卡完整範例

     編輯:關於C語言

功能說明

程式列舉系統所有裝置,找出類別為「Net」(網路介面卡)且裝置例項 ID 以「PCI」開頭的裝置,呼叫 SetupAPI 將其停用。適用於自動化部署、測試環境重置等場景。

核心 API 流程

  1. SetupDiGetClassDevs:取得裝置資訊集合(DIGCF_PRESENT | DIGCF_ALLCLASSES)。
  2. SetupDiEnumDeviceInfo:逐一列舉裝置。
  3. SetupDiClassNameFromGuid:取得類別名稱,篩選 "Net"。
  4. SetupDiGetDeviceInstanceId:取得例項 ID,篩選 "PCI" 前綴。
  5. SetupDiSetClassInstallParams + SetupDiChangeState:設定 DICS_DISABLE 狀態變更並套用。

完整原始碼

#include <stdio.h>
#include <windows.h>
#include <Setupapi.h>
#include <objbase.h>

void EnumDevices(HDEVINFO hDevInfo) {
    SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
    LPOLESTR guid;
    char devName[128], instanceId[128];

    for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) {
        StringFromCLSID(DeviceInfoData.ClassGuid, &guid);
        SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL);

        if (strcmp(devName, "Net") == 0) {
            SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId, 128, NULL);
            if (strncmp(instanceId, "PCI", 3) == 0) {
                wprintf(L"%s\n", guid);
                printf("%s\n", devName);
                printf("%s\n", instanceId);

                SP_PROPCHANGE_PARAMS params = { sizeof(SP_CLASSINSTALL_HEADER) };
                params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
                params.Scope = DICS_FLAG_CONFIGSPECIFIC;
                params.StateChange = DICS_DISABLE;
                params.HwProfile = 0;

                SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData,
                    (SP_CLASSINSTALL_HEADER*)&params, sizeof(SP_PROPCHANGE_PARAMS));
                SetupDiChangeState(hDevInfo, &DeviceInfoData);
            }
        }
        CoTaskMemFree(guid);
    }
}

int main(int argc, char* argv[]) {
    HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL,
        DIGCF_PRESENT | DIGCF_ALLCLASSES);
    if (hDevInfo == INVALID_HANDLE_VALUE) return GetLastError();

    EnumDevices(hDevInfo);
    SetupDiDestroyDeviceInfoList(hDevInfo);
    return 0;
}

編譯與執行注意事項

  • 需連結 Setupapi.lib、Ole32.lib。
  • 需管理員權限執行(停用裝置需要)。
  • 僅影響當前硬體設定檔(HwProfile=0),重啟後恢復。
  • 篩選條件 "PCI" 針對內建/PCIe 網卡;USB、虛擬網卡可能需調整。

進階擴充

  • 加入命令列參數支援啟用/停用/切換特定介面卡。
  • 整合 INetCfg COM 介面實現更精細的網路組態管理(IP、綁定順序等)。
  • 搭配 DevCon.exe (Windows DDK 工具) 進行無程式碼操作對比驗證。

常見問題排查

現象可能原因解決
SetupDiGetClassDevs 失敗缺少 Setupapi.lib 連結專案設定加入 Setupapi.lib
存取被拒絕非管理員執行以系統管理員身分執行
未找到目標網卡類別名非 "Net" 或 InstanceId 不以 PCI 開頭輸出 devName/instanceId 確認實際值調整篩選

本範例展示了以 C 語言直接呼叫 Windows 系統級 API 管理硬體裝置的標準模式,可作為裝置管理工具開發的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved