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