RASDial & COM port together
От: ZverA  
Дата: 22.09.04 06:04
Оценка:
Кто-нибудь пробовал работать с портом на котором сидит модем после того как с пом.RasDial была установлена связь
и порт занят. CreateFile не предлагать — не катит, доступа к порту нет. Можно получить handle порта в
ф-ции RasCustomScriptExecute(Windows XP and Windows 2000)
или в RasSetEntryProperties в параметр lpbDeviceInfo всунуть нужные данные с пом. TAPI.
Есть ли еще подход?
Задачка в том, чтобы сменить инициализационную строку
модема вместо, скажем установленной
AT+CGDCONT=1,"IP","internet.beeline.ru"
установить
AT+CGDCONT=1,"IP","internet.mts.ru"
Re: RASDial & COM port together
От: Protey Россия  
Дата: 22.09.04 07:33
Оценка:
Здравствуйте, ZverA, Вы писали:

ZA>Кто-нибудь пробовал работать с портом на котором сидит модем после того как с пом.RasDial была установлена связь

ZA>и порт занят. CreateFile не предлагать — не катит, доступа к порту нет. Можно получить handle порта в
ZA>ф-ции RasCustomScriptExecute(Windows XP and Windows 2000)
ZA>или в RasSetEntryProperties в параметр lpbDeviceInfo всунуть нужные данные с пом. TAPI.
ZA>Есть ли еще подход?
ZA>Задачка в том, чтобы сменить инициализационную строку
ZA>модема вместо, скажем установленной
ZA>AT+CGDCONT=1,"IP","internet.beeline.ru"
ZA>установить
ZA>AT+CGDCONT=1,"IP","internet.mts.ru"

Пользуйся, не совсем то, но ...


#define MODEM_CLASS "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E96D-E325-11CE-BFC1-08002BE10318}"
#define INIT_STR "AT+CGDCONT=1,\"IP\",\"internet.mts.ru\""


int INTERNPROC SetModemInfo(HKEY ModemKey)
{
  static const char Value[] = INIT_STR;

  return RegSetValueEx(ModemKey,
                           "UserInit",
                           NULL,
                           REG_SZ,
                           (LPBYTE)&Value[0],
                           CountOf(Value) - 1);
}

int INTERNPROC SetExtraDialParams(TIsrString DevName)
{
  HKEY  hKey;
  HKEY  ModemKey;
  int   I,Modems;

  char  KeyModemName[500];
  DWORD dwKeyNameSize;
  char  Value[500];
  DWORD dwValueSize;
  DWORD dwResult;

  dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
          MODEM_CLASS,
          0,
          KEY_READ,
          &hKey);

  if(dwResult == ERROR_SUCCESS){
    Modems = HowManySubKeys(hKey);

    if(Modems != -1){
      for(I=0;I<Modems;I++){
        dwKeyNameSize = sizeof(KeyModemName);
        if(RegEnumKeyEx(hKey,I,&KeyModemName[0],&dwKeyNameSize,NULL,NULL,NULL,NULL) == ERROR_SUCCESS){
          if(RegOpenKeyEx(hKey, &KeyModemName[0], 0, KEY_ALL_ACCESS, &ModemKey) != ERROR_SUCCESS) return 1;
        }
        else break;
       //Check and Set
        dwValueSize = sizeof(Value);
        
        dwResult = RegQueryValueEx(ModemKey,
        "FriendlyName",
        NULL,
        NULL,
        (LPBYTE)&Value[0],
        &dwValueSize);


        if(dwResult == ERROR_ACCESS_DENIED)
          return 1;

        if(dwResult != ERROR_SUCCESS)
          printf("\r\nError %s", LogWinErrorByCode(dwResult));
        else
          if(StrIComp(Value, DevName) == 0)
            SetModemInfo(ModemKey);
      }
    }
    else{
      printf("\r\nThis System have not modem(s)!");
    }
  }
  else{
          printf("No modem CLASSS : %s", MODEM_CLASS);
          printf("\r\nError %s", LogWinErrorByCode(dwResult));
  };
  return 0;
}


