Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

Непонятности с GetWindowModuleFileName   Найти похожие ветки 

 
Чапаев ©   (2005-11-14 11:56) [0]

По идее, функция должна записать в буфер имя и путь к исполняемому файлу, который создал окно.

Делаю EnumWindows(), в процедуре обратного вызова вызываю эту функцию. Если вызываю из хука на мышь, не возвращает ничего, если из обычной программы -- всегда возвращает имя этой самой программы. В чём глюк?


 
Игорь Шевченко ©   (2005-11-14 13:14) [1]


>  В чём глюк?


В том, что эта функция работает для окон своего процесса.

Глянь в http://www.schevchenko.net.ru/SRC/EnumFunctions_60.zip там есть рецепт для произвольного окна


 
Чапаев ©   (2005-11-17 11:28) [2]

Пример не работает. :-( После вызова ReadProcessMemory() вылетает ошибка "ReadProcessMemory или WriteProcessMemory может быть выполнен только частично" (кажется, так).
WinXP SP2, Win2000 SP3.


 
Leonid Troyanovsky ©   (2005-11-17 12:03) [3]


> Чапаев ©   (17.11.05 11:28) [2]
> Пример не работает. :-( После вызова ReadProcessMemory()


Посмотри на fido7.ru.delphi FAQ
{Доступен на http:/www.podgoretsky.com или http://nps.vnet.ee
Альтернативный источник http://faq.delphiplus.org}

Вопрос, что-то вроде: Как внедрить dll в чужой процесс.

--
Regards, LVT.


 
Игорь Шевченко ©   (2005-11-17 12:27) [4]

Чапаев ©   (17.11.05 11:28) [2]

Привилегиев видать нету.


 
Чапаев ©   (2005-11-18 18:14) [5]


> Привилегиев видать нету.

На домашнем компе? Под администраторским аккаунтом? Да должно бы хватить... ;-)


 
Игорь Шевченко ©   (2005-11-18 21:40) [6]

Чапаев ©   (18.11.05 18:14) [5]

Спасибо. В этих системах поменялся адрес блока PEB.

Вот такой код работает:

function RtlGetPeb: Cardinal; assembler;
asm
 mov eax,fs:[24]
 mov eax,[eax+48]
end;

{ Получение командной строки для процесса выбранного окна }
function HSGetWindowCommandLine (AWindowHandle : HWND) : String;
var
 PEBAddress: Cardinal{ = $7FFDF000};
var
 AProcessID : DWORD;
 AProcessHandle : THandle;
 ATargetProcessParametersPointer : Ptr32;
 ATargetProcessParameters : TRTL_USER_PROCESS_PARAMETERS;
 ATargetCommandLine : array[0..MAX_PATH] of WideChar;
 AReturned : DWORD;
 APathBytes : WORD;
begin
 Result := "";
 { Алгоритм пригоден только для NT-платформ }
 if HSQuerySystemInfo(hsiNTPlatform) then begin
   { PID для процесса, создавшего окно }
{$IFDEF VER140}
   GetWindowThreadProcessID(AWindowHandle, AProcessID);
{$ELSE}
   GetWindowThreadProcessID(AWindowHandle, @AProcessID);
{$ENDIF}
   { handle этого процесса }
   AProcessHandle := OpenProcess(PROCESS_VM_READ or PROCESS_VM_OPERATION,
     false, AProcessID);
   if AProcessHandle = 0 then
     RaiseLastWin32Error();
   PEBAddress := RtlGetPeb;
   try
     { Получение адреса структуры параметров процесса }
     if NOT ReadProcessMemory(AProcessHandle,
                            { Этот оператор нужен для подсчета смещения в блоке
                              PEB на указатель на параметры процесса }
                            @PPEB(PEBAddress)^.ProcessParameters,
                            @ATargetProcessParametersPointer, SizeOf(Ptr32),
                            AReturned) then
       RaiseLastWin32Error();
     { Проверка избыточна, но вставлена для пущей надежности. }
     if AReturned <> SizeOf(Pointer) then
       raise Exception.CreateFmt(
         "ReadProcessMemory прочитала неверное количество данных, ожидалось %d, получено %d",
         [SizeOf(Ptr32), AReturned]);
     { Получение структуры параметров процесса }
     if NOT ReadProcessMemory(AProcessHandle, ATargetProcessParametersPointer,
                              @ATargetProcessParameters,
                              SizeOf(ATargetProcessParameters),
                              AReturned) then
       RaiseLastWin32Error();
     { Проверка избыточна, но вставлена для пущей надежности. }
     if AReturned <> SizeOf(ATargetProcessParameters) then
       raise Exception.CreateFmt(
         "ReadProcessMemory прочитала неверное количество данных, ожидалось %d, получено %d",
         [SizeOf(ATargetProcessParameters), AReturned]);
     { размер командной строки в байтах }
     APathBytes := ATargetProcessParameters.CommandLine.Length;
     if APathBytes > MAX_PATH * SizeOf(WideChar) then
       APathBytes := MAX_PATH * SizeOf(WideChar);
     { Получение командной строки для указанного процесса }
     if not ReadProcessMemory(AProcessHandle,
                              ATargetProcessParameters.CommandLine.Buffer,
                              @ATargetCommandLine,
                              APathBytes,
                              AReturned) then
       RaiseLastWin32Error();
     { Для преобразования в Ansi подсчитывается число символов Unicode без
       завершающего нуля. lstrlenW почему-то дала неверный результат. Странно.}
     Result := WideCharLenToString(ATargetCommandLine,
               Pred(AReturned DIV SizeOf(WideChar)));
   finally
     CloseHandle(AProcessHandle);
   end;
 end;
end;


 
shadowonline ©   (2005-12-22 17:17) [7]

Спасибо за код. Работает!
Вот только возникла проблема при переходе на Win XP, опять не работает.
Может там опять поменяли адрес блока PEB.
Помогите опять найти PEB блок в XP!!!


 
Игорь Шевченко ©   (2005-12-22 17:47) [8]


> опять не работает.


Как именно не работает ?


 
shadowonline ©   (2005-12-23 07:40) [9]

Ругается на строку "PEBAddress:= RtlGetPeb;" вызов асемблера.
Говорит ошибка 87. Параметр задан неверно.


 
Игорь Шевченко ©   (2005-12-23 11:23) [10]

shadowonline ©   (23.12.05 07:40) [9]

Бред. Пройди отладчиком.


 
shadowonline ©   (2005-12-23 13:45) [11]

Извиняюсь, ошибся!!! Отладка показала что ошибка происходит после вызова RaiseLastWin32Error();. Причем брекпоинт внутри RaiseLastWin32Error(); не отрабатывает(можно предположить что она и не вызывается). Нечего не понимаю. Может у меня руки кривые, но под Win 2000 работает однако.


 
Игорь Шевченко ©   (2005-12-23 14:39) [12]

shadowonline ©   (23.12.05 13:45) [11]


> Отладка показала что ошибка происходит после вызова RaiseLastWin32Error();
> .


RaiseLastWin32Error в этом коде вызывается четыре раза. Мне за догадливость, в каком именно месте происходит ошибка, денег не платят.


 
shadowonline ©   (2005-12-23 15:30) [13]

В первом
if AProcessHandle = 0 then
    RaiseLastWin32Error();//Здесь
PEBAddress := RtlGetPeb;


 
shadowonline ©   (2005-12-23 15:36) [14]

?????????. Если отлажевать под Win 2000 то ошибок вообще нет(все работает). Как же тогда ее можно отладить? Или только у меня под XP не работает????


 
Игорь Шевченко ©   (2005-12-23 15:57) [15]


> if AProcessHandle = 0 then


Не смог открыть процесс.

С привилегиями все хорошо ?


 
shadowonline ©   (2005-12-24 10:18) [16]

Теперь понятно в чем фишка. Но что то руки у меня кривые.
Нашел и состряпал(перевод из С) следующий код, все равно не помогает.
Может какую ни будь другую привилегию нужно или что не так делаю.
Функция возвращает успех но ошибка "87. Параметр задан неверно." все равно вылетает.

If EnableDebugPrivilege("SEDEBUGPRIVILEGE") Then ShowMessage("Yes!!!")
Else ShowMessage("No!!!");

function EnableDebugPrivilege(seName:String):Boolean;
Var
 hToken, prevst: Cardinal;
 tp, tk: TOKEN_PRIVILEGES;
Begin
 Result:= True;
 If (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)) Then Begin
   tp.PrivilegeCount:= 1;
   If LookupPrivilegeValue(nil, PChar(seName), tp.Privileges[0].Luid) Then Begin
     tp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
     If not AdjustTokenPrivileges(hToken, False, tp, sizeof(tp), tk, prevst) Then Result:= False;
   End
   Else Result:= False;
   CloseHandle(hToken);
 End
 Else Result:= False;
End;


 
shadowonline ©   (2005-12-24 10:44) [17]

Дополнительные тесты показали. Происходит ошибка в строке
if NOT ReadProcessMemory(AProcessHandle,
                           @PPEB(PEBAddress)^.ProcessParameters,
                           @ATargetProcessParametersPointer, SizeOf(Ptr32),
                           AReturned) then
      RaiseLastWin32Error();
Ошибка 299 Запрос ReadProcessMemory был выполнен только частично.
Это под ХР, а под 2000 работает.(по поводу 87 ошибки похоже я криво окно искал, извиняюсь)


 
Игорь Шевченко ©   (2005-12-26 11:18) [18]

Какой сервис-пак для XP установлен ?


 
shadowonline ©   (2005-12-26 12:11) [19]

Предустановлен SP2. Может быть проблемма в винде?


 
Игорь Шевченко ©   (2005-12-26 12:35) [20]

Код в [6] проверялся именно на XP SP2


 
shadowonline ©   (2005-12-26 13:30) [21]

Может есть какой патчь для Delphi 5


 
shadowonline ©   (2005-12-26 16:23) [22]

Странно, поставил Delphi 6, скомпилировал ошибка осталась. Только exe-к на 70Кб раздулся. Похоже руки у меня точно не стого места ростут(Но как этот же exe-к работает под Win 2000????).


 
shadowonline ©   (2005-12-26 16:24) [23]

Странно, поставил Delphi 6, скомпилировал ошибка осталась. Только exe-к на 70Кб раздулся. Похоже руки у меня точно не стого места ростут(Но как этот же exe-к работает под Win 2000????).



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.014 c
15-1140520497
devprom
2006-02-21 14:14
2006.03.19
Система управления процессом разработки


15-1140628618
easy
2006-02-22 20:16
2006.03.19
Coombay Dance Band


2-1141129418
Alexsan
2006-02-28 15:23
2006.03.19
Принтер


4-1135644089
Arazel
2005-12-27 03:41
2006.03.19
Чтение секторов из под Win9x КАК?


15-1141096201
SkyRanger
2006-02-28 06:10
2006.03.19
Рекламма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский