我知道VC在95/98下,可以用int _inp(端口号)直接取到端口值,可由于2000/XP有保护机制,不允许直接读取端口,所以想请教一下,如何在2000/XP下读到端口的值,谢谢!!!

解决方案 »

  1.   

    http://www.tongtu.net/cgi-bin/page.dll?page1?userid=lmj9602&columnno=15&articleid=192这个地址上写了一大堆,没看明白,不知道有没有我这个问题的答案,高手帮我看看,看有没有有价值的东西,其实我的要求很简单,就是在2000/XP下读到某个端口的值就可以了,不需要传递信息.
      

  2.   

    这篇文章写的的确不错
    关键的问题就是端口必须在ring0的核心态才能允许读到,所以其中花了一些篇幅写到了如何启动一个驱动并绑定在一个服务,然后利用程序在用户态ring3与服务进行通讯,这样就可以非常容易的得到端口,以及相关的信息了
    关键词和关键信息是:
    驱动,服务
    // IOPM是65536个端口的位屏蔽矩阵,包含8192字节(8192 x 8 = 65536) 
    // 0 bit: 允许应用程序访问对应端口 
    // 1 bit: 禁止应用程序访问对应端口
     
    // 这是两个在ntoskrnl.exe中的未见文档的服务例程 
    // 没有现成的已经说明它们原型的头文件,我们自己声明 
    void Ke386SetIoAccessMap(int, IOPM *); 
    void Ke386IoSetAccessProcess(PEPROCESS, int); 
    关于驱动和服务的某些属于函数,参详msdn即可