home *** CD-ROM | disk | FTP | other *** search
- { -----------------------------------------------------------------------------}
- { 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: 06/05/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 }
- {------------------------------------------------------------------------------}
-
- 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
-
- 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 := 0;
-
- 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
- // fuck
- result := getlasterror;
- CloseServiceHandle(hSCMan);
- hSCMan := 0;
- exit;
- end
- else
- CloseServiceHandle(hService);
- CloseServiceHandle(hSCMan);
- end;
-
- function driverstart(const name:pchar):integer;
- var
- hService: SC_HANDLE;
- hSCMan : SC_HANDLE;
- args:pchar;
- begin
-
- Result := 0;
-
- hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
- if hSCMan = 0 then begin
- result := getlasterror;
- exit;
- end;
-
- hService := 0;
-
- // get a handle to the service
- hService := OpenService(hSCMan, name, SERVICE_START);
- if hService <> 0 then Begin
- // start the driver
- args := nil;
- 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
-
- Result := 0;
-
- hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
- if hSCMan = 0 then begin
- result := getlasterror;
- exit;
- end;
-
- hService := 0;
-
-
- // get a handle to the service
- hService := OpenService(hSCMan, Name, SERVICE_STOP);
- if hService <> 0 then Begin
- // start the driver
- 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
- serviceStatus: TServiceStatus;
- 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 := 0;
-
- // get a handle to the service
- hService := OpenService(hSCMan, Name, SERVICE_ALL_ACCESS);
- if hService <> 0 then Begin
- // start the driver
- 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);
- formatmessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,error,0,p,199,nil);
- Result := p;
- freemem(p,200);
- end;
-
- end.
-