传奇一条龙,复古传奇,GM基地,传奇服务端

 找回密码
 立即注册

QQ登录

只需一步,快速开始

网友自助信息发布区,请自行甄别

查看: 676|回复: 2

传奇3大补帖1.82初始版源代码 - Delphi版

[复制链接]

624

帖子

2131

钻石

1354

积分

管理员

Rank: 9Rank: 9Rank: 9

在线时间
109 小时
发表于 2018-12-2 22:29:12 | 显示全部楼层 |阅读模式
传奇3大补帖1.82初始版源代码 - Delphi版


    {打开Service Control Manager}
    SchSCManager := OpenSCManager (nil,                       { 机器 (nil = 本机) }
                                  nil,                        { 数据库 (nil = 默认 }
                                  SC_MANAGER_ALL_ACCESS);     { 访问权 }

    if (SchSCManager = 0) then
      if (GetLastError = ERROR_ACCESS_DENIED) then
      begin
         { 没有权限打开SCM管理,必须是poor用户}
         showmessage('PortTalk: 没有权限访问Service Control Manager,'#$D#$A+
                     '不能安装和启动PortTalk,请使用超级用户来安装。');
         result:=false;
         exit;
      end;

    repeat begin
         {打开PortTalk服务数据库}
         schService := OpenService(SchSCManager,       {服务数据库句柄}
                                  'PortTalk',          {要启动的服务名}
                                  SERVICE_ALL_ACCESS); {存取的权限}

         if (schService = 0) then
            case (GetLastError) of
                ERROR_ACCESS_DENIED:
                   begin
                        showmessage('PortTalk: 没有权限访问PortTalk服务数据库');
                        result:=false;
                        exit;
                   end;
                ERROR_INVALID_NAME:
                   begin
                        showmessage('PortTalk: 指定的服务名无效');
                        result:=false;
                        exit;
                   end;
                ERROR_SERVICE_DOES_NOT_EXIST:
                   begin
                        showmessage('PortTalk: PortTalk驱动程序不存在');
                        InstallPortTalkDriver;
                   end;
            end;
     end until (schService <> 0);

    {启动PortTalk驱动程序,如果发生错误,一般是由于PortTalk.SYS不存在。}

    ret := TNewStartService(@StartService) (schService,  {服务标识}
                        0,             {参数个数}
                        nil);         {参数}

    if (ret) then //showmessage('PortTalk: PortTalk安装成功!')
    else begin
        err := GetLastError;
        if (err = ERROR_SERVICE_ALREADY_RUNNING) then
          showmessage('PortTalk: PortTalk已经安装')
        else begin
          showmessage('PortTalk: 启动PortTalk时发生未知错误。'+#$D#$A+
                      'PortTalk.SYS没有放入\System32\Drivers目录吗?');
          result:=false;
          exit;
        end;
    end;

    {关闭Service Control Manager}
    CloseServiceHandle (schService);
    result:=TRUE;
end;

procedure InstallPortTalkDriver;
var
    SchSCManager:SC_HANDLE;
    schService:SC_HANDLE;
    err:DWORD;
    DriverFileName:array[0..79]of CHAR;
begin
    if (GetSystemDirectory(DriverFileName, 55)=0) then
    begin
       showmessage('PortTalk: 取System目录出错');
       exit;
    end;

    {加入驱动程序文件名}
    lstrcat(DriverFileName,'\Drivers\PortTalk.sys');
    showmessagefmt('PortTalk: 拷贝驱动程序到%s',[DriverFileName]);

    {拷贝驱动程序到System32/drivers目录,如果出错,一般是因为文件不存在。}

    if (not CopyFile('PortTalk.sys', DriverFileName, FALSE)) then
    begin
         showmessagefmt('PortTalk: 拷贝驱动程序到以下位置出错:%s'+#$D#$A+
                        '请手工拷贝到system32/driver目录',
                        [DriverFileName]);
         exit;
    end;

    {打开Service Control Manager}
    SchSCManager := OpenSCManager (nil,                   { 机器 (nil = 本机) }
                                  nil,                    { 数据库 (nil = 默认 }
                                  SC_MANAGER_ALL_ACCESS); { 访问权 }

    schService := CreateService (SchSCManager,                     { SCManager数据库 }
                                'PortTalk',                        { 服务个数 }
                                'PortTalk',                        { 显示名 }
                                SERVICE_ALL_ACCESS,                { 权限 }
                                SERVICE_KERNEL_DRIVER,             { 服务类别 }
                                SERVICE_DEMAND_START,              { 启动类别 }
                                SERVICE_ERROR_NORMAL,              { 出错控件类别 }
                                'System32\Drivers\PortTalk.sys',   { 服务二进制文件 }
                                nil,                               { 加入的组 }
                                nil,                               { 标识 }
                                nil,                               { 隶属 }
                                nil,                               { 本地帐户 }
                                nil                                { 密码 }
                                );

    if (schService = 0) then
    begin
         err := GetLastError;
         if (err = ERROR_SERVICE_EXISTS) then
               showmessage('PortTalk: 驱动程序不存在。')
         else  showmessage('PortTalk:建立服务时发生未知的错误。');
    end
    else showmessage('PortTalk: 成功安装!');

    { 关闭Service Control Manager }
    CloseServiceHandle (schService);
end;
end.
游客,如果您要查看本帖隐藏内容请回复


回复

使用道具 举报

19

帖子

52

钻石

19

积分

初级GM

Rank: 1

在线时间
0 小时
发表于 2020-7-15 16:20:51 | 显示全部楼层
始版源代码 - De
回复

使用道具 举报

201

帖子

73

钻石

212

积分

中级GM

Rank: 2

在线时间
11 小时
发表于 2020-8-31 08:48:07 | 显示全部楼层
客户端和服务器C++工程使用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|85ji.com Inc.最大的GM论坛交流基地 ( 粤ICP备11015868号-18 ) 传奇私服 Array7.2 版权所有 © 八五论坛 Comsenz Inc.

快速回复 快速发帖 返回顶部 返回列表