A
A
Alexander Karabanov2013-05-08 14:18:48
C++ / C#
Alexander Karabanov, 2013-05-08 14:18:48

PPPoE setup. Part of the code is not working?

There was a need to write a small utility that can set up a PPPoE connection. I "googled" some sources from which I highlighted the following code:
This is a prototype ;-)

#include <windows.h>

#include <Ras.h>
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#pragma comment(lib, "rasapi32.lib")
#pragma comment(lib, "Mpr.lib")

#include <windowsx.h>
#include <Winerror.h>
#include <Ras.h>
#include <shellapi.h>
#include <commdlg.h>
#include <rasdlg.h>
#include <raserror.h>
#include <commctrl.h>
#include <string>
#include <sstream>

#include <stdio.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <stdint.h>

using namespace std;

#define CONN_NAME "Provider_NAME"
#define LOGIN "login0000"
#define PASSWORD "pass00000000"
 
void main()
{
        // Настраиваем PPPoE соединение
  RASENTRY RS;
  memset(&RS, 0, sizeof(RASENTRY));
  RS.dwSize = sizeof(RS);
  RS.dwfOptions =
  RASEO_PreviewUserPw |           // Запрашивать имя пользователя и пароль
  RASEO_ModemLights |             // Вывести значёк в область уведомлений
  // RASEO_PreviewDomain |        // отображать поле "Домен" в окне ввода пользователя и пароля (вкладка "Параметры" - установить флажок "Включать домен входа в Windows")
    // RASEO_PreviewPhoneNumber |   // отображать выпадающий список "Набрать" в окне ввода пользователя и пароля
  RASEO_ShowDialingProgress |     // вкладка "Параметры" - Параметры набора номера: установить флажок "Отображать ход подключения"
  RASEO_RemoteDefaultGateway |    // вкладка "Сеть" - "Протокол Интернета (TCP/IP)" - кнопка "Дополнительно" - установить флажок "Использовать основной шлюз в удаленной сети"
  RASEO_SwCompression |           // вкладка "Сеть" - кнопка "Параметры" - установить флажок "Использовать программное сжатие данных"
  // RASEO_RequirePAP |           // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Незашифрованный пароль (PAP)"
  // RASEO_RequireSPAP |          // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Shiva (SPAP)"
  RASEO_RequireCHAP |             // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля CHAP"
  // RASEO_RequireMsCHAP |        // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP)"
  // RASEO_RequireW95MSCHAP |     // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Разрешить старый протокол MS-CHAP для Windows 95"
  //RASEO_RequireMsCHAP2 |        // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP v2)"
  RASEO_SecureLocalFiles;         // вкладка "Сеть" - Компоненты, используемые этим подключением: снять флажок "Использовать основной шлюз в удаленной сети";
  RS.dwfOptions2 = RASEO2_Internet | RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;
  RS.dwIdleDisconnectSeconds = RASIDS_Disabled; // Не отключаться если нет активности
  RS.dwfNetProtocols = RASNP_Ip;             // протоколы Интернета
  RS.dwFramingProtocol = RASFP_Ppp;          // протокол Point-to-Point Protocol
  RS.dwType = RASET_Broadband;               // тип подключения
  RS.dwVpnStrategy = VS_Default;             // вкладка "Сеть" - По умолчанию
  RS.dwEncryptionType = ET_Optional;         // параметры шифрования (ET_None, ET_Require, ET_RequireMax, ET_Optional)
  RS.dwDialMode = RASEDM_DialAll;
  RS.dwRedialCount = 99;                     // число повторов набора номера
  RS.dwRedialPause = 60;                     // интервал между повторениями
  lstrcpy(RS.szLocalPhoneNumber, TEXT("service"));
  lstrcpy(RS.szDeviceType, RASDT_PPPoE);     // RASDT_PPPoE - обуславливает тип подключения (PPPoE)
  lstrcpy(RS.szDeviceName, TEXT("PPPoE"));

  DWORD dwRet = RasSetEntryProperties(NULL,TEXT(CONN_NAME), &RS, sizeof(RS), NULL, 0);
    
  switch (dwRet)
  {
  case ERROR_ACCESS_DENIED:
    printf("The user does not have the correct privileges. Only an administrator can complete this task.\n");
    break;
  case ERROR_BUFFER_OVERFLOW:
    printf("The address or buffer specified by lpRasEntry is invalid.\n");
    break;
  case ERROR_CANNOT_OPEN_PROFILE:
    printf("The phone book is corrupted or missing components.\n");
    break;
  case ERROR_INVALID_PARAMETER:
    printf("The RASENTRY structure pointed to by the lpRasEntry parameter does not contain adequate information. See the description for lpRasEntry to see what information is required.\n");
    break;
  case ERROR_SUCCESS:
      printf("Create succeeds.\n");
    break;
  }

    // Прописываем логин и пароль    
    RASDIALPARAMS RS_param;
    memset(&RS_param, 0, sizeof(RASDIALPARAMS));
    RS_param.dwSize = sizeof(RS_param);
    lstrcpy(RS_param.szEntryName, TEXT(CONN_NAME));
    lstrcpy(RS_param.szPhoneNumber,  NULL);
    lstrcpy(RS_param.szCallbackNumber,  TEXT(""));
    lstrcpy(RS_param.szUserName,  TEXT(LOGIN));
    lstrcpy(RS_param.szPassword,  TEXT(PASSWORD));
    lstrcpy(RS_param.szDomain,  TEXT(""));
    RS_param.dwSubEntry = 0;
    RS_param.dwCallbackId = 0;

  

  DWORD dwParam = RasSetEntryDialParams(NULL, &RS_param, FALSE);
  
  switch (dwParam)
  {
  case ERROR_BUFFER_INVALID:
    printf("The address or buffer specified by lprasdialparams is invalid.\n");
    break;
  case ERROR_CANNOT_OPEN_PHONEBOOK:
    printf("The phone book is corrupted or missing components.\n");
    break;
  case ERROR_CANNOT_FIND_PHONEBOOK_ENTRY:
    printf("The phone-book entry does not exist.\n");
    break;
  case ERROR_SUCCESS:
    printf("Login add succeeds.\n");
    break;
  }
  
  Sleep(3000);

}

The above code compiles and runs successfully. A workable PPPoE connection really appears among the network interfaces, but the login and password are not registered, that is, the code that is responsible for setting the login and password does not work and I don’t understand why.
Help me solve this problem please. Windows 7 , Visual Studio 2012
are used . PS I'm not a programmer by occupation at all, and perhaps that's why I don't notice something obvious that prevents this code from working correctly?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Alexander Karabanov, 2013-05-08
@karabanov

SUDDENLY!
Installed all the updates for Visual Studio 2012 and the code started working as it should.
Ndaa ...
Microsoft products are such products.
Such a simple code, consisting entirely of ...
Oh, well, them. I'll go and finish this utility as soon as possible and install GNU/Linux back.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question