遍历文件

简介: 看到《windows核心编程》里说C/C++程序实际上都是由运行时库中的Startup系列函数(mainCRTStartup,wmainCRTStartup, WinMainCRTStartup,wWinMainCRTStartup)来执行一系列初始化后,再调用程序员写的代码中的main、wmain、WinMain或wWinMain,于是很想看看mainCRTStartup的定义,书上说是在crt0.c里,可是明明没有嘛。

看到《windows核心编程》里说C/C++程序实际上都是由运行时库中的Startup系列函数(mainCRTStartup,wmainCRTStartup, WinMainCRTStartup,wWinMainCRTStartup)来执行一系列初始化后,再调用程序员写的代码中的main、wmain、WinMain或wWinMain,于是很想看看mainCRTStartup的定义,书上说是在crt0.c里,可是明明没有嘛。书是在windows2000下写的,可能现在的微软C/C++运行时库已经变化很多了。

把crt0.c的几个包含文件都看了下,还是没找到,看来还是得遍历C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src里面的源码文件来找才行,于是写了一个Python脚本,还挺快的。

import os
def find_file_text(root_dir,target_text):
 suffix=['c','cpp','h','hpp','cxx']
 for root,dirs,files in os.walk(root_dir):
    for file in files:
        file_suffix=file[file.find('.')+1:len(file)]
        if file_suffix in suffix:
            file_obj=open(os.path.join(root, file),'rU')
            line_no=0
            for eachline in file_obj:
                line_no=line_no+1
                if eachline.find(target_text)!=-1:
                    print "%s %d:%s"%(os.path.join(root, file),line_no,eachline)

find_file_text(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src','mainCRTStartup')

 

终于找到了,原来mainCRTStartup和wmainCRTStartup都是调用的__tmainCRTStartup,在C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\crtexe.c中

#ifdef _WINMAIN_

#ifdef WPRFLAG
int wWinMainCRTStartup(
#else 
int WinMainCRTStartup(
#endif 

#else 

#ifdef WPRFLAG
int wmainCRTStartup(
#else 
int mainCRTStartup(
#endif 

#endif 
        void
        )
{
       
        __security_init_cookie();

        return __tmainCRTStartup();
}

__declspec(noinline)
int
__tmainCRTStartup(
        void
        )
{
#ifdef _WINMAIN_
        _TUCHAR *lpszCommandLine;
        STARTUPINFO StartupInfo;
        BOOL inDoubleQuote=FALSE;

        __try {
                       
            GetStartupInfo( &StartupInfo );
        } __except(EXCEPTION_EXECUTE_HANDLER) {
            return 255;
        }
#endif 


       

        __try
        {
           
            void *lock_free=0;
            void *fiberid=((PNT_TIB)NtCurrentTeb())->StackBase;
            int nested=FALSE;
            while((lock_free=InterlockedCompareExchangePointer((volatile PVOID *)&__native_startup_lock, fiberid, 0))!=0)
            {
                if(lock_free==fiberid)
                {
                    nested=TRUE;
                    break;
                }

               
               
                Sleep(1000);
            }

            if (__native_startup_state == __initializing)
            {
                _amsg_exit( _RT_CRT_INIT_CONFLICT);
            }
            else if (__native_startup_state == __uninitialized)
            {
                __native_startup_state = __initializing;
#ifndef _SYSCRT
                if (_initterm_e( __xi_a, __xi_z ) != 0)
                {
                    return 255;
                }
#else 
                _initterm((_PVFV *)(void *)__xi_a, (_PVFV *)(void *)__xi_z);
#endif 
            }
            else
            {
                has_cctor = 1;
            }

           
            if (__native_startup_state == __initializing)
            {
                _initterm( __xc_a, __xc_z );
                __native_startup_state = __initialized;
            }
            _ASSERTE(__native_startup_state == __initialized);
            if(!nested)
            {
               
#pragma warning(push)
#pragma warning(disable:4312)
                InterlockedExchangePointer((volatile PVOID *)&__native_startup_lock, 0);
#pragma warning(pop)
            }

           
            if (__dyn_tls_init_callback != NULL &&
                _IsNonwritableInCurrentImage((PBYTE)&__dyn_tls_init_callback))
            {
                __dyn_tls_init_callback(NULL, DLL_THREAD_ATTACH, NULL);
            }

           
            _CrtSetCheckCount(TRUE);

#ifdef _WINMAIN_
           
#ifdef WPRFLAG
           
            if (_wcmdln == NULL)
                return 255;
            lpszCommandLine = (wchar_t *)_wcmdln;
#else 
            lpszCommandLine = (unsigned char *)_acmdln;
#endif 

            while (*lpszCommandLine > SPACECHAR ||
                   (*lpszCommandLine&&inDoubleQuote)) {
               
                if (*lpszCommandLine==DQUOTECHAR) inDoubleQuote=!inDoubleQuote;
#ifdef _MBCS
                if (_ismbblead(*lpszCommandLine)) {
                    if (lpszCommandLine) {
                        lpszCommandLine++;
                    }
                }
#endif 
                ++lpszCommandLine;
            }

           
            while (*lpszCommandLine && (*lpszCommandLine <= SPACECHAR)) {
                lpszCommandLine++;
            }

#ifdef WPRFLAG
            mainret = wWinMain(
#else 
            mainret = WinMain(
#endif 
                       (HINSTANCE)&__ImageBase,
                       NULL,
                       lpszCommandLine,
                       StartupInfo.dwFlags & STARTF_USESHOWWINDOW
                        ? StartupInfo.wShowWindow
                        : SW_SHOWDEFAULT
                      );
#else 

#ifdef WPRFLAG
            __winitenv = envp;
            mainret = wmain(argc, argv, envp);
#else 
            __initenv = envp;
            mainret = main(argc, argv, envp);
#endif 

#endif 

           
            if ( !managedapp )
                exit(mainret);

            if (has_cctor == 0)
                _cexit();

        }
        __except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )
        {
           

            mainret = GetExceptionCode();

           
            if ( !managedapp )
                _exit(mainret);

            if (has_cctor == 0)
                _cexit();
        }

        return mainret;
}

看的头疼,明天再看了。

目录
相关文章
|
27天前
|
Web App开发 Linux 数据安全/隐私保护
Apple Safari 26 正式版发布 - macOS 专属浏览器 (独立安装包下载)
Apple Safari 26 正式版发布 - macOS 专属浏览器 (独立安装包下载)
206 0
|
8月前
|
人工智能 安全 API
大模型推理主战场:通信协议的标配
DeepSeek加速了模型平权,大模型推理需求激增,性能提升主战场从训练转向推理。SSE(Server-Sent Events)和WebSocket成为大模型应用的标配网络通信协议。SSE适合服务器单向推送实时数据,如一问一答场景;WebSocket支持双向实时通信,适用于在线游戏、多人协作等高实时性场景。两者相比传统HTTPS协议,能更好地支持流式输出、长时任务处理和多轮交互,满足大模型应用的需求。随着用户体量扩大,网关层面临软件变更、带宽成本及恶意攻击等挑战,需通过无损上下线、客户端重连机制、压缩算法及安全防护措施应对。
1041 176
大模型推理主战场:通信协议的标配
|
11月前
|
开发框架 移动开发 Dart
Flutter 框架的缺点
以上缺点并不意味着 Flutter 框架不优秀,只是在使用过程中需要开发者根据具体的项目需求和场景,充分考虑这些因素,并采取相应的措施来克服或缓解这些问题,以充分发挥 Flutter 的优势,开发出高质量的移动应用。
|
机器人
太空采矿:地球资源枯竭后的替代方案
【10月更文挑战第10天】太空采矿作为地球资源枯竭后的替代方案,具有广阔的前景和潜力。然而,要实现太空采矿的商业化和可持续发展,还需要克服一系列技术、经济和法律挑战。未来,随着技术的不断进步和国际合作的加强,太空采矿将成为人类社会新的资源来源和经济增长点。让我们共同期待太空采矿的美好未来!
|
消息中间件 传感器 数据处理
"揭秘实时流式计算:低延迟、高吞吐量的数据处理新纪元,Apache Flink示例带你领略实时数据处理的魅力"
【8月更文挑战第10天】实时流式计算即时处理数据流,低延迟捕获、处理并输出数据,适用于金融分析等需即时响应场景。其框架(如Apache Flink)含数据源、处理逻辑及输出目标三部分。例如,Flink可从数据流读取信息,转换后输出。此技术优势包括低延迟、高吞吐量、强容错性及处理逻辑的灵活性。
370 4
|
人工智能 文字识别 算法
打造全场景、跨领域、多模态的AI工作流 | 开源图像标注工具 X-AnyLabeling v2.4.0 正式发布!
X-AnyLabeling是一款强大的辅助标注工具,集成了AI推理引擎和丰富功能,为图像数据工程师提供一站式解决方案。它支持图像和视频文件的自动标注,提供了包括矩形框、多边形在内的七种标注样式,适应多样化的训练场景需求。X-AnyLabeling内置了多种SOTA级AI模型,如YOLO、SAM系列等,并支持GPU加速和多种数据集格式的导入导出,确保高效的数据处理。此外,它还具备良好的跨平台兼容性,可在多种操作系统上运行,并提供详尽的帮助文档和社区支持,帮助用户轻松上手并解决使用过程中遇到的问题。
1783 2
打造全场景、跨领域、多模态的AI工作流 | 开源图像标注工具 X-AnyLabeling v2.4.0 正式发布!
|
缓存 前端开发 JavaScript
优化的艺术:提升网站性能的十大关键技术策略
【7月更文第9天】在当今快速发展的互联网时代,网站性能直接影响用户体验和业务转化率。一个高性能的网站不仅能够吸引并留住用户,还能在搜索引擎排名中占据有利位置。本文将深入探讨提升网站性能的十大关键技术策略,并提供实用的代码示例帮助开发者实施这些优化措施。
847 3
|
关系型数据库 MySQL Shell
Mac安装Mysql(图文解说详细版)
Mac安装Mysql(图文解说详细版)
Mac安装Mysql(图文解说详细版)
|
算法 安全 网络协议
关于国密SSL常用的技术原理介绍
随着越来越多的国际通用密码算法屡屡被传出被破解、被攻击的传闻,存在较高的安全风险。此外,当前我国金融系统大多采用国外制定的加密算法,存在着大量的不可控因素,一旦被不法分子利用攻击,所产生的损失将不可估量。所以国密改造提上日程。国密SSL通信依据的协议是中国人民共和国密码行业标准《SSL VPN技术规范GM/T 0024--2014》协议(链接)。其协议流程和传统的使用RSA证书的TLS协议流程基本一致,但是过程中使用的核心算法已经全部切换到国密相关的算法实现上,为了保证通信的安全监管机构开始推动国内金融行业进行国密改造。我们和客户一起进行了多个国密项目的改造之后,这里整理了国密HTTPS 和国
1860 0
关于国密SSL常用的技术原理介绍
|
存储 网络协议 API
NBIOT-BC28模块程序操作接口编写(基于STM32F103ZET6)
NBIOT-BC28模块程序操作接口编写(基于STM32F103ZET6)
580 0