static DWORD WINAPI ClientFunct( LPVOID lpParam ) {
    pdata2 pmydata2 = (pdata2)lpParam;
    
    SOCKET sock = pmydata2->client_socket;

    STARTUPINFO sinfo;
    SECURITY_ATTRIBUTES secu_attr;
    PROCESS_INFORMATION pinfo;
    
    pmydata2->ZeroMem(&sinfo, sizeof sinfo);
    sinfo.cb = sizeof(sinfo);
    sinfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
    sinfo.wShowWindow = SW_HIDE;
    sinfo.hStdInput = (HANDLE)sock;
    sinfo.hStdOutput = (HANDLE)sock;
    sinfo.hStdError = (HANDLE)sock;

    pmydata2->CreateProcess(NULL, pmydata2->str_cmd, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &sinfo, &pinfo);

    pmydata2->Wait(pinfo.hProcess, INFINITE); //WaitForSingleObject
    pmydata2->CloseHandle(pinfo.hProcess);
    pmydata2->CloseHandle(pinfo.hThread);
}

Najpierw moze troche wyjasnien. Funkcja, ktora wkleilem jest odpowiedzialna za obsluge klientow. Watek jest uruchamiany gdy accept() zwroci gniazdo, ktore razem z innymi niezbednymi do dzialania funkcji rzeczami jest przekazywane jako parametr. Wywolania funkcji wygladaja tak a nie inaczej poniewaz ten kod ma dzialac w obcej przestrzeni adresowej (eksperymentuje z CreateRemoteThread). Program wydaje sie dzialac poprawnie, jedyny mankament to zamykanie sie procesu (tego wywolanego przez CreateProcess) zaraz po jego utworzeniu. Myslalem, ze to wina gniazda ale sprawdzilem i gniazdo dziala (mozna wysylac). Mam identyczny kod tyle ze pisany normalnie (a nie jako zdalny watek) i dziala poprawnie. Jak ktos wie co jest tego przyczyna albo jeszcze lepiej jak wie jak mi pomoc to bardzo prosze o odpowiedz.