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 __NPF_x86__ 00046 #define NTKERNEL 00047 #include "jitter.h" 00048 #endif 00049 00050 // 00051 // Needed to disable a warning due to the #pragma prefast directives, 00052 // that are ignored by the normal DDK compiler 00053 // 00054 #ifndef _PREFAST_ 00055 #pragma warning(disable:4068) 00056 #endif 00057 00058 #include "win_bpf.h" 00059 00060 #define MAX_REQUESTS 32 00061 00062 #define Packet_ALIGNMENT sizeof(int) 00063 #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1)) 00064 00065 00066 #define KERNEL_EVENT_NAMESPACE L"\\BaseNamedObjects\\" 00067 00068 /***************************/ 00069 /* IOCTLs */ 00070 /***************************/ 00071 00080 #define BIOCSETBUFFERSIZE 9592 00081 00092 #define BIOCSETF 9030 00093 00100 #define BIOCGSTATS 9031 00101 00107 #define BIOCSRTIMEOUT 7416 00108 00116 #define BIOCSMODE 7412 00117 00124 #define BIOCSWRITEREP 7413 00125 00131 #define BIOCSMINTOCOPY 7414 00132 00138 #define BIOCSETOID 2147483648 00139 00145 #define BIOCQUERYOID 2147483652 00146 00154 #define BIOCSETDUMPFILENAME 9029 00155 00162 #define BIOCGEVNAME 7415 00163 00171 #define BIOCSENDPACKETSNOSYNC 9032 00172 00181 #define BIOCSENDPACKETSSYNC 9033 00182 00189 #define BIOCSETDUMPLIMITS 9034 00190 00197 #define BIOCISDUMPENDED 7411 00198 00204 #define BIOCISETLOBBEH 7410 00205 00215 #define BIOCSETEVENTHANDLE 7920 00216 00217 // Working modes 00218 #define MODE_CAPT 0x0 00219 #define MODE_STAT 0x1 00220 #define MODE_MON 0x2 00221 #define MODE_DUMP 0x10 00222 00223 00224 #define IMMEDIATE 1 00225 00226 #define NDIS_FLAGS_SKIP_LOOPBACK_W2K 0x400 00227 00228 // The following definitions are used to provide compatibility 00229 // of the dump files with the ones of libpcap 00230 #define TCPDUMP_MAGIC 0xa1b2c3d4 00231 #define PCAP_VERSION_MAJOR 2 00232 #define PCAP_VERSION_MINOR 4 00233 00234 // Loopback behaviour definitions 00235 #define NPF_DISABLE_LOOPBACK 1 00236 #define NPF_ENABLE_LOOPBACK 2 00237 00238 00243 struct packet_file_header 00244 { 00245 UINT magic; 00246 USHORT version_major; 00247 USHORT version_minor; 00248 UINT thiszone; 00249 UINT sigfigs; 00250 UINT snaplen; 00251 UINT linktype; 00252 }; 00253 00258 struct sf_pkthdr { 00259 struct timeval ts; 00260 UINT caplen; 00261 00262 00263 UINT len; 00264 }; 00265 00275 typedef struct _INTERNAL_REQUEST { 00276 LIST_ENTRY ListElement; 00277 // PIRP Irp; ///< Irp that performed the request 00278 // 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. 00279 NDIS_EVENT InternalRequestCompletedEvent; 00280 NDIS_REQUEST Request; 00281 NDIS_STATUS RequestStatus; 00282 00283 } INTERNAL_REQUEST, *PINTERNAL_REQUEST; 00284 00292 typedef struct _PACKET_RESERVED { 00293 LIST_ENTRY ListElement; 00294 PIRP Irp; 00295 PMDL pMdl; 00296 BOOLEAN FreeBufAfterWrite; 00297 00298 ULONG Cpu; 00299 } PACKET_RESERVED, *PPACKET_RESERVED; 00300 00301 #define RESERVED(_p) ((PPACKET_RESERVED)((_p)->ProtocolReserved)) 00302 00303 00308 typedef struct _DEVICE_EXTENSION { 00309 NDIS_HANDLE NdisProtocolHandle; 00310 NDIS_STRING AdapterName; 00311 PWSTR ExportString; 00312 00313 } DEVICE_EXTENSION, *PDEVICE_EXTENSION; 00314 00320 typedef struct __CPU_Private_Data 00321 { 00322 ULONG P; 00323 ULONG C; 00324 ULONG Free; 00325 PUCHAR Buffer; 00326 ULONG Accepted; 00327 00328 00329 00330 ULONG Received; 00331 00332 00333 00334 ULONG Dropped; 00335 00336 00337 00338 NDIS_SPIN_LOCK BufferLock; 00339 PMDL TransferMdl1; 00340 PMDL TransferMdl2; 00341 ULONG NewP; 00342 } 00343 CpuPrivateData; 00344 00345 00353 typedef struct _OPEN_INSTANCE 00354 { 00355 PDEVICE_EXTENSION DeviceExtension; 00356 00357 NDIS_HANDLE AdapterHandle; 00358 UINT Medium; 00359 00360 NDIS_HANDLE PacketPool; 00361 KSPIN_LOCK RequestSpinLock; 00362 LIST_ENTRY RequestList; 00363 LIST_ENTRY ResetIrpList; 00364 INTERNAL_REQUEST Requests[MAX_REQUESTS]; 00365 PMDL BufferMdl; 00366 PKEVENT ReadEvent; 00367 PUCHAR bpfprogram; 00368 00369 00370 00371 00372 #ifdef __NPF_x86__ 00373 JIT_BPF_Filter *Filter; 00374 00375 #endif 00376 UINT MinToCopy; 00377 00378 LARGE_INTEGER TimeOut; 00379 00380 00381 int mode; 00382 LARGE_INTEGER Nbytes; 00383 LARGE_INTEGER Npackets; 00384 NDIS_SPIN_LOCK CountersLock; 00385 UINT Nwrites; 00386 00387 ULONG Multiple_Write_Counter; 00388 NDIS_EVENT WriteEvent; 00389 BOOLEAN WriteInProgress; 00390 00391 NDIS_SPIN_LOCK WriteLock; 00392 NDIS_EVENT NdisRequestEvent; 00393 BOOLEAN SkipSentPackets; 00394 NDIS_STATUS IOStatus; 00395 HANDLE DumpFileHandle; 00396 PFILE_OBJECT DumpFileObject; 00397 PKTHREAD DumpThreadObject; 00398 HANDLE DumpThreadHandle; 00399 NDIS_EVENT DumpEvent; 00400 LARGE_INTEGER DumpOffset; 00401 UNICODE_STRING DumpFileName; 00402 UINT MaxDumpBytes; 00403 00404 UINT MaxDumpPacks; 00405 00406 00407 BOOLEAN DumpLimitReached; 00408 00409 MEM_TYPE mem_ex; 00410 TME_CORE tme; 00411 NDIS_SPIN_LOCK MachineLock; 00412 UINT MaxFrameSize; 00413 00414 CpuPrivateData CpuData[32]; 00415 ULONG ReaderSN; 00416 ULONG WriterSN; 00417 00418 ULONG Size; 00419 ULONG AdapterHandleUsageCounter; 00420 NDIS_SPIN_LOCK AdapterHandleLock; 00421 ULONG AdapterBindingStatus; 00422 00423 NDIS_EVENT NdisOpenCloseCompleteEvent; 00424 NDIS_EVENT NdisWriteCompleteEvent; 00425 NTSTATUS OpenCloseStatus; 00426 ULONG TransmitPendingPackets; 00427 } 00428 OPEN_INSTANCE, *POPEN_INSTANCE; 00429 00430 enum ADAPTER_BINDING_STATUS 00431 { 00432 ADAPTER_UNBOUND, 00433 ADAPTER_BOUND, 00434 ADAPTER_UNBINDING, 00435 }; 00436 00444 struct PacketHeader 00445 { 00446 ULONG SN; 00447 struct bpf_hdr header; 00448 }; 00449 00450 extern ULONG NCpu; 00451 00452 00453 #define TRANSMIT_PACKETS 256 00454 00455 00456 00458 #define EXIT_SUCCESS(quantity) Irp->IoStatus.Information=quantity;\ 00459 Irp->IoStatus.Status = STATUS_SUCCESS;\ 00460 IoCompleteRequest(Irp, IO_NO_INCREMENT);\ 00461 return STATUS_SUCCESS;\ 00462 00464 #define EXIT_FAILURE(quantity) Irp->IoStatus.Information=quantity;\ 00465 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;\ 00466 IoCompleteRequest(Irp, IO_NO_INCREMENT);\ 00467 return STATUS_UNSUCCESSFUL;\ 00468 00469 00474 /***************************/ 00475 /* Prototypes */ 00476 /***************************/ 00477 00494 NTSTATUS 00495 DriverEntry( 00496 IN PDRIVER_OBJECT DriverObject, 00497 IN PUNICODE_STRING RegistryPath 00498 ); 00499 00509 PWCHAR getAdaptersList(VOID); 00510 00517 PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID); 00518 00530 BOOLEAN createDevice( 00531 IN OUT PDRIVER_OBJECT adriverObjectP, 00532 IN PUNICODE_STRING amacNameP, 00533 NDIS_HANDLE aProtoHandle); 00534 00546 NTSTATUS 00547 NPF_Open( 00548 IN PDEVICE_OBJECT DeviceObject, 00549 IN PIRP Irp 00550 ); 00551 00561 VOID 00562 NPF_OpenAdapterComplete( 00563 IN NDIS_HANDLE ProtocolBindingContext, 00564 IN NDIS_STATUS Status, 00565 IN NDIS_STATUS OpenErrorStatus 00566 ); 00567 00578 NTSTATUS 00579 NPF_Cleanup( 00580 IN PDEVICE_OBJECT DeviceObject, 00581 IN PIRP Irp 00582 ); 00583 00584 NTSTATUS 00585 NPF_Close( 00586 IN PDEVICE_OBJECT DeviceObject, 00587 IN PIRP Irp 00588 ); 00589 00590 00591 00600 VOID 00601 NPF_CloseAdapterComplete( 00602 IN NDIS_HANDLE ProtocolBindingContext, 00603 IN NDIS_STATUS Status 00604 ); 00605 00628 NDIS_STATUS 00629 NPF_tap( 00630 IN NDIS_HANDLE ProtocolBindingContext, 00631 IN NDIS_HANDLE MacReceiveContext, 00632 IN PVOID HeaderBuffer, 00633 IN UINT HeaderBufferSize, 00634 IN PVOID LookAheadBuffer, 00635 IN UINT LookaheadBufferSize, 00636 IN UINT PacketSize 00637 ); 00638 00649 VOID 00650 NPF_TransferDataComplete( 00651 IN NDIS_HANDLE ProtocolBindingContext, 00652 IN PNDIS_PACKET Packet, 00653 IN NDIS_STATUS Status, 00654 IN UINT BytesTransferred 00655 ); 00656 00663 VOID 00664 NPF_ReceiveComplete(IN NDIS_HANDLE ProtocolBindingContext); 00665 00689 NTSTATUS 00690 NPF_IoControl( 00691 IN PDEVICE_OBJECT DeviceObject, 00692 IN PIRP Irp 00693 ); 00694 00695 VOID 00696 00706 NPF_RequestComplete( 00707 IN NDIS_HANDLE ProtocolBindingContext, 00708 IN PNDIS_REQUEST pRequest, 00709 IN NDIS_STATUS Status 00710 ); 00711 00724 NTSTATUS 00725 NPF_Write( 00726 IN PDEVICE_OBJECT DeviceObject, 00727 IN PIRP Irp 00728 ); 00729 00730 00750 INT NPF_BufferedWrite(IN PIRP Irp, 00751 IN PCHAR UserBuff, 00752 IN ULONG UserBuffSize, 00753 BOOLEAN sync); 00754 00762 VOID NPF_WaitEndOfBufferedWrite(POPEN_INSTANCE Open); 00763 00773 VOID 00774 NPF_SendComplete( 00775 IN NDIS_HANDLE ProtocolBindingContext, 00776 IN PNDIS_PACKET pPacket, 00777 IN NDIS_STATUS Status 00778 ); 00779 00789 VOID 00790 NPF_ResetComplete( 00791 IN NDIS_HANDLE ProtocolBindingContext, 00792 IN NDIS_STATUS Status 00793 ); 00794 00798 VOID 00799 NPF_Status( 00800 IN NDIS_HANDLE ProtocolBindingContext, 00801 IN NDIS_STATUS Status, 00802 IN PVOID StatusBuffer, 00803 IN UINT StatusBufferSize 00804 ); 00805 00806 00810 VOID 00811 NPF_StatusComplete(IN NDIS_HANDLE ProtocolBindingContext); 00812 00821 VOID 00822 NPF_Unload(IN PDRIVER_OBJECT DriverObject); 00823 00824 00843 NTSTATUS 00844 NPF_Read( 00845 IN PDEVICE_OBJECT DeviceObject, 00846 IN PIRP Irp 00847 ); 00848 00854 NTSTATUS 00855 NPF_ReadRegistry( 00856 IN PWSTR *MacDriverName, 00857 IN PWSTR *PacketDriverName, 00858 IN PUNICODE_STRING RegistryPath 00859 ); 00860 00867 NTSTATUS 00868 NPF_QueryRegistryRoutine( 00869 IN PWSTR ValueName, 00870 IN ULONG ValueType, 00871 IN PVOID ValueData, 00872 IN ULONG ValueLength, 00873 IN PVOID Context, 00874 IN PVOID EntryContext 00875 ); 00876 00882 VOID NPF_BindAdapter( 00883 OUT PNDIS_STATUS Status, 00884 IN NDIS_HANDLE BindContext, 00885 IN PNDIS_STRING DeviceName, 00886 IN PVOID SystemSpecific1, 00887 IN PVOID SystemSpecific2 00888 ); 00889 00901 VOID 00902 NPF_UnbindAdapter( 00903 OUT PNDIS_STATUS Status, 00904 IN NDIS_HANDLE ProtocolBindingContext, 00905 IN NDIS_HANDLE UnbindContext 00906 ); 00907 00908 00916 NTSTATUS NPF_OpenDumpFile(POPEN_INSTANCE Open , PUNICODE_STRING fileName, BOOLEAN append); 00917 00926 NTSTATUS NPF_StartDump(POPEN_INSTANCE Open); 00927 00935 VOID NPF_DumpThread(PVOID Open); 00936 00943 NTSTATUS NPF_SaveCurrentBuffer(POPEN_INSTANCE Open); 00944 00957 VOID NPF_WriteDumpFile(PFILE_OBJECT FileObject, 00958 PLARGE_INTEGER Offset, 00959 ULONG Length, 00960 PMDL Mdl, 00961 PIO_STATUS_BLOCK IoStatusBlock); 00962 00963 00964 00970 NTSTATUS NPF_CloseDumpFile(POPEN_INSTANCE Open); 00971 00972 VOID 00973 NPF_CloseOpenInstance(POPEN_INSTANCE pOpen); 00974 00975 BOOLEAN 00976 NPF_StartUsingBinding( 00977 IN POPEN_INSTANCE pOpen); 00978 00979 VOID 00980 NPF_StopUsingBinding( 00981 IN POPEN_INSTANCE pOpen); 00982 00983 VOID 00984 NPF_CloseBinding( 00985 IN POPEN_INSTANCE pOpen); 00986 00987 NTSTATUS 00988 NPF_GetDeviceMTU( 00989 IN POPEN_INSTANCE pOpen, 00990 IN PIRP pIrp, 00991 OUT PUINT pMtu); 00992 00997 UINT GetBuffOccupation(POPEN_INSTANCE Open); 00998 01010 #ifdef NDIS50 01011 NDIS_STATUS NPF_PowerChange(IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent); 01012 #endif 01013 01014 // 01015 // Old registry based WinPcap names 01016 // 01018 // \brief Helper function to query a value from the global WinPcap registry key 01019 //*/ 01020 //VOID NPF_QueryWinpcapRegistryString(PWSTR SubKeyName, 01021 // WCHAR *Value, 01022 // UINT ValueLen, 01023 // WCHAR *DefaultValue); 01024 // 01025 01026 01035 #endif /*main ifndef/define*/
documentation. Copyright (c) 2002-2005 Politecnico di Torino. Copyright (c) 2005-2007 CACE Technologies. All rights reserved.