Home › Forums › Discussions › Support › INTERMEDIATE_BUFFER_WOW64
- This topic has 4 replies, 2 voices, and was last updated 15 years, 7 months ago by prorok.
-
AuthorPosts
-
April 22, 2009 at 2:12 pm #5284
Стал портировать своё чудо на 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;
У меня система необычная или так и должно быть? а если так, то есть ли ещё подобные моменты?
April 22, 2009 at 7:11 pm #6808А зачем все это? Структура INTERMEDIATE_BUFFER_WOW64 определена для внутреннего пользования (конверсии в случае 32 битного приложения и 64 битного драйвера). Приложение-клиент должно работать с INTERMEDIATE_BUFFER, все необходимые конверсии сделает NDISAPI если они будут нужны.
April 22, 2009 at 10:08 pm #6809А дело в том, что работаю непосредственно с драйвером ndisrd из ring0.
Я смотрел исходники ndisapi, там используестя структура INTERMEDIATE_BUFFER_WOW64 но у меня при её использовании всё летит. ndisapi в таких местах полагаю досаточно протещена и лететь не должна(я не использовал), в чем изюменка? Всегда ли с 64 битным драйвером нужно общатся посредсвам _WOW64 структур?April 23, 2009 at 8:46 am #6810Если из 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 битным. Теперь понятно???
April 23, 2009 at 8:54 am #6811Теперь понятно.
Благодарю. -
AuthorPosts
- You must be logged in to reply to this topic.