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-2005 Politecnico di Torino. Copyright (c) 2005
CACE technologies. All rights reserved.