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



Reply via email to