1 // SoftEther VPN Source Code - Developer Edition Master Branch
2 // Cedar Communication Module
3 
4 
5 // BridgeWin32.h
6 // Header of BridgeWin32.c
7 
8 #ifdef OS_WIN32
9 
10 #ifndef	BRIDGEWIN32_H
11 #define	BRIDGEWIN32_H
12 
13 #include "Bridge.h"
14 
15 #include <Packet32.h>
16 
17 #define	BRIDGE_WIN32_PACKET_DLL		"Packet.dll"
18 #define	BRIDGE_WIN32_PCD_DLL		"|see.dll"
19 #define	BRIDGE_WIN32_PCD_SYS		"|DriverPackages\\See\\x86\\See_x86.sys"
20 #define	BRIDGE_WIN32_PCD_DLL_X64	"|see_x64.dll"
21 #define	BRIDGE_WIN32_PCD_SYS_X64	"|DriverPackages\\See\\x64\\See_x64.sys"
22 #define	BRIDGE_WIN32_PCD_REGKEY		"SYSTEM\\CurrentControlSet\\services\\SEE"
23 #define	BRIDGE_WIN32_PCD_BUILDVALUE	"CurrentInstalledBuild"
24 
25 #define	BRIDGE_WIN32_ETH_BUFFER		(1048576)
26 
27 #ifdef BRIDGE_C
28 
29 // Header for Internal function (for BridgeWin32.c)
30 typedef struct WP
31 {
32 	bool Inited;
33 	HINSTANCE hPacketDll;
34 	PCHAR (*PacketGetVersion)();
35 	PCHAR (*PacketGetDriverVersion)();
36 	BOOLEAN (*PacketSetMinToCopy)(LPADAPTER AdapterObject,int nbytes);
37 	BOOLEAN (*PacketSetNumWrites)(LPADAPTER AdapterObject,int nwrites);
38 	BOOLEAN (*PacketSetMode)(LPADAPTER AdapterObject,int mode);
39 	BOOLEAN (*PacketSetReadTimeout)(LPADAPTER AdapterObject,int timeout);
40 	BOOLEAN (*PacketSetBpf)(LPADAPTER AdapterObject,struct bpf_program *fp);
41 	INT (*PacketSetSnapLen)(LPADAPTER AdapterObject,int snaplen);
42 	BOOLEAN (*PacketGetStats)(LPADAPTER AdapterObject,struct bpf_stat *s);
43 	BOOLEAN (*PacketGetStatsEx)(LPADAPTER AdapterObject,struct bpf_stat *s);
44 	BOOLEAN (*PacketSetBuff)(LPADAPTER AdapterObject,int dim);
45 	BOOLEAN (*PacketGetNetType)(LPADAPTER AdapterObject,NetType *type);
46 	LPADAPTER (*PacketOpenAdapter)(PCHAR AdapterName);
47 	BOOLEAN (*PacketSendPacket)(LPADAPTER AdapterObject,LPPACKET pPacket,BOOLEAN Sync);
48 	INT (*PacketSendPackets)(LPADAPTER AdapterObject,PVOID PacketBuff,ULONG Size, BOOLEAN Sync);
49 	LPPACKET (*PacketAllocatePacket)(void);
50 	VOID (*PacketInitPacket)(LPPACKET lpPacket,PVOID  Buffer,UINT  Length);
51 	VOID (*PacketFreePacket)(LPPACKET lpPacket);
52 	BOOLEAN (*PacketReceivePacket)(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync);
53 	BOOLEAN (*PacketSetHwFilter)(LPADAPTER AdapterObject,ULONG Filter);
54 	BOOLEAN (*PacketGetAdapterNames)(PTSTR pStr,PULONG  BufferSize);
55 	BOOLEAN (*PacketGetNetInfoEx)(PCHAR AdapterName, npf_if_addr* buffer, PLONG NEntries);
56 	BOOLEAN (*PacketRequest)(LPADAPTER  AdapterObject,BOOLEAN Set,PPACKET_OID_DATA  OidData);
57 	HANDLE (*PacketGetReadEvent)(LPADAPTER AdapterObject);
58 	BOOLEAN (*PacketSetDumpName)(LPADAPTER AdapterObject, void *name, int len);
59 	BOOLEAN (*PacketSetDumpLimits)(LPADAPTER AdapterObject, UINT maxfilesize, UINT maxnpacks);
60 	BOOLEAN (*PacketIsDumpEnded)(LPADAPTER AdapterObject, BOOLEAN sync);
61 	BOOL (*PacketStopDriver)();
62 	VOID (*PacketCloseAdapter)(LPADAPTER lpAdapter);
63 	BOOLEAN (*PacketSetLoopbackBehavior)(LPADAPTER AdapterObject, UINT LoopbackBehavior);
64 } WP;
65 
66 // Adapter list
67 typedef struct WP_ADAPTER
68 {
69 	char Name[MAX_SIZE];
70 	char Title[MAX_SIZE];
71 	char Guid[MAX_SIZE];
72 	UINT Id;
73 } WP_ADAPTER;
74 
75 // Internal function prototype
76 void InitEthAdaptersList();
77 void FreeEthAdaptersList();
78 int CompareWpAdapter(void *p1, void *p2);
79 LIST *GetEthAdapterList();
80 LIST *GetEthAdapterListInternal();
81 bool InitWpWithLoadLibrary(WP *wp, HINSTANCE h);
82 bool IsPcdSupported();
83 HINSTANCE InstallPcdDriver();
84 HINSTANCE InstallPcdDriverInternal();
85 UINT LoadPcdDriverBuild();
86 void SavePcdDriverBuild(UINT build);
87 
88 #endif	// BRIDGE_C
89 
90 typedef struct _ADAPTER ADAPTER;
91 typedef struct _PACKET PACKET;
92 
93 // ETH structure
94 struct ETH
95 {
96 	char *Name;					// Adapter name
97 	char *Title;				// Adapter title
98 	ADAPTER *Adapter;			// Adapter
99 	CANCEL *Cancel;				// Cancel object
100 	UCHAR *Buffer;				// Buffer
101 	UINT BufferSize;			// Buffer size
102 	PACKET *Packet;				// Packet
103 	PACKET *PutPacket;			// Write packet
104 	QUEUE *PacketQueue;			// Packet queue
105 	UINT64 LastSetSingleCpu;	// Date and time set to a single CPU to last
106 	bool LoopbackBlock;			// Whether to block the loop back packet
107 	bool Empty;					// It is empty
108 	UCHAR MacAddress[6];		// MAC address
109 	bool HasFatalError;			// A fatal error occurred on the transmission side
110 
111 	SU *Su;						// SeLow handle
112 	SU_ADAPTER *SuAdapter;		// SeLow adapter handle
113 
114 	// Unused
115 	bool IsRawIpMode;			// RAW IP mode
116 	UCHAR RawIpMyMacAddr[6];
117 	UCHAR RawIpYourMacAddr[6];
118 	IP MyPhysicalIPForce;
119 };
120 
121 // Function prototype
122 void InitEth();
123 void FreeEth();
124 bool IsEthSupported();
125 bool IsEthSupportedInner();
126 TOKEN_LIST *GetEthList();
127 TOKEN_LIST *GetEthListEx(UINT *total_num_including_hidden, bool enum_normal, bool enum_rawip);
128 ETH *OpenEth(char *name, bool local, bool tapmode, char *tapaddr);
129 ETH *OpenEthInternal(char *name, bool local, bool tapmode, char *tapaddr);
130 void CloseEth(ETH *e);
131 CANCEL *EthGetCancel(ETH *e);
132 UINT EthGetPacket(ETH *e, void **data);
133 void EthPutPacket(ETH *e, void *data, UINT size);
134 void EthPutPackets(ETH *e, UINT num, void **datas, UINT *sizes);
135 void GetEthNetworkConnectionName(wchar_t *dst, UINT size, char *device_name);
136 bool IsWin32BridgeWithSee();
137 UINT EthGetMtu(ETH *e);
138 bool EthSetMtu(ETH *e, UINT mtu);
139 bool EthIsChangeMtuSupported(ETH *e);
140 
141 bool Win32EthIsSuSupported();
142 
143 void Win32EthSetShowAllIf(bool b);
144 bool Win32EthGetShowAllIf();
145 
146 bool EnumEthVLanWin32(RPC_ENUM_ETH_VLAN *t);
147 bool GetClassRegKeyWin32(char *key, UINT key_size, char *short_key, UINT short_key_size, char *guid);
148 int CmpRpcEnumEthVLan(void *p1, void *p2);
149 void GetVLanSupportStatus(RPC_ENUM_ETH_VLAN_ITEM *e);
150 void GetVLanEnableStatus(RPC_ENUM_ETH_VLAN_ITEM *e);
151 bool SetVLanEnableStatus(char *title, bool enable);
152 RPC_ENUM_ETH_VLAN_ITEM *FindEthVLanItem(RPC_ENUM_ETH_VLAN *t, char *name);
153 char *SearchDeviceInstanceIdFromShortKey(char *short_key);
154 void Win32EthMakeCombinedName(char *dst, UINT dst_size, char *nicname, char *guid);
155 UINT Win32EthGenIdFromGuid(char *guid);
156 UINT Win32EthGetNameAndIdFromCombinedName(char *name, UINT name_size, char *str);
157 
158 struct WP_ADAPTER *Win32EthSearch(char *name);
159 bool Win32IsUsingSeLow();
160 void Win32SetEnableSeLow(bool b);
161 bool Win32GetEnableSeLow();
162 
163 #endif // BRIDGEWIN32_H
164 
165 #endif // OS_WIN32
166