На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> API DeviceIoControl , Структуру вытаскиваю, массив байт не получается.
    В оригинальном коде с примером (рабочий код):
    Скрытый текст

    ExpandedWrap disabled
      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
          );


    ExpandedWrap disabled
      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

    Что делаю:
    Если определить так:
    ExpandedWrap disabled
      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);

    то вызов работает:
    ExpandedWrap disabled
      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 байт.
    ExpandedWrap disabled
      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();

    пробую так:
    ExpandedWrap disabled
      [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, и структура не заполняется, либо разбалансированность стека.
    помогите массив байт вытащить. :wall:
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0196 ]   [ 17 queries used ]   [ Generated: 28.03.24, 09:00 GMT ]