首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Win32重叠I/O - 完成例程还是WaitForMultipleObjects?

Win32重叠I/O - 完成例程还是WaitForMultipleObjects?

在Windows系统中,重叠I/O是一种用于执行非阻塞I/O的机制,它可以在等待I/O操作完成时同时进行其他操作。在C++中,使用overlapped关键字来表示一个重叠I/O操作,该操作可以通过CreateFile函数和ReadFileWriteFile等文件操作来创建。

在编写重叠I/O代码时,需要使用非阻塞文件操作,这些操作可以在操作未完成时立即返回,并且可以立即进行其他工作。当操作完成时,需要使用WaitForSingleObject函数等待操作完成。

WaitForMultipleObjects函数是Windows系统中的一个等待函数,可以等待多个对象(如文件、事件、线程等)完成或发生事件。在重叠I/O中,使用WaitForMultipleObjects函数等待操作完成是非常常见的。

总的来说,在重叠I/O中,需要使用非阻塞文件操作,并使用WaitForSingleObject函数等待操作完成。当需要等待多个对象完成时,可以使用WaitForMultipleObjects函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • WDM 驱动程序开发[通俗易懂]

    1.概述 引入了全新的WDM (Win32 Driver Model)的驱动程序架构,说是新技术,其实早在1997年Microsoft就提出了该项技术并在Windows 98中得到了充分的应用,换句话说,Windows 98也支持WDM。这样WDM就成为了一个跨平台的驱动程序模型不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行。 2.WDM设备驱动程序的特点和原理2.1通用驱动程序对基本上一样的硬件,因为他们共享一个总线或完成类似的任务,设备驱动程序可以使用这些标准的驱动程序功能,使公共总线的共享容易,且更容易写出新的驱动程序,总线驱动程序,如USB、1394,和类驱动程序。(1)Win32程序接口: 可以使用Win32函数像访问文件那样访问设备CreateFile() 、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl()用于发出特殊请求,可发送数据给驱动和从驱动得到数据,IOCTL代码可以是预先定义的也可是自己定义的。(2)创建设备 大多数WDM设备对象都是在PnP管理器中调用AddDevice入口时创建,这个PnP 例程在插入新设备和安装Inf文件时被调用,此后一系列的PnP IRP被发送到驱动程序,指示设备应如何启动和查询它的功能2.2WDM-的工作原理WDM是在NT 4.0驱动程序结构上发展起来的,所以它与NT 4.0驱动程序极为相似 ,但是它却有了本质上的提高,比如它支持USB、IEEE 1394、ACPI等全新的硬件标准。 虽然Windows 98与Windows 2000都支持WDM,可是并不意味着Windows 98下的VxD可以在 Windows 2000下运行,而NT下的WDM却可以在Windows 98下运行。不过原先准备在两个平台上同时运行需要编写两个截然不同的驱动程序,而现在只需要编写一个WDM驱动程序就 可以了。同NT 4.0驱动程序一样,WDM驱动程序也是分层的,即不同层上的驱动程序有着不同的优先权,而Windows 9x下的VxD则没有此结构。另外,WDM还引入了功能设备对象 FDO(functional device object)与物理设备对象PDO(physical device object)两 个新概念来描述硬件,一个PDO代表一个真实硬件,在驱动程序看来则是一个FDO 。 另外值得注意的是,一个硬件只允许有一个PDO,但却可以拥有多个FDO,而在驱动程序中我们不是直接操作硬件而是操作相应的PDO与FDO。在Ring-3与Ring-0通讯方面,操作系统为每一个用户请求打包成一个IRP(IO Request Packet)结构,将其发送至驱动程序并通过识别IRP中的PDO来识别是发送给哪一个设备的。另外,在驱动程序的加载方面WDM既不靠驱动程序名称也不靠一个具有某种特殊意义的ID,而是依靠一个128位的GUID来识别驱动程序(Windows下许多东西都是靠此进行识别的)。 2.3 IRP处理 I/O请求包IRP是驱动程序操作的中心,IRP是一个内核对象,它是预先定义好的数据结构,带有一组对它进行操作的I/O管理器例程,I/O管理器接受一个I/O请求,然后将它传送到合适的驱动程序栈中的最高驱动程序之前,分配并处始化一个IRP,每个I/O请求有主功能代码 2.4 IRP参数比如一个写的I/O请求转换成一个IRP时,I/O管理器填写主要的IRP首部,并构造第一个个栈单元,对写请求来讲,首部包含用户缓冲区信息,而栈单元则包含写的具体参数。如果调用另一个驱动则必须创建下一个栈单元。一个IRP到栈顶时,使用PIO_STACK_LOCATION IoGetCurrentIrpStackLocation( IN PIRP Irp );IoGetCurrentIrpStackLocation returns a pointer to the caller’s stack location in the given IRP。如决定需要把这个IRP沿设备栈向下传递,使用IoCopyCurrentIrpStackLocationToNext or IoSkipCurrentIrpStackLocation简单的将内容复制到下一个单元,如果要更改下一个栈单元,要使用LOCATION IoGetNextIrpStackLocation(IN PIRP Irp );IoGetNextIrpStackLocation gives a higher level driver access to the next-lower driver’s I/O stack location in an IRP so the caller can set it up for the l

    02

    window32api_win32api与硬件设备

    作者:浪子花梦,一个有趣的程序员 ~ . Win32API 相关文章如下: Win32利用CreateEvent 实现简单的 —— 线程同步 Win32消息处理机制与窗口制作 Win32远程线程注入 .dll 文件 Win32删除目录下的所有文件 —— 递归遍历 (一)Win32服务程序编写 —— 使用SC命令创建与删除 (二)Win32服务程序编写 —— 使用命令行参数创建与删除 Win32使用快照、psapi.dll、wtsapi32.dll、ntdll.dll 四种方式实现 —— 枚举进程 (一)Win32进程通信 —— 自定义消息实现 (二)Win32进程通信 —— 内存映射文件 (三)Win32进程通信 —— 数据复制消息 (四)Win32进程通信 —— 剪贴板的使用 (五)Win32进程通信 —— 匿名管道 (六)Win32进程通信 —— 邮槽的使用

    01

    基于WDM的专用USB设备的驱动程序开发[通俗易懂]

    1引言 目前对于诸如USB鼠标、键盘等这样的计算机标准外设,Windows系统已经提供了标准的驱动程序,用户无需再进行任何开发工作。而开发专用USB设备,需要开发专用的驱动程序。 Windows2000/XP操作系统不允许用户程序直接访问硬件设备。为了实现对硬件设备的访问和控制,必须通过操作系统所认可的驱动程序对硬件设备实现间接访问和控制。驱动程序通常被认为是操作系统的组成部分,所以,开发驱动程序有严格的规范,被认为是“计算机高手”的工作。而利用DDK进行基于WDM(Win32 Driver Model)驱动程序开发,使驱动程序的开发变成了一项比较简单的工作。 2 Win32驱动程序模型 USB设备驱动程序必须符合由Microsoft为Windows 98及其后版本所定义的Win32驱动程序模型(Win32 Driver Model,WDM)规格。这些驱动程序称为WDM驱动程序,扩展名为.sys。 WDM定义了一个基本模型,处理所有类型的数据。例如,USB类驱动程序为所有USB 设备提供了一个抽象的模型,并具有由所有客户驱动程序使用的定义好的接口。有了对所有设备类型共同的核心驱动程序模型,使驱动程序开发人员更容易从一种类型的设备移动到另外一种类型的设备上去。而且它也意味着驱动程序模型的内核实现尽可能是固定的。 USB是使用标准Windows系统USB类驱动程序访问USBDI(Windows USB驱动程序接口)的USB设备驱动程序。USBD.sys就是Windows系统中的USB类驱动程序,它使用UHCD.sys来访问通用的主控制器接口设备,或者使用OpenHCI.sys访问开放式主控制器接口设备。USBHUB.sys是根集线器和外部集线器的USB驱动程序。在PCI枚举器发现了USB主控制器之后,它会自动装入相关的驱动程序。 3 Windows USB驱动程序接口 大多数客户化的USB设备需要由用户来编写设备驱动程序,以响应内核态或用户应用程序的请求。在内核级,命令由客户驱动程序使用内部IOCTL发送给USB系统,例如IOCTL-INTERNAL-USB-SUBMIT-URB允许发出USB请求块(URB)给系统USB驱动程序。URB允许发出几个功能调用给USB系统。用户态USB实用程序也可以发出几个普通IOCTL给USB设备,目的仅仅是得到连接设备的信息。 3.1函数驱动程序 函数驱动程序(function driver)让应用程序与USB设备,通过API函数来沟通。这些API函数属于Windows的Win32子系统,Win32子系统同时也管理着执行应用程序。函数驱动程序与较低级的总线驱动程序沟通,总线驱动程序控制着硬件。 图1是应用程序与各个驱动程序,如何一起完成USB通信的结构图。当设备或子类别的要求超过类别驱动程序的能力时,会有辅助的过滤器驱动程序来类别驱动程序的能力。一个上层的过滤驱动程序位于类别驱动程序的上方。这样,从客户应用程序传来的要求,会先经过上层的过滤驱动程序,然后才传给类别函数驱动程序。一个下层的过滤驱动程序位于类别驱动程序和总线驱动程序之间,如图1。类别驱动程序会将要求传给下层的过滤驱动程序,然后再传给总线驱动程序。 图1应用程序与驱动程序完成USB通信的结构 通用串行总线驱动程序(USBD.SYS)是USB系统中负责管理通用串行总线的工作,位于主机上的一个软件。USBD负责控制所有的USB协议操作和高层的中断处理控制。在Windows98及以上版本中,Microsoft定义了一个新的设备驱动程序模型,称之为Windows设备驱动程序模型(WindowsDriver Model或WDM)。 USB客户应用程序也是一种设备驱动程序,通过定义的一个称之为USB接口的层间接口来访问其下方的USB软件。应用程序正是通过这些USB客户软件来实现与USB设备之间的通信。 针对USB客户应用程序的开发,相应版本的Windows操作系统的设备驱动程序开发包(Device Driver Developer’s Kit,即DDK)给出了相应的USB接口函数。并提供了对于这些函数具体使用的参考文档。 3.2 USBDI的IOCTL 为了编写USB设备驱动程序,通常还要在源代码中包含DDK所提供的几个头文件。这些头文件在Windows98下存放在/98DDK/inc/win98目录中,在Windows 2000下存放在/NTDDK/inc/win2000目录中。这些头文件的用途可以总结如下: usb100.h 定义了在USB设备驱动程序设计中所要用到的各种常量和数据结构。 Usbdi.h USBDI例程,其中包括对USBD和USB设备驱动程序通用的数据结构,适用于内核和用户模式。 Usbdlib.h URB构造和各种例程,定义了USBD所输出的服务,适用于内核和用户模式。 Usbioctl.h 给出了对IOC

    02

    部分蓝屏报错代码及含意

    0 0x0000 作业完成。 1 0x0001 不正确的函数。 2 0x0002 系统找不到指定的档案。 3 0x0003 系统找不到指定的路径。 4 0x0004 系统无法开启档案。 5 0x0005 拒绝存取。 6 0x0006 无效的代码。 7 0x0007 储存体控制区块已毁。 8 0x0008 储存体空间不足,无法处理这个指令。 9 0x0009 储存体控制区块位址无效。 10 0x000A 环境不正确。 11 0x000B 尝试载入一个格式错误的程式。 12 0x000C 存取码错误。 13 0x000D 资料错误。 14 0x000E 储存体空间不够,无法完成这项作业。 15 0x000F 系统找不到指定的磁盘。 16 0x0010 无法移除目录。 17 0x0011 系统无法将档案移到 其他的磁盘。 18 0x0012 没有任何档案。 19 0x0013 储存媒体为防写状态。 20 0x0014 系统找不到指定的装置。 21 0x0015 装置尚未就绪。 22 0x0016 装置无法识别指令。 23 0x0017 资料错误 (cyclic redundancy check) 24 0x0018 程式发出一个长 度错误的指令。 25 0x0019 磁盘在磁盘找不到 持定的磁区或磁轨。 26 0x001A 指定的磁盘或磁片无法存取。 27 0x001B 磁盘找不到要求的磁区。 28 0x001C 打印机没有纸。 29 0x001D 系统无法将资料写入指定的磁盘。 30 0x001E 系统无法读取指定的装置。 31 0x001F 连接到系统的某个装置没有作用。 32 0x0020 The process cannot access the file because it is being used by another process。 33 0x0021 档案的一部份被锁定,现在无法存取。 34 0x0022 磁盘的磁片不正确。 请将 %2 (Volume Serial Number: %3) 插入磁 碟 机%1。 36 0x0024 开启的分享档案数量太多。 38 0x0026 到达档案结尾。 39 0x0027 磁盘已满。 50 0x0032 不支援这种网络要求。 51 0x0033 远端电脑无法使用。 52 0x0034 网络名称重复。 53 0x0035 网络路径找不到。 54 0x0036 网络忙碌中。 55 0x0037 The specified network resource or device is no longer available。 56 0x0038 The network BIOS command limit has been reached。 57 0x0039 网络配接卡发生问题。 58 0x003A 指定的服务器无法执行要求的作业。 59 0x003B 网络发生意外错误。 60 0x003C 远端配接卡不相容。 61 0x003D 打印机伫列已满。 62 0x003E 服务器的空间无法储存等候列印的档案。 63 0x003F 等候列印的档案已经删除。 64 0x0040 指定的网络名称无法使用。 65 0x0041 拒绝存取网络。 66 0x0042 网络资源类型错误。 67 0x0043 网络名称找不到。 68 0x0044 超过区域电脑网络配接卡的名称限制。 69 0x0045 超过网络BIOS作业阶段的限制。 70 0x0046 远端服务器已经暂停或者正在起始中。 71 0x0047 由於连线数目已达上限,此时无法再连线到这台远端电脑。 72 0x0048 指定的打印机或磁盘装置已经暂停作用。 80 0x0050 档案已经存在。 82 0x0052 无法建立目录或档案。 83 0x0053 INT 24 失败 84 0x0054 处理这项要求的储存体无法使用。 85 0x0055 近端装置名称已经在使用中。 86 0x0056 指定的网络密码错误。 87 0x0057 叁数错误。 88 0x0058 网络发生资料写入错误。 89 0x0059 此时系统无法执行其他行程。 100 0x0064 无法建立其他的系统semaphore。 101 0x0065 属於其他行程专用的semaphore 。 102 0x0066 semaphore已经设定,而且无法关闭。 103 0x0067 无法指定semaphore 。 104 0x0068 在岔断时间无法要求专用的semaphore 。 105 0x0069 此semaphore先前的拥有权已经结束。 106 0x006A 请将磁片插入 %1。 107 0x006B 因为

    01

    【专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现

    说明: 1、如果你会emWin话的,就可以轻松制作上位机。做些通信和控制类上位机,比使用C#之类的方便程度一点不差,而且你仅会C语言就可以。 2、并且成功将emWin人性化,可以做些Windows系统上的小应用了,基本完全看不出是emWin做的,而且生成的软件很小。Win32 API编写的软件,最大的好处就是微软的各个系统版本都兼容,而且发布时软件比较小,仅仅一个exe小软件。 3、无需用户自己编写USB BULK驱动程序,详情见教程中1.4小节说明即可。同时,上位机设计中需要用到的各种文档、软件、驱动等,都在教程中都给出了下载地址。 4、教程中将USB BULK上位机和下位机设计中涉及到细节问题,全部毫无保留的进行了说明,可以防止大家少走很多弯路。 5、早期发布的网络摄像头之TCP上位机软件实现也是基于emWin模拟器的,详情见帖子:https://www.cnblogs.com/armfly/p/9173167.html 注意事项: 1、如果想直接测试上位机的效果,务必优先看教程1.4 小节如何安装驱动。 2、关闭上位机软件的时候,右击页面退出,右上角的X号未做响应处理。 3、上位机是用的VC6.0实现的,测试上位机时,只有打开 USB 连接成功了才可以正常操作其它几个按钮。 4、配套的下位机是基于RTX及其USB中间件实现的,推荐使用 MDK4.74 进行编译。当然,使用最新版的 MDK5.2X 也是没问题的,      在Options -> C/C++ -> Misc Controls选项里面添加--diag_suppress 3731即可。

    02

    浅析OGG VORBIS

    虽说OGG VORBIS的登场并未晚过前辈MP3过多时日,其的出现也正是为了阻拦MP3一路高歌猛进的强劲步伐,可是至少在中国这块破解软件的乐土,MP3虚有其表的版权以及真真切切的封闭却并未驱使人们义无反顾的投身OGG VORBIS的怀抱,尽管他完全的开源,尽管他彻底的免费,虽说在Linux平台上Ogg Vorbis的确流行,但是在中国这片Windows大放异彩的土地上,能够耳闻Ogg Vorbis名号的人估计也不在多数,笔者曾经在网上搜索过Ogg Vorbis相关的文章,大抵都是一些浮光掠影的简介,有些内容的也大多以英文写就,读来确有不便,再加上我在学习游戏编程的过程中对Ogg Vorbis有过一点浅显的认识,所以萌生了写作此文的想法,但文章终究是我的个人看法,期中讹误在所难免,希望大家对于其中不便于理解或者认为错误的地方一一指出,以使我进一步修正改进,总的来说我必须为那句“古语”负责:贻笑大方事小,误人子弟事大:)

    02

    电脑蓝屏代码大全

    编号 代码 含意 0 0x00000000 作业完成。 1 0x00000001 不正确的函数。 2 0x00000002 系统找不到指定的档案。 3 0x00000003 系统找不到指定的路径。 4 0x00000004 系统无法开启档案。 5 0x00000005 拒绝存取。 6 0x00000006 无效的代码。 7 0x00000007 储存体控制区块已毁。 8 0x00000008 储存体空间不足,无法处理这个指令。 9 0x00000009 储存体控制区块地址无效。 10 0x0000000A 环境不正确。 11 0x0000000B 尝试加载一个格式错误的程序。 12 0x0000000C 存取码错误。 13 0x0000000D 资料错误。 14 0x0000000E 储存体空间不够,无法完成这项作业。 15 0x0000000F 系统找不到指定的磁盘驱动器。 16 0x00000010 无法移除目录。 16 0x00000010 无法移除目录。 17 0x00000011 系统无法将档案移到 其它的磁盘驱动器。 18 0x00000012 没有任何档案。 19 0x00000013 储存媒体为写保护状态。 20 0x00000014 系统找不到指定的装置。 21 0x00000015 装置尚未就绪。 22 0x00000016 装置无法识别指令。 23 0x00000017 资料错误 (cyclic redundancy check) 24 0x00000018 程序发出一个长度错误的指令。 25 0x00000019 磁盘驱动器在磁盘找不到 持定的扇区或磁道。 26 0x0000001A 指定的磁盘或磁盘无法存取。 27 0x0000001B 磁盘驱动器找不到要求的扇区。 28 0x0000001C 打印机没有纸。 29 0x0000001D 系统无法将资料写入指定的磁盘驱动器。 30 0x0000001E 系统无法读取指定的装置。 31 0x0000001F 连接到系统的某个装置没有作用。 32 0x00000020 文件被另一进程使用中不能访问The process cannot access the file because it is being used by another process. 33 0x00000021 档案的一部份被锁定, 现在无法存取。 34 0x00000022 磁盘驱动器的磁盘不正确。 请将 %2 (Volume Serial Number: %3) 插入磁盘机%1。 36 0x00000024 开启的分享档案数量太多。 38 0x00000026 到达档案结尾。 39 0x00000027 磁盘已满。 50 0x00000032 不支持这种网络要求。 51 0x00000033 远程计算机无法使用。 52 0x00000034 网络名称重复。 53 0x00000035 网络路径找不到。 54 0x00000036 网络忙碌中。 55 0x00000037 特殊的网络资源或设备不可再使用The specified network resource or device is no longer available. 56 0x00000038 网络BIOS命令已达到限制The network BIOS command limit has been reached. 57 0x00000039 网络配接卡发生问题。 58 0x0000003A 指定的服务器无法执行要求的作业。 59 0x0000003B 网络发生意外错误。 60 0x0000003C 远程配接卡不兼容。 61 0x0000003D 打印机队列已满。 62 0x0000003E 服务器的空间无法储存等候打印的档案。 63 0x0000003F 等候打印的档案已经删除。 64 0x00000040 指定的网络名称无法使用。 65 0x00000041 拒绝存取网络。 65 0x00000041 拒绝存取网络。 66 0x00000042 网络资源类型错误。 67 0x00000043 网络名称找不到。 68 0x00000044 超过区域计算机网络配接卡的名称限制。 69 0x00000045 超过网络 BIOS 作业阶段的限制。 70 0x00000046 远程服务器已经暂停或者正在起始中。 71 0x00000047 由于联机数目已达上限,此时无法再联机到这台远程计算机。 72 0x00000048 指定的打印机或磁盘装置已经暂停作用。 80 0x00000050 档案已经存在。 82 0x00000052 无法建立目录或档案。 83 0x00000053 INT 2484 0x00000054 处理这项要求的储存体无法使用。 85 0x00000055 近端装置名称已经在使用中。 86 0x000

    02
    领券