⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit2.pas

📁 delphi直接操作设备驱动程序源代码.
💻 PAS
字号:
unit Unit2;

interface
uses windows, winsvc, Dialogs, ctr_unit;
const
  // SYS_FILE: string = 'portio.SYS';
   SYS_NAME: string = 'PortIo';
var
   h: THANDLE;
   function OpenIoDevice: BOOL;
   function CloseIoDevice: BOOL;
   function  CssReadPort(addr: ULONG; size: ULONG): ULONG;
implementation
function InstallDriver(SchSCManager: SC_HANDLE; DriverName: PChar; ServiceExe: PChar): BOOL; stdcall;
var
   schService: SC_HANDLE;
begin
   result := FALSE;
   schService := CreateService(SchSCManager,
   DriverName,
   DriverName,
   SERVICE_ALL_ACCESS or GENERIC_READ or GENERIC_WRITE,
   SERVICE_KERNEL_DRIVER,
   SERVICE_DEMAND_START,
   SERVICE_ERROR_IGNORE,
   ServiceExe,
   nil,
   nil,
   nil,
   nil,
   nil
   );
   if (schService = 0) then exit;
   CloseServiceHandle(schService);
   result := TRUE;
end;

function StartDriver(SchSCManager: SC_HANDLE; DriverName: PChar): BOOL; stdcall;
var
   schService: SC_HANDLE;
   ret: BOOL;
   p: PChar;
begin
   result := false;
   schService := OpenService(SchSCManager,
   DriverName,
   SERVICE_START
   );
   if  (schService  = 0) then exit;
   p := nil;
   ret := StartService(schService, 0, p);
   CloseServiceHandle(schService);
   result := ret;
end;



function StopDriver(SchSCManager: SC_HANDLE; DriverName: PChar): BOOL; stdcall;
var
   schService: SC_HANDLE;
   ret: BOOL;
   serviceStatus: SERVICE_STATUS;
begin
   result := FALSE;
   schService := OpenService(SchSCManager, DriverName, SERVICE_ALL_ACCESS);
   if (schService = 0) then exit;
   ret := ControlService(schService, SERVICE_CONTROL_STOP, serviceStatus);
   CloseServiceHandle(schService);
   result := ret;
end;

function RemoveDriver(SchSCManager: SC_HANDLE; DriverName: PChar): BOOL; stdcall;
var
   schService: SC_HANDLE;
   ret: BOOL;
begin
   result := FALSE;
   schService := OpenService(SchSCManager, DriverName, SERVICE_ALL_ACCESS);
   if (schService = 0) then exit;
   ret := DeleteService(schService);
   CloseServiceHandle(schService);
   result := ret;
end;

function UnloadDeviceDriver(Name: PChar): BOOL; stdcall;
var
   SchSCManager: SC_HANDLE;
begin
   schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
   StopDriver(schSCManager, Name);
   RemoveDriver(schSCManager, Name);
   CloseServiceHandle(schSCManager);
   result := TRUE;
end;

function LoadDeviceDriver(Name: PChar; Path: PChar; var lphDevice: THANDLE; var Error: DWORD): BOOL; stdcall;
var
   SchSCManager: SC_HANDLE;
   okay: BOOL;
function OpenDevice(DriverName: PChar; var lphDevice: THANDLE): BOOL; stdcall;
var
   hDevice: THANDLE;
begin
   result := false;
   SetLastError(0);
   hDevice := CreateFile(pchar('\\.\' + DriverName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
   if (hDevice = INVALID_HANDLE_VALUE) then exit;
   lphDevice := hDevice;
   result := true;
end;

begin
   schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
   RemoveDriver(schSCManager, Name);
   InstallDriver(schSCManager, Name, Path);
   StartDriver(schSCManager, Name);
   okay := OpenDevice(Name, lphDevice);
   Error := GetLastError();
   CloseServiceHandle(schSCManager);
   result := okay;
end;
function GetWindowsDirectory(var S: String): Boolean;
var
   Len: Integer;
begin
   Len := Windows.GetWindowsDirectory(nil, 0);
   if Len > 0 then
   begin
      SetLength(S, Len);
      Len := Windows.GetWindowsDirectory(PChar(S), Len);
      SetLength(S, Len);
      Result := Len > 0;
   end else
      Result := False;
end;


function OpenIoDevice: BOOL;
var
   path: string;
   Error: DWORD;
   sys_handle: THANDLE;
begin
   sys_handle := INVALID_HANDLE_VALUE;
   //GetWindowsDirectory(path);
   path := 'C:\直接读端口\portio.sys'; //path + '\system32\' + SYS_FILE;
   //showmessage(path);
   if  not ( LoadDeviceDriver(pchar(SYS_NAME), pchar(Path), sys_handle, Error))   then
   begin

      ShowMessage('驱动程序装入错误');
      exit;
   end;
   h := sys_handle;
end;

function CloseIoDevice: BOOL;
begin
   CloseHandle(h);
   if not (UnloadDeviceDriver(pchar(SYS_NAME))) then
   begin
      ShowMessage('驱动程序卸载错误');
   end;


end;

function  CssReadPort(addr: ULONG; size: ULONG): ULONG;
var

   data: ULONG;
   status: BOOL;
   nBytesReturned: ULONG;
   PortHandle: ULONG;
   OpenPort: PORTOPENPARAMS;
   ReadPort: PORTREADPARAMS;
   WritePort: PORTWRITEPARAMS;
   ClosePort: PORTCLOSEPARAMS;

begin
   OpenPort.open_Address := addr;
   OpenPort.open_PortSize := size;
   OpenPort.open_PortCount := 1;
   status := DeviceIoControl(
   h,
   IOCTL_PORTIO_OPENPORT,
   @OpenPort,
   sizeof(OpenPort),
   @PortHandle,
   sizeof(PortHandle),
   nBytesReturned,
   nil
   );

   if ( not status and  (PortHandle = 0)) then
   begin
      showmessage('Port open failed\n');
   end;
   ReadPort.rd_Handle := PortHandle;
   ReadPort.rd_Index := 0;

   status := DeviceIoControl(
   h,
   IOCTL_PORTIO_READPORT,
   @ReadPort,
   sizeof(ReadPort),
   @data,
   sizeof(data),
   nBytesReturned,
   nil
   );

   if ( not status and (nBytesReturned = 0) ) then
   begin
      showmessage('read failed');

   end;
   ClosePort.close_Handle := PortHandle;
   status := DeviceIoControl(
   h,
   IOCTL_PORTIO_CLOSEPORT,
   @ClosePort,
   sizeof(ClosePort),
   nil,
   0,
   nBytesReturned,
   nil
   );

   if ( not status ) then
   begin

      showmessage('close failed');

   end;
   CssReadPort := data;


end;



end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -