diff --git a/GameAnalyzer.cpp b/GameAnalyzer.cpp index eb43fa7..78bdfe3 100644 --- a/GameAnalyzer.cpp +++ b/GameAnalyzer.cpp @@ -1,42 +1,79 @@ // GameAnalyzer.cpp : Ce fichier contient la fonction 'main'. L'exécution du programme commence et se termine à cet endroit. // #include +#include +#include +#include +#include +#include #include #include -const bool affiche_process_handle = 0; -int main() +const bool affiche_process_handle = 1; +const bool affiche_pid = 1; +const bool affiche_image_filename = 1; + +std::string GetProcessName(const char* imageFileName) { - std::cout << "Hello World!\n"; - DWORD lpidProcess[99999], lpcbNeeded; + const char* processName = strrchr(imageFileName, '\\'); + return processName != nullptr ? processName + 1 : imageFileName; +} + +std::string ToLower(std::string text) +{ + std::transform(text.begin(), text.end(), text.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + return text; +} + +bool ContainsIgnoreCase(const std::string& text, const std::string& search) +{ + return ToLower(text).find(ToLower(search)) != std::string::npos; +} + +int main(int argc, char** argv) +{ + if (argc > 2) { + std::cout << "Usage: GameAnalyzer.exe " << std::endl; + return 1; + } + + bool filterByProcessName = argc == 2; + std::string processNameArgument = filterByProcessName ? argv[1] : ""; + std::ostringstream output; + DWORD lpidProcess[99999], lpcbNeeded; BOOL ret_enum_process = EnumProcesses(lpidProcess, sizeof(lpidProcess), &lpcbNeeded); - for (unsigned int i = 0; i < 99999; i++) { - HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, lpidProcess[i]); + if (ret_enum_process == FALSE) { + std::cout << "EnumProcesses failed." << std::endl; + return 1; + } + + DWORD processCount = lpcbNeeded / sizeof(DWORD); + for (DWORD i = 0; i < processCount; i++) { + HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, lpidProcess[i]); if (hProcess != NULL) { - std::cout << i << ": " << "pid: " << lpidProcess[i]; - if (affiche_process_handle == 1) - std::cout << "-->" << hProcess; - LPSTR lpImageFileName = new char[256]; - DWORD nSize = 256; - DWORD lenght_buffer = GetProcessImageFileNameA(hProcess, lpImageFileName, nSize); - if (lenght_buffer != 0) - std::cout << "--->" << lpImageFileName << std::endl; + char imageFileName[MAX_PATH] = {}; + DWORD lengthBuffer = MAX_PATH; + BOOL hasImageFileName = QueryFullProcessImageNameA(hProcess, 0, imageFileName, &lengthBuffer); + + if (hasImageFileName == TRUE + && affiche_image_filename == 1 + && (!filterByProcessName || ContainsIgnoreCase(GetProcessName(imageFileName), processNameArgument))) { + if (affiche_pid == 1) + output << "pid: " << lpidProcess[i]; + if (affiche_process_handle == 1) + output << "-->" << hProcess; + if (affiche_process_handle || affiche_pid) + output << "--->"; + output << imageFileName << std::endl; + } CloseHandle(hProcess); - delete[] lpImageFileName; } } + + std::cout << output.str(); } -// Exécuter le programme : Ctrl+F5 ou menu Déboguer > Exécuter sans débogage -// Déboguer le programme : F5 ou menu Déboguer > Démarrer le débogage - -// Astuces pour bien démarrer : -// 1. Utilisez la fenêtre Explorateur de solutions pour ajouter des fichiers et les gérer. -// 2. Utilisez la fenêtre Team Explorer pour vous connecter au contrôle de code source. -// 3. Utilisez la fenêtre Sortie pour voir la sortie de la génération et d'autres messages. -// 4. Utilisez la fenêtre Liste d'erreurs pour voir les erreurs. -// 5. Accédez à Projet > Ajouter un nouvel élément pour créer des fichiers de code, ou à Projet > Ajouter un élément existant pour ajouter des fichiers de code existants au projet. -// 6. Pour rouvrir ce projet plus tard, accédez à Fichier > Ouvrir > Projet et sélectionnez le fichier .sln.