INTERMEDIATE_BUFFER_WOW64

Home Forums Discussions Support Portal INTERMEDIATE_BUFFER_WOW64

This topic contains 4 replies, has 2 voices, and was last updated by  prorok 8 years ago.

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
    Moderator

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

    #6809

    prorok
    Participant

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

    #6810

    Vadim Smirnov
    Moderator

    Если из 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.