Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 25.06.2011, 19:06   #1
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию RasApi, vpn, проблема с размером структуры

Здраствуйте.
Задача создать vpn-подключение средствами ras. Много читал про то как это сделать. В результате появился такой код:

Код:
#include <windows.h>
#include <ras.h>
#include <tchar.h>

#pragma comment (lib, "RASAPI32.lib")

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow)
{

	RASENTRYW  re;
    DWORD     dwFlags;
    DWORD     dwFlags2;
	DWORD     dwSize;

    dwSize = sizeof(RASENTRY);
	memset(&re, 0, dwSize);

    dwFlags = RASEO_PreviewUserPw |RASEO_ModemLights |RASEO_ShowDialingProgress |
	          RASEO_RemoteDefaultGateway |RASEO_RequireEncryptedPw |
              RASEO_RequireDataEncryption |RASEO_RequireMsEncryptedPw;

    dwFlags2 = RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;

	re.dwSize = dwSize;

    re.dwfOptions =dwFlags;
    re.dwfOptions2 = dwFlags2;

	re.dwfNetProtocols = RASNP_Ip;
	re.dwFramingProtocol = RASFP_Ppp;
    re.dwType=RASET_Vpn;
	re.dwVpnStrategy = VS_Default;
	re.dwEncryptionType = ET_None;
	re.dwDialMode = RASEDM_DialAll;

    re.dwRedialCount = 3;
    re.dwRedialPause = 60;

    lstrcpyW(re.szDeviceType, _T("vpn"));
    lstrcpyW(re.szLocalPhoneNumber, _T("my.vpn.server.ru"));

	if (RasSetEntryPropertiesW(NULL, _T("myVPN"), &re,dwSize, NULL, 0))
	{

	   MessageBox(0,_T("ошибка RasSetEntryProperties"), 0,MB_ICONWARNING);
	}
	   else MessageBox(0,_T("подключение создалось"),_T("Ok"),MB_OK);

	return 0;
}
Но, функция RasSetEntryPropertiesW возвращает ошибку 632(278h), т.е. не правильно передается размер структуры. В самом коде ошибок и логике нет. Подскажите, почему такая ошибка и как это исправить?

добавленно:
ОС: WinXp
компилятор: VisualStudio 2008
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 25.06.2011 в 19:18. Причина: добавленно
MalCer вне форума Ответить с цитированием
Старый 25.06.2011, 19:50   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

Код:
dwSize = sizeof(RASENTRY)
почему типы разные?
Код:
#include <windows.h>
#include <ras.h>
#include <tchar.h>

#pragma comment (lib, "RASAPI32.lib")

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow)
{

	RASENTRYW  re;
	memset(&re, 0, sizeof(re));
	re.dwSize = sizeof(re);
    re.dwfOptions =RASEO_PreviewUserPw |RASEO_ModemLights |RASEO_ShowDialingProgress |
	          RASEO_RemoteDefaultGateway |RASEO_RequireEncryptedPw |
              RASEO_RequireDataEncryption |RASEO_RequireMsEncryptedPw;
    re.dwfOptions2 = RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;
	re.dwfNetProtocols = RASNP_Ip;
	re.dwFramingProtocol = RASFP_Ppp;
    re.dwType=RASET_Vpn;
	re.dwVpnStrategy = VS_Default;
	re.dwEncryptionType = ET_None;
	re.dwDialMode = RASEDM_DialAll;
    re.dwRedialCount = 3;
    re.dwRedialPause = 60;
    lstrcpyW(re.szDeviceType, _T("vpn"));
    lstrcpyW(re.szLocalPhoneNumber, _T("my.vpn.server.ru"));
	if (RasSetEntryPropertiesW(NULL, _T("myVPN"), &re,dwSize, NULL, 0))
	{

	   MessageBox(0,_T("ошибка RasSetEntryProperties"), 0,MB_ICONWARNING);
	}
	   else MessageBox(0,_T("подключение создалось"),_T("Ok"),MB_OK);
	return 0;
}
попробуйте так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.06.2011, 19:58   #3
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

так тоже не работает. Есть идеи?
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 25.06.2011, 20:37   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

думаю стоит пройтись по списку обязательных полей RASENTRY (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx).
f.hump вне форума Ответить с цитированием
Старый 25.06.2011, 20:50   #5
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Спасибо за ответ. Попробовал как вы сказали, добавил
Код:
	lstrcpyW(re.szDeviceName, RASDT_Vpn);
