hhcwy
驱动牛犊
驱动牛犊
  • 注册日期2004-07-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分85分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:998回复:0

关于驱动安装的问题(ifs)

楼主#
更多 发布于:2008-04-22 18:36
我修改了sfiter,添加了文件隐藏功能,主要处理set information,create,querydirectory这三个派遣过程,但现在有个问题,就是如果在系统启动后启动就一切正常,如果使用自动方式就问题多多,一种是启动后services.exe进程狂吃内存,直到虚拟内存满为止,其后可以正常使用,一种是启动到桌面后系统变得反映很迟钝,我的启动注册代码如下,请各位帮着看一下,已经搞了两天了,没有什么进展,是我的注册方法不对,还是必须使用inf文件安装?:
procedure StartSvr(szSvrName:String; SYS_FILE_NAME:String; ServiceType:ULONG);
var
    m_sManager,m_sService:SC_HANDLE;
    DriverName:Array[0..255] of Char;
    p:PChar;
    errCode:ULONG;
    state:TServiceStatus;
begin
    m_sManager:=0;
    m_sService:=0;
    fillChar(DriverName,sizeof(DriverName),0);
    GetSystemDirectory(DriverName, sizeof(DriverName));
    strcat(PChar(@DriverName), PChar(SYS_FILE_NAME));                            
    m_sManager := OpenSCManager( nil, nil, SC_MANAGER_ALL_ACCESS);
    if (m_sManager=0) then
    Exit;

    m_sService := CreateService(
        m_sManager,
        PChar(szSvrName),
        PChar(szSvrName),
        SERVICE_ALL_ACCESS,
        ServiceType,
        SERVICE_DEMAND_START,//SERVICE_AUTO_START
        SERVICE_ERROR_IGNORE,
        DriverName,
        nil,nil,nil,nil,nil);
    try
        errCode:=GetLastError();
        if (ERROR_SERVICE_EXISTS <> errCode) and (m_sService=0) then
        begin
            Exit;
        end;
        m_sService := OpenService(m_sManager, PChar(szSvrName), SERVICE_ALL_ACCESS);
        if (m_sService=0) then
        begin
            Exit;
        end;

        {
        FillChar(state,sizeof(state),0);

        if not QueryServiceStatus(m_sService,state) then
            Exit;
        if state.dwCurrentState in [SERVICE_START_PENDING,SERVICE_RUNNING,SERVICE_CONTINUE_PENDING] then
            Exit;
        }
        //Ready For Start Service
        p:=nil;
        if (not StartService(m_sService, 0, p)) then
        begin
            errCode:=GetLastError();
            if ERROR_SERVICE_ALREADY_RUNNING=errCode then
                Exit;
        end;
    finally
        if m_sService<>0 then
            CloseServiceHandle(m_sService);
        if m_sManager<>0 then
            CloseServiceHandle(m_sManager);
    end
end;
游客

返回顶部