- Main Page
- Modules
- Data Structures
- Files
- Related Pages

- File List
- Globals

# Packet.h

Go to the documentation of this file.

    00001 /*
    00002  * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)
    00003  * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California)
    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, CACE Technologies
    00016  * nor the names of its contributors may be used to endorse or promote
    00017  * products derived from this software without specific prior written
    00018  * permission.
    00019  *
    00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    00021  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    00022  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    00023  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    00024  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    00025  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    00026  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    00027  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    00028  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    00029  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    00030  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    00031  *
    00032  */
    00033
    00042 #ifndef __PACKET_INCLUDE______
    00043 #define __PACKET_INCLUDE______
    00044
    00045 #ifdef _X86_
    00046 #define NTKERNEL
    00047 #include "jitter.h"
    00048 #endif
    00049
    00050 #ifdef HAVE_BUGGY_TME_SUPPORT
    00051 #ifndef _X86_
    00052 #error TME support is available only on x86 architectures
    00053 #endif // _X86_
    00054 #endif //HAVE_BUGGY_TME_SUPPORT
    00055
    00056
    00057 //
    00058 // Needed to disable a warning due to the #pragma prefast directives,
    00059 // that are ignored by the normal DDK compiler
    00060 //
    00061 #ifndef _PREFAST_
    00062 #pragma warning(disable:4068)
    00063 #endif
    00064
    00065 #include "win_bpf.h"
    00066
    00067 #define  MAX_REQUESTS   32
    00068
    00069 #define Packet_ALIGNMENT sizeof(int)
    00070 #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1))
    00071
    00072
    00073 #define KERNEL_EVENT_NAMESPACE L"\\BaseNamedObjects\\"
    00074
    00075 /***************************/
    00076 /*         IOCTLs          */
    00077 /***************************/
    00078
    00087 #define  BIOCSETBUFFERSIZE 9592
    00088
    00099 #define  BIOCSETF 9030
    00100
    00107 #define  BIOCGSTATS 9031
    00108
    00114 #define  BIOCSRTIMEOUT 7416
    00115
    00123 #define  BIOCSMODE 7412
    00124
    00131 #define  BIOCSWRITEREP 7413
    00132
    00138 #define  BIOCSMINTOCOPY 7414
    00139
    00145 #define  BIOCSETOID 2147483648
    00146
    00152 #define  BIOCQUERYOID 2147483652
    00153
    00161 #define  BIOCSETDUMPFILENAME 9029
    00162
    00169 #define  BIOCGEVNAME 7415
    00170
    00178 #define  BIOCSENDPACKETSNOSYNC 9032
    00179
    00188 #define  BIOCSENDPACKETSSYNC 9033
    00189
    00196 #define  BIOCSETDUMPLIMITS 9034
    00197
    00204 #define BIOCISDUMPENDED 7411
    00205
    00211 #define  BIOCISETLOBBEH 7410
    00212
    00222 #define BIOCSETEVENTHANDLE 7920
    00223
    00224 // Working modes
    00225 #define MODE_CAPT 0x0
    00226 #define MODE_STAT 0x1
    00227 #define MODE_MON  0x2
    00228 #define MODE_DUMP 0x10
    00229
    00230
    00231 #define IMMEDIATE 1
    00232
    00233 #define NDIS_FLAGS_SKIP_LOOPBACK_W2K    0x400
    00234
    00235 // The following definitions are used to provide compatibility
    00236 // of the dump files with the ones of libpcap
    00237 #define TCPDUMP_MAGIC 0xa1b2c3d4
    00238 #define PCAP_VERSION_MAJOR 2
    00239 #define PCAP_VERSION_MINOR 4
    00240
    00241 // Loopback behaviour definitions
    00242 #define NPF_DISABLE_LOOPBACK    1
    00243 #define NPF_ENABLE_LOOPBACK     2
    00244
    00245
    00250 struct packet_file_header
    00251 {
    00252     UINT magic;
    00253     USHORT version_major;
    00254     USHORT version_minor;
    00255     UINT thiszone;
    00256     UINT sigfigs;
    00257     UINT snaplen;
    00258     UINT linktype;
    00259 };
    00260
    00265 struct sf_pkthdr {
    00266     struct timeval  ts;
    00267     UINT            caplen;
    00268
    00269
    00270     UINT            len;
    00271 };
    00272
    00282 typedef struct _INTERNAL_REQUEST {
    00283     LIST_ENTRY      ListElement;
    00284 //    PIRP          Irp;                ///< Irp that performed the request
    00285 //  BOOLEAN         Internal;           ///< True if the request is for internal use of npf.sys. False if the request is performed by the user through an IOCTL.
    00286     NDIS_EVENT      InternalRequestCompletedEvent;
    00287     NDIS_REQUEST    Request;
    00288     NDIS_STATUS     RequestStatus;
    00289
    00290 } INTERNAL_REQUEST, *PINTERNAL_REQUEST;
    00291
    00299 typedef struct _PACKET_RESERVED {
    00300     LIST_ENTRY      ListElement;
    00301     PIRP            Irp;
    00302     PMDL            pMdl;
    00303     BOOLEAN         FreeBufAfterWrite;
    00304
    00305     ULONG           Cpu;
    00306 }  PACKET_RESERVED, *PPACKET_RESERVED;
    00307
    00308 #define RESERVED(_p) ((PPACKET_RESERVED)((_p)->ProtocolReserved))
    00309
    00310
    00315 typedef struct _DEVICE_EXTENSION {
    00316     NDIS_HANDLE    NdisProtocolHandle;
    00317     NDIS_STRING    AdapterName;
    00318     PWSTR          ExportString;
    00319
    00320 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    00321
    00327 typedef struct __CPU_Private_Data
    00328 {
    00329     ULONG   P;
    00330     ULONG   C;
    00331     ULONG   Free;
    00332     PUCHAR  Buffer;
    00333     ULONG   Accepted;
    00334
    00335
    00336
    00337     ULONG   Received;
    00338
    00339
    00340
    00341     ULONG   Dropped;
    00342
    00343
    00344
    00345     NDIS_SPIN_LOCK BufferLock;
    00346     PMDL    TransferMdl1;
    00347     PMDL    TransferMdl2;
    00348     ULONG   NewP;
    00349 }
    00350     CpuPrivateData;
    00351
    00352
    00360 typedef struct _OPEN_INSTANCE
    00361 {
    00362     PDEVICE_EXTENSION   DeviceExtension;
    00363
    00364     NDIS_HANDLE         AdapterHandle;
    00365     UINT                Medium;
    00366
    00367     NDIS_HANDLE         PacketPool;
    00368     KSPIN_LOCK          RequestSpinLock;
    00369     LIST_ENTRY          RequestList;
    00370     LIST_ENTRY          ResetIrpList;
    00371     INTERNAL_REQUEST    Requests[MAX_REQUESTS];
    00372     PMDL                BufferMdl;
    00373     PKEVENT             ReadEvent;
    00374     PUCHAR              bpfprogram;
    00375
    00376
    00377
    00378
    00379 #ifdef _X86_
    00380     JIT_BPF_Filter      *Filter;
    00381
    00382 #endif //_X86_
    00383     UINT                MinToCopy;
    00384
    00385     LARGE_INTEGER       TimeOut;
    00386
    00387
    00388     int                 mode;
    00389     LARGE_INTEGER       Nbytes;
    00390     LARGE_INTEGER       Npackets;
    00391     NDIS_SPIN_LOCK      CountersLock;
    00392     UINT                Nwrites;
    00393
    00394     ULONG               Multiple_Write_Counter;
    00395     NDIS_EVENT          WriteEvent;
    00396     BOOLEAN             WriteInProgress;
    00397
    00398     NDIS_SPIN_LOCK      WriteLock;
    00399     NDIS_EVENT          NdisRequestEvent;
    00400     BOOLEAN             SkipSentPackets;
    00401     NDIS_STATUS         IOStatus;
    00402     HANDLE              DumpFileHandle;
    00403     PFILE_OBJECT        DumpFileObject;
    00404     PKTHREAD            DumpThreadObject;
    00405     HANDLE              DumpThreadHandle;
    00406     NDIS_EVENT          DumpEvent;
    00407     LARGE_INTEGER       DumpOffset;
    00408     UNICODE_STRING      DumpFileName;
    00409     UINT                MaxDumpBytes;
    00410
    00411     UINT                MaxDumpPacks;
    00412
    00413
    00414     BOOLEAN             DumpLimitReached;
    00415
    00416     MEM_TYPE            mem_ex;
    00417     TME_CORE            tme;
    00418     NDIS_SPIN_LOCK      MachineLock;
    00419     UINT                MaxFrameSize;
    00420
    00421     CpuPrivateData      CpuData[32];
    00422     ULONG               ReaderSN;
    00423     ULONG               WriterSN;
    00424
    00425     ULONG               Size;
    00426     ULONG              AdapterHandleUsageCounter;
    00427     NDIS_SPIN_LOCK     AdapterHandleLock;
    00428     ULONG              AdapterBindingStatus;
    00429
    00430     NDIS_EVENT         NdisOpenCloseCompleteEvent;
    00431     NDIS_EVENT         NdisWriteCompleteEvent;
    00432     NTSTATUS           OpenCloseStatus;
    00433     ULONG              TransmitPendingPackets;
    00434 }
    00435 OPEN_INSTANCE, *POPEN_INSTANCE;
    00436
    00437 enum ADAPTER_BINDING_STATUS
    00438 {
    00439     ADAPTER_UNBOUND,
    00440     ADAPTER_BOUND,
    00441     ADAPTER_UNBINDING,
    00442 };
    00443
    00451 struct PacketHeader
    00452 {
    00453     ULONG SN;
    00454     struct bpf_hdr header;
    00455 };
    00456
    00457 extern ULONG NCpu;
    00458
    00459
    00460 #define TRANSMIT_PACKETS 256
    00461
    00462
    00463
    00465 #define EXIT_SUCCESS(quantity) Irp->IoStatus.Information=quantity;\
    00466     Irp->IoStatus.Status = STATUS_SUCCESS;\
    00467     IoCompleteRequest(Irp, IO_NO_INCREMENT);\
    00468     return STATUS_SUCCESS;\
    00469
    00471 #define EXIT_FAILURE(quantity) Irp->IoStatus.Information=quantity;\
    00472     Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;\
    00473     IoCompleteRequest(Irp, IO_NO_INCREMENT);\
    00474     return STATUS_UNSUCCESSFUL;\
    00475
    00476
    00481 /***************************/
    00482 /*       Prototypes        */
    00483 /***************************/
    00484
    00501 NTSTATUS
    00502 DriverEntry(
    00503     IN PDRIVER_OBJECT DriverObject,
    00504     IN PUNICODE_STRING RegistryPath
    00505     );
    00506
    00516 PWCHAR getAdaptersList(VOID);
    00517
    00524 PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID);
    00525
    00537 BOOLEAN createDevice(
    00538     IN OUT PDRIVER_OBJECT adriverObjectP,
    00539     IN PUNICODE_STRING amacNameP,
    00540     NDIS_HANDLE aProtoHandle);
    00541
    00553 NTSTATUS
    00554 NPF_Open(
    00555     IN PDEVICE_OBJECT DeviceObject,
    00556     IN PIRP Irp
    00557     );
    00558
    00568 VOID
    00569 NPF_OpenAdapterComplete(
    00570     IN NDIS_HANDLE  ProtocolBindingContext,
    00571     IN NDIS_STATUS  Status,
    00572     IN NDIS_STATUS  OpenErrorStatus
    00573     );
    00574
    00585 NTSTATUS
    00586 NPF_Cleanup(
    00587     IN PDEVICE_OBJECT DeviceObject,
    00588     IN PIRP Irp
    00589     );
    00590
    00591 NTSTATUS
    00592 NPF_Close(
    00593     IN PDEVICE_OBJECT DeviceObject,
    00594     IN PIRP Irp
    00595     );
    00596
    00597
    00598
    00607 VOID
    00608 NPF_CloseAdapterComplete(
    00609     IN NDIS_HANDLE  ProtocolBindingContext,
    00610     IN NDIS_STATUS  Status
    00611     );
    00612
    00635 NDIS_STATUS
    00636 NPF_tap(
    00637     IN NDIS_HANDLE ProtocolBindingContext,
    00638     IN NDIS_HANDLE MacReceiveContext,
    00639     IN PVOID HeaderBuffer,
    00640     IN UINT HeaderBufferSize,
    00641     IN PVOID LookAheadBuffer,
    00642     IN UINT LookaheadBufferSize,
    00643     IN UINT PacketSize
    00644     );
    00645
    00656 VOID
    00657 NPF_TransferDataComplete(
    00658     IN NDIS_HANDLE ProtocolBindingContext,
    00659     IN PNDIS_PACKET Packet,
    00660     IN NDIS_STATUS Status,
    00661     IN UINT BytesTransferred
    00662     );
    00663
    00670 VOID
    00671 NPF_ReceiveComplete(IN NDIS_HANDLE  ProtocolBindingContext);
    00672
    00696 NTSTATUS
    00697 NPF_IoControl(
    00698     IN PDEVICE_OBJECT DeviceObject,
    00699     IN PIRP Irp
    00700     );
    00701
    00702 VOID
    00703
    00713 NPF_RequestComplete(
    00714     IN NDIS_HANDLE   ProtocolBindingContext,
    00715     IN PNDIS_REQUEST pRequest,
    00716     IN NDIS_STATUS   Status
    00717     );
    00718
    00731 NTSTATUS
    00732 NPF_Write(
    00733             IN PDEVICE_OBJECT DeviceObject,
    00734             IN PIRP Irp
    00735             );
    00736
    00737
    00757 INT NPF_BufferedWrite(IN PIRP Irp,
    00758                         IN PCHAR UserBuff,
    00759                         IN ULONG UserBuffSize,
    00760                         BOOLEAN sync);
    00761
    00769 VOID NPF_WaitEndOfBufferedWrite(POPEN_INSTANCE Open);
    00770
    00780 VOID
    00781 NPF_SendComplete(
    00782     IN NDIS_HANDLE   ProtocolBindingContext,
    00783     IN PNDIS_PACKET  pPacket,
    00784     IN NDIS_STATUS   Status
    00785     );
    00786
    00796 VOID
    00797 NPF_ResetComplete(
    00798     IN NDIS_HANDLE  ProtocolBindingContext,
    00799     IN NDIS_STATUS  Status
    00800     );
    00801
    00805 VOID
    00806 NPF_Status(
    00807     IN NDIS_HANDLE   ProtocolBindingContext,
    00808     IN NDIS_STATUS   Status,
    00809     IN PVOID         StatusBuffer,
    00810     IN UINT          StatusBufferSize
    00811     );
    00812
    00813
    00817 VOID
    00818 NPF_StatusComplete(IN NDIS_HANDLE  ProtocolBindingContext);
    00819
    00828 VOID
    00829 NPF_Unload(IN PDRIVER_OBJECT DriverObject);
    00830
    00831
    00850 NTSTATUS
    00851 NPF_Read(
    00852     IN PDEVICE_OBJECT DeviceObject,
    00853     IN PIRP Irp
    00854     );
    00855
    00861 NTSTATUS
    00862 NPF_ReadRegistry(
    00863     IN  PWSTR              *MacDriverName,
    00864     IN  PWSTR              *PacketDriverName,
    00865     IN  PUNICODE_STRING     RegistryPath
    00866     );
    00867
    00874 NTSTATUS
    00875 NPF_QueryRegistryRoutine(
    00876     IN PWSTR     ValueName,
    00877     IN ULONG     ValueType,
    00878     IN PVOID     ValueData,
    00879     IN ULONG     ValueLength,
    00880     IN PVOID     Context,
    00881     IN PVOID     EntryContext
    00882     );
    00883
    00889 VOID NPF_BindAdapter(
    00890     OUT PNDIS_STATUS            Status,
    00891     IN  NDIS_HANDLE             BindContext,
    00892     IN  PNDIS_STRING            DeviceName,
    00893     IN  PVOID                   SystemSpecific1,
    00894     IN  PVOID                   SystemSpecific2
    00895     );
    00896
    00908 VOID
    00909 NPF_UnbindAdapter(
    00910     OUT PNDIS_STATUS        Status,
    00911     IN  NDIS_HANDLE         ProtocolBindingContext,
    00912     IN  NDIS_HANDLE         UnbindContext
    00913     );
    00914
    00915
    00923 NTSTATUS NPF_OpenDumpFile(POPEN_INSTANCE Open , PUNICODE_STRING fileName, BOOLEAN append);
    00924
    00933 NTSTATUS NPF_StartDump(POPEN_INSTANCE Open);
    00934
    00942 VOID NPF_DumpThread(PVOID Open);
    00943
    00950 NTSTATUS NPF_SaveCurrentBuffer(POPEN_INSTANCE Open);
    00951
    00964 VOID NPF_WriteDumpFile(PFILE_OBJECT FileObject,
    00965                                 PLARGE_INTEGER Offset,
    00966                                 ULONG Length,
    00967                                 PMDL Mdl,
    00968                                 PIO_STATUS_BLOCK IoStatusBlock);
    00969
    00970
    00971
    00977 NTSTATUS NPF_CloseDumpFile(POPEN_INSTANCE Open);
    00978
    00979 VOID
    00980 NPF_CloseOpenInstance(POPEN_INSTANCE pOpen);
    00981
    00982 BOOLEAN
    00983 NPF_StartUsingBinding(
    00984     IN POPEN_INSTANCE pOpen);
    00985
    00986 VOID
    00987 NPF_StopUsingBinding(
    00988     IN POPEN_INSTANCE pOpen);
    00989
    00990 VOID
    00991 NPF_CloseBinding(
    00992     IN POPEN_INSTANCE pOpen);
    00993
    00994 NTSTATUS
    00995 NPF_GetDeviceMTU(
    00996              IN POPEN_INSTANCE pOpen,
    00997              IN PIRP    pIrp,
    00998              OUT PUINT  pMtu);
    00999
    01004 UINT GetBuffOccupation(POPEN_INSTANCE Open);
    01005
    01017 #ifdef NDIS50
    01018 NDIS_STATUS NPF_PowerChange(IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent);
    01019 #endif
    01020
    01021 //
    01022 //  Old registry based WinPcap names
    01023 //
    01025 //  \brief Helper function to query a value from the global WinPcap registry key
    01026 //*/
    01027 //VOID NPF_QueryWinpcapRegistryString(PWSTR SubKeyName,
    01028 //                               WCHAR *Value,
    01029 //                               UINT ValueLen,
    01030 //                               WCHAR *DefaultValue);
    01031 //
    01032
    01033
    01042 #endif  /*main ifndef/define*/

documentation. Copyright (c) 2002-2005 Politecnico di Torino. Copyright (c) 2005-2007 CACE Technologies. All rights reserved.