C ++ Чтение из общей памяти - PullRequest
1 голос
/ 12 октября 2009

Я хочу прочитать информацию о состоянии, которую приложение предоставляет через общую память. Я хочу использовать C ++ для чтения содержимого этой именованной разделяемой памяти, а затем вызвать его с помощью pinvoke из C # -класса.

Из программного обеспечения я знаю, что оно имеет определенную файловую структуру: структура STATUS_DATA с массивом из четырех структур SYSTEM_CHARACTERISTICS.

Я (пока) не знаком с C ++, поэтому я пытался в основном следовать msdn. Чтобы найти размер отображаемого файла, я добавил размеры членов структуры, как показано в приведенном ниже коде. Это приводит к отказу в доступе, поэтому я решил, что результат, основанный на структурах, слишком высок. Когда я использую sizeof(STATUS_DATA) (я добавил структуру к своему источнику), она все равно заканчивается ACCESS DENIED. Если я попробую что-нибудь меньшее, например, 1024 байта, единственное, что я смогу увидеть в pbuf, это < во время отладки.

Вот что я получил до сих пор:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
#pragma comment(lib, "user32.lib")

using namespace std;


signed int BUF_SIZE = 4 * (10368 + 16 + 4 + 16 + 4 + 16 + 4 + 1 + 4); // sizeof(STATUS_DATA);
TCHAR szName[]=TEXT("ENGINE_STATUS");

int main()
{
   HANDLE hMapFile;
   unsigned char* pBuf;

   hMapFile = OpenFileMapping(
                   FILE_MAP_READ,    // read access
                   FALSE,                 // do not inherit the name
                   szName);               // name of mapping object 

   if (hMapFile == NULL) 
   { 
      _tprintf(TEXT("Could not open file mapping object (%d).\n"), 
             GetLastError());

      return 1;
   } 

   pBuf = (unsigned char*) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_READ,  // read/write permission
               0,                    
               0,                    
               BUF_SIZE); // 1024);                  

   if (pBuf == NULL) 
   { 
      _tprintf(TEXT("Could not map view of file (%d).\n"), 
             GetLastError()); 

   CloseHandle(hMapFile);
      return 1;
   }

   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}

Я также удостоверился, что этот Общий Мем "есть", следуя этому подсказке . Может кто-нибудь дать мне подсказку, чего мне не хватает? Спасибо!

1 Ответ

3 голосов
/ 12 октября 2009

Последний параметр MapViewOfFile (dwNumberOfBytesToMap) должен быть меньше максимального размера, указанного при создании сопоставления. Поскольку мы не знаем, что это за размер, кажется справедливым предположить, что BUF_SIZE превышает его, а 1024 - нет. Задание 0 для этого параметра - простой способ отобразить весь файл в одном представлении.

Большинство (всех?) Отладчиков C ++ предполагают, что указатель на char является строкой с нулевым символом в конце, поэтому при попытке просмотра отображенных данных он будет отображаться только до первого байта, равного нулю. В зависимости от того, какие данные находятся в отображении файла, это может быть второй байт, который объясняет, почему вы не видите много информации. Было бы лучше привести приведенный указатель к STATUS_DATA * и просмотреть отдельные элементы.

Короче говоря:

  • Укажите ноль (0) для dwNumberOfBytesToMap
  • Привести возвращенный указатель к STATUS_DATA * вместо беззнакового символа *
...