Windows-7登录屏幕中的CreateEvent

时间:2014-07-13 19:38:09

标签: security delphi winapi windows-7 winlogon

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

请参阅问题:Windows 7 logon screensaver in Delphi

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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