Hi guy,
i ve am writing a Win32 app that makes use of TAP
drivers bundled with OpenVPN.
I ve looked at tun.c to understand how control and mange
the virtual interface, but i ve a big problem:
i can open the device, read driver verion, mtu etcc...
but when i try to read the data submitted by the os
with a ReadFile call, i obtain corrupted packets.
Now, my tap interface has to receive ipv6 traffic, but
when i call ping6 on it, the buffer i read with ReadFile
is smaller (86 bytes vs 216) and differend from
a correct buffer i read under linux (where all works).
I post the code i use to open the device and read it,
can someone take a look and tell me if i ve missing
something ? thanks!!!
--------------------------------------------
int device_number = 0;
while (true)
{
device_guid = get_unspecified_device_guid (device_number,
guid_buffer,
sizeof (guid_buffer),
tap_reg,
panel_reg,
&gc);
if (!device_guid)
printf("All TAP-Win32 adapters on this system are currently in
use.");
/* Open Windows TAP-Win32 adapter */
sprintf(device_path,
"%s%s%s",USERMODEDEVICEDIR,device_guid,TAPSUFFIX);
user_data.tunFile = CreateFile (
device_path,
GENERIC_READ | GENERIC_WRITE,
0, /* was: FILE_SHARE_READ */
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_SYSTEM,
0
);
if (user_data.tunFile == INVALID_HANDLE_VALUE)
printf("CreateFile failed on TAP device: %s\n", device_path);
else
{
printf("CreateFile succeedeed on TAP device: %s\n",
device_path);
break;
}
device_number++;
}
actual_name = string_alloc (guid_buffer, NULL);
printf("TAP-WIN32 device [%s] opened\n\tpath: %s\n", actual_name, device_path);
/* Get drivers version */
ULONG info[3];
CLEAR (info);
if (DeviceIoControl (user_data.tunFile, TAP_IOCTL_GET_VERSION,&info,
sizeof (info),&info, sizeof (info), &len, NULL))
{
printf("TAP-Win32 Driver Version %d.%d %s\n",(int) info[0],(int)
info[1],(info[2] ? "(DEBUG)" : ""));
}
if ( !(info[0] > TAP_WIN32_MIN_MAJOR || (info[0] == TAP_WIN32_MIN_MAJOR &&
info[1] >= TAP_WIN32_MIN_MINOR)) )
printf("ERROR: This version of the program requires a TAP-Win32
driver");
/* get driver MTU */
ULONG mtu;
if (DeviceIoControl (user_data.tunFile, TAP_IOCTL_GET_MTU,&mtu, s izeof
(mtu),&mtu, sizeof (mtu), &len, NULL))
printf("TAP-Win32 MTU=%d\n", (int) mtu);
/* set driver media status to 'connected' */
ULONG status = TRUE;
if (!DeviceIoControl(user_data.tunFile,TAP_IOCTL_SET_MEDIA_STATUS,
&status, sizeof (status),&status, sizeof (status), &len, NULL))
printf("WARNING: The TAP-Win32 driver rejected th call");
else
printf("The TAP-Win32 driver accepted the
TAP_IOCTL_SET_MEDIA_STATUS DeviceIoControl call.\n");
/* READ ON DEVICE TAP 1 */
status = ReadFile(
user_data.tunFile,
buffer, // <-- here is the error
2000,
&dwBytesRead,
NULL
);
____________________________________________________________
6X velocizzare la tua navigazione a 56k? 6X Web Accelerator di Libero!
Scaricalo su INTERNET GRATIS 6X http://www.libero.it