Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
7 / 7 / 2
Регистрация: 23.08.2011
Сообщений: 64

Проблема с отключением USB, как использовать API

07.01.2012, 13:33. Показов 2899. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла проблема с отключением USB. Нашел готовый пример у Агурова П.В.. Но проблема в том что впервые работаю с API и незнаю что к чему. Скопировал себе код и тут сразу пошли ошибки (Unsafe code may only appear if compiling with /unsafe). Библиотеку добавил, но всеравно ничего. Если у кого есть время, то подскажите пожайста где чего исправить или дописать.

Ошибки в строках:

public unsafe struct SP_DEVICE_INTERFACE_DATA
public unsafe struct PSP_DEVICE_INTERFACE_DETAIL_DATA
public unsafe struct DATA_BUFFER

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication1
{
    class Program
    {
        [STAThread]
        static unsafe void Main(string[] args)
        {
            Guid UsbGuid = new Guid("{36FC9E60-C465-11CF-8056-444553540000}");
 
            int PnPHandle = SetupAPI.SetupDiGetClassDevs(
                ref UsbGuid,
                null,
                null,
                SetupAPI.ClassDevsFlags.DIGCF_PRESENT
            );
 
            int result = -1;
            int DeviceIndex = 0;
 
            while (result != 0)
            {
                SetupAPI.SP_DEVINFO_DATA DeviceInfoData = new SetupAPI.SP_DEVINFO_DATA();
                DeviceInfoData.cbSize = Marshal.SizeOf(DeviceInfoData);
                result = SetupAPI.SetupDiEnumDeviceInfo(PnPHandle, DeviceIndex, ref DeviceInfoData);
 
                if (result == 1)
                {
                    if (IsRemovable(DeviceInfoData))
                    {
                        Console.WriteLine("{0}", GetRegistryProperty(PnPHandle, ref DeviceInfoData, SetupAPI.RegPropertyType.SPDRP_DEVICEDESC));
                        if (SetupAPI.CM_Request_Device_Eject(DeviceInfoData.DevInst, null, null, 0, 0) == 0)
                            Console.WriteLine("Устройство успешно отключено.");
                    }
                }
 
                DeviceIndex++;
            }
 
            Marshal.FreeHGlobal((System.IntPtr)PnPHandle);
 
            Console.ReadLine();
        }
 
        public unsafe static string GetRegistryProperty(int PnPHandle, ref SetupAPI.SP_DEVINFO_DATA DeviceInfoData, SetupAPI.RegPropertyType Property)
        {
            int RequiredSize = 0;
            SetupAPI.DATA_BUFFER Buffer = new SetupAPI.DATA_BUFFER();
 
            int result = SetupAPI.SetupDiGetDeviceRegistryProperty(
                PnPHandle,
                ref DeviceInfoData,
                Property,
                null,
                ref Buffer,
                1024,
                ref RequiredSize
                );
 
            return Buffer.Buffer;
 
        }
 
        public unsafe static bool IsRemovable(SetupAPI.SP_DEVINFO_DATA DevData)
        {
            int Status = 0;
            int Problem = 0;
 
            SetupAPI.CM_Get_DevNode_Status(ref Status, ref Problem, DevData.DevInst, 0);
            return ((Status & SetupAPI.DN_REMOVABLE) != 0);
        }
    }
 
    public class SetupAPI
    {
        [DllImport("hid.dll", SetLastError = true)]
        public static extern unsafe void HidD_GetHidGuid(
            ref Guid lpHidGuid
            );
 
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiGetClassDevs(
            ref Guid lpGuid,
            int* Enumerator,
            int* hwndParent,
            ClassDevsFlags Flags
            );
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiGetClassDevs(
            int* guid,
            int* Enumerator,
            int* hwndParent,
            ClassDevsFlags Flags
            );
 
        [StructLayout(LayoutKind.Sequential)]
        public struct SP_DEVINFO_DATA
        {
            public int cbSize;
            public Guid ClassGuid;
            public int DevInst;
            public int Reserved;
        }
 
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiEnumDeviceInfo(
            int DeviceInfoSet,
            int Index,
            ref  SP_DEVINFO_DATA DeviceInfoData
            );
 
 
        [Flags]
        public enum ClassDevsFlags
        {
            DIGCF_DEFAULT = 0x00000001,
            DIGCF_PRESENT = 0x00000002,
            DIGCF_ALLCLASSES = 0x00000004,
            DIGCF_PROFILE = 0x00000008,
            DIGCF_DEVICEINTERFACE = 0x00000010,
        }
 
        // Device interface data
        [StructLayout(LayoutKind.Sequential)]
        public unsafe struct SP_DEVICE_INTERFACE_DATA
        {
            public int cbSize;
            public Guid InterfaceClassGuid;
            public int Flags;
            public int Reserved;
        }
 
        // Device interface detail data
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public unsafe struct PSP_DEVICE_INTERFACE_DETAIL_DATA
        {
            public int cbSize;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string DevicePath;
        }
 
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiEnumDeviceInterfaces(
            int DeviceInfoSet,
            int DeviceInfoData,
            ref  Guid lpHidGuid,
            int MemberIndex,
            ref  SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData);
 
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiGetDeviceInterfaceDetail(
            int DeviceInfoSet,
            ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData,
            int* aPtr,
            int detailSize,
            ref int requiredSize,
            int* bPtr);
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiGetDeviceInterfaceDetail(
            int DeviceInfoSet,
            ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData,
            ref PSP_DEVICE_INTERFACE_DETAIL_DATA myPSP_DEVICE_INTERFACE_DETAIL_DATA,
            int detailSize,
            ref int requiredSize,
            int* bPtr);
 
        public enum RegPropertyType
        {
            SPDRP_DEVICEDESC = 0x00000000, // DeviceDesc (R/W)
            SPDRP_HARDWAREID = 0x00000001, // HardwareID (R/W)
            SPDRP_COMPATIBLEIDS = 0x00000002, // CompatibleIDs (R/W)
            SPDRP_UNUSED0 = 0x00000003, // unused
            SPDRP_SERVICE = 0x00000004, // Service (R/W)
            SPDRP_UNUSED1 = 0x00000005, // unused
            SPDRP_UNUSED2 = 0x00000006, // unused
            SPDRP_CLASS = 0x00000007, // Class (R--tied to ClassGUID)
            SPDRP_CLASSGUID = 0x00000008, // ClassGUID (R/W)
            SPDRP_DRIVER = 0x00000009, // Driver (R/W)
            SPDRP_CONFIGFLAGS = 0x0000000A, // ConfigFlags (R/W)
            SPDRP_MFG = 0x0000000B, // Mfg (R/W)
            SPDRP_FRIENDLYNAME = 0x0000000C, // FriendlyName (R/W)
            SPDRP_LOCATION_INFORMATION = 0x0000000D,// LocationInformation (R/W)
            SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 0x0000000E, // PhysicalDeviceObjectName (R)
            SPDRP_CAPABILITIES = 0x0000000F, // Capabilities (R)
            SPDRP_UI_NUMBER = 0x00000010, // UiNumber (R)
            SPDRP_UPPERFILTERS = 0x00000011, // UpperFilters (R/W)
            SPDRP_LOWERFILTERS = 0x00000012, // LowerFilters (R/W)
            SPDRP_BUSTYPEGUID = 0x00000013, // BusTypeGUID (R)
            SPDRP_LEGACYBUSTYPE = 0x00000014, // LegacyBusType (R)
            SPDRP_BUSNUMBER = 0x00000015, // BusNumber (R)
            SPDRP_ENUMERATOR_NAME = 0x00000016, // Enumerator Name (R)
            SPDRP_SECURITY = 0x00000017, // Security (R/W, binary form)
            SPDRP_SECURITY_SDS = 0x00000018, // Security (W, SDS form)
            SPDRP_DEVTYPE = 0x00000019, // Device Type (R/W)
            SPDRP_EXCLUSIVE = 0x0000001A, // Device is exclusive-access (R/W)
            SPDRP_CHARACTERISTICS = 0x0000001B, // Device Characteristics (R/W)
            SPDRP_ADDRESS = 0x0000001C, // Device Address (R)
            SPDRP_UI_NUMBER_DESC_FORMAT = 0x0000001E, // UiNumberDescFormat (R/W)
            SPDRP_MAXIMUM_PROPERTY = 0x0000001F  // Upper bound on ordinals
        }
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiGetDeviceRegistryProperty(
            int DeviceInfoSet,
            ref SP_DEVINFO_DATA DeviceInfoData,
            RegPropertyType Property,
            int* PropertyRegDataType,
            int* PropertyBuffer,
            int PropertyBufferSize,
            ref int RequiredSize
        );
 
        // Device interface detail data
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public unsafe struct DATA_BUFFER
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
            public string Buffer;
        }
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int SetupDiGetDeviceRegistryProperty(
            int DeviceInfoSet,
            ref SP_DEVINFO_DATA DeviceInfoData,
            RegPropertyType Property,
            int* PropertyRegDataType,
            ref DATA_BUFFER PropertyBuffer,
            int PropertyBufferSize,
            ref int RequiredSize
        );
 
        public const int DN_HAS_PROBLEM = 0x0400;
        public const int CM_PROB_DISABLED = 0x0016;
        public const int CM_PROB_HARDWARE_DISABLED = 0x001D;
        public const int DN_DISABLEABLE = 0x2000;
        public const int DN_REMOVABLE = 0x4000;
 
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int CM_Get_DevNode_Status(
            ref int pulStatus,
            ref int pulProblemNumber,
            int DevInst,
            int ulFlags
        );
 
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern unsafe int CM_Request_Device_Eject(
            int dnDevInst,
            int* pVetoType,
            int* pszVetoName,
            int ulNameLength,
            int ulFlags
            );
 
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2012, 13:33
Ответы с готовыми решениями:

Проблема с отключением JTAG
Всем привет. Имею STM32F107RC, 64 ноги, Ftosh 256Kbyte, SROM 64Kbyte из линейки Connectivity. Впаян в плату-переходник ручной разводки...

Проблема с отключением цап
Здравствуйте, возникла проблема решения которой никак не могу найти. В мк stm8l151k4t6 ЦАП программируется только на один из выводов SPI. А...

Проблема с отключением базы данных
Здравствуйте, есть система, которая переодически обращается к БД в ms sql, так как мне нужно будет её презентовать на другом компьютере я...

3
2 / 2 / 1
Регистрация: 11.11.2009
Сообщений: 25
07.01.2012, 13:49
В ошибке же всё сказано.
Это- небезопасный код и собирать его нужно с ключом /unsafe

Смотри мануалы, как это делать из-под командной строки. В студии ведь нельзя передавать компилятору параметры?
0
 Аватар для defer
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
07.01.2012, 14:02
Цитата Сообщение от loband_ml Посмотреть сообщение
Смотри мануалы, как это делать из-под командной строки. В студии ведь нельзя передавать компилятору параметры?
в студии не нужно передавать компилятору параметры, надо просто в настройках проекта указать
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
07.01.2012, 14:22
Visual Studio:
Англ:
Project->Properties->Build->Allow unsafe code.
Русск:
Проект->Свойства проекта->Построение->Разрешить небезопасный код

MonoDevelop:
Проект->Свойства->Построение->Общие->Разрешить небезопасный код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2012, 14:22
Помогаю со студенческими работами здесь

Проблема с отключением nerwork-manager
прописываю команду : sudo stop network-manager выхлоп: sudo: stop: команда не найдена Подскажите что делать

Проблема с отключением портативного харда
Сама проблема : поставил на днях Виндовс 7 (Максимальную, оригинальный образ из МСДН СП1 РУС) делал бекап системы, перекидывал файлы,...

Проблема с отключением performance turbo boost
Доброго времени суток. Имеется проблема с статтерами и фризами в играх. Система Ryzen 5 2600, Материнская плата MSI B450 A Pro, ОЗУ OEM...

Проблема с отключением монитора во время игры
Купил GTX 1070 KFA2 Hall of Fame б/у в очень хорошем состоянии (ухоженная) у знакомого купил. Так вот. Играю в Хант Шовдавн и внезапно...

Проблема с отключением клавиатуры во время установки
помогите, плиз, хочу установить винду XP, выбираю значит загрузку с диска, появляется как обычно, синий экран с выбором действий:...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru