/* * Process Hacker Online Checks - * main program * * Copyright (C) 2010-2011 wj32 * * This file is part of Process Hacker. * * Process Hacker is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Process Hacker is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Process Hacker. If not, see . */ #include #include "onlnchk.h" #include "resource.h" VOID NTAPI LoadCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ); VOID NTAPI ShowOptionsCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ); VOID NTAPI MenuItemCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ); VOID NTAPI ProcessMenuInitializingCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ); VOID NTAPI ModuleMenuInitializingCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ); PPH_PLUGIN PluginInstance; PH_CALLBACK_REGISTRATION PluginLoadCallbackRegistration; PH_CALLBACK_REGISTRATION PluginShowOptionsCallbackRegistration; PH_CALLBACK_REGISTRATION PluginMenuItemCallbackRegistration; PH_CALLBACK_REGISTRATION ProcessMenuInitializingCallbackRegistration; PH_CALLBACK_REGISTRATION ModuleMenuInitializingCallbackRegistration; LOGICAL DllMain( __in HINSTANCE Instance, __in ULONG Reason, __reserved PVOID Reserved ) { switch (Reason) { case DLL_PROCESS_ATTACH: { PPH_PLUGIN_INFORMATION info; PluginInstance = PhRegisterPlugin(L"ProcessHacker.OnlineChecks", Instance, &info); if (!PluginInstance) return FALSE; info->DisplayName = L"Online Checks"; info->Author = L"wj32"; info->Description = L"Allows files to be checked with online services."; info->HasOptions = FALSE; PhRegisterCallback( PhGetPluginCallback(PluginInstance, PluginCallbackLoad), LoadCallback, NULL, &PluginLoadCallbackRegistration ); PhRegisterCallback( PhGetPluginCallback(PluginInstance, PluginCallbackShowOptions), ShowOptionsCallback, NULL, &PluginShowOptionsCallbackRegistration ); PhRegisterCallback( PhGetPluginCallback(PluginInstance, PluginCallbackMenuItem), MenuItemCallback, NULL, &PluginMenuItemCallbackRegistration ); PhRegisterCallback( PhGetGeneralCallback(GeneralCallbackProcessMenuInitializing), ProcessMenuInitializingCallback, NULL, &ProcessMenuInitializingCallbackRegistration ); PhRegisterCallback( PhGetGeneralCallback(GeneralCallbackModuleMenuInitializing), ModuleMenuInitializingCallback, NULL, &ModuleMenuInitializingCallbackRegistration ); } break; } return TRUE; } VOID NTAPI LoadCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ) { // Nothing } VOID NTAPI ShowOptionsCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ) { // Nothing } VOID NTAPI MenuItemCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ) { PPH_PLUGIN_MENU_ITEM menuItem = Parameter; PPH_STRING fileName; switch (menuItem->Id) { case ID_SENDTO_SERVICE1: fileName = menuItem->Context; UploadToOnlineService(menuItem->OwnerWindow, fileName, UPLOAD_SERVICE_VIRUSTOTAL); break; case ID_SENDTO_SERVICE2: fileName = menuItem->Context; UploadToOnlineService(menuItem->OwnerWindow, fileName, UPLOAD_SERVICE_JOTTI); break; case ID_SENDTO_SERVICE3: fileName = menuItem->Context; UploadToOnlineService(menuItem->OwnerWindow, fileName, UPLOAD_SERVICE_CIMA); break; } } PPH_EMENU_ITEM CreateSendToMenu( __in PPH_EMENU_ITEM Parent, __in PWSTR InsertAfter, __in PPH_STRING FileName ) { PPH_EMENU_ITEM sendToMenu; PPH_EMENU_ITEM menuItem; ULONG insertIndex; // Create the Send To menu. sendToMenu = PhPluginCreateEMenuItem(PluginInstance, 0, 0, L"Send To", NULL); PhInsertEMenuItem(sendToMenu, PhPluginCreateEMenuItem(PluginInstance, 0, ID_SENDTO_SERVICE1, L"virustotal.com", FileName), -1); PhInsertEMenuItem(sendToMenu, PhPluginCreateEMenuItem(PluginInstance, 0, ID_SENDTO_SERVICE2, L"virusscan.jotti.org", FileName), -1); PhInsertEMenuItem(sendToMenu, PhPluginCreateEMenuItem(PluginInstance, 0, ID_SENDTO_SERVICE3, L"camas.comodo.com", FileName), -1); menuItem = PhFindEMenuItem(Parent, PH_EMENU_FIND_STARTSWITH, InsertAfter, 0); if (menuItem) insertIndex = PhIndexOfEMenuItem(Parent, menuItem); else insertIndex = -1; PhInsertEMenuItem(Parent, sendToMenu, insertIndex + 1); return sendToMenu; } VOID NTAPI ProcessMenuInitializingCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ) { PPH_PLUGIN_MENU_INFORMATION menuInfo = Parameter; PPH_PROCESS_ITEM processItem; PPH_EMENU_ITEM sendToMenu; if (menuInfo->u.Process.NumberOfProcesses == 1) processItem = menuInfo->u.Process.Processes[0]; else processItem = NULL; sendToMenu = CreateSendToMenu(menuInfo->Menu, L"Search Online", processItem ? processItem->FileName : NULL); // Only enable the Send To menu if there is exactly one process selected and it has a file name. if (!processItem || !processItem->FileName) { sendToMenu->Flags |= PH_EMENU_DISABLED; } } VOID NTAPI ModuleMenuInitializingCallback( __in_opt PVOID Parameter, __in_opt PVOID Context ) { PPH_PLUGIN_MENU_INFORMATION menuInfo = Parameter; PPH_MODULE_ITEM moduleItem; PPH_EMENU_ITEM sendToMenu; if (menuInfo->u.Module.NumberOfModules == 1) moduleItem = menuInfo->u.Module.Modules[0]; else moduleItem = NULL; sendToMenu = CreateSendToMenu(menuInfo->Menu, L"Search Online", moduleItem ? moduleItem->FileName : NULL); if (!moduleItem) { sendToMenu->Flags |= PH_EMENU_DISABLED; } }