miniport Group

Funcțiile acestui grup sunt angajate în prelucrarea fluxului de date și evenimentele care au loc în driverele de nivel superior și a făcut un apel la stiva NDIS TCP / IP.

Dacă cineva se uită la schema de a doua parte, se poate observa că în partea de jos sunt funcții ale protocolului și miniport sus. De ce? Fiecare conducător auto apare în două înfățișări. Comunicarea cu driverele de nivel superior devine un driver miniport pentru ea, cât și pentru driverul de protocol de nivel inferior.

Funcții Lista miniport:

MPInitialize - inițializa grup.

Funcția este responsabil pentru transmiterea pachetelor de date.

Opțiuni după o stare de putere a sistemului PlagNPlay sistemului și. Pentru a spune nimic special. urmărirea evenimentelor interne standard prescrise sistem Microsoft.

MPHalt - descărcarea și testarea de înregistrare a conducătorilor auto, în caz de urgență.

MPReset - așa cum este scris în Microsoft - noi nu trebuie să facem nimic :)

Lucrul cu sistemul - necesitatea de a îndeplini în mod corect evenimentele importante pentru serviciul.

Sistemul poate fi mai mult de un adaptor, și, în consecință, nu este una la care conducătorul auto trebuie să se ocupe. În cazul utilizării acestor funcții.

În cazul nostru, principalele funcții ale acestui grup - sunt caracteristicile de transfer de date. Tot restul nu putem lua în considerare scopul lor - de a menține legături de sistem corecte, toate acestea sunt scrise principal Microsoft.

Funcția principală este numit întotdeauna atunci când trecerea de date. În conformitate cu regulile de lucru cu date în NDIS trebuie să scrie (în exemplu și făcut) pachetul de re-wrap.

Pentru a face acest lucru, trebuie mai întâi să captureze pachetul perekopirovat conținutul pachetului în memoria sa și trimite-l pe, și apoi eliberați pachetul. Iată cum va arăta în codul:

PAdApt pAdApt = (pAdApt) MiniportAdapterContext;

adaptor Context vine ca parametru. Alocați-l indicii dvs. tastate.

Pachetul nostru - până în prezent doar un pointer.

PVOID MediaSpecificInfo = NULL;

Tipul de adaptor cu care să lucreze.

Ulong MediaSpecificInfoSize = 0;

Dimensiune tip adaptor.

Verificați disponibilitatea de al doilea adaptor de rețea. In partea de sus, am spus că prezența sa este necesară pentru a oferi.

if (IsIMDeviceStateOn (pAdApt) == FALSE)

Verificarea și starea.

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

Alocarea de spațiu pentru dimensiunea (Pool) de pachete de date primite.

if (Stare == NDIS_STATUS_SUCCESS)

PNDIS_PACKET_EXTENSION vechi, noi;

Setarea pe tampon nostru intern.

NdisMoveMemory (NDIS_OOB_DATA_FROM_PACKET (MyPacket), NDIS_OOB_DATA_FROM_PACKET (Packet), sizeof (NDIS_PACKET_OOB_DATA));

Migrarea datelor în pachetul propriu-zis.

NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO (Packet, MediaSpecificInfo, MediaSpecificInfoSize);

if (MediaSpecificInfo || MediaSpecificInfoSize)

NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO (MyPacket, MediaSpecificInfo, MediaSpecificInfoSize);

De fapt, se transferă datele disponibile în NDIS, ceea ce va determina trecerea normală a pachetului suplimentar de-a lungul lanțului de drivere.

NdisSend (Status, pAdapt-> BindingHandle, MyPacket);

dacă (Stare! = NDIS_STATUS_PENDING)

Dacă nu există nici o întârziere la trimiterea pachetului gratuit.

Aceasta indică absența pachetului în sistem - nimic de a face.

Întoarcere valori SUCCES sau un cod de eroare.

Este demn de a locui într-un punct. Când sistemul se spune că trimiterea datelor de cod de pachete de întârziere - NDIS_STATUS_PENDING.

În acest caz, noi nu pachet liber, blocând astfel tot sistemul NDIS pentru transmiterea de date. Acest lucru se întâmplă atunci când trimit printr-o rețea lentă un număr mare de pachete.

Pe măsură ce eliberați pachetul? Sistemul include o eliberare și după lansarea unui pachet de resurse va duce la funcția protocolului PtSendComplete de grup. Schimbarea în grupul de protocol, datorită faptului că sistemul primește un mesaj de la driverul de bază care face un apel în mod specific la acest grup.

În această funcție, codul care vine după ce vom vedea parametrii în care ne dau contextul operațiunilor de Trimitere și adaptor, astfel încât vom putea apela o funcție după NdisMSendComplete NdisDprFreePacket și eliberați NDIS pentru a ne acorda următoarele pachete.

PAdApt pAdApt = (pAdApt) ProtocolBindingContext;