На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> драйвер winring0
    Всем привет. Скачал исходник winring0, хочу портировать dll в delphi, возникли вопросы.

    непонятна функция:
    ExpandedWrap disabled
      DWORD GetRefCount()
      {
          if(gHandle == INVALID_HANDLE_VALUE)
          {
              return 0;
          }
       
          DWORD refCount;
          DWORD length, result;
       
          refCount = 0;
       
          result = DeviceIoControl(
                              gHandle,
                              IOCTL_OLS_GET_REFCOUNT,
                              NULL,
                              0,
                              &refCount,
                              sizeof(refCount),
                              &length,
                              NULL
                              );
          if(! result)
          {
              refCount = 0;
          }
       
          return refCount;
      }

    используется один раз при выгрузке драйвера, гугл как-то скудно намекнул, что это проверка какого-то счётчика чего-то, что за счётчик?

    И ещё один архиважный вопрос, как запускать драйверы в win7 x64, сам драйвер подписан, при попытке запустить его из любой папки ошибка доступа, запуск из SysWOW64\drivers нормально. В исходниках есть пример использования драйвера, он нормально запускает драйвер из любой папки.
      Судя по коду в драйвере, это просто счетчик открытия и закрытия самого драйвера, вот вся работа с ним:

      ExpandedWrap disabled
                case IRP_MJ_CREATE:
                    if(refCount != (ULONG)-1){refCount++;}
                    status = STATUS_SUCCESS;
                    break;
                case IRP_MJ_CLOSE:
                    if(refCount != (ULONG)-1){refCount--;}
                    status = STATUS_SUCCESS;
                    break;
         
                case IRP_MJ_DEVICE_CONTROL:
                    //  Dispatch on IOCTL
                    switch(pIrpStack->Parameters.DeviceIoControl.IoControlCode)
                    {
                    case IOCTL_OLS_GET_REFCOUNT:
                        *(PULONG)pIrp->AssociatedIrp.SystemBuffer = refCount;
                        pIrp->IoStatus.Information = sizeof(refCount);
                        status = STATUS_SUCCESS;
                        break;


      Логика простая, при закрытии драйвера проверяем, открывал ли его еще кто либо? Если нет, то выгружаем драйвер из памяти.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0262 ]   [ 17 queries used ]   [ Generated: 28.03.24, 10:26 GMT ]