/*  1*/ #include "WinPacketFiltering_PacketFiltering.h"
/*  2*/ #include <stdio.h>
/*  3*/ #include <stdlib.h>
/*  4*/ #include <windows.h>
/*  5*/ #include <fltdefs.h>
/*  6*/ 
/*  7*/ #pragma comment(lib, "iphlpapi.lib")
/*  8*/ 
/*  9*/ #define DEBUG 0
/* 10*/ 
/* 11*/ void getError(DWORD, LPVOID);
/* 12*/ void JBYTEtoPBYTE(jbyte*, PBYTE, int);
/* 13*/ void showFilter(PF_FILTER_DESCRIPTOR);
/* 14*/ void ByteArrayForkCopy(PBYTE, PBYTE, int);
/* 15*/ 
/* 16*/ static INTERFACE_HANDLE iHandle;
/* 17*/ const char* sNO_ERROR = "NO_ERROR";
/* 18*/ 
/* 19*/ // インタフェースハンドルの作成
/* 20*/ JNIEXPORT jstring JNICALL Java_WinPacketFiltering_PacketFiltering_PfCreateInterface
/* 21*/     (JNIEnv *env, jclass cls,
/* 22*/         jint        dwName,
/* 23*/         jboolean    inAction_i,
/* 24*/         jboolean    outAction_i,
/* 25*/         jboolean    bUseLog,
/* 26*/         jboolean    bMustBeUnique)
/* 27*/ {
/* 28*/     PFFORWARD_ACTION inAction, outAction;
/* 29*/     DWORD result;
/* 30*/     LPVOID lpMsgBuf;
/* 31*/     
/* 32*/     if(inAction_i==JNI_TRUE)    inAction = PF_ACTION_DROP;
/* 33*/     else                        inAction = PF_ACTION_FORWARD;
/* 34*/     if(outAction_i==JNI_TRUE)   outAction = PF_ACTION_DROP;
/* 35*/     else                        outAction = PF_ACTION_FORWARD;
/* 36*/     
/* 37*/     if(DEBUG) printf("PfCreateInterface : %d, %d, %d, %d, %d, I=%d\n",          // デバッグ
/* 38*/                 dwName, inAction, outAction, bUseLog, bMustBeUnique, &iHandle); // デバッグ
/* 39*/     
/* 40*/     result = PfCreateInterface(dwName, inAction, outAction,
/* 41*/                             bUseLog, bMustBeUnique, &iHandle);
/* 42*/     
/* 43*/     if(DEBUG) printf("PfCreateInterface : result = %d\n",result);   // デバッグ
/* 44*/     
/* 45*/     if(result==NO_ERROR)
/* 46*/     {
/* 47*/         return env->NewStringUTF(sNO_ERROR);
/* 48*/     }
/* 49*/     else
/* 50*/     {
/* 51*/         getError(result, &lpMsgBuf);
/* 52*/         return env->NewStringUTF((const char* )lpMsgBuf);
/* 53*/     }
/* 54*/ } // PfCreateInterface END
/* 55*/ 
/* 56*/ // インバウンド用ハンドルにフィルタを追加
/* 57*/ JNIEXPORT jstring JNICALL Java_WinPacketFiltering_PacketFiltering_PfAddFiltersToInterfaceIN
/* 58*/     (JNIEnv *env, jclass cls,
/* 59*/         jint        AddrType,
/* 60*/         jbyteArray  SrcAddr,
/* 61*/         jbyteArray  SrcMask,
/* 62*/         jbyteArray  DstAddr,
/* 63*/         jbyteArray  DstMask,
/* 64*/         jint        SrcPort,
/* 65*/         jint        DstPort,
/* 66*/         jint        CeilingSrcPort,
/* 67*/         jint        CeilingDstPort,
/* 68*/         jint        Protocol)
/* 69*/ {
/* 70*/     PF_FILTER_DESCRIPTOR filter;
/* 71*/     DWORD result;
/* 72*/     LPVOID lpMsgBuf;
/* 73*/     PBYTE adrs;
/* 74*/     int array_size = 0;
/* 75*/     jbyte*  Sadrs;
/* 76*/     
/* 77*/     filter.dwFilterFlags    = 0;
/* 78*/     filter.dwRule           = 0;
/* 79*/     filter.fLateBound       = 0;
/* 80*/     
/* 81*/     if(AddrType==4)
/* 82*/     {
/* 83*/         array_size = 4;
/* 84*/         filter.pfatType  = PF_IPV4;
/* 85*/         adrs = (PBYTE)malloc(sizeof(BYTE)*array_size);
/* 86*/     }
/* 87*/     else if(AddrType==6)
/* 88*/     {
/* 89*/         array_size = 16;
/* 90*/         filter.pfatType  = PF_IPV6;
/* 91*/         adrs = (PBYTE)malloc(sizeof(BYTE)*array_size);
/* 92*/     }   
/* 93*/     
/* 94*/     Sadrs = env->GetByteArrayElements(SrcAddr, 0);
/* 95*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/* 96*/     filter.SrcAddr = (PBYTE)malloc(sizeof(BYTE)*array_size);
/* 97*/     ByteArrayForkCopy(adrs, filter.SrcAddr, array_size);
/* 98*/     Sadrs = env->GetByteArrayElements(SrcMask, 0);
/* 99*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/*100*/     filter.SrcMask = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*101*/     ByteArrayForkCopy(adrs, filter.SrcMask, array_size);
/*102*/     Sadrs = env->GetByteArrayElements(DstAddr, 0);
/*103*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/*104*/     filter.DstAddr = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*105*/     ByteArrayForkCopy(adrs, filter.DstAddr, array_size);
/*106*/     Sadrs = env->GetByteArrayElements(DstMask, 0);
/*107*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/*108*/     filter.DstMask = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*109*/     ByteArrayForkCopy(adrs, filter.DstMask, array_size);
/*110*/     
/*111*/     filter.wSrcPort = SrcPort;
/*112*/     filter.wDstPort = DstPort;
/*113*/     if(CeilingSrcPort == -1) filter.wSrcPortHighRange = SrcPort;
/*114*/     else                     filter.wSrcPortHighRange = CeilingSrcPort;
/*115*/     if(CeilingDstPort == -1) filter.wDstPortHighRange = DstPort;
/*116*/     else                     filter.wDstPortHighRange = CeilingDstPort;
/*117*/     
/*118*/     switch(Protocol)
/*119*/     {
/*120*/         case 1: filter.dwProtocol = FILTER_PROTO_ANY; break;
/*121*/         case 2: filter.dwProtocol = FILTER_PROTO_ICMP;
/*122*/                 filter.wSrcPort = FILTER_ICMP_TYPE_ANY;
/*123*/                 filter.wDstPort = FILTER_ICMP_TYPE_ANY;
/*124*/                 filter.wSrcPortHighRange = FILTER_ICMP_TYPE_ANY;
/*125*/                 filter.wDstPortHighRange = FILTER_ICMP_TYPE_ANY; break;
/*126*/         case 3: filter.dwProtocol = FILTER_PROTO_TCP; break;
/*127*/         case 4: filter.dwProtocol = FILTER_PROTO_UDP; break;
/*128*/     }
/*129*/     
/*130*/     if(DEBUG)   // デバッグ
/*131*/     {
/*132*/         printf("PfAddFiltersToInterfaceIN : ");
/*133*/         showFilter(filter);
/*134*/         printf("i=%d\n", &iHandle);
/*135*/     }
/*136*/     
/*137*/     result = PfAddFiltersToInterface(iHandle, 1, &filter, 0, NULL, NULL);
/*138*/     free(adrs);
/*139*/     free(filter.SrcAddr);
/*140*/     free(filter.SrcMask);
/*141*/     free(filter.DstAddr);
/*142*/     free(filter.DstMask);
/*143*/     
/*144*/     if(DEBUG) printf("PfAddFiltersToInterfaceIN : result = %d\n",result);   // デバッグ
/*145*/     
/*146*/     if(result==NO_ERROR)
/*147*/     {
/*148*/         return env->NewStringUTF(sNO_ERROR);
/*149*/     }
/*150*/     else
/*151*/     {
/*152*/         getError(result, &lpMsgBuf);
/*153*/         return env->NewStringUTF((const char* )lpMsgBuf);
/*154*/     }
/*155*/ } // PfAddFiltersToInterfaceIN END
/*156*/ 
/*157*/ // アウトバウンド用ハンドルにフィルタを追加
/*158*/ JNIEXPORT jstring JNICALL Java_WinPacketFiltering_PacketFiltering_PfAddFiltersToInterfaceOUT
/*159*/     (JNIEnv *env, jclass cls,
/*160*/         jint        addrType,
/*161*/         jbyteArray  SrcAddr,
/*162*/         jbyteArray  SrcMask,
/*163*/         jbyteArray  DstAddr,
/*164*/         jbyteArray  DstMask,
/*165*/         jint        SrcPort,
/*166*/         jint        DstPort,
/*167*/         jint        CeilingSrcPort,
/*168*/         jint        CeilingDstPort,
/*169*/         jint        Protocol)
/*170*/ {
/*171*/     PF_FILTER_DESCRIPTOR filter;
/*172*/     DWORD result;
/*173*/     LPVOID lpMsgBuf;
/*174*/     PBYTE adrs;
/*175*/     int array_size = 0;
/*176*/     jbyte*  Sadrs;
/*177*/     
/*178*/     filter.dwFilterFlags    = 0;
/*179*/     filter.dwRule           = 0;
/*180*/     filter.fLateBound       = 0;
/*181*/     
/*182*/     if(addrType==4)
/*183*/     {
/*184*/         array_size = 4;
/*185*/         filter.pfatType  = PF_IPV4;
/*186*/         adrs = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*187*/     }
/*188*/     else if(addrType==6)
/*189*/     {
/*190*/         array_size = 16;
/*191*/         filter.pfatType  = PF_IPV6;
/*192*/         adrs = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*193*/     }   
/*194*/     
/*195*/     Sadrs = env->GetByteArrayElements(SrcAddr, 0);
/*196*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/*197*/     filter.SrcAddr = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*198*/     ByteArrayForkCopy(adrs, filter.SrcAddr, array_size);
/*199*/     Sadrs = env->GetByteArrayElements(SrcMask, 0);
/*200*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/*201*/     filter.SrcMask = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*202*/     ByteArrayForkCopy(adrs, filter.SrcMask, array_size);
/*203*/     Sadrs = env->GetByteArrayElements(DstAddr, 0);
/*204*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/*205*/     filter.DstAddr = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*206*/     ByteArrayForkCopy(adrs, filter.DstAddr, array_size);
/*207*/     Sadrs = env->GetByteArrayElements(DstMask, 0);
/*208*/     JBYTEtoPBYTE(Sadrs, adrs, array_size);
/*209*/     filter.DstMask = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*210*/     ByteArrayForkCopy(adrs, filter.DstMask, array_size);
/*211*/     
/*212*/     filter.wSrcPort = SrcPort;
/*213*/     filter.wDstPort = DstPort;
/*214*/     if(CeilingSrcPort == -1) filter.wSrcPortHighRange = SrcPort;
/*215*/     else                     filter.wSrcPortHighRange = CeilingSrcPort;
/*216*/     if(CeilingDstPort == -1) filter.wDstPortHighRange = DstPort;
/*217*/     else                     filter.wDstPortHighRange = CeilingDstPort;
/*218*/         
/*219*/     switch(Protocol)
/*220*/     {
/*221*/         case 1: filter.dwProtocol = FILTER_PROTO_ANY; break;
/*222*/         case 2: filter.dwProtocol = FILTER_PROTO_ICMP;
/*223*/                 filter.wSrcPort = FILTER_ICMP_TYPE_ANY;
/*224*/                 filter.wDstPort = FILTER_ICMP_TYPE_ANY;
/*225*/                 filter.wSrcPortHighRange = FILTER_ICMP_TYPE_ANY;
/*226*/                 filter.wDstPortHighRange = FILTER_ICMP_TYPE_ANY; break;
/*227*/         case 3: filter.dwProtocol = FILTER_PROTO_TCP; break;
/*228*/         case 4: filter.dwProtocol = FILTER_PROTO_UDP; break;
/*229*/     }
/*230*/     
/*231*/     if(DEBUG)   // デバッグ
/*232*/     {
/*233*/         printf("PfAddFiltersToInterfaceOUT : ");
/*234*/         showFilter(filter);
/*235*/         printf("i=%d\n", &iHandle);
/*236*/     }
/*237*/     
/*238*/     result = PfAddFiltersToInterface(iHandle, 0, NULL, 1, &filter, NULL);
/*239*/     free(adrs);
/*240*/     free(filter.SrcAddr);
/*241*/     free(filter.SrcMask);
/*242*/     free(filter.DstAddr);
/*243*/     free(filter.DstMask);
/*244*/     
/*245*/     if(DEBUG) printf("PfAddFiltersToInterfaceOUT : result = %d\n",result);  // デバッグ
/*246*/     
/*247*/     if(result==NO_ERROR)
/*248*/     {
/*249*/         return env->NewStringUTF(sNO_ERROR);
/*250*/     }
/*251*/     else
/*252*/     {
/*253*/         getError(result, &lpMsgBuf);
/*254*/         return env->NewStringUTF((const char* )lpMsgBuf);
/*255*/     }
/*256*/ } // PfAddFiltersToInterfaceOUT END
/*257*/ 
/*258*/ // IPアドレスをインタフェースハンドルにバインド
/*259*/ JNIEXPORT jstring JNICALL Java_WinPacketFiltering_PacketFiltering_PfBindInterfaceToIPAddress
/*260*/     (JNIEnv *env, jclass cls,
/*261*/         jint        AddrType,
/*262*/         jbyteArray  IPAddress_i)
/*263*/ {
/*264*/     PBYTE IPAddress;
/*265*/     int array_size = 0;
/*266*/     jbyte*  SIPAddress;
/*267*/     DWORD result;
/*268*/     LPVOID lpMsgBuf;
/*269*/     PFADDRESSTYPE pfatType = NULL;
/*270*/     
/*271*/     if(AddrType==4)
/*272*/     {
/*273*/         array_size = 4;
/*274*/         pfatType = PF_IPV4;
/*275*/         IPAddress = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*276*/     }
/*277*/     else if(AddrType==6)
/*278*/     {
/*279*/         array_size = 16;
/*280*/         pfatType = PF_IPV6;
/*281*/         IPAddress = (PBYTE)malloc(sizeof(BYTE)*array_size);
/*282*/     }
/*283*/     
/*284*/     SIPAddress = env->GetByteArrayElements(IPAddress_i, 0);
/*285*/     JBYTEtoPBYTE(SIPAddress, IPAddress, array_size);
/*286*/     
/*287*/     if(DEBUG)   // デバッグ
/*288*/     {
/*289*/         printf("PfBindInterfaceToIPAddress : %d,  %d.%d.%d.%d  i=%d\n",
/*290*/         pfatType, IPAddress[0], IPAddress[1],
/*291*/         IPAddress[2], IPAddress[3], &iHandle);
/*292*/     }
/*293*/     
/*294*/     result = PfBindInterfaceToIPAddress(iHandle, pfatType, IPAddress);
/*295*/     free(IPAddress);
/*296*/     
/*297*/     if(DEBUG) printf("PfBindInterfaceToIPAddress : result = %d\n",result);  // デバッグ
/*298*/     
/*299*/     if(result==NO_ERROR)
/*300*/     {
/*301*/         return env->NewStringUTF(sNO_ERROR);
/*302*/     }
/*303*/     else
/*304*/     {
/*305*/         getError(result, &lpMsgBuf);
/*306*/         return env->NewStringUTF((const char* )lpMsgBuf);
/*307*/     }
/*308*/ } // PfBindInterfaceToIPAddress END
/*309*/ 
/*310*/ // インタフェースハンドルのアンバウンド
/*311*/ JNIEXPORT jstring JNICALL Java_WinPacketFiltering_PacketFiltering_PfUnBindInterface
/*312*/     (JNIEnv *env, jclass cls)
/*313*/ {
/*314*/     DWORD result;
/*315*/     LPVOID lpMsgBuf;
/*316*/     
/*317*/     result = PfUnBindInterface(iHandle);
/*318*/     
/*319*/     if(DEBUG) printf("PfUnBindInterface : result = %d\n",result);
/*320*/     
/*321*/     if(result==NO_ERROR)
/*322*/     {
/*323*/         return env->NewStringUTF(sNO_ERROR);
/*324*/     }
/*325*/     else
/*326*/     {
/*327*/         getError(result, &lpMsgBuf);
/*328*/         return env->NewStringUTF((const char* )lpMsgBuf);
/*329*/     }
/*330*/ } // PfUnBindInterface END
/*331*/ 
/*332*/ // インタフェースハンドルの削除
/*333*/ JNIEXPORT jstring JNICALL Java_WinPacketFiltering_PacketFiltering_PfDeleteInterface
/*334*/     (JNIEnv *env, jclass cls)
/*335*/ {
/*336*/     DWORD result;
/*337*/     LPVOID lpMsgBuf;
/*338*/     
/*339*/     result = PfDeleteInterface(iHandle);
/*340*/     
/*341*/     if(DEBUG) printf("PfDeleteInterface : result = %d\n",result);   // デバッグ
/*342*/     
/*343*/     if(result==NO_ERROR)
/*344*/     {
/*345*/         return env->NewStringUTF(sNO_ERROR);
/*346*/     }
/*347*/     else
/*348*/     {
/*349*/         getError(result, &lpMsgBuf);
/*350*/         return env->NewStringUTF((const char* )lpMsgBuf);
/*351*/     }
/*352*/ } // PfDeleteInterface END
/*353*/ 
/*354*/ // エラーメッセージの取得
/*355*/ void getError(DWORD messageID, LPVOID lpMsgBuf)
/*356*/ {
/*357*/     FormatMessage(
/*358*/         FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
/*359*/         NULL,
/*360*/         messageID,
/*361*/         MAKELANGID(LANG_ENGLISH , SUBLANG_ENGLISH_US),
/*362*/         (LPTSTR) lpMsgBuf,
/*363*/         0,
/*364*/         NULL
/*365*/     );
/*366*/ } // getError END
/*367*/ 
/*368*/ // JBYTE配列をPBYTE配列にコピー
/*369*/ void JBYTEtoPBYTE(jbyte* sB, PBYTE usB, int size)
/*370*/ {
/*371*/     int i;
/*372*/     
/*373*/     for(i=0;i<size;i++)
/*374*/     {
/*375*/         if(sB[i]<0)
/*376*/             usB[i] = sB[i] + 256;
/*377*/         else
/*378*/             usB[i] = sB[i];
/*379*/     }
/*380*/ } // JBYTEtoPBYTE END
/*381*/ 
/*382*/ // デバッグ用フィルタ表示
/*383*/ void showFilter(PF_FILTER_DESCRIPTOR filter)
/*384*/ {
/*385*/     int i;
/*386*/     printf("%d, %d, %d\n",filter.dwFilterFlags, filter.dwRule, filter.pfatType);
/*387*/     for(i=0;i<4;i++) printf("%d.", filter.SrcAddr[i]);
/*388*/     printf("    ");
/*389*/     for(i=0;i<4;i++) printf("%d.", filter.SrcMask[i]);
/*390*/     printf("\n");
/*391*/     for(i=0;i<4;i++) printf("%d.", filter.DstAddr[i]);
/*392*/     printf("    ");
/*393*/     for(i=0;i<4;i++) printf("%d.", filter.DstMask[i]);
/*394*/     printf("\n");
/*395*/     printf("%d, %d,    %d, %d, %d, %d\n",filter.dwProtocol, filter.fLateBound,
/*396*/         filter.wSrcPort, filter.wDstPort,
/*397*/         filter.wSrcPortHighRange, filter.wDstPortHighRange);
/*398*/ } // showFilter END
/*399*/ 
/*400*/ // PBYTE配列のコピー
/*401*/ void ByteArrayForkCopy(PBYTE from, PBYTE to, int size)
/*402*/ {
/*403*/     int i;
/*404*/     for(i=0;i<size;i++)
/*405*/         to[i] = from[i];
/*406*/ } // ByteArrayForkCopy END
inserted by FC2 system