Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/46: Рейтинг темы: голосов - 46, средняя оценка - 4.78
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
.NET 4.x

Единый для всех версий Windows (от 5.1 и выше), способ для вкл\выкл сетевого адаптера

23.09.2013, 21:09. Показов 9984. Ответов 22
Метки wmi (Все метки)

Студворк — интернет-сервис помощи студентам
Сабж. Нужен способ отключение и включения адаптера который бы работал на всех виндовсах...

Перепробовал уже столько утилит и способов что моск счас взорвется, и ни один способ не работает на WinXP, WinVista и Win7...

Помогите пожалуйста может быть кто не будь знает как это нормально реализовать...

Добавлено через 11 часов 22 минуты
неужели нету способа?(

Добавлено через 5 часов 6 минут
Во общем наверно придётся реализововать два разных способа отключения адаптеров для WinXP и для WinVista\Win7...
В связи с этим ищу адекватный, и 100% работающий способ отключения девайса по ID\GUID\Name\PNPDeviceID для 'WinXP'.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2013, 21:09
Ответы с готовыми решениями:

API Windows для вкл/выкл. BT, WIFI, увеличения и уменьшения яркости экрана
Добрый день. Имеется ли в .Net Framework API для включения/отключения BT, WIFI и управления яркостью экрана, а так же включения режима...

Вкл/выкл inserta для RichEdit
Нужно сделать, что бы в поле RichEdit всегда был включен insert (т.е. при вводе с клавиатуры символы заменялись, а не вставлялись). ...

Как задать единый размер для всех папок в Windows XP?
Добрый день, дорогие форумчане, у меня есть один вопрос - как задать единый размер для всех папок в WinXP? Пробовал задать размер, потом...

22
 Аватар для kesean
292 / 291 / 108
Регистрация: 04.09.2010
Сообщений: 638
24.09.2013, 13:05
DevCon
Я использовал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
                using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled = 'True'"))
                {
                    var rr = searcher.Get();
                    foreach (ManagementObject adapter in searcher.Get())
                    {
                        try
                        {
                            using (ManagementObjectSearcher searcher1 = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter where Caption='" + adapter["Caption"] + "'"))
                            {
                                foreach (ManagementObject adapter1 in searcher1.Get())
                                {
                                    try
                                    {
                                        if (adapter1["PNPDeviceID"].ToString() != "")
                                        {
                                            System.Diagnostics.Process proc = System.Diagnostics.Process.Start("cmd.exe", "/C " + "devcon disable " + adapter1["PNPDeviceID"].ToString());
                                            proc.WaitForExit();
                                        }
 
                                    }
                                    finally
                                    {
                                        adapter1.Dispose();
                                    }
                                }
                            }
                        }
                        finally
                        {
                            adapter.Dispose();
                        }
                    }
                }
Работало на любых осях
1
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
24.09.2013, 17:39  [ТС]
О этой утилите читал уже, но у меня на Win7 x64 не работает... Плюс он рубит не подключение а Девайс, и рубит по PNPDeviceID, и если у девайсов похожие 'PNPDeviceID'(На пример на VMWare) то упадут все адаптеры, а вместе с ними и подключения на них, с похожим 'PNPDeviceID'...

Ну а так то нашёл хороший скрипт написаный на VB, сейчас пробую переделать эго под c#... Работаетон через Shell32. Пробовал уже такой же скрипт переписаный на c# - не работает ничерта чё то... Так что счас буду как то пробовать вызывать этот VB скрипт из-под c# кода...

з.ы. Ну эти танцы мне нужно чисто для WinXP... Ибо по MSDN'у, виндовсы, выше 6.0 поддерживают методы 'Enable()', 'Disable()' в WMI, так что лучше, думаю, использовать их...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.09.2013, 17:47
Цитата Сообщение от siriusED Посмотреть сообщение
Нужен способ отключение и включения адаптера который бы работал на всех виндовсах...
Перепробовал уже столько утилит и способов что моск счас взорвется, и ни один способ не работает на WinXP, WinVista и Win7...
Помогите пожалуйста может быть кто не будь знает как это нормально реализовать...
Через SetupDi-функции найти нужное устройство (по hardware id или по device instance id),
затем вызвать SetupDiCallClassInstaller с кодом DIF_PROPERTYCHANGE и DICS_ENABLE/DICS_DISABLE.
2
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
24.09.2013, 18:10  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Через SetupDi-функции найти нужное устройство (по hardware id или по device instance id),
затем вызвать SetupDiCallClassInstaller с кодом DIF_PROPERTYCHANGE и DICS_ENABLE/DICS_DISABLE.
Вот у меня есть какая-то библиотека
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
using System;
using System.Text;
using System.Collections.Generic;
using DisableDevice;
using System.Runtime.InteropServices;
using System.ComponentModel;
using Microsoft.Win32.SafeHandles;
using System.Security;
using System.Runtime.ConstrainedExecution;
using System.Management;
 
namespace DisableDevice
{
 
    [Flags()]
    internal enum SetupDiGetClassDevsFlags
    {
        Default = 1,
        Present = 2,
        AllClasses = 4,
        Profile = 8,
        DeviceInterface = (int)0x10
    }
 
    internal enum DiFunction
    {
        SelectDevice = 1,
        InstallDevice = 2,
        AssignResources = 3,
        Properties = 4,
        Remove = 5,
        FirstTimeSetup = 6,
        FoundDevice = 7,
        SelectClassDrivers = 8,
        ValidateClassDrivers = 9,
        InstallClassDrivers = (int)0xa,
        CalcDiskSpace = (int)0xb,
        DestroyPrivateData = (int)0xc,
        ValidateDriver = (int)0xd,
        Detect = (int)0xf,
        InstallWizard = (int)0x10,
        DestroyWizardData = (int)0x11,
        PropertyChange = (int)0x12,
        EnableClass = (int)0x13,
        DetectVerify = (int)0x14,
        InstallDeviceFiles = (int)0x15,
        UnRemove = (int)0x16,
        SelectBestCompatDrv = (int)0x17,
        AllowInstall = (int)0x18,
        RegisterDevice = (int)0x19,
        NewDeviceWizardPreSelect = (int)0x1a,
        NewDeviceWizardSelect = (int)0x1b,
        NewDeviceWizardPreAnalyze = (int)0x1c,
        NewDeviceWizardPostAnalyze = (int)0x1d,
        NewDeviceWizardFinishInstall = (int)0x1e,
        Unused1 = (int)0x1f,
        InstallInterfaces = (int)0x20,
        DetectCancel = (int)0x21,
        RegisterCoInstallers = (int)0x22,
        AddPropertyPageAdvanced = (int)0x23,
        AddPropertyPageBasic = (int)0x24,
        Reserved1 = (int)0x25,
        Troubleshooter = (int)0x26,
        PowerMessageWake = (int)0x27,
        AddRemotePropertyPageAdvanced = (int)0x28,
        UpdateDriverUI = (int)0x29,
        Reserved2 = (int)0x30
    }
 
    internal enum StateChangeAction
    {
        Enable = 1,
        Disable = 2,
        PropChange = 3,
        Start = 4,
        Stop = 5
    }
 
    [Flags()]
    internal enum Scopes
    {
        Global = 1,
        ConfigSpecific = 2,
        ConfigGeneral = 4
    }
 
    internal enum SetupApiError
    {
        NoAssociatedClass = unchecked((int)0xe0000200),
        ClassMismatch = unchecked((int)0xe0000201),
        DuplicateFound = unchecked((int)0xe0000202),
        NoDriverSelected = unchecked((int)0xe0000203),
        KeyDoesNotExist = unchecked((int)0xe0000204),
        InvalidDevinstName = unchecked((int)0xe0000205),
        InvalidClass = unchecked((int)0xe0000206),
        DevinstAlreadyExists = unchecked((int)0xe0000207),
        DevinfoNotRegistered = unchecked((int)0xe0000208),
        InvalidRegProperty = unchecked((int)0xe0000209),
        NoInf = unchecked((int)0xe000020a),
        NoSuchHDevinst = unchecked((int)0xe000020b),
        CantLoadClassIcon = unchecked((int)0xe000020c),
        InvalidClassInstaller = unchecked((int)0xe000020d),
        DiDoDefault = unchecked((int)0xe000020e),
        DiNoFileCopy = unchecked((int)0xe000020f),
        InvalidHwProfile = unchecked((int)0xe0000210),
        NoDeviceSelected = unchecked((int)0xe0000211),
        DevinfolistLocked = unchecked((int)0xe0000212),
        DevinfodataLocked = unchecked((int)0xe0000213),
        DiBadPath = unchecked((int)0xe0000214),
        NoClassInstallParams = unchecked((int)0xe0000215),
        FileQueueLocked = unchecked((int)0xe0000216),
        BadServiceInstallSect = unchecked((int)0xe0000217),
        NoClassDriverList = unchecked((int)0xe0000218),
        NoAssociatedService = unchecked((int)0xe0000219),
        NoDefaultDeviceInterface = unchecked((int)0xe000021a),
        DeviceInterfaceActive = unchecked((int)0xe000021b),
        DeviceInterfaceRemoved = unchecked((int)0xe000021c),
        BadInterfaceInstallSect = unchecked((int)0xe000021d),
        NoSuchInterfaceClass = unchecked((int)0xe000021e),
        InvalidReferenceString = unchecked((int)0xe000021f),
        InvalidMachineName = unchecked((int)0xe0000220),
        RemoteCommFailure = unchecked((int)0xe0000221),
        MachineUnavailable = unchecked((int)0xe0000222),
        NoConfigMgrServices = unchecked((int)0xe0000223),
        InvalidPropPageProvider = unchecked((int)0xe0000224),
        NoSuchDeviceInterface = unchecked((int)0xe0000225),
        DiPostProcessingRequired = unchecked((int)0xe0000226),
        InvalidCOInstaller = unchecked((int)0xe0000227),
        NoCompatDrivers = unchecked((int)0xe0000228),
        NoDeviceIcon = unchecked((int)0xe0000229),
        InvalidInfLogConfig = unchecked((int)0xe000022a),
        DiDontInstall = unchecked((int)0xe000022b),
        InvalidFilterDriver = unchecked((int)0xe000022c),
        NonWindowsNTDriver = unchecked((int)0xe000022d),
        NonWindowsDriver = unchecked((int)0xe000022e),
        NoCatalogForOemInf = unchecked((int)0xe000022f),
        DevInstallQueueNonNative = unchecked((int)0xe0000230),
        NotDisableable = unchecked((int)0xe0000231),
        CantRemoveDevinst = unchecked((int)0xe0000232),
        InvalidTarget = unchecked((int)0xe0000233),
        DriverNonNative = unchecked((int)0xe0000234),
        InWow64 = unchecked((int)0xe0000235),
        SetSystemRestorePoint = unchecked((int)0xe0000236),
        IncorrectlyCopiedInf = unchecked((int)0xe0000237),
        SceDisabled = unchecked((int)0xe0000238),
        UnknownException = unchecked((int)0xe0000239),
        PnpRegistryError = unchecked((int)0xe000023a),
        RemoteRequestUnsupported = unchecked((int)0xe000023b),
        NotAnInstalledOemInf = unchecked((int)0xe000023c),
        InfInUseByDevices = unchecked((int)0xe000023d),
        DiFunctionObsolete = unchecked((int)0xe000023e),
        NoAuthenticodeCatalog = unchecked((int)0xe000023f),
        AuthenticodeDisallowed = unchecked((int)0xe0000240),
        AuthenticodeTrustedPublisher = unchecked((int)0xe0000241),
        AuthenticodeTrustNotEstablished = unchecked((int)0xe0000242),
        AuthenticodePublisherNotTrusted = unchecked((int)0xe0000243),
        SignatureOSAttributeMismatch = unchecked((int)0xe0000244),
        OnlyValidateViaAuthenticode = unchecked((int)0xe0000245)
    }
 
    [StructLayout(LayoutKind.Sequential)]
    internal struct DeviceInfoData
    {
        public int Size;
        public Guid ClassGuid;
        public int DevInst;
        public IntPtr Reserved;
    }
 
    [StructLayout(LayoutKind.Sequential)]
    internal struct PropertyChangeParameters
    {
        public int Size;
        // part of header. It's flattened out into 1 structure.
        public DiFunction DiFunction;
        public StateChangeAction StateChange;
        public Scopes Scope;
        public int HwProfile;
    }
 
    internal class NativeMethods
    {
 
        private const string setupapi = "setupapi.dll";
 
        private NativeMethods()
        {
        }
 
        [DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetupDiCallClassInstaller(DiFunction installFunction, SafeDeviceInfoSetHandle deviceInfoSet, [In()]
ref DeviceInfoData deviceInfoData);
 
        [DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetupDiEnumDeviceInfo(SafeDeviceInfoSetHandle deviceInfoSet, int memberIndex, ref DeviceInfoData deviceInfoData);
 
        [DllImport(setupapi, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode, SetLastError = true)]
        public static extern SafeDeviceInfoSetHandle SetupDiGetClassDevs([In()]
ref Guid classGuid, [MarshalAs(UnmanagedType.LPWStr)]
string enumerator, IntPtr hwndParent, SetupDiGetClassDevsFlags flags);
 
        /*
        [DllImport(setupapi, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetupDiGetDeviceInstanceId(SafeDeviceInfoSetHandle deviceInfoSet, [In()]
ref DeviceInfoData did, [MarshalAs(UnmanagedType.LPTStr)]
StringBuilder deviceInstanceId, int deviceInstanceIdSize, [Out()]
ref int requiredSize);
        */
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetupDiGetDeviceInstanceId(
           IntPtr DeviceInfoSet,
           ref DeviceInfoData did,
           [MarshalAs(UnmanagedType.LPTStr)] StringBuilder DeviceInstanceId,
           int DeviceInstanceIdSize,
           out int RequiredSize
        );
 
        [SuppressUnmanagedCodeSecurity()]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetupDiDestroyDeviceInfoList(IntPtr deviceInfoSet);
 
        [DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetupDiSetClassInstallParams(SafeDeviceInfoSetHandle deviceInfoSet, [In()]
ref DeviceInfoData deviceInfoData, [In()]
ref PropertyChangeParameters classInstallParams, int classInstallParamsSize);
 
    }
 
    internal class SafeDeviceInfoSetHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
 
        public SafeDeviceInfoSetHandle()
            : base(true)
        {
        }
 
        protected override bool ReleaseHandle()
        {
            return NativeMethods.SetupDiDestroyDeviceInfoList(this.handle);
        }
 
    }
 
    public sealed class DeviceHelper
    {
 
        private DeviceHelper()
        {
        }
 
        /// <summary>
        /// Enable or disable a device.
        /// </summary>
        /// <param name="classGuid">The class guid of the device. Available in the device manager.</param>
        /// <param name="instanceId">The device instance id of the device. Available in the device manager.</param>
        /// <param name="enable">True to enable, False to disable.</param>
        /// <remarks>Will throw an exception if the device is not Disableable.</remarks>
        public static void SetDeviceEnabled(Guid classGuid, string instanceId, bool enable)
        {
            SafeDeviceInfoSetHandle diSetHandle = null;
            try
            {
                // Get the handle to a device information set for all devices matching classGuid that are present on the 
                // system.
                diSetHandle = NativeMethods.SetupDiGetClassDevs(ref classGuid, null, IntPtr.Zero, SetupDiGetClassDevsFlags.Present);
                // Get the device information data for each matching device.
                DeviceInfoData[] diData = GetDeviceInfoData(diSetHandle); /////////////// - Вот здесь загвоздка(Возвращается 'null') - /////////////////////////
                // Find the index of our instance. i.e. the touchpad mouse - I have 3 mice attached...
                int index = GetIndexOfInstance(diSetHandle, diData, instanceId);
                // Disable...
                EnableDevice(diSetHandle, diData[index], enable);
            }
            finally
            {
                if (diSetHandle != null)
                {
                    if (diSetHandle.IsClosed == false)
                    {
                        diSetHandle.Close();
                    }
                    diSetHandle.Dispose();
                }
            }
        }
 
        private static DeviceInfoData[] GetDeviceInfoData(SafeDeviceInfoSetHandle handle)
        {
            List<DeviceInfoData> data = new List<DeviceInfoData>();
            DeviceInfoData did = new DeviceInfoData();
            int didSize = Marshal.SizeOf(did);
            did.Size = didSize;
            int index = 0;
            while (NativeMethods.SetupDiEnumDeviceInfo(handle, index, ref did))
            {
                data.Add(did);
                index += 1;
                did = new DeviceInfoData();
                did.Size = didSize;
            }
            return data.ToArray();
        }
 
        // Find the index of the particular DeviceInfoData for the instanceId.
        private static int GetIndexOfInstance(SafeDeviceInfoSetHandle handle, DeviceInfoData[] diData, string instanceId)
        {
            const int ERROR_INSUFFICIENT_BUFFER = 122;
            for (int index = 0; index <= diData.Length - 1; index++)
            {
                StringBuilder sb = new StringBuilder(1);
                int requiredSize = 0;
                bool result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                if (result == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
                {
                    sb.Capacity = requiredSize;
                    result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                }
                if (result == false)
                    throw new Win32Exception();
                if (instanceId.Equals(sb.ToString()))
                {
                    return index;
                }
            }
            // not found
            return -1;
        }
 
        // enable/disable...
        private static void EnableDevice(SafeDeviceInfoSetHandle handle, DeviceInfoData diData, bool enable)
        {
            PropertyChangeParameters @params = new PropertyChangeParameters();
            // The size is just the size of the header, but we've flattened the structure.
            // The header comprises the first two fields, both integer.
            @params.Size = 8;
            @params.DiFunction = DiFunction.PropertyChange;
            @params.Scope = Scopes.Global;
            if (enable)
            {
                @params.StateChange = StateChangeAction.Enable;
            }
            else
            {
                @params.StateChange = StateChangeAction.Disable;
            }
 
            bool result = NativeMethods.SetupDiSetClassInstallParams(handle, ref diData, ref @params, Marshal.SizeOf(@params));
            if (result == false) throw new Win32Exception();
            result = NativeMethods.SetupDiCallClassInstaller(DiFunction.PropertyChange, handle, ref diData);
            if (result == false)
            {
                int err = Marshal.GetLastWin32Error();
                if (err == (int)SetupApiError.NotDisableable)
                    throw new ArgumentException("Device can't be disabled (programmatically or in Device Manager).");
                else if (err >= (int)SetupApiError.NoAssociatedClass && err <= (int)SetupApiError.OnlyValidateViaAuthenticode)
                    throw new Win32Exception("SetupAPI error: " + ((SetupApiError)err).ToString());
                else
                    throw new Win32Exception();
            }
        }
    }
}
Пробовал юзать как было написано, не работало, проблемное место закоментил в коде библиотеки(Строка #275).
Возможно я что то не так делал или не нужно делать всё это, посмотрите на эту либу и скажите что там и как нужно именно зделать что б работало.

Вызывал вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
public static void EnableVideoDrivers(bool enable)
{
    // every type of device has a hard-coded GUID, put here the one for
    // video drivers
    Guid adapterGuid = new Guid("{device GUID}");
 
    // get this from the properties dialog box of this device in Device Manager
    string instancePath = @"Device Instance Path";
 
    DeviceHelper.SetDeviceEnabled(adapterGuid, instancePath, enable);
}
P.S. DeviceGUID, DeviceID, DeviceName всё эти данные для определения адаптера у меня есть...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.09.2013, 18:14
Цитата Сообщение от siriusED Посмотреть сообщение
P.S. DeviceGUID, DeviceID, DeviceName всё эти данные для определения адаптера у меня есть...
Можете скопировать сюда DeviceGUID ?
1
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
24.09.2013, 18:23  [ТС]
Ну на пример вот такой вот с первой карты:
"{88EECAC4-1DC0-49F6-872C-EA2C84CF8F2F}"
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.09.2013, 18:30
Искать устройства нужно по GUID-ам из категории Device Setup Classes или Device Interfaces:
System-Defined Device Setup Classes Available to Vendors
System-Defined Device Interface Classes
2
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
24.09.2013, 18:57  [ТС]
Ну теперь на Win7 работает нормально, только на WinXP по прежнему не работает ((
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.09.2013, 19:01
А что происходит на XP ?

Покажите GUID, который Вы используете.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
24.09.2013, 21:16  [ТС]
Ну на Win7 использую и работает нормально:
Network Adapter

Class = Net
ClassGuid = {4d36e972-e325-11ce-bfc1-08002be10318}

А на XP происходит - ничего... ни ошибки ничего не вылазит, просто не работает и всё...

Добавлено через 9 минут
+В качестве 'string instanceId' передаю 'PNPDeviceID' например "PCI\VEN_1022&DEV_2000&SUBSYS_20001022&R EV_10\4&47B7341&0&0888"

Добавлено через 2 часа 0 минут
Во общем ID адаптера определяется нормально, значит трабла в методе 'EnableDevice()', сейчас буду шаманить, может кто вкурсе почему на Win7 работает этот метод а на WinXP нет?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.09.2013, 21:18
Цитата Сообщение от siriusED Посмотреть сообщение
Во общем ID адаптера определяется нормально, значит трабла в методе 'EnableDevice()', сейчас буду шаманить, может кто вкурсе почему на Win7 работает этот метод а на WinXP нет?

Не по теме:


Напишу позже, сейчас времени нет нормально ответить.

0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
24.09.2013, 21:56  [ТС]
Буду очень сильно благодарен за любую помощь в решении этой траблы на WinXP...

p.s. 'SetupDiSetClassInstallParams()' и 'SetupDiCallClassInstaller()' в методе 'EnableDevice()'' оба возвращают 'true'. Но почему не меняют я понять не могу...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.09.2013, 00:33
{4d36e972-e325-11ce-bfc1-08002be10318} - это GUID_DEVINTERFACE_NET,
этот интерфейс поддерживается, начиная с Windows Server 2003 и Windows Vista.
На Windows XP его нет, там нужно использовать GUID_NDIS_LAN_CLASS:
Code
1
DEFINE_GUID(GUID_NDIS_LAN_CLASS, 0xad498944, 0x762f, 0x11d0, 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
Проверил только что на Windows XP с тремя сетевыми картами - работает.
2
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
25.09.2013, 00:53  [ТС]
Это просто замечательно!!!! Но куда именно мне, в моей библиотеке, этот код сувать скажите ещё?

Извеняйте за нубство, всего 2недели назад начал c# учить....
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.09.2013, 01:03
Цитата Сообщение от Убежденный Посмотреть сообщение
{4d36e972-e325-11ce-bfc1-08002be10318} - это GUID_DEVINTERFACE_NET
Я был неточен. Это GUID_DEVCLASS_NET, он-то на XP как раз присутствует.

Попробуйте вот этот GUID - {AD498944-762F-11D0-8DCB-00C04FC3358C}
Это GUID_NDIS_LAN_CLASS (это device interface), у меня с ним на XP все работает.

Не по теме:


Позже напишу подробнее, как происходит включение/выключение.
Сегодня тяжелый день был, отдыхать надо ;)

2
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
25.09.2013, 01:15  [ТС]
Нет, с этим не работает(( Даже не определяется индекс... То есть в этом классе мои адаптеры не находит...

Добавлено через 9 минут
Вот в "{4d36e972-e325-11ce-bfc1-08002be10318}" ищет всё нормально что на Win7 что на WinXP, только на семёрке отключает а на XP почему-то нет... Гляньте метод 'EnableDevice()' в этой библиотеке, проблема почему-то именно там...

Кстати какой вы метод используете для получения девайсов с класса '{AD498944-762F-11D0-8DCB-00C04FC3358C}'?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.09.2013, 11:07
Любые устройства можно искать по двум критериям - setup class и interface class.
Разница между этими понятиями очень зыбкая. Если упрощенно, setup class - это категория
установки, к которой относится устройство, например USB, а interface class - это интерфейс,
который поддерживается устройством, например клавиатура.

Конкретно сетевые адаптеры можно искать по:
Code
1
2
3
4
5
6
7
8
device setup class
 
    GUID_DEVCLASS_NET     - {4d36e972-e325-11ce-bfc1-08002be10318}
 
device interface class
 
    GUID_DEVINTERFACE_NET - {CAC88484-7515-4C03-82E6-71A87ABAC361}
    GUID_NDIS_LAN_CLASS   - {AD498944-762F-11D0-8DCB-00C04FC3358C}
GUID_DEVINTERFACE_NET не поддерживается в Windows XP, для поиска сетевых карт по
interface class там нужно использовать GUID_NDIS_LAN_CLASS.

Общий принцип поиска устройств таков:

1) Вызываем SetupDiGetClassDevs, передавая ей GUID нужного setup class или interface class.
Если ищется device interface class, нужно передать флаг DIGCF_DEVICEINTERFACE (0x10).

2) Найденный набор устройств (device information set) перебирается функцией SetupDiEnumDeviceInfo,
увеличивая индекс перечисления на каждом шаге. Когда все найденные устройства будут перечислены,
функция вернет ошибку, а GetLastError будет равен ERROR_NO_MORE_ITEMS (259).

3) Отличить одно устройство от другого можно по различным свойствам, запрашиваемым через
такие функции, как SetupDiGetDeviceRegistryProperty. Например, можно запрашивать имя
устройства, как оно отображается в диспетчере оборудования, его hardware id и instance id, а
также получать разнообразную информацию об установленных для него драйверах.
Уникальным является только instance id, так как он связан с путем в реестре, где хранится
информация о данном устройстве, остальные параметры могут совпадать. Например, если воткнуть
две сетевые карты одной модели, у них будут практически идентичные параметры.

Включение и выключение устройства осуществляется с помощью функции SetupDiCallClassInstaller,
вызванной с кодом DIF_PROPERTYCHANGE (0x12). Перед вызовом нужно заполнить структуру
SP_PROPCHANGE_PARAMS следующим образом:

ClassInstallHeader.cbSize = sizeof (ClassInstallHeader);
ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE (0x12);
StateChange = DICS_ENABLE (0x1) или DICS_DISABLE (0x2);
Scope = DICS_FLAG_GLOBAL (0x1) или DICS_FLAG_CONFIGSPECIFIC (0x2);
HwProfile = 0;

И передать ее в функцию SetupDiSetClassInstallParams.

SetupDiCallClassInstaller нужно вызвать два раза, первый раз состояние устройства
меняется для глобальной конфигурации (DICS_FLAG_GLOBAL), второй для конфигурации
текущего профиля (DICS_FLAG_CONFIGSPECIFIC).

То есть, получается такая последовательность действий:
- заполняем структуру SP_PROPCHANGE_PARAMS с флагом DICS_FLAG_GLOBAL;
- вызываем SetupDiSetClassInstallParams;
- вызываем SetupDiCallClassInstaller;
- снова заполняем структуру SP_PROPCHANGE_PARAMS, на этот раз с флагом DICS_FLAG_CONFIGSPECIFIC;
- снова вызываем SetupDiSetClassInstallParams;
- и напоследок опять вызываем SetupDiCallClassInstaller.

Данный способ должен работать на любых системах от Windows XP и выше.

Да, еще такие детали:
- для изменения состояния устройств нужны полные права администратора;
- разрядность программы должна совпадать с разрядностью операционной системы,
иначе будет ошибка ERROR_IN_WOW64 (0xe0000235).
- SetupDi-функции возвращают нестандартные коды ошибок, "расшифровку" можно
найти в файле setupapi.h (Windows SDK или Windows Driver Kit).
- хороший образец работы с устройствами и драйверами - утилита devcon из
комплекта Windows Driver Kit, ее исходный код тоже доступен.
5
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
25.09.2013, 20:10  [ТС]
Убежденный, Вы лучший чуловек в мире ))))
При всем моем нубстве, прочитав нормально код этой библиотеки, и ваш пост по принципу работы я понял как сделать и ОНО НАКОНЕЦ-ТО!!! ЗАРАБОТАЛО НА XP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Хотя честно говоря я уже забил на это дело, ибо очень скудны мои знания по программированию... Сижу просто в шоке сейчас, ибо даже не верил что смогу понять это всё...

С меня много спасибок )
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
26.09.2013, 11:12
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, получается такая последовательность действий:
- заполняем структуру SP_PROPCHANGE_PARAMS с флагом DICS_FLAG_GLOBAL;
- вызываем SetupDiSetClassInstallParams;
- вызываем SetupDiCallClassInstaller;
- снова заполняем структуру SP_PROPCHANGE_PARAMS, на этот раз с флагом DICS_FLAG_CONFIGSPECIFIC;
- снова вызываем SetupDiSetClassInstallParams;
- и напоследок опять вызываем SetupDiCallClassInstaller.
Кстати, вторая часть этого марлезонского балета, по-моему, нужна только для систем до Windows Vista.
Дело в том, что флаг DICS_FLAG_CONFIGSPECIFIC означает, что изменения устройства должны действовать
только в пределах определенного профиля оборудования. А в Windows Vista и более новых системах
профилей оборудования уже нет, поэтому там достаточно выполнить первые три пункта.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2013, 11:12
Помогаю со студенческими работами здесь

Нужно простое приложение для вкл/выкл передачи данных
Всем привет. На смартфоне примерно каждые 20 минут отключается интернет на 5 секунд(пропадает H или H+), а передача данных остается вкл....

Выбор сетевого адаптера для самодельной подставки для ноутбука
Здравствуйте! Возникла потребность сделать охлаждающую подставку для своего ноутбука. В подставке будут два кулера, которые питаются...

Разработка приложения для всех версий Windows
Добрый вечер всем. Возможно ли реализовать приложение совместимое со всеми версиями windows? Если да, поделитесь знаниями пожалуйста.

Установить драйвер для сетевого адаптера на EndlessOS
На компе операционная система &quot;Endless&quot; и нет Lan порта, но я приобрел адаптер (сетевую карту), на которой есть Lan порт. До этого...

Компьютеру не назначен адрес от сети для сетевого адаптера
Народ просветите кому не лень, заранее спасибо. Почему на Windows 7 после выхода из спящего режима при просмотре событий выскакивает ошибка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru