00001 /* 00002 * Copyright (c) 1999, 2000 00003 * Politecnico di Torino. All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that: (1) source code distributions 00007 * retain the above copyright notice and this paragraph in its entirety, (2) 00008 * distributions including binary code include the above copyright notice and 00009 * this paragraph in its entirety in the documentation or other materials 00010 * provided with the distribution, and (3) all advertising materials mentioning 00011 * features or use of this software display the following acknowledgement: 00012 * ``This product includes software developed by the Politecnico 00013 * di Torino, and its contributors.'' Neither the name of 00014 * the University nor the names of its contributors may be used to endorse 00015 * or promote products derived from this software without specific prior 00016 * written permission. 00017 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 00018 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 00019 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00020 */ 00021 00030 #ifndef __PACKET_INCLUDE______ 00031 #define __PACKET_INCLUDE______ 00032 00033 #define NTKERNEL 00034 00035 #include "jitter.h" 00036 #include "tme.h" 00037 00038 #define MAX_REQUESTS 32 00039 00040 #define Packet_ALIGNMENT sizeof(int) 00041 #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1)) 00042 00043 00044 00045 /***************************/ 00046 /* IOCTLs */ 00047 /***************************/ 00048 00057 #define BIOCSETBUFFERSIZE 9592 00058 00069 #define BIOCSETF 9030 00070 00077 #define BIOCGSTATS 9031 00078 00084 #define BIOCSRTIMEOUT 7416 00085 00093 #define BIOCSMODE 7412 00094 00101 #define BIOCSWRITEREP 7413 00102 00108 #define BIOCSMINTOCOPY 7414 00109 00115 #define BIOCSETOID 2147483648 00116 00122 #define BIOCQUERYOID 2147483652 00123 00131 #define BIOCSETDUMPFILENAME 9029 00132 00139 #define BIOCGEVNAME 7415 00140 00148 #define BIOCSENDPACKETSNOSYNC 9032 00149 00158 #define BIOCSENDPACKETSSYNC 9033 00159 00166 #define BIOCSETDUMPLIMITS 9034 00167 00174 #define BIOCISDUMPENDED 7411 00175 00176 // Working modes 00177 #define MODE_CAPT 0x0 00178 #define MODE_STAT 0x1 00179 #define MODE_MON 0x2 00180 #define MODE_DUMP 0x10 00181 00182 00183 #define IMMEDIATE 1 00184 00185 00186 // The following definitions are used to provide compatibility 00187 // of the dump files with the ones of libpcap 00188 #define TCPDUMP_MAGIC 0xa1b2c3d4 00189 #define PCAP_VERSION_MAJOR 2 00190 #define PCAP_VERSION_MINOR 4 00191 00192 00197 struct packet_file_header 00198 { 00199 UINT magic; 00200 USHORT version_major; 00201 USHORT version_minor; 00202 UINT thiszone; 00203 UINT sigfigs; 00204 UINT snaplen; 00205 UINT linktype; 00206 }; 00207 00212 struct sf_pkthdr { 00213 struct timeval ts; 00214 UINT caplen; 00215 00216 00217 UINT len; 00218 }; 00219 00229 typedef struct _INTERNAL_REQUEST { 00230 LIST_ENTRY ListElement; 00231 PIRP Irp; 00232 NDIS_REQUEST Request; 00233 } INTERNAL_REQUEST, *PINTERNAL_REQUEST; 00234 00242 typedef struct _PACKET_RESERVED { 00243 LIST_ENTRY ListElement; 00244 PIRP Irp; 00245 PMDL pMdl; 00246 BOOLEAN FreeBufAfterWrite; 00247 00248 } PACKET_RESERVED, *PPACKET_RESERVED; 00249 00250 #define RESERVED(_p) ((PPACKET_RESERVED)((_p)->ProtocolReserved)) 00251 00252 00257 typedef struct _DEVICE_EXTENSION { 00258 PDEVICE_OBJECT DeviceObject; 00259 NDIS_HANDLE NdisProtocolHandle; 00260 NDIS_STRING AdapterName; 00261 PWSTR BindString; 00262 PWSTR ExportString; 00263 00264 } DEVICE_EXTENSION, *PDEVICE_EXTENSION; 00265 00273 typedef struct _OPEN_INSTANCE 00274 { 00275 PDEVICE_EXTENSION DeviceExtension; 00276 00277 NDIS_HANDLE AdapterHandle; 00278 UINT Medium; 00279 00280 NDIS_HANDLE PacketPool; 00281 PIRP OpenCloseIrp; 00282 00283 KSPIN_LOCK RequestSpinLock; 00284 LIST_ENTRY RequestList; 00285 LIST_ENTRY ResetIrpList; 00286 INTERNAL_REQUEST Requests[MAX_REQUESTS]; 00287 PMDL BufferMdl; 00288 PKEVENT ReadEvent; 00289 HANDLE ReadEventHandle; 00290 UNICODE_STRING ReadEventName; 00291 00292 00293 00294 INT Received; 00295 00296 00297 INT Dropped; 00298 00299 00300 INT Accepted; 00301 00302 00303 PUCHAR bpfprogram; 00304 00305 00306 00307 00308 JIT_BPF_Filter *Filter; 00309 00310 PUCHAR Buffer; 00311 00312 UINT Bhead; 00313 UINT Btail; 00314 UINT BufSize; 00315 UINT BLastByte; 00316 PMDL TransferMdl; 00317 00318 NDIS_SPIN_LOCK BufLock; 00319 UINT MinToCopy; 00320 00321 LARGE_INTEGER TimeOut; 00322 00323 00324 int mode; 00325 LARGE_INTEGER Nbytes; 00326 LARGE_INTEGER Npackets; 00327 NDIS_SPIN_LOCK CountersLock; 00328 UINT Nwrites; 00329 00330 UINT Multiple_Write_Counter; 00331 NDIS_EVENT WriteEvent; 00332 NDIS_EVENT IOEvent; 00333 NDIS_STATUS IOStatus; 00334 BOOLEAN Bound; 00335 00336 HANDLE DumpFileHandle; 00337 PFILE_OBJECT DumpFileObject; 00338 PKTHREAD DumpThreadObject; 00339 HANDLE DumpThreadHandle; 00340 NDIS_EVENT DumpEvent; 00341 LARGE_INTEGER DumpOffset; 00342 UNICODE_STRING DumpFileName; 00343 UINT MaxDumpBytes; 00344 00345 UINT MaxDumpPacks; 00346 00347 00348 BOOLEAN DumpLimitReached; 00349 00350 MEM_TYPE mem_ex; 00351 TME_CORE tme; 00352 NDIS_SPIN_LOCK machine_lock; 00353 00354 } 00355 OPEN_INSTANCE, *POPEN_INSTANCE; 00356 00357 00358 #define TRANSMIT_PACKETS 256 00359 00360 00361 00363 #define EXIT_SUCCESS(quantity) Irp->IoStatus.Information=quantity;\ 00364 Irp->IoStatus.Status = STATUS_SUCCESS;\ 00365 IoCompleteRequest(Irp, IO_NO_INCREMENT);\ 00366 return STATUS_SUCCESS;\ 00367 00368 00369 #define EXIT_FAILURE(quantity) Irp->IoStatus.Information=quantity;\ 00370 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;\ 00371 IoCompleteRequest(Irp, IO_NO_INCREMENT);\ 00372 return STATUS_UNSUCCESSFUL;\ 00373 00374 00379 /***************************/ 00380 /* Prototypes */ 00381 /***************************/ 00382 00399 NTSTATUS 00400 DriverEntry( 00401 IN PDRIVER_OBJECT DriverObject, 00402 IN PUNICODE_STRING RegistryPath 00403 ); 00404 00414 PWCHAR getAdaptersList(VOID); 00415 00422 PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID); 00423 00435 BOOLEAN createDevice( 00436 IN OUT PDRIVER_OBJECT adriverObjectP, 00437 IN PUNICODE_STRING amacNameP, 00438 NDIS_HANDLE aProtoHandle); 00439 00451 NTSTATUS 00452 NPF_Open( 00453 IN PDEVICE_OBJECT DeviceObject, 00454 IN PIRP Irp 00455 ); 00456 00466 VOID 00467 NPF_OpenAdapterComplete( 00468 IN NDIS_HANDLE ProtocolBindingContext, 00469 IN NDIS_STATUS Status, 00470 IN NDIS_STATUS OpenErrorStatus 00471 ); 00472 00483 NTSTATUS 00484 NPF_Close( 00485 IN PDEVICE_OBJECT DeviceObject, 00486 IN PIRP Irp 00487 ); 00488 00497 VOID 00498 NPF_CloseAdapterComplete( 00499 IN NDIS_HANDLE ProtocolBindingContext, 00500 IN NDIS_STATUS Status 00501 ); 00502 00525 NDIS_STATUS 00526 NPF_tap( 00527 IN NDIS_HANDLE ProtocolBindingContext, 00528 IN NDIS_HANDLE MacReceiveContext, 00529 IN PVOID HeaderBuffer, 00530 IN UINT HeaderBufferSize, 00531 IN PVOID LookAheadBuffer, 00532 IN UINT LookaheadBufferSize, 00533 IN UINT PacketSize 00534 ); 00535 00546 VOID 00547 NPF_TransferDataComplete( 00548 IN NDIS_HANDLE ProtocolBindingContext, 00549 IN PNDIS_PACKET Packet, 00550 IN NDIS_STATUS Status, 00551 IN UINT BytesTransferred 00552 ); 00553 00560 VOID 00561 NPF_ReceiveComplete(IN NDIS_HANDLE ProtocolBindingContext); 00562 00586 NTSTATUS 00587 NPF_IoControl( 00588 IN PDEVICE_OBJECT DeviceObject, 00589 IN PIRP Irp 00590 ); 00591 00592 VOID 00593 00603 NPF_RequestComplete( 00604 IN NDIS_HANDLE ProtocolBindingContext, 00605 IN PNDIS_REQUEST pRequest, 00606 IN NDIS_STATUS Status 00607 ); 00608 00621 NTSTATUS 00622 NPF_Write( 00623 IN PDEVICE_OBJECT DeviceObject, 00624 IN PIRP Irp 00625 ); 00626 00627 00646 INT NPF_BufferedWrite(IN PIRP Irp, 00647 IN PCHAR UserBuff, 00648 IN ULONG UserBuffSize, 00649 BOOLEAN sync); 00650 00660 VOID 00661 NPF_SendComplete( 00662 IN NDIS_HANDLE ProtocolBindingContext, 00663 IN PNDIS_PACKET pPacket, 00664 IN NDIS_STATUS Status 00665 ); 00666 00676 VOID 00677 NPF_ResetComplete( 00678 IN NDIS_HANDLE ProtocolBindingContext, 00679 IN NDIS_STATUS Status 00680 ); 00681 00685 VOID 00686 NPF_Status( 00687 IN NDIS_HANDLE ProtocolBindingContext, 00688 IN NDIS_STATUS Status, 00689 IN PVOID StatusBuffer, 00690 IN UINT StatusBufferSize 00691 ); 00692 00693 00697 VOID 00698 NPF_StatusComplete(IN NDIS_HANDLE ProtocolBindingContext); 00699 00708 VOID 00709 NPF_Unload(IN PDRIVER_OBJECT DriverObject); 00710 00711 00730 NTSTATUS 00731 NPF_Read( 00732 IN PDEVICE_OBJECT DeviceObject, 00733 IN PIRP Irp 00734 ); 00735 00741 NTSTATUS 00742 NPF_ReadRegistry( 00743 IN PWSTR *MacDriverName, 00744 IN PWSTR *PacketDriverName, 00745 IN PUNICODE_STRING RegistryPath 00746 ); 00747 00754 NTSTATUS 00755 NPF_QueryRegistryRoutine( 00756 IN PWSTR ValueName, 00757 IN ULONG ValueType, 00758 IN PVOID ValueData, 00759 IN ULONG ValueLength, 00760 IN PVOID Context, 00761 IN PVOID EntryContext 00762 ); 00763 00769 VOID NPF_BindAdapter( 00770 OUT PNDIS_STATUS Status, 00771 IN NDIS_HANDLE BindContext, 00772 IN PNDIS_STRING DeviceName, 00773 IN PVOID SystemSpecific1, 00774 IN PVOID SystemSpecific2 00775 ); 00776 00788 VOID 00789 NPF_UnbindAdapter( 00790 OUT PNDIS_STATUS Status, 00791 IN NDIS_HANDLE ProtocolBindingContext, 00792 IN NDIS_HANDLE UnbindContext 00793 ); 00794 00807 int bpf_validate(struct bpf_insn *f,int len, uint32 mem_ex_size); 00808 00825 UINT bpf_filter(register struct bpf_insn *pc, 00826 register UCHAR *p, 00827 UINT wirelen, 00828 register UINT buflen, 00829 PMEM_TYPE mem_ex, 00830 PTME_CORE tme, 00831 struct time_conv *time_ref); 00832 00850 UINT bpf_filter_with_2_buffers(register struct bpf_insn *pc, 00851 register UCHAR *p, 00852 register UCHAR *pd, 00853 register int headersize, 00854 UINT wirelen, 00855 register UINT buflen, 00856 PMEM_TYPE mem_ex, 00857 PTME_CORE tme, 00858 struct time_conv *time_ref); 00859 00867 NTSTATUS NPF_OpenDumpFile(POPEN_INSTANCE Open , PUNICODE_STRING fileName, BOOLEAN append); 00868 00877 NTSTATUS NPF_StartDump(POPEN_INSTANCE Open); 00878 00886 VOID NPF_DumpThread(PVOID Open); 00887 00894 NTSTATUS NPF_SaveCurrentBuffer(POPEN_INSTANCE Open); 00895 00908 VOID NPF_WriteDumpFile(PFILE_OBJECT FileObject, 00909 PLARGE_INTEGER Offset, 00910 ULONG Length, 00911 PMDL Mdl, 00912 PIO_STATUS_BLOCK IoStatusBlock); 00913 00914 00915 00921 NTSTATUS NPF_CloseDumpFile(POPEN_INSTANCE Open); 00922 00927 UINT GetBuffOccupation(POPEN_INSTANCE Open); 00928 00940 #ifdef NDIS50 00941 NDIS_STATUS NPF_PowerChange(IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent); 00942 #endif 00943 00952 #endif /*main ifndef/define*/
documentation. Copyright (c) 2002 Politecnico di Torino. All rights reserved.