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 00044 #ifndef __PACKET32 00045 #define __PACKET32 00046 00047 #include <winsock2.h> 00048 #include "devioctl.h" 00049 #ifdef HAVE_DAG_API 00050 #include <dagc.h> 00051 #endif /* HAVE_DAG_API */ 00052 00053 // Working modes 00054 #define PACKET_MODE_CAPT 0x0 00055 #define PACKET_MODE_STAT 0x1 00056 #define PACKET_MODE_MON 0x2 00057 #define PACKET_MODE_DUMP 0x10 00058 #define PACKET_MODE_STAT_DUMP MODE_DUMP | MODE_STAT 00059 00060 // ioctls 00061 #define FILE_DEVICE_PROTOCOL 0x8000 00062 00063 #define IOCTL_PROTOCOL_STATISTICS CTL_CODE(FILE_DEVICE_PROTOCOL, 2 , METHOD_BUFFERED, FILE_ANY_ACCESS) 00064 #define IOCTL_PROTOCOL_RESET CTL_CODE(FILE_DEVICE_PROTOCOL, 3 , METHOD_BUFFERED, FILE_ANY_ACCESS) 00065 #define IOCTL_PROTOCOL_READ CTL_CODE(FILE_DEVICE_PROTOCOL, 4 , METHOD_BUFFERED, FILE_ANY_ACCESS) 00066 #define IOCTL_PROTOCOL_WRITE CTL_CODE(FILE_DEVICE_PROTOCOL, 5 , METHOD_BUFFERED, FILE_ANY_ACCESS) 00067 #define IOCTL_PROTOCOL_MACNAME CTL_CODE(FILE_DEVICE_PROTOCOL, 6 , METHOD_BUFFERED, FILE_ANY_ACCESS) 00068 #define IOCTL_OPEN CTL_CODE(FILE_DEVICE_PROTOCOL, 7 , METHOD_BUFFERED, FILE_ANY_ACCESS) 00069 #define IOCTL_CLOSE CTL_CODE(FILE_DEVICE_PROTOCOL, 8 , METHOD_BUFFERED, FILE_ANY_ACCESS) 00070 00071 #define pBIOCSETBUFFERSIZE 9592 00072 #define pBIOCSETF 9030 00073 #define pBIOCGSTATS 9031 00074 #define pBIOCSRTIMEOUT 7416 00075 #define pBIOCSMODE 7412 00076 #define pBIOCSWRITEREP 7413 00077 #define pBIOCSMINTOCOPY 7414 00078 #define pBIOCSETOID 2147483648 00079 #define pBIOCQUERYOID 2147483652 00080 #define pATTACHPROCESS 7117 00081 #define pDETACHPROCESS 7118 00082 #define pBIOCSETDUMPFILENAME 9029 00083 #define pBIOCEVNAME 7415 00084 #define pBIOCSENDPACKETSNOSYNC 9032 00085 #define pBIOCSENDPACKETSSYNC 9033 00086 #define pBIOCSETDUMPLIMITS 9034 00087 #define pBIOCISDUMPENDED 7411 00088 00089 #define pBIOCSTIMEZONE 7471 00090 00091 00093 #define Packet_ALIGNMENT sizeof(int) 00094 00095 #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1)) 00096 00097 00098 #define NdisMediumNull -1 // Custom linktype: NDIS doesn't provide an equivalent 00099 #define NdisMediumCHDLC -2 // Custom linktype: NDIS doesn't provide an equivalent 00100 #define NdisMediumPPPSerial -3 // Custom linktype: NDIS doesn't provide an equivalent 00101 00107 typedef struct NetType 00108 { 00109 UINT LinkType; 00110 ULONGLONG LinkSpeed; 00111 }NetType; 00112 00113 00114 //some definitions stolen from libpcap 00115 00116 #ifndef BPF_MAJOR_VERSION 00117 00123 struct bpf_program { 00124 UINT bf_len; 00125 struct bpf_insn *bf_insns; 00126 }; 00127 00133 struct bpf_insn { 00134 USHORT code; 00135 UCHAR jt; 00136 UCHAR jf; 00137 int k; 00138 }; 00139 00145 struct bpf_stat { 00146 UINT bs_recv; 00147 00148 00149 UINT bs_drop; 00150 00151 00152 UINT ps_ifdrop; 00153 UINT bs_capt; 00154 00155 }; 00156 00162 struct bpf_hdr { 00163 struct timeval bh_tstamp; 00164 00165 UINT bh_caplen; 00166 00167 00168 UINT bh_datalen; 00169 USHORT bh_hdrlen; 00170 00171 00172 00173 }; 00174 00182 struct dump_bpf_hdr{ 00183 struct timeval ts; 00184 UINT caplen; 00185 00186 00187 UINT len; 00188 }; 00189 00190 00191 #endif 00192 00193 #define DOSNAMEPREFIX TEXT("Packet_") 00194 #define MAX_LINK_NAME_LENGTH 64 //< Maximum length of the devices symbolic links 00195 #define NMAX_PACKET 65535 00196 00203 typedef struct npf_if_addr { 00204 struct sockaddr_storage IPAddress; 00205 struct sockaddr_storage SubnetMask; 00206 struct sockaddr_storage Broadcast; 00207 }npf_if_addr; 00208 00209 00210 #define ADAPTER_NAME_LENGTH 256 + 12 00211 #define ADAPTER_DESC_LENGTH 128 00212 #define MAX_MAC_ADDR_LENGTH 8 00213 #define MAX_NETWORK_ADDRESSES 16 00214 00215 00216 typedef struct WAN_ADAPTER_INT WAN_ADAPTER; 00217 typedef WAN_ADAPTER *PWAN_ADAPTER; 00218 00219 #define INFO_FLAG_NDIS_ADAPTER 0 00220 #define INFO_FLAG_NDISWAN_ADAPTER 1 00221 #define INFO_FLAG_DAG_CARD 2 00222 #define INFO_FLAG_DAG_FILE 6 00223 00229 typedef struct _ADAPTER_INFO 00230 { 00231 struct _ADAPTER_INFO *Next; 00232 CHAR Name[ADAPTER_NAME_LENGTH + 1]; 00233 CHAR Description[ADAPTER_DESC_LENGTH + 1]; 00234 UINT MacAddressLen; 00235 UCHAR MacAddress[MAX_MAC_ADDR_LENGTH]; 00236 NetType LinkLayer; 00237 INT NNetworkAddresses; 00238 npf_if_addr *NetworkAddresses; 00239 UINT Flags; 00240 } 00241 ADAPTER_INFO, *PADAPTER_INFO; 00242 00249 typedef struct _ADAPTER { 00250 HANDLE hFile; 00251 CHAR SymbolicLink[MAX_LINK_NAME_LENGTH]; 00252 int NumWrites; 00253 00254 HANDLE ReadEvent; 00255 00256 00257 00258 00259 00260 00261 00262 UINT ReadTimeOut; 00263 00264 CHAR Name[ADAPTER_NAME_LENGTH]; 00265 PWAN_ADAPTER pWanAdapter; 00266 UINT Flags; 00267 #ifdef HAVE_DAG_API 00268 dagc_t *pDagCard; 00269 PCHAR DagBuffer; 00270 struct timeval DagReadTimeout; 00271 unsigned DagFcsLen; 00272 DWORD DagFastProcess; 00273 #endif // HAVE_DAG_API 00274 } ADAPTER, *LPADAPTER; 00275 00281 typedef struct _PACKET { 00282 HANDLE hEvent; 00283 OVERLAPPED OverLapped; 00284 PVOID Buffer; 00285 00286 UINT Length; 00287 DWORD ulBytesReceived; 00288 00289 BOOLEAN bIoComplete; 00290 } PACKET, *LPPACKET; 00291 00299 struct _PACKET_OID_DATA { 00300 ULONG Oid; 00301 00302 ULONG Length; 00303 UCHAR Data[1]; 00304 00305 }; 00306 typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA; 00307 00308 00309 #if _DBG 00310 #define ODS(_x) OutputDebugString(TEXT(_x)) 00311 #define ODSEx(_x, _y) 00312 #else 00313 #ifdef _DEBUG_TO_FILE 00314 00317 #define ODS(_x) { \ 00318 FILE *f; \ 00319 f = fopen("winpcap_debug.txt", "a"); \ 00320 fprintf(f, "%s", _x); \ 00321 fclose(f); \ 00322 } 00323 00327 #define ODSEx(_x, _y) { \ 00328 FILE *f; \ 00329 f = fopen("winpcap_debug.txt", "a"); \ 00330 fprintf(f, _x, _y); \ 00331 fclose(f); \ 00332 } 00333 00334 00335 00336 LONG PacketDumpRegistryKey(PCHAR KeyName, PCHAR FileName); 00337 #else 00338 #define ODS(_x) 00339 #define ODSEx(_x, _y) 00340 #endif 00341 #endif 00342 00343 /* We load dinamically the dag library in order link it only when it's present on the system */ 00344 #ifdef HAVE_DAG_API 00345 typedef dagc_t* (*dagc_open_handler)(const char *source, unsigned flags, char *ebuf); 00346 typedef void (*dagc_close_handler)(dagc_t *dagcfd); 00347 typedef int (*dagc_getlinktype_handler)(dagc_t *dagcfd); 00348 typedef int (*dagc_getlinkspeed_handler)(dagc_t *dagcfd); 00349 typedef int (*dagc_setsnaplen_handler)(dagc_t *dagcfd, unsigned snaplen); 00350 typedef unsigned (*dagc_getfcslen_handler)(dagc_t *dagcfd); 00351 typedef int (*dagc_receive_handler)(dagc_t *dagcfd, u_char **buffer, u_int *bufsize); 00352 typedef int (*dagc_stats_handler)(dagc_t *dagcfd, dagc_stats_t *ps); 00353 typedef int (*dagc_wait_handler)(dagc_t *dagcfd, struct timeval *timeout); 00354 typedef int (*dagc_finddevs_handler)(dagc_if_t **alldevsp, char *ebuf); 00355 typedef int (*dagc_freedevs_handler)(dagc_if_t *alldevsp); 00356 #endif // HAVE_DAG_API 00357 00358 #ifdef __cplusplus 00359 extern "C" { 00360 #endif 00361 00366 void PacketPopulateAdaptersInfoList(); 00367 PWCHAR SChar2WChar(PCHAR string); 00368 PCHAR WChar2SChar(PWCHAR string); 00369 BOOL PacketGetFileVersion(LPTSTR FileName, PCHAR VersionBuff, UINT VersionBuffLen); 00370 PADAPTER_INFO PacketFindAdInfo(PCHAR AdapterName); 00371 BOOLEAN PacketUpdateAdInfo(PCHAR AdapterName); 00372 00373 00374 //--------------------------------------------------------------------------- 00375 // EXPORTED FUNCTIONS 00376 //--------------------------------------------------------------------------- 00377 00378 PCHAR PacketGetVersion(); 00379 PCHAR PacketGetDriverVersion(); 00380 BOOLEAN PacketSetMinToCopy(LPADAPTER AdapterObject,int nbytes); 00381 BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites); 00382 BOOLEAN PacketSetMode(LPADAPTER AdapterObject,int mode); 00383 BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout); 00384 BOOLEAN PacketSetBpf(LPADAPTER AdapterObject,struct bpf_program *fp); 00385 INT PacketSetSnapLen(LPADAPTER AdapterObject,int snaplen); 00386 BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s); 00387 BOOLEAN PacketGetStatsEx(LPADAPTER AdapterObject,struct bpf_stat *s); 00388 BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim); 00389 BOOLEAN PacketGetNetType (LPADAPTER AdapterObject,NetType *type); 00390 LPADAPTER PacketOpenAdapter(PCHAR AdapterName); 00391 BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET pPacket,BOOLEAN Sync); 00392 INT PacketSendPackets(LPADAPTER AdapterObject,PVOID PacketBuff,ULONG Size, BOOLEAN Sync); 00393 LPPACKET PacketAllocatePacket(void); 00394 VOID PacketInitPacket(LPPACKET lpPacket,PVOID Buffer,UINT Length); 00395 VOID PacketFreePacket(LPPACKET lpPacket); 00396 BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync); 00397 BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter); 00398 BOOLEAN PacketGetAdapterNames(PTSTR pStr,PULONG BufferSize); 00399 BOOLEAN PacketGetNetInfoEx(PCHAR AdapterName, npf_if_addr* buffer, PLONG NEntries); 00400 BOOLEAN PacketRequest(LPADAPTER AdapterObject,BOOLEAN Set,PPACKET_OID_DATA OidData); 00401 HANDLE PacketGetReadEvent(LPADAPTER AdapterObject); 00402 BOOLEAN PacketSetDumpName(LPADAPTER AdapterObject, void *name, int len); 00403 BOOLEAN PacketSetDumpLimits(LPADAPTER AdapterObject, UINT maxfilesize, UINT maxnpacks); 00404 BOOLEAN PacketIsDumpEnded(LPADAPTER AdapterObject, BOOLEAN sync); 00405 BOOL PacketStopDriver(); 00406 VOID PacketCloseAdapter(LPADAPTER lpAdapter); 00407 00408 #ifdef __cplusplus 00409 } 00410 #endif 00411 00412 #endif //__PACKET32
documentation. Copyright (c) 2002-2003 Politecnico di Torino. All rights reserved.