我有一个Win32 C ++应用程序,我需要在该应用程序中修改命令行参数。具体来说,我想以GetCommandLineW()
返回我的新参数的方式来编辑命令行参数。
信不信由你,这行得通(因为我们有一个指向字符数组的非常量指针):
LPTSTR args = GetCommandLineW();
LPTSTR new_args = L"foo --bar=baz";
wmemcpy(args, new_args, lstrlenW(new_args));
// ...
LPTSTR args2 = GetGommentLineW(); // <- equals "foo --bar=baz"
但是我不知道Windows为LPTSTR
提供的GetCommandLineW()
分配了多少内存。
还有另一种方法吗?还是有人知道命令行参数是否分配了可预测的内存量?
GetCommandLineW()
不分配任何内存。创建进程时,它仅返回指向由OS在进程的PEB
结构中分配的缓冲区的指针。该缓冲区在整个过程的生命周期中都存在。
修改该函数返回的内容的最干净,最安全的方法是修改该函数。安装一个绕道,以便从您的进程内部对函数的所有调用都重新路由到您提供的函数。
使用以下代码检查PEB
(unicode)字符串所在的PEB结构。
在我的机器上,在x86和x64下,CommandLine
就在CommandLine
之后,因此我认为前者也不会有更多空间。向该缓冲区写入更长的字符串可能会导致溢出。
ImagePathName