Descrizione dell’interfaccia verso il driver "NDIS 3.0 Packet Driver"

L’interfaccia a disposizione per il programmatore è definita dalla libreria a collegamento dinamico PacketNT.dll, generata a partire dal listato packet32.c con il relativo header file packet32.h. Il file header è molto importante poiché deve essere incluso in ogni file sorgente che utilizza le API esportate dalla libreria.

Tale interfaccia è composta da un set, estendibile a piacere, di diciotto API che rendono facile l’utilizzo del driver per la cattura del traffico di rete locale allo scopo di analizzarlo successivamente con un analizzatore di protollo. Si veda l’esempio di utilizzo di tale API nell’applicazione HexDump fornita assieme ai sorgenti del driver nella directory hexdump.

Ecco il codice del file packet32.h

#ifndef __PACKET32
#define __PACKET32

#include "../inc/ntddpack.h"

#define        DOSNAMEPREFIX   TEXT("Packet_")
#define        MAX_LINK_NAME_LENGTH   64
#define        NMAX_PACKET 65535  

typedef struct _ADAPTER  { 
			   HANDLE hFile;
                           TCHAR  SymbolicLink[MAX_LINK_NAME_LENGTH];
			 }  ADAPTER, *LPADAPTER;

typedef struct _PACKET {  
		       // HANDLE       hEvent;
                          OVERLAPPED   OverLapped;
                          PVOID        Buffer;
                          UINT         Length;
                          PVOID        Next;
			  UINT         ulBytesReceived;
			  BOOLEAN      bIoComplete;
			}  PACKET, *LPPACKET;

#ifdef __cplusplus
extern "C" {
#endif

LPADAPTER PacketOpenAdapter(LPTSTR AdapterName);
BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET pPacket,BOOLEAN Sync);
LPPACKET PacketAllocatePacket(void);
LPPACKET PacketAllocateNPacket(UINT n);
VOID PacketInitPacket(LPPACKET lpPacket,PVOID  Buffer,UINT  Length);
VOID PacketFreePacket(LPPACKET lpPacket);
BOOLEAN PacketResetAdapter(LPADAPTER AdapterObject);
BOOLEAN PacketWaitPacket(LPADAPTER AdapterObject,LPPACKET lpPacket);
BOOLEAN PacketReceiveNPacket(LPADAPTER AdapterObject,LPPACKET headLPacket,UINT n,UINT length,BYTE* buffer,BOOLEAN Sync);
BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync);
VOID PacketCloseAdapter(LPADAPTER lpAdapter);
BOOLEAN PacketSetFilter(LPADAPTER AdapterObject,ULONG Filter);
ULONG PacketGetAdapterNames(PTSTR pStr,PULONG  BufferSize);
BOOLEAN PacketRequest(LPADAPTER  AdapterObject,BOOLEAN Set,PPACKET_OID_DATA  OidData);
VOID PacketSetNextPacket(LPPACKET lpPacket, LPPACKET next);
VOID PacketSetLengthBuffer(LPPACKET lpPacket, UINT dim);
VOID PacketSetLengthPacket(LPPACKET lpPacket, UINT numBytes);
LPPACKET PacketGetNextPacket(LPPACKET lpPacket);

#ifdef __cplusplus
}
#endif 

#endif //__PACKET32

Nel codice dell’header file si nota la dichiarazione di due tipi di struttura e dei relativi puntatori.

ADAPTER permette di definire un identificatore che opportunamente inizializzato mi da accesso all’adattatore di rete tramite il driver packet.sys, infatti il primo campo, hfile, è un HANDLE al driver, il secondo, symbolicLink, rappresenta il nome dell’adattore.

Il tipo PACKET permette di gestire la cattura di un pacchetto ed è composto dai seguenti campi:

Nel file header ntddpack.h è definita la seguente struttura

typedef struct _PACKET_OID_DATA {

ULONG Oid;
ULONG Length;
UCHAR Data[1];

} PACKET_OID_DATA, *PPACKET_OID_DATA;

da utilizzare quando si richiama la funzione PacketRequest(...). Il campo Oid indica il tipo di operazione di query/set, i cui possibili valori sono definiti nel file ntddndis.h. Il campo Length indica la lunghezza del campo Data il quale contiene la sequenza di byte da/o verso l’NDIS.

Ora passiamo alla descrizione di tutte le funzioni esportate dalla libreria il cui elenco è visibile a livello di prototipi nel codice del file header packet32.h.

Seguono ora un set di API che permettono di maneggiare in modo indiretto alcuni campi della struttura PACKET.

Nota : quando è presente il simbolo (*) indica che ci sono delle differenze rispetto al driver sviluppato per Win95. Il simbolo (**) indica l’assenza di tale feature nella versione per Win95.