Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение проекции файла 
V
    Опции темы
freezeman
Дата 11.4.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Всем добрый день!

Сложилась такая ситуация при записи в спроецированный файл: 
- создал проекцию в памяти на процессе А
- открыл её на процессе В и записал туда структуру с массивом TCHAR 
- при проверке памяти на процессе А передается только первые 18 элементов массива TCHAR (символов). 
В чем может быть прикол?
Чтение и запись проекции, как на msdn

Код получения массива TCHAR (преобразование handle файла в путь к нему):
Код

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <psapi.h>
#include <strsafe.h>
#define BUFSIZE 512
BOOL GetFileNameFromHandle(HANDLE hFile) 
{
  BOOL bSuccess = FALSE;
  TCHAR pszFilename[MAX_PATH+1];
  HANDLE hFileMap;
  // Get the file size.
  DWORD dwFileSizeHi = 0;
  DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); 
  if( dwFileSizeLo == 0 && dwFileSizeHi == 0 )
  {
     _tprintf(TEXT("Cannot map a file with a length of zero.\n"));
     return FALSE;
  }
  // Create a file mapping object.
  hFileMap = CreateFileMapping(hFile, 
                    NULL, 
                    PAGE_READONLY,
                    0, 
                    1,
                    NULL);
  if (hFileMap) 
  {
    // Create a file mapping to get the file name.
    void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
    if (pMem) 
    {
      if (GetMappedFileName (GetCurrentProcess(), 
                             pMem, 
                             pszFilename,
                             MAX_PATH)) 
      {
        // Translate path with device name to drive letters.
        TCHAR szTemp[BUFSIZE];
        szTemp[0] = '\0';
        if (GetLogicalDriveStrings(BUFSIZE-1, szTemp)) 
        {
          TCHAR szName[MAX_PATH];
          TCHAR szDrive[3] = TEXT(" :");
          BOOL bFound = FALSE;
          TCHAR* p = szTemp;
          do 
          {
            // Copy the drive letter to the template string
            *szDrive = *p;
            // Look up each device name
            if (QueryDosDevice(szDrive, szName, MAX_PATH))
            {
              size_t uNameLen = _tcslen(szName);
              if (uNameLen < MAX_PATH) 
              {
                bFound = _tcsnicmp(pszFilename, szName, uNameLen) == 0
                         && *(pszFilename + uNameLen) == _T('\\');
                if (bFound) 
                {
                  // Reconstruct pszFilename using szTempFile
                  // Replace device path with DOS path
                  TCHAR szTempFile[MAX_PATH];
                  StringCchPrintf(szTempFile,
                            MAX_PATH,
                            TEXT("%s%s"),
                            szDrive,
                            pszFilename+uNameLen);
                  StringCchCopyN(pszFilename, MAX_PATH+1, szTempFile, _tcslen(szTempFile));
                }
              }
            }
            // Go to the next NULL character.
            while (*p++);
          } while (!bFound && *p); // end of string
        }
      }
      bSuccess = TRUE;
      UnmapViewOfFile(pMem);
    } 
    CloseHandle(hFileMap);
  }
  _tprintf(TEXT("File name is %s\n"), pszFilename);
  return(bSuccess);
}
int _tmain(int argc, TCHAR *argv[])
{
    HANDLE hFile;
    if( argc != 2 )
    {
        _tprintf(TEXT("This sample takes a file name as a parameter.\n"));
        return 0;
    }
    hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
        OPEN_EXISTING, 0, NULL);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        _tprintf(TEXT("CreateFile failed with %d\n"), GetLastError());
        return 0;
    }
    GetFileNameFromHandle( hFile );
}




Это сообщение отредактировал(а) freezeman - 11.4.2012, 09:59
PM MAIL   Вверх
GremlinProg
Дата 11.4.2012, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(freezeman @  11.4.2012,  11:57 Найти цитируемый пост)

при проверке памяти на процессе А передается только первые 18 элементов массива TCHAR (символов).
В чем может быть прикол?

Цитата(freezeman @  11.4.2012,  11:57 Найти цитируемый пост)
Код получения массива TCHAR (преобразование handle файла в путь к нему):

а в чем прикол, выкладывать код получения массива TCHAR, если проблема не в его получении?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 11.4.2012, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(GremlinProg @ 11.4.2012,  12:04)
Цитата(freezeman @  11.4.2012,  11:57 Найти цитируемый пост)

при проверке памяти на процессе А передается только первые 18 элементов массива TCHAR (символов).
В чем может быть прикол?

Цитата(freezeman @  11.4.2012,  11:57 Найти цитируемый пост)
Код получения массива TCHAR (преобразование handle файла в путь к нему):

а в чем прикол, выкладывать код получения массива TCHAR, если проблема не в его получении?