Результат к сожалению все тот же :-)
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 25.06.2011, 21:33   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

ну, тогда рекоммендую воспользоваться RasGetEntryProperties для определения размера буфера.

например:

RasGetEntryProperties(0,0,0,&bufSiz e,0,0);

потом, наверное, проверить, что bufSize не 0, и передать его в RasSetEntryProperties
f.hump вне форума Ответить с цитированием
Старый 25.06.2011, 22:35   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Я не понял смысла, если честно Так что ли?
Код:
RasGetEntryProperties(0, 0, 0, &dwSize, 0, 0);
if (dwSize == 0)
{
    MessageBox(0,_T("неудача"), 0,MB_ICONWARNING);
}
else
	if (RasSetEntryPropertiesW(NULL, _T("myVPN"), &re,dwSize, NULL, 0))
{
....
}
Тогда буфер в любом случае будет не ненулевым
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 25.06.2011, 22:53   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию


да. в инструкции были намеки на какие-то различия в версиях структуры, поэтому, на мой взгляд, спросить какой размер буфера нужен - неплохой вариант.
а re.dwSize инициализировать с sizeof(RASENTRY)

Последний раз редактировалось f.hump; 25.06.2011 в 22:56.
f.hump вне форума Ответить с цитированием
Старый 26.06.2011, 00:41   #9
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

f.hump, огромное спасибо!!! Прям как вы и сказали на счет буфера. Работающий код прилагаю:
Код:
#include <windows.h>
#include <ras.h>
#include <tchar.h>

#pragma comment (lib, "RASAPI32.lib")

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow)
{
	RASENTRYW  re;
    DWORD      dwFlags;
    DWORD      dwFlags2;
	DWORD      dwSize;
	DWORD      SizeInfo;

    dwSize = sizeof(RASENTRY);

	RasGetEntryProperties(0, 0, 0, &SizeInfo, 0, 0);
   if (SizeInfo < dwSize)
   {
	   dwSize = SizeInfo;
   }


	memset(&re, 0, dwSize);

    dwFlags = RASEO_PreviewUserPw |RASEO_ModemLights |RASEO_ShowDialingProgress |
	          RASEO_RemoteDefaultGateway |RASEO_RequireEncryptedPw |
              RASEO_RequireDataEncryption |RASEO_RequireMsEncryptedPw;

    dwFlags2 = RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;

	re.dwSize = dwSize;

    re.dwfOptions =dwFlags;
    re.dwfOptions2 = dwFlags2;

	re.dwfNetProtocols = RASNP_Ip;
	re.dwFramingProtocol = RASFP_Ppp;
    re.dwType=RASET_Vpn;
	re.dwVpnStrategy = VS_Default;
	re.dwEncryptionType = ET_Optional;
	re.dwDialMode = RASEDM_DialAll;

    re.dwRedialCount = 3;
    re.dwRedialPause = 60;

    lstrcpyW(re.szDeviceType, _T("vpn"));
    lstrcpyW(re.szLocalPhoneNumber, _T("my.vpn.server.ru"));
	lstrcpyW(re.szDeviceName, RASDT_Vpn);

	if (RasSetEntryPropertiesW(NULL, _T("myVPN"), &re,dwSize, NULL, 0))
	{

	   MessageBox(0,_T("ошибка RasSetEntryProperties"), 0,MB_ICONWARNING);
	}
	   else MessageBox(0,_T("подключение создалось"),_T("Ok"),MB_OK);

	return 0;
}
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 23.02.2012, 09:04   #10
LEX38RUS
Новичок
Джуниор
 
Регистрация: 23.02.2012
Сообщений: 1
По умолчанию Перевод на PureBasic

Народ кто нибудь может помочь перевести код на PureBasic! Как только не пробовал, но всегда возврощает код ошибки 623
Если надо могу выложить то, как я пробовал переводить!
LEX38RUS вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задана матрица размером n x m и вектор размером m Alexan88 Общие вопросы C/C++ 3 20.12.2010 16:01
проблема с VPN patch Помощь студентам 4 11.05.2010 14:31
Как наложить иконку с исходным размером 16х16 на битмап с размером 32х32? SkAndrew Мультимедиа в Delphi 1 26.04.2008 13:44
Проблема с размером :) Exel_Wild Microsoft Office Excel 5 14.04.2008 11:47
Помогите с RasApi !!! Dmitriy_010 Работа с сетью в Delphi 1 10.05.2007 08:22


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840