Всем привет! У меня некое продолжение закрытой темы (
http://www.rsdn.ru/forum/network/3842938.1Автор: MikelSV
Дата: 14.06.10
).
Я сейчас пробую работать с OpenVPN драйвером виртуального адаптера под Виндой из консольного приложения,
пытаюсь открыть его и выставить флаг коннекта (TAP_IOCTL_SET_MEDIA_STATUS), чтобы можно было посылать/принимать данные на его интерфейсе.
Почему-то вызов DeviceIoControl(TAP_IOCTL_SET_MEDIA_STATUS) возвращает ошибку "ERROR_INVALID_FUNCTION"(1).
Тестирую пока на WinXP SP3 (x32), но надо, чтобы код работал и на других виндах...
#define TAP_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE (6, METHOD_BUFFERED)
HANDLE tap = INVALID_HANDLE_VALUE;
GetAdaptersAddresses(...);
if (!_wcsicmp(MY_VNIC_DEVICE_NAME, a->FriendlyName))
{
std::string dn("\\\\.\\Global\\");
dn += a->AdapterName;
//dn += ".tap"; // С суффиксом не открывается!
cout << "device name to open is: " << dn.c_str() << endl;
tap = CreateFileA(dn.c_str(),
MAXIMUM_ALLOWED,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED,
NULL
);
if (INVALID_HANDLE_VALUE == tap)
{
cout<<"Failed to open device!\n"<<endl;
}
else
{
cout<<"Device opened...\n"<<endl;
DWORD len=0;
DWORD uState = TRUE, uOut = FALSE;
if (!::DeviceIoControl(tap, TAP_IOCTL_SET_MEDIA_STATUS,
&uState, sizeof(uState),
&uOut, sizeof(uOut),
&len, NULL))
{
int nErr = ::GetLastError(); // ТУТ ВОЗВРАЩАЕТ "1"!
cout << "DeviceIoControl(): Error = " << nErr << endl;
cout << "WARNING: The TAP-Win32 driver rejected a TAP_IOCTL_SET_MEDIA_STATUS DeviceIoControl call.\n";
}
...
}
}
Подскажите, в чём причина ошибки и где посмотреть ещё инфу / примеры работы с этим драйвером...