我正在开发一个可以在winlogon桌面上启动程序的项目.该程序在调试时工作正常但是当我在ide之外启动它时,它会因臭名昭着的c0000005错误而失败.最奇怪的是它似乎没有出现在任何特定的行上.这是代码:
#include "stdafx.h"
#include <windows.h>
#include "BinRes.h"
#include <string>
#include <iostream>
int main(int argc, char* argv[])
{
if(argc != 2)
{
return 0;
}
std::string a;
a.append(BinRes::getAppLocation());
a.append("\\wls.exe");
BinRes::ExtractBinResource("EXE",102,"wls.exe");
Sleep(500);
SC_HANDLE schsm;
schsm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE schs;
schs = CreateService(schsm,"WLS","WLS",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_DEMAND_START,NULL,a.c_str(),0,0,0,0,0);
char* cd = argv[1];
LPCSTR* arg = (LPCSTR*)&cd;
StartService(schs,1,arg);
HANDLE endevent;
endevent = OpenEvent(EVENT_ALL_ACCESS,TRUE,"ENDWLS");
WaitForSingleObject(endevent,INFINITE);
SERVICE_STATUS ss;
QueryServiceStatus(schs,&ss);
if(ss.dwCurrentState != SERVICE_STOPPED)
{
LPSERVICE_STATUS xyz = (LPSERVICE_STATUS)malloc(sizeof(LPSERVICE_STATUS));
ControlService(schs,SERVICE_CONTROL_STOP,xyz);
}
DeleteService(schs);
//error occurs right here
DeleteFile(a.c_str());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该错误始终发生在DeleteService之后和下一行之前,但我确定它不是DeleteService,因为该服务已被删除.我试着注释掉DeleteService和DeleteFile,但它仍然崩溃了.我确定我犯了一些傻瓜错误而且我只是失明了.在此先感谢您的帮助!
我认为问题在于
LPSERVICE_STATUS xyz = (LPSERVICE_STATUS)malloc(sizeof(LPSERVICE_STATUS));
ControlService(schs,SERVICE_CONTROL_STOP,xyz);
Run Code Online (Sandbox Code Playgroud)
部分.该API使用最后一个参数xyz到ControlService来返回有关服务的状态信息.你实际上是在这里传递一个指向指针大小的内存区域的指针,它太小了,无法容纳ControlService想要填写的所有值.恕我直言,你在运行时被咬,因为执行ControlService调用会覆盖随机内存直接在malloc分配的指针空间之后.
尝试
SERVICE_STATUS xyz;
memset(&xyz, 0, sizeof(xyz));
ControlService(schs, SERVICE_CONTROL_STOP, &xyz);
Run Code Online (Sandbox Code Playgroud)
代替.这里不需要动态分配结构.根据文档,ControlService将仅使用它来返回状态信息; 它不会存储在Windows内部数据结构中的某个位置.
有关结构内容的更多信息可以在MS文档中找到.不知道,为什么它可能在调试期间工作.也许,与生产版本malloc相比,与调试相关联的malloc行为略有不同?
| 归档时间: |
|
| 查看次数: |
1928 次 |
| 最近记录: |