Да, вы правы... не очень правильно задал вопрос. Но я думал, что ошибка тревиальна, скорее всего что-то в функции CopyMemory.
Как передать размер копируемой структуры?
PM MAIL   Вверх
GremlinProg
Дата 11.4.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(freezeman @  11.4.2012,  14:15 Найти цитируемый пост)
Но я думал, что ошибка тревиальна, скорее всего что-то в функции CopyMemory

CopyMemory я тут тоже не вижу
Цитата(freezeman @  11.4.2012,  14:15 Найти цитируемый пост)
Как передать размер копируемой структуры?

куда этот размер передать?

даже если проблема тривиальна, не надо экономить на буквах,
пока не объяснишь ее сути, тебе ни кто помочь не сможет,
ты уже столько тем наплодил, и ни в одной к финишу не пришел,

почему не догадываешься?

потому что ни как не можешь толком раскрыть вопрос,
подсказываю: кусок нерабочего кода способствует его раскрытию


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 11.4.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(GremlinProg @ 11.4.2012,  12:27)
даже если проблема тривиальна, не надо экономить на буквах,
пока не объяснишь ее сути, тебе ни кто помочь не сможет,
ты уже столько тем наплодил, и ни в одной к финишу не пришел,

почему не догадываешься?

Возможно вы правы, не всегда полностью освещал суть проблемы, но в предыдущих темах почти везде помогали, в том числе и вы, решать возникшие проблемы.
PM MAIL   Вверх
feodorv
Дата 11.4.2012, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  11.4.2012,  10:57 Найти цитируемый пост)
- создал проекцию в памяти на процессе А
- открыл её на процессе В и записал туда структуру с массивом TCHAR 
- при проверке памяти на процессе А передается только первые 18 элементов массива TCHAR (символов). 

А кода мы так и не увидели...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dem_max
Дата 11.4.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



где запись чтение из файла или памяти ??


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Akira
Дата 11.4.2012, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 26.3.2012

Репутация: нет
Всего: нет



freezeman
>> // Translate path with device name to drive letters.
Я же тебе говорил это в задаче и < пип >. не нужно. smile 
По поводу буфера 99.9% накосячил с его размером.
PS. Ужасный ###код... бррр.

M
GremlinProg
Akira

smile

Это сообщение отредактировал(а) GremlinProg - 11.4.2012, 14:39
PM MAIL   Вверх
freezeman
Дата 11.4.2012, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(Akira @ 11.4.2012,  14:32)
freezeman
>> // Translate path with device name to drive letters.
Я же тебе говорил это в задаче и < пип >. не нужно. smile 
По поводу буфера 99.9% накосячил с его размером.
PS. Ужасный ###код... бррр.

smile

Да я тожде так думаю, что проблема с буфером, проверю, позве выложу код...
А насет ужасного кода, все притензии к msdn!!  smile 
PM MAIL   Вверх
freezeman
Дата 11.4.2012, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Всем большое спасибо за проявление внимания к моей теме!

Дело было в ComyMemory, размер не тот передавал.
PM MAIL   Вверх
Akira
Дата 11.4.2012, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 26.3.2012

Репутация: нет
Всего: нет



Добавлю... выпили ты уже эту функу для получения имени.
Код

bool HandleToName(HANDLE hFile, char* Name)
{
    HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1, NULL);
    if (hFileMap != INVALID_HANDLE_VALUE)
    {
        void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
        GetMappedFileName(GetCurrentProcess(), pMem, Name, MAX_PATH);
        UnmapViewOfFile(pMem);
        CloseHandle(hFileMap);
        return true;
    }
    return false;
}

Что то типа такого, писал в браузере но на вид правильный. Алгоритм у тебя кривой, зачем по два раза делать проекцию, делай одну функу, вней делаешь проекцию, получаешь CRC пути сверяешь с ранее получеными путями если нет, считываешь и возращаешь буфер и оверхед будет меньше, и кода.
PM MAIL   Вверх
freezeman
Дата 13.4.2012, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(Akira @ 11.4.2012,  19:20)
Добавлю... выпили ты уже эту функу для получения имени.
Код

bool HandleToName(HANDLE hFile, char* Name)
{
    HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1, NULL);
    if (hFileMap != INVALID_HANDLE_VALUE)
    {
        void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
        GetMappedFileName(GetCurrentProcess(), pMem, Name, MAX_PATH);
        UnmapViewOfFile(pMem);
        CloseHandle(hFileMap);
        return true;
    }
    return false;
}

Что то типа такого, писал в браузере но на вид правильный. Алгоритм у тебя кривой, зачем по два раза делать проекцию, делай одну функу, вней делаешь проекцию, получаешь CRC пути сверяешь с ранее получеными путями если нет, считываешь и возращаешь буфер и оверхед будет меньше, и кода.

Спасибо за совет)) Допишу уже полностью проект, а потом все буду в порядок приводить...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.