Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FileName по FileHandle 
:(
    Опции темы
Mikel
Дата 30.7.2003, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

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



Можно ли узнать имя файла и путь по его hFile?


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
p0s0l
Дата 30.7.2003, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Так ты узнаешь и не только это:

BOOL GetFileInformationByHandle(
HANDLE hFile, // handle of file
LPBY_HANDLE_FILE_INFORMATION lpFileInformation // address of structure
);




--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_cully
Дата 30.7.2003, 15:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











хм, что-то не ясно как имя получить...

typedef struct _BY_HANDLE_FILE_INFORMATION {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD dwVolumeSerialNumber;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD nNumberOfLinks;
DWORD nFileIndexHigh;
DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION;

имени-то нет
  Вверх
p0s0l
Дата 30.7.2003, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



И правда... Неплохо я иногда глючу ? Если узнаешь как узнать smile.gif имя файла, то напиши об этом
обязательно - мне самому интересно стало...



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 30.7.2003, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Есть прога HandleEx - там можно узнать имя по хэндлу, интересно как она работает ?



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 30.7.2003, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



В www.sysinternals.com написано что HandleEx и ProcessExplorer юзают недокументированные
команды... Че-то там еще говорилось про MSDN, попробуй там поискать.
Для Windows NT нужно юзать ntdll.dll, функции Nt.... (например, NtQueryObject).

Может кто-нибудь знает модуль для delphi или C в котором прописаны функции ntdll ?



--------------------
С уважением, г-н Посол.
PM   Вверх
Mikel
Дата 31.7.2003, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

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



Вот что-то с msdn'ки, только надо ещё разобраться куда это он имя файла пихает.
Код

BOOL GetFilenameFromHandle(HANDLE hFile)
{
 BOOL bSuccess = FALSE;
 TCHAR* pszFilename[MAX_PATH+1];
 uint uMaxLenDest = 0;

 // Get the file size.
 DWORD dwFileSizeHi = 0;
 DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);

 // Create a file mapping object.
 HANDLE hFileMap = CreateFileMapping(hFile,
                                     NULL,
                                     PAGE_READONLY,
                                     0,
                                     dwFileSizeLo,
                                     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)) {

       // Attempt to translate the path with device name into drive
       // letters.
       TCHAR szTemp[512];
       *szTemp = NULL;

       if (GetLogicalDriveStrings(MAX_ARRAY_ITEMS(szTemp)-1,
                                  szTemp)) {
         TCHAR szName[MAX_PATH];
         TCHAR szDrive[3] = TEXT(" :");
         BOOL bFound = FALSE;
         TCHAR* p = szTemp;

         do {
           // Copy the drive letter into the template string,
           // removing the backslash.
           *szDrive = *p;

           // Look up each device name.
           if (QueryDosDevice(szDrive, szName,
                              MAX_ARRAY_ITEMS(szName))) {
             uint uNameLen = _tcslen(szName);

             // If greater than file name length, it's not a match.
             if (uNameLen < uMaxLenDest) {
               bFound = _tcsnicmp(pszFilename, szName, uNameLen)
                                   == 0;

               if (bFound) {
                 // Reconstruct pszFilename using szTemp as scratch,
                 // and replace device path with our DOS path.
                 TCHAR szTempFile[MAX_PATH];
                 _stprintf(szTempFile,
                           TEXT("%s%s"),
                           szDrive,
                           pszFilename+uNameLen);
                 stringCopy(pszFilename, szTempFile, uMaxLenDest);
               }
             }
           }

           // Go to the next NULL character.
           while (*p++);
         } while (!bFound && *p); // at the end of the string
       }
     }
     bSuccess = TRUE;
     if (!UnmapViewOfFile(pMem)) assert(0);
   }

   if (!CloseHandle(hFileMap)) assert(0);
 }
 return(bSuccess);
}

И ещё вопрос есть какая-нибудь функция типа SetFileOptions(hFile:Cardinal; Flags:Cardinal), чтобы можно было задавать пользовательские флаги файловому описателю?

Это сообщение отредактировал(а) Mikel - 31.7.2003, 08:16


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
p0s0l
Дата 31.7.2003, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Вот ведь, а! Смотрел же эти FileMappingи, только не было в хелпе функции GetMappedFileName...

Имя файла получается в pszFileName.
Вот delphi-версия:

Код
uses PsApi;

function GetFileNameFromHandle(hFile : THandle) : string;
var
 FileSizeHi, FileSizeLo : cardinal;
 hFileMap : THandle;
 Temp : array [0..511] of char;
 FileName : array [0..MAX_PATH] of char;
 Name : array [0..MAX_PATH-1] of char;
 Drive : array [0..2] of char;
 pMem : pointer;
 p : PChar;
 found : boolean;
 NameLen : integer;
begin
 FileSizeHi := 0;
 FileSizeLo := GetFileSize(hFile, @FileSizeHi);
 hFileMap := CreateFileMapping(hFile, 0, PAGE_READONLY, 0, FileSizeLo, 0);
 if (hFileMap <> 0) then
 begin
   pMem := MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, 1);
   if (pMem <> nil) then
   begin
     if GetMappedFileName(GetCurrentProcess, pMem, FileName, MAX_PATH) <> 0 then
     begin
       if GetLogicalDriveStrings(SizeOf(Temp), @temp) <> 0 then
       begin
         Drive := ' :'#0;
         found := false;
         p := @Temp;
         repeat
           Drive[0] := p^;
           if (QueryDosDevice(@Drive, Name, sizeOf(Name)) <> 0) then
           begin
             NameLen := Length(PChar(@Name));
             found := (Pos(Name, FileName) = 1);
             if found then Result := Drive + Copy(FileName, NameLen+1,
                                     Length(PChar(@FileName)) - NameLen);
           end;
           while (p^ <> #0) do inc(cardinal(p));
           inc(cardinal(p));
         until found or (p^ = #0);
       end;
     end;
     UnmapViewOfFile(pMem);
   end;
   CloseHandle(hFileMap);
 end;
end;



А насчет флагов - это вряд ли, есть SetHandleInformation, дак там свои флаги нельзя поставить.
Если только ты сам организуешь какой-нибудь буфер под флаги хэндлов, состоящий из двух полей handle, flags.



--------------------
С уважением, г-н Посол.
PM   Вверх
Mikel
Дата 31.7.2003, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

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



Спасибо за перевод, попробую


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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