Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Определить путь к файлу по HANDLE


Автор: freezeman 15.2.2012, 20:41
Здравствуйте!

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

Т.е. моя программа перехватив winapi функцию ReadFile из другой программы должна определить с какого файла на жестком диске или из ОП производится чтение...

Автор: 12usver12 15.2.2012, 21:53
Vista++  GetFinalPathNameByHandle
Vista--   http://msdn.microsoft.com/en-us/library/windows/desktop/aa366789(v=vs.85).aspx

Автор: freezeman 15.2.2012, 21:57
Цитата(12usver12 @ 15.2.2012,  21:53)
Vista++  GetFinalPathNameByHandle
Vista--   http://msdn.microsoft.com/en-us/library/windows/desktop/aa366789(v=vs.85).aspx

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

Автор: freezeman 16.2.2012, 09:29
Цитата(freezeman @ 15.2.2012,  21:57)
Цитата(12usver12 @ 15.2.2012,  21:53)
Vista++  GetFinalPathNameByHandle
Vista--   http://msdn.microsoft.com/en-us/library/windows/desktop/aa366789(v=vs.85).aspx

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

У вас компилируется http://msdn.microsoft.com/en-us/library/windows/desktop/aa366789(v=vs.85).aspx пример? Проверьте, пожалуйста, не знаю уже как по другому... у меня выдает две ошибки (создаю обычный консольный проект):

   Ошибка    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
 

Автор: 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. открываем документацию на http://msdn.microsoft.com/en-us/library/windows/desktop/ms683195(v=vs.85).aspx
2. смотрим раздел Requirements
3. находим требуемую библиотеку Psapi
4. подключаем ее:
Код

#pragma comment( lib, "Psapi" )

Автор: freezeman 16.2.2012, 12:56
Цитата(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. открываем документацию на http://msdn.microsoft.com/en-us/library/windows/desktop/ms683195(v=vs.85).aspx
2. смотрим раздел Requirements
3. находим требуемую библиотеку Psapi
4. подключаем ее:
Код

#pragma comment( lib, "Psapi" )

Точно, получилось. Но когда открываю файл "c:\\text.txt" в CreateFile  должно в результате выводиться его имя, а получаются "????". Подскажите, как так получается?

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

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

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

Автор: freezeman 16.2.2012, 13:16
Цитата(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();
}

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

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

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

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

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

Автор: 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

Добавлено через 6 минут и 23 секунды
Вам нужна функция http://msdn.microsoft.com/en-us/library/bb432383%28v=VS.85%29.aspx

Автор: freezeman 17.2.2012, 12:51
Цитата(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
Вам нужна функция http://msdn.microsoft.com/en-us/library/bb432383%28v=VS.85%29.aspx

Спасибо, это и нужно мне было узнать...Я раньше не работал с WINAPI поэтому и подробностей не знаю))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)