Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Protect 
:(
    Опции темы
Barabeo
Дата 28.10.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Прочитал на сайте Подгорецкого про VirtualProtect:

При этом нельзя использовать эту функцию для двух смежных регионов памяти, которые были выделены при помощи двух различных вызовов VirtualAlloc или VirtualAllocEx с использованием флага MEM_RESERVE.

А как тогда выполнить резервирование двух областей одним вызовом VirtualAlloc?
PM MAIL   Вверх
Barabeo
Дата 28.10.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Народ подскажите, никак не могу врубиться в эти атрибуты доступа.
Почему при EXECUTE чтение выполняется?
Вот весь код
Код

 //Кнопка Резервировать
      case IDC_RESERVE: 
      // Резервирование адресного пространства
         lpMemoryRegionOne =  VirtualAlloc(NULL, 
             g_pPageSize*2 , MEM_RESERVE|MEM_COMMIT , PAGE_NOACCESS);
         lpMemoryRegionTwo =  VirtualAlloc(NULL, 
             g_pPageSize*2 , MEM_RESERVE|MEM_COMMIT , PAGE_NOACCESS);

        
         // устанавливает фокус клавиатуры в edit
         SetFocus(GetDlgItem(hwnd, IDC_INDEX));
         break;

///////////////////////////////////////////////////////////////////////////////
     //поле ввода значения региона
     case IDC_INDEX:
         if (codeNotify != EN_CHANGE)
         break;
             
         if( Length = ::GetWindowTextLength(hwndEdit))
         {
             lpszBuffer = new TCHAR[Length + 1];
             ::GetWindowText(hwnd , lpszBuffer, 
                 ( Length + 1 ) * sizeof( TCHAR ) );
         if( _stscanf( lpszBuffer, TEXT("%i"), &i )  == 1 )
         {
             Index = (BYTE)i;
         }
         delete [] lpszBuffer;
         }
    else {
            EnableWindow(GetDlgItem(hwnd, IDC_WRITE),            TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_COPY),             TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_ZERO),             TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_QUERY),            TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_NOACCESS),         TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_READONLY),         TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_READWRITE),        TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_EXECUTE),          TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_EXECUTEREAD),      TRUE);
            EnableWindow(GetDlgItem(hwnd, IDC_EXECUTEREADWRITE), TRUE);
         }
         break;

