I wish to implement IPC using Named Shared Memory.
To do this, one of the steps is getting a handle to a Mapping Memory Object, using CreateFileMapping().
I do it exactly as MSDN website 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)
"GlobalMyFileMappingObject" // name of mapping object
);
DWORD dwError = GetLastError();
However, the handle returned is always 0x0, and the System Error Code returned is: 0x5 (Access Denied.)
- Only Named Memory Sharing desired (not file sharing).
- Windows 7 x64 bit OS
- Administrator’s user rights available
- Developed Application: 64bit Plug-In application (.dll)
Does anybody have the same experience, and a way to fix it, please? I use MSDN site as my reference, so I to not think, there is problem in the code.
Я использую учебник по эта ссылка MSDN реализовать способ передачи данных от одного процесса к другому. Хотя мне посоветовали предыдущий вопрос Чтобы использовать методы Pipe, из-за определенных ограничений у меня нет другого выбора, кроме как использовать метод CreateFileMapping.
Теперь мне удалось создать два отдельных проекта оконных форм в одном решении, и, отредактировав некоторые свойства, обе формы загружаются одновременно.
Кроме того, мне удалось внедрить код, приведенный в образце MSDN, в первую (Производитель) и вторую (Потребитель) программы без каких-либо ошибок компиляции.
Проблема, с которой я столкнулся сейчас, заключается в том, что когда я запускаю первую программу и пытаюсь создать дескриптор сопоставленного файла, мне выдается сообщение об ошибке, в котором говорится, что это не удалось, и я не понимаю, почему это происходит.
Я добавил файлы кода производителя и потребителя, чтобы продемонстрировать, что я пытаюсь сделать.
Производитель:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
//File header definitions
#define IDM_FILE_ROLLDICE 1
#define IDM_FILE_QUIT 2
#define BUF_SIZE 256
TCHAR szName[]=TEXT("GlobalMyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process!");
void AddMenus(HWND);
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
////Standard windows stuff - omitted to save space.
//////////////////////
// WINDOWS FUNCTION //
//////////////////////
LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
WPARAM wParam, LPARAM lParam)
{
WCHAR buffer[256];
LPCTSTR pBuf;
struct DiceData storage;
HANDLE hMapFile;
switch(message)
{
case WM_CREATE:
{
// Create Menus
AddMenus(hMainWindow);
}
break;
case WM_COMMAND:
// Intercept menu choices
switch(LOWORD(wParam))
{
case IDM_FILE_ROLLDICE:
{
//Roll dice and store results in variable
//storage = RollDice();
////Copy results to buffer
//swprintf(buffer,255,L"Dice 1: %d, Dice 2: %d",storage.dice1,storage.dice2);
////Show via message box
//MessageBox(hMainWindow,buffer,L"Dice Result",MB_OK);
hMapFile = CreateFileMapping(
(HANDLE)0xFFFFFFFF, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
MessageBox(hMainWindow,L"Could not create file mapping object",L"Error",NULL);
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
MessageBox(hMainWindow,L"Could not map view of file",L"Error",NULL);
CloseHandle(hMapFile);
return 1;
}
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
break;
case IDM_FILE_QUIT:
SendMessage(hMainWindow, WM_CLOSE, 0, 0);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hMainWindow, message, wParam, lParam);
}
//
//Setup menus
//
Потребитель:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
//File header definitions
#define IDM_FILE_QUIT 1
#define IDM_FILE_POLL 2
#define BUF_SIZE 256
TCHAR szName[]=TEXT("GlobalMyFileMappingObject");
//Prototypes
void AddMenus(HWND);
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
//More standard windows creation, again omitted.
//////////////////////
// WINDOWS FUNCTION //
//////////////////////
LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
WPARAM wParam, LPARAM lParam)
{
HANDLE hMapFile;
LPCTSTR pBuf;
switch(message)
{
case WM_CREATE:
{
// Create Menus
AddMenus(hMainWindow);
break;
}
case WM_COMMAND:
{
// Intercept menu choices
switch(LOWORD(wParam))
{
case IDM_FILE_POLL:
{
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
MessageBox(hMainWindow,L"Could not open file mapping object",L"Error",NULL);
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
MessageBox(hMainWindow,L"Could not map view of file",L"Error",NULL);
CloseHandle(hMapFile);
return 1;
}
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
break;
}
case IDM_FILE_QUIT:
SendMessage(hMainWindow, WM_CLOSE, 0, 0);
break;
}
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hMainWindow, message, wParam, lParam);
}
//
//Setup menus
//
Это ни в коем случае не аккуратно и не окончательно, но это только начало, спасибо за любую помощь.
Изменить: ошибка
Edit2: вывод
- Remove From My Forums
-
Question
-
Hello all,
I have just simply call the CreateFileMapping with INVALID_HANDLE_VALUE
m_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,&secAttr,PAGE_READWRITE,0,sizeof(MAPPING),SZ_MAPPING_NAME);
To close the Mapping file, I call the function CloseHandle(m_hMapfile)
I see that it close successfully with GetLastError()=0 when I stop my application, but then I start my application again, it seems that the mapping file was not closed since I see that GetLastError()=183 ( ERROR_ALREADY_EXISTS).
I didn’t create any mappingofView for this file mapping at all. I just want to test for creating of mapping file.
Anyone know that reason? Please advise.
Thanks.
Я хочу реализовать IPC с использованием именованной общей памяти.
Чтобы сделать это, одним из шагов является получение дескриптора объекта Mapping Memory, используя CreateFileMapping().
Я делаю это точно, как веб-сайт 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)
"GlobalMyFileMappingObject" // name of mapping object
);
DWORD dwError = GetLastError();
Однако возвращенный дескриптор всегда 0x0, а возвращаемый системный код ошибки: 0x5 (Access Denied.)
- Только Доступ к именам памяти (не общий доступ к файлам).
- операционная система Windows 7 x64
- Доступные права администратора
- Разработанное приложение: приложение с 64-битным подключаемым модулем (. dll)
Есть ли у кого-то такой же опыт и способ его исправить? Я использую сайт MSDN в качестве ссылки, поэтому я не думаю, что в коде есть проблемы.
Ответ 1
Похоже, у вас недостаточно привилегий.
Из MSDN:
Создание объекта сопоставления файлов в глобальное пространство имен из сеанса другое чем нулевой сеанс Привилегия SeCreateGlobalPrivilege. Для Дополнительная информация, см. Объект ядра Пространства имен.
…
Создание объекта сопоставления файлов в глобальном пространстве имен, используя CreateFileMapping из сеанса кроме нуля сеанса, является привилегированная работа. Из-за этого, приложение, выполняемое произвольным Узел сеанса удаленных рабочих столов (RD Session Host) должен иметь Функция SeCreateGlobalPrivilege включена в для создания объекта сопоставления файлов в глобальном пространстве имен. Проверка привилегий ограничивается создание объектов сопоставления файлов и не распространяется на открытие существующих из них. Например, если служба или система создает объект сопоставления файлов, любой процесс, выполняющийся в любом сеансе, может доступ к этому файло-картографическому объекту при условии, что пользователь имеет необходимый доступ.
Ответ 2
Администраторы, службы и сетевые службы по умолчанию имеют SeCreateGlobalPrivilege. Вы должны помнить, что Windows7/Vista не запускает все как admin. Поэтому используйте «Начать как администратор», чтобы сделать «Global» работу для вашего приложения. Если вы отлаживаете, запустите Visual Studio также как администратор.
Ответ 3
Чтобы создавать глобальные сопоставления файлов, вам нужна привилегия SeCreateGlobalPrivilege
— есть ли у вас это? Отказано в доступе, это означает, что это проблема с разрешениями.
Ответ 4
Ссылка на службы терминалов в документации о глобальном пространстве имен немного вводит в заблуждение, так как это подразумевает, что вам нужно только беспокоиться об этом, если у вас есть необычная ситуация.
Фактически, как IIS, так и системные службы запускаются в сеансе нуль, а первый/единственный пользователь должен запускать сеансы в сеансе 1 — поэтому вы должны использовать глобальное пространство имен для связи между IIS или службой и обычной программой.
Есть такой код:
#include <windows.h>
#include <stdio.h>
#include <string.h>
void main()
{
int i,l;
HANDLE s,h;
char *buffer;
char buf[]="abcdefghijklmno";
char tow[]="Text, writed to memory";
if ((h=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,1024,"mem"))==NULL)
{
printf("Can't create file mappingn");
}
printf("Handle: %dn",h);
if ((buffer=MapViewOfFile(h,FILE_MAP_WRITE | FILE_MAP_READ,0,0,1024))==NULL)
{
printf("Can't MapViewOfFilen");
}
s=CreateMutex(NULL,1,"sem");
Sleep(10000);
printf("Write to buffer first timen");
for (i=0;i<strlen(tow)+1;i++) buffer[i]=tow[i];
if (ReleaseMutex(s)) {printf("Release mutexn");}
printf("From buffer: %sn",buffer);
printf("Write to buffer second timen");
for (i=0;i<3;i++)
{
printf("Writed: %cn",buf[i]);
buffer[i*400]=buf[i];
}
Sleep(10000);
CloseHandle(s);
CloseHandle(h);
}
При его выполнении вот такой результат:
Что нужно убрать/добавить чтобы код заработал? GetLastError() выдает 6.
I wish to implement IPC using Named Shared Memory.
To do this, one of the steps is getting a handle to a Mapping Memory Object, using CreateFileMapping().
I do it exactly as MSDN website 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();
However, the handle returned is always 0x0, and the System Error Code returned is: 0x5 (Access Denied.)
- Only Named Memory Sharing desired (not file sharing).
- Windows 7 x64 bit OS
- Administrator’s user rights available
- Developed Application: 64bit Plug-In application (.dll)
Does anybody have the same experience, and a way to fix it, please? I use MSDN site as my reference, so I to not think, there is problem in the code.
Видимо, преподаватель ошибся.
Маппинг в Windows работает только с файлами (обычными файлами на диске или
файлом подкачки — pagefile). Если передать в CreateFileMapping/NtCreateSection хэндл
какого-то другого объекта, то функция вернет ошибку.
Я могу даже попробовать объяснить, почему это не работает.
Имя тома, такое как ‘C:’ или ‘\.C:’, на самом деле является просто символьной ссылкой на
соответствующее устройство, например ‘DeviceHarddiskVolume2’. В этом можно убедиться,
запустив программу WinObj из пакета Sysinternals и поискать букву диска в каталоге ‘GLOBAL??’.
Когда вызывается функция CreateFileMapping или ее низкоуровневый аналог Zw(Nt)CreateSection,
она среди прочего проверяет, является ли переданный хэндл файлом, и если нет — возвращает ошибку.
Вот фрагмент известного исходника из Windows Research Kernel:
basentosmmcreatesect.c
C | ||
|
Устройство, на которое указывает символьная ссылка тома, имеет другой тип —
IoDeviceObjectType, поэтому ObReferenceObjectByHandle завершается с ошибкой
STATUS_OBJECT_TYPE_MISMATCH и CreateFileMapping/Zw(Nt)CreateSection,
соответственно, тоже.
Ну и в описании функции CreateFileMapping сказано следующее:
Creates or opens a named or unnamed file mapping object for a specified file.
Здесь четко сказано: «file», ни слова про тома, устройства и т.п.
- Remove From My Forums
-
Question
-
I have this code that has been generously supplied by the user RLWA32. The following is the top of the file, a fraction. I changed the function name because I need to call it from another file.
int Sending_To_SSD() { // Create a 0 byte, empty file HANDLE hFile = CreateFile(_T("SphHarm.dat"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { _tprintf_s(_T("CreateFile failed with error %dn"), GetLastError()); return 1; } DWORD dwMaxSize = MAX_FLOATS * sizeof(float); HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwMaxSize, NULL); if (!hMap) { _tprintf_s(_T("CreateFileMapping failed with error %dn"), GetLastError()); return 1; } // map the entire file into the view float* pfArray = (float*)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (!pfArray) { _tprintf_s(_T("MapViewOfFile failed with error %dn"), GetLastError()); return 1; }
I also did a little surgery, removed comments and a printf statement. I wonder why the map file cannot be created? Thanks, — MyCatAlex
-
Edited by
Sunday, April 12, 2020 6:51 PM
-
Edited by
Answers
-
Try writing a byte to the file after CreateFile succeeds but before you call CreateFileMapping.
For example,
BYTE buf = ''; DWORD dwWritten = 0; WriteFile(hFile, &buf, sizeof buf, &dwWritten, NULL);
I’m wondering if CreateFileMapping behaves differently when the file to be mapped resides on an SSD that is not using the NTFS file system.
-
Marked as answer by
MyCatAlex
Sunday, April 12, 2020 11:07 PM
-
Marked as answer by
-
-
Edited by
WayneAKing
Sunday, April 12, 2020 10:58 PM -
Marked as answer by
MyCatAlex
Sunday, April 12, 2020 11:07 PM
-
Edited by