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); }