WindowsXP 操作IO端口的Delphi的源代码(无需dll或sys)

type

  _DEBUG_CONTROL_CODE = (
    DebugSysReadIoSpace = 14,
    DebugSysWriteIoSpace = 15,
    DebugSysReadMsr = 16,
    DebugSysWriteMsr = 17,
    DebugSysReadBusData = 18,
    DebugSysWriteBusData = 19
    );
  DEBUG_CONTROL_CODE = _DEBUG_CONTROL_CODE;

  TIOStruct = record
    IoAddr: DWORD;
    Reserved1: DWORD;
    pBuffer: Pointer;
    NumBYTEs: DWORD;
    Reserved4: DWORD;
    Reserved5: DWORD;
    Reserved6: DWORD;
    Reserved7: DWORD;
  end;

function ZwSystemDebugControl(ControlCode: _DEBUG_CONTROL_CODE; InputBuffer: Pointer; InputBufferLength: ULONG; OutputBuffer: Pointer; OutputBufferLength: ULONG; ReturnLength: PULONG): LongInt; stdcall; external 'ntdll.dll';

function InPortB(Port: DWORD): Byte;
var
  Value                                                     : BYTE;
  io                                                        : TIOStruct;
begin
  Value := 0;
  io.IoAddr := Port;
  io.Reserved1 := 0;
  io.pBuffer := Pointer(@Value);
  io.NumBYTEs := sizeof(BYTE);
  io.Reserved4 := 1;
  io.Reserved5 := 0;
  io.Reserved6 := 1;
  io.Reserved7 := 0;
  ZwSystemDebugControl(DebugSysReadIoSpace, @io, sizeof(io), nil, 0, nil);
  Result := Value;
end;

procedure OutPortB(Port: DWORD; Value: Byte);
var
  io                                                        : TIOStruct;
begin
  io.IoAddr := Port;
  io.Reserved1 := 0;
  io.pBuffer := Pointer(@Value);
  io.NumBYTEs := sizeof(BYTE);
  io.Reserved4 := 1;
  io.Reserved5 := 0;
  io.Reserved6 := 1;
  io.Reserved7 := 0;
  ZwSystemDebugControl(DebugSysWriteIoSpace, @io, sizeof(io), nil, 0, nil);
end;

 function EnableDebugPrivilege(CanDebug: boolean): Boolean;
  function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;
  var
    TP                                                      : Windows.TOKEN_PRIVILEGES;
    Dummy                                                   : Cardinal;
  begin
    TP.PrivilegeCount := 1;
    LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);
    if bEnable then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else TP.Privileges[0].Attributes := 0;
    AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
    Result := GetLastError = ERROR_SUCCESS;
  end;
var
  hToken                                                    : Cardinal;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
  Result := EnablePrivilege(hToken, 'SeDebugPrivilege', CanDebug);
  CloseHandle(hToken);
  hToken := 0;
end;

 

调用时,先调用EnableDebugPrivilege,就可以调用InPortB、OutPortB了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值