Problema con CreateProcessW

di il
4 risposte

Problema con CreateProcessW

Salve a tutti, ho riscontrato un problema nell'esecuzione di questo codice:

HANDLE Start_Coyn() {
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi));
	TCHAR szPath[] = TEXT(".\\Process.exe");
	if (!CreateProcessW(szPath, NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
		printf("CreateProcess failed (%d).\n", GetLastError());
		return NULL;
	}
	
	CloseHandle(pi.hThread);
	if (pi.hProcess == NULL || pi.hProcess == INVALID_HANDLE_VALUE) {
		printf("Invalid process handle.\n");
		return NULL;
	}

	return pi.hProcess;
}

Errore:

Eccezione non gestita in 0x00007FFBCCCB00B7 (ntdll.dll) in Avvio_Process.exe: LIST_ENTRY danneggiato (rimozione doppia).

In riga:

if (!CreateProcessW(szPath, NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {

L'errore si verifica solo al secondo avvio del programma, al primo no.

windows 10 

visual studio 2019

Grazie mille in anticipo.

4 Risposte

  • Re: Problema con CreateProcessW

    Perché distruggi l'handle del thread primario?

    CloseHandle(pi.hThread);

    A che pro? Non è un modo di fare chiaro. Non c'è motivo “normale” per distruggere l'handle del thread primario del processo per il processo in esecuzione (anche perché il thread rimane in piedi ma non è gestibile e la cosa non mi piace…)

    E cosa fa Process.exe (o Avvio_Process.exe)? 

    Magari con la WriteProcessMemory cambia il codice del thread primario con altro codice non proprio lecito?

  • Re: Problema con CreateProcessW

    Allora, a me servirebbe una funzione che avviava un programma "che in questo caso è process.exe" e ritornava il proprio hProcess, invece chiudevo hThread solamente perché non mi serviva e perché non cambiava lo svolgimento del programma. Invece Avvio_Process.exe utilizza questa funzione specificata prima per avviare un certo numero di processi e alla fine del programma chiuderli tutti insieme con TerminateProcess, per fare ciò serviva appunto il valore di ritorno della funzione contenuto in un arrey

  • Re: Problema con CreateProcessW

    Non ho capito nulla della tua risposta, soprattutto nella parte finale (arrey? Semmai array ma di cosa parli?) e non mi hai chiarito “cosa” stai facendo, ovvero a cosa vuoi arrivare complessivamente con tutto l'accrocchio.

    Diciamo che questa

    CloseHandle(pi.hThread);

    la togli perché non serve.

    Per il resto, mi sembra che tutto il resto sia corretto e l'handle viene restituito.

    Il codice mi sembra a posto, quindi il problema sarà da qualche altra parte nel resto del tuo codice… (negli altri exe)

  • Re: Problema con CreateProcessW

    Avvio_Process.cpp o Avvio_Process.exe

    child Return_Coyn;
    COM::COM_S Com_Return_Coyn;
    HANDLE* Process;
    HANDLE* Thread;
    
    void Svuota_Cartella(const char* path) {
    	// Aggiunge \\* per selezionare tutti i file nella directory
    	std::string pathWithWildcard = std::string(path) + "\\*";
    
    	// Inizializza la struttura per la ricerca dei file nella directory
    	WIN32_FIND_DATAA fileData;
    	HANDLE hFind = FindFirstFileA(pathWithWildcard.c_str(), &fileData);
    
    	// Se non è stato trovato alcun file nella directory, termina il programma
    	if (hFind == INVALID_HANDLE_VALUE)
    	{
    		std::cout << "Errore nella ricerca dei file nella directory";
    	}
    
    	// Elimina ogni file nella directory finché ce ne sono
    	do
    	{
    		// Esclude la directory stessa e la directory padre
    		if (strcmp(fileData.cFileName, ".") != 0 && strcmp(fileData.cFileName, "..") != 0)
    		{
    			// Costruisce il percorso completo del file
    			std::string fullPath = std::string(path) + "\\" + fileData.cFileName;
    
    			// Elimina il file
    			if (DeleteFileA(fullPath.c_str()) == FALSE)
    			{
    				std::cout << "Errore nella cancellazione del file " << fullPath;
    			}
    		}
    	} while (FindNextFileA(hFind, &fileData) != FALSE);
    
    	// Chiude la ricerca dei file nella directory
    	FindClose(hFind);
    }
    
    bool IsDirectoryEmpty(const char* path) {
    	WIN32_FIND_DATAA data;
    	HANDLE h = FindFirstFileA((std::string(path) + "\\*").c_str(), &data);
    	if (h == INVALID_HANDLE_VALUE) {
    		return true; // directory non trovata o non accessibile
    	}
    	do {
    		if (strcmp(data.cFileName, ".") != 0 && strcmp(data.cFileName, "..") != 0) {
    			FindClose(h);
    			return false; // la directory contiene almeno un file diverso da "." e ".."
    		}
    	} while (FindNextFileA(h, &data));
    	FindClose(h);
    	return true; // la directory è vuota
    }
    /*
    int Start_Coyn() {
    	child Coyn(".\\Process.exe");
    	Sleep(50);
    	return (int)Coyn.id();
    }
    */
    
    HANDLE Start_Coyn() {
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	ZeroMemory(&si, sizeof(si));
    	si.cb = sizeof(si);
    	ZeroMemory(&pi, sizeof(pi));
    	TCHAR szPath[] = TEXT(".\\Process.exe");
    	if (!CreateProcessW(szPath, NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
    		printf("CreateProcess failed (%d).\n", GetLastError());
    		return NULL;
    	}
    	
    	CloseHandle(pi.hThread);
    	if (pi.hProcess == NULL || pi.hProcess == INVALID_HANDLE_VALUE) {
    		printf("Invalid process handle.\n");
    		return NULL;
    	}
    
    	return pi.hProcess;
    }
    
    const char* Create_Data_Per(char* Per, int N_Pro, const char* Est) {
    	char* Per_0 = new char[strlen(Per) + 1];
    	strcpy(Per_0, Per);
    
    	char* Per_1 = strcat(Per_0, (const char*)to_string(N_Pro).c_str());
    	char* Per_2 = strcat(Per_1, Est);
    	return Per_2;
    }
    
    int GetLastModifiedTime(const char* filename) {
    	struct stat fileInfo;
    	if (stat(filename, &fileInfo) != 0) {
    		cerr << "Error: Unable to get file information." << endl;
    		return -1;
    	}
    	return fileInfo.st_mtime;
    }
    
    void Start_Cicle_Coyn() {
    	if (DeleteFileA(".\\Data\\Data\\Start_Coyn_UNO.txt") == FALSE) {
    		cout << "ERRORE nella cancellazione del file";
    	}
    
    	FILE* Start_Coyn_DUE = fopen(".\\Data\\Data\\Start_Coyn_DUE.txt", "w");
    	fclose(Start_Coyn_DUE);
    
    	Sleep(1000);
    
    	if (DeleteFileA(".\\Data\\Data\\Start_Coyn_DUE.txt") == FALSE) {
    		cout << "ERRORE nella cancellazione del file";
    	}
    
    	FILE* Start_Coyn_UNO = fopen(".\\Data\\Data\\Start_Coyn_UNO.txt", "w");
    	fclose(Start_Coyn_UNO);
    }
    
    int GetFileSizeInKB(const char* filepath) {
    	WIN32_FILE_ATTRIBUTE_DATA fileInfo;
    	if (!GetFileAttributesExA(filepath, GetFileExInfoStandard, &fileInfo)) {
    		std::cerr << "Error: failed to get file attributes.\n";
    		return -1;
    	}
    
    	ULARGE_INTEGER size;
    	size.LowPart = fileInfo.nFileSizeLow;
    	size.HighPart = fileInfo.nFileSizeHigh;
    
    	return static_cast<int>(size.QuadPart);
    }
    
    bool Exit_Process(HANDLE Process, int Val_Di_Uscita) {
    	if (Process != 0) {
    		TerminateProcess(Process, Val_Di_Uscita);
    		CloseHandle(Process);
    		return true;
    	}
    	return false;
    }
    
    int N_Handle = 100;
    
    HANDLE* ERRORI;
    int N_ERRORI[2];
    void start_main() {
    	Process = new HANDLE[N_Handle];
    	N_ERRORI[0] = 0;
    
    	Com_Return_Coyn.Start(".\\Data\\Data\\Coyn.txt");
    
    	for (int i = 0; i <= N_Handle - 1; i++) {
    		bool Con_Us = false;
    
    		//Sleep(25);
    
    		Com_Return_Coyn.Message(to_string(i).c_str(), "w");
    
    		FILE* Create_Data = fopen(Create_Data_Per((char*)".\\Data\\Data\\Input\\", i, ".txt"), "w");
    		fclose(Create_Data);
    
    		//Sleep(25);
    
    		Process[i] = Start_Coyn();
    
    		for (int y = 0; y <= 20 - 1; y++) {
    			Sleep(1);
    			if (GetFileSizeInKB(Create_Data_Per((char*)".\\Data\\Data\\Input\\", i, ".txt")) != 0) {
    				Con_Us = true;
    				y = 20;
    			}
    		}
    
    		if (Con_Us) {
    			cout << "Avvio processo num: " << to_string(i).c_str() << endl;
    		}
    		else {
    			cout << "Avvio processo num: " << to_string(i).c_str() << " ERRORE" << endl;
    			ERRORI = new HANDLE;
    			ERRORI[N_ERRORI[0]] = Process[i];
    			N_ERRORI[N_ERRORI[0] + 1] = i;
    			N_ERRORI[0]++;
    		}
    	}
    
    	Sleep(1000);
    
    	if (N_ERRORI[0] != 0) {
    		for (int i = 0; i <= N_ERRORI[0] - 1; i++) {
    			bool ERROR_F = false;
    			bool Con_Us = false;
    
    			FILE* Create_Data = fopen(Create_Data_Per((char*)".\\Data\\Data\\Controllo\\", N_ERRORI[i + 1], "_C.txt"), "w");
    			fclose(Create_Data);
    
    			for (int y = 0; y <= 20 - 1; y++) {
    				Sleep(1);
    				if (GetFileSizeInKB(Create_Data_Per((char*)".\\Data\\Data\\Controllo\\", N_ERRORI[i + 1], "_C.txt")) != 0) {
    					ERROR_F = true;
    					y = 20;
    				}
    			}
    
    			if (!ERROR_F) {
    				Exit_Process(ERRORI[i], 1);
    				cout << "ERRORE nel processo num: " << N_ERRORI[i + 1] << ", Avvio sostituzione" << endl;
    				Process[N_ERRORI[i + 1]] = Start_Coyn();
    
    				for (int y = 0; y <= 20 - 1; y++) {
    					Sleep(1);
    					if (GetFileSizeInKB(Create_Data_Per((char*)".\\Data\\Data\\Input\\", N_ERRORI[i + 1], ".txt")) != 0) {
    						Con_Us = true;
    						y = 20;
    					}
    				}
    
    				if (Con_Us) {
    					cout << "Avvio processo num: " << to_string(N_ERRORI[i + 1]).c_str() << endl;
    				}
    				else {
    					cout << "Avvio processo num: " << to_string(N_ERRORI[i + 1]).c_str() << " ERRORE" << endl;
    				}
    			}
    			else {
    				cout << "ERRORE risolto ne processo num: " << N_ERRORI[i + 1] << endl;
    			}
    		}
    	}
    
    	FILE* Start_Coyn_ = fopen(".\\Data\\Data\\Start_Coyn.txt", "w");
    	fclose(Start_Coyn_);
    
    	cout << endl << endl;
    
    	FILE* File = fopen(".\\Data\\Data\\Start_Coyn_UNO.txt", "w");
    	fclose(File);
    
    	Start_Cicle_Coyn();
    
    	for (int p = 0; p <= N_Handle - 1; p++) {
    		Exit_Process(Process[p], 1);
    	}
    	
    	for (int p = 0; p <= N_Handle - 1; p++) {
    		cout << Process[p] << endl;
    	}
    
    	if (DeleteFileA(".\\Data\\Data\\Start_Coyn.txt") == FALSE) {
    		cout << "ERRORE nella cancellazione del file";
    	}
    
    	Svuota_Cartella(".\\Data\\Data\\Input");
    	Svuota_Cartella(".\\Data\\Data\\Controllo");
    	}

    Process.cpp o Process.exe

    bool Val_Start_One = false;
    bool Val_Start_One_Sic = true;
    bool Val_Start_One_Con = true;
    
    const char* Create_Data_Per(char* Per, int N_Pro, const char* Est) {
    	char* Per_0 = new char[strlen(Per) + 1];
    	strcpy(Per_0, Per);
    
    	char* Per_1 = strcat(Per_0, (const char*)to_string(N_Pro).c_str());
    	char* Per_2 = strcat(Per_1, Est);
    	return Per_2;
    }
    
    bool Start_One() {
    	if (Val_Start_One == true) {
    		Val_Start_One = false;
    		return false;
    	}
    	else {
    		try
    		{
    			if (PathFileExistsA(".\\Data\\Data\\Start_Coyn_DUE.txt")) {
    				Val_Start_One_Sic = true;
    			}
    
    			if (PathFileExistsA(".\\Data\\Data\\Start_Coyn_UNO.txt")) {
    				if (Val_Start_One_Sic == true) {
    					Val_Start_One_Sic = false;
    					Val_Start_One = true;
    					return true;
    				}
    			}
    		}
    		catch (const std::exception&)
    		{
    
    		}
    	}
    	
    }
    
    int main()
    {
    	COM::COM_C Connect;
    	Connect.Connect(".\\Data\\Data\\Coyn.txt");
    	int N_Pro = atoi(Connect.Read()[1]);
    	//cout << "Proces n. => " << ciao << endl;
    	while (true)
    	{
    		Sleep(10);
    		if (PathFileExistsA(Create_Data_Per((char*)".\\Data\\Data\\Controllo\\", N_Pro, "_C.txt"))) {
    			Sleep(10);
    			FILE* File = fopen(Create_Data_Per((char*)".\\Data\\Data\\Controllo\\", N_Pro, "_C.txt"), "w");
    			fprintf(File, (const char*)to_string(N_Pro).c_str());
    			fclose(File);
    		}
    		else {
    			if (Val_Start_One_Con == true) {
    				if (PathFileExistsA(Create_Data_Per((char*)".\\Data\\Data\\Input\\", N_Pro, ".txt"))) {
    					FILE* File = fopen(Create_Data_Per((char*)".\\Data\\Data\\Input\\", N_Pro, ".txt"), "w");
    					fprintf(File, (const char*)to_string(N_Pro).c_str());
    					fclose(File);
    					Val_Start_One_Con = false;
    				}
    			}
    			else {
    				if (PathFileExistsA(".\\Data\\Data\\Start_Coyn.txt")) {
    					if (Start_One()) {
    					
    					
    
    						cout << "Proces n. => " << N_Pro << endl;
    					}
    				}
    			}
    		}
    	}
    }
Devi accedere o registrarti per scrivere nel forum
4 risposte