【问题标题】:Multiple CreateFileA calls return same File Handle多个 CreateFileA 调用返回相同的文件句柄
【发布时间】:2013-04-26 02:05:20
【问题描述】:

我有一个使用 CreateFileA 打开 COM 端口的例程。 该函数是作为 DLL 创建的,我有一个 EXE(使用 VS2010)来调用打开不同的 COM 端口。 一个观察是,如果我使用同一个 EXE 打开不同的端口,返回的文件句柄号是不同的。 如果我打开多个 EXE 实例并打开不同的 COM 端口,返回的文件句柄号是相同的。 例如-> 1 exe 用于打开 COM 端口 11、12、13、14,它们返回文件句柄编号 - 0x200、0x210、0x21c、0x220 4个exe,每个打开一个COM端口,都返回File Handle Number - 0x200。

我想知道这是否是由于 Windows 线程导致每个 exe 实例都有一个单独的线程并因此具有相同的文件号? 我使用我的 exe 与端口通信没有任何问题。 任何理解这一点的线索都会有所帮助。 (另一个应用程序正在尝试使用此 DLL,并遇到返回相同文件句柄号的问题)

谢谢 阿迪亚

【问题讨论】:

    标签: c visual-studio-2010 winapi visual-c++ handle


    【解决方案1】:

    HANDLE 的值只在一个进程内有效。更清楚地说,句柄被实现为某些内核对象表的索引(或偏移量)。该表存储在内核内存中并分配给特定进程,即每个进程都有自己的不同对象表。

    由于句柄只是某个表的偏移量,并且这些表对于不同的进程完全不同,因此您不能为不同的进程传递(或比较)HANDLE 的值。

    回到您的案例,如果您的应用程序简单且具有确定性,那么当您重新运行应用程序时,您很有可能获得相同的 HANDLE 值,这仅仅是因为 OS 可能会确定性地填充对象表。但是,它不能保证,您不能依赖它。

    由于句柄不能按字面意思传递给不同的进程,Windows 有DuplicateHandle 函数,如果一个进程想要将相同的对象传递给另一个进程,可以使用该函数。注意,使用 DuplicateHandle,源句柄只能在源进程中使用,而目标句柄只能在目标进程中使用。

    【讨论】:

    • 谢谢塞瓦。我可以一起跟踪流程和表格偏移量吗?在我的 exe 中是什么?
    • @Aditya,此信息不会通过任何公共 API 公开。 WindDbg 调试器可以通过内部结构访问它。查看 !handle 命令:msdn.microsoft.com/en-us/library/windows/hardware/…。不带参数运行它会显示进程中的所有句柄,以及对象的类型(文件/目录/注册表键/内存部分/信号量等)。
    猜你喜欢
    • 2018-09-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多