Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
Windows 7上的WTSOpenServer出现奇怪的崩溃(仅在Delphi 2009/2010中)_Delphi_Winapi_Windows 7_Remote Desktop_Terminal Services - Fatal编程技术网

Windows 7上的WTSOpenServer出现奇怪的崩溃(仅在Delphi 2009/2010中)

Windows 7上的WTSOpenServer出现奇怪的崩溃(仅在Delphi 2009/2010中),delphi,winapi,windows-7,remote-desktop,terminal-services,Delphi,Winapi,Windows 7,Remote Desktop,Terminal Services,我正在对一个现有代码的问题进行故障排除,这些代码总是运行良好(这是来自的)。 经过一些调查后,问题部分被降到以下位置: 在一次随机(但很小)的运行之后,我们会遇到一次应用程序崩溃,这使得调试变得很困难。 以下是我已经尝试过的东西: WTSOpenServer不会写入pServername参数(如CreateProcessW)(事实上,我检查了反汇编,它生成了一个副本) 当将nil作为参数传递时,代码运行良好(因此可以使用localmachine) 当使用远程服务器、localhost甚至dum

我正在对一个现有代码的问题进行故障排除,这些代码总是运行良好(这是来自的)。 经过一些调查后,问题部分被降到以下位置:

在一次随机(但很小)的运行之后,我们会遇到一次应用程序崩溃,这使得调试变得很困难。 以下是我已经尝试过的东西:

  • WTSOpenServer不会写入pServername参数(如CreateProcessW)(事实上,我检查了反汇编,它生成了一个副本)
  • 当将nil作为参数传递时,代码运行良好(因此可以使用localmachine)
  • 当使用远程服务器、localhost甚至dummy作为pServerName时,结果总是崩溃(在Vista和更高版本上,即使是无效的服务器名也会根据文档返回有效句柄)
  • 使用Delphi 2009和2010进行测试
  • 同样的代码在VisualStudio(c++)中运行良好
  • 在Visual Studio中检查了反汇编,并从Delphi中调用asm中的WTSOpenServer(并将句柄类型更改为类似于C中的指针):

  • 省略对WTSCloseServer的调用

  • 在x64和x86版本的Windows 7上测试代码
  • 使用外部调试器而不是Delphi调试器(在这种情况下似乎运行良好,所以我猜测这是某种计时/线程/死锁问题)
  • 添加,然后我看到一个异常\u访问\u冲突,但堆栈似乎已损坏,EIP为1,因此无法确定它发生在哪里

此时,我不知道如何进一步排除故障或找到解释。

尝试使用FastMM在FullDebuggMode下运行应用程序。它看起来更像是您的/3rd party lib代码中的一个bug-可能的内存覆盖/缓冲区溢出(大多数情况下,对于UnicodeString/String-like操作来说,GetMem太小了,它“工作”了,但迟早会崩溃/AV)

在将大型应用程序迁移到D2009时,我遇到过几个类似的情况,大多数情况下都是由于假设Char=1字节。有时会发生非常奇怪的事情,但总是有帮助的。异常是CreateProcessW,但它是已知/记录的行为

如果应用程序覆盖内存,则使用FullDebugMode,当您释放内存时,FastMM会在分配内存的位置向您提供异常,这样您就可以轻松跟踪此错误。它在分配的开始和结束添加了一些字节,这样就可以知道它是否被覆盖了

我无法用新的/空的VCL项目复制它,您可以自己尝试(此循环运行约5分钟):


我在Delphi7和2007(称为WTSOpenServerW版本)上测试了完全相同的代码,并且在这两个版本上都运行良好。结合它在C++中没有问题的事实,我怀疑这里的Delphi…这可能是一个UnoDeScords/ANSIGRAND问题吗?不:显示的代码是项目中唯一的代码。我的项目只包括那些代码!我甚至把它带回了一个没有使用任何单元的控制台项目。请注意,只有在使用Delphi 2009或Delphi 2010在Windows 7上运行调试时才会发生崩溃。我还使用Windows 7(RC,Ultimate 32位)和Delphi 2009(12.0.3420.21218),并且只使用标准新VCL项目显式导入的一个附加版本-JwaWtsApi32 rev。820(关于此的更新答案)。从delphi运行5-10分钟,并通过该循环逐步运行30-40次。您能在另一台具有相同OS/Delphi的机器上复制它吗?我对此非常极端的想法:病毒(rootkit;)/注入exe的代码中的第三方错误,如madExcept、EurekaLog、JDBG,../异常默认的Delphi编译器/链接器选项有错误/操作系统、更新、抗病毒、LSP有问题…Windows 7 RC“我也在使用Windows 7(RC,终极32位)…”(从info@simulates...)虽然我禁用了我的Virusscanner/防火墙,但我仍然注意到它注入了dll(F-Secure Internet Security 2010)。我以前忽略了它,因为它在旧的Delphi版本下运行良好,但决定卸载。你猜怎么着?没有更多的崩溃,将做更多的测试,如果这是问题,我会接受你的答案。所以有可能是错误的LSP库(我上次的“非常极端的想法”->“LSP出了什么问题”;)它确实覆盖了内存。。。您可以使用Autoruns(),列出所有LSP(WinSock提供程序),然后您可以禁用/删除其中一些-非Microsoft(您将从例如F-Secure中失去一些功能,但它有缺陷,因此不值得使用;)。来自Windows SDK(来自MS)的LSP示例也有缺陷(并且会泄漏内存),所以大部分类似交付的工作也会有缺陷。我知道F-Secure和E-Set LSP dll有缺陷。。。
  while true do
  begin
      hServer := WTSOpenServer(PChar('server'));
      WTSCloseServer(hServer);
      hServer := 0;
  end;
hModule := LoadLibrary('wtsapi32.dll');
if hModule = 0 then
  Exit;

WTSOpenServer := GetProcAddress(hModule, 'WTSOpenServerW');
if WTSOpenServer = nil then
  Exit;

while true do
begin
  asm
    push dword ptr pServerName;
    call dword ptr WTSOpenServer;
    mov [hServer], eax;
  end;

  hServer := nil;
end;
uses JwaWtsApi32;
procedure TForm7.FormCreate(Sender: TObject);
var
  hServer: DWORD;
begin
  while true do
  begin
      hServer := WTSOpenServer(PChar('server'));
      WTSCloseServer(hServer);
      hServer := 0;
  end;
end;