API DeviceIoControl - C#/.NET 2.x
Формулировка задачи:
В оригинальном коде с примером (рабочий код):
На данный момент не могу разобраться с DeviceIoControl
Что делаю:
Если определить так:
то вызов работает:
то есть Success = true, m_DeviceDescriptor заполняется.
теперь мне надо в место m_DeviceDescriptor заполнить массив байт.
точно знаю что должно вернутся 27 байт.
пробую так:
и по моему что то еще пробовал. Результат: либо GetLastError(); возвращает 0, и структура не заполняется, либо разбалансированность стека.
помогите массив байт вытащить.
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];
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);
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 );
Решение задачи: «API DeviceIoControl»
textual
Листинг программы
out byte[] OutBuffer
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д