winbootmgr.cpp

本文介绍了一个名为WinBootMgr的应用程序,该程序通过调用Windows API函数读取注册表中的Boot Manager配置信息,并显示有关引导加载程序路径、操作系统名称、默认操作系统等详细数据。

by mj0011

  1. // winbootmgr.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "windows.h"
  5. #include "winbase.h"
  6. #include "stdio.h"
  7. #include <stdlib.h>
  8. #define BOOT_MGR_TYPE 0x10100002
  9. #define BOOT_MGR_NAME_ELEMENTS 12000004
  10. #define BOOT_MGR_LOCAL 12000005
  11. #define BOOT_MGR_PTR_TO_DEFULT_OS 23000003
  12. #define BOOT_MGR_PTR_TO_DEFULT_REMUSE 23000006
  13. #define BOOT_MGR_BOOT_OS_LIST 24000001
  14. #define BOOT_MGR_PTR_TO_MEMTEST 24000010
  15. #define BOOT_MGR_WAIT_TIME    25000004
  16. #define OS_BOOTLOADER_PATH 12000002
  17. #define OS_NAME 12000004
  18. #define OS_LOCALE_LANGUAGE 12000005
  19. #define OS_SYSTEM_PATH 22000002
  20. // typedef struct BOOT_MGR{
  21. //    
  22. // };
  23. void    DisplayOSNodeInfo(HKEY hkeyObjects ,
  24.                           LPCSTR OsGUIDName)
  25. {
  26.     ULONG xret ; 
  27.         CHAR xxName[100];
  28.         
  29.         HKEY hkeyOS ; 
  30.         sprintf(xxName , "%s//Elements//%u" , OsGUIDName , OS_BOOTLOADER_PATH );
  31.         xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );
  32.         if (xret != ERROR_SUCCESS)
  33.         {
  34.             printf("error open Key :%s , err = %u/n" , xxName , xret);
  35.         }
  36.         else
  37.         {
  38.             ULONG Type , retlen = 100; 
  39.             CHAR OSBootLoaderPath[100];
  40.             xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OSBootLoaderPath , &retlen );
  41.             if (xret != ERROR_SUCCESS)
  42.             {
  43.                 printf("error query value key , err = %u/n", xret);
  44.             }
  45.             else
  46.             {
  47.                 printf("OsBootLoader Path :%s/n" , OSBootLoaderPath);
  48.             }
  49.             RegCloseKey(hkeyOS);
  50.         }
  51.         sprintf(xxName , "%s//Elements//%u" , OsGUIDName , OS_NAME  );
  52.         
  53.         
  54.         xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );
  55.         
  56.         if (xret != ERROR_SUCCESS)
  57.         {
  58.             printf("error open Key :%s , err = %u/n" , xxName , xret);
  59.             
  60.             
  61.         }
  62.         else
  63.         {
  64.             ULONG Type , retlen = 100; 
  65.             CHAR OsName[100];
  66.             
  67.             xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OsName , &retlen );
  68.             if (xret != ERROR_SUCCESS)
  69.             {
  70.                 printf("error query value key , err = %u/n", xret);
  71.             }
  72.             else
  73.             {
  74.                 printf("OS Name :%s/n" , OsName);
  75.                 
  76.             }
  77.             RegCloseKey(hkeyOS);
  78.         }
  79.         sprintf(xxName , "%s//Elements//%u" , OsGUIDName , OS_LOCALE_LANGUAGE  );
  80.         
  81.         
  82.         xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );
  83.         
  84.         if (xret != ERROR_SUCCESS)
  85.         {
  86.             //printf("error open Key :%s , err = %u/n" , xxName , xret);
  87.             printf("Locale Language : N/A/n");
  88.             
  89.         }
  90.         else
  91.         {
  92.             ULONG Type , retlen = 100; 
  93.             CHAR OsLocale[100];
  94.             
  95.             xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OsLocale , &retlen );
  96.             if (xret != ERROR_SUCCESS)
  97.             {
  98.                 printf("error query value key , err = %u/n", xret);
  99.             }
  100.             else
  101.             {
  102.                 printf("Os Locale Language :%s/n" , OsLocale);
  103.                 
  104.             }
  105.             RegCloseKey(hkeyOS);
  106.         }
  107.         sprintf(xxName , "%s//Elements//%u" , OsGUIDName , OS_SYSTEM_PATH    );
  108.         
  109.         
  110.         xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );
  111.         
  112.         if (xret != ERROR_SUCCESS)
  113.         {
  114.         //    printf("error open Key :%s , err = %u/n" , xxName , xret);
  115.             printf("Os System Path :N/A/n");    
  116.             
  117.         }
  118.         else
  119.         {
  120.             ULONG Type , retlen = 100; 
  121.             CHAR OsSystemPath[100];
  122.             
  123.             xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OsSystemPath , &retlen );
  124.             if (xret != ERROR_SUCCESS)
  125.             {
  126.                 printf("error query value key , err = %u/n", xret);
  127.             }
  128.             else
  129.             {
  130.                 printf("Os System Path :%s/n/n" , OsSystemPath);
  131.                 
  132.             }
  133.             RegCloseKey(hkeyOS);
  134.         }
  135.         return ; 
  136. }
  137. BOOL    ConnectBootMgr()
  138. {
  139.     HKEY hkey ; 
  140.     ULONG xret ; 
  141.     xret = RegOpenKey(HKEY_LOCAL_MACHINE , "BCD00000000" , &hkey);
  142.     if (xret != ERROR_SUCCESS)
  143.     {
  144.         printf("open bcd main key failed , err = %u/n" , xret);
  145.         return 3 ;
  146.     }
  147.     ULONG Index = 0 ;
  148.     CHAR KeyName[100] = "";
  149.     ULONG uret = ERROR_SUCCESS ; 
  150.     BOOL    bFind = FALSE ; 
  151.     while(uret == ERROR_SUCCESS)
  152.     {
  153.         if (!stricmp(KeyName , "Objects"))
  154.         {
  155.             bFind = TRUE ; 
  156.             break ; 
  157.         }
  158.         uret = RegEnumKey(hkey , Index , KeyName , 100) ; 
  159.         Index ++ ; 
  160.     }
  161.     if (!bFind)
  162.     {
  163.         RegCloseKey(hkey);
  164.         printf("cannot found BCDMgr->Objects!/n");
  165.         return FALSE ;
  166.     }
  167.     
  168.     HKEY hkeyObject ; 
  169.     xret = RegOpenKey(hkey , KeyName , &hkeyObject) ; 
  170.     
  171.     if (xret != ERROR_SUCCESS)
  172.     {
  173.         printf("error open BCDMgr->Objects! err = %u/n" , xret);
  174.         RegCloseKey(hkey);
  175.         return FALSE;
  176.     }
  177.     Index = 0 ; 
  178.     uret = ERROR_SUCCESS ;
  179.     bFind = FALSE ; 
  180.     RegCloseKey(hkey);
  181.     while(uret == ERROR_SUCCESS)
  182.     {
  183.         uret = RegEnumKey(hkeyObject , Index , KeyName , 100) ; 
  184.         if (uret == ERROR_SUCCESS)
  185.         {
  186.             CHAR DescObject[100];
  187.             HKEY hkeyDesc ; 
  188.             sprintf(DescObject , "%s//%s" , KeyName , "Description");
  189.             xret = RegOpenKey(hkeyObject , DescObject , &hkeyDesc)  ;
  190.             if ( xret != ERROR_SUCCESS)
  191.             {
  192.                 printf("error open Object Description , err = %u/n" , xret);
  193.                 RegCloseKey(hkeyObject);
  194.                 RegCloseKey(hkey);
  195.                 return FALSE ;
  196.             }
  197.             ULONG value ,type ,retlen = sizeof(ULONG); 
  198.             xret = RegQueryValueEx(hkeyDesc , "Type" , 0 , &type ,  (LPBYTE)&value , &retlen) ; 
  199.             if (xret  !=ERROR_SUCCESS)
  200.             {
  201.                 printf("error query object description type err = %u/n" , xret);
  202.                 RegCloseKey(hkeyDesc);
  203.                 RegCloseKey(hkeyObject);
  204.                 RegCloseKey(hkey);
  205.                 return FALSE ;
  206.             }
  207.             if (value == BOOT_MGR_TYPE)
  208.             {
  209.                 printf("BootMgr Object GUID = %s/n/n" , KeyName);
  210.                 bFind = TRUE ; 
  211.                             
  212.                 break ; 
  213.             }
  214.             else
  215.             {
  216.                 RegCloseKey(hkeyDesc);
  217.             }
  218.         }
  219.         Index ++ ; 
  220.     }
  221.     CHAR ElementName[100];
  222.     HKEY htemp ; 
  223.     sprintf(ElementName , "%s//Elements//%u" , KeyName , BOOT_MGR_NAME_ELEMENTS);
  224.     xret = RegOpenKey(hkeyObject , ElementName , &htemp );
  225.     if (xret != ERROR_SUCCESS)
  226.     {
  227.         printf("error open Elements:BOOT_MGR_NAME_ELEMENTS Key :%s , err = %u/n" , ElementName , xret);
  228.     }
  229.     else
  230.     {
  231.         CHAR BootMgrName[100];
  232.         ULONG size = 100 , Type ; 
  233.         xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)BootMgrName , &size) ; 
  234.         if (xret != ERROR_SUCCESS)
  235.         {
  236.             printf("error query element value of BOOT_MGR_NAME_ELEMENTS  err= %u/n" , xret);
  237.         }
  238.         else
  239.         {
  240.             printf("BootMgr Name : %s/n/n" , BootMgrName);
  241.         }
  242.         RegCloseKey(htemp);
  243.     }
  244.     sprintf(ElementName , "%s//Elements//%u" , KeyName , BOOT_MGR_LOCAL);
  245.     
  246.     xret = RegOpenKey(hkeyObject , ElementName , &htemp );
  247.     if (xret != ERROR_SUCCESS)
  248.     {
  249.         printf("error open Elements:BOOT_MGR_LOCAL Key :%s , err = %u/n" , ElementName , xret);
  250.     }
  251.     else
  252.     {
  253.         CHAR Local[100];
  254.         ULONG size = 100 , Type ; 
  255.         
  256.         xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)Local , &size) ; 
  257.         
  258.         if (xret != ERROR_SUCCESS)
  259.         {
  260.             printf("error query element value of BOOT_MGR_LOCAL  err= %u/n" , xret);
  261.         }
  262.         else
  263.         {
  264.             printf("Locale Language : %s/n/n" , Local);
  265.         }
  266.         RegCloseKey(htemp);
  267.         
  268.     }    
  269.     sprintf(ElementName , "%s//Elements//%u" , KeyName , BOOT_MGR_PTR_TO_DEFULT_OS );
  270.     
  271.     xret = RegOpenKey(hkeyObject , ElementName , &htemp );
  272.     if (xret != ERROR_SUCCESS)
  273.     {
  274.         printf("error open Elements:BOOT_MGR_PTR_TO_DEFULT_OS  Key :%s , err = %u/n" , ElementName , xret);
  275.     }
  276.     else
  277.     {
  278.         CHAR DefaultOS[100];
  279.         ULONG size = 100 , Type ; 
  280.         
  281.         xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)DefaultOS , &size) ; 
  282.         
  283.         if (xret != ERROR_SUCCESS)
  284.         {
  285.             printf("error query element value of BOOT_MGR_PTR_TO_DEFULT_OS  err= %u/n" , xret);
  286.         }
  287.         else
  288.         {
  289.             printf("DefaultOS GUID : %s/n/n" , DefaultOS);
  290.         }
  291.         RegCloseKey(htemp);
  292.         
  293.     }
  294.     sprintf(ElementName , "%s//Elements//%u" , KeyName , BOOT_MGR_PTR_TO_DEFULT_REMUSE );
  295.     
  296.     xret = RegOpenKey(hkeyObject , ElementName , &htemp );
  297.     if (xret != ERROR_SUCCESS)
  298.     {
  299.         printf("error open Elements:BOOT_MGR_PTR_TO_DEFULT_REMUSE  Key :%s , err = %u/n" , ElementName , xret);
  300.     }
  301.     else
  302.     {
  303.         CHAR DefaultResume[100];
  304.         ULONG size = 100 , Type ; 
  305.         
  306.         xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)DefaultResume , &size) ; 
  307.         
  308.         if (xret != ERROR_SUCCESS)
  309.         {
  310.             printf("error query element value of BOOT_MGR_PTR_TO_DEFULT_REMUSE  err= %u/n" , xret);
  311.         }
  312.         else
  313.         {
  314.             printf("Default Resume GUID : %s/n/n" , DefaultResume);
  315.             DisplayOSNodeInfo(hkeyObject , DefaultResume);
  316.         }
  317.         RegCloseKey(htemp);
  318.         
  319.     }
  320.     sprintf(ElementName , "%s//Elements//%u" , KeyName , BOOT_MGR_BOOT_OS_LIST  );
  321.     
  322.     xret = RegOpenKey(hkeyObject , ElementName , &htemp );
  323.     if (xret != ERROR_SUCCESS)
  324.     {
  325.         printf("error open Elements:BOOT_MGR_BOOT_OS_LIST  Key :%s , err = %u/n" , ElementName , xret);
  326.     }
  327.     else
  328.     {
  329.         BYTE OSList[1000];
  330.         PBYTE lpOsList = OSList ; 
  331.         ULONG size = 1000 , Type ; 
  332.         
  333.         xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)OSList , &size) ; 
  334.         
  335.         if (xret != ERROR_SUCCESS)
  336.         {
  337.             printf("error query element value of BOOT_MGR_BOOT_OS_LIST    err= %u/n" , xret);
  338.         }
  339.         else
  340.         {
  341.             LPCSTR OsGUIDName  = (LPCSTR)lpOsList ; 
  342.             ULONG OsIndex = 0 ;
  343.             printf("SystemOS List:/n/n");
  344.             while((ULONG)OsGUIDName+1 < (ULONG)lpOsList + size)
  345.             {
  346.                 printf("OS[%u] : GUID = %s/n/n", OsIndex , OsGUIDName);
  347.                 DisplayOSNodeInfo(hkeyObject , OsGUIDName )    ;
  348.                 OsGUIDName = (LPCSTR)((ULONG)OsGUIDName + strlen(OsGUIDName) + 1 ); 
  349.                 OsIndex ++ ; 
  350.             }
  351.             
  352.         }
  353.         RegCloseKey(htemp);
  354.         
  355.     }
  356.     sprintf(ElementName , "%s//Elements//%u" , KeyName , BOOT_MGR_PTR_TO_MEMTEST  );
  357.     
  358.     xret = RegOpenKey(hkeyObject , ElementName , &htemp );
  359.     if (xret != ERROR_SUCCESS)
  360.     {
  361.         printf("error open Elements:BOOT_MGR_PTR_TO_MEMTEST  Key :%s , err = %u/n" , ElementName , xret);
  362.     }
  363.     else
  364.     {
  365.         CHAR MemTest[100];
  366.         ULONG size = 100 , Type ; 
  367.         
  368.         xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)MemTest , &size) ; 
  369.         
  370.         if (xret != ERROR_SUCCESS)
  371.         {
  372.             printf("error query element value of BOOT_MGR_PTR_TO_MEMTEST    err= %u/n" , xret);
  373.         }
  374.         else
  375.         {
  376.             printf("BootMemTest GUID : %s/n/n" , MemTest);
  377.             DisplayOSNodeInfo(hkeyObject , MemTest);
  378.         }
  379.         RegCloseKey(htemp);
  380.         
  381.     }
  382.     sprintf(ElementName , "%s//Elements//%u" , KeyName , BOOT_MGR_WAIT_TIME  );
  383.     
  384.     xret = RegOpenKey(hkeyObject , ElementName , &htemp );
  385.     if (xret != ERROR_SUCCESS)
  386.     {
  387.         printf("error open Elements:BOOT_MGR_WAIT_TIME  Key :%s , err = %u/n" , ElementName , xret);
  388.     }
  389.     else
  390.     {
  391.         LARGE_INTEGER WaitTime; 
  392.         ULONG size = 8, Type ; 
  393.         
  394.         xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)&WaitTime , &size) ; 
  395.         
  396.         if (xret != ERROR_SUCCESS)
  397.         {
  398.             printf("error query element value of BOOT_MGR_WAIT_TIME    err= %u/n" , xret);
  399.         }
  400.         else
  401.         {
  402.             printf("Boot Menu Wait Time : %I64u second(s)/n/n" , WaitTime.QuadPart);
  403.         }
  404.         RegCloseKey(htemp);
  405.         
  406.     }
  407.     RegCloseKey(hkeyObject);
  408.     RegCloseKey(hkey);
  409. //    strcpy(BootName ,KeyName);
  410.     return TRUE ;
  411. }
  412. int main(int argc, char* argv[])
  413. {
  414.     HKEY hkey ; 
  415.     if (RegOpenKey(HKEY_LOCAL_MACHINE,"BCD00000000" , &hkey) != ERROR_SUCCESS)
  416.     {
  417.         MessageBox(GetDesktopWindow() , "Need admin privilege!" , "Error" , MB_OK|MB_ICONWARNING);
  418.         return 0;
  419.     }
  420.     RegCloseKey(hkey);
  421.     printf("Windows Vista BootMgr Demo/n"
  422.         "By MJ0011 2008-7-15/n"
  423.         "/n1.Display BootMgr config/n/n");
  424.     ULONG id = 0 ; 
  425.     fflush(stdin);
  426.     scanf("%u" , &id);
  427.     if (id == 1 )
  428.     {
  429.         ConnectBootMgr();
  430.         system("pause");
  431.     }
  432.     return 0 ;
  433. }
