WEB开发网
开发学院软件开发汇编语言 实战DeviceIoControl之六:访问物理端口 阅读

实战DeviceIoControl之六:访问物理端口

 2010-01-10 09:37:25 来源:WEB开发网   
核心提示:应用程序实现端口I/O的接口如下:// 全局的设备句柄HANDLE hMyPort; // 打开设备// lpszDevicePath: 设备的路径HANDLE OpenDevice(LPCTSTR lpszDevicePath){ HANDLE hDevice; // 打开设备 hDevice

应用程序实现端口I/O的接口如下:

// 全局的设备句柄
HANDLE hMyPort;
  
// 打开设备
// lpszDevicePath: 设备的路径
HANDLE OpenDevice(LPCTSTR lpszDevicePath)
{
    HANDLE hDevice;
  
    // 打开设备
    hDevice = ::CreateFile(lpszDevicePath,    // 设备路径
        GENERIC_READ | GENERIC_WRITE,        // 读写方式
        FILE_SHARE_READ | FILE_SHARE_WRITE,  // 共享方式
        NULL,                    // 默认的安全描述符
        OPEN_EXISTING,           // 创建方式
        0,                       // 不需设置文件属性
        NULL);                   // 不需参照模板文件
  
    return hDevice;
}
  
// 打开端口驱动
BOOL OpenMyPort()
{
    BOOL bResult;
  
    // 设备名为"MyPort",驱动程序位于Windows的"system32\drivers"目录中
    bResult = StartDriver("system32\\drivers\\MyPort.sys", "MyPort");
  
    // 设备路径为"\\.\MyPort"
    if (bResult)
    {
        hMyPort = OpenDevice("\\\\.\\MyPort");
    }
  
    return (bResult && (hMyPort != INVALID_HANDLE_VALUE));
}
  
// 关闭端口驱动
BOOL CloseMyPort()
{
    return (CloseHandle(hMyPort) && StopDriver("MyPort"));
}
  
// 从指定端口读一个字节
// port: 端口
BYTE ReadPortByte(WORD port)
{
    DWORD buf[2];            // 输入输出缓冲区            
    DWORD dwOutBytes;        // IOCTL输出数据长度
  
    buf[0] = port;           // 第一个DWORD是端口
//  buf[1] = 0;              // 第二个DWORD是数据
  
    // 用IOCTL_MYPORT_READ_BYTE读端口
    ::DeviceIoControl(hMyPort,   // 设备句柄
        IOCTL_MYPORT_READ_BYTE,  // 取设备属性信息
        buf, sizeof(buf),        // 输入数据缓冲区
        buf, sizeof(buf),        // 输出数据缓冲区
        &dwOutBytes,             // 输出数据长度
        (LPOVERLAPPED)NULL);     // 用同步I/O    
  
    return (BYTE)buf[1];
}
// 将一个字节写到指定端口
// port: 端口
// data: 字节数据
void WritePortByte(WORD port, BYTE data)
{
    DWORD buf[2];            // 输入输出缓冲区            
    DWORD dwOutBytes;        // IOCTL输出数据长度
  
    buf[0] = port;           // 第一个DWORD是端口
    buf[1] = data;           // 第二个DWORD是数据
  
    // 用IOCTL_MYPORT_WRITE_BYTE写端口
    ::DeviceIoControl(hMyPort,   // 设备句柄
        IOCTL_MYPORT_WRITE_BYTE, // 取设备属性信息
        buf, sizeof(buf),        // 输入数据缓冲区
        buf, sizeof(buf),        // 输出数据缓冲区
        &dwOutBytes,             // 输出数据长度
        (LPOVERLAPPED)NULL);     // 用同步I/O
}

上一页  1 2 3 4  下一页

Tags:实战 DeviceIoControl 访问

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接