Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.200.210.43] |
|
Сообщ.
#1
,
|
|
|
В оригинальном коде с примером (рабочий код):
Скрытый текст 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 ); typedef BYTE FULL_CONFIG_INFO[512]; private: FULL_CONFIG_INFO* m_pConfigs; 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); На данный момент не могу разобраться с 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, и структура не заполняется, либо разбалансированность стека. помогите массив байт вытащить. |