INTERMEDIATE_BUFFER_WOW64

Home Forums Discussions Support INTERMEDIATE_BUFFER_WOW64

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #5284
    prorok
    Participant

      Стал портировать своё чудо на x64(XP SP2 x64) и встретился с одной проблемой.
      Изменил все структуры на их аналоги с префиксом _WOW64, при этом прога начала лететь…
      Оказалось, что в поле m_Length структуры INTERMEDIATE_BUFFER_WOW64 находися не длинна пакета, а что-то потипу 943223478.
      Но дамп всего буфера показал, что сам он содерит сетевой пакет.Эксперементально:) определил, что NDISRD возвращает пакет не в INTERMEDIATE_BUFFER_WOW64, а в INTERMEDIATE_BUFFER!!!

      Common.h:
      typedef struct _INTERMEDIATE_BUFFER {
      LIST_ENTRY m_qLink;
      ULONG m_dwDeviceFlags;
      ULONG m_Length;
      ULONG m_Flags; // NDIS_PACKET flags
      UCHAR m_IBuffer [MAX_ETHER_FRAME];

      } INTERMEDIATE_BUFFER, *PINTERMEDIATE_BUFFER;

      typedef struct _INTERMEDIATE_BUFFER_WOW64{
      LIST_ENTRY m_qLink[2]; <


      ???????????????
      ULONG m_dwDeviceFlags;
      ULONG m_Length;
      ULONG m_Flags; // NDIS_PACKET flags
      UCHAR m_IBuffer [MAX_ETHER_FRAME];

      } INTERMEDIATE_BUFFER_WOW64, *PINTERMEDIATE_BUFFER_WOW64;

      У меня система необычная или так и должно быть? а если так, то есть ли ещё подобные моменты?

      #6808
      Vadim Smirnov
      Keymaster

        А зачем все это? Структура INTERMEDIATE_BUFFER_WOW64 определена для внутреннего пользования (конверсии в случае 32 битного приложения и 64 битного драйвера). Приложение-клиент должно работать с INTERMEDIATE_BUFFER, все необходимые конверсии сделает NDISAPI если они будут нужны.

        #6809
        prorok
        Participant

          А дело в том, что работаю непосредственно с драйвером ndisrd из ring0.
          Я смотрел исходники ndisapi, там используестя структура INTERMEDIATE_BUFFER_WOW64 но у меня при её использовании всё летит. ndisapi в таких местах полагаю досаточно протещена и лететь не должна(я не использовал), в чем изюменка? Всегда ли с 64 битным драйвером нужно общатся посредсвам _WOW64 структур?

          #6810
          Vadim Smirnov
          Keymaster

            Если из Ring0 => из драйвера
            XP x64 => драйвер 64 битный и ndisrd 64 битный

            Между 64 битными драйверами используем обычный INTERMEDIATE_BUFFER

            INTERMEDIATE_BUFFER_WOW64 определена, чтобы из 32 битного приложения передать данные в 64 битный драйвер, при этом не меняя кода 32 битного приложения. Бинарная структура INTERMEDIATE_BUFFER собранная 32 битным компилятором отличается от INTERMEDIATE_BUFFER собранной 64 битным. Но бинарная структура INTERMEDIATE_BUFFER_WOW64 собранной 32 битным компилятором совпадает с бинарной структурой INTERMEDIATE_BUFFER собранной 64 битным. Теперь понятно???

            #6811
            prorok
            Participant

              Теперь понятно.
              Благодарю.

            Viewing 5 posts - 1 through 5 (of 5 total)
            • You must be logged in to reply to this topic.