www.pudn.com > UCtrl.rar > SYServer.pas


unit SYServer; 
 
interface 
 
uses Windows, WinSvc; 
 
type 
  TSYServer = class 
  private 
  protected 
  //---------------------------------------------------------------------------- 
    function ServiceConnect: SC_HANDLE; 
    function ServiceDisconn(hService: SC_HANDLE): SC_HANDLE; 
    function ServiceOpen(hService: SC_HANDLE; AServName: PChar): SC_HANDLE; 
    function ServiceClose(hService: SC_HANDLE): Boolean; 
    function ServiceGetStatus(hService: SC_HANDLE; AServName: PChar): DWord; 
    function ServiceUninstalled(hService: SC_HANDLE; AServName: PChar): Boolean; 
    function ServiceRunning(hService: SC_HANDLE; AServName: PChar): Boolean; 
    function ServiceStopped(hService: SC_HANDLE; AServName: PChar): Boolean; 
  //---------------------------------------------------------------------------- 
  //-------- ServiceInstall : ServerName ,Discription ,ServerFilePath 
    {//----- Windows.pas 
    ERROR_ACCESS_DENIED = 5 
    ERROR_CIRCULAR_DEPENDENCY = 1059 
    ERROR_DUP_NAME = 52 
    ERROR_INVALID_HANDLE = 6 
    ERROR_INVALID_NAME = 123 
    ERROR_INVALID_PARAMETER = 87 
    ERROR_INVALID_SERVICE_ACCOUNT = 1057 
    ERROR_SERVICE_EXISTS = 1073 
    } 
 
  public 
    function ServiceInstall(AServName, ADispName, AServPath: PChar): SC_HANDLE; 
  //-------- ServiceUnInstall : ServerName    0: NotFound 1: False 2:Successed 
    function ServiceUnInstall(AServName: PChar): DWORD; 
    //------ ServiceStart  0:NotFound 1: Running 2: Successed 3: False 
    function ServiceStart(AServName: PChar): DWORD; 
    //------ ServiceStop   0:NotFound 1:Stoped 2: Successed 3: False 
    function ServiceStop(AServName: PChar): DWORD; 
    //------ FileHandleOpen  only get a handle Error is CreateFileError 
    function FileHandleOpen(AFileName: PChar): SC_HANDLE; 
    //------ FileHandleClose only Close a handle Result is CloseHandle 
    function FileHandleClose(hFileHandle: SC_HANDLE): Boolean; 
  //---------------------------------------------------------------------------- 
    function IOC(FHandle: SC_HANDLE; NCode: Dword; Pin, Pout: Pointer; InSize, OutSize: Dword): Dword; 
    function CTL_CODE(DeviceType, func, meth, access: integer): DWORD; 
    function IOCExec(AFileName: PChar; NCode: Dword; Pin, Pout: Pointer; InSize, OutSize: Dword): Boolean; 
 //   constructor Create; 
 //   destructor Destroy; override; 
  end; 
 
implementation 
 
{ TSYServer } 
 
function TSYServer.ServiceInstall(AServName, ADispName, AServPath: PChar): SC_HANDLE; 
var 
  hManager: SC_HANDLE; 
begin 
  result := 0; 
  hManager := ServiceConnect; 
  try 
    if ServiceUninstalled(hManager, AServName) then 
    begin 
      result := CreateService(hManager, AServName, ADispName, 
        SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, 
        SERVICE_ERROR_NORMAL, AServPath, nil, nil, nil, nil, nil); 
      ServiceClose(result); 
    end; 
  finally 
    ServiceDisconn(hManager); 
  end; 
end; 
 
function TSYServer.ServiceClose(hService: SC_HANDLE): Boolean; 
begin 
  if (hService <> 0) then 
    result := CloseServiceHandle(hService) 
  else 
    result := True; 
end; 
 
function TSYServer.ServiceConnect: SC_HANDLE; 
begin 
  result := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); 
end; 
 
function TSYServer.ServiceDisconn(hService: SC_HANDLE): SC_HANDLE; 
begin 
  if (hService <> 0) then 
    CloseServiceHandle(hService); 
  result := 0; 
end; 
 
function TSYServer.FileHandleClose(hFileHandle: SC_HANDLE): Boolean; 
begin 
  Result := CloseHandle(hFileHandle); 
end; 
 
function TSYServer.ServiceOpen(hService: SC_HANDLE; AServName: PChar): SC_HANDLE; 
begin 
  result := OpenService(hService, AServName, SERVICE_ALL_ACCESS); 
end; 
 
