qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 31 下一页

2013年1月9日

摘要: 应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandle关闭设备。我们比较常用的就是用DeviceIoControl对设备进行读写操作。先看看DeviceIoControl是怎么定义的:BOOL DeviceIoControl( HANDLE hDevice, // (CreateFile返回的设备句柄) DWORD dwIoControlCode, //(应用程序调用驱动程序的控制命令,就是IOC... 阅读全文
posted @ 2013-01-09 13:37 qintangtao 阅读(5287) 评论(0) 推荐(1) 编辑

摘要: 在Windows NT/2K/XP中,直接用CreateFile打开名称类似于"//./A:"的”文件”,就可以与设备驱动打交道,通过ReadFile/WriteFile以绝对地址方式访问磁盘了。但Windows 9X不支持这样的简单方法。本文介绍一种在Windows 9X中实现磁盘直接访问的方法:利用系统的vwin32.vxd,通过DeviceIoControl调用DOS INT21 7305H与440DH功能来完成。该调用支持FAT12、FAT16和FAT32,适用于Windows 95 SR2以及更高版本。先来了解一下DOS INT21 7305H功能的入口参数:AX 阅读全文
posted @ 2013-01-09 13:33 qintangtao 阅读(499) 评论(0) 推荐(0) 编辑

摘要: Q 前几次我们讨论的都是设备名比较清楚的情况,有了设备名(路径),就可以直接调用CreateFile打开设备,进行它所支持的I/O操作了。如果事先并不能确切知道设备名,如何去访问设备呢?A 访问设备必须用设备句柄,而得到设备句柄必须知道设备路径,这个套路以你我之力是改变不了的。每个设备都有它所属类型的GUID,我们顺着这个GUID就能获得设备路径。GUID是同类或同种设备的全球唯一识别码,它是一个128 bit(16字节)的整形数,真实面目为typedef struct _GUID{ unsigned long Data1; unsigned short Data2; un... 阅读全文
posted @ 2013-01-09 13:32 qintangtao 阅读(731) 评论(0) 推荐(0) 编辑

摘要: Q 在NT/2000/XP中,如何读取CMOS数据?Q 在NT/2000/XP中,如何控制speaker发声?Q 在NT/2000/XP中,如何直接访问物理端口?A 看似小小问题,难倒多少好汉!NT/2000/XP从安全性、可靠性、稳定性上考虑,应用程序和操作系统是分开的,操作系统代码运行在核心态,有权访问系统数据和硬件,能执行特权指令;应用程序运行在用户态,能够使用的接口和访问系统数据的权限都受到严格限制。当用户程序调用系统服务时,处理器捕获该调用,然后把调用的线程切换到核心态。当系统服务完成后,操作系统将线程描述表切换回用户态,调用者继续运行。想在用户态应用程序中实现I/O读写,直接存取硬 阅读全文
posted @ 2013-01-09 13:32 qintangtao 阅读(430) 评论(0) 推荐(0) 编辑

摘要: Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY或IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有什么办法呀?A 确实,用你所说的I/O控制码,只能得到最基本的磁盘参数。获取磁盘出厂信息的I/O控制码,微软在VC/MFC环境中没有开放,在DDK中可以发现一些线索。早先,Lynn McGuire写了一个很出名的获取IDE硬盘详细信息的程序DiskID32,下面的例子是在其基础上经过增删和改进而成的。本例中,我们要用到ATA/APAPI的IDENTIFY DEVICE指令。ATA/APAPI是国际 阅读全文
posted @ 2013-01-09 13:31 qintangtao 阅读(709) 评论(0) 推荐(0) 编辑

摘要: Q 在MSDN的那个demo中,将设备名换成“A:”取A盘参数,先用资源管理器读一下盘,再运行这个程序可以成功,但换一张盘后就失败;换成“CDROM0”取CDROM参数,无论如何都不行。这个问题如何解决呢?A 取软盘参数是从软盘上读取格式化后的信息,也就是必须执行读操作,这一点与硬盘不同。将CreateFile中的访问方式改为GENERIC_READ就行了。IOCTL_DISK_GET_DRIVE_GEOMETRY这个I/O控制码,对软盘和硬盘有效,但对一些可移动媒介如CD/DVD-ROM、TAPE等就不管用了。要取CDROM参数,还得另辟蹊径。IOCTL_STORAGE_GET_MEDIA_ 阅读全文
posted @ 2013-01-09 13:30 qintangtao 阅读(420) 评论(0) 推荐(1) 编辑

摘要: Q DOS命令DISKCOPY给我很深的印象,现在也有许多“克隆”软件,可以对磁盘进行全盘复制。我想,要制作磁盘镜像文件,DeviceIoControl应该很有用武之地吧?A 是的。这里举一个制作软盘镜像文件,功能类似于“DISKCOPY”的例子。本例实现其功能的核心代码如下:// 打开磁盘HANDLE OpenDisk(LPCTSTR filename){ HANDLE hDisk; // 打开设备 hDisk = ::CreateFile(filename, // 文件名 GENERIC_READ | GENERIC_WRITE, ... 阅读全文
posted @ 2013-01-09 13:30 qintangtao 阅读(453) 评论(0) 推荐(0) 编辑

摘要: Q 在NT/2000/XP中,我想用VC编写应用程序访问硬件设备,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢?A 在NT/2000/XP中,应用程序可以通过API函数DeviceIoControl来实现对设备的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的设备驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目的。DeviceIoControl的函数原型为BOOL DeviceIoControl( HANDLE hDevice, // 设备句柄 DWORD dwIoControlCode, /... 阅读全文
posted @ 2013-01-09 13:29 qintangtao 阅读(482) 评论(0) 推荐(0) 编辑

摘要: GetLogicalDriveStrings DWORD GetLogicalDriveStrings(DODOWRD cchBuffer,LPTSTR lpszBuffer) 说明 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径 返回值 返回保存所有数据所需要的字节数。应该总是比较返回值与参数cchBuffer的大小。 参数表 参数 类型及说明 DODOWRD cchBuffer,缓冲区的大小 LPTSTR lpszBuffer,用于装载逻辑驱动器名称的字串。每个名字都用一个NULL字符分隔,在最后一个名字后面用两个NULL表示中止... 阅读全文
posted @ 2013-01-09 11:27 qintangtao 阅读(290) 评论(0) 推荐(0) 编辑

摘要: 头文件在“winbase.h” UINT GetDriveType( LPCTSTR lpRootPathName // root directory ); 函数功能 判断磁盘类型 参数说明 lpRootPathName 包含了根目录路径的字符串指针 返回值 DRIVE_UNKNOWN 未知的磁盘类型 DRIVE_NO_ROOT_DIR 说明lpRootPathName是无效的 DRIVE_REMOVABLE 可移动磁盘 DRIVE_FIXED 固定磁盘 DRIVE_REMOTE 网络磁盘 DR... 阅读全文
posted @ 2013-01-09 11:22 qintangtao 阅读(374) 评论(0) 推荐(0) 编辑

上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 31 下一页