2010-10-22 9 views
11

Chcę zaimplementować IPC przy użyciu nazwanej współużytkowanej pamięci.Błąd systemu 0x5: CreateFileMapping()

Aby to zrobić, jeden z kroków jest coraz uchwyt do mapowania pamięci dla obiektu, używając CreateFileMapping().

to zrobić dokładnie tak, jak strona internetowa 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(); 

Jednak uchwyt zwrócony jest zawsze 0x0, a systemu Kod błędu zwrócony jest: 0x5 (Odmowa dostępu.)

  • Dzielenie Tylko Nazwany pamięci pożądane (nie udostępnianie plików).
  • systemu Windows 7 x64 bitowe OS
  • prawa użytkownika Administratora dostępne
  • Opracowany Zastosowanie: 64bit Plug-In aplikacji (.dll)

Czy ktoś ma podobne doświadczenia i sposób, aby to naprawić, proszę? Używam witryny MSDN jako mojej referencji, więc nie sądzę, jest problem w kodzie.

+0

Nie jesteś pewien, że to jest powód, ale czy nie musisz ustawić maksymalnego rozmiaru obiektu na wielokrotność strony pamięci (4096 bajtów)? –

+1

Cześć Eugene, nie, problemem było to, że nie ustawiłem SeCreateGlobalPriviledge. –

Odpowiedz

8

Wygląda na to, że nie masz wystarczających uprawnień.

Od MSDN:

Tworzenie obiektu odwzorowania pliku w globalnej przestrzeni nazw w z sesji drugiej niż sesji zerowej wymaga SeCreateGlobalPrivilege przywilej . Aby uzyskać więcej informacji, zobacz : Kernel Object Przestrzenie nazw.

...

Utworzenie obiektu plików mapowania w globalnej przestrzeni nazw, za pomocą CreateFileMapping, z sesji innego niż sesji zerowej jest uprzywilejowana operacja. Z tego powodu, aplikacja działająca w dowolnej Remote Desktop Session Host (RD Session Host) sesji serwera musi mieć SeCreateGlobalPrivilege włączony celu stworzenia obiektu plików mapowania w globalnej przestrzeni nazw pomyślnie. Kontrola uprawnień jest ograniczona do tworzenia obiektów mapowania plików, a nie ma zastosowania do otwierania istniejących . Na przykład, jeśli usługa lub system utworzy obiekt mapowania plików, , każdy proces uruchomiony w dowolnej sesji może uzyskać dostęp do tego obiektu mapowania plików pod warunkiem, że użytkownik ma wymagany dostęp .

+2

Witaj Eugene, to był dokładnie mój problem. Usunąłem przedrostek "Global \\" z nazwy mojego obiektu odwzorowującego i z ape, który naprawił problem. Nie planuję zajmować się usługami terminalowymi, więc rozwiązanie powinno być do przyjęcia na razie. Czytałem dokumentację SeCreateGlobalPriviledge, ale nie jest dla mnie jasne, czy przywileje mogą być przypisane przez samą aplikację, czy też muszę ręcznie dostosować przywileje mówiące z Eksploratora Windows? –

+1

Uprawnienie jest zdefiniowane przez konto użytkownika, pod którym aplikacja jest uruchomiona. Możesz spróbować użyć funkcji AdjustTokenPrivilege, jak opisano tutaj: http://delphi.about.com/b/2008/09/26/zarko-needs-help-createfilemapping-terminal-services-global-session-secreateglobalprivilege.htm, ale to nie gwarantuje wyniku. Ogólnie rzecz biorąc, spróbuj wyszukać SeCreateGlobalPrivilege, wyniki zawierają interesujące źródła informacji. –

1

Aby utworzyć globalne odwzorowania plików, potrzebujesz uprawnienia SeCreateGlobalPrivilege - masz to? Odmowa dostępu oznacza na pewno, że jest to problem uprawnień.

+0

Witaj, Steve, to był mój problem. Dziękuję Ci. Naprawiłem problem na teraz w inny sposób, ale jeśli chcę ustawić przywileje, czy można to zrobić programowo z poziomu mojej aplikacji, proszę? –

+0

Możesz to zrobić za pomocą 'AdjustTokenPrivileges', jak pokazano tutaj: http://msdn.microsoft.com/en-us/library/aa446619(v=VS.85).aspx. Token handle pochodzi z 'OpenProcessToken', który musi być wywołany przy użyciu (przynajmniej)' TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY' –

+0

Dziękuję bardzo. –

2

Administratorzy, usługi i usługi sieciowe mają domyślnie ustawioną opcję SeCreateGlobalPrivilege. Musisz jednak pamiętać, że Windows7/Vista nie uruchamia wszystkiego jako administrator. Dlatego użyj opcji "Uruchom jako administrator", aby aplikacja "Globalna" działała prawidłowo. Jeśli debugujesz, uruchom Visual Studio również jako admin.

+0

Dziękuję bardzo! Visual Studio pod Windows 10 nie jest domyślnie administratorem. To był mój problem. –

0

Odniesienie do usług terminalowych w dokumentacji dotyczącej globalnej przestrzeni nazw jest nieco mylące, ponieważ sugeruje, że trzeba się tylko o to martwić, jeśli wystąpi nietypowa sytuacja.

W rzeczywistości zarówno IIS, jak i usługi systemowe działają w sesji zerowej i pierwszy/jedyny użytkownik, który loguje się w sesji 1 - więc musisz używać globalnej przestrzeni nazw do komunikacji między usługami IIS lub usługą a normalnym programem.

Powiązane problemy