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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировать вывод на экран 
:(
    Опции темы
BasilL
Дата 27.5.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 26.5.2005
Где: Челябинск обл.

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



А нет ли в WinAPI какой-либо функции, похожей на BlockInput(ABlockInput : Boolean) из Shell32.dll, только на Output, что-нибудь вроде BlockOutput()?
PM MAIL   Вверх
Girder
Дата 28.5.2005, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



NT:
Код
uses tlhelp32, AccCtrl, AclAPI;

const
 THREAD_TERMINATE               =$0001;
 THREAD_SUSPEND_RESUME          =$0002;
 THREAD_GET_CONTEXT             =$0008;
 THREAD_SET_CONTEXT             =$0010;
 THREAD_SET_INFORMATION         =$0020;
 THREAD_QUERY_INFORMATION       =$0040;
 THREAD_SET_THREAD_TOKEN        =$0080;
 THREAD_IMPERSONATE             =$0100;
 THREAD_DIRECT_IMPERSONATION    =$0200;
 THREAD_ALL_ACCESS              = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3FF; // == $1F03FF;

function GetProcess32_ThreadID():TList;
var H:THandle;
    Thread32:TThreadEntry32;
    ThrID:PDWord;
    IgnorePrID:DWord;
begin
 IgnorePrID:=GetCurrentProcessID();
 Result:=TList.Create;
 H:=CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD,0);
 if H<>INVALID_HANDLE_VALUE then
  begin
   Thread32.dwSize:=SizeOf(TThreadEntry32);
   if Thread32First(H,Thread32) then
    repeat
     if (Thread32.th32OwnerProcessID<>IgnorePrID) then
      begin
       New(ThrID);
       ThrID^:=Thread32.th32ThreadID;
       Result.Add(ThrID);
      end;
    until (Thread32Next(H,Thread32)=false);
   CloseHandle(H);
  end;
 if Result.Count=0 then
  begin
   Result.Free;
   Result:=nil;
  end;
end;

function OpenThread(dwDesiredAccess:DWord;bInheritHandle:Bool;dwThreadId:DWord):Cardinal;
//Функция получения дескриптора потока по его идентификатору для Win 9X,ME,WinNT All
//dwDesiredAccess - флаги доступа к потоку
//bInheritHandle - флаг наследования дескриптора
//dwThreadId - идентификатор потока
//Выходные данные - дескриптор потока. При не удаче равен 0.
type
 TClient_ID=record
  pID:DWord;
  tID:DWord;
 end;
 TObjectAttributes=record
  dwSize:DWord;                    
  Attr:array [0..4] of DWord;
 end;
 TotWinMe=function(dwDesiredAccess:DWord;bInheritHandle:Bool;dwThreadId:DWord):DWord; stdcall;
 TotWinNT=function(out ThreadHandle:DWord;dwDesiredAccess:DWord;var ObjectAttributes:TObjectAttributes;var Client_ID:TClient_ID):DWord; stdcall;
var Kernel32,NTDLL:Cardinal;
    ErrOld:Cardinal;
    oProcess:Pointer;
    oThread:TotWinMe;
    NT_oThread:TotWinNT;
    pID:Cardinal;
    ObjectAttributes:^TObjectAttributes;
    Client_ID:TClient_ID;
begin
 Result:=0;
 pID:=GetCurrentProcessId();
 ErrOld:=SetErrorMode(SEM_NOOPENFILEERRORBOX);
 Kernel32:=LoadLibrary('Kernel32.dll');
 if (Kernel32<>0) then
  begin
   NTDLL:=LoadLibrary('ntdll.dll');
   if (NTDLL<>0) then
    begin
     NT_oThread:=GetProcAddress(NTDLL,'NtOpenThread');
     if assigned(NT_oThread) then
      begin
       ObjectAttributes:=VirtualAlloc(nil,SizeOf(TObjectAttributes),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
       if (ObjectAttributes<>nil) then
        begin
         FillChar(ObjectAttributes^,SizeOf(TObjectAttributes),#0);
         ObjectAttributes^.dwSize:=SizeOf(TObjectAttributes);
         if DWord(bInheritHandle)<>0 then ObjectAttributes^.Attr[2]:=$2;
         Client_ID.pID:=0;
         Client_ID.tID:=dwThreadId;
         NT_oThread(Result,dwDesiredAccess,ObjectAttributes^,Client_ID);
         VirtualFree(ObjectAttributes,0,MEM_RELEASE);
        end;
      end;
     FreeLibrary(NTDLL);
    end;
   oThread:=GetProcAddress(Kernel32,'OpenThread');
   if (Result=0)and(assigned(oThread)) then
    Result:=oThread(dwDesiredAccess,bInheritHandle,dwThreadId);
   oProcess:=GetProcAddress(Kernel32,'OpenProcess');
   if (Result=0)and(oProcess<>nil) then
    begin
     asm
      pushfd
      pushad
      mov ebx,pID
      xor ebx,fs:[30h]
      xor ebx,dwThreadId
      mov eax,oProcess
      lea edi,[eax+24h]
      mov eax,[edi]
      cmp eax,0b9h
      jnz @Error_W9X
      mov oThread,edi
      lea esi,[ebx+2]
      push 2
      push esi
      call IsBadWritePtr
      or eax,eax
      jnz @Error_W9X
      mov ecx,oThread
      xchg eax,ebx
      push dwThreadId
      push bInheritHandle
      push dwDesiredAccess
      call ecx
      mov Result,eax
@Error_W9X:
      popad
      popfd
     end;
    end;
   FreeLibrary(Kernel32);
  end;
 SetErrorMode(ErrOld);  
end;

procedure TForm1.Button1Click(Sender: TObject);
var Thread_ListID:TList;
    i:integer;
    ot:DWord;
    ThrID:PDWord;
begin
 Thread_ListID:=GetProcess32_ThreadID();
 if Thread_ListID<>nil then
  begin
   for i:=0 to Thread_ListID.Count-1 do
    begin
     ThrID:=Thread_ListID.Items[i];
     if ThrID<>nil then
      begin
       ot:=OpenThread(Write_DAC,false,ThrID^);
       if ot<>0 then
        begin
         SetSecurityInfo(ot,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,nil,nil,nil,nil);
         CloseHandle(ot);
        end;
       ot:=OpenThread(THREAD_SUSPEND_RESUME,false,ThrID^);
       if ot<>0 then
        begin
         SuspendThread(ot);
         CloseHandle(ot);
        end;
      end;
    end;
   Sleep(5000); //Глушим все... на 5 секунд.
   for i:=0 to Thread_ListID.Count-1 do
    begin
     ThrID:=Thread_ListID.Items[i];
     if ThrID<>nil then
      begin
       ot:=OpenThread(THREAD_SUSPEND_RESUME,false,ThrID^);
       if ot<>0 then
        begin
         ResumeThread(ot);
         CloseHandle(ot);
        end;
      end;
    end;
   Thread_ListID.Free;
  end;
end;


PS: Лень... было только ACL потоков востанавливать... smile

PS2: smile


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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