#include <time.h>\r
#include <windowsx.h>\r
#include <commctrl.h>\r
+// UPnP対応\r
+#include <natupnp.h>\r
\r
#include "common.h"\r
#include "resource.h"\r
struct sockaddr_in SocksAddrIPv4;\r
struct sockaddr_in6 HostAddrIPv6;\r
struct sockaddr_in6 SocksAddrIPv6;\r
+ int MapPort;\r
} ASYNCSIGNAL;\r
\r
\r
// スレッド衝突のバグ修正\r
static HANDLE hAsyncTblAccMutex;\r
\r
+// UPnP対応\r
+IUPnPNAT* pUPnPNAT;\r
+IStaticPortMappingCollection* pUPnPMap;\r
\r
\r
\r
memset(&Signal[Pos].SocksAddrIPv4, 0, sizeof(struct sockaddr_in));\r
memset(&Signal[Pos].HostAddrIPv6, 0, sizeof(struct sockaddr_in6));\r
memset(&Signal[Pos].SocksAddrIPv6, 0, sizeof(struct sockaddr_in6));\r
+ Signal[Pos].MapPort = 0;\r
Sts = YES;\r
break;\r
}\r
return(Sts);\r
}\r
\r
+int SetAsyncTableDataMapPort(SOCKET s, int Port)\r
+{\r
+ int Sts;\r
+ int Pos;\r
+\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+ Sts = NO;\r
+ for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+ {\r
+ if(Signal[Pos].Socket == s)\r
+ {\r
+ Signal[Pos].MapPort = Port;\r
+ Sts = YES;\r
+ break;\r
+ }\r
+ }\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+ return(Sts);\r
+}\r
+\r
int GetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks)\r
{\r
int Sts;\r
return(Sts);\r
}\r
\r
+int GetAsyncTableDataMapPort(SOCKET s, int* Port)\r
+{\r
+ int Sts;\r
+ int Pos;\r
+\r
+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+ Sts = NO;\r
+ for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+ {\r
+ if(Signal[Pos].Socket == s)\r
+ {\r
+ *Port = Signal[Pos].MapPort;\r
+ Sts = YES;\r
+ break;\r
+ }\r
+ }\r
+ ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+ return(Sts);\r
+}\r
+\r
\r
\r
\r
}\r
}\r
\r
+// UPnP対応\r
+int LoadUPnP()\r
+{\r
+ int Sts;\r
+ Sts = FFFTP_FAIL;\r
+ if(CoCreateInstance(&CLSID_UPnPNAT, NULL, CLSCTX_ALL, &IID_IUPnPNAT, (void**)&pUPnPNAT) == S_OK)\r
+ {\r
+ if(pUPnPNAT->lpVtbl->get_StaticPortMappingCollection(pUPnPNAT, &pUPnPMap) == S_OK)\r
+ Sts = FFFTP_SUCCESS;\r
+ }\r
+ return Sts;\r
+}\r
+\r
+void FreeUPnP()\r
+{\r
+ if(pUPnPMap != NULL)\r
+ pUPnPMap->lpVtbl->Release(pUPnPMap);\r
+ pUPnPMap = NULL;\r
+ if(pUPnPNAT != NULL)\r
+ pUPnPNAT->lpVtbl->Release(pUPnPNAT);\r
+ pUPnPNAT = NULL;\r
+}\r
+\r
+int IsUPnPLoaded()\r
+{\r
+ int Sts;\r
+ Sts = NO;\r
+ if(pUPnPNAT != NULL && pUPnPMap != NULL)\r
+ Sts = YES;\r
+ return Sts;\r
+}\r
+\r
+int AddPortMapping(char* Adrs, int Port)\r
+{\r
+ int Sts;\r
+ WCHAR Tmp1[40];\r
+ BSTR Tmp2;\r
+ BSTR Tmp3;\r
+ BSTR Tmp4;\r
+ IStaticPortMapping* pPortMap;\r
+ Sts = FFFTP_FAIL;\r
+ MtoW(Tmp1, 40, Adrs, -1);\r
+ if((Tmp2 = SysAllocString(Tmp1)) != NULL)\r
+ {\r
+ if((Tmp3 = SysAllocString(L"TCP")) != NULL)\r
+ {\r
+ if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)\r
+ {\r
+ if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)\r
+ {\r
+ Sts = FFFTP_SUCCESS;\r
+ pPortMap->lpVtbl->Release(pPortMap);\r
+ }\r
+ SysFreeString(Tmp4);\r
+ }\r
+ SysFreeString(Tmp3);\r
+ }\r
+ SysFreeString(Tmp2);\r
+ }\r
+ return Sts;\r
+}\r
+\r
+int RemovePortMapping(int Port)\r
+{\r
+ int Sts;\r
+ BSTR Tmp;\r
+ Sts = FFFTP_FAIL;\r
+ if((Tmp = SysAllocString(L"TCP")) != NULL)\r
+ {\r
+ if(pUPnPMap->lpVtbl->Remove(pUPnPMap, Port, Tmp) == S_OK)\r
+ Sts = FFFTP_SUCCESS;\r
+ SysFreeString(Tmp);\r
+ }\r
+ return Sts;\r
+}\r
+\r
\r
/*----- \r
*\r