4

我问这个问题是因为事实证明,在 Delphi 中编写能够从登录屏幕运行的屏幕保护程序应用程序存在一些困难。

请参阅问题:Delphi 中的 Windows 7 登录屏幕保护程序

我已将问题(或至少一个问题)缩小到特定的 Win API 调用CreateEvent

SyncEvent := CreateEvent(nil, True, False, '');
if SyncEvent = 0 then
  RaiseLastOSError;

此代码仅在从登录屏幕调用时才会失败。GetLastError 返回访问被拒绝。很明显,登录屏幕上的安全限制阻止CreateEvent(nil, True, False, '');了根据需要创建事件。

(我真的不明白事件如何成为可利用的安全风险。)

所以,问题是:是否可以从登录屏幕创建事件?大概通过以下任一方式:

  • 使用适当的lpEventAttributes
  • 或者改为调用 CreatingEventEx。

虽然在 Delphi 中遇到过这个问题,但这更多的是关于 Win API。所以请随意用您选择的语言回答

4

1 回答 1

7

尝试将最后一个参数设置为CreateEvent() tonil而不是''. nil 指针和指向零长度字符串的指针是有区别的。该 文档没有说明零长度字符串与任何其他命名字符串的处理方式有何不同。因此,您的计算机上的其他地方可能存在另一个零长度命名事件,您的应用程序无法访问,因此当CreateEvent()尝试访问现有事件并失败时出现访问被拒绝错误。如果要创建未命名事件,请nil改用。

于 2014-07-14T15:03:27.720 回答