📄 unit2.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 + -