Windows (C# で記述) サービスと C++ で記述されたスクリーンセーバーの間でデータを共有するために、メモリ マップ ファイルを使用しようとしています。
これは、スクリーンセーバーがログイン ユーザーのコンテキストで実行されている場合はうまく機能しますが、スクリーンセーバーがログオン画面で実行されている場合は機能しません。代わりOpenFileMapping
に、不正アクセス エラーで失敗します。アクセス ルール (または、おそらくこれを機能させるためのシステム設定) が不足していることは明らかですが、どれがどれかわかりません。
私のC#サイドコード:
public CreateMemMappedFile(string fileName)
{
this.rootName = fileName;
var security = new MemoryMappedFileSecurity();
security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
new SecurityIdentifier(WellKnownSidType.WorldSid, null),
MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
new SecurityIdentifier(WellKnownSidType.AnonymousSid, null),
MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
new SecurityIdentifier(WellKnownSidType.NullSid, null),
MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
// printing the SID from the screensaver shows that we are running as Local Service
security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
new SecurityIdentifier(WellKnownSidType.LocalServiceSid, null),
MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
this.handle = MemoryMappedFile.CreateOrOpen(
"Global\\" + fileName, 1024 * 1024,
MemoryMappedFileAccess.ReadWriteExecute
,MemoryMappedFileOptions.DelayAllocatePages,
security, System.IO.HandleInheritability.Inheritable
);
}
私のスクリーンセーバーコード:
TCHAR* myFileName = _T("Global\\myfile");
ipcBufferHandle = OpenFileMapping(FILE_MAP_READ,FALSE,myFileName);
if(ipcBufferHandle == NULL)
{
_tprintf(_T("couldn't open file \"%s\" with error code %d\n"),myFileName,GetLastError());
}
else
{
_tprintf(_T("opened file %s\n"),myFileName);
}
出力するcouldn't open file "Global\myfile" with error code 5