На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Управление сервером уд. доступа , некоторые недокументированные ф-ии
      Вот некоторые выдержки из сайта RNA API.. Правда вызов функций описывается на Си, но я думаю на Дельфи ты перевести сможешь ^_^ ..

      //==================================================================//

      Здесь описаны некоторые недокументированные функции которые могут быть использованы для управления сервером удалённого доступа в системах Windows95/98.

      Когда я решил сделать прогу для управления dial-up сервером, я начал с того, что решил изучить, как работает родная виндовая панель управления сервером. Собственно диалог управления сервером (тот который вызывается из Dial-up networking ==> Connections ==> Dial-up server... либо щелчком по иконке в трее) находится в файле RNASERV.DLL. Как я быстро выяснил, в этом модуле по большому счёту ничего больше и нет, то есть это только контрольная панель, а собственно работа с сетью и модемами происходит где-то в другом месте. Для управления сервером RNASERV.DLL вызывает специальные функции из RASAPI32.dll, но не знакомые всем (и детально описанные в MSDN) функции RAS API (типа RasDial, имена их всех начинаются на «Ras»), а особые функции, имена которых начинаются на «Rna» и «Suprv», о которых в MSDN ничего нет. Всё, что мне там удалось отыскать, это упоминание о неком RNA API, в Windows 95 DDK. (RNA расшифровывается как «Remote Network Access») В DDK даже кратко описаны некоторые функции RNA API. Однако RNASERV.DLL всё равно использует совершенно другие RNA функции, о которых там нет ни слова.

      Пришлось рыть дальше. Поскольку я поставил себе достаточно конкретную задачу, написать приложение командной строки, заменяющее RNASERV.DLL, я не пытался разобраться во всём многообразье RNA API (в котором 61 функция), я изучил только самые необходимые функции, именно те, которые использует RNASERV.DLL. Далее приводится их описание.

      Функции RNA API:
      SuprvInitialize
      SuprvDeInitialize
      SuprvSetAccessInfo
      SuprvEnumAccessInfo
      SuprvGetAccessInfo
      RnaSMMInfoDialog
      SuprvRequest
      Структура:
      ACCESSINFO
      Структура ACCESSINFO
      struct ACCESSINFO {
      char m_szName[148];
      unsigned int m_flags; // bit 0 - "allow caller access"
      unsigned int m_field_98;
      char m_szProtocol[4];
      unsigned int m_field_A0[11];
      char m_szComment[256];
      unsigned int m_field_1CC;
      unsigned short m_accessNumber; // 0 - share level access
      unsigned short m_field_1D2;
      unsigned short m_field_1D4;
      unsigned short m_field_1D6;
      unsigned short m_field_1D8;
      };

      Эта структура используется функциями SuprvSetAccessInfo и SuprvGetAccessInfo. К сожалению, смысл многих полей остался неясен. Не исключено, что часть из них просто зарезервированы, поскольку в большинстве случаев просто равны нулю. Вот что удалось выяснить:

      m_szName – название устройства (модема или COM/LPT порта)

      m_flags – самое интересное для нас поле. Если младший его бит равен 1, RNA сервер для данного устройства включён, 0 — выключен.

      m_szProtocol – чаще всего это поле просто забито нулями, но иногда в нём обнаруживается строчка "PPP", что наводит на мысль, что это поле означает используемый протокол соединения. Более точно, к сожалению, сказать не могу.

      m_szComment – комментарий. Тот самый, что можно ввести в диалоге Dial-Up Server, в поле Comment.

      m_accessNumber – как минимум означает тип контроля за разграничением доступа к серверу. Если равен 0 — значит используется “share level access control”. При этом проверяется только пароль. Если не равен нулю — значит производится проверка имени пользователя и пароля, то есть “user level access control”. Что конкретно при этом означает сама цифра, надо ещё разобраться, возможно число зарегистрированных пользователей. Похоже на то, что с управлением доступом связаны и другие поля структуры, но используются они только при “user level access control”. Поскольку для контроля за доступом на уровне пользователей необходимо наличие в сети NT сервера (который собственно и выполняет аутентификацию) мне не удалось поэкспериментировать с целью разобраться в смысле этих полей.

      Функции
      Все нижеперечисленные функции экспортируются из модуля RASAPI32.DLL. Их имнена не декорированы. Все они используют стандартное (или «паскалевское») соглашение о вызовах.

      int __stdcall SuprvInitialize( HWND* _phWnd );
      Описание. Должна быть вызвана в первую очередь, перед тем, как вызывать какие-либо другие функции RNA API. Используется также для того, чтобы изменения конфигурации RNA сервера, внесённые с помощью SuprvSetAccessInfo немедленно вступили в силу.

      Параметры. Единственный параметр _phWnd указывает на дескриптор окошка, которое будет получать специальные сообщения о состоянии сервера.

      Возвращаемое значение. 0 — функция выполнена успешно. Не ноль — произошла ошибка.

      void __stdcall SuprvDeInitialize( void );
      Описание. Вызывается последней для завершения работы с RNA API. Каждому вызову SuprvInitialize должен соответствовать SuprvDeInitialize.

      Параметры. Нет.

      Возвращаемое значение. Нет.

      int __stdcall SuprvSetAccessInfo( ACCESSINFO* _pAccessInfoStruct );
      Описание. Самая интересная функция. Именно с помощью неё можно управлять сервером, в частности включить и выключить его. Состояние включён/выключен определяется младшим битом в поле m_flags структуры ACCESSINFO. RNASERV.DLL сразу после этой функции последовательно вызывает SuprvInitialize и SuprvDeInitialize. По-видимому, это требуется для того, чтобы внесённые изменения немедленно вступили в силу.

      Параметры. _pAccessInfoStruct указывает на структуру ACCESSINFO, для модема состояние которого надо изменить. Эту структуру лучше заполнить с помощью функции SuprvGetAccessInfo, а затем поменять в ней нужные параметры.

      Возвращаемое значение. ???

      void __stdcall SuprvEnumAccessInfo( char* _pStringsBuffer, int* _pStringsBufferSize, unsigned int* _pnStrings );
      Описание. Позволяет извлечь список устройств (модемов и COM/LPT портов).

      Параметры:

      _pStringsBuffer – указывает на буфер, куда должны быть помещены строки - названия устройств, разделённые нулевым символом. После последней строчки следуют два нулевых символа подряд. Этот параметр можно указать нулевым, что можно использовать для того, чтобы предварительно узнать требуемый размер буфера.

      _pStringsBufferSize – указывает на переменную, в которую помещается требуемый размер буффера. Если после вызова функции эта переменная оказалась <=1, значит произошла ошибка.

      _pnStrings – указывает на переменную, в которую будет помещено число устройств.

      Возвращаемое значение. Нет.

      int __stdcall SuprvGetAccessInfo( char* _pAccessInfoString, ACCESSINFO* _pBuffer, unsigned int* _pnBufferSize );
      Описание. Извлекает всю информацию об устройстве. Заполняет структуру ACCESSINFO, которую потом можно использовать в функции SuprvSetAccessInfo.

      Параметры:

      _pAccessInfoString – указывает на имя устройства.

      _pBuffer – Указывает на структуру ACCESSINFO, которую надо заполнить. Перед вызовом в ней следует заполнить имя устройства. _pBuffer можно указать нулевым, что разумно использовать для того, чтобы предварительно узнать размер структуры. (По-видимому, он может быть переменным).

      _pnBufferSize – Указывает на переменную, в которую помещается размер структуры ACCESSINFO.

      Возвращаемое значение. Точно не известно, но по-видимому ноль означает успешное завершение функции.

      int __stdcall RnaSMMInfoDialog( HWND _hwnd, DWORD _dwUnused, ACCESSINFO* _pAccInfo, char* _pszProtocol );
      Описание. Вызывает диалог "Server Type"

      Параметры:

      _hwnd – дескриптор родительского окна.

      _dwUnused – должно быть нулём.

      _pAccInfo – указатель на сруктуру ACCESSINFO. (Быть может достаточно просто указателя на имя устройства.)

      _pszProtocol – на название протокола. RNASERV.DLL при вызове этой функции просто помещает в этот параметр указатель на поле m_szProtocol структуры ACCESSINFO.

      Возвращаемое значение. А хрен его знает :-) Похоже на индикатор успешного завершения или ошибки.

      void __stdcall SuprvRequest( int _command, void* _arg2, DWORD _arg3 );
      Описание. Весьма интересная функция. Судя по всему, многоцелевая. Однако я разобрался лишь с одной её возможностью: разорвать соединение с подключившимся компьютером. До остального прямо скажем руки не дошли.

      Параметры:

      _command – код команды. Код «разорвать соединение» — 0x38.

      _arg2 и _arg3 – назначение этих аргументов зависит от команды. Для команды "разорвать соединение" в качестве _arg2 следует передать указатель на структуру ACCESSINFO (быть может опять-таки достаточно только имени), а _arg3 должен быть нулём.

      Возвращаемое значение. Отсутствует.

      //================================================================//
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0159 ]   [ 15 queries used ]   [ Generated: 17.05.24, 03:29 GMT ]