网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> Delphi编程 >> 文章正文
  WindowsXP 操作IO端口的Delphi的源代码(无需dll或sys)            【字体:
WindowsXP 操作IO端口的Delphi的源代码(无需dll或sys)
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    

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了。
正在装载数据……

有什么疑问,请Email:dbyoung@sina.com




本文来源:http://blog.csdn.net/dbyoung/archive/2007/08/15/1745266.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     在delphi中使用xml文档有…
     初探delphi 7 中的插件编…
     delphi 2006(dexter) & …
     获得windows的版本信息。
     “序列号输入助手”源代…
     rs232串口通讯模块
     ado方式下判断数据表是否…
  • Java Swing实现俄罗斯方块

  • Struts2学习:在struts2中集…

  • weblogic 9.1的domain配置my…

  • java中final用法

  • 浅析Spring框架下PropertyPl…

  • SPRING+STRUTS+HIBERNATE登录…

  • 摘:主题:   using springmo…

  • jsp重定向forward和sendRedi…

  • struts异常_does not start …

  • 在spring MVC中配置多个视图

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David