写入命令行参数

时间:2017-11-06 11:30:42

标签: c winapi command-line

是否安全(不会导致未定义的行为)覆盖从调用GetCommandLine函数返回的命令行字符串?

*(GetCommandLineW() + 1) = L'x'; // should be fine, right?

我不确定是否将返回的字符串视为字符串文字,因为相应内存页面的指定保护属性似乎有区别。

MEMORY_BASIC_INFORMATION mbiMemPage;

VirtualQuery(GetCommandLineW(), &mbiMemPage,
             sizeof(MEMORY_BASIC_INFORMATION)); // mbiMemPage.Protect = PAGE_READWRITE

VirtualQuery(L"some string", &mbiMemPage,
             sizeof(MEMORY_BASIC_INFORMATION)); // mbiMemPage.Protect = PAGE_EXECUTE_READ

1 个答案:

答案 0 :(得分:4)

GetCommandLineW返回指向存储在PEB中的字符串的指针,但这是一个实现细节。在每个发布的Windows NT版本上修改字符串是安全的,但这并不意味着它将永远保持这样。但是,返回类型是LPTSTR而不是LPCTSTR,因此我发现将来它不太可能存储在只读页面中。

如果你想冒风险,这取决于你。请记住,您不能超过初始字符串长度,并且有人可以将您的应用程序重命名为“x.exe”,并将其简单地作为“x”运行,只留下两个字符。

如果您只想解析并提取参数,可以使用CommandLineToArgvW