ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
178492
AlexandrY (15.01.2010 17:50, просмотров: 2472)
Макросовый экстрим. Или исскуство обфускации. В BSP от одной известной и уважаемой фирмы нашел такое:
    Стоит в тексте такой вот скромный макрос
    DDK_GPIO_SET_CONFIG(cfg, SDHC1);

    Думаю щас его в уме раскрою. 
    И понеслось..
    
1. Находим  определение     
    #define DDK_GPIO_SET_CONFIG(config, module) GPIOSetCfg2(GPIOValueCfgType(module), config, module)
 
   - Переписываем и получаем следующее
    GPIOSetCfg2(GPIOValueCfgType(SDHC1), cfg, SDHC1)
 
2. Находим определение 
    #define GPIOValueCfgType(module)    GPIOCatMacro(GPIOCat(GPIO_, module), _CONFIG_TYPE)

   - Переписываем и получаем следующее
    GPIOSetCfg2(GPIOCatMacro(GPIOCat(GPIO_, SDHC1), _CONFIG_TYPE), cfg, SDHC1)
 
3. Находим определение 
    #define GPIOCat(x, y)               x##y
 
   - Переписываем и получаем следующее
    GPIOSetCfg2(GPIOCatMacro(GPIO_SDHC1, _CONFIG_TYPE), cfg, SDHC1)
 
4. Находим определение 
    #define GPIOCatMacro(module, macro) GPIOCat(GPIOValueMacro, (GPIOCat2(module, macro)))

   - Переписываем и получаем следующее
    GPIOSetCfg2(GPIOCat(GPIOValueMacro, (GPIOCat2(GPIO_SDHC1, _CONFIG_TYPE))), cfg, SDHC1)
 
5. Находим определение 
    #define GPIOCat2(x, y)              x##y

   - Переписываем и получаем следующее
    GPIOSetCfg2(GPIOCat(GPIOValueMacro, (GPIO_SDHC1_CONFIG_TYPE)), cfg, SDHC1)
 
6. Находим определение 
    #define GPIOValueMacro(x)           x   

   - Переписываем и получаем следующее
    GPIOSetCfg2( GPIO_SDHC1_CONFIG_TYPE, cfg, SDHC1)
 
7. Находим определение 
    #define GPIOSetCfg2(x, y, z)        GPIOSetCfg3(x, y, z)
 
8. Находим определение 
    #define GPIOSetCfg3(x, y, z)        GPIOCat2(GPIOCat(GPIOSetCfg, x), (y, z))

   - Переписываем и получаем следующее
    GPIOCat2(GPIOCat(GPIOSetCfg, GPIO_SDHC1_CONFIG_TYPE), (cfg, SDHC1))
 
9. Находим определение 
    #define GPIO_SDHC1_CONFIG_TYPE      PRI
 
   - Переписываем и получаем следующее
    GPIOCat2(GPIOSetCfgPRI, (cfg, SDHC1))
 
   - Переписываем и получаем следующее
    GPIOSetCfgPRI(cfg, SDHC1)


    Итого оказывается:
    
    DDK_GPIO_SET_CONFIG(cfg, SDHC1) ->  GPIOSetCfgPRI(cfg, SDHC1)

    Фу.уу..
    Думаете на этом все кончилось?
    Нет!
     
    GPIOSetCfgPRI - тоже оказалось макросом!     
INDEMSYS