ioperm – Windows下設定連接埠許可權

來源:互聯網
上載者:User

Windows下設定連接埠許可權的系統調用有兩個:ioperm和iopl函數

1.ioperm函數     功能描述:
為調用進程設定I/O連接埠訪問權能。ioperm的使用需要具有超級使用者的許可權,只有低端的[0-0x3ff] I/O連接埠可被設定,要想指定更多連接埠的權能,可使用iopl函數。這一調用只可用於i386平台。

用法:
#include  <ioperm.h>/* for libc5 */#include  <sys/io.h>/* for glibc */int ioperm(unsigned long from, unsigned long num, int turn_on);

參數:
from:開始端點口地址。
num:需要修改權能的連接埠數。
turn_on:連接埠的新權能位。1為開啟,0為關閉。
返回說明: 
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值 
EINVAL:參數無效
EIO:這一調用不被支援
EPERM:調用進程權能不足。   2.iopl函數
功能描述:該調用用於修改當前進程的操作連接埠的許可權。可以用於所有65536個連接埠的許可權。因此,ioperm相當於該調用的子集。和ioperm一樣,這一調用僅適用於i386平台。

用法:

#include <ioperm.h>int iopl(int level);

參數:
level: 連接埠的權限等級。為3時可以讀寫連接埠。預設權能層級為0,使用者空間不可讀寫。
返回說明:成功執行時,返回0。失敗返回-1,errno被設為以下的某個值
EINVAL:level值大於3
ENOSYS:未實現該調用
EPERM:調用進程權能不足。

目前已經將主要的部分更改成支援GCC編譯的內容。支援GCC內聯彙編。
代碼如下(預設用Windows的C編譯器):

/** function: read cmos data using rtc port(0x70 -- port, 0x71 -- data)*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>extern int install( int  );extern int uninstall(int );extern ioperm( unsigned long from, unsigned long num, int turn_on );#ifdef _GCCvoid outp(unsigned short addr, unsigned short data){__asm__ ("mov %1,   %%al;""mov %0,   %%dx;""out %%al, %%dx;": /* no output */        :"m" (addr), "m" (data) /* input addr and data */        :"ax", "dx");}unsigned char inp( unsigned short addr){unsigned char cha;__asm__ (    "mov %1,   %%dx;""in  %%dx, %%al;""mov %%al, %0;":"=r" (cha) /* output to var(cha) */:"m" (addr) /* input addr */: "ax", "dx");return cha;}#else /* using windows asm */void outp(unsigned short addr , unsigned short data){asm {mov al,datamov dx,addrout dx,al}}unsigned char inp( unsigned short addr){unsigned char cha;asm{mov dx,addrin al,dxmov cha ,al}return cha;}#endifint main( void ){int i;unsigned char c;install(0);Sleep(500);if (ioperm(0x70, 2, 1 )) {fprintf( stderr, "Error: ioperm() failed. Please install ioperm.sys driver.\n" );}else{        for (i=0; i<260; i++)        {//Sleep(100);            outp(0x70, i);c = inp(0x71);            printf("%02x ", c);    if ((i+1)%20 == 0)    printf("\n");            }}uninstall(0);return 0;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.