/* 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