尝试为可执行文件创建加载程序时,如果在Parameters中提供的字符串长度超过某个长度,则无法执行。但是参数完全从初始化文件中读取。当Parameters = Null时,它也会崩溃。
typedef int (__cdecl *ExecMain_t)(HINSTANCE, HINSTANCE, LPSTR, int);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HMODULE Loader = LoadLibraryExA(".\\library.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
char* Parameters;
CIniFile iniReader(".\\Configure.ini");
Parameters = iniReader.IniReadValue("App", "Parameters");
char xCommand[MAX_PATH] = {0};
_snprintf_s(xCommand, _TRUNCATE, "-verify "); //parameter from exe
strcat_s(xCommand, _TRUNCATE, Parameters);
strcpy_s(lpCmdLine, _TRUNCATE, xCommand);
delete[] Parameters;
Parameters = NULL;
ExecMain_t procExecMain = (ExecMain_t)GetProcAddress(Loader,"ExecMain");
procExecMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
return 1;
}
崩溃说明:
问题事件名称:APPCRASH 应用程序名称:exec.exe 应用版本:0.0.0.0 应用程序时间戳:530df50a 故障模块名称:KERNELBASE.dll 故障模块版本:6.2.9200.16384
编辑:试图弄清楚当参数字符串长度增加时它崩溃的原因。
如果我传递更多字符和“-verify”(从exe传递参数)
,甚至会崩溃EDIT2:通过_TRUNCATE替换MAX_PATH来修改代码。似乎适用于参数中的某些字符但超出时会崩溃。
答案 0 :(得分:0)
以下是几个问题:
char xCommand[MAX_PATH] = {0};
_snprintf_s(xCommand, _TRUNCATE, "-verify "); //parameter from exe
strcat_s(xCommand, _TRUNCATE, Parameters);
strcpy_s(lpCmdLine, _TRUNCATE, xCommand);
我认为您应该使用strcpy_s
代替_snprintf_s
,毕竟我没有看到您在xCommand
中打印任何格式。
然后,第二个参数_TRUNCATE
实际上应该是MAX_PATH
,因为此函数的第二个参数是目标缓冲区的元素数。
但最重要的是,第三行是完全错误的,因为你试图写入输入缓冲区lpCmdLine
并且会覆盖超出缓冲区边界的内存。您需要的是将原始缓冲区的内容复制到新的命令缓冲区中。这样的事情(注意我在浏览器中编写了这段代码,因此它可能包含错误):
char xCommand[MAX_PATH] = {0};
strcpy_s(xCommand, MAX_PATH, lpCmdLine); // copy the original command line
strcat_s(xCommand, MAX_PATH, " -verify "); // append
strcat_s(xCommand, MAX_PATH, Parameters); // append
然后将此缓冲区传递给ExecMain
函数:
procExecMain(hInstance, hPrevInstance, xCommand, nCmdShow);