function TSYServer.FileHandleOpen(AFileName: PChar): SC_HANDLE; 
begin 
  Result := CreateFile(AFileName, GENERIC_READ or GENERIC_WRITE, 0, 
    PSECURITY_DESCRIPTOR(nil), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
end; 
 
function TSYServer.ServiceUnInstall(AServName: PChar): DWORD; 
var 
  hService, hManager: SC_HANDLE; 
  ServiceStatus: TServiceStatus; 
begin 
  result := 0; 
  hManager := ServiceConnect; 
  try 
    if not ServiceUninstalled(hManager, AServName) then 
    begin 
      hService := ServiceOpen(hManager, AServName); 
 
      if (hService <> 0) then 
      begin 
        ControlService(hService, SERVICE_CONTROL_STOP, ServiceStatus); 
        if DeleteService(hService) then 
          result := 2 
        else 
          result := 1; 
      end; 
      ServiceClose(hService); 
    end; 
  finally 
    ServiceDisconn(hManager); 
  end; 
end; 
 
function TSYServer.ServiceStart(AServName: PChar): DWORD; 
var 
  hService, hManager: SC_HANDLE; 
begin 
  result := 0; 
  hManager := ServiceConnect; 
  try 
    if not ServiceUninstalled(hManager, AServName) then 
    begin 
      if not ServiceRunning(hManager, AServName) then 
      begin 
        hService := ServiceOpen(hManager, AServName); 
        if (hService <> 0) then 
          if StartService(hService, 1, AServName) then 
            result := 2 
          else 
            result := 3; 
        ServiceClose(hService); 
      end 
      else 
        result := 1; 
    end; 
  finally 
    ServiceDisconn(hManager); 
  end; 
end; 
 
function TSYServer.ServiceStop(AServName: PChar): DWORD; 
var 
  hService, hManager: SC_HANDLE; 
  ServiceStatus: TServiceStatus; 
begin 
  result := 0; 
  hManager := ServiceConnect; 
  try 
    if not ServiceUninstalled(hManager, AServName) then 
    begin 
      if not ServiceStopped(hManager, AServName) then 
      begin 
        hService := ServiceOpen(hManager, AServName); 
        if (hService <> 0) then 
          if ControlService(hService, SERVICE_CONTROL_STOP, ServiceStatus) then 
            result := 2 
          else 
            result := 3; 
        ServiceClose(hService); 
      end 
      else 
        result := 1; 
    end; 
  finally 
    ServiceDisconn(hManager); 
  end; 
end; 
 
function TSYServer.ServiceGetStatus(hService: SC_HANDLE; AServName: PChar): DWORD; 
var 
  hService2: SC_HANDLE; 
  queryStatus: TServiceStatus; 
  dwStat: DWORD; 
begin 
  dwStat := 0; 
  if (hService > 0) then 
  begin 
    hService2 := ServiceOpen(hService, AServName); 
    if (QueryServiceStatus(hService2, queryStatus)) then 
    begin 
      dwStat := queryStatus.dwCurrentState; 
    end; 
    ServiceClose(hService2); 
  end; 
  Result := dwStat; 
end; 
 
function TSYServer.ServiceUninstalled(hService: SC_HANDLE; AServName: PChar): Boolean; 
begin 
  Result := 0 = ServiceGetStatus(hService, AServName); 
end; 
 
function TSYServer.ServiceRunning(hService: SC_HANDLE; AServName: PChar): Boolean; 
begin 
  Result := SERVICE_RUNNING = ServiceGetStatus(hService, AServName); 
end; 
 
function TSYServer.ServiceStopped(hService: SC_HANDLE; AServName: PChar): Boolean; 
begin 
  Result := SERVICE_STOPPED = ServiceGetStatus(hService, AServName); 
end; 
 
function TSYServer.CTL_CODE(DeviceType, func, meth, access: integer): DWORD; 
begin 
  result := (DeviceType shl 16) or (Access shl 14) or (func shl 2) or (meth); 
end; 
 
function TSYServer.IOC(FHandle: SC_HANDLE; NCode: Dword; Pin, Pout: Pointer; InSize, OutSize: Dword): Dword; 
var 
  CanDo: Boolean; 
  BytesReturned: Dword; 
begin 
  Result := INVALID_HANDLE_VALUE; 
  if (FHandle <> INVALID_HANDLE_VALUE) then begin 
    CanDo := DeviceIoControl(FHandle, NCode, Pin, InSize, Pout, OutSize, BytesReturned, nil); 
    if CanDo then Result := BytesReturned; 
  end; 
end; 
 
function TSYServer.IOCExec(AFileName: PChar; NCode: Dword; Pin, Pout: Pointer; InSize, OutSize: Dword): Boolean; 
var 
  Hd: Dword; 
begin 
  Hd := FileHandleOpen(AFileName); 
  Result := Hd <> INVALID_HANDLE_VALUE; 
  if not Result then Exit; 
  Result := IOC(Hd, NCode, Pin, Pout, InSize, OutSize) <> INVALID_HANDLE_VALUE; 
  FileHandleClose(Hd); 
end; 
 
end.