2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 82
1
.NET 2.x

API DeviceIoControl

03.02.2018, 19:24. Показов 3018. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В оригинальном коде с примером (рабочий код):
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
WINBASEAPI
BOOL
WINAPI
DeviceIoControl(
    _In_ HANDLE hDevice,
    _In_ DWORD dwIoControlCode,
    _In_reads_bytes_opt_(nInBufferSize) LPVOID lpInBuffer,
    _In_ DWORD nInBufferSize,
    _Out_writes_bytes_to_opt_(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer,
    _In_ DWORD nOutBufferSize,
    _Out_opt_ LPDWORD lpBytesReturned,
    _Inout_opt_ LPOVERLAPPED lpOverlapped
    );
C++
1
Success = DeviceIoControl(m_DeviceHandle, PU_GET_DEVICE_DESCRIPTOR, NULL, 0, &m_DeviceDescriptor, sizeof(m_DeviceDescriptor), &ByteCount, NULL);
C++
1
2
3
4
m_pConfigs=new FULL_CONFIG_INFO[m_DeviceDescriptor.bNumConfigurations];
 if (m_pConfigs)
   {for (i=0;i<m_DeviceDescriptor.bNumConfigurations;i++){
    Success= DeviceIoControl (m_DeviceHandle, PU_GET_CONFIG_DESCRIPTOR, &i, 1, m_pConfigs[i], sizeof(m_pConfigs[i]), &ByteCount,NULL);
C++
1
2
private:
   FULL_CONFIG_INFO*      m_pConfigs;
C++
1
  typedef BYTE FULL_CONFIG_INFO[512];


На данный момент не могу разобраться с DeviceIoControl

Что делаю:
Если определить так:
Кликните здесь для просмотра всего текста

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
public struct _USB_DEVICE_DESCRIPTOR
        {
            public Byte bLength;
            public Byte bDescriptorType;
            public UInt16 bcdUSB;
            public Byte bDeviceClass;
            public Byte bDeviceSubClass;
            public Byte bDeviceProtocol;
            public Byte bMaxPacketSize0;
            public UInt16 idVendor;
            public UInt16 idProduct;
            public UInt16 bcdDevice;
            public Byte iManufacturer;
            public Byte iProduct;
            public Byte iSerialNumber;
            public Byte bNumConfigurations;
        }
 
[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
        private static extern bool DeviceIoControl(
        IntPtr hDevice,
        UInt32 IoControlCode,
        [MarshalAs(UnmanagedType.AsAny)]
        [In] object InBuffer,
        uint nInBufferSize,
       out _USB_DEVICE_DESCRIPTOR OutBuffer,
        uint nOutBufferSize,
        ref uint pBytesReturned,
        [In] IntPtr Overlapped);


то вызов работает:
Кликните здесь для просмотра всего текста
C#
1
2
m_DeviceDescriptor = new _USB_DEVICE_DESCRIPTOR();
bool Success = DeviceIoControl(DeviceHandle,CTL_CODE(0x00000022,0x0802,0,0), null ,0, out m_DeviceDescriptor, Ret, ref ByteCount, IntPtr.Zero);

то есть Success = true, m_DeviceDescriptor заполняется.
теперь мне надо в место m_DeviceDescriptor заполнить массив байт.
точно знаю что должно вернутся 27 байт.
Кликните здесь для просмотра всего текста
C#
1
2
3
byte[] tmp2 = new byte[255];
Success = DeviceIoControl(DeviceHandle, CTL_CODE(0x00000022, 0x0801, 0, 0),  null, 0, tmp2, 27, ref ByteCount, IntPtr.Zero);
IntPtr err = GetLastError();

пробую так:

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
        public static extern bool DeviceIoControl(
        IntPtr hDevice,
        UInt32 IoControlCode,
        [MarshalAs(UnmanagedType.AsAny)]
        [In] object InBuffer,
        uint nInBufferSize,
        [MarshalAs(UnmanagedType.AsAny)]
        [Out] object OutBuffer,                      // еще такие варианты: out byte[] OutBuffer, Out object OutBuffer
        uint nOutBufferSize,
        ref uint pBytesReturned,
        [In] IntPtr Overlapped
        );

и по моему что то еще пробовал. Результат: либо GetLastError(); возвращает 0, и структура не заполняется, либо разбалансированность стека.
помогите массив байт вытащить.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2018, 19:24
Ответы с готовыми решениями:

2 сервиса (WCF Web API и ASP.NET Web API) на одном хосте
Есть БД с юзерами Есть консольное приложение (OWIN selfhost) с контроллером ImportController :...

Описание API DeviceIoControl
подскажите где взять подробное описание функции DeviceIoControl (тут не далеко была эта тема -...

Функция DeviceIoControl
Мне нужно полное описание функции DeviceIoControl или подскажите книгу, где можно найти ее описание

Некомпелируеца программа на DeviceIoControl
Здраствуйте, помогите пожалуйсто, нашел в нете код, а он некомпелируеца, вот код: #include...

4
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
03.02.2018, 19:50 2
C#
1
2
3
4
5
6
7
8
9
10
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern bool DeviceIoControl(
        IntPtr hDevice,
        uint IoControlCode,
        [In] byte[] InBuffer,
        uint nInBufferSize,
        [Out] byte[] OutBuffer,
        uint nOutBufferSize,
        out uint pBytesReturned,
        [In] IntPtr Overlapped);
Так пробовали?
1
2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 82
03.02.2018, 19:52  [ТС] 3
Да вот:
Цитата Сообщение от -VIRUS- Посмотреть сообщение
еще такие варианты: out byte[] OutBuffer
но не факт что передаю верно.
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
03.02.2018, 19:58 4
Лучший ответ Сообщение было отмечено -VIRUS- как решение

Решение

C#
1
out byte[] OutBuffer
и
C#
1
[Out] byte[] OutBuffer
не одно и тоже.
1
2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 82
03.02.2018, 20:41  [ТС] 5
err = 0x00000000
Success = false
структура пуста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
        public static extern bool DeviceIoControl(
        IntPtr hDevice,
        UInt32 IoControlCode,
        [In] byte[] InBuffer,
        uint nInBufferSize,
        [Out] byte[] OutBuffer,
        uint nOutBufferSize,
        ref uint pBytesReturned,
        [In] IntPtr Overlapped
        );
 
byte[] tmp2 = new byte[255];
Success = DeviceIoControl(DeviceHandle, CTL_CODE(0x00000022, 0x0801, 0, 0),  null, 0, tmp2, 27, ref ByteCount, IntPtr.Zero);
Добавлено через 2 минуты
Цитата Сообщение от Someone007 Посмотреть сообщение
out uint pBytesReturned,
тоже исправил, результат тотже

Добавлено через 22 минуты
тормозим это по ходу работает
C#
1
2
3
4
5
6
7
8
9
10
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern bool DeviceIoControl(
        IntPtr hDevice,
        uint IoControlCode,
        [In] byte[] InBuffer,
        uint nInBufferSize,
        [Out] byte[] OutBuffer,
        uint nOutBufferSize,
        out uint pBytesReturned,
        [In] IntPtr Overlapped);
по пробовал запросить дискриптор
CTL_CODE(0x00000022,0x0802,0,0)
вместо конфига дискриптора,
CTL_CODE(0x00000022,0x0801,0,0)
массив байт заполнился дискриптором
но прикол в том что в примере С++ данные о конфиге приходят. Ща по шуршу может что найду.

Добавлено через 6 минут
Все отлично, при запросе нужно было передать данные.
DeviceIoControl(DeviceHandle, CTL_CODE(0x00000022, 0x0801, 0, 0), null, 0, tmp2, 27, ref ByteCount, IntPtr.Zero);

Success= DeviceIoControl (m_DeviceHandle, PU_GET_CONFIG_DESCRIPTOR, &i, 1, m_pConfigs[i], sizeof(m_pConfigs[i]), &ByteCount,NULL);

Добавлено через 2 минуты
и на по следок разница между out и [out]?
0
03.02.2018, 20:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2018, 20:41
Помогаю со студенческими работами здесь

Работа с CreateFile и DeviceIoControl
Здравствуйте! Возникла такая проблема почему не могу сделать постоянную работу программы которая...

Через DeviceIoControl отправляется не то сообщение
Добрый день, уважаемые форумчане! Такой вопрос: /*заголовки*/ #define TOC_DATA_TRACK ...

Floppy LowLevelFormat c DeviceIoControl (IOCTL_DISK_FORMAT_TRACKS)
может кто- нибуть знает в чем ошибка? &lt;StructLayout(LayoutKind.Sequential)&gt; _ Public...

не работают системные функции (DeviceIoControl) в Windows 7
Здравствуйте, я только учусь, так что просьба не ругаться. Стоит рэйд контроллер и система Сервер...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru