Hello!!!
Im trying to read ethernet frames with virtual TAP driver, but it doesn't work.
When I try to read using readfile function it returns with 0 and the last error 
code is 83 Incorrect parameter.
Could you help me please??
Thank's
There is the code.


// ConsoleApplication4.cpp: define el punto de entrada de la aplicación de 
consola.
//
#define UNICODE 1#define _UNICODE 1
#include "stdafx.h"
#include <windows.h>
#include <winioctl.h>#include <stdio.h>#include <strsafe.h>
#define deviceTap L"\\\\.\\Global\\{1C112F19-B3DD-4846-B9BA-A433F3A36ADB}.tap"


#define FILE_DEVICE_UNKNOWN             0x00000022
#define TAP_CONTROL_CODE(request,method) \      CTL_CODE(FILE_DEVICE_UNKNOWN, 
request, method, FILE_ANY_ACCESS)

#define TAP_WIN_CONTROL_CODE(request, method) \ CTL_CODE(FILE_DEVICE_UNKNOWN, 
request, method, FILE_ANY_ACCESS)
#define TAP_IOCTL_GET_VERSION           TAP_CONTROL_CODE (2, METHOD_BUFFERED)
#define TAP_IOCTL_SET_MEDIA_STATUS      TAP_CONTROL_CODE (6, 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_INFO              TAP_CONTROL_CODE(4, 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_GET_LOG_LINE          TAP_CONTROL_CODE(8, METHOD_BUFFERED) 
#define TAP_IOCTL_CONFIG_DHCP_SET_OPT   TAP_CONTROL_CODE(9, METHOD_BUFFERED) 
#define TAP_WIN_IOCTL_GET_MAC               TAP_WIN_CONTROL_CODE(1, 
METHOD_BUFFERED)
 #define TAP_WIN_IOCTL_GET_VERSION           TAP_WIN_CONTROL_CODE(2, 
METHOD_BUFFERED) #define TAP_WIN_IOCTL_GET_MTU               
TAP_WIN_CONTROL_CODE(3, METHOD_BUFFERED) #define TAP_WIN_IOCTL_GET_INFO         
     TAP_WIN_CONTROL_CODE(4, METHOD_BUFFERED)
 #define TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT TAP_WIN_CONTROL_CODE(5, 
METHOD_BUFFERED) #define TAP_WIN_IOCTL_SET_MEDIA_STATUS      
TAP_WIN_CONTROL_CODE(6, METHOD_BUFFERED) #define TAP_WIN_IOCTL_CONFIG_DHCP_MASQ 
     TAP_WIN_CONTROL_CODE(7, METHOD_BUFFERED)
 #define TAP_WIN_IOCTL_GET_LOG_LINE          TAP_WIN_CONTROL_CODE(8, 
METHOD_BUFFERED) #define TAP_WIN_IOCTL_CONFIG_DHCP_SET_OPT   
TAP_WIN_CONTROL_CODE(9, METHOD_BUFFERED)
#define TAP_WIN_IOCTL_CONFIG_TUN            TAP_WIN_CONTROL_CODE (10, 
METHOD_BUFFERED)


