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

Поиск:

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


Бывалый
*


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

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



Здравствуйте!

Подскажите, пожалуйста, у меня есть перехваченная функция ReadFile, как мне определить из какого файла на диске производилось чтение?

Т.е. моя программа перехватив winapi функцию ReadFile из другой программы должна определить с какого файла на жестком диске или из ОП производится чтение...
PM MAIL   Вверх
12usver12
Дата 15.2.2012, 21:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Vista++  GetFinalPathNameByHandle
Vista--   тыц
PM MAIL   Вверх
freezeman
Дата 15.2.2012, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(12usver12 @ 15.2.2012,  21:53)
Vista++  GetFinalPathNameByHandle
Vista--   тыц

А я все не могу запустить её на XP...спасибо)
PM MAIL   Вверх
freezeman
Дата 16.2.2012, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(freezeman @ 15.2.2012,  21:57)
Цитата(12usver12 @ 15.2.2012,  21:53)
Vista++  GetFinalPathNameByHandle
Vista--   тыц

А я все не могу запустить её на XP...спасибо)

У вас компилируется этот пример? Проверьте, пожалуйста, не знаю уже как по другому... у меня выдает две ошибки (создаю обычный консольный проект):

   Ошибка    1    error LNK2019: ссылка на неразрешенный внешний символ _GetMappedFileNameW@16 в функции "int __cdecl GetFileNameFromHandle(void *)" (?GetFileNameFromHandle@@YAHPAX@Z)    c:\Users\пользователь\documents\visual studio 2010\Projects\test\test\test.obj    test

   Ошибка    2    error LNK1120: 1 неразрешенных внешних элементов    c:\users\пользователь\documents\visual studio 2010\Projects\test\Debug\test.exe    test
 

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


Эксперт
****


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

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



Цитата(freezeman @  16.2.2012,  11:29 Найти цитируемый пост)
Ошибка    1    error LNK2019: ссылка на неразрешенный внешний символ _GetMappedFileNameW@16 в функции "int __cdecl GetFileNameFromHandle(void *)" (?GetFileNameFromHandle@@YAHPAX@Z)    c:\Users\пользователь\documents\visual studio 2010\Projects\test\test\test.obj    test   Ошибка    2    error LNK1120: 1 неразрешенных внешних элементов    c:\users\пользователь\documents\visual studio 2010\Projects\test\Debug\test.exe    test 

1. открываем документацию на GetMappedFileName
2. смотрим раздел Requirements
3. находим требуемую библиотеку Psapi
4. подключаем ее:
Код

#pragma comment( lib, "Psapi" )


Это сообщение отредактировал(а) GremlinProg - 16.2.2012, 10:11


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


Бывалый
*


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

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



Цитата(GremlinProg @ 16.2.2012,  10:03)
Цитата(freezeman @  16.2.2012,  11:29 Найти цитируемый пост)
Ошибка    1    error LNK2019: ссылка на неразрешенный внешний символ _GetMappedFileNameW@16 в функции "int __cdecl GetFileNameFromHandle(void *)" (?GetFileNameFromHandle@@YAHPAX@Z)    c:\Users\пользователь\documents\visual studio 2010\Projects\test\test\test.obj    test   Ошибка    2    error LNK1120: 1 неразрешенных внешних элементов    c:\users\пользователь\documents\visual studio 2010\Projects\test\Debug\test.exe    test 

1. открываем документацию на GetMappedFileName
2. смотрим раздел Requirements
3. находим требуемую библиотеку Psapi
4. подключаем ее:
Код

#pragma comment( lib, "Psapi" )

Точно, получилось. Но когда открываю файл "c:\\text.txt" в CreateFile  должно в результате выводиться его имя, а получаются "????". Подскажите, как так получается?
PM MAIL   Вверх
GremlinProg
Дата 16.2.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(freezeman @  16.2.2012,  14:56 Найти цитируемый пост)
Но когда открываю файл "c:\\text.txt" в CreateFile  должно в результате выводиться его имя, а получаются "????". Подскажите, как так получается?

ничего не понял, где получаются "????" ?

p.s.: код в студию


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


Бывалый
*


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

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



Цитата(GremlinProg @ 16.2.2012,  13:05)
Цитата(freezeman @  16.2.2012,  14:56 Найти цитируемый пост)
Но когда открываю файл "c:\\text.txt" в CreateFile  должно в результате выводиться его имя, а получаются "????". Подскажите, как так получается?

ничего не понял, где получаются "????" ?

p.s.: код в студию

В общем задача в том, чтобы вывести путь к файлу по HANDLE
Пытался так, но при выводе получаются вопросы...
Код

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <psapi.h>
#include <strsafe.h>
#pragma comment( lib, "Psapi" )

#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 = CreateFile(L"C:\\text.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);     if(hFile == INVALID_HANDLE_VALUE)
    {
        _tprintf(TEXT("CreateFile failed with %d\n"), GetLastError());
        getchar();
        return 0;
    }
    GetFileNameFromHandle( hFile );
    getchar();
}


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


Эксперт
****


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

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



думаю, всю ветвь GetLogicalDriveStrings тут можно убрать вообще, т.к. она пытается подобрать для DOS-имени соответствующий ему том логического диска,
думаю, для обычных файлов подбирать ничего не требуется,

после вызова GetMappedFileName, pszFilename содержит корректный путь?



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


Бывалый
*


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

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



Цитата(GremlinProg @ 17.2.2012,  07:04)
думаю, всю ветвь GetLogicalDriveStrings тут можно убрать вообще, т.к. она пытается подобрать для DOS-имени соответствующий ему том логического диска,
думаю, для обычных файлов подбирать ничего не требуется,

после вызова GetMappedFileName, pszFilename содержит корректный путь?

Тоже не получилось, в общем мне нужно HANDLE преобразовать для того, что узнать функция читает данные из HHD или из ОП... может ReadFile в любом случае читает с жесткого диска??

PM MAIL   Вверх
xvr
Дата 17.2.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(freezeman @  17.2.2012,  09:17 Найти цитируемый пост)
Тоже не получилось, в общем мне нужно HANDLE преобразовать для того, что узнать функция читает данные из HHD или из ОП.

Это вы вряд ли узнаете. Да и HANDLE, указывающий на ОП, это нечто весьма необычное  smile 

Цитата(freezeman @  17.2.2012,  09:17 Найти цитируемый пост)
может ReadFile в любом случае читает с жесткого диска??

Нет, но в любом случае не из ОП (даже если читаемый файл лежит в RAM Disk'е)  smile

Добавлено через 6 минут и 23 секунды
Вам нужна функция NtQueryObject
PM MAIL   Вверх
freezeman
Дата 17.2.2012, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(xvr @ 17.2.2012,  12:23)
Цитата(freezeman @  17.2.2012,  09:17 Найти цитируемый пост)
Тоже не получилось, в общем мне нужно HANDLE преобразовать для того, что узнать функция читает данные из HHD или из ОП.

Это вы вряд ли узнаете. Да и HANDLE, указывающий на ОП, это нечто весьма необычное  smile 

Цитата(freezeman @  17.2.2012,  09:17 Найти цитируемый пост)
может ReadFile в любом случае читает с жесткого диска??

Нет, но в любом случае не из ОП (даже если читаемый файл лежит в RAM Disk'е)  smile

Добавлено @ 12:30
Вам нужна функция NtQueryObject

Спасибо, это и нужно мне было узнать...Я раньше не работал с WINAPI поэтому и подробностей не знаю))
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.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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