Ich schreibe einen Kernel-Code für Windows7, um auf den gemeinsam genutzten Speicher zuzugreifen, der im Benutzermodus erstellt wurde, wie es hier .
Der Shared Memory wird im Benutzerbereich mit folgendem Namen erstellt:
Das Öffnen des Shared Memory im Userspace funktioniert.
Öffnen des gleichen gemeinsam genutzten Speichers im Kernel-Modus Aufruf von ZwOpenSection
schlägt fehl:
Der Kernel-Code lautet:
%Vor% Ich habe mehrere Namen versucht ( L"\MySharedMem"
oder L"MySharedMem"
), aber ich habe andere Fehler als STATUS_OBJECT_PATH_INVALID
oder STATUS_OBJECT_PATH_NOT_FOUND
bekommen. Das Erstellen des gemeinsamen Speichers als "Global\MySharedMem"
funktioniert nicht.
< br> Was mache ich falsch?
Ich habe versucht, den gemeinsamen Speicher im Kernel-Modus zu erstellen, ich bekomme Erfolg auf ZwCreateSection
und ZwMapViewOfSection
, aber ich bekomme Zugriffsverletzung, wenn ich auf den Zeiger pSharedData_ zugreifen, um den Puffer zu testen:
Alles scheitert ...
Betreffend CreateFileMapping :
Zum Erstellen eines Dateizuordnungsobjekts im globalen Namespace aus einer anderen Sitzung als Sitzung Null ist die Berechtigung
SeCreateGlobalPrivilege
erforderlich.
Von KB191840 :
[T] Das Objekt wird immer im Benutzeradressraum (unter 0x80000000) eines Prozesses abgebildet (unabhängig davon, ob das Objekt im Kernelmodus oder im Benutzermodus erstellt wird), die Adresse ist nur gültig, wenn auf sie im Kontext zugegriffen wird des Prozesses.
Die KB fährt fort:
Diese Methode wird nicht empfohlen und wird am wenigsten von Low-Level-Gerätetreibern verwendet, da, wie bereits erläutert, der Gültigkeitsbereich der Adresse auf den Prozess beschränkt ist, in dem das Objekt zugeordnet ist Auf einen DPC oder ISR kann nicht zugegriffen werden. [Betonung meiner]
Die Lösung ist entweder:
Tags und Links c++ windows shared-memory winapi kernel32