Хак кнэшнааа, но рабочий, даже везде
Re[2]: RASDial & COM port together
От: ZverA  
Дата: 22.09.04 07:58
Оценка:
Здравствуйте, Protey, Вы писали:

P>Здравствуйте, ZverA, Вы писали:


ZA>>Кто-нибудь пробовал работать с портом на котором сидит модем после того как с пом.RasDial была установлена связь

ZA>>и порт занят. CreateFile не предлагать — не катит, доступа к порту нет. Можно получить handle порта в
ZA>>ф-ции RasCustomScriptExecute(Windows XP and Windows 2000)
ZA>>или в RasSetEntryProperties в параметр lpbDeviceInfo всунуть нужные данные с пом. TAPI.
ZA>>Есть ли еще подход?
ZA>>Задачка в том, чтобы сменить инициализационную строку
ZA>>модема вместо, скажем установленной
ZA>>AT+CGDCONT=1,"IP","internet.beeline.ru"
ZA>>установить
ZA>>AT+CGDCONT=1,"IP","internet.mts.ru"

P>Пользуйся, не совсем то, но ...



P>
P>#define MODEM_CLASS "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E96D-E325-11CE-BFC1-08002BE10318}"
P>#define INIT_STR "AT+CGDCONT=1,\"IP\",\"internet.mts.ru\""


P>int INTERNPROC SetModemInfo(HKEY ModemKey)
P>{
P>  static const char Value[] = INIT_STR;

P>  return RegSetValueEx(ModemKey,
P>                           "UserInit",
P>                           NULL,
P>                           REG_SZ,
P>                           (LPBYTE)&Value[0],
P>                           CountOf(Value) - 1);
P>}

P>int INTERNPROC SetExtraDialParams(TIsrString DevName)
P>{
P>  HKEY  hKey;
P>  HKEY  ModemKey;
P>  int   I,Modems;

P>  char  KeyModemName[500];
P>  DWORD dwKeyNameSize;
P>  char  Value[500];
P>  DWORD dwValueSize;
P>  DWORD dwResult;

P>  dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
P>          MODEM_CLASS,
P>          0,
P>          KEY_READ,
P>          &hKey);

P>  if(dwResult == ERROR_SUCCESS){
P>    Modems = HowManySubKeys(hKey);

P>    if(Modems != -1){
P>      for(I=0;I<Modems;I++){
P>        dwKeyNameSize = sizeof(KeyModemName);
P>        if(RegEnumKeyEx(hKey,I,&KeyModemName[0],&dwKeyNameSize,NULL,NULL,NULL,NULL) == ERROR_SUCCESS){
P>          if(RegOpenKeyEx(hKey, &KeyModemName[0], 0, KEY_ALL_ACCESS, &ModemKey) != ERROR_SUCCESS) return 1;
P>        }
P>        else break;
P>       //Check and Set
P>        dwValueSize = sizeof(Value);
        
P>        dwResult = RegQueryValueEx(ModemKey,
P>        "FriendlyName",
P>        NULL,
P>        NULL,
P>        (LPBYTE)&Value[0],
P>        &dwValueSize);


P>        if(dwResult == ERROR_ACCESS_DENIED)
P>          return 1;

P>        if(dwResult != ERROR_SUCCESS)
P>          printf("\r\nError %s", LogWinErrorByCode(dwResult));
P>        else
P>          if(StrIComp(Value, DevName) == 0)
P>            SetModemInfo(ModemKey);
P>      }
P>    }
P>    else{
P>      printf("\r\nThis System have not modem(s)!");
P>    }
P>  }
P>  else{
P>          printf("No modem CLASSS : %s", MODEM_CLASS);
P>          printf("\r\nError %s", LogWinErrorByCode(dwResult));
P>  };
P>  return 0;
P>}
P>


P>Хак кнэшнааа, но рабочий, даже везде


Спасибо
Реестр менять к сожалению нельзя
Re[3]: RASDial & COM port together
От: Protey Россия  
Дата: 22.09.04 08:10
Оценка:
Здравствуйте, ZverA, Вы писали:

ZA>Спасибо

