/// <summary> /// 开启或者关闭指定的设备驱动 /// 注意:该方法目前没有检查是否需要重新启动计算机。^.^ /// </summary> /// <param name="hDevInfo"></param> /// <param name="devInfoData"></param> /// <param name="bEnable"></param> /// <returns></returns> private bool OpenClose(IntPtr hDevInfo, Externs.SP_DEVINFO_DATA devInfoData, bool bEnable, bool isRemove = false) { try { int szOfPcp; IntPtr ptrToPcp; int szDevInfoData; IntPtr ptrToDevInfoData; Externs.SP_PROPCHANGE_PARAMS SP_PROPCHANGE_PARAMS1 = new Externs.SP_PROPCHANGE_PARAMS(); SP_REMOVEDEVICE_PARAMS SP_REMOVEDEVICE_PARAMS1 = new SP_REMOVEDEVICE_PARAMS(); if (bEnable) { SP_PROPCHANGE_PARAMS1.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Externs.SP_CLASSINSTALL_HEADER)); SP_PROPCHANGE_PARAMS1.ClassInstallHeader.InstallFunction = Externs.DIF_PROPERTYCHANGE; SP_PROPCHANGE_PARAMS1.StateChange = Externs.DICS_ENABLE; SP_PROPCHANGE_PARAMS1.Scope = Externs.DICS_FLAG_GLOBAL; SP_PROPCHANGE_PARAMS1.HwProfile = 0; szOfPcp = Marshal.SizeOf(SP_PROPCHANGE_PARAMS1); ptrToPcp = Marshal.AllocHGlobal(szOfPcp); Marshal.StructureToPtr(SP_PROPCHANGE_PARAMS1, ptrToPcp, true); szDevInfoData = Marshal.SizeOf(devInfoData); ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData); if (Externs.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Externs.SP_PROPCHANGE_PARAMS)))) { Externs.SetupDiCallClassInstaller(Externs.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData); } SP_PROPCHANGE_PARAMS1.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Externs.SP_CLASSINSTALL_HEADER)); SP_PROPCHANGE_PARAMS1.ClassInstallHeader.InstallFunction = Externs.DIF_PROPERTYCHANGE; SP_PROPCHANGE_PARAMS1.StateChange = Externs.DICS_ENABLE; SP_PROPCHANGE_PARAMS1.Scope = Externs.DICS_FLAG_CONFIGSPECIFIC; SP_PROPCHANGE_PARAMS1.HwProfile = 0; } else { SP_PROPCHANGE_PARAMS1.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Externs.SP_CLASSINSTALL_HEADER)); if (isRemove == true) { SP_REMOVEDEVICE_PARAMS1.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Externs.SP_CLASSINSTALL_HEADER)); SP_REMOVEDEVICE_PARAMS1.ClassInstallHeader.InstallFunction = Externs.DIF_REMOVE; SP_REMOVEDEVICE_PARAMS1.Scope = Externs.DI_REMOVEDEVICE_GLOBAL; SP_REMOVEDEVICE_PARAMS1.HwProfile = 0; } else { SP_PROPCHANGE_PARAMS1.ClassInstallHeader.InstallFunction = Externs.DIF_PROPERTYCHANGE; SP_PROPCHANGE_PARAMS1.StateChange = Externs.DICS_DISABLE; SP_PROPCHANGE_PARAMS1.Scope = Externs.DICS_FLAG_CONFIGSPECIFIC; SP_PROPCHANGE_PARAMS1.HwProfile = 0; } } szDevInfoData = Marshal.SizeOf(devInfoData); ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData); Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true); bool rslt1 = false; bool rstl2 = false; if (isRemove == true && bEnable == false) { szOfPcp = Marshal.SizeOf(SP_REMOVEDEVICE_PARAMS1); ptrToPcp = Marshal.AllocHGlobal(szOfPcp); Marshal.StructureToPtr(SP_REMOVEDEVICE_PARAMS1, ptrToPcp, true); rslt1 = Externs.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Externs.SP_REMOVEDEVICE_PARAMS))); rstl2 = Externs.SetupDiCallClassInstaller(Externs.DIF_REMOVE, hDevInfo, ptrToDevInfoData); } else { szOfPcp = Marshal.SizeOf(SP_PROPCHANGE_PARAMS1); ptrToPcp = Marshal.AllocHGlobal(szOfPcp); Marshal.StructureToPtr(SP_PROPCHANGE_PARAMS1, ptrToPcp, true); rslt1 = Externs.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Externs.SP_PROPCHANGE_PARAMS))); rstl2 = Externs.SetupDiCallClassInstaller(Externs.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData); } if ((!rslt1) || (!rstl2)) { throw new Exception("不能更改设备状态。"); } else { return(true); } } catch (Exception ex) { return(false); } }