Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 受MIDA保护时,文件I/O期间多线程.NET应用程序块_C++_.net_Multithreading_Blocking - Fatal编程技术网

C++ 受MIDA保护时,文件I/O期间多线程.NET应用程序块

C++ 受MIDA保护时,文件I/O期间多线程.NET应用程序块,c++,.net,multithreading,blocking,C++,.net,Multithreading,Blocking,正如标题所说,我有一个.NET应用程序,它是GUI,它使用多个线程执行单独的文件I/O,请注意,当应用程序受MIDA保护时,线程偶尔会阻塞 一个线程用于读取串行COM端口,另一个线程用于复制文件。我的经验是,当文件复制线程偶尔遇到网络延迟时,它会阻止从串行端口读取的另一个线程。除了网络速度慢(可能是暂时的)外,我还可以通过调用错误路径(例如 PathFileExists("\\\\BadPath\\file.txt"); COM端口读取功能将在调用期间阻塞。只有当应用程序受

正如标题所说,我有一个.NET应用程序,它是GUI,它使用多个线程执行单独的文件I/O,请注意,当应用程序受MIDA保护时,线程偶尔会阻塞

一个线程用于读取串行COM端口,另一个线程用于复制文件。我的经验是,当文件复制线程偶尔遇到网络延迟时,它会阻止从串行端口读取的另一个线程。除了网络速度慢(可能是暂时的)外,我还可以通过调用错误路径(例如

PathFileExists("\\\\BadPath\\file.txt");
COM端口读取功能将在调用期间阻塞。只有当应用程序受MIDA保护时,才会发生这种情况。我在WinXP、Win7和Server 2012下进行了尝试

在一个简化的测试项目中,如果我用MFC非托管应用程序替换.NET应用程序,并且仍然使用相同的线程,那么即使在使用MIDA进行保护时,我也看不到任何问题

我已经联系了俄勒冈州的支持人员,以下是他们的回复:

NET应用程序受保护的方式与本机应用程序非常不同

为了保护.NET应用程序,我们需要钩住大多数文件访问API,以便>欺骗.NET Framework,使其知道应用程序受到保护。我猜CreateFile、ReadFile上的那些特殊>钩子。。。您的应用程序>中的执行延迟了一点,问题就出现了。我们做了一个测试,使这些钩子尽可能轻,上面的代码>最少,但问题仍然出现在您的应用程序中

我们尝试过的其他软件保护器,比如谜,莫莱克斯。。。还可以使用类似的>挂钩方法,因为这是使.NET压缩文件工作的唯一方法。如果这些钩子>不存在,.NET Framework将中止执行,因为它将看到原始>文件由于Microsoft对.NET文件的所有检查而被篡改

这些钩子在本机应用程序中不存在,这就是为什么它在本机应用程序上工作良好的原因

俄勒冈州的支持人员尝试了其他软件保护器,如Enigma Protector、Engima VirtualBox和Molebox,所有这些软件都出现了完全相同的问题

我发现,作为一种解决方法,可以将文件存在的文件复制逻辑分离出来,调用将在一个完全独立的过程中执行

我曾经尝试将线程函数从非托管C++转换为VB.NET等效路径PasFiel-Engule> Syt.I.F.Eng存在和CeaFeFiel/Read Fiels.Soo.Io.Posi.SerialPo.Open/Read,并且仍然看到在文件检查或复制调用被延迟时相同的串行端口被读取阻塞。我还尝试将ReadFile设置为异步工作,但没有效果

我相信我正在处理的是一些低级windows层,无论它在共享资源上显示一个块的语言是什么,并且只有当应用程序在一个受Themida保护的.NET进程下执行时,它才会安装一些钩子来允许.NET执行

此时,无法将整个应用程序从.NET中转换出来。也不是将文件复制逻辑分离到单独的任务。我想知道是否有人更了解文件操作如何阻止另一个线程从系统端口读取

我在这里提供了一些示例应用程序来说明问题:

-VB.NET

-MFC


它们是VisualStudio2010解决方案。运行themida protected exe时,可以看到FileThread计数器何时暂停执行File.Exists调用,而ReadThread计数器何时也暂停。运行不受保护的visual studio output exe时,ReadThread计数器不会暂停,这正是我们所期望的功能。

您需要停止使用对应用程序执行有如此可怕影响的工具。@HansPassant您的评论没有多大帮助。我们需要为此应用程序使用软件保护的原因有很多,但这个问题与此无关。它只是一个注释,这里应该是有帮助的答案。如果你没有得到任何,那么这就是你要看的全部。这是个好建议。你当然不喜欢听,这是必然的。嘿,有人真的关心你的问题,比你能为卖主说的还要多。最好以他们的方式发送你的评论。