在vc中如何读写硬件端口?欢迎能够提供各种不同的技术。
谢谢。

解决方案 »

  1.   

    在VC中嵌入汇编就可以
    __asm
    {
    .........
    .....
    }
    在括号中写汇编代码就可以了
      

  2.   

    __asm
    {}
    写在函数里就可以
      

  3.   

    windows允许这样做么?
    读写硬件端口不需要0级权限么?
      

  4.   

    若是在2000下,实现起来很困难,需要编写设备驱动程序。但在98下,可以从ring3转到ring0,实现端口直接访问。
      

  5.   

    我这里有一个例子,在VC中读写我自己设计的ISA卡上8255芯片的代码:
    BYTE insideRead(int derct)
    {
    int PA=0x1fc;
       int PB=0x1fd;
       int PC=0x1fe;
       int CW=0x1ff;
       int EWEN=0x98;
       int WRITE=0x80;
       int READ=0x90;

        BYTE member=0;
    BYTE a,b;
    a=BYTE(derct/256);
    b=BYTE(derct-a*256);
    //_outp(CW,READ);
     //    _outp(PC,0x6F);
        _outp(PB,a);
    _outp(PC,0x3F);
    Sleep(10);
    _outp(PC,0x1F);
    _outp(PB,b);
    Sleep(10);
    _outp(PC,0x0A);
    Sleep(10);
    member=_inp(PA);
    _outp(PC,0x0E);
    // _outp(PC,0x6F);    return member;
    }void onlinestart(void)
    {
       int PA=0x1fc;
       int PB=0x1fd;
       int PC=0x1fe;
       int CW=0x1ff;
       int EWEN=0x98;
       int WRITE=0x80;
       int READ=0x90;   //_outp(CW,WRITE);
       _outp(PC,0x6F);
    }void onlineWrite(int derct,int member)
    {
    int PA=0x1fc;
       int PB=0x1fd;
       int PC=0x1fe;
       int CW=0x1ff;
       int EWEN=0x98;
       int WRITE=0x80;
       int READ=0x90;


    BYTE a,b;
    a=BYTE(derct/256);
    b=BYTE(derct-a*256);
    a=a<<3;

    //_outp(CW,WRITE);
    //AfxMessageBox("star");
    // char ch[5];
     //         itoa(0x46|a,ch,16);
                 //AfxMessageBox(ch);
    //  CString str;
    //  str="!--地址:";
    //  str+=ch;
     //AfxMessageBox(str);
     //itoa(0x66|a,ch,16);
                 //AfxMessageBox(ch);
     ///CString str;
     //str="!--地址:";
     //str+=ch;
     //AfxMessageBox(0x62|a);

    _outp(PA,member);
    _outp(PC,0x46|a);
    _outp(PB,b);
    Sleep(0);

    _outp(PC,0x42|a);
    Sleep(0);
    _outp(PC,0x46|a);
    //Sleep(1);
        //_outp(PB,0x00);
     _outp(PC,0x46);
    //  _outp(CW,READ);
    }/////////////////////////////////online
    void lykWrite(int derct,int member)
    {
    int PA=0x1fc;
       int PB=0x1fd;
       int PC=0x1fe;
       int CW=0x1ff;
       int EWEN=0x98;
       int WRITE=0x80;
       int READ=0x90;


    BYTE a,b;
    a=BYTE(derct/256);
    b=BYTE(derct-a*256);
    a=a<<3;

    _outp(CW,WRITE);
    //AfxMessageBox("star");
     char ch[5];
              itoa(0x46|a,ch,16);
                 //AfxMessageBox(ch);
     CString str;
     str="!--地址:";
     str+=ch;
     //AfxMessageBox(str);
     //itoa(0x66|a,ch,16);
                 //AfxMessageBox(ch);
     ///CString str;
     //str="!--地址:";
     //str+=ch;
     //AfxMessageBox(0x62|a);
    _outp(PC,0x46|a);
    Sleep(10);
    _outp(PB,b);
    _outp(PA,member);
    _outp(PC,0x42|a);
    Sleep(10);
    _outp(PC,0x46|a);
    Sleep(10);
        _outp(PB,0x00);
    _outp(PC,0x00);
    }
    int lykRead(int derct)
    {
    int PA=0x1fc;
       int PB=0x1fd;
       int PC=0x1fe;
       int CW=0x1ff;
       int EWEN=0x98;
       int WRITE=0x80;
       int READ=0x90;

       int member=0;
    BYTE a,b;
    a=BYTE(derct/256);
    b=BYTE(derct-a*256);
    a=a<<3;
    _outp(CW,READ);
    _outp(PC,0x44|a);
    Sleep(10);
    _outp(PB,b);
    //char ch[10];
    //itoa(0x64|a,ch,16);
    //AfxMessageBox(ch);
    //itoa(b,ch,10);
    //AfxMessageBox(ch);
    //itoa(_inp(PA),ch,10);
    // AfxMessageBox(ch);
    member=_inp(PA);

    Sleep(10);
    _outp(PB,0x00);
    _outp(PC,0x00);return member;
    }
      

  6.   

    http://211.157.102.21/expert/Topicview2.asp?id=760115
      

  7.   

    masterz提供的页面我看了,非常感谢.我要解决的问题就是在win2000下读写硬件端口.有详细的资料或其他的技术能不能再贴在这里,或发送到wlpwind2163.com,
    谢谢各位.
      

  8.   

    http://www.internals.com
    写了sys和dll,还有例子
      

  9.   

    以下是附带的readme.txt------------------------------------------------------------
                            WinIo v1.2                          
        Direct Hardware Access Under Windows 9x/NT/2000         
                Copyright 1998-2000 Yariv Kaplan                
                    http://www.internals.com                    
    ------------------------------------------------------------The WinIo library allows 32-bit Windows applications to directly
    access I/O ports and physical memory. It bypasses Windows protection
    mechanisms by using a combination of a kernel-mode device driver and
    several low-level programming techniques.Under Windows NT, the WinIo library can only be used by applications
    that have administrative privileges. If the user is not logged on as
    an administrator, the WinIo DLL is unable to install and activate the
    WinIo driver. It is possible to overcome this limitation by installing
    the driver once through an administrative account. In that case, however,
    the ShutdownWinIo function must not be called before the application
    is terminated, since this function removes the WinIo driver from the
    system's registry.The library exports 8 functions:----------------------------------------------------------------------------bool _stdcall InitializeWinIo();This function initializes the WinIo library.For applications running under Windows NT/2000, this function
    must be called before calling any other function in the library.Windows 9x applications are not required to call this function.If the function succeeds, the return value is nonzero.If the function fails, the return value is zero. ----------------------------------------------------------------------------void _stdcall ShutdownWinIo();This function performs cleanup of the WinIo library.For applications running under Windows NT/2000, this function
    must be called before terminating the application or when the
    WinIo library is no longer required.Windows 9x applications are not required to call this function.----------------------------------------------------------------------------bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);Use this function to read a BYTE/WORD/DWORD value from an I/O port.Parameters:  wPortAddr - I/O port address  pdwPortVal - Pointer to a DWORD variable that receives the value
                   obtained from the port.  bSize - Number of bytes to read.
              Can be 1 (BYTE), 2 (WORD) or 4 (DWORD).  If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. ----------------------------------------------------------------------------bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);Use this function to write a BYTE/WORD/DWORD value to an I/O port.Parameters:  wPortAddr - I/O port address  dwPortVal - A DWORD value to be written to the port  bSize - Number of bytes to write.
              Can be 1 (BYTE), 2 (WORD) or 4 (DWORD).  If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. ----------------------------------------------------------------------------PBYTE _stdcall MapPhysToLin(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle)Use this function to map a region of physical memory into the linear address 
    space of a 32-bit Windows application.Here is an example:PBYTE pbLinAddr;
    HANDLE PhysicalMemoryHandle;pbLinAddr = MapPhysToLin(0xA0000, 65536, &PhysicalMemoryHandle);The function will map physical addresses 0xA0000 - 0xAFFFF into the linear
    address space of the application. The value returned is a linear address
    corresponding to physical address 0xA0000. In case of an error, the return
    value is NULL.Parameters:  pbPhysAddr - Pointer to the physical address
      
      dwPhysSize - Number of bytes to map  pPhysicalMemoryHandle - Points to a variable that will receive the physical memory section
                              handle if this call is successful. This handle is later used as
                              the first parameter when calling the UnmapPhysicalMemory function.----------------------------------------------------------------------------bool _stdcall UnmapPhysicalMemory(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr)Use this function to unmap a region of physical memory which was previously mapped
    to the linear address space of the application using the MapPhysToLin function.Windows 9x applications are not required to call this function.Parameters:  PhysicalMemoryHandle - Handle to the physical memory section which was returned
                             from the call to the MapPhysToLin function.  pbLinAddr - Linear address which was returned from the call to the MapPhysToLin
                  function.----------------------------------------------------------------------------bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal);This function reads one DWORD from the specified physical address.Parametes:  pbPhysAddr - Pointer to the physical address
      
      pdwPhysVal - Pointer to a DWORD variable that receives the value
                   obtained from the physical memory location.  If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. ----------------------------------------------------------------------------bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal);This function writes one DWORD to the specified physical address.Parametes:  pbPhysAddr - Pointer to the physical address
      
      pdwPhysVal - Specifies a DWORD value to be written to the physical
                   memory location.  If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. ----------------------------------------------------------------------------
                              A NOTE FOR VB USERS
    ----------------------------------------------------------------------------To use winio.dll with a 32-bit Visual-Basic application you need to:1. Place winio.dll and winio.sys in the same directory as your executable file.2. Add winio.bas to your project.----------------------------------------------------------------------------
                                  LEGAL STUFF             
    ----------------------------------------------------------------------------The following terms apply to all files associated with the software
    unless explicitly disclaimed in individual files.The author hereby grants permission to use, copy, modify, distribute,
    and license this software and its documentation for any purpose, provided
    that existing copyright notices are retained in all copies and that this
    notice is included verbatim in any distributions. No written agreement,
    license, or royalty fee is required for any of the authorized uses.IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY PARTY
    FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
    ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
    DERIVATIVES THEREOF, EVEN IF THE AUTHOR HAVE BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGE.THE AUTHOR AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
    IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHOR AND DISTRIBUTORS HAVE
    NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
    MODIFICATIONS.
    I can be reached at: [email protected] Kaplan