ZA>Реестр менять к сожалению нельзя

Ага, я так понял, что прога запускается под юзером без прав Админа, после чего делает RASDial и на ходу меняет GPRS оператора.
Тут гимор такой — ПОСЛЕ установленя PPP канала закинуть AT команду модему в общем случее низзя, т.к. далеко не ВСЕ модемы это поддерживают, там мысль такая — есть пакеты данных типа [flag]data[flag], всё что между [flag] — есть IP/LCP данные, остальное отбрасывается как глюк линии связи.

Короче АТ команду подать можна — только нужно делать RasDial со своей RasDialCllback процедурой, и ловить
RASCS_ConnectDevice,
RASCS_DeviceConnected,
RASCS_AllDevicesConnected,

Получить хендл COM порта здесь
Автор: vkilikov
Дата: 27.08.02
, закинуть требуемый стринг.
НО, ИМХО, это не будет работать на ВСЕХ модемах(кривые драйвера, кривой inf файл модема), надёжнее прямой записи в реесир нет ничего в Винде к сожалению
Re[4]: RASDial & COM port together
От: ZverA  
Дата: 22.09.04 08:56
Оценка:
Здравствуйте, Protey, Вы писали:

P>Здравствуйте, ZverA, Вы писали:


ZA>>Спасибо

ZA>>Реестр менять к сожалению нельзя

P>Ага, я так понял, что прога запускается под юзером без прав Админа, после чего делает RASDial и на ходу меняет GPRS оператора.

P>Тут гимор такой — ПОСЛЕ установленя PPP канала закинуть AT команду модему в общем случее низзя, т.к. далеко не ВСЕ модемы это поддерживают, там мысль такая — есть пакеты данных типа [flag]data[flag], всё что между [flag] — есть IP/LCP данные, остальное отбрасывается как глюк линии связи.

P>Короче АТ команду подать можна — только нужно делать RasDial со своей RasDialCllback процедурой, и ловить

P> RASCS_ConnectDevice,
P> RASCS_DeviceConnected,
P> RASCS_AllDevicesConnected,

P>Получить хендл COM порта здесь
Автор: vkilikov
Дата: 27.08.02
, закинуть требуемый стринг.

P>НО, ИМХО, это не будет работать на ВСЕХ модемах(кривые драйвера, кривой inf файл модема), надёжнее прямой записи в реесир нет ничего в Винде к сожалению

Спасибо, попробуем
Придется, видно перехватывать RegQueryValueEx
Re[5]: RASDial & COM port together
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.09.04 12:26
Оценка:
Здравствуйте, ZverA, Вы писали:

ZA>Придется, видно перехватывать RegQueryValueEx


А зачем эту функцию перехватывать ?
Re[6]: RASDial & COM port together
От: ZverA  
Дата: 23.09.04 04:51
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, ZverA, Вы писали:


ZA>>Придется, видно перехватывать RegQueryValueEx


PE>А зачем эту функцию перехватывать ?


А чтобы подменить строку настройки
Re[6]: RASDial & COM port together
От: ZverA  
Дата: 23.09.04 04:52
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, ZverA, Вы писали:


ZA>>Придется, видно перехватывать RegQueryValueEx


PE>А зачем эту функцию перехватывать ?

А чтобы подменить строку настройки
Re[7]: RASDial & COM port together
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.09.04 07:11
Оценка:
Здравствуйте, ZverA, Вы писали:

ZA>>>Придется, видно перехватывать RegQueryValueEx


PE>>А зачем эту функцию перехватывать ?

ZA>А чтобы подменить строку настройки

А что мешает заранее подставить эту строку инициализации ?
Re[8]: RASDial & COM port together
От: ZverA  
Дата: 23.09.04 09:03
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, ZverA, Вы писали:


ZA>>>>Придется, видно перехватывать RegQueryValueEx


PE>>>А зачем эту функцию перехватывать ?

ZA>>А чтобы подменить строку настройки

PE>А что мешает заранее подставить эту строку инициализации ?

Чтобы при каком-нибудь crash'e виндов юзеру не пришлось восстанавливать
то, что у него было
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.