gypakk
Goto Top

Shared Memory erstellen, das für alle User lesbar ist?

Hallo,

ich verwende Shared Memory für den schnellen Datenaustausch zwischen zwei Programmen. Das funktioniert bis jetzt wunderbar.
Nun soll aber der Austausch aber zwischen zwei Prozessen stattfinden, die unter unterschiedlichen Useraccounts laufen.

Wie muss ich dazu den Shared Memory-Bereich generieren?

/* Shared Memory als IO-Bereich generieren */
cioh= CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(cio_t),"CIO");

if(cioh!=NULL && cio==NULL) /* IO-Bereich konnte generiert werden UND IO-Bereich ist noch nicht zugeordnet */
cio= (cio_t*)MapViewOfFile(cioh,FILE_MAP_ALL_ACCESS,0,0,sizeof(cio_t)); /* IO-Bereich zuordnen */


Hat jemand einen Tipp für mich?

gypakk

Content-ID: 80002

Url: https://administrator.de/contentid/80002

Ausgedruckt am: 13.11.2024 um 09:11 Uhr

gypakk
gypakk 06.02.2008 um 03:42:22 Uhr
Goto Top
Zwischenbericht:

Nicht schön, aber irgendwie funktioniert's. Zumindest unter XP. Vista-Test steht noch bevor...
Es scheint sich wohl um ein reines Berechtigungsproblem gehandelt zu haben. Das folgende Code-Stückchen setzt die Zugriffsrechte so, dass jeder auf das Shared Memory zugreifen darf.
Sorry, für Kommentierung bin ich inzwischen zu müde. Mein Bett schreit schon. face-smile

SID_IDENTIFIER_AUTHORITY sidiaworld= {SECURITY_WORLD_SID_AUTHORITY};
PSID psid;
SID_IDENTIFIER_AUTHORITY sidia;
PACL pacl;
int acllen;
BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
SECURITY_DESCRIPTOR* psd;
SECURITY_ATTRIBUTES sa;

i= AllocateAndInitializeSid(&sidiaworld,1,SECURITY_WORLD_RID,0,0,0,0,0,0,0,&psid);
acllen= sizeof(ACL)+sizeof(ACCESS_ALLOWED_ACE)*2+GetLengthSid(psid)*2-sizeof(DWORD)+10;
pacl= (ACL*)malloc(acllen);
i= InitializeAcl(pacl,acllen,ACL_REVISION);
i= AddAccessAllowedAce(pacl,ACL_REVISION,0x1fffff,psid);
psd= (SECURITY_DESCRIPTOR*)&sd;
i= InitializeSecurityDescriptor(psd,SECURITY_DESCRIPTOR_REVISION);
i= SetSecurityDescriptorDacl(psd,true,pacl,false);
sa.nLength= sizeof(sa);
sa.lpSecurityDescriptor= psd;
sa.bInheritHandle= true;
cioh= CreateFileMapping(INVALID_HANDLE_VALUE,&sa,PAGE_READWRITE,0,sizeof(cio_t),"?IO");
(...)

Sorry, mit der Formatierung hier im Forum tu ich mich irgendwie noch schwer...