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 "tme.h" 00048 #include "win_bpf.h" 00049 00050 #define MAX_REQUESTS 32 00051 00052 #define Packet_ALIGNMENT sizeof(int) 00053 #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1)) 00054 00055 /***************************/ 00056 /* IOCTLs */ 00057 /***************************/ 00058 00067 #define BIOCSETBUFFERSIZE 9592 00068 00079 #define BIOCSETF 9030 00080 00087 #define BIOCGSTATS 9031 00088 00094 #define BIOCSRTIMEOUT 7416 00095 00103 #define BIOCSMODE 7412 00104 00111 #define BIOCSWRITEREP 7413 00112 00118 #define BIOCSMINTOCOPY 7414 00119 00125 #define BIOCSETOID 2147483648 00126 00132 #define BIOCQUERYOID 2147483652 00133 00141 #define BIOCSETDUMPFILENAME 9029 00142 00149 #define BIOCGEVNAME 7415 00150 00158 #define BIOCSENDPACKETSNOSYNC 9032 00159 00168 #define BIOCSENDPACKETSSYNC 9033 00169 00176 #define BIOCSETDUMPLIMITS 9034 00177 00184 #define BIOCISDUMPENDED 7411 00185 00186 // Working modes 00187 #define MODE_CAPT 0x0 00188 #define MODE_STAT 0x1 00189 #define MODE_MON 0x2 00190 #define MODE_DUMP 0x10 00191 00192 00193 #define IMMEDIATE 1 00194 00195 00196 // The following definitions are used to provide compatibility 00197 // of the dump files with the ones of libpcap 00198 #define TCPDUMP_MAGIC 0xa1b2c3d4 00199 #define PCAP_VERSION_MAJOR 2 00200 #define PCAP_VERSION_MINOR 4 00201 00202 00207 struct packet_file_header 00208 { 00209 UINT magic; 00210 USHORT version_major; 00211 USHORT version_minor; 00212 UINT thiszone; 00213 UINT sigfigs; 00214 UINT snaplen; 00215 UINT linktype; 00216 }; 00217 00222 struct sf_pkthdr { 00223 struct timeval ts; 00224 UINT caplen; 00225 00226 00227 UINT len; 00228 }; 00229 00239 typedef struct _INTERNAL_REQUEST { 00240 LIST_ENTRY ListElement; 00241 PIRP Irp; 00242 BOOLEAN Internal; 00243 NDIS_REQUEST Request; 00244 } INTERNAL_REQUEST, *PINTERNAL_REQUEST; 00245 00253 typedef struct _PACKET_RESERVED { 00254 LIST_ENTRY ListElement; 00255 PIRP Irp; 00256 PMDL pMdl; 00257 BOOLEAN FreeBufAfterWrite; 00258 00259 ULONG Cpu; 00260 } PACKET_RESERVED, *PPACKET_RESERVED; 00261 00262 #define RESERVED(_p) ((PPACKET_RESERVED)((_p)->ProtocolReserved)) 00263 00264 00269 typedef struct _DEVICE_EXTENSION { 00270 NDIS_HANDLE NdisProtocolHandle; 00271 NDIS_STRING AdapterName; 00272 PWSTR ExportString; 00273 00274 } DEVICE_EXTENSION, *PDEVICE_EXTENSION; 00275 00281 typedef struct __CPU_Private_Data 00282 { 00283 ULONG P; 00284 ULONG C; 00285 ULONG Free; 00286 PUCHAR Buffer; 00287 ULONG Accepted; 00288 00289 00290 00291 ULONG Received; 00292 00293 00294 00295 ULONG Dropped; 00296 00297 00298 00299 ULONG Processing; 00300 PMDL TransferMdl1; 00301 PMDL TransferMdl2; 00302 ULONG NewP; 00303 } 00304 CpuPrivateData; 00305 00306 00314 typedef struct _OPEN_INSTANCE 00315 { 00316 PDEVICE_EXTENSION DeviceExtension; 00317 00318 NDIS_HANDLE AdapterHandle; 00319 UINT Medium; 00320 00321 NDIS_HANDLE PacketPool; 00322 PIRP OpenCloseIrp; 00323 00324 KSPIN_LOCK RequestSpinLock; 00325 LIST_ENTRY RequestList; 00326 LIST_ENTRY ResetIrpList; 00327 INTERNAL_REQUEST Requests[MAX_REQUESTS]; 00328 PMDL BufferMdl; 00329 PKEVENT ReadEvent; 00330 HANDLE ReadEventHandle; 00331 UNICODE_STRING ReadEventName; 00332 00333 00334 00335 PUCHAR bpfprogram; 00336 00337 00338 00339 00340 JIT_BPF_Filter *Filter; 00341 00342 UINT MinToCopy; 00343 00344 LARGE_INTEGER TimeOut; 00345 00346 00347 int mode; 00348 LARGE_INTEGER Nbytes; 00349 LARGE_INTEGER Npackets; 00350 NDIS_SPIN_LOCK CountersLock; 00351 UINT Nwrites; 00352 00353 UINT Multiple_Write_Counter; 00354 NDIS_EVENT WriteEvent; 00355 NDIS_EVENT IOEvent; 00356 NDIS_STATUS IOStatus; 00357 BOOLEAN Bound; 00358 00359 HANDLE DumpFileHandle; 00360 PFILE_OBJECT DumpFileObject; 00361 PKTHREAD DumpThreadObject; 00362 HANDLE DumpThreadHandle; 00363 NDIS_EVENT DumpEvent; 00364 LARGE_INTEGER DumpOffset; 00365 UNICODE_STRING DumpFileName; 00366 UINT MaxDumpBytes; 00367 00368 UINT MaxDumpPacks; 00369 00370 00371 BOOLEAN DumpLimitReached; 00372 00373 MEM_TYPE mem_ex; 00374 TME_CORE tme; 00375 NDIS_SPIN_LOCK MachineLock; 00376 UINT MaxFrameSize; 00377 00378 CpuPrivateData CpuData[32]; 00379 ULONG ReaderSN; 00380 ULONG WriterSN; 00381 00382 ULONG Size; 00383 ULONG SkipProcessing; 00384 00385 00386 00387 } 00388 OPEN_INSTANCE, *POPEN_INSTANCE; 00389 00397 struct PacketHeader 00398 { 00399 ULONG SN; 00400 struct bpf_hdr header; 00401 }; 00402 00403 00404 #define TRANSMIT_PACKETS 256 00405 00406 00407 00409 #define EXIT_SUCCESS(quantity) Irp->IoStatus.Information=quantity;\ 00410 Irp->IoStatus.Status = STATUS_SUCCESS;\ 00411 IoCompleteRequest(Irp, IO_NO_INCREMENT);\ 00412 return STATUS_SUCCESS;\ 00413 00414 00415 #define EXIT_FAILURE(quantity) Irp->IoStatus.Information=quantity;\ 00416 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;\ 00417 IoCompleteRequest(Irp, IO_NO_INCREMENT);\ 00418 return STATUS_UNSUCCESSFUL;\ 00419 00420 00425 /***************************/ 00426 /* Prototypes */ 00427 /***************************/ 00428 00445 NTSTATUS 00446 DriverEntry( 00447 IN PDRIVER_OBJECT DriverObject, 00448 IN PUNICODE_STRING RegistryPath 00449 ); 00450 00460 PWCHAR getAdaptersList(VOID); 00461 00468 PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID); 00469 00481 BOOLEAN createDevice( 00482 IN OUT PDRIVER_OBJECT adriverObjectP, 00483 IN PUNICODE_STRING amacNameP, 00484 NDIS_HANDLE aProtoHandle); 00485 00497 NTSTATUS 00498 NPF_Open( 00499 IN PDEVICE_OBJECT DeviceObject, 00500 IN PIRP Irp 00501 ); 00502 00512 VOID 00513 NPF_OpenAdapterComplete( 00514 IN NDIS_HANDLE ProtocolBindingContext, 00515 IN NDIS_STATUS Status, 00516 IN NDIS_STATUS OpenErrorStatus 00517 ); 00518 00529 NTSTATUS 00530 NPF_Close( 00531 IN PDEVICE_OBJECT DeviceObject, 00532 IN PIRP Irp 00533 ); 00534 00543 VOID 00544 NPF_CloseAdapterComplete( 00545 IN NDIS_HANDLE ProtocolBindingContext, 00546 IN NDIS_STATUS Status 00547 ); 00548 00571 NDIS_STATUS 00572 NPF_tap( 00573 IN NDIS_HANDLE ProtocolBindingContext, 00574 IN NDIS_HANDLE MacReceiveContext, 00575 IN PVOID HeaderBuffer, 00576 IN UINT HeaderBufferSize, 00577 IN PVOID LookAheadBuffer, 00578 IN UINT LookaheadBufferSize, 00579 IN UINT PacketSize 00580 ); 00581 00592 VOID 00593 NPF_TransferDataComplete( 00594 IN NDIS_HANDLE ProtocolBindingContext, 00595 IN PNDIS_PACKET Packet, 00596 IN NDIS_STATUS Status, 00597 IN UINT BytesTransferred 00598 ); 00599 00606 VOID 00607 NPF_ReceiveComplete(IN NDIS_HANDLE ProtocolBindingContext); 00608 00632 NTSTATUS 00633 NPF_IoControl( 00634 IN PDEVICE_OBJECT DeviceObject, 00635 IN PIRP Irp 00636 ); 00637 00638 VOID 00639 00649 NPF_RequestComplete( 00650 IN NDIS_HANDLE ProtocolBindingContext, 00651 IN PNDIS_REQUEST pRequest, 00652 IN NDIS_STATUS Status 00653 ); 00654 00667 NTSTATUS 00668 NPF_Write( 00669 IN PDEVICE_OBJECT DeviceObject, 00670 IN PIRP Irp 00671 ); 00672 00673 00692 INT NPF_BufferedWrite(IN PIRP Irp, 00693 IN PCHAR UserBuff, 00694 IN ULONG UserBuffSize, 00695 BOOLEAN sync); 00696 00706 VOID 00707 NPF_SendComplete( 00708 IN NDIS_HANDLE ProtocolBindingContext, 00709 IN PNDIS_PACKET pPacket, 00710 IN NDIS_STATUS Status 00711 ); 00712 00722 VOID 00723 NPF_ResetComplete( 00724 IN NDIS_HANDLE ProtocolBindingContext, 00725 IN NDIS_STATUS Status 00726 ); 00727 00731 VOID 00732 NPF_Status( 00733 IN NDIS_HANDLE ProtocolBindingContext, 00734 IN NDIS_STATUS Status, 00735 IN PVOID StatusBuffer, 00736 IN UINT StatusBufferSize 00737 ); 00738 00739 00743 VOID 00744 NPF_StatusComplete(IN NDIS_HANDLE ProtocolBindingContext); 00745 00754 VOID 00755 NPF_Unload(IN PDRIVER_OBJECT DriverObject); 00756 00757 00776 NTSTATUS 00777 NPF_Read( 00778 IN PDEVICE_OBJECT DeviceObject, 00779 IN PIRP Irp 00780 ); 00781 00787 NTSTATUS 00788 NPF_ReadRegistry( 00789 IN PWSTR *MacDriverName, 00790 IN PWSTR *PacketDriverName, 00791 IN PUNICODE_STRING RegistryPath 00792 ); 00793 00800 NTSTATUS 00801 NPF_QueryRegistryRoutine( 00802 IN PWSTR ValueName, 00803 IN ULONG ValueType, 00804 IN PVOID ValueData, 00805 IN ULONG ValueLength, 00806 IN PVOID Context, 00807 IN PVOID EntryContext 00808 ); 00809 00815 VOID NPF_BindAdapter( 00816 OUT PNDIS_STATUS Status, 00817 IN NDIS_HANDLE BindContext, 00818 IN PNDIS_STRING DeviceName, 00819 IN PVOID SystemSpecific1, 00820 IN PVOID SystemSpecific2 00821 ); 00822 00834 VOID 00835 NPF_UnbindAdapter( 00836 OUT PNDIS_STATUS Status, 00837 IN NDIS_HANDLE ProtocolBindingContext, 00838 IN NDIS_HANDLE UnbindContext 00839 ); 00840 00853 int bpf_validate(struct bpf_insn *f,int len, uint32 mem_ex_size); 00854 00871 UINT bpf_filter(register struct bpf_insn *pc, 00872 register UCHAR *p, 00873 UINT wirelen, 00874 register UINT buflen, 00875 PMEM_TYPE mem_ex, 00876 PTME_CORE tme, 00877 struct time_conv *time_ref); 00878 00896 UINT bpf_filter_with_2_buffers(register struct bpf_insn *pc, 00897 register UCHAR *p, 00898 register UCHAR *pd, 00899 register int headersize, 00900 UINT wirelen, 00901 register UINT buflen, 00902 PMEM_TYPE mem_ex, 00903 PTME_CORE tme, 00904 struct time_conv *time_ref); 00905 00913 NTSTATUS NPF_OpenDumpFile(POPEN_INSTANCE Open , PUNICODE_STRING fileName, BOOLEAN append); 00914 00923 NTSTATUS NPF_StartDump(POPEN_INSTANCE Open); 00924 00932 VOID NPF_DumpThread(PVOID Open); 00933 00940 NTSTATUS NPF_SaveCurrentBuffer(POPEN_INSTANCE Open); 00941 00954 VOID NPF_WriteDumpFile(PFILE_OBJECT FileObject, 00955 PLARGE_INTEGER Offset, 00956 ULONG Length, 00957 PMDL Mdl, 00958 PIO_STATUS_BLOCK IoStatusBlock); 00959 00960 00961 00967 NTSTATUS NPF_CloseDumpFile(POPEN_INSTANCE Open); 00968 00973 UINT GetBuffOccupation(POPEN_INSTANCE Open); 00974 00986 #ifdef NDIS50 00987 NDIS_STATUS NPF_PowerChange(IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent); 00988 #endif 00989 00998 #endif /*main ifndef/define*/
documentation. Copyright (c) 2002-2003 Politecnico di Torino. All rights reserved.