Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Visual C++ 2008, структуры, и оптимизация, И кто его просил оптимизировать? 
V
    Опции темы
bugmenot
Дата 1.2.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день
Вот написал я такую функцию для патчинга вызова функции в программе:
Код

void PatchCallFunction(LPVOID lpBaseAddress, LPVOID lpFunction)
{
    BYTE bWrite[0x05];

    *bWrite = 0xE8;
    *(LPDWORD)(bWrite+1) = (DWORD)lpFunction-(DWORD)lpBaseAddress-0x05;

    WriteProcessMemory(GetCurrentProcess(), lpBaseAddress, bWrite, sizeof(bWrite), NULL);
}


Все работает, все хорошо, но не красиво со всякими поинтерами, решил переделать:
Код

void PatchCallFunction(LPVOID lpBaseAddress, LPVOID lpFunction)
{
    struct {
        BYTE b1;
        DWORD dw2;
    } sWrite = {0xE8, (DWORD)lpFunction-(DWORD)lpBaseAddress-0x05};

    WriteProcessMemory(GetCurrentProcess(), lpBaseAddress, &sWrite, sizeof(sWrite), NULL);
}


Так вот, Visual C, чтоб его, оптимизирует во втором случае, выравнивает все по 4 байта, получается: E8 00 00 00 12 34 56 78 вместо E8 12 34 56 78, и sizeof возвращает 8 вместо 5-и.

Для тех, кто не знает WinAPI:
Код

    struct {
        unsigned char a;
        unsigned long b;
    } my_struct = {0x12, 0x34567890};


Получается 12 00 00 00 90 78 56 34 вместо 12 90 78 56 34

И так, есть решение, или придется писать со всякими звездачками? smile
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
bugmenot
Дата 1.2.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все, разобрался.
У VC есть на эту тему опция:
http://msdn.microsoft.com/en-us/library/xh3e3fd0(VS.80).aspx

А так же, на эту тему есть целая статья на википедии smile
http://en.wikipedia.org/wiki/Packed
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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