///////////////////////////////////////////////////////////////////////////////
     //кнопка обнуления 1-го региона
     case IDC_ZERO:
   {
     __try
     {
        ZeroMemory(&lpMemoryRegionOne,sizeof(lpMemoryRegionOne));
     }
     // Если возникло исключение, получаем и
     // отображаем его код
     __except (EXCEPTION_EXECUTE_HANDLER)
     {
        sprintf(chBuff, "Исключение с кодом\n"
        "%lX\n при обнулении региона памяти",
        GetExceptionCode());

        MessageBox(hwnd, chBuff,
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
        break;
     }
     // Если операция завершилась успешно,
     // сообщаем об этом пользователю
        MessageBox(hwnd, "Обнуление выполнено",
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
        break;
  }
  
///////////////////////////////////////////////////////////////////////////////
      //запись 
     case IDC_WRITE:
    {
      __try 
      {
        FillMemory(lpMemoryRegionOne,g_pPageSize*2,Index);
      }
     
      __except (EXCEPTION_EXECUTE_HANDLER) 
      {
        sprintf(chBuff, "Исключение с кодом\n"
        "%lX\n при записи в регион памяти",
        GetExceptionCode());

        MessageBox(hwnd, chBuff,
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
        break;
      }

        MessageBox(hwnd, "Запись выполнена",
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
      // чтение
    case IDC_READ:
    {
      __try 
      {
        Index = *((BYTE *)lpMemoryRegionOne);
      }
      __except (EXCEPTION_EXECUTE_HANDLER) 
      {
        sprintf(chBuff, "Исключение с кодом\n"
          "%lX\n при чтении из региона памяти",
          GetLastError());

        MessageBox(hwnd, chBuff,
          "Сообщение", MB_OK | MB_ICONEXCLAMATION);
        break;
      }
      MessageBox(hwnd, "Чтение выполнено",
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
      break;
    }

///////////////////////////////////////////////////////////////////////////////      
       //  фиксирование
    case IDC_LOCK:
    {
      if(VirtualLock(lpMemoryRegionOne, 
        g_pPageSize*2) == FALSE)
      {
        MessageBox(hwnd, 
          "Ошибка при фиксировании страниц в памяти",
          "Сообщение", MB_OK | MB_ICONEXCLAMATION);
        break;
      }

      MessageBox(hwnd, "Фиксирование выполнено",
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
       //  расфиксирование
    case IDC_UNLOCK:
    {
      if(VirtualUnlock(lpMemoryRegionOne, 
        g_pPageSize*2) == FALSE)
      {
        MessageBox(hwnd, 
          "Ошибка при расфиксировании страниц в памяти",
          "Сообщение", MB_OK | MB_ICONEXCLAMATION);
        break;
      }

      MessageBox(hwnd, "Расфиксирование выполнено",
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
      //копирование
      case IDC_COPY:
    {
      __try 
      {
        CopyMemory(lpMemoryRegionTwo,lpMemoryRegionOne,g_pPageSize*2);
      }
      __except (EXCEPTION_EXECUTE_HANDLER) 
      {
        sprintf(chBuff, "Исключение с кодом\n"
        "%lX\n при копировании данных",
        GetExceptionCode());

        MessageBox(hwnd, chBuff,
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
        break;
      }
        MessageBox(hwnd, "Копирование выполнено",
        "Сообщение", MB_OK | MB_ICONEXCLAMATION);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
      // Устанавливаем тип доступа PAGE_NOACCESS
    case IDC_NOACCESS:
    {
      VirtualProtect(lpMemoryRegionOne, g_pPageSize*2 , 
        PAGE_NOACCESS, &dwOldProtect);

      // Отмечаем строку PAGE_NOACCESS
      IsDlgButtonChecked(hwnd,
        IDC_NOACCESS);
                SendMessage(hwndChek2, BM_SETCHECK, BST_UNCHECKED, 0);
                SendMessage(hwndChek3, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek4, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek5, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek6, BM_SETCHECK, BST_UNCHECKED, 0);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
     // Устанавливаем тип доступа PAGE_READWRITE
    case IDC_READWRITE:
    {
      VirtualProtect(lpMemoryRegionOne, g_pPageSize*2 , 
        PAGE_READWRITE, &dwOldProtect);
      VirtualProtect(lpMemoryRegionTwo, g_pPageSize*2,
        PAGE_READWRITE, &dwOldProtect);

      // Отмечаем строку PAGE_READWRITE
      IsDlgButtonChecked(hwnd,
        IDC_READWRITE);
      SendMessage(hwndChek1, BM_SETCHECK, BST_UNCHECKED, 0);
                SendMessage(hwndChek2, BM_SETCHECK, BST_UNCHECKED, 0);
         SendMessage(hwndChek4, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek5, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek6, BM_SETCHECK, BST_UNCHECKED, 0);
      break;
    }


///////////////////////////////////////////////////////////////////////////////
       // Устанавливаем тип доступа PAGE_READONLY
    case IDC_READONLY:
    {
      VirtualProtect(lpMemoryRegionOne, g_pPageSize*2 , 
        PAGE_READONLY, &dwOldProtect);

      // Отмечаем строку PAGE_READONLY
      IsDlgButtonChecked(hwnd,
        IDC_READONLY);
      SendMessage(hwndChek1, BM_SETCHECK, BST_UNCHECKED, 0);
                SendMessage(hwndChek3, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek4, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek5, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek6, BM_SETCHECK, BST_UNCHECKED, 0);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
     // Устанавливаем тип доступа PAGE_EXECUTE
    case IDC_EXECUTE:
    {
      VirtualProtect(lpMemoryRegionOne, g_pPageSize*2 , 
        PAGE_EXECUTE, &dwOldProtect);

      // Отмечаем строку PAGE_EXECUTE
      IsDlgButtonChecked(hwnd,
        IDC_READONLY);
      SendMessage(hwndChek1, BM_SETCHECK, BST_UNCHECKED, 0);
                SendMessage(hwndChek2, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek3, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek5, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek6, BM_SETCHECK, BST_UNCHECKED, 0);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
     // Устанавливаем тип доступа PAGE_EXECUTE_READ
    case IDC_EXECUTEREAD:
    {
      VirtualProtect(lpMemoryRegionOne, g_pPageSize*2 , 
        PAGE_EXECUTE_READ, &dwOldProtect);

      // Отмечаем строку PAGE_EXECUTE_READ
      IsDlgButtonChecked(hwnd,
        IDC_READONLY);
      SendMessage(hwndChek1, BM_SETCHECK, BST_UNCHECKED, 0);
                SendMessage(hwndChek2, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek3, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek4, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek6, BM_SETCHECK, BST_UNCHECKED, 0);
      break;
    }

///////////////////////////////////////////////////////////////////////////////
     // Устанавливаем тип доступа PAGE_EXECUTE_READWRITE
    case IDC_EXECUTEREADWRITE:
    {
      VirtualProtect(lpMemoryRegionTwo, g_pPageSize*2 , 
        PAGE_EXECUTE_READWRITE, &dwOldProtect);

      // Отмечаем строку PAGE_EXECUTE_READWRITE
      IsDlgButtonChecked(hwnd,
        IDC_READONLY);
      SendMessage(hwndChek1, BM_SETCHECK, BST_UNCHECKED, 0);
                SendMessage(hwndChek2, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek3, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek4, BM_SETCHECK, BST_UNCHECKED, 0);
      SendMessage(hwndChek5, BM_SETCHECK, BST_UNCHECKED, 0);
      break;
    }

PM MAIL   Вверх
Barabeo
Дата 28.10.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Народ, чё никто в этом не шарит что ли?
PM MAIL   Вверх
xvr
Дата 29.10.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Читайте доку на Intel'овский процессор - не может он поставить права на исполнения странице не поставив прав на чтение. Точнее может, но код с такой страницы исполняться не будет  smile 

Кстати, у процессора вообще нет бита 'разрешить исполнять код из страницы', а него есть бит 'запретить исполнять код из страницы с данными', при этом читать из этой страницы НУЖНО разрешить, иначе процессор не сможет собственно прочесть код, который надо исполнять  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.