mirror of
https://github.com/netchx/netch.git
synced 2026-05-11 23:45:06 +08:00
Update Redirector
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Netch.Controllers.Other.DNS
|
||||
{
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Netch.Controllers.Server
|
||||
{
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Netch.Models.Server.Clash
|
||||
namespace Netch.Models.Server.Clash
|
||||
{
|
||||
public class Clash : Server
|
||||
{
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#include "API.h"
|
||||
@@ -1,5 +0,0 @@
|
||||
#pragma once
|
||||
#ifndef API_H
|
||||
#define API_H
|
||||
|
||||
#endif
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "DNS.h"
|
||||
|
||||
#include "API.h"
|
||||
#include "Data.h"
|
||||
#include "Utils.h"
|
||||
|
||||
@@ -8,12 +7,12 @@
|
||||
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
using namespace std;
|
||||
|
||||
extern string dnsHost;
|
||||
extern USHORT dnsPort;
|
||||
extern USHORT dnsLisn;
|
||||
|
||||
typedef struct _DNSPKT {
|
||||
ENDPOINT_ID ID;
|
||||
@@ -24,11 +23,11 @@ typedef struct _DNSPKT {
|
||||
PNF_UDP_OPTIONS Option;
|
||||
} DNSPKT, * PDNSPKT;
|
||||
|
||||
BOOL dnsInit = FALSE;
|
||||
HANDLE dnsLock = NULL;
|
||||
BOOL dnsInited = FALSE;
|
||||
HANDLE dnsLock = NULL;
|
||||
list<PDNSPKT> dnsList;
|
||||
|
||||
SOCKET CreateSocket()
|
||||
SOCKET dns_createSocket()
|
||||
{
|
||||
sockaddr_in addr;
|
||||
addr.sin_family = AF_INET;
|
||||
@@ -36,13 +35,13 @@ SOCKET CreateSocket()
|
||||
addr.sin_port = 0;
|
||||
|
||||
auto client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (INVALID_SOCKET == client)
|
||||
if (client == INVALID_SOCKET)
|
||||
{
|
||||
printf("[Redirector][DNS][CreateSocket] Unable to create socket: %d\n", WSAGetLastError());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (SOCKET_ERROR == bind(client, (PSOCKADDR)&addr, sizeof(sockaddr_in)))
|
||||
if (bind(client, (PSOCKADDR)&addr, sizeof(sockaddr_in)) == SOCKET_ERROR)
|
||||
{
|
||||
printf("[Redirector][DNS][CreateSocket] Unable to bind socket: %d\n", WSAGetLastError());
|
||||
return NULL;
|
||||
@@ -51,7 +50,7 @@ SOCKET CreateSocket()
|
||||
return client;
|
||||
}
|
||||
|
||||
void DnsFreePacket(PDNSPKT i)
|
||||
void dns_freePacket(PDNSPKT i)
|
||||
{
|
||||
if (i)
|
||||
{
|
||||
@@ -76,42 +75,16 @@ void DnsFreePacket(PDNSPKT i)
|
||||
i = NULL;
|
||||
}
|
||||
|
||||
void dns_init()
|
||||
{
|
||||
dnsInit = TRUE;
|
||||
|
||||
if (!dnsLock)
|
||||
{
|
||||
dnsLock = CreateMutex(NULL, FALSE, NULL);
|
||||
}
|
||||
|
||||
dnsDelete();
|
||||
}
|
||||
|
||||
void dns_free()
|
||||
{
|
||||
dnsInit = FALSE;
|
||||
Sleep(10);
|
||||
|
||||
if (dnsLock)
|
||||
{
|
||||
dnsDelete();
|
||||
|
||||
CloseHandle(dnsLock);
|
||||
dnsLock = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void dnsWorker()
|
||||
void dns_work()
|
||||
{
|
||||
sockaddr_in addr;
|
||||
memset(&addr, 0, sizeof(sockaddr_in));
|
||||
addr.sin_addr.S_un.S_addr = inet_addr(dnsHost.c_str());
|
||||
addr.sin_port = htons(dnsPort);
|
||||
|
||||
while (dnsInit)
|
||||
while (dnsInited)
|
||||
{
|
||||
auto client = CreateSocket();
|
||||
auto client = dns_createSocket();
|
||||
if (NULL == client)
|
||||
{
|
||||
Sleep(100);
|
||||
@@ -123,7 +96,7 @@ void dnsWorker()
|
||||
{
|
||||
closesocket(client);
|
||||
ReleaseMutex(dnsLock);
|
||||
|
||||
|
||||
Sleep(1);
|
||||
continue;
|
||||
}
|
||||
@@ -135,7 +108,7 @@ void dnsWorker()
|
||||
if (data->BufferLength != (ULONG)sendto(client, (PCHAR)data->Buffer, data->BufferLength, NULL, (PSOCKADDR)&addr, sizeof(sockaddr_in)))
|
||||
{
|
||||
closesocket(client);
|
||||
DnsFreePacket(data);
|
||||
dns_freePacket(data);
|
||||
|
||||
printf("[Redirector][DNS][dnsWorker] Unable to send packet: %d\n", WSAGetLastError());
|
||||
continue;
|
||||
@@ -146,7 +119,7 @@ void dnsWorker()
|
||||
if (!length)
|
||||
{
|
||||
closesocket(client);
|
||||
DnsFreePacket(data);
|
||||
dns_freePacket(data);
|
||||
|
||||
printf("[Redirector][DNS][dnsWorker] Unable to receive packet: %d\n", WSAGetLastError());
|
||||
continue;
|
||||
@@ -154,13 +127,43 @@ void dnsWorker()
|
||||
|
||||
nf_udpPostReceive(data->ID, data->Target, buffer, length, data->Option);
|
||||
closesocket(client);
|
||||
DnsFreePacket(data);
|
||||
dns_freePacket(data);
|
||||
}
|
||||
}
|
||||
|
||||
void dns_init()
|
||||
{
|
||||
if (!dnsLock)
|
||||
{
|
||||
dnsLock = CreateMutex(NULL, FALSE, NULL);
|
||||
}
|
||||
|
||||
dnsInited = TRUE;
|
||||
dnsDelete();
|
||||
|
||||
for (DWORD i = 0; i < 4; i++)
|
||||
{
|
||||
thread(dns_work).detach();
|
||||
}
|
||||
}
|
||||
|
||||
void dns_free()
|
||||
{
|
||||
dnsInited = FALSE;
|
||||
Sleep(10);
|
||||
|
||||
if (dnsLock)
|
||||
{
|
||||
dnsDelete();
|
||||
|
||||
CloseHandle(dnsLock);
|
||||
dnsLock = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, ULONG bufferLength, PNF_UDP_OPTIONS option)
|
||||
{
|
||||
if (!dnsInit)
|
||||
if (!dnsInited)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -171,8 +174,6 @@ void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, U
|
||||
puts("[Redirector][DNS][dnsCreate] Unable to allocate memory");
|
||||
return;
|
||||
}
|
||||
|
||||
memset(data, 0, sizeof(DNSPKT));
|
||||
data->ID = id;
|
||||
|
||||
data->Target = (PBYTE)malloc(targetLength);
|
||||
@@ -222,7 +223,7 @@ void dnsDelete()
|
||||
|
||||
for (auto i : dnsList)
|
||||
{
|
||||
DnsFreePacket(i);
|
||||
dns_freePacket(i);
|
||||
}
|
||||
dnsList.clear();
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
void dns_init();
|
||||
void dns_free();
|
||||
void dnsWorker();
|
||||
void dnsCreate(ENDPOINT_ID id, PBYTE target, ULONG targetLength, PCHAR buffer, ULONG bufferLength, PNF_UDP_OPTIONS options);
|
||||
void dnsDelete();
|
||||
|
||||
|
||||
@@ -1,30 +1,18 @@
|
||||
#include "Data.h"
|
||||
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
BOOL Started = FALSE;
|
||||
BOOL filterLoop = FALSE;
|
||||
BOOL filterICMP = TRUE;
|
||||
BOOL filterTCP = TRUE;
|
||||
BOOL filterUDP = TRUE;
|
||||
BOOL dnsHook = FALSE;
|
||||
string dnsHost = "";
|
||||
USHORT dnsPort = 0;
|
||||
USHORT apiLisn = 0;
|
||||
USHORT tcpLisn = 0;
|
||||
USHORT udpLisn = 0;
|
||||
vector<wstring> handleList;
|
||||
vector<wstring> bypassList;
|
||||
|
||||
atomic_ulong UP{ 0 };
|
||||
atomic_ulong DL{ 0 };
|
||||
|
||||
HANDLE TCPLock = NULL;
|
||||
HANDLE UDPLock = NULL;
|
||||
map<ENDPOINT_ID, PTCPINFO> TCPContext;
|
||||
map<ENDPOINT_ID, PUDPINFO> UDPContext;
|
||||
BOOL Started = FALSE;
|
||||
BOOL filterLoop = FALSE;
|
||||
BOOL filterICMP = TRUE;
|
||||
BOOL filterTCP = TRUE;
|
||||
BOOL filterUDP = TRUE;
|
||||
BOOL dnsHook = FALSE;
|
||||
string dnsHost = "";
|
||||
USHORT dnsPort = 0;
|
||||
USHORT tcpLisn = 0;
|
||||
USHORT udpLisn = 0;
|
||||
|
||||
@@ -19,17 +19,8 @@ typedef enum _AIO_TYPE {
|
||||
AIO_DNSHOST,
|
||||
AIO_DNSPORT,
|
||||
|
||||
AIO_APIPORT,
|
||||
AIO_TCPPORT,
|
||||
AIO_UDPPORT
|
||||
} AIO_TYPE;
|
||||
|
||||
typedef struct _TCPINFO {
|
||||
BYTE Target[NF_MAX_ADDRESS_LENGTH];
|
||||
} TCPINFO, * PTCPINFO;
|
||||
|
||||
typedef struct _UDPINFO {
|
||||
SOCKET Socket;
|
||||
} UDPINFO, * PUDPINFO;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,27 +1,148 @@
|
||||
#include "EventHandler.h"
|
||||
|
||||
#include "DNS.h"
|
||||
#include "Data.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <map>
|
||||
#include <regex>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
extern BOOL dnsHook;
|
||||
extern USHORT tcpLisn;
|
||||
extern USHORT udpLisn;
|
||||
|
||||
typedef struct _TCPINFO {
|
||||
DWORD PID;
|
||||
PBYTE Target;
|
||||
} TCPINFO, * PTCPINFO;
|
||||
|
||||
typedef struct _UDPINFO {
|
||||
SOCKET Socket;
|
||||
} UDPINFO, * PUDPINFO;
|
||||
|
||||
vector<wstring> handleList;
|
||||
vector<wstring> bypassList;
|
||||
|
||||
HANDLE TCPLock = NULL;
|
||||
HANDLE UDPLock = NULL;
|
||||
map<ENDPOINT_ID, PTCPINFO> TCPContext;
|
||||
map<ENDPOINT_ID, PUDPINFO> UDPContext;
|
||||
|
||||
wstring getProcessName(DWORD id)
|
||||
{
|
||||
if (id == 0)
|
||||
{
|
||||
return L"Idle";
|
||||
}
|
||||
|
||||
if (id == 4)
|
||||
{
|
||||
return L"System";
|
||||
}
|
||||
|
||||
wchar_t name[MAX_PATH];
|
||||
if (!nf_getProcessNameFromKernel(id, name, MAX_PATH))
|
||||
{
|
||||
if (!nf_getProcessNameW(id, name, MAX_PATH))
|
||||
{
|
||||
return L"Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
wchar_t result[MAX_PATH];
|
||||
if (GetLongPathNameW(name, result, MAX_PATH))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
BOOL checkBypassName(DWORD id)
|
||||
{
|
||||
auto name = getProcessName(id);
|
||||
|
||||
for (size_t i = 0; i < bypassList.size(); i++)
|
||||
{
|
||||
if (regex_search(name, wregex(bypassList[i])))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL checkHandleName(DWORD id)
|
||||
{
|
||||
auto name = getProcessName(id);
|
||||
|
||||
for (size_t i = 0; i < handleList.size(); i++)
|
||||
{
|
||||
if (regex_search(name, wregex(handleList[i])))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL eh_init()
|
||||
void eh_init()
|
||||
{
|
||||
return TRUE;
|
||||
if (!TCPLock)
|
||||
{
|
||||
TCPLock = CreateMutex(NULL, FALSE, NULL);
|
||||
}
|
||||
|
||||
if (!UDPLock)
|
||||
{
|
||||
UDPLock = CreateMutex(NULL, FALSE, NULL);
|
||||
}
|
||||
|
||||
dns_init();
|
||||
}
|
||||
|
||||
void eh_free()
|
||||
{
|
||||
|
||||
WaitForSingleObject(TCPLock, INFINITE);
|
||||
WaitForSingleObject(UDPLock, INFINITE);
|
||||
|
||||
for (auto& [k, v] : TCPContext)
|
||||
{
|
||||
if (v->Target)
|
||||
{
|
||||
free(v->Target);
|
||||
v->Target = NULL;
|
||||
}
|
||||
}
|
||||
TCPContext.clear();
|
||||
|
||||
for (auto& [k, v] : UDPContext)
|
||||
{
|
||||
if (v->Socket)
|
||||
{
|
||||
closesocket(v->Socket);
|
||||
v->Socket = NULL;
|
||||
}
|
||||
}
|
||||
UDPContext.clear();
|
||||
|
||||
ReleaseMutex(TCPLock);
|
||||
ReleaseMutex(UDPLock);
|
||||
|
||||
CloseHandle(TCPLock);
|
||||
CloseHandle(UDPLock);
|
||||
|
||||
TCPLock = NULL;
|
||||
UDPLock = NULL;
|
||||
|
||||
dns_free();
|
||||
}
|
||||
|
||||
void threadStart()
|
||||
@@ -41,12 +162,14 @@ void tcpConnectRequest(ENDPOINT_ID id, PNF_TCP_CONN_INFO info)
|
||||
|
||||
void tcpConnected(ENDPOINT_ID id, PNF_TCP_CONN_INFO info)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(info);
|
||||
|
||||
printf("[Redirector][EventHandler][tcpConnected][%llu]\n", id);
|
||||
}
|
||||
|
||||
void tcpCanSend(ENDPOINT_ID id)
|
||||
{
|
||||
|
||||
UNREFERENCED_PARAMETER(id);
|
||||
}
|
||||
|
||||
void tcpSend(ENDPOINT_ID id, const char* buffer, int length)
|
||||
@@ -56,7 +179,7 @@ void tcpSend(ENDPOINT_ID id, const char* buffer, int length)
|
||||
|
||||
void tcpCanReceive(ENDPOINT_ID id)
|
||||
{
|
||||
|
||||
UNREFERENCED_PARAMETER(id);
|
||||
}
|
||||
|
||||
void tcpReceive(ENDPOINT_ID id, const char* buffer, int length)
|
||||
@@ -76,12 +199,13 @@ void udpCreated(ENDPOINT_ID id, PNF_UDP_CONN_INFO info)
|
||||
|
||||
void udpConnectRequest(ENDPOINT_ID id, PNF_UDP_CONN_REQUEST info)
|
||||
{
|
||||
|
||||
UNREFERENCED_PARAMETER(id);
|
||||
UNREFERENCED_PARAMETER(info);
|
||||
}
|
||||
|
||||
void udpCanSend(ENDPOINT_ID id)
|
||||
{
|
||||
|
||||
UNREFERENCED_PARAMETER(id);
|
||||
}
|
||||
|
||||
void udpSend(ENDPOINT_ID id, const unsigned char* target, const char* buffer, int length, PNF_UDP_OPTIONS options)
|
||||
@@ -91,7 +215,7 @@ void udpSend(ENDPOINT_ID id, const unsigned char* target, const char* buffer, in
|
||||
|
||||
void udpCanReceive(ENDPOINT_ID id)
|
||||
{
|
||||
|
||||
UNREFERENCED_PARAMETER(id);
|
||||
}
|
||||
|
||||
void udpReceive(ENDPOINT_ID id, const unsigned char* target, const char* buffer, int length, PNF_UDP_OPTIONS options)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
#include <nfapi.h>
|
||||
|
||||
BOOL eh_init();
|
||||
void eh_init();
|
||||
void eh_free();
|
||||
|
||||
void threadStart();
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options)
|
||||
{
|
||||
if (options->ip_family != AF_INET ||
|
||||
@@ -47,11 +49,9 @@ void ipSend(const char* buffer, int length, PNF_IP_PACKET_OPTIONS options)
|
||||
data[options->ipHeaderSize + 2] = icmpsum & 0xff;
|
||||
data[options->ipHeaderSize + 3] = (icmpsum >> 8);
|
||||
|
||||
if (NF_STATUS_SUCCESS == nf_ipPostReceive((PCHAR)data, length, options))
|
||||
{
|
||||
printf("[Redirector][ipSend] Fake ICMP response for %d.%d.%d.%d\n", data[12], data[13], data[14], data[15]);
|
||||
}
|
||||
printf("[Redirector][ipSend] Fake ICMP response for %d.%d.%d.%d\n", data[12], data[13], data[14], data[15]);
|
||||
|
||||
nf_ipPostReceive((PCHAR)data, length, options);
|
||||
free(data);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,22 +1,36 @@
|
||||
All address use SOCKS5 format
|
||||
|
||||
/* DNS */
|
||||
Only UDP DNS
|
||||
Send
|
||||
+------+
|
||||
| Data |
|
||||
+------+
|
||||
| ???? |
|
||||
+------+
|
||||
|
||||
/* API */
|
||||
Based UDP
|
||||
+-----+----------+-------------+
|
||||
| PID | Protocol | Client Port |
|
||||
+-----+----------+-------------+
|
||||
| 4 | 1 | 2 |
|
||||
+-----+----------+-------------+
|
||||
Receive
|
||||
+------+
|
||||
| Data |
|
||||
+------+
|
||||
| ???? |
|
||||
+------+
|
||||
|
||||
/* TCP */
|
||||
First Packet
|
||||
+-----+--------+
|
||||
| PID | Target |
|
||||
+-----+--------+
|
||||
| 4 | ?????? |
|
||||
+-----+--------+
|
||||
|
||||
Send
|
||||
+------+
|
||||
| Data |
|
||||
+------+
|
||||
| ???? |
|
||||
+------+
|
||||
|
||||
Receive
|
||||
+------+
|
||||
| Data |
|
||||
+------+
|
||||
@@ -24,6 +38,13 @@ Based UDP
|
||||
+------+
|
||||
|
||||
/* UDP */
|
||||
First Packet
|
||||
+-----+
|
||||
| PID |
|
||||
+-----+
|
||||
| 4 |
|
||||
+-----+
|
||||
|
||||
Send
|
||||
+--------+------+
|
||||
| Target | Data |
|
||||
|
||||
@@ -6,21 +6,23 @@
|
||||
#include <Windows.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <nfapi.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
extern BOOL filterLoop;
|
||||
extern BOOL filterICMP;
|
||||
extern BOOL filterTCP;
|
||||
extern BOOL filterUDP;
|
||||
extern BOOL dnsHook;
|
||||
extern BOOL filterLoop;
|
||||
extern BOOL filterICMP;
|
||||
extern BOOL filterTCP;
|
||||
extern BOOL filterUDP;
|
||||
extern BOOL dnsHook;
|
||||
extern string dnsHost;
|
||||
extern USHORT dnsPort;
|
||||
extern USHORT apiLisn;
|
||||
extern USHORT tcpLisn;
|
||||
extern USHORT udpLisn;
|
||||
extern vector<wstring> handleList;
|
||||
extern vector<wstring> bypassList;
|
||||
|
||||
NF_EventHandler EventHandler = {
|
||||
threadStart,
|
||||
@@ -55,9 +57,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
__declspec(dllexport) BOOL __cdecl aio_dial(INT name, LPWSTR value)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(name);
|
||||
@@ -79,8 +79,6 @@ extern "C" {
|
||||
break;
|
||||
case AIO_DNSPORT:
|
||||
break;
|
||||
case AIO_APIPORT:
|
||||
break;
|
||||
case AIO_TCPPORT:
|
||||
break;
|
||||
case AIO_UDPPORT:
|
||||
@@ -106,10 +104,12 @@ extern "C" {
|
||||
|
||||
__declspec(dllexport) void __cdecl aio_free()
|
||||
{
|
||||
UNREFERENCED_PARAMETER(WSACleanup());
|
||||
nf_deleteRules();
|
||||
nf_free();
|
||||
|
||||
eh_free();
|
||||
|
||||
UNREFERENCED_PARAMETER(WSACleanup());
|
||||
return;
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -99,7 +99,6 @@
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="API.cpp" />
|
||||
<ClCompile Include="Data.cpp" />
|
||||
<ClCompile Include="DNS.cpp" />
|
||||
<ClCompile Include="EventHandler.cpp" />
|
||||
@@ -108,7 +107,6 @@
|
||||
<ClCompile Include="Utils.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="API.h" />
|
||||
<ClInclude Include="Data.h" />
|
||||
<ClInclude Include="DNS.h" />
|
||||
<ClInclude Include="EventHandler.h" />
|
||||
|
||||
@@ -29,9 +29,6 @@
|
||||
<ClCompile Include="DNS.cpp">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="API.cpp">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="EventHandler.h">
|
||||
@@ -49,9 +46,6 @@
|
||||
<ClInclude Include="DNS.h">
|
||||
<Filter>Header</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="API.h">
|
||||
<Filter>Header</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="PROTOCOL.txt" />
|
||||
|
||||
Reference in New Issue
Block a user