cmake_minimum_required(VERSION 3.10) project(mutator) add_compile_options(-g -O2) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找 Boost 库 find_package(Boost REQUIRED program_options) # 如果 Boost 安装在非默认路径,可以指定 Boost 的根目录 # set(BOOST_ROOT "/path/to/boost") # set(Boost_NO_SYSTEM_PATHS TRUE) #find_package(ICU REQUIRED COMPONENTS uc ucdata ucp ucptrie) # 添加可执行文件 add_executable( mutator main.cpp mutators/base.cpp mutators/config.cpp data_types/string_.cpp data_types/StringBase.cpp data_types/NumberBase.cpp data_types/DoubleBase.cpp data_types/Number.cpp data_types/Double.cpp data_types/VirtualBase.cpp data_types/ArrayBase.cpp data_types/BlobBase.cpp data_types/Blob.cpp mutators/MutatorFactory.cpp mutators/utils.cpp utils/sample_util.cpp utils/UniversalString.cpp mutators/string/StringCaseRandom.cpp data_types/TypeBase.cpp mutators/number/NumberRandom.cpp mutators/number/NumberVariance.cpp mutators/number/NumberEdgeCase.cpp mutators/string/StringCaseLower.cpp mutators/string/StringAsciiRandom.cpp mutators/string/StringCaseUpper.cpp mutators/string/StringStatic.cpp mutators/string/StringUnicodeInvalid.cpp mutators/string/StringUnicodeNonCharacters.cpp mutators/string/StringUnicodePrivateUseArea.cpp mutators/string/StringLengthVariance.cpp mutators/string/StringLengthEdgeCase.cpp mutators/string/StringFormatRandom.cpp mutators/string/StringUtf8BomLength.cpp mutators/string/StringUtf8BomStatic.cpp mutators/double/DoubleEdgeCase.cpp mutators/double/DoubleRandom.cpp mutators/double/DoubleVariance.cpp mutators/double/DoubleEdgeCase.cpp mutators/blob/BlobChangeFromNull.cpp mutators/blob/BlobChangeRandom.cpp mutators/blob/BlobChangeSpecial.cpp mutators/blob/BlobChangeToNull.cpp mutators/blob/BlobExpandAllRandom.cpp mutators/blob/BlobExpandSingleIncrementing.cpp mutators/blob/BlobExpandSingleRandom.cpp mutators/blob/BlobExpandZero.cpp mutators/blob/BlobReduce.cpp ) # 包含 Boost 的头文件路径 target_include_directories(mutator PRIVATE ${Boost_INCLUDE_DIRS}) # 链接 Boost 的 program_options 库 target_link_libraries(mutator PRIVATE ${Boost_LIBRARIES}) 功能不变 优化填写方式
07-03
为了优化 `CMakeLists.txt` 的可读性和维护性,我们可以: 1. **使用变量管理源文件列表**:避免在 `add_executable()` 中写入冗长的源文件列表。 2. **模块化代码结构**:将不同目录的源文件归类为变量。 3. **使用更清晰的注释和格式化方式**。 --- ### 优化后的 CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.10) project(mutator) # 编译选项 add_compile_options(-g -O2) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找 Boost 库 find_package(Boost REQUIRED program_options) # 定义各模块的源文件路径 set(SRC_MUTATORS mutators/base.cpp mutators/config.cpp mutators/MutatorFactory.cpp mutators/utils.cpp mutators/string/StringCaseRandom.cpp mutators/string/StringAsciiRandom.cpp mutators/string/StringCaseLower.cpp mutators/string/StringCaseUpper.cpp mutators/string/StringStatic.cpp mutators/string/StringUnicodeInvalid.cpp mutators/string/StringUnicodeNonCharacters.cpp mutators/string/StringUnicodePrivateUseArea.cpp mutators/string/StringLengthVariance.cpp mutators/string/StringLengthEdgeCase.cpp mutators/string/StringFormatRandom.cpp mutators/string/StringUtf8BomLength.cpp mutators/string/StringUtf8BomStatic.cpp mutators/number/NumberRandom.cpp mutators/number/NumberVariance.cpp mutators/number/NumberEdgeCase.cpp mutators/double/DoubleRandom.cpp mutators/double/DoubleVariance.cpp mutators/double/DoubleEdgeCase.cpp mutators/blob/BlobChangeFromNull.cpp mutators/blob/BlobChangeRandom.cpp mutators/blob/BlobChangeSpecial.cpp mutators/blob/BlobChangeToNull.cpp mutators/blob/BlobExpandAllRandom.cpp mutators/blob/BlobExpandSingleIncrementing.cpp mutators/blob/BlobExpandSingleRandom.cpp mutators/blob/BlobExpandZero.cpp mutators/blob/BlobReduce.cpp ) set(SRC_DATA_TYPES data_types/string_.cpp data_types/StringBase.cpp data_types/NumberBase.cpp data_types/DoubleBase.cpp data_types/Number.cpp data_types/Double.cpp data_types/VirtualBase.cpp data_types/ArrayBase.cpp data_types/BlobBase.cpp data_types/Blob.cpp data_types/TypeBase.cpp ) set(SRC_UTILS utils/sample_util.cpp utils/UniversalString.cpp ) # 主程序入口 set(SRC_MAIN main.cpp) # 合并所有源文件 set(SRC_ALL ${SRC_MAIN} ${SRC_MUTATORS} ${SRC_DATA_TYPES} ${SRC_UTILS} ) # 添加可执行文件 add_executable(mutator ${SRC_ALL}) # 包含 Boost 头文件路径 target_include_directories(mutator PRIVATE ${Boost_INCLUDE_DIRS}) # 链接 Boost 的 program_options 库 target_link_libraries(mutator PRIVATE ${Boost_LIBRARIES}) ``` --- ### 解释说明: - `set(SRC_MUTATORS ...)` 等变量定义是为了更好地组织源码路径,使 `add_executable` 更简洁。 - 使用了模块化分组(mutators、data_types、utils)便于后期扩展与维护。 - 保留原有的 Boost 依赖查找逻辑,保证功能不变。 - 注释更加清晰,方便新开发者快速理解项目结构。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值