Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

CreateProcess()

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> CreateProcess()
Имя
Сообщение << Старые топики   Новые топики >>
CreateProcess() - 2011-04-08 20:15:12.603333   
Sidjey

Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
Ребят, помогите плиз доделать прогу… нужно вставить CreateProcess() в прогу… прога подобие ls в linux с pipe() и fork()….
и еще нужно добавить, чтобы выводило: права доступа… Очень прошу помогите с прогой!!! Заранее спасибо!!!!
#undef UNICODE #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; void print_space(int count) { for (int i=0; i&lt;=count; i++) printf(" "); } int process_directory(char *theDir, int& level) { WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; char szDir[MAX_PATH]; size_t length_of_arg; HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwError=0; strncpy_s(szDir, theDir, MAX_PATH); strncat_s(szDir, "\\*", MAX_PATH); // Find the first file in the directory. hFind = FindFirstFile(szDir, &ffd); if (INVALID_HANDLE_VALUE == hFind) return dwError; do { // пропускаем каталоги . и .. if ((strncmp(ffd.cFileName, ".", MAX_PATH) == 0) || (strncmp(ffd.cFileName, "..", MAX_PATH) == 0) ) { if (FindNextFile(hFind, &ffd) != 0) continue; else break; } if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { print_space(level); printf("+--"); printf(" %s &lt;DIR&gt;\n", ffd.cFileName); level++; process_directory(ffd.cFileName, level); } else { print_space(level); printf("|--"); filesize.LowPart = ffd.nFileSizeLow; filesize.HighPart = ffd.nFileSizeHigh; printf(" %s %ld bytes\n", ffd.cFileName, filesize.QuadPart); } } while (FindNextFile(hFind, &ffd) != 0); level--; dwError = GetLastError(); FindClose(hFind); return dwError; } int main(int argc, char *argv[]) { if (argc == 1) { printf("wrong run. use program &lt;path&gt;\n"); return 1; } int level = 0; process_directory(argv[1], level); return 0; }
Post #: 1
RE: CreateProcess() - 2011-04-08 22:29:51.366666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Куда вставить, с какой целью?

