Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

# Packet.h

Go to the documentation of this file.

    00001 /*
    00002  * Copyright (c) 1999 - 2003
    00003  * NetGroup, Politecnico di Torino (Italy)
    00004  * All rights reserved.
    00005  *
    00006  * Redistribution and use in source and binary forms, with or without
    00007  * modification, are permitted provided that the following conditions
    00008  * are met:
    00009  *
    00010  * 1. Redistributions of source code must retain the above copyright
    00011  * notice, this list of conditions and the following disclaimer.
    00012  * 2. Redistributions in binary form must reproduce the above copyright
    00013  * notice, this list of conditions and the following disclaimer in the
    00014  * documentation and/or other materials provided with the distribution.
    00015  * 3. Neither the name of the Politecnico di Torino nor the names of its
    00016  * contributors may be used to endorse or promote products derived from
    00017  * this software without specific prior written permission.
    00018  *
    00019  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    00020  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    00021  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    00022  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    00023  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    00024  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    00025  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    00026  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    00027  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    00028  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    00029  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    00030  *
    00031  */
    00032
    00041 #ifndef __PACKET_INCLUDE______
    00042 #define __PACKET_INCLUDE______
    00043
    00044 #define NTKERNEL
    00045
    00046 #include "jitter.h"
    00047 #include "win_bpf.h"
    00048
    00049 #define  MAX_REQUESTS   32
    00050
    00051 #define Packet_ALIGNMENT sizeof(int)
    00052 #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1))
    00053
    00054 /***************************/
    00055 /*         IOCTLs          */
    00056 /***************************/
    00057
    00066 #define  BIOCSETBUFFERSIZE 9592
    00067
    00078 #define  BIOCSETF 9030
    00079
    00086 #define  BIOCGSTATS 9031
    00087
    00093 #define  BIOCSRTIMEOUT 7416
    00094
    00102 #define  BIOCSMODE 7412
    00103
    00110 #define  BIOCSWRITEREP 7413
    00111
    00117 #define  BIOCSMINTOCOPY 7414
    00118
    00124 #define  BIOCSETOID 2147483648
    00125
    00131 #define  BIOCQUERYOID 2147483652
    00132
    00140 #define  BIOCSETDUMPFILENAME 9029
    00141
    00148 #define  BIOCGEVNAME 7415
    00149
    00157 #define  BIOCSENDPACKETSNOSYNC 9032
    00158
    00167 #define  BIOCSENDPACKETSSYNC 9033
    00168
    00175 #define  BIOCSETDUMPLIMITS 9034
    00176
    00183 #define BIOCISDUMPENDED 7411
    00184
    00185 // Working modes
    00186 #define MODE_CAPT 0x0
    00187 #define MODE_STAT 0x1
    00188 #define MODE_MON  0x2
    00189 #define MODE_DUMP 0x10
    00190
    00191
    00192 #define IMMEDIATE 1
    00193
    00194
    00195 // The following definitions are used to provide compatibility
    00196 // of the dump files with the ones of libpcap
    00197 #define TCPDUMP_MAGIC 0xa1b2c3d4
    00198 #define PCAP_VERSION_MAJOR 2
    00199 #define PCAP_VERSION_MINOR 4
    00200
    00201
    00206 struct packet_file_header
    00207 {
    00208     UINT magic;
    00209     USHORT version_major;
    00210     USHORT version_minor;
    00211     UINT thiszone;
    00212     UINT sigfigs;
    00213     UINT snaplen;
    00214     UINT linktype;
    00215 };
    00216
    00221 struct sf_pkthdr {
    00222     struct timeval  ts;
    00223     UINT            caplen;
    00224
    00225
    00226     UINT            len;
    00227 };
    00228
    00238 typedef struct _INTERNAL_REQUEST {
    00239     LIST_ENTRY      ListElement;
    00240     PIRP            Irp;
    00241     BOOLEAN         Internal;
    00242     NDIS_REQUEST    Request;
    00243 } INTERNAL_REQUEST, *PINTERNAL_REQUEST;
    00244
    00252 typedef struct _PACKET_RESERVED {
    00253     LIST_ENTRY      ListElement;
    00254     PIRP            Irp;
    00255     PMDL            pMdl;
    00256     BOOLEAN         FreeBufAfterWrite;
    00257
    00258     ULONG           Cpu;
    00259 }  PACKET_RESERVED, *PPACKET_RESERVED;
    00260
    00261 #define RESERVED(_p) ((PPACKET_RESERVED)((_p)->ProtocolReserved))
    00262
    00263
    00268 typedef struct _DEVICE_EXTENSION {
    00269     NDIS_HANDLE    NdisProtocolHandle;
    00270     NDIS_STRING    AdapterName;
    00271     PWSTR          ExportString;
    00272
    00273 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    00274
    00280 typedef struct __CPU_Private_Data
    00281 {
    00282     ULONG   P;
    00283     ULONG   C;
    00284     ULONG   Free;
    00285     PUCHAR  Buffer;
    00286     ULONG   Accepted;
    00287
    00288
    00289
    00290     ULONG   Received;
    00291
    00292
    00293
    00294     ULONG   Dropped;
    00295
    00296
    00297
    00298     ULONG   Processing;
    00299     PMDL    TransferMdl1;
    00300     PMDL    TransferMdl2;
    00301     ULONG   NewP;
    00302 }
    00303     CpuPrivateData;
    00304
    00305
    00313 typedef struct _OPEN_INSTANCE
    00314 {
    00315     PDEVICE_EXTENSION   DeviceExtension;
    00316
    00317     NDIS_HANDLE         AdapterHandle;
    00318     UINT                Medium;
    00319
    00320     NDIS_HANDLE         PacketPool;
    00321     PIRP                OpenCloseIrp;
    00322
    00323     KSPIN_LOCK          RequestSpinLock;
    00324     LIST_ENTRY          RequestList;
    00325     LIST_ENTRY          ResetIrpList;
    00326     INTERNAL_REQUEST    Requests[MAX_REQUESTS];
    00327     PMDL                BufferMdl;
    00328     PKEVENT             ReadEvent;
    00329     HANDLE              ReadEventHandle;
    00330     UNICODE_STRING      ReadEventName;
    00331
    00332
    00333
    00334     PUCHAR              bpfprogram;
    00335
    00336
    00337
    00338
    00339     JIT_BPF_Filter      *Filter;
    00340
    00341     UINT                MinToCopy;
    00342
    00343     LARGE_INTEGER       TimeOut;
    00344
    00345
    00346     int                 mode;
    00347     LARGE_INTEGER       Nbytes;
    00348     LARGE_INTEGER       Npackets;
    00349     NDIS_SPIN_LOCK      CountersLock;
    00350     UINT                Nwrites;
    00351
    00352     ULONG               Multiple_Write_Counter;
    00353     NDIS_EVENT          WriteEvent;
    00354     BOOLEAN             WriteInProgress;
    00355
    00356     NDIS_SPIN_LOCK      WriteLock;
    00357     NDIS_EVENT          IOEvent;
    00358     NDIS_STATUS         IOStatus;
    00359     BOOLEAN             Bound;
    00360
    00361     HANDLE              DumpFileHandle;
    00362     PFILE_OBJECT        DumpFileObject;
    00363     PKTHREAD            DumpThreadObject;
    00364     HANDLE              DumpThreadHandle;
    00365     NDIS_EVENT          DumpEvent;
    00366     LARGE_INTEGER       DumpOffset;
    00367     UNICODE_STRING      DumpFileName;
    00368     UINT                MaxDumpBytes;
    00369
    00370     UINT                MaxDumpPacks;
    00371
    00372
    00373     BOOLEAN             DumpLimitReached;
    00374
    00375     MEM_TYPE            mem_ex;
    00376     TME_CORE            tme;
    00377     NDIS_SPIN_LOCK      MachineLock;
    00378     UINT                MaxFrameSize;
    00379
    00380     CpuPrivateData      CpuData[32];
    00381     ULONG               ReaderSN;
    00382     ULONG               WriterSN;
    00383
    00384     ULONG               Size;
    00385     ULONG               SkipProcessing;
    00386
    00387
    00388
    00389 }
    00390 OPEN_INSTANCE, *POPEN_INSTANCE;
    00391
    00399 struct PacketHeader
    00400 {
    00401     ULONG SN;
    00402     struct bpf_hdr header;
    00403 };
    00404
    00405
    00406 #define TRANSMIT_PACKETS 256
    00407
    00408
    00409
    00411 #define EXIT_SUCCESS(quantity) Irp->IoStatus.Information=quantity;\
    00412     Irp->IoStatus.Status = STATUS_SUCCESS;\
    00413     IoCompleteRequest(Irp, IO_NO_INCREMENT);\
    00414     return STATUS_SUCCESS;\
    00415
    00416
    00417 #define EXIT_FAILURE(quantity) Irp->IoStatus.Information=quantity;\
    00418     Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;\
    00419     IoCompleteRequest(Irp, IO_NO_INCREMENT);\
    00420     return STATUS_UNSUCCESSFUL;\
    00421
    00422
    00427 /***************************/
    00428 /*       Prototypes        */
    00429 /***************************/
    00430
    00447 NTSTATUS
    00448 DriverEntry(
    00449     IN PDRIVER_OBJECT DriverObject,
    00450     IN PUNICODE_STRING RegistryPath
    00451     );
    00452
    00462 PWCHAR getAdaptersList(VOID);
    00463
    00470 PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID);
    00471
    00483 BOOLEAN createDevice(
    00484     IN OUT PDRIVER_OBJECT adriverObjectP,
    00485     IN PUNICODE_STRING amacNameP,
    00486     NDIS_HANDLE aProtoHandle);
    00487
    00499 NTSTATUS
    00500 NPF_Open(
    00501     IN PDEVICE_OBJECT DeviceObject,
    00502     IN PIRP Irp
    00503     );
    00504
    00514 VOID
    00515 NPF_OpenAdapterComplete(
    00516     IN NDIS_HANDLE  ProtocolBindingContext,
    00517     IN NDIS_STATUS  Status,
    00518     IN NDIS_STATUS  OpenErrorStatus
    00519     );
    00520
    00531 NTSTATUS
    00532 NPF_Close(
    00533     IN PDEVICE_OBJECT DeviceObject,
    00534     IN PIRP Irp
    00535     );
    00536
    00545 VOID
    00546 NPF_CloseAdapterComplete(
    00547     IN NDIS_HANDLE  ProtocolBindingContext,
    00548     IN NDIS_STATUS  Status
    00549     );
    00550
    00573 NDIS_STATUS
    00574 NPF_tap(
    00575     IN NDIS_HANDLE ProtocolBindingContext,
    00576     IN NDIS_HANDLE MacReceiveContext,
    00577     IN PVOID HeaderBuffer,
    00578     IN UINT HeaderBufferSize,
    00579     IN PVOID LookAheadBuffer,
    00580     IN UINT LookaheadBufferSize,
    00581     IN UINT PacketSize
    00582     );
    00583
    00594 VOID
    00595 NPF_TransferDataComplete(
    00596     IN NDIS_HANDLE ProtocolBindingContext,
    00597     IN PNDIS_PACKET Packet,
    00598     IN NDIS_STATUS Status,
    00599     IN UINT BytesTransferred
    00600     );
    00601
    00608 VOID
    00609 NPF_ReceiveComplete(IN NDIS_HANDLE  ProtocolBindingContext);
    00610
    00634 NTSTATUS
    00635 NPF_IoControl(
    00636     IN PDEVICE_OBJECT DeviceObject,
    00637     IN PIRP Irp
    00638     );
    00639
    00640 VOID
    00641
    00651 NPF_RequestComplete(
    00652     IN NDIS_HANDLE   ProtocolBindingContext,
    00653     IN PNDIS_REQUEST pRequest,
    00654     IN NDIS_STATUS   Status
    00655     );
    00656
    00669 NTSTATUS
    00670 NPF_Write(
    00671             IN PDEVICE_OBJECT DeviceObject,
    00672             IN PIRP Irp
    00673             );
    00674
    00675
    00694 INT NPF_BufferedWrite(IN PIRP Irp,
    00695                         IN PCHAR UserBuff,
    00696                         IN ULONG UserBuffSize,
    00697                         BOOLEAN sync);
    00698
    00706 VOID NPF_WaitEndOfBufferedWrite(POPEN_INSTANCE Open);
    00707
    00717 VOID
    00718 NPF_SendComplete(
    00719     IN NDIS_HANDLE   ProtocolBindingContext,
    00720     IN PNDIS_PACKET  pPacket,
    00721     IN NDIS_STATUS   Status
    00722     );
    00723
    00733 VOID
    00734 NPF_ResetComplete(
    00735     IN NDIS_HANDLE  ProtocolBindingContext,
    00736     IN NDIS_STATUS  Status
    00737     );
    00738
    00742 VOID
    00743 NPF_Status(
    00744     IN NDIS_HANDLE   ProtocolBindingContext,
    00745     IN NDIS_STATUS   Status,
    00746     IN PVOID         StatusBuffer,
    00747     IN UINT          StatusBufferSize
    00748     );
    00749
    00750
    00754 VOID
    00755 NPF_StatusComplete(IN NDIS_HANDLE  ProtocolBindingContext);
    00756
    00765 VOID
    00766 NPF_Unload(IN PDRIVER_OBJECT DriverObject);
    00767
    00768
    00787 NTSTATUS
    00788 NPF_Read(
    00789     IN PDEVICE_OBJECT DeviceObject,
    00790     IN PIRP Irp
    00791     );
    00792
    00798 NTSTATUS
    00799 NPF_ReadRegistry(
    00800     IN  PWSTR              *MacDriverName,
    00801     IN  PWSTR              *PacketDriverName,
    00802     IN  PUNICODE_STRING     RegistryPath
    00803     );
    00804
    00811 NTSTATUS
    00812 NPF_QueryRegistryRoutine(
    00813     IN PWSTR     ValueName,
    00814     IN ULONG     ValueType,
    00815     IN PVOID     ValueData,
    00816     IN ULONG     ValueLength,
    00817     IN PVOID     Context,
    00818     IN PVOID     EntryContext
    00819     );
    00820
    00826 VOID NPF_BindAdapter(
    00827     OUT PNDIS_STATUS            Status,
    00828     IN  NDIS_HANDLE             BindContext,
    00829     IN  PNDIS_STRING            DeviceName,
    00830     IN  PVOID                   SystemSpecific1,
    00831     IN  PVOID                   SystemSpecific2
    00832     );
    00833
    00845 VOID
    00846 NPF_UnbindAdapter(
    00847     OUT PNDIS_STATUS        Status,
    00848     IN  NDIS_HANDLE         ProtocolBindingContext,
    00849     IN  NDIS_HANDLE         UnbindContext
    00850     );
    00851
    00852
    00860 NTSTATUS NPF_OpenDumpFile(POPEN_INSTANCE Open , PUNICODE_STRING fileName, BOOLEAN append);
    00861
    00870 NTSTATUS NPF_StartDump(POPEN_INSTANCE Open);
    00871
    00879 VOID NPF_DumpThread(PVOID Open);
    00880
    00887 NTSTATUS NPF_SaveCurrentBuffer(POPEN_INSTANCE Open);
    00888
    00901 VOID NPF_WriteDumpFile(PFILE_OBJECT FileObject,
    00902                                 PLARGE_INTEGER Offset,
    00903                                 ULONG Length,
    00904                                 PMDL Mdl,
    00905                                 PIO_STATUS_BLOCK IoStatusBlock);
    00906
    00907
    00908
    00914 NTSTATUS NPF_CloseDumpFile(POPEN_INSTANCE Open);
    00915
    00920 UINT GetBuffOccupation(POPEN_INSTANCE Open);
    00921
    00933 #ifdef NDIS50
    00934 NDIS_STATUS NPF_PowerChange(IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent);
    00935 #endif
    00936
    00945 #endif  /*main ifndef/define*/

documentation. Copyright (c) 2002-2003 Politecnico di Torino. All rights reserved.