API DeviceIoControl - C#/.NET 2.x

Узнай цену своей работы

Формулировка задачи:

В оригинальном коде с примером (рабочий код):
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
    );Success = DeviceIoControl(m_DeviceHandle, PU_GET_DEVICE_DESCRIPTOR, NULL, 0, &m_DeviceDescriptor, sizeof(m_DeviceDescriptor), &ByteCount, NULL);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);private:
   FULL_CONFIG_INFO*      m_pConfigs;  typedef BYTE FULL_CONFIG_INFO[512];
На данный момент не могу разобраться с DeviceIoControl Что делаю: Если определить так:
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);
то вызов работает:
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 байт.
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();
пробую так:
[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, и структура не заполняется, либо разбалансированность стека. помогите массив байт вытащить.

Решение задачи: «API DeviceIoControl»

textual
Листинг программы
out byte[] OutBuffer

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы