windows打开程序过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows打开程序过程相关的知识,希望对你有一定的参考价值。

参考技术A 当双击某个图标时,Explorer.exe进程的一个线程会侦测到这个操作,它根据注册表中的信息取得文件名,然后Explorer.exe 以这个文件名调用 CreateProcess 函数。注册表中有相关的项保存着双击操作的信息,如 exe 文件关联、启动 exe 的 Shell 是哪个。PC中的大多其它的进程都是 Explorer.exe 的子进程,因为它们都是由Explorer.exe 进程创建的。
CreateProcess 实际上是通过 NtCreateProcess 函数实现的, 此时,系统会创建一个进程内核对象。进程内核对象可以看作是操作系统用来管理进程的小的数据结构,它是在内核堆区分配的一个结构体,是系统用来存放关于进程统计信息的地方。进程内核对象维护了一个句柄表的结构,当进程被初始化之后,其句柄表是空的。当进程内的一个线程通过指定的函数创建了一个内核对象时,内核会为对象分配一块内存区域并初始化这块区域,然后内核会在进程的句柄表中查找一个空的入口,找到之后会初始化句柄表的以索引定位的区域。初始化的主要过程就是填充句柄表的一个单元,包括指定内核对象地址,指定访问码,指定标记等。

进程内核对象创建后,它的引用计数被置为1。然后系统为刚刚创建的进程分配的进程虚拟地址空间。要注意了,之所以称为虚拟地址空间,就是因为这块地址空间并不在内存之中,它只是在硬盘上划分的被称为“页”的文件。每个进程都有自己的虚拟地址空间,在进程初始化的时候,其所有的程序和数据会被加载到这个地址空间中。等到真正运行的时候,系统为每个进程配置的页表会把虚拟地址映射为真正的物理地址(这个过程,我会在后面的博客中详细介绍如何映射)。
初始化虚拟地址空间。进程地址空间创建后,Windows的装载器(loader,也称为PE装载器)开始工作,Loader会读取EXE文件的信息(PE文件)。此时 loader 会检查PE文件的有效性,如果PE文件有错误,进程也就无法启动了。如果PE文件没有错误,装载器就把PE文件的内容(二进制代码)映射到进程的地址空间中,然后读取 PE文件的导入地址表(Import Table),这里存放有exe文件需要导入的模块文件(DLL),系统会一一加载这些DLL到进程的地址空间中,具体做法是调用 LoadLibrary 函数加载程序代码到某个地址,然后系统会映射这些代码到进程的地址空间中,要知道DLL只需加载一次就可映射到所有进程的地址空间(映射过程我会在后面详细阐述)中,并为每个DLL维护一个引用计数,当引用计数为 0 时,DLL就从内存中卸载,释放占用的内存。DLL里面可能又引用了其它的DLL,因此加载DLL时是递归形式的,直到加载完Import Table 里描述的所有DLL模块,此时进程初始化部分完成。
创建进程的主线程。当进程的初始化完成后,开始创建进程的主线程,一个进程至少要有一个主线程才能运行,可以说进程只是充当一个容器的作用,而线程才是执行代码的载体。线程是用 CreateThread 这个函数创建的。创建线程时,也和进程相似,系统会创建线程内核对象,初始化线程堆栈。线程堆栈有两个,一个是核心堆栈,由核心态维护;另一个是用户堆栈,运行在用户态下。同样的,线程的引用计数也置为1。
C/C++运行期库初始化。当进程的主线程初始化完成后,并且线程得到了CPU时间片,CPU把CS:IP指向程序入口(OEP),这个地址相当重要,因为这是程序运行时第一条指令所在的地址(我们可以使用一些PE辅助工具来查看PE文件的地址信息,注意真实地址==偏移地址 + 基址)。其实,CS:IP指向的地址处是一条JMP指令,它跳转到程序真正的入口函数,入口函数有以下4种形式:
···
mainCRTStartup (用于 ANSI 版本的控制台应用程序 )
wmainCRTStartup ( 用于 Unicode 版本的控制台应用程序 )
WinMainCRTStartup ( 用于 ANSI 版本的窗口应用程序 )
wWinMainCRTStartup ( 用于 Unicode 版本的窗口应用程序)
···
下面再看看入口函数的源码:
···
int XXXCRTStartup(void) //XXX表示不同Windows版本
__security_init_cookie(); // 完成安全方面的初始化
return__tmainCRTStartup();

···
在__tmainCRTStartup中首先调用了GetStartupInfoW函数取得父进程创建本进程时的启动信息, 然后又是一系列的初始化,其中包括C++构造函数的调用,还有静态变量,全局变量的初始化,这些操作是在_initterm这个函数中完成的。接着,我们的 (w)WinMain / (w)main 函数会被调用,到这时,用户程序代码才开始被执行。

使用 Windows 任务计划程序执行存储过程

【中文标题】使用 Windows 任务计划程序执行存储过程【英文标题】:Executing a stored procedure using Windows task Scheduler 【发布时间】:2012-12-28 13:33:45 【问题描述】:

我一直在尝试设置一个计划,以便在 Windows 任务计划程序中每小时运行一个存储过程(因为我正在使用 SQL Express 并且无法安装第 3 方工具),但是在尝试了各种方法之后,例如运行来自任务调度程序的 .bat 文件,从任务调度程序打开 SqlCmd 实用程序并传递命令行语法或 .sql 脚本文件我没有运气。

我知道这是可以做到的,因此我确信这是我错过的东西,但如果有人能分享他们的经验,我将非常感激。

以下命令在批处理文件中...

sqlcmd -E -i"C:\Users\Administrator\Desktop\test.sql" -o"C:\Users\Administrator\Desktop\dump.txt"

非常感谢

【问题讨论】:

使用 sqlcmd 看起来很合理。为什么你在那个上失败了? 看起来很有帮助:***.com/questions/3794897/… 运行 SQLCMD 的 .bat 文件不起作用怎么办?给我们详细信息。 不确定 - 目前该操作会打开 SqlCmd 实用程序“C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE”,并且在参数字段中我有 sqlcmd - E -i"C:\Users\Administrator\Desktop\test.sql" -o"C:\Users\Administrator\Desktop\dump.txt" 据我了解,-E 表示受信任的“连接”,不定义服务器 (-S) 表示它将选择默认实例。在 sql 脚本文件中,我只有 EXEC databasename.dbo.storedprocedurename,当我在 sqlcmd 实用程序中手动输入它时,它可以工作,但是当我在任务上单击“运行”时,什么也没有发生 - 不确定它是否在做任何事情,但什么也没有出现在表和我指定为输出的 dump.txt 文件中没有创建,所以我猜它什么也没做 【参考方案1】:

如果您是 sql 实例的管理员(因为您使用的是 SQLExpress,我敢打赌您正尝试在自己的计算机上执行此操作,因此您的用户很有可能是 sql 实例的管理员)您不应该使用-E 完全没有,忽略它。

其次,即使在本地工作也要指定服务器。

从一个简单的 sql 命令开始,如下所示:

sqlcmd.exe -S "." -d MY_DATABASE -Q "SELECT * FROM MY_TABLE"

将 MY_DATABASE 和 MY_TABLE 替换为您的数据库名和表名。确保您可以从命令行运行它。它应该从您的表中返回数据。 (注意命令行选项区分大小写,所以 -s 与 -S 不同)

最后,不要尝试通过任务调度程序提供参数。将带有所有参数的命令放在 .bat 文件中,然后从任务调度程序运行批处理。

【讨论】:

不,我已经远程连接到 SQL Server 所在的计算机,而不是尝试在本地执行此操作。我会试试你的建议,但关于批处理文件 - 该文件的外观如何? SQLExpress 默认配置为拒绝远程连接。你确定你可以从你的机器连接到那个远程 SQLExpress 吗?例如,您可以尝试使用 Management Studio 是的,我可以从我自己机器上的管理工作室连接到它 所以我还是建议忽略 -E 参数,用 -S 指定服务器,分别用 -U 和 -P 指定用户名和密码。首先忘记调度并确保您可以从命令行运行命令。 让我们continue this discussion in chat【参考方案2】:

我最近遇到了类似的问题,我的经验可能会对您有所帮助。我正在调用一个小应用程序,即批处理文件中的 EXE。我正在安排批处理文件从 Windows 任务计划程序运行。该应用程序正在使用 Windows 身份验证访问 SQL 数据。 我可以直接运行应用程序,即单击 EXE 运行它。 我可以从批处理文件运行应用程序。 但是,如果我尝试运行计划任务,它似乎开始但什么也没做,也没有发布我能找到的错误。 我发现如果我将应用程序更改为使用 SQL 身份验证运行,它可以从任务计划程序运行。

我怀疑当 Windows 身份验证从 SQL 无法识别的任务计划程序运行时,它的上下文存在某些问题。

【讨论】:

以上是关于windows打开程序过程的主要内容,如果未能解决你的问题,请参考以下文章

使用windows 2012 建立FTP服务器的过程.

Jmeter5.3(windows下)安装过程问题总结

Jmeter5.3(windows下)安装过程问题总结

Jmeter5.3(windows下)安装过程问题总结

cwindows应用程序的唯一入口点是

如何在windows里面启动一个程序的时候,让另一个程序也伴随运行?需要在这个程序后面加啥参数?