|
传奇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.
|
|