Група miniport

Функциите на тази група са ангажирани в преработката на потока от данни и събитията, които се провеждат в драйверите на по-високо ниво, както и причинени жалба до NDIS TCP / IP стека.

Ако човек се вгледа в схемата на втората част, може да се види, че в долната част са функции на протокола, както и горния miniport. Защо? Всеки водач, се появява в две форми. Общуването с драйверите горните нива може да се превръща в miniport драйвер за него, и за по-ниската водача протокол ниво.

Списък miniport функции:

MPInitialize - инициализира група.

Функцията е отговорен за изпращането на пакети от данни.

Опции след държавна власт на PlagNPlay системата на системата и. Да се ​​каже, нищо особено. Стандартното проследяване вътрешни събития, предписани система на Microsoft.

MPHalt - разтоварване и тестване на де регистрация на шофьорите в случай на авария.

MPReset - както е писано в Microsoft - ние не трябва да правите нищо :)

Работа със системата - тя трябва да изпълни най-важните събития за услугата правилно.

Системата може да бъде повече от един адаптер, и съответно не е един, на които водачът трябва да се справят. В случай на използване на тези функции.

В нашия случай, основните функции на тази група - са функциите за трансфер на данни. Всички останали не можем да се прецени тяхната цел - да поддържа коректни системни връзки, всички от които са написани на главния Microsoft.

Основната функция е винаги извиква при подаване на данни. Съгласно правилата на работа с данни в NDIS трябва да напишете (в примера и прави) повторно фолио пакет.

За да направите това, първо трябва да улови пакета perekopirovat съдържанието на пакета в паметта си и да го изпратите на, и след това да се освободи пакета. Ето как ще изглежда в кода:

PADAPT pAdapt = (PADAPT) MiniportAdapterContext;

Context адаптер идва като параметър. я възлага на въведената указатели.

Нашият пакет - досега само указател.

PVOID MediaSpecificInfo = NULL;

Видът на адаптер, с които да работят.

ULONG MediaSpecificInfoSize = 0;

размер тип адаптер.

Проверете за свободни стаи на втория мрежов адаптер. На върха, аз казах, че присъствието му е необходимо да се осигури.

ако (IsIMDeviceStateOn (pAdapt) == FALSE)

Проверка и състояние.

NdisAllocatePacket (Status, MyPacket, pAdapt-> SendPacketPoolHandle);

Разпределението на място за размера на (Pool) данните, получени пакет.

ако (Status == NDIS_STATUS_SUCCESS)

PNDIS_PACKET_EXTENSION Стар, Ню;

Задаването на нашия вътрешен буфер.

NdisMoveMemory (NDIS_OOB_DATA_FROM_PACKET (MyPacket), NDIS_OOB_DATA_FROM_PACKET (пакет), sizeof (NDIS_PACKET_OOB_DATA));

Данните се прехвърлят в самия пакет.

NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO (Packet, MediaSpecificInfo, MediaSpecificInfoSize);

ако (MediaSpecificInfo || MediaSpecificInfoSize)

NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO (MyPacket, MediaSpecificInfo, MediaSpecificInfoSize);

Всъщност прехвърляне на разположение в NDIS данните, които ще доведат до нормалното преминаване на пакета по-нататък по веригата на водачите.

NdisSend (положение, pAdapt-> BindingHandle, MyPacket);

ако (Status! = NDIS_STATUS_PENDING)

Ако няма забавяне на изпращането на безплатен пакет.

Това показва липсата на пакети в системата - нищо общо.

Върнете ценности успех или код на грешка.

Заслужава да се спра на една точка. Когато системата се казва, че изпращането на данни през закъснение пакет код - NDIS_STATUS_PENDING.

В този случай, ние не правим безплатен пакет, като по този начин блокира цялата система NDIS за изпращане на данни. Това се случва, когато изпращате на бавен мрежа голям брой пакети.

Тъй като ние се освободи пакета? Системата включва освобождаване и след освобождаването на един пакет ресурси ще доведе функцията на PtSendComplete протокол група. Промяна в групата на протокол се дължи на факта, че системата ще получи съобщение от страна на водача на базисния че е призив специално за тази група.

В тази функция, кодът, който идва след като видим параметрите, в които дават контекста операции Изпращане и адаптер, в резултат на което ще бъде в състояние да извикате функция след NdisMSendComplete NdisDprFreePacket и да освободи NDIS да ни даде следните пакети.

PADAPT pAdapt = (PADAPT) ProtocolBindingContext;