aboutsummaryrefslogblamecommitdiffstats
path: root/Game/Code/lib/zlportio/ddkint.pas
blob: 2b70ee544ba0a37da6fa56d1b0072cee7355ec9f (plain) (tree)




























































































































































































































































                                                                                     
{ -----------------------------------------------------------------------------}
{ Copyright 2000-2001, Zloba Alexander.  All Rights Reserved.                  }
{ This unit can be freely used and distributed in commercial and private       }
{ environments, provided this notice is not modified in any way.               }
{ -----------------------------------------------------------------------------}
{ Feel free to contact me if you have any questions, comments or suggestions at}
{   zal@specosoft.com (Zloba Alexander)                                        }
{ You can always find the latest version of this unit at:                      }
{   http://www.specosoft.com                                                   }

{ -----------------------------------------------------------------------------}
{ Date last modified:  08/10/2001                                              }
{ -----------------------------------------------------------------------------}
{ Description:                                                                 }
{   This unit include service function to work with NT drivers and some        }
{    constant from ntddk.h                                                     }
{------------------------------------------------------------------------------}
{ Revision History:                                                            }
{ 1.00:  + First public release                                                }
{ 1.10:  + added compiler directives for correct compilation                   }
{ 1.20:  + optimized code                                                      }
{ 1.30:  + added constant for compatibility with delphi 3.0                    }
{------------------------------------------------------------------------------}

{$A-,H-}
unit ddkint;

interface
uses
    windows,
    winsvc;

function CTL_CODE(const DeviceType,Func,Method,Access:Cardinal):cardinal;

const
 FILE_DEVICE_BEEP               = $00000001;
 FILE_DEVICE_CD_ROM             = $00000002;
 FILE_DEVICE_CD_ROM_FILE_SYSTEM = $00000003;
 FILE_DEVICE_CONTROLLER         = $00000004;
 FILE_DEVICE_DATALINK           = $00000005;
 FILE_DEVICE_DFS                = $00000006;
 FILE_DEVICE_DISK               = $00000007;
 FILE_DEVICE_DISK_FILE_SYSTEM   = $00000008;
 FILE_DEVICE_FILE_SYSTEM        = $00000009;
 FILE_DEVICE_INPORT_PORT        = $0000000a;
 FILE_DEVICE_KEYBOARD           = $0000000b;
 FILE_DEVICE_MAILSLOT           = $0000000c;
 FILE_DEVICE_MIDI_IN            = $0000000d;
 FILE_DEVICE_MIDI_OUT           = $0000000e;
 FILE_DEVICE_MOUSE              = $0000000f;
 FILE_DEVICE_MULTI_UNC_PROVIDER = $00000010;
 FILE_DEVICE_NAMED_PIPE         = $00000011;
 FILE_DEVICE_NETWORK            = $00000012;
 FILE_DEVICE_NETWORK_BROWSER    = $00000013;
 FILE_DEVICE_NETWORK_FILE_SYSTEM= $00000014;
 FILE_DEVICE_NULL               = $00000015;
 FILE_DEVICE_PARALLEL_PORT      = $00000016;
 FILE_DEVICE_PHYSICAL_NETCARD   = $00000017;
 FILE_DEVICE_PRINTER            = $00000018;
 FILE_DEVICE_SCANNER            = $00000019;
 FILE_DEVICE_SERIAL_MOUSE_PORT  = $0000001a;
 FILE_DEVICE_SERIAL_PORT        = $0000001b;
 FILE_DEVICE_SCREEN             = $0000001c;
 FILE_DEVICE_SOUND              = $0000001d;
 FILE_DEVICE_STREAMS            = $0000001e;
 FILE_DEVICE_TAPE               = $0000001f;
 FILE_DEVICE_TAPE_FILE_SYSTEM   = $00000020;
 FILE_DEVICE_TRANSPORT          = $00000021;
 FILE_DEVICE_UNKNOWN            = $00000022;
 FILE_DEVICE_VIDEO              = $00000023;
 FILE_DEVICE_VIRTUAL_DISK       = $00000024;
 FILE_DEVICE_WAVE_IN            = $00000025;
 FILE_DEVICE_WAVE_OUT           = $00000026;
 FILE_DEVICE_8042_PORT          = $00000027;
 FILE_DEVICE_NETWORK_REDIRECTOR = $00000028;
 FILE_DEVICE_BATTERY            = $00000029;
 FILE_DEVICE_BUS_EXTENDER       = $0000002a;
 FILE_DEVICE_MODEM              = $0000002b;
 FILE_DEVICE_VDM                = $0000002c;
 FILE_DEVICE_MASS_STORAGE       = $0000002d;
 FILE_DEVICE_SMB                = $0000002e;
 FILE_DEVICE_KS                 = $0000002f;
 FILE_DEVICE_CHANGER            = $00000030;
 FILE_DEVICE_SMARTCARD          = $00000031;
 FILE_DEVICE_ACPI               = $00000032;
 FILE_DEVICE_DVD                = $00000033;
 FILE_DEVICE_FULLSCREEN_VIDEO   = $00000034;
 FILE_DEVICE_DFS_FILE_SYSTEM    = $00000035;
 FILE_DEVICE_DFS_VOLUME         = $00000036;
 FILE_DEVICE_SERENUM            = $00000037;
 FILE_DEVICE_TERMSRV            = $00000038;
 FILE_DEVICE_KSEC               = $00000039;

 FILE_DEVICE_KRNLDRVR           = $80ff;

 METHOD_BUFFERED   =              0;
 METHOD_IN_DIRECT  =              1;
 METHOD_OUT_DIRECT =              2;
 METHOD_NEITHER    =              3;

 FILE_ANY_ACCESS     =            0;
 FILE_SPECIAL_ACCESS =   (FILE_ANY_ACCESS);
 FILE_READ_ACCESS    =      ( $0001 );    // file & pipe
 FILE_WRITE_ACCESS   =      ( $0002 );    // file & pipe

 {$IFDEF VER100 or VER110}
 // for compatibilty with delphi 3.0
const
  SERVICE_KERNEL_DRIVER         = $00000001;
  SERVICE_DEMAND_START          = $00000003;
  SERVICE_ERROR_NORMAL          = $00000001;

{$ENDIF}

function driverstart(const name:pchar):integer;
function driverstop(const name:pchar):integer;

// for this function must have Administrators or Power users rigths
function driverinstall(const path,name:pchar):integer;
function driverremove(const name:pchar):integer;


// exlpanation function
function messagestring(const error:integer):string;

implementation

function CTL_CODE(const DeviceType,Func,Method,Access:Cardinal):cardinal;
begin
 Result := DeviceType shl 16 or Access shl 14 or Func shl 2 or Method;
end;


function driverinstall(const path,name:pchar):integer;
var hService: SC_HANDLE;
    hSCMan  : SC_HANDLE;
begin

  Result := 0;

  hSCMan := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if hSCMan = 0 then  begin
   result := getlasterror;
   exit;
  end;

  hService := CreateService(hSCMan, name,name,
              SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
              SERVICE_ERROR_NORMAL, path,
              nil, nil, nil, nil, nil);

  if (hService = 0) then begin
    result := getlasterror;
    CloseServiceHandle(hSCMan);
    exit;
  end
  else
    CloseServiceHandle(hService);
  CloseServiceHandle(hSCMan);
end;

function driverstart(const name:pchar):integer;
var
  hService: SC_HANDLE;
  hSCMan  : SC_HANDLE;
  args:pchar;
begin

  hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if hSCMan = 0 then  begin
   result := getlasterror;
   exit;
  end;

  // get a handle to the service
  hService := OpenService(hSCMan, name, SERVICE_START);
  if hService <> 0 then Begin
     // start the driver
    args := nil;
    Result := 0;
    if integer(StartService(hService, 0, args ))=0 then
      result := getlasterror;
    CloseServiceHandle(hService);
  end
  else
    result := getlasterror;
  CloseServiceHandle(hSCMan);
end;

function driverstop(const name:pchar):integer;
Var
  serviceStatus: TServiceStatus;
  hService: SC_HANDLE;
  hSCMan  : SC_HANDLE;
begin

  hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if hSCMan = 0 then  begin
   result := getlasterror;
   exit;
  end;

  // get a handle to the service
  hService := OpenService(hSCMan, Name, SERVICE_STOP);
  if hService <> 0 then Begin
     // start the driver
    Result := 0;
    if integer(ControlService(hService, SERVICE_CONTROL_STOP, serviceStatus))=0 then
      result := getlasterror;
    CloseServiceHandle(hService);
  end
  else
    result := getlasterror;
  CloseServiceHandle(hSCMan);
end;

function driverremove(const name:pchar):integer;
Var
  hService: SC_HANDLE;
  hSCMan  : SC_HANDLE;
begin

  hSCMan := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if hSCMan = 0 then  begin
    result := getlasterror;
    exit;
  end;

  // get a handle to the service
  hService := OpenService(hSCMan, Name, SERVICE_ALL_ACCESS);
  if hService <> 0 then Begin
    // remove driver description from the registry
    Result := 0;
    if integer(DeleteService(hService)) = 0 then
      result := getlasterror;
    CloseServiceHandle(hService);
  end
  else
    result := getlasterror;
  CloseServiceHandle(hSCMan);
end;

function messagestring(const error:integer):string;
var p:pchar;
begin
  GetMem(p, 200);
  FillChar(p^, 200, 0);
  formatmessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,error,0,p,199,nil);
  Result := p;
  freemem(p,200);
end;

end.