void DisplayError(LPTSTR lpszFunction)// Routine Description:// Retrieve and 
output the system error message for the last-error code{   LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;    DWORD dw = GetLastError();
        FormatMessage(
                FORMAT_MESSAGE_ALLOCATE_BUFFER |                
FORMAT_MESSAGE_FROM_SYSTEM |            FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,           dw,             MAKELANGID(LANG_NEUTRAL, 
SUBLANG_DEFAULT),              (LPTSTR)&lpMsgBuf,
                0,              NULL);
        lpDisplayBuf =          (LPVOID)LocalAlloc(LMEM_ZEROINIT,
                (lstrlen((LPCTSTR)lpMsgBuf)             + 
lstrlen((LPCTSTR)lpszFunction)                + 40) // account for format string
                * sizeof(TCHAR));
        if (FAILED(StringCchPrintf((LPTSTR)lpDisplayBuf,                
LocalSize(lpDisplayBuf) / sizeof(TCHAR),
                TEXT("%s failed with error code %d as follows:\n%s"),           
lpszFunction,           dw,
                lpMsgBuf)))     {               printf("FATAL ERROR: Unable to 
output error code.\n");
        }
        _tprintf(TEXT("ERROR: %s\n"), (LPCTSTR)lpDisplayBuf);
        LocalFree(lpMsgBuf);
        LocalFree(lpDisplayBuf);};
BOOL GetTapDriver(LPWSTR device_guid){  // Handle al controlador.
        HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be 
examined   BOOL bResult = FALSE;                 // results flag
        DWORD junk = 0;                     // discard results  hDevice = 
CreateFileW(device_guid,          // drive to open
                GENERIC_READ | GENERIC_WRITE,           0, /* was: 
FILE_SHARE_READ */           0,
                OPEN_EXISTING,          FILE_ATTRIBUTE_SYSTEM | 
FILE_FLAG_OVERLAPPED,           0);

        if (hDevice == INVALID_HANDLE_VALUE)    // cannot open the drive        
{               return (FALSE);
        }
        // Versión del controlador.     unsigned long info[3] = { 0, 0, 0 };
        DWORD len;      bResult = DeviceIoControl(hDevice,                      
 // device to be queried                TAP_IOCTL_GET_VERSION,
                &info,          sizeof(info),           &info,          
sizeof(info),
                &len,           NULL);
        printf("version: %i.%i.%i\n", info[0], info[1], info[2]);

        // Tamaño del bufer de transmision y recepción. ULONG mtu;      if 
(DeviceIoControl(hDevice, TAP_WIN_IOCTL_GET_MTU,
                &mtu, sizeof (mtu),             &mtu, sizeof (mtu), &len, 
NULL))        {
                printf("TAP-Windows MTU=%d  \n", (int)mtu);     }
        unsigned long ep[3];

        // Modo de funcionamiento.              if (!DeviceIoControl(hDevice, 
TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT,
                        ep, sizeof (ep),                        ep, sizeof 
(ep), &len, NULL))                   printf("Error al configurar punto a 
punto.");

        unsigned char MAC_Adr[6] = { 0, 0, 0, 0, 0, 0 };        
DeviceIoControl(hDevice, TAP_WIN_IOCTL_GET_MAC, &MAC_Adr, sizeof(MAC_Adr), 
&MAC_Adr, sizeof(MAC_Adr), &len, NULL);
        printf(("El codigo MAC del adaptador es: %d %d %d %d %d %d \n"), 
MAC_Adr[0], MAC_Adr[1], MAC_Adr[2], MAC_Adr[3], MAC_Adr[4], MAC_Adr[5]);

        // Activamos la interfaz.       ULONG status = TRUE;    if 
(!DeviceIoControl(hDevice, TAP_WIN_IOCTL_SET_MEDIA_STATUS,
                &status, sizeof (status),               &status, sizeof 
(status), &len, NULL))          printf("WARNING: The TAP-Windows driver 
rejected a TAP_WIN_IOCTL_SET_MEDIA_STATUS DeviceIoControl call.");

        DWORD longitud;         //printf("\n Longitud %d %d %d 
\n",&write_buf->capacity, &write_buf->len, &write_buf->offset);
        unsigned char m_buf[1500];      bResult = WriteFile(hDevice, m_buf, 20, 
&longitud, NULL);       if (bResult == 0){
                DisplayError(TEXT("WriteFile"));        }
        printf("Datos Escritos al adaptador: %d", longitud);

        //while (1){            bResult=ReadFile(hDevice, m_buf, 10, &longitud, 
NULL);  // Handle al dispositivo, puntero al buffer, 
                //bResult = ReadFile()          if (bResult == 0){              
        DisplayError(TEXT("ReadFile"));
                }               else            {
                };
                int i;          if (longitud > 0){                      
printf("Longitud leida: %i \n", longitud);
                        for (i = 0; i < longitud; i++){                         
printf("%i , %i", m_buf[i], i);                 }
                        printf("\n");           };      //};    
        CloseHandle(hDevice);
        while (1){};

        return (bResult);
}


int _tmain(int argc, wchar_t *argv[]){  BOOL bResult = FALSE;      // generic 
results flag

        bResult = GetTapDriver(deviceTap);
        if (bResult)    {
                wprintf(L"Ok"); }       else    {
                wprintf(L"GetDeviceTap failed %ld.\n", GetLastError()); }
        return ((int)bResult);
}
                                          


                                                                                
                                          

Reply via email to