Сразу после:
int main(int argc, char *argv[]) {
Достаточно?
Post #: 2
RE: CreateProcess() - 2011-04-11 14:06:51.600000   
Sidjey

Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000

quote:

ORIGINAL: Sunzer

Куда вставить, с какой целью?

Сразу после:
int main(int argc, char *argv[]) {
Достаточно?


эмм.. нет не достаточно, я знаю прекрасно, что после int main() вставлять createprocess… я не знаю как реализовать этот createprocess в этой программе, чтобы работало все
Post #: 3
RE: CreateProcess() - 2011-04-11 18:10:29.696666   
Alianna

Сообщений: 1922
Оценки: 356
Присоединился: 2010-03-02 11:27:12.343333
Зачем тут вообще этот CreateProcess?
Post #: 4
RE: CreateProcess() - 2011-04-11 18:35:59.466666   
Sidjey

Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000

quote:

ORIGINAL: Alianna

Зачем тут вообще этот CreateProcess?


ну вот так преподаватель сказал
Post #: 5
RE: CreateProcess() - 2011-04-11 18:42:01.836666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Что должна запустить апи CreateProcess ?
Post #: 6
RE: CreateProcess() - 2011-04-11 18:49:09.520000   
Sidjey

Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000

quote:

ORIGINAL: Flint_ta

Что должна запустить апи CreateProcess ?


В общем задача такая:
Написать прогу реализующую рекурсивный обход дерева каталогов, с использованием канала (pipe)… для linux есть(но не совсем работает), а вот под винду либо createprocess нужен либо createpipe…
в проге должны использоваться
CreateProcess
FindFirstFile
FindNextFile
GetFileAttributes
Post #: 7
RE: CreateProcess() - 2011-04-12 16:29:35.450000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Если нужно писать под винду, то причём тут линукс?

Хорошая задача для лабы. Выкладывай сюда то, что уже написал и задавай конкретные вопросы, будем думать.
Post #: 8
RE: CreateProcess() - 2011-04-12 17:44:06.940000   
Sidjey

Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
#undef UNICODE #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; void print_space(int count) { for (int i=0; i&lt;=count; i++) printf(" "); } int process_directory(char *theDir, int& level) { WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; char szDir[MAX_PATH]; size_t length_of_arg; HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwError=0; strncpy_s(szDir, theDir, MAX_PATH); strncat_s(szDir, "\\*", MAX_PATH); // Find the first file in the directory. hFind = FindFirstFile(szDir, &ffd); if (INVALID_HANDLE_VALUE == hFind) return dwError; do { // пропускаем каталоги . и .. if ((strncmp(ffd.cFileName, ".", MAX_PATH) == 0) || (strncmp(ffd.cFileName, "..", MAX_PATH) == 0) ) { if (FindNextFile(hFind, &ffd) != 0) continue; else break; } if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { print_space(level); printf("+--"); printf(" %s &lt;DIR&gt;\n", ffd.cFileName); level++; process_directory(ffd.cFileName, level); } else { print_space(level); printf("|--"); filesize.LowPart = ffd.nFileSizeLow; filesize.HighPart = ffd.nFileSizeHigh; printf(" %s %ld bytes\n", ffd.cFileName, filesize.QuadPart); } } while (FindNextFile(hFind, &ffd) != 0); level--; dwError = GetLastError(); FindClose(hFind); return dwError; } int main(int argc, char *argv[]) { if (argc == 1) { printf("wrong run. use program &lt;path&gt;\n"); return 1; } int level = 0; process_directory(argv[1], level); return 0; }
ну у меня только один вопрос как затащить в этот код CreateProccess!
нужно сделать лабу для винды и линукса, вот такие вот пироги)
Post #: 9
RE: CreateProcess() - 2011-04-12 18:14:26.970000   
svjat32

Сообщений: 12
Оценки: -20
Присоединился: 2011-03-31 23:48:15.883333
Да, тяжело тебе будет)
Post #: 10
RE: CreateProcess() - 2011-04-12 18:45:17.493333   
Klofelin

Сообщений: 68
Оценки: 0
Присоединился: 2010-09-03 20:58:52.116666
Sidjey Вас уже несколько раз спросили, что должен делать этот процесс. Если вы сами не знаете, то мы то откуда можем знать? Если все равно что, лишь бы было, то вставьте код, который ниже в начало функции main(). Запустится "Блокнот", пару секунд любуемся и гасим.[sm=bo.gif]
STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); if (!CreateProcess(NULL, "Notepad.exe", 0, 0, FALSE, 0, 0, 0, &si, &pi)) return 0; Sleep(2000); TerminateProcess(pi.hProcess, 1); CloseHandle(pi.hThread); CloseHandle(pi.hProcess);
Post #: 11
RE: CreateProcess() - 2011-04-12 18:53:58.883333   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Похоже от тебя требуюется клиент-серверная реализация. С передачей данных через пайпы.

Цитирую:

Анонимные каналы создаются процессом сервером при помощи функции CreatePipe:

BOOL CreatePipe(
PHANDLE hReadPipe,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // описатель для чтения
PHANDLE hWritePipe,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // описатель для записи
LPSECURITY_ATTRIBUTES lpPipeAttributes,&nbsp; // атрибуты безопасности
DWORD nSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // размер канала
);&nbsp;&nbsp;
Функция CreatePipe возвращает два описателя (дескриптора) для чтения и записи в канал. После
создания канала необходимо передать клиентскому процессу эти дескрипторы (или один из них), что
обычно делается с помощью механизма наследования.&nbsp;
Для наследования описателя нужно, чтобы дочерний процесс создавался функцией CreateProcess с
флагом наследования TRUE. Предварительно нужно создать наследуемые описатели. Это можно,
например, сделать путем явной спецификации параметра bInheritHandle структуры
SECURITY_ATTRIBUTES при создании канала.&nbsp;

Другим способом является создание наследуемого дубликата имеющегося описателя при помощи
функции DuplicateHandle и последующая передача его создаваемому процессу через командную
строку или каким-либо иным образом.
Получив нужный описатель, клиентский процесс, так же как и сервер, может далее
взаимодействовать с каналом при помощи функций ReadFile и WriteFile. По окончании работы с
каналом оба процесса должны закрыть описатели при помощи функции CloseHandle.

Код тебе нужен кроссплатформенный, значит использовать win32 api напрямую нельзя. Тут нужен знаток Си.
Post #: 12
RE: CreateProcess() - 2011-04-12 19:03:11.113333   
Sidjey

Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
quote:

Похоже от тебя требуюется клиент-серверная реализация. С передачей данных через пайпы.


да именно это и надо… я нашел исходник на MSDN там клиент и сервер… вот теперь тогда помогите мне вставить в код
FindFirstFile
FindNextFile
GetFileAttributes
исходник http://msdn.microsoft.com/en-us/library/ms682499(v=VS.85).aspx
Post #: 13
RE: CreateProcess() - 2011-04-13 12:46:30.403333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Твоя проблема в том, что ты абсолютно не понимаешь, что делаешь. Ты нашёл (а не сам написал) исходник под линукс, получил "общее представление" и решил, что в 2 счёта это можно переделать под винду.

Гуглом пользоваться ты умеешь, это хорошо. Составь для себя алгоритм, напиши его и попробуй реализовать. Удели внимание моментам: 1) что должен делать каждый процесс, 2) как происходит отправка данных процессу о том, что ему нужно делать, 3) как процесс будет возвращать результат работы.

Сразу говорю, с наскока такое не напишешь.
Post #: 14
RE: CreateProcess() - 2011-04-13 13:07:14.236666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

Код тебе нужен кроссплатформенный, значит использовать win32 api напрямую нельзя. Тут нужен знаток Си.


Просто юзать дериктиву компиляции под linux и win, юзая пайпы там и там по их правилам
Post #: 15
RE: CreateProcess() - 2011-04-13 13:23:44.483333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Щя, подумаю что-нибудь…

З.Ы. да не нужен там кросс-платформенный код. Ему надо лабу под винду сделать, по пайпам и многопроцессности.
Post #: 16
RE: CreateProcess() - 2011-04-13 19:29:23.916666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Накидал на скорую руку на обеде. Не очень хорошо, не доделано чтение из пайпа, не проверял:

#include &lt;Windows.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;sstream&gt; #include &lt;map&gt; #include &lt;vector&gt; #define APP_MUTEX L"ThisIsSparta" // Forward declaration const std::wstring& appPath( void ); // Current app full path std::wstring extractPath( const std::wstring& fullName ); // Exctact folder path void RunServer( void ); // Server part void RunClient( const std::wstring& path ); // Client part HANDLE CreateChild( const std::wstring& path, HANDLE is, HANDLE os ); // Create child process void ProcessSearch( const std::wstring& root, const std::wstring& name, bool isFolder ); // Process current search result void SendPath( const std::wstring& path, bool isFolder ); // Send founded path to output void WaitForTasksComplete( void ); // Waiting for all processes to stop // Globals std::vector&lt; HANDLE &gt; gProcess; // Child processes // Implementation int wmain( int argc, wchar_t **argv ) { SetLastError( 0 ); HANDLE mutex = CreateMutex( NULL, TRUE, APP_MUTEX ); if ( mutex == NULL ) return 1; if ( GetLastError() != ERROR_ALREADY_EXISTS ) RunServer(); else { std::wstring path; if ( argc == 2 ) path = argv[1]; // Directory to process RunClient( path ); } ReleaseMutex( mutex ); CloseHandle( mutex ); return 0; } void RunServer( void ) { BOOL success; HANDLE iStream; HANDLE oStream; success = CreatePipe( &iStream, &oStream, NULL, 0 ); if ( !success ) return ; ProcessSearch( extractPath( appPath() ), L"", true ); WaitForTasksComplete(); // TODO: output } const std::wstring& appPath( void ) { static std::wstring gAppPath; if ( gAppPath.empty() ) { std::vector&lt; wchar_t &gt; path( MAX_PATH ); DWORD len = GetModuleFileName( NULL, &path[0], MAX_PATH ); if ( len &gt; MAX_PATH ) { path.resize( len ); GetModuleFileName( NULL, &path[0], len ); } gAppPath = std::wstring( path.begin(), path.end() ).c_str(); } return gAppPath; } std::wstring extractPath( const std::wstring& fullName ) { DWORD len = GetFullPathName( fullName.c_str(), 0, NULL, NULL ); std::vector&lt; wchar_t &gt; buf( len ); wchar_t *end; GetFullPathName( fullName.c_str(), len, &buf[0], &end ); buf.resize( end - &buf[0] - 1 ); return std::wstring( buf.begin(), buf.end() ).c_str(); } void WaitForTasksComplete( void ) { WaitForMultipleObjects( gProcess.size(), &gProcess[0], TRUE, INFINITE ); for ( size_t i = 0; i &lt; gProcess.size(); i++ ) CloseHandle( gProcess[i] ); } void ProcessFolders( const std::wstring& path ) { WIN32_FIND_DATA result = { 0 }; SetLastError( 0 ); HANDLE search = FindFirstFile( path.c_str(), &result ); if ( search == INVALID_HANDLE_VALUE || GetLastError() == ERROR_FILE_NOT_FOUND ) return ; ProcessSearch( path, result.cFileName, ( result.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY ); while( FindNextFile( search, &result ) ) ProcessSearch( path, result.cFileName, ( result.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY ); } void ProcessSearch( const std::wstring& root, const std::wstring& name, bool isFolder ) { if ( name == L"." || name == L".." ) return ; if ( isFolder ) { std::wostringstream path; path &lt;&lt; root &lt;&lt; L'\\' &lt;&lt; name; HANDLE process = CreateChild( path.str(), GetStdHandle( STD_INPUT_HANDLE ), GetStdHandle( STD_OUTPUT_HANDLE ) ); if ( process ) gProcess.push_back( process ); } SendPath( name, isFolder ); } void SendPath( const std::wstring& path, bool isFolder ) { std::wcout &lt;&lt; path &lt;&lt; std::endl; } HANDLE CreateChild( const std::wstring& path, HANDLE is, HANDLE os ) { STARTUPINFO si = { 0 }; PROCESS_INFORMATION pi = { 0 }; si.cb = sizeof( si ); si.hStdError = os; si.hStdOutput = os; si.hStdInput = is; BOOL success = CreateProcess( appPath().c_str(), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); if ( !success ) return NULL; CloseHandle( pi.hThread ); return pi.hProcess; } void RunClient( const std::wstring& path ) { ProcessFolders( path ); WaitForTasksComplete(); }
Post #: 17
RE: CreateProcess() - 2011-04-13 19:37:05.396666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
это ведь не будет работать на linux )
Post #: 18
RE: CreateProcess() - 2011-04-14 12:17:07.013333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
И???

Как говориться - читай тему сначала.
Post #: 19
RE: CreateProcess() - 2011-04-14 21:07:19.746666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
quote:

И???


Дождемся ответа ТС. Мне интересно как же звучало задание препода в оригинале )
Post #: 20
RE: CreateProcess() - 2011-04-15 13:15:30.820000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Я же говорю - читай тему сначала

quote:

ORIGINAL: Sidjey

В общем задача такая:
Написать прогу реализующую рекурсивный обход дерева каталогов, с использованием канала (pipe)… для linux есть(но не совсем работает), а вот под винду либо createprocess нужен либо createpipe…
в проге должны использоваться
CreateProcess
FindFirstFile
FindNextFile
GetFileAttributes

Post #: 21
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> CreateProcess()







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.