2010-10-22 5 views
11

Je souhaite implémenter IPC à l'aide de la mémoire partagée nommée.Erreur système 0x5: CreateFileMapping()

Pour ce faire, l'une des étapes est d'obtenir une poignée à un objet de mémoire Mapping , en utilisant CreateFileMapping().

je le fais exactement comme site MSDN reccommends: http://msdn.microsoft.com/en-us/library/aa366551(v=VS.85).aspx:

hFileMappingHandle = CreateFileMapping 
    (
     INVALID_HANDLE_VALUE,  // use paging file 
     NULL,      // default security 
     PAGE_READWRITE,   // read/write access 
     0,   // maximum object size (high-order DWORD) 
     256,   // maximum object size (low-order DWORD) 
     "Global\\MyFileMappingObject"   // name of mapping object 
    ); 
DWORD dwError = GetLastError(); 

Cependant, la poignée de retour est toujours 0x0, et le code d'erreur système retourné est: 0x5 (Accès refusé.)

  • Seulement mémoire nommé Partage souhaité (pas de partage de fichiers).
  • de Windows 7 x64 bit OS
  • droits de l'utilisateur de l'administrateur disponible
  • application développée: 64bit application plug-in (.dll)

Est-ce que quelqu'un a la même expérience, et un moyen de le réparer, s'il vous plaît? J'utilise le site MSDN comme référence, donc je ne pense pas, il y a un problème dans le code.

+0

Vous n'êtes pas sûr que ce soit la raison, mais n'avez-vous pas besoin de définir la taille maximale de l'objet comme multiple de la page de mémoire (4096 octets)? –

+1

Salut Eugene, non, le problème était que je ne dis pas SeCreateGlobalPriviledge. –

Répondre

8

On dirait que vous n'avez pas assez de privilèges.

De MSDN:

Création d'un objet de mappage de fichier dans l'espace de noms global d'une session autre que la session zéro exige la SeCreateGlobalPrivilege privilège. Pour plus d'informations, voir Objets du noyau .

...

La création d'un objet de mappage de fichier dans l'espace de noms global, en utilisant CreateFileMapping, d'une session autre que la session zéro est une opération privilégiée. De ce fait, une application en cours d'exécution dans une session serveur session Bureau à distance hôte arbitraire (Host RD session) doit avoir SeCreateGlobalPrivilege activé afin de créer un objet de mappage de fichier dans l'espace de noms global avec succès. La vérification de privilège est limitée à la création d'objets de mappage de fichiers, et ne s'applique pas à l'ouverture de existants. Par exemple, si un service ou le système crée un objet de mappage de fichier, tout processus exécuté dans une session peut accéder à cet objet de mappage de fichier à condition que l'utilisateur ait l'accès nécessaire .

+2

Bonjour Eugène, c'était exactement mon problème. J'ai supprimé le préfixe "Global \\" du nom de mon objet de mappage, et cela a corrigé le problème. Je ne prévois pas de traiter avec les services terminaux, donc la solution devrait être acceptable pour le moment. J'ai lu la documentation sur SeCreateGlobalPriviledge, mais ce n'est pas clair pour moi, si les privilèges peuvent être assignés par l'application elle-même, ou si je dois ajuster manuellement les privilèges dis de Windows Explorer? –

+1

Le privilège est défini par le compte d'utilisateur sous lequel votre application est démarrée. Vous pouvez essayer d'utiliser la fonction AdjustTokenPrivilege comme indiqué ici: http://delphi.about.com/b/2008/09/26/zarko-needs-help-createfilemapping-terminal-services-global-session-secreateglobalprivilege.htm, mais cela ne garantit pas le résultat. En général, essayez de rechercher SeCreateGlobalPrivilege, les résultats contiennent des sources d'informations intéressantes –

1

Pour créer des mappages de fichiers globaux, vous avez besoin du privilège SeCreateGlobalPrivilege - avez-vous cela? Access-denied implique que c'est un problème d'autorisations, c'est certain.

+0

Salut Steve, c'était mon problème. Je vous remercie. J'ai réglé le problème pour le moment d'une manière différente, mais si je veux fixer des privilèges, est-ce que cela peut être fait par programme à partir de mon application, s'il vous plaît? –

+0

Vous pouvez le faire en utilisant 'AdjustTokenPrivileges' comme indiqué ici: http://msdn.microsoft.com/en-us/library/aa446619(v=VS.85).aspx. Le handle de jeton provient de 'OpenProcessToken' qui doit être appelé en utilisant (au moins)' TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY' –

+0

Merci beaucoup. –

2

Administrateurs, services et services réseau ont SeCreateGlobalPrivilege par défaut. Vous devez vous rappeler cependant que Windows7/Vista ne fonctionne pas tout en tant qu'administrateur. Utilisez donc "Démarrer en tant qu'administrateur" pour que "Global" fonctionne pour votre application. Si vous déboguez, démarrez Visual Studio en tant qu'administrateur également.

+0

Merci beaucoup! Visual Studio sous Windows 10 n'est pas admin par défaut. C'était mon problème. –

0

La référence aux services de terminaux dans la documentation sur l'espace de noms global est un peu trompeuse car elle implique que vous ne devez vous en préoccuper que si vous avez une situation inhabituelle. En fait, les services IIS et système s'exécutent en session zéro et le premier/seul utilisateur à se connecter s'exécute en session 1. Vous devez donc utiliser l'espace de noms global pour communiquer entre IIS ou un service et un programme normal.

Questions connexes