C++ 创建进程时,Windows如何传递ANSI命令行?
在进程初始化期间,Windows会设置,其中包括一个结构C++ 创建进程时,Windows如何传递ANSI命令行?,c++,windows,winapi,command-line,process,C++,Windows,Winapi,Command Line,Process,在进程初始化期间,Windows会设置,其中包括一个结构RTL\u用户\u进程\u参数,该结构反过来指向命令行的UNICODE版本。 您还可以使用GetCommandLineW访问它 GetCommandLineA返回ANSI版本并(显然)指向不同的地址 我的问题是,windows是否在进程创建期间初始化这两个版本,以及哪个数据结构(如果有)指向命令行的ANSI版本?另外,除了调用GetCommandLineA来检索它,还有其他方法吗 感谢我在Windows 7上反汇编了Kernel32,并看到
RTL\u用户\u进程\u参数
,该结构反过来指向命令行的UNICODE版本。您还可以使用
GetCommandLineW
访问它
GetCommandLineA
返回ANSI版本并(显然)指向不同的地址
我的问题是,windows是否在进程创建期间初始化这两个版本,以及哪个数据结构(如果有)指向命令行的ANSI版本?另外,除了调用GetCommandLineA来检索它,还有其他方法吗
感谢我在Windows 7上反汇编了Kernel32,并看到在进程启动期间,它访问进程的
PEB
中的Unicode命令行,并将指向该字符数据的指针存储在GetCommandLineW()
返回的变量中。它还将Unicode数据转换为单独的Ansi缓冲区,该缓冲区GetCommandLineA()
返回指向的指针。据我所知,Ansi缓冲区是内核模块的专用缓冲区,它不存储在PEB
中,因此您不太可能像使用Unicode缓冲区一样跨进程边界访问Ansi缓冲区。我在Windows 7上反汇编了Kernel32,并看到在进程启动期间,它访问进程的PEB
中的Unicode命令行,并将指向该字符数据的指针存储在GetCommandLineW()
返回的变量中。它还将Unicode数据转换为单独的Ansi缓冲区,该缓冲区GetCommandLineA()
返回指向的指针。据我所知,Ansi缓冲区是内核模块的专用缓冲区,它不存储在PEB
中,因此您不太可能像使用Unicode缓冲区一样跨进程边界访问Ansi缓冲区。任何地方都不可能存储Ansi版本。当您请求ANSI版本时,Windows会将Unicode版本转换为ANSI。实际上,有一个ANSI版本。进入GetCommandLineA的程序集可以确认它有什么问题GetCommandLineA
?@CaptainObvlious必须在某个地方存储ANSI版本。看看GetCommandLineA
@DavidHeffernan的原型,我正在尝试为一个进程动态创建一个不同的命令行。这是我正在进行的一项关于进程创建和可执行文件格式的研究的一部分。当您请求ANSI版本时,Windows会将Unicode版本转换为ANSI。实际上,有一个ANSI版本。进入GetCommandLineA的程序集可以确认它有什么问题GetCommandLineA
?@CaptainObvlious必须在某个地方存储ANSI版本。看看GetCommandLineA
@DavidHeffernan的原型,我正在尝试为一个进程动态创建一个不同的命令行。这是我正在进行的关于进程创建和可执行文件格式的研究的一部分。谢谢雷米!你知道Windows是否在已知的固定地址中设置指向ANSI缓冲区的指针吗?谢谢你!您知道Windows是否在已知的固定地址中设置指向ANSI缓冲区的指针吗?