00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00012
00013 #define WIN32_LEAN_AND_MEAN
00014
00015 #ifndef _WIN32_WINNT
00016 #define _WIN32_WINNT 0x0400
00017 #endif
00018
00019 #include <atlbase.h>
00020 #include <stdio.h>
00021 #include <time.h>
00022
00023 #import "PacketX.dll" no_namespace, named_guids
00024
00025 static HRESULT __Packet_Handler__(IPktXPacket* pPacket,DWORD dwParam);
00026
00027 static void ShowNetworkAdapter(IPktXAdapterPtr& pAdapter);
00028 static void PrintHead(IPktXPacket* pPacket);
00029 static void PrintData(IPktXPacket* pPacket);
00030 static void PrintStats(IPktXAdapterPtr& pAdapter);
00031
00032
00033 int main(int argc, char* argv[])
00034 {
00035
00036 #define MT_APARTMENT // Uncomment this line if you want to run it in multithreaded apartment
00037 #ifdef MT_APARTMENT
00038 CoInitializeEx(NULL,COINIT_MULTITHREADED);
00039 #else
00040 CoInitialize(NULL);
00041 #endif
00042
00043
00044 IPktXPacketXPtr pPktX(__uuidof(PacketX));
00045
00046
00047 LONG lCount= IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetCount();
00048 for (int i=0; i < lCount; i++)
00049 {
00050
00051 IPktXAdapterPtr pAdapter = IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetItem(i+1);
00052 if (pAdapter->GetIsGood())
00053 {
00054 _bstr_t bstrtDesciption = pAdapter->GetDescription();
00055 printf("(%d) %s\n",i+1,(char*)bstrtDesciption);
00056
00057 }
00058 }
00059
00060 pPktX->PutAdapter(NULL);
00061 while (pPktX->GetAdapter() == NULL)
00062 {
00063 char buffer[256];
00064 printf("Choose adapter#");
00065 try { pPktX->PutAdapter(IPktXAdapterCollectionPtr(
00066 pPktX->GetAdapters())->GetItem(atoi(gets(buffer)))); }
00067 catch ( _com_error& ) {}
00068 }
00069
00070 IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffSize(256*1024);
00071 IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffMinToCopy(0);
00072
00073
00074 IPktXAdapterPtr(pPktX->GetAdapter())->PutHWFilter(PktXPacketTypePromiscuous);
00075 IPktXAdapterPtr(pPktX->GetAdapter())->PutMode(PktXModeCapture);
00076
00077
00078 IPktXPacketSinkPtr pSink(__uuidof(PacketSink));
00079 pSink->CallBackOnPacket((DWORD)__Packet_Handler__,(DWORD)0);
00080
00081
00082 pSink->Advise(pPktX);
00083
00084
00085 pPktX->Start();
00086
00087 #ifdef MT_APARTMENT
00088 Sleep(60000);
00089 #else
00090
00091 MSG msg;
00092 while (GetMessage(&msg, 0, 0, 0))
00093 DispatchMessage(&msg);
00094 #endif
00095
00096 pPktX->Stop();
00097
00098
00099 pSink->Unadvise(pPktX);
00100
00101
00102 PrintStats(IPktXAdapterPtr(pPktX->GetAdapter()));
00103
00104
00105 pSink = NULL;
00106 pPktX = NULL;
00107
00108 CoUninitialize();
00109 return 0;
00110 }
00111
00112
00113 static HRESULT __Packet_Handler__(IPktXPacket* pPacket,DWORD dwParam)
00114 {
00115 PrintHead(pPacket);
00116 PrintData(pPacket);
00117 return 0;
00118 }
00119
00120 static void PrintHead(IPktXPacket* pPacket)
00121 {
00122 printf("\n----------------------- Packet Header ---------------------");
00123 printf("\nOriginal size %d bytes",
00124 IPktXPacketPtr(pPacket)->GetOriginalSize());
00125 printf("\nCapture size %d bytes",
00126 IPktXPacketPtr(pPacket)->GetDataSize());
00127 time_t ltime = IPktXPacketPtr(pPacket)->GetTimeSec();
00128 printf("\nCapture time %s",ctime(<ime));
00129 printf("Capture microsecs %d",
00130 IPktXPacketPtr(pPacket)->GetTimeUSec());
00131 }
00132
00133 static void PrintData(IPktXPacket* pPacket)
00134 {
00135 printf("\n----------------------- Packet Data -----------------------");
00136 CComVariant varArray = IPktXPacketPtr(pPacket)->GetData();
00137 LPVARIANT lpVariant=NULL;
00138 SafeArrayAccessData(varArray.parray,(LPVOID*)&lpVariant);
00139 ULONG ulElements = varArray.parray->rgsabound[0].cElements;
00140 int iPosition = 0;
00141 for (unsigned int i=0; i < ulElements; i++)
00142 {
00143 if (iPosition >= 20 || i==0) {
00144 printf("\n");
00145 iPosition = 1;
00146 }
00147 else
00148 iPosition++;
00149 printf("%0.2X ",V_UI1(&lpVariant[i]));
00150 }
00151 SafeArrayUnaccessData(varArray.parray);
00152 }
00153
00154 static void PrintStats(IPktXAdapterPtr& pAdapter)
00155 {
00156 printf("\n------------------- Capture Statistics --------------------");
00157 printf("\nPackets received %d", pAdapter->GetPacketsRecv());
00158 printf("\nPackets lost %d", pAdapter->GetPacketsLost());
00159 }
00160
00161 static void ShowNetworkAdapter(IPktXAdapterPtr& pAdapter)
00162 {
00163 _bstr_t bstrtDevice = pAdapter->GetDevice();
00164 _bstr_t bstrtDescription = pAdapter->GetDescription();
00165 _bstr_t bstrtNetIP = pAdapter->GetNetIP();
00166 _bstr_t bstrtNetMask = pAdapter->GetNetMask();
00167
00168 printf("%s\n",(char*) bstrtDescription);
00169 printf("Device: %s\n",(char*) bstrtDevice);
00170 printf("Net IP: %s\n",(char*) bstrtNetIP);
00171 printf("Net Mask: %s\n",(char*) bstrtNetMask);
00172 printf("Link type is ");
00173
00174 switch(pAdapter->GetLinkType())
00175 {
00176 case(PktXLinkType802_3): printf("Ethernet (802.3)\n"); break;
00177 case(PktXLinkType802_5): printf("Token Ring (802.5)\n"); break;
00178 case(PktXLinkTypeFddi): printf("FDDI\n"); break;
00179 case(PktXLinkTypeWan): printf("WAN\n"); break;
00180 case(PktXLinkTypeLocalTalk): printf("LocalTalk\n"); break;
00181 case(PktXLinkTypeDix): printf("DIX\n"); break;
00182 case(PktXLinkTypeArcnetRaw): printf("ARCNET (raw)\n"); break;
00183 case(PktXLinkTypeArcnet878_2):printf("ARCNET (878.2)\n"); break;
00184 case(PktXLinkTypeAtm): printf("ATM\n"); break;
00185 case(PktXLinkTypeWirelessWan):printf("NdisWirelessXxx media\n");break;
00186 default: printf("Unknown!\n"); break;
00187 }
00188 printf("Link speed is %d bps\n",pAdapter->GetLinkSpeed());
00189 }