是否安全(不会导致未定义的行为)覆盖从调用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
答案 0 :(得分:4)
GetCommandLineW
返回指向存储在PEB中的字符串的指针,但这是一个实现细节。在每个发布的Windows NT版本上修改字符串是安全的,但这并不意味着它将永远保持这样。但是,返回类型是LPTSTR而不是LPCTSTR,因此我发现将来它不太可能存储在只读页面中。
如果你想冒风险,这取决于你。请记住,您不能超过初始字符串长度,并且有人可以将您的应用程序重命名为“x.exe”,并将其简单地作为“x”运行,只留下两个字符。
如果您只想解析并提取参数,可以使用CommandLineToArgvW
。