Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Protect


Автор: Barabeo 28.10.2010, 14:23
Прочитал на сайте Подгорецкого про VirtualProtect:

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

А как тогда выполнить резервирование двух областей одним вызовом VirtualAlloc?

Автор: Barabeo 28.10.2010, 17:35
Народ подскажите, никак не могу врубиться в эти атрибуты доступа.
Почему при 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;
    }

Автор: Barabeo 28.10.2010, 19:52
Народ, чё никто в этом не шарит что ли?

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)