@ -22,79 +22,92 @@
# include <string.h>
# include <string.h>
# include <time.h>
# include <time.h>
# include <strsafe.h>
# include <strsafe.h>
# include "tuntap.h"
# include "tuntap.h"
// DDK macros
# define CTL_CODE(DeviceType, Function, Method, Access) \
( ( ( DeviceType ) < < 16 ) | ( ( Access ) < < 14 ) | ( ( Function ) < < 2 ) | ( Method ) )
# define FILE_DEVICE_UNKNOWN 0x00000022
# define FILE_ANY_ACCESS 0x00000000
# define METHOD_BUFFERED 0
/* From OpenVPN tap driver, common.h */
/* From OpenVPN tap driver, common.h */
# define TAP_CONTROL_CODE(request,method) CTL_CODE(FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS)
# define TAP_CONTROL_CODE(request, method) \
# define TAP_IOCTL_GET_MAC TAP_CONTROL_CODE (1, METHOD_BUFFERED)
CTL_CODE ( FILE_DEVICE_UNKNOWN , request , method , FILE_ANY_ACCESS )
# define TAP_IOCTL_GET_VERSION TAP_CONTROL_CODE (2, METHOD_BUFFERED)
# define TAP_IOCTL_GET_MAC TAP_CONTROL_CODE(1, METHOD_BUFFERED)
# define TAP_IOCTL_GET_MTU TAP_CONTROL_CODE (3, METHOD_BUFFERED)
# define TAP_IOCTL_GET_VERSION TAP_CONTROL_CODE(2, METHOD_BUFFERED)
# define TAP_IOCTL_GET_INFO TAP_CONTROL_CODE (4, METHOD_BUFFERED)
# define TAP_IOCTL_GET_MTU TAP_CONTROL_CODE(3, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_POINT_TO_POINT TAP_CONTROL_CODE (5, METHOD_BUFFERED)
# define TAP_IOCTL_GET_INFO TAP_CONTROL_CODE(4, METHOD_BUFFERED)
# define TAP_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE (6, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_POINT_TO_POINT TAP_CONTROL_CODE(5, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_DHCP_MASQ TAP_CONTROL_CODE (7, METHOD_BUFFERED)
# define TAP_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE(6, METHOD_BUFFERED)
# define TAP_IOCTL_GET_LOG_LINE TAP_CONTROL_CODE (8, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_DHCP_MASQ TAP_CONTROL_CODE(7, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_DHCP_SET_OPT TAP_CONTROL_CODE (9, METHOD_BUFFERED)
# define TAP_IOCTL_GET_LOG_LINE TAP_CONTROL_CODE(8, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_TUN TAP_CONTROL_CODE (10, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_DHCP_SET_OPT TAP_CONTROL_CODE(9, METHOD_BUFFERED)
# define TAP_IOCTL_CONFIG_TUN TAP_CONTROL_CODE(10, METHOD_BUFFERED)
/* Windows registry crap */
/* Windows registry crap */
# define MAX_KEY_LENGTH 255
# define MAX_KEY_LENGTH 255
# define MAX_VALUE_NAME 16383
# define MAX_VALUE_NAME 16383
# define NETWORK_ADAPTERS "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
# define NETWORK_ADAPTERS \
" SYSTEM \\ CurrentControlSet \\ Control \\ Class \\ {4D36E972-E325-11CE-BFC1- " \
" 08002BE10318} "
# define ETHER_ADDR_LEN 6
/* From OpenVPN tap driver, proto.h */
/* From OpenVPN tap driver, proto.h */
typedef unsigned long IPADDR ;
typedef unsigned long IPADDR ;
/* This one is from Fabien Pichot, in the tNETacle source code */
/* This one is from Fabien Pichot, in the tNETacle source code */
static LPWSTR
static LPWSTR
formated_error ( LPWSTR pMessage , DWORD m , . . . ) {
formated_error ( LPWSTR pMessage , DWORD m , . . . )
{
LPWSTR pBuffer = NULL ;
LPWSTR pBuffer = NULL ;
va_list args = NULL ;
va_list args = NULL ;
va_start ( args , pMessage ) ;
va_start ( args , pMessage ) ;
FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM |
FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER ,
FORMAT_MESSAGE_ALLOCATE_BUFFER ,
pMessage , m , 0 , ( LPSTR ) & pBuffer , 0 , & args ) ;
pMessage ,
m ,
0 ,
( LPSTR ) & pBuffer ,
0 ,
& args ) ;
va_end ( args ) ;
va_end ( args ) ;
return pBuffer ;
return pBuffer ;
}
}
/* TODO: Rework to be more generic and allow arbitrary key modification (MTU and stuff) */
/* TODO: Rework to be more generic and allow arbitrary key modification (MTU and
* stuff ) */
static char *
static char *
reg_query ( char * key_name ) {
reg_query ( char * key_name )
{
HKEY adapters , adapter ;
HKEY adapters , adapter ;
DWORD i , ret , len ;
DWORD i , ret , len ;
char * deviceid = NULL ;
char * deviceid = NULL ;
DWORD sub_keys = 0 ;
DWORD sub_keys = 0 ;
ret = RegOpenKeyEx ( HKEY_LOCAL_MACHINE , TEXT ( key_name ) , 0 , KEY_READ , & adapters ) ;
ret =
if ( ret ! = ERROR_SUCCESS ) {
RegOpenKeyEx ( HKEY_LOCAL_MACHINE , TEXT ( key_name ) , 0 , KEY_READ , & adapters ) ;
if ( ret ! = ERROR_SUCCESS )
{
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , ret ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , ret ) ) ;
return NULL ;
return NULL ;
}
}
ret = RegQueryInfoKey ( adapters , NULL , NULL , NULL , & sub_keys , NULL , NULL , NULL , NULL , NULL , NULL , NULL ) ;
ret = RegQueryInfoKey ( adapters , NULL , NULL , NULL , & sub_keys , NULL , NULL , NULL ,
if ( ret ! = ERROR_SUCCESS ) {
NULL , NULL , NULL , NULL ) ;
if ( ret ! = ERROR_SUCCESS )
{
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , ret ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , ret ) ) ;
return NULL ;
return NULL ;
}
}
if ( sub_keys < = 0 ) {
if ( sub_keys < = 0 )
{
tuntap_log ( TUNTAP_LOG_DEBUG , " Wrong registry key " ) ;
tuntap_log ( TUNTAP_LOG_DEBUG , " Wrong registry key " ) ;
return NULL ;
return NULL ;
}
}
/* Walk througt all adapters */
/* Walk througt all adapters */
for ( i = 0 ; i < sub_keys ; i + + ) {
for ( i = 0 ; i < sub_keys ; i + + )
{
char new_key [ MAX_KEY_LENGTH ] ;
char new_key [ MAX_KEY_LENGTH ] ;
char data [ 256 ] ;
char data [ 256 ] ;
TCHAR key [ MAX_KEY_LENGTH ] ;
TCHAR key [ MAX_KEY_LENGTH ] ;
@ -102,38 +115,46 @@ reg_query(char *key_name) {
/* Get the adapter key name */
/* Get the adapter key name */
ret = RegEnumKeyEx ( adapters , i , key , & keylen , NULL , NULL , NULL , NULL ) ;
ret = RegEnumKeyEx ( adapters , i , key , & keylen , NULL , NULL , NULL , NULL ) ;
if ( ret ! = ERROR_SUCCESS ) {
if ( ret ! = ERROR_SUCCESS )
{
continue ;
continue ;
}
}
/* Append it to NETWORK_ADAPTERS and open it */
/* Append it to NETWORK_ADAPTERS and open it */
snprintf ( new_key , sizeof new_key , " %s \\ %s " , key_name , key ) ;
snprintf ( new_key , sizeof new_key , " %s \\ %s " , key_name , key ) ;
ret = RegOpenKeyEx ( HKEY_LOCAL_MACHINE , TEXT ( new_key ) , 0 , KEY_READ , & adapter ) ;
ret =
if ( ret ! = ERROR_SUCCESS ) {
RegOpenKeyEx ( HKEY_LOCAL_MACHINE , TEXT ( new_key ) , 0 , KEY_READ , & adapter ) ;
if ( ret ! = ERROR_SUCCESS )
{
continue ;
continue ;
}
}
/* Check its values */
/* Check its values */
len = sizeof data ;
len = sizeof data ;
ret = RegQueryValueEx ( adapter , " ComponentId " , NULL , NULL , ( LPBYTE ) data , & len ) ;
ret =
if ( ret ! = ERROR_SUCCESS ) {
RegQueryValueEx ( adapter , " ComponentId " , NULL , NULL , ( LPBYTE ) data , & len ) ;
if ( ret ! = ERROR_SUCCESS )
{
/* This value doesn't exist in this adaptater tree */
/* This value doesn't exist in this adaptater tree */
goto clean ;
goto clean ;
}
}
/* If its a tap adapter, its all good */
/* If its a tap adapter, its all good */
if ( strncmp ( data , " tap " , 3 ) = = 0 ) {
if ( strncmp ( data , " tap " , 3 ) = = 0 )
{
DWORD type ;
DWORD type ;
len = sizeof data ;
len = sizeof data ;
ret = RegQueryValueEx ( adapter , " NetCfgInstanceId " , NULL , & type , ( LPBYTE ) data , & len ) ;
ret = RegQueryValueEx ( adapter , " NetCfgInstanceId " , NULL , & type ,
if ( ret ! = ERROR_SUCCESS ) {
( LPBYTE ) data , & len ) ;
if ( ret ! = ERROR_SUCCESS )
{
tuntap_log ( TUNTAP_LOG_INFO , ( const char * ) formated_error ( L " %1 " , ret ) ) ;
tuntap_log ( TUNTAP_LOG_INFO , ( const char * ) formated_error ( L " %1 " , ret ) ) ;
goto clean ;
goto clean ;
}
}
deviceid = strdup ( data ) ;
deviceid = strdup ( data ) ;
break ;
break ;
}
}
clean :
clean :
RegCloseKey ( adapter ) ;
RegCloseKey ( adapter ) ;
}
}
RegCloseKey ( adapters ) ;
RegCloseKey ( adapters ) ;
@ -141,40 +162,48 @@ clean:
}
}
void
void
tuntap_sys_destroy ( struct device * dev ) {
tuntap_sys_destroy ( struct device * dev )
{
( void ) dev ;
( void ) dev ;
return ;
return ;
}
}
int
int
tuntap_start ( struct device * dev , int mode , int tun ) {
tuntap_start ( struct device * dev , int mode , int tun )
{
HANDLE tun_fd ;
HANDLE tun_fd ;
char * deviceid ;
char * deviceid ;
char buf [ 60 ] ;
char buf [ 60 ] ;
/* Don't re-initialise a previously started device */
/* Don't re-initialise a previously started device */
if ( dev - > tun_fd ! = TUNFD_INVALID_VALUE ) {
if ( dev - > tun_fd ! = TUNFD_INVALID_VALUE )
{
return - 1 ;
return - 1 ;
}
}
/* Shift the persistence bit */
/* Shift the persistence bit */
if ( mode & TUNTAP_MODE_PERSIST ) {
if ( mode & TUNTAP_MODE_PERSIST )
{
mode & = ~ TUNTAP_MODE_PERSIST ;
mode & = ~ TUNTAP_MODE_PERSIST ;
}
}
if ( mode = = TUNTAP_MODE_TUNNEL ) {
if ( mode = = TUNTAP_MODE_TUNNEL )
{
tuntap_log ( TUNTAP_LOG_NOTICE , " Layer 3 tunneling is not implemented " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Layer 3 tunneling is not implemented " ) ;
return - 1 ;
return - 1 ;
}
}
else if ( mode ! = TUNTAP_MODE_ETHERNET ) {
else if ( mode ! = TUNTAP_MODE_ETHERNET )
{
tuntap_log ( TUNTAP_LOG_ERR , " Invalid parameter 'mode' " ) ;
tuntap_log ( TUNTAP_LOG_ERR , " Invalid parameter 'mode' " ) ;
return - 1 ;
return - 1 ;
}
}
deviceid = reg_query ( NETWORK_ADAPTERS ) ;
deviceid = reg_query ( NETWORK_ADAPTERS ) ;
snprintf ( buf , sizeof buf , " \\ \\ . \\ Global \\ %s.tap " , deviceid ) ;
snprintf ( buf , sizeof buf , " \\ \\ . \\ Global \\ %s.tap " , deviceid ) ;
tun_fd = CreateFile ( buf , GENERIC_WRITE | GENERIC_READ , 0 , 0 , OPEN_EXISTING , FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED , 0 ) ;
tun_fd = CreateFile ( buf , GENERIC_WRITE | GENERIC_READ , 0 , 0 , OPEN_EXISTING ,
if ( tun_fd = = TUNFD_INVALID_VALUE ) {
FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED , 0 ) ;
if ( tun_fd = = TUNFD_INVALID_VALUE )
{
int errcode = GetLastError ( ) ;
int errcode = GetLastError ( ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
@ -186,57 +215,75 @@ tuntap_start(struct device *dev, int mode, int tun) {
}
}
void
void
tuntap_release ( struct device * dev ) {
tuntap_release ( struct device * dev )
{
( void ) CloseHandle ( dev - > tun_fd ) ;
( void ) CloseHandle ( dev - > tun_fd ) ;
free ( dev ) ;
free ( dev ) ;
}
}
char *
char *
tuntap_get_hwaddr ( struct device * dev ) {
tuntap_get_hwaddr ( struct device * dev )
{
static unsigned char hwaddr [ ETHER_ADDR_LEN ] ;
static unsigned char hwaddr [ ETHER_ADDR_LEN ] ;
DWORD len ;
DWORD len ;
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_GET_MAC , & hwaddr , sizeof ( hwaddr ) , & hwaddr , sizeof ( hwaddr ) , & len , NULL ) = = 0 ) {
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_GET_MAC , & hwaddr , sizeof ( hwaddr ) ,
& hwaddr , sizeof ( hwaddr ) , & len , NULL )
= = 0 )
{
int errcode = GetLastError ( ) ;
int errcode = GetLastError ( ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
return NULL ;
return NULL ;
} else {
}
else
{
char buf [ 128 ] ;
char buf [ 128 ] ;
( void ) _snprintf_s ( buf , sizeof buf , sizeof buf , " MAC address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x " ,
( void ) _snprintf_s ( buf , sizeof buf , sizeof buf ,
hwaddr [ 0 ] , hwaddr [ 1 ] , hwaddr [ 2 ] , hwaddr [ 3 ] , hwaddr [ 4 ] , hwaddr [ 5 ] ) ;
" MAC address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x " , hwaddr [ 0 ] ,
hwaddr [ 1 ] , hwaddr [ 2 ] , hwaddr [ 3 ] , hwaddr [ 4 ] , hwaddr [ 5 ] ) ;
tuntap_log ( TUNTAP_LOG_DEBUG , buf ) ;
tuntap_log ( TUNTAP_LOG_DEBUG , buf ) ;
}
}
return ( char * ) hwaddr ;
return ( char * ) hwaddr ;
}
}
int
int
tuntap_set_hwaddr ( struct device * dev , const char * hwaddr ) {
tuntap_set_hwaddr ( struct device * dev , const char * hwaddr )
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_set_hwaddr() " ) ;
{
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_set_hwaddr() " ) ;
return - 1 ;
return - 1 ;
}
}
static int
static int
tuntap_sys_set_updown ( struct device * dev , ULONG flag ) {
tuntap_sys_set_updown ( struct device * dev , ULONG flag )
{
DWORD len ;
DWORD len ;
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_SET_MEDIA_STATUS , & flag , sizeof ( flag ) , & flag , sizeof ( flag ) , & len , NULL ) = = 0 ) {
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_SET_MEDIA_STATUS , & flag ,
sizeof ( flag ) , & flag , sizeof ( flag ) , & len , NULL )
= = 0 )
{
int errcode = GetLastError ( ) ;
int errcode = GetLastError ( ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
return - 1 ;
return - 1 ;
} else {
}
else
{
char buf [ 32 ] ;
char buf [ 32 ] ;
( void ) _snprintf_s ( buf , sizeof buf , sizeof buf , " Status: %s " , flag ? " Up " : " Down " ) ;
( void ) _snprintf_s ( buf , sizeof buf , sizeof buf , " Status: %s " ,
flag ? " Up " : " Down " ) ;
tuntap_log ( TUNTAP_LOG_DEBUG , buf ) ;
tuntap_log ( TUNTAP_LOG_DEBUG , buf ) ;
return 0 ;
return 0 ;
}
}
}
}
int
int
tuntap_up ( struct device * dev ) {
tuntap_up ( struct device * dev )
{
ULONG flag ;
ULONG flag ;
flag = 1 ;
flag = 1 ;
@ -244,7 +291,8 @@ tuntap_up(struct device *dev) {
}
}
int
int
tuntap_down ( struct device * dev ) {
tuntap_down ( struct device * dev )
{
ULONG flag ;
ULONG flag ;
flag = 0 ;
flag = 0 ;
@ -252,11 +300,15 @@ tuntap_down(struct device *dev) {
}
}
int
int
tuntap_get_mtu ( struct device * dev ) {
tuntap_get_mtu ( struct device * dev )
{
ULONG mtu ;
ULONG mtu ;
DWORD len ;
DWORD len ;
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_GET_MTU , & mtu , sizeof ( mtu ) , & mtu , sizeof ( mtu ) , & len , NULL ) = = 0 ) {
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_GET_MTU , & mtu , sizeof ( mtu ) , & mtu ,
sizeof ( mtu ) , & len , NULL )
= = 0 )
{
int errcode = GetLastError ( ) ;
int errcode = GetLastError ( ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
@ -266,15 +318,18 @@ tuntap_get_mtu(struct device *dev) {
}
}
int
int
tuntap_set_mtu ( struct device * dev , int mtu ) {
tuntap_set_mtu ( struct device * dev , int mtu )
{
( void ) dev ;
( void ) dev ;
( void ) mtu ;
( void ) mtu ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_set_mtu() " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_set_mtu() " ) ;
return - 1 ;
return - 1 ;
}
}
int
int
tuntap_sys_set_ipv4 ( struct device * dev , t_tun_in_addr * s , uint32_t mask ) {
tuntap_sys_set_ipv4 ( struct device * dev , t_tun_in_addr * s , uint32_t mask )
{
IPADDR psock [ 4 ] ;
IPADDR psock [ 4 ] ;
DWORD len ;
DWORD len ;
@ -286,7 +341,10 @@ tuntap_sys_set_ipv4(struct device *dev, t_tun_in_addr *s, uint32_t mask) {
/* DHCP lease time */
/* DHCP lease time */
psock [ 3 ] = 0 ;
psock [ 3 ] = 0 ;
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_CONFIG_DHCP_MASQ , & psock , sizeof ( psock ) , & psock , sizeof ( psock ) , & len , NULL ) = = 0 ) {
if ( DeviceIoControl ( dev - > tun_fd , TAP_IOCTL_CONFIG_DHCP_MASQ , & psock ,
sizeof ( psock ) , & psock , sizeof ( psock ) , & len , NULL )
= = 0 )
{
int errcode = GetLastError ( ) ;
int errcode = GetLastError ( ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
@ -296,19 +354,23 @@ tuntap_sys_set_ipv4(struct device *dev, t_tun_in_addr *s, uint32_t mask) {
}
}
int
int
tuntap_sys_set_ipv6 ( struct device * dev , t_tun_in6_addr * s , uint32_t mask ) {
tuntap_sys_set_ipv6 ( struct device * dev , t_tun_in6_addr * s , uint32_t mask )
{
( void ) dev ;
( void ) dev ;
( void ) s ;
( void ) s ;
( void ) mask ;
( void ) mask ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_sys_set_ipv6() " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_sys_set_ipv6() " ) ;
return - 1 ;
return - 1 ;
}
}
int
int
tuntap_read ( struct device * dev , void * buf , size_t size ) {
tuntap_read ( struct device * dev , void * buf , size_t size )
{
DWORD len ;
DWORD len ;
if ( ReadFile ( dev - > tun_fd , buf , ( DWORD ) size , & len , NULL ) = = 0 ) {
if ( ReadFile ( dev - > tun_fd , buf , ( DWORD ) size , & len , NULL ) = = 0 )
{
int errcode = GetLastError ( ) ;
int errcode = GetLastError ( ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
@ -319,10 +381,12 @@ tuntap_read(struct device *dev, void *buf, size_t size) {
}
}
int
int
tuntap_write ( struct device * dev , void * buf , size_t size ) {
tuntap_write ( struct device * dev , void * buf , size_t size )
{
DWORD len ;
DWORD len ;
if ( WriteFile ( dev - > tun_fd , buf , ( DWORD ) size , & len , NULL ) = = 0 ) {
if ( WriteFile ( dev - > tun_fd , buf , ( DWORD ) size , & len , NULL ) = = 0 )
{
int errcode = GetLastError ( ) ;
int errcode = GetLastError ( ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
tuntap_log ( TUNTAP_LOG_ERR , ( const char * ) formated_error ( L " %1%0 " , errcode ) ) ;
@ -333,41 +397,51 @@ tuntap_write(struct device *dev, void *buf, size_t size) {
}
}
int
int
tuntap_get_readable ( struct device * dev ) {
tuntap_get_readable ( struct device * dev )
{
( void ) dev ;
( void ) dev ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_get_readable() " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_get_readable() " ) ;
return - 1 ;
return - 1 ;
}
}
int
int
tuntap_set_nonblocking ( struct device * dev , int set ) {
tuntap_set_nonblocking ( struct device * dev , int set )
{
( void ) dev ;
( void ) dev ;
( void ) set ;
( void ) set ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_set_nonblocking() " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_set_nonblocking() " ) ;
return - 1 ;
return - 1 ;
}
}
int
int
tuntap_set_debug ( struct device * dev , int set ) {
tuntap_set_debug ( struct device * dev , int set )
{
( void ) dev ;
( void ) dev ;
( void ) set ;
( void ) set ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_set_debug() " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_set_debug() " ) ;
return - 1 ;
return - 1 ;
}
}
int
int
tuntap_set_descr ( struct device * dev , const char * descr ) {
tuntap_set_descr ( struct device * dev , const char * descr )
{
( void ) dev ;
( void ) dev ;
( void ) descr ;
( void ) descr ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_set_descr() " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_set_descr() " ) ;
return - 1 ;
return - 1 ;
}
}
int
int
tuntap_set_ifname ( struct device * dev , const char * name ) {
tuntap_set_ifname ( struct device * dev , const char * name )
{
/* TODO: Check Windows API to know how to rename an interface */
/* TODO: Check Windows API to know how to rename an interface */
( void ) dev ;
( void ) dev ;
( void ) name ;
( void ) name ;
tuntap_log ( TUNTAP_LOG_NOTICE , " Your system does not support tuntap_set_ifname() " ) ;
tuntap_log ( TUNTAP_LOG_NOTICE ,
" Your system does not support tuntap_set_ifname() " ) ;
return - 1 ;
return - 1 ;
}
}