Полезные исходники для Windows

Всё, что касается программирования на старых языках или для старых систем

Re: Полезные исходники для Windows

Сообщение oldpcfan82 » 14 ноя 2023, 17:33

Пока болел ковидом, запрограммировал часы под Windows 3.1 и выше на Visual Basic 4.0, кому надо вот исходники:
Код: Выделить всё
Private Declare Sub SetWindowPos Lib "User" (ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer)
Private Const HWND_TOPMOST = -1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1

'Отображает текущую дату и время
Private Sub Refresh_Time()
  Me.Label1.Caption = Format(Now, "HH:mm:ss") 'Отобразить текущее время
  Me.Caption = "Часы " & Format(Now, "dd.mm.yyyy") 'Отобразить текущую дату
End Sub

Private Sub Form_Load()
  SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE 'Поверх всех окон
  Refresh_Time ' Запуск первый раз, чтобы отобразить текущую дату и текущее время
  Me.Timer1.Interval = 1000 'Таймер срабатывает 1 раз в 1 секунду
  Me.Timer1.Enabled = True 'Таймер активирован
End Sub

Private Sub Timer1_Timer()
  Refresh_Time 'чтобы отобразить текущую дату и текущее время
End Sub


Так выглядет форма в Visual Basic 4.0:https://i.ibb.co/ZH0PB5x/clock-vb-13-09-21-10-2023-min.jpg
А это результат работы программы в Windows 3.1 https://i.ibb.co/b28dFQj/clock-execute-13-00-21-10-2023-2-min.jpg
Аватара пользователя
oldpcfan82
Мастер Даунгрейда
 
Сообщения: 155
Зарегистрирован: 01 окт 2023, 22:57

Re: Полезные исходники для Windows

Сообщение ctv » 30 дек 2023, 23:40

longhorn_gnu писал(а):
rvg писал(а):Вообще у меня такая идея появилась (с тех пор когда я увидел вашу любовь
к БАТ-файлам). Так думаю. Сейчас накатаю простенькую программу на Си
и на Асме. Смысл програмvы будет следующей. Вы пишет обычный БАТ.
Собираете программу и происходит запуск вашего БАТ. Годится?

Такая программа была бы полезна не только мне, но и другим пользователям BAT. С древних времён, мы с Семенцулом пользовались корявыми конвертерами типа этих: http://old-dos.ru/index.php?page=files& ... ow&id=7740 и https://bat-to-exe-converter-x64.en.softonic.com/ . Они очень сильно срут в системе как и у создателя батников, так и у пользователя. Я давно пытался найти нормальный конвертер. Всё без толку. А ваша программа должна решить эту проблему.


Я уже когда-то написал такую программку:
Код: Выделить всё

// RPTEC.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
    std::string cmd = "YOUBAT.BAT ";

    if(argc > 0)
    {
        for( int i = 1; i < argc; ++i )
        {
            cmd += argv[i];
            cmd += " ";
        }
    }

    system(cmd.c_str());
    return 0;
}

MS-DOS 6.22 FOR WINDOWS https://мс-дос.рф
MS-DOS BOOT FROM USB https://мс-дос.рф/MSDBFU/
Эмулятор Windows 3.11 https://мс-дос.рф/emuwin3x.php
Аватара пользователя
ctv
Мастер Даунгрейда
 
Сообщения: 371
Зарегистрирован: 20 июл 2018, 14:31
Откуда: Россия, Владимировская обл, Вязниковский район, д.эдон.
Железо: Pentium3

Подключение по-протоколу PPTp

Сообщение rvg » 18 мар 2024, 09:33

Программа создаст сетевое подключение по-протоколу PPTp.
(Это то что сейчас распротстраняется как средство для обхода ограничений, однако на самом деле всё намного прпоще и эффективнее! Адреса бесплатных серверов в сети навалом. Некоторые дублируют оригинальные, но есть и собственные. Также, некоторые поддерживают UDP-протокол т.е. забаненые игроки - могут продолжить читерить.)
Данные для подключения по умолчанию:
Имя пользователя: Guest
Паpoлb: Passwd
Компьютер к которому подключаться: 127.0.0.1
После создания откроет папку сетевых подключений.
ВНИМАНИЕ:
* Для сборки программы с помощью VC 6.0 нужен SDK Microsoft или версия Visual Srudio выше 6.0.
Я не могу сказать точно - как назывался пакет разработчика (для поддержки RAS в VC 6.0). Мой скачен давно, сам каталог выдран и переименован в нечто иное, что было - никаких опозновательных знаков, хотя можно было в файлах посмотреть - так смотрел, нет такого). Думаю, нужно задать такой поиск "microsoft sdk windows xp download" или вместо xp - 2000.
** Проект настроен на расположение SDK по-пути: F:\Devel\PSdk
- Вам, изменить на ваш.
 Развернуть: CPPTp.cpp
Код: Выделить всё
// CPPTp.cpp

#pragma comment(lib,"rasapi32.lib")
#include <windows.h>
#include <ras.h>
#define   _WIN32_WINNT_WIN7 0x0601
#if (_WIN32_WINNT_WIN7 >=0x601)
#define   VS_Ikev2Only    7
#define   RASEO2_RequireMachineCertificates   0x400000
#endif
#ifndef   RASNP_Ipv6
#define   RASNP_Ipv6   8
#endif

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
   DWORD dwRet, dwSize;
   RasGetEntryProperties(NULL,NULL,NULL,&dwSize,NULL,NULL);
   LPRASENTRY pras=(LPRASENTRY)malloc(dwSize);
   memset(pras,0,dwSize);
   pras->dwSize=dwSize;
   pras->dwType=RASET_Vpn;
   pras->dwRedialCount=1;
   pras->dwRedialPause=5;
   pras->dwfNetProtocols=RASNP_Ip;
   pras->dwfNetProtocols |=RASNP_Ipv6;
   BOOL bStrong=FALSE;
   if(bStrong)
      pras->dwEncryptionType=ET_Optional;
   else
      pras->dwEncryptionType=ET_RequireMax; /* Strong - HTTPS */

   lstrcpy(pras->szLocalPhoneNumber,"127.0.0.1");
   lstrcpy(pras->szDeviceType,RASDT_Vpn);
   pras->dwfOptions=RASEO_PreviewUserPw |
   RASEO_PreviewDomain |
   RASEO_ShowDialingProgress |
   RASEO_RemoteDefaultGateway;
   pras->dwfOptions|=RASEO_RequireEncryptedPw;
   pras->dwVpnStrategy=VS_Default;
   char* svConnectName="PPTp - Connection";
   dwRet=RasSetEntryProperties(NULL,svConnectName,pras,pras->dwSize,NULL,0);
   if(dwRet) {
      MessageBox(GetActiveWindow(),"Failed RasSetEntryProperties","Create CPPTp",MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_SYSTEMMODAL);
      return dwRet;
   }
   RASCREDENTIALS ras_cre={0};
   ras_cre.dwSize=sizeof(ras_cre);
   ras_cre.dwMask=RASCM_UserName | RASCM_Password;
   lstrcpy(ras_cre.szUserName,"Guest");
   lstrcpy(ras_cre.szPassword,"Passwd");
   dwRet=RasSetCredentials(NULL,svConnectName,&ras_cre,FALSE);
   free(pras);
   if(dwRet) {
      MessageBox(GetActiveWindow(),"Failed RasSetCredentials","Create PPTp",MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_SYSTEMMODAL);
      return dwRet;
   }
   char svDir[MAX_PATH];
   GetSystemDirectory(svDir,MAX_PATH);
   SHELLEXECUTEINFO ShExecInfo={0};
   ShExecInfo.cbSize=sizeof(ShExecInfo);
   ShExecInfo.fMask=NULL;
   ShExecInfo.hwnd=NULL;
   ShExecInfo.lpVerb=NULL;
   ShExecInfo.lpFile="ncpa.cpl";
   ShExecInfo.lpParameters=NULL;
   ShExecInfo.lpDirectory=svDir;
   ShExecInfo.nShow=SW_NORMAL;
   ShExecInfo.hInstApp=NULL;
   return ShellExecuteEx(&ShExecInfo);
}
Вложения
CPPTp.zip
(11.41 Кб) Скачиваний: 25
CPPTp.png
CPPTp.png (50.43 Кб) Просмотров: 800
CPPTp- Property.png
CPPTp- Property.png (12.41 Кб) Просмотров: 800
Последний раз редактировалось rvg 18 мар 2024, 14:28, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 457
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение EgorKuzevanov » 25 мар 2024, 10:33

Borland Delphi 7 на файлообменнике DowngradeFiles:
http://downgradefiles.pdp-11.ru/downloa ... 9a47f11be7

Три набора компонентов для Borland Delphi 7 на файлообменнике DowngradeFiles (корректно устанавливаются только под Windows 2000 и выше):
- JEDI VCL (JVCL):
http://downgradefiles.pdp-11.ru/downloa ... 4492a61b96
- TMS Component Pack v6.2.1.0 (2011):
http://downgradefiles.pdp-11.ru/downloa ... d83acb599e
- DSPack:
http://downgradefiles.pdp-11.ru/downloa ... f7672b8979
Последний раз редактировалось EgorKuzevanov 25 мар 2024, 10:34, всего редактировалось 1 раз.
EgorKuzevanov
Матерый даунгрейдер
 
Сообщения: 90
Зарегистрирован: 24 дек 2023, 05:31
Откуда: Инской (Кемеровская область)
Железо: Виртуальная машина VMware Workstation v15.5.7 (2020 года) под хостом с Windows 10 LTSB 2016 (x64)

ProcWatcher - удаляет поток в процессе

Сообщение rvg » 08 апр 2024, 10:32

Всем привет.
Наверное - это последняя программа в моей практике, т.к. компьютер мне надоел (использую лишь как средство развлечения (писательство, больше - не планируется (хотя, как говорят - никогда не говори никогда :P ))
Программа спецефична (на любителя). Что она делает? Прочёсывает список процессов ОС на предмет обнаружения описанных в текстовом файле, если модуль обнаружен - плавно уничтожается. Как именно выбрать - вам, где смотреть и чем - воспользуйтесь программой от Mark Russinovich (Process Explorer), в разделе Thread (потоки), выберете, запишите в файл.
Программа собирается с помощью VC 6.0 (Borland - нет).
 Развернуть: ProcWatcher.cpp
Код: Выделить всё
/* ProcWatcher.cpp

Удаляет поток в процессе. Для работы программы:
- создать файл "KillThread.txt". Указать модули которые
нужно закрыть, например:
Cscdll
Mswsock
Wdmaud
Winmm
Rpcrt4
Sfc_os
Userenv
*/

#include <windows.h> /* Определение функций-прототипов, структур-переменных ОС Windows. */
#include <commctrl.h> /* Определение функций, структур-переменных ОС Windows,
для работы с контролями управления т.к. статус-прогресс-бары (индикатор), окна и всё связанное. */
#include <stdio.h> /* Определение функций стандартной библиотеки С. */
#include "ProcWatcher.h" /* Собственный файл, находится в текущей директории.
В нём определены функции, структуры-переменные. */

CWork* GWork; /* Класс, где происходит работа. */
UINT g_nTimerWork; /* Переменная (четыре байта) идентификатор таймера. */
char GAppname[MAX_PATH]; /* Переменная для имени приложения. Сам текст загружается
в момент инициализации (запуска) программы. Длинна определена в константе MAX_PATH - это
определение находится в заголовочном файле windows.h (кажется? 256) */

/* OpenThread функция прототип т.е. нужна для подсказки компилятору. */
typedef HANDLE (WINAPI* OPENTHREAD)(DWORD,BOOL,DWORD);
OPENTHREAD OpenThread; /* Непосредственное место где будет находится адрес функции
после загрузки-определения в работе ОС. */

BOOL MatchAddressToModule(DWORD dwProcessId,
   char* svExePath,
   DWORD dwThreadStartAddr,
   PDWORD pModuleStartAddr) {
   HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPALL,dwProcessId);
   if(INVALID_HANDLE_VALUE==hSnapshot)
      return FALSE;

   MODULEENTRY32 me32;
   me32.dwSize=sizeof(MODULEENTRY32);
   me32.th32ModuleID=1;
   /* Retrieve information about the first module, and exit if unsuccessful. */
   if(!Module32First(hSnapshot,&me32)) {
      CloseHandle(hSnapshot); /* Clean the snapshot object. */
      return FALSE;
   }
   /* Now walk the module list of the process, and display information about each module. */
   do {
      if(me32.th32ProcessID==dwProcessId) {
         if(dwThreadStartAddr>=(DWORD)me32.modBaseAddr && dwThreadStartAddr<=((DWORD)me32.modBaseAddr + me32.modBaseSize))
         {
            lstrcpy(svExePath,me32.szExePath);
            break;
         }

      } /* End "if(me32.th32ProcessID==dwProcessId)" */
   } while(Module32Next(hSnapshot,&me32));
   CloseHandle(hSnapshot);

   if(pModuleStartAddr)
      *pModuleStartAddr=(DWORD)me32.modBaseAddr;
   return TRUE;
}

DWORD WINAPI GetThreadStartAddress(HANDLE hThread) {
   /* NtQueryInformationThread loading functions. */
   typedef NTSTATUS (NTAPI* NTQUERYINFORMATIONTHREAD)(HANDLE,THREADINFOCLASS,PVOID,ULONG,PULONG);
   static NTQUERYINFORMATIONTHREAD NtQueryInformationThread=(NTQUERYINFORMATIONTHREAD)GetProcAddress(LoadLibrary(TEXT("ntdll.dll")),"NtQueryInformationThread");
   if(!NtQueryInformationThread) mb("Failed GetProcAddress");
   HANDLE hNewThreadHandle;
   DWORD dwThreadStartAddr=0;
   HANDLE hProcess=GetCurrentProcess();
   if(hProcess) {
      if(DuplicateHandle(hProcess,hThread,hProcess,&hNewThreadHandle,THREAD_QUERY_INFORMATION,FALSE,0))
      {
         NTSTATUS Status=NtQueryInformationThread(hNewThreadHandle,ThreadQuerySetWin32StartAddress,&dwThreadStartAddr,sizeof(DWORD),NULL);
         CloseHandle(hNewThreadHandle);
         if(Status!=STATUS_SUCCESS)
            return 0;
      }
   }
   return dwThreadStartAddr;
}

BOOL SetPrivilege(HANDLE hTokenHandle, /* Token handle. */
   char* svPrivilege, /* svPrivilege to enable/disable. */
   BOOL bEnablePrivilege /* TRUE to enable. FALSE to disable. */
   )
{
   TOKEN_PRIVILEGES tp;
   LUID luid;
   TOKEN_PRIVILEGES NewState;
   DWORD BufferLength=sizeof(TOKEN_PRIVILEGES);
   if(LookupPrivilegeValue(NULL,svPrivilege,&luid)) {
      /* First pass. Get current privilege setting. */
      tp.PrivilegeCount=1;
      tp.Privileges[0].Luid=luid;
      tp.Privileges[0].Attributes=0;
      AdjustTokenPrivileges(hTokenHandle,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),&NewState,&BufferLength);
      if(ERROR_SUCCESS==GetLastError()) {
         /* Second pass. Set privilege based on previous setting. */
         NewState.PrivilegeCount=1;
         NewState.Privileges[0].Luid=luid;
         if(bEnablePrivilege)
            NewState.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
         else
            NewState.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED & NewState.Privileges[0].Attributes);
         AdjustTokenPrivileges(hTokenHandle,FALSE,&NewState,BufferLength,NULL,NULL);
         if(ERROR_SUCCESS==GetLastError())
            return TRUE;
      }
   }
   return FALSE;
}

BOOL KillThread(DWORD dwThreadId) {
   /* NtOpenThread loading function. */
   typedef NTSTATUS (NTAPI* NTOPENTHREAD)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PCLIENT_ID);
   static NTOPENTHREAD NtOpenThread=(NTOPENTHREAD)GetProcAddress(LoadLibrary(TEXT("ntdll.dll")),"NtOpenThread");
   if(!NtOpenThread) mb("Failed GetProcAddress");
   /* NtTerminateThread loading function. */
   typedef NTSTATUS (NTAPI* NTTERMINATETHREAD)(HANDLE,NTSTATUS);
   static NTTERMINATETHREAD NtTerminateThread=(NTTERMINATETHREAD)GetProcAddress(LoadLibrary(TEXT("ntdll.dll")),"NtTerminateThread");
   if(!NtTerminateThread) mb("Failed GetProcAddress");
   /* NtClose loading function. */
   typedef NTSTATUS (NTAPI* NTCLOSE)(HANDLE);
   static NTCLOSE NtClose=(NTCLOSE)GetProcAddress(LoadLibrary(TEXT("ntdll.dll")),"NtClose");
   if(!NtClose) mb("Failed GetProcAddress");

   HANDLE hThread=NULL;
   int DesiredAccess=3;
   OBJECT_ATTRIBUTES ObjectAttributes;
   memset(&ObjectAttributes,0,sizeof(OBJECT_ATTRIBUTES));
   CLIENT_ID cid;
   cid.UniqueProcess=0;
   cid.UniqueThread=(HANDLE)dwThreadId;
   NTSTATUS Status=NtOpenThread(&hThread,DesiredAccess,&ObjectAttributes,&cid);
   if(STATUS_SUCCESS==Status) {
      Status=NtTerminateThread(hThread,0);
      NtClose(hThread);
   }
   else
      Status=0;
   return Status ? 0:1;
}

char* StampTime() {
   static char svTime[128];
   GetTimeFormat(LOCALE_SYSTEM_DEFAULT,TIME_FORCE24HOURFORMAT,NULL,"hh':'mm",svTime,128);
   return svTime;
}

void CWork::OnRun() {
   char svBuff[512];
   char svExeFile[MAX_PATH];
   char svExePath[MAX_PATH];
   char svFname[MAX_PATH];
   FILE* File;
   THREADENTRY32 te32;
   HANDLE hSnapThread, hThread, hTokenHandle;
   DWORD dwModuleBaseAddr, dwThreadStartAddr;
   BOOL bRet;

   wsprintf(svFname,"%sKillThread.txt",appBaseDir());
   if(!OpenThread) {
      OpenThread=(OPENTHREAD)GetProcAddress(LoadLibrary(TEXT("kernel32.dll")),"OpenThread");
      if(!OpenThread) mb("Failed GetProcAddress");
   }

   HANDLE hSnapProc=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   if(INVALID_HANDLE_VALUE==hSnapProc) {
      wsprintf(svBuff,"%s Failed \"CreateToolhelp32Snapshot\".\r\n",StampTime());
      SendMsg(svBuff);
      return;
   }

   PROCESSENTRY32 pe32;
   pe32.dwSize=sizeof(PROCESSENTRY32);
   if(!Process32First(hSnapProc,&pe32)) {
      CloseHandle(hSnapProc);
      wsprintf(svBuff,"%s Failed \"Process32First\".\r\n",StampTime());
      SendMsg(svBuff);
      return;
   }

   while(Process32Next(hSnapProc,&pe32)) {
      lstrcpy(svExeFile,pe32.szExeFile);
      strlwr(svExeFile);

      if(
         !strstr(svExeFile,"audiodg") &&
         !strstr(svExeFile,"system") &&
         !strstr(svExeFile,"smss") &&
         !strstr(svExeFile,"csrss") &&
         !strstr(svExeFile,"lsass") &&
         !strstr(svExeFile,"svchost") &&
         !strstr(svExeFile,"services")
         )
      {
         *svExePath=0;
         hSnapThread=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pe32.th32ProcessID);
         if(INVALID_HANDLE_VALUE==hSnapThread) {
            CloseHandle(hSnapProc);
            wsprintf(svBuff,"%s Failed \"CreateToolhelp32Snapshot\".\r\n",StampTime());
            SendMsg(svBuff);
            return;
         }

         te32.dwSize=sizeof(THREADENTRY32);
         te32.cntUsage=0;
         if(!Thread32First(hSnapThread,&te32)) {
            CloseHandle(hSnapThread);
            wsprintf(svBuff,"%s Failed \"Thread32First\".\r\n",StampTime());
            SendMsg(svBuff);
            return;
         }

         /* Start Listing thread. */

         do {
            if(te32.th32OwnerProcessID==pe32.th32ProcessID) {

               /* Set priveleg. */
               if(!OpenThreadToken(GetCurrentThread(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,FALSE,&hTokenHandle))
               {
                  if(ERROR_NO_TOKEN==GetLastError())
                  {
                     if(!ImpersonateSelf(SecurityImpersonation))
                     {
                        wsprintf(svBuff,"%s Failed \"OpenThreadToken\" #2.\r\n",StampTime());
                        //SendMsg(svBuff);
                     }
                     if(!OpenThreadToken(GetCurrentThread(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,FALSE,&hTokenHandle))
                     {
                        wsprintf(svBuff,"%s Failed \"OpenThreadToken\" #3.\r\n",StampTime());
                        //SendMsg(svBuff);
                     }
                  }
                  else
                  {
                     wsprintf(svBuff,"%s Failed \"OpenThreadToken\".\r\n",StampTime());
                     //SendMsg(svBuff);
                  }
               }
               if(!SetPrivilege(hTokenHandle,SE_DEBUG_NAME,TRUE))
               {
                  CloseHandle(hTokenHandle);
                  wsprintf(svBuff,"%s Failed set DEBUG MODE \"%s\" (Error code %d).\r\n",svExeFile,GetLastError());
                  SendMsg(svBuff);
               }

               hThread=OpenThread(THREAD_QUERY_INFORMATION,FALSE,te32.th32ThreadID);
               if(hThread)
               {
                  dwThreadStartAddr=GetThreadStartAddress(hThread);
                  if(dwThreadStartAddr) {                  
                     bRet=MatchAddressToModule(pe32.th32ProcessID,svExePath,dwThreadStartAddr,&dwModuleBaseAddr);
                     //wsprintf(svBuff,"[+] %s+0x%08X\r\n",svExePath,dwThreadStartAddr - dwModuleBaseAddr);
                     CloseHandle(hThread);
                     if(bRet) {                     
                        /* Open "KillThread.txt" */
                        File=fopen(svFname,"rb");
                        if(File) {
                           while(fgets(svBuff,sizeof(svBuff),File)) {
                              if(
                                 ' '!=svBuff[0] &&
                                 '\t'!=svBuff[0] &&
                                 ';'!=svBuff[0] &&
                                 '/'!=svBuff[0]) {
                                 if(strchr(svBuff,' '))
                                    *strchr(svBuff,' ')=0;
                                 if(strchr(svBuff,'\r'))
                                    *strchr(svBuff,'\r')=0;
                                 if(strchr(svBuff,'\n'))
                                    *strchr(svBuff,'\n')=0;
                                 if(svBuff[0]) {                                    
                                    strlwr(svBuff);
                                    strlwr(svExePath);
                                    if(strstr(svExePath,svBuff)) {
                                       //wsprintf(svBuff,"%s ===[ \"%s\" ]===\r\n",StampTime(),svExeFile);
                                       //SendMsg(svBuff);

                                       if(KillThread(te32.th32ThreadID)) {
                                          wsprintf(svBuff,"%s \"%s\" [Kill!] %s+0x%08X\r\n",StampTime(),svExeFile,svExePath,dwThreadStartAddr - dwModuleBaseAddr);
                                          SendMsg(svBuff);
                                       } else {
                                          wsprintf(svBuff,"%s Failed Kill %s+0x%08X\r\n",StampTime(),svExePath,dwThreadStartAddr - dwModuleBaseAddr);
                                          SendMsg(svBuff);
                                       }
                                    } /* End "if(strstr(svExePath,svBuff))" */
                                 } /* End "if(svBuff[0])" */
                              } /* End "if(';')" */
                           } /* End "while" */
                           fclose(File);
                        } /* End "if(File)" */
                        else
                        {
                           wsprintf(svBuff,"%s Failed open \"%s\"\r\n",StampTime(),svFname);
                           SendMsg(svBuff);
                        }
                     } /* End "if(bRet)" */
                  } /* End "if(dwThreadStartAddr)" */
               } /* End "if(hThread)" */
               else
               {
                  wsprintf(svBuff,"%s Failed OpenThread \"%s\"\r\n",StampTime(),svExeFile);
                  //SendMsg(svBuff);
               }
            } /* End "if(te32.th32OwnerProcessID==pe32.th32ProcessID)" */
         } while(Thread32Next(hSnapThread,&te32));
         CloseHandle(hSnapThread);
      } /* End "if(!strstr(svExeFile,"system")" */
   } /* End "while" */
   CloseHandle(hSnapProc);
}

CWork::CWork(HWND hWnd) {
   *m_svError=0;
   ThreadId=1;
   m_hWnd=hWnd;
   HANDLE hThread=CreateThread(NULL,0,WorkThreadEntry,this,0,&ThreadId);
   if(!hThread)
      lstrcpy(m_svError,"Failed create thread.\nYour system may be misbehaving.");
   else
      CloseHandle(hThread);
}

DWORD __stdcall WorkThreadEntry(void* Arg) {
   CWork* arg=(CWork*)Arg;
   HWND hWnd=arg->m_hWnd;
   arg->OnRun();
   PostMessage(hWnd,WM_WORK_DONE,0,0);
   arg->ThreadId=0;
   return arg->ThreadId;
}

void OnTimer(HWND hWnd, WPARAM wParam) {
   if(TIMER_WORK==wParam) {
      if(g_nTimerWork) {
         KillTimer(hWnd,g_nTimerWork);
         g_nTimerWork=NULL;
         GWork=new CWork(hWnd);
         char* svError=GWork->GetError();
         if(svError) mb(svError);
      }
   } /* End "if(TIMER_WORK==wParam)" */
}

void PopupMenu(HWND hWnd) {
   HMENU Menu=CreatePopupMenu();
   if(Menu) {
      if(IsWindowVisible(hWnd))
      InsertMenu(Menu,-1,MF_BYPOSITION,IDM_HIDE,"Hide");
      else
      InsertMenu(Menu,-1,MF_BYPOSITION,IDM_SHOW,"Show");
      InsertMenu(Menu,-1,MF_SEPARATOR,-1,NULL);
      InsertMenu(Menu,-1,MF_BYPOSITION,IDC_EXIT,"Exit");
      SetForegroundWindow(hWnd);
      POINT pt;
      GetCursorPos(&pt);
      TrackPopupMenu(Menu,TPM_BOTTOMALIGN,pt.x,pt.y,0,hWnd,NULL);
      DestroyMenu(Menu);
   }
}

BOOL TrayMessage(HWND hWnd, DWORD dwMessage, UINT uID, HICON hIcon, char* svTip) {
   NOTIFYICONDATA tnd;
   tnd.cbSize=sizeof(NOTIFYICONDATA);
   tnd.uID=uID;
   tnd.hWnd=hWnd;
   tnd.hIcon=hIcon;
   tnd.uFlags=NIF_TIP | NIF_ICON | NIF_MESSAGE;
   tnd.uCallbackMessage=WM_TRAYNOTIFY;
   if(*svTip) lstrcpy(tnd.szTip,svTip);
   else
   tnd.szTip[0]=0;
   return Shell_NotifyIcon(dwMessage,&tnd);
}

LRESULT OnTraynotify(HWND hWnd, LPARAM lParam) {
   switch(lParam) {
      case WM_LBUTTONDBLCLK:
      if(IsWindowVisible(hWnd)) {
         ShowWindow(hWnd,SW_HIDE);
      } else {
         ShowWindow(hWnd,SW_RESTORE);
         HICON hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MAINFRAME));
         if(!hIcon)
            hIcon=LoadIcon(GetModuleHandle(NULL),IDI_APPLICATION);
         if(hIcon)
            TrayMessage(hWnd,NIM_MODIFY,ID_TRAY,hIcon,GAppname);
      }
      break; /* End "case WM_LBUTTONDBLCLK" */
      case WM_RBUTTONDOWN:
      PopupMenu(hWnd);
   } /* End "switch(lParam)" */
   return TRUE;
}

LRESULT CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   LRESULT retval=0;
   WNDPROC Wndproc=(WNDPROC)GetWindowLong(hWnd,GWL_USERDATA);
   if(Wndproc) {
      switch(uMsg) {
      case WM_NCDESTROY:
      SetWindowLong(hWnd,GWL_WNDPROC,(LONG)Wndproc);
      SetWindowLong(hWnd,GWL_USERDATA,0);
      break;
      case WM_KEYDOWN:
      return TRUE;
      case WM_GETDLGCODE:
      retval=CallWindowProc(Wndproc,hWnd,uMsg,wParam,lParam);
      retval &= ~(DLGC_HASSETSEL |DLGC_WANTTAB);
      if(lParam && WM_KEYDOWN==((LPMSG)lParam)->message && VK_TAB==((LPMSG)lParam)->wParam)retval &= ~DLGC_WANTMESSAGE;
      return retval;
      } /* End "switch(uMsg)" */
      return CallWindowProc(Wndproc,hWnd,uMsg,wParam,lParam);
   }
   return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

void OnWindowPosChanging(WINDOWPOS FAR* lpwp) {
   /* Deferring 3 controls. */
   HDWP hDWP=BeginDeferWindowPos(3);
   if(!hDWP) return;
   RECT rect;
   GetClientRect(lpwp->hwnd,&rect);
   /* Button Exit. */
   int x=(rect.right-105);
   int y=5;
   int nWidth=(rect.right-9);
   int nHeight=(rect.bottom/3);
   hDWP=DeferWindowPos(hDWP,GetDlgItem(lpwp->hwnd,IDC_EXIT),NULL,
   x, y, 100, 28, SWP_NOZORDER | SWP_NOREDRAW);

   /* EditBox #1 */
   x=5;
   y=40;
   hDWP=DeferWindowPos(hDWP,GetDlgItem(lpwp->hwnd,IDC_EDIT1),NULL,
   x, y, nWidth, rect.bottom-50/*nHeight*/, SWP_NOZORDER | SWP_NOREDRAW);

   EndDeferWindowPos(hDWP);
   InvalidateRect(lpwp->hwnd,NULL,TRUE);
}

LRESULT CALLBACK DlgProcAbout(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   switch(uMsg) {
      case WM_COMMAND:
      if(IDOK==LOWORD(wParam))
      EndDialog(hDlg,LOWORD(wParam));
      return TRUE;
   }
   return FALSE;
}

BOOL OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) {
   /* Item, control or accelerator identifier. */
   int wId=LOWORD(wParam);
   /* Notification code.
   int wNotifyCode=HIWORD(wParam); */
   /* Handle of control.
   HWND hwndCtl=(HWND)lParam; */
   switch(wId) {
   case IDM_SHOW: {
      ShowWindow(hWnd,SW_NORMAL);
      HICON hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MAINFRAME));
      if(!hIcon)
         hIcon=LoadIcon(GetModuleHandle(NULL),IDI_APPLICATION);
      if(hIcon)
         TrayMessage(hWnd,NIM_MODIFY,ID_TRAY,hIcon,GAppname);
   }
   break;
   case IDM_HIDE:
   ShowWindow(hWnd,SW_HIDE);
   break;
   case IDC_CLEAR:
   OnClearResponses(hWnd);
   break;
   case IDC_EXIT:
   SendMessage(hWnd,WM_DESTROY,0,0);
   break;
   case IDM_ABOUT:
   return DialogBox(GetModuleHandle(NULL),(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)DlgProcAbout);
   } /* End "switch(wId)" */
   return TRUE;
}

BOOL OnCreate(LPCREATESTRUCT lpCreateStruct) {
   HWND hWnd=lpCreateStruct->hwndParent;
   HINSTANCE hInstance=lpCreateStruct->hInstance;
   /* Menu About. */
   HMENU Menu=GetSystemMenu(hWnd,FALSE);
   if(Menu) {
      char svNewItem[MAX_LOADSTRING];
      LoadString(hInstance,IDS_ABOUT,svNewItem,MAX_LOADSTRING);
      ModifyMenu(Menu,5,MF_BYPOSITION,IDM_ABOUTBOX,svNewItem);
      InsertMenu(Menu,5,MF_BYPOSITION,MF_SEPARATOR,0);
      InsertMenu(Menu,7,MF_BYPOSITION,MF_SEPARATOR,0);
   }
   /* Create button clear. */
   HWND hwnd=CreateWindow("button","Clear",
   WS_TABSTOP | WS_VISIBLE | WS_CHILD,
   5,5,100,28,
   hWnd,(HMENU)IDC_CLEAR,hInstance,NULL);
   if(!hwnd) mb("Failed create button.");

   /* Create button Exit. */
   hwnd=CreateWindow("button","Exit",
   WS_CHILD | WS_VISIBLE | WS_TABSTOP,
   0,0,0,0,hWnd,(HMENU)IDC_EXIT,hInstance,NULL);
   if(!hwnd) mb("Failed create button.");

   /* Create EditBox. */
   HWND hwndEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
   "edit",NULL, ES_LEFT | WS_CHILD |
   WS_VISIBLE | WS_VSCROLL | WS_TABSTOP |
   ES_READONLY | ES_MULTILINE | ES_AUTOVSCROLL,
   0,0,0,0,hWnd,(HMENU)IDC_EDIT1,hInstance,NULL);
   if(!hwndEdit) mb("Failed create edit box.");

   /* Set subroutine EditBox. */
   SetWindowLong(hwndEdit,GWL_USERDATA,GetWindowLong(hwndEdit,GWL_WNDPROC));
   SetWindowLong(hwndEdit,GWL_WNDPROC,(LONG)EditProc);
   /* Set icon to system tray. */
   HICON hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDR_MAINFRAME));
   if(!hIcon) hIcon=LoadIcon(hInstance,IDI_APPLICATION);
   SendMessage(hWnd,WM_SETICON,ICON_BIG,(LPARAM)hIcon);
   if(hIcon)
      TrayMessage(hWnd,NIM_ADD,ID_TRAY,hIcon,GAppname);

   /* Set timer. */
   g_nTimerWork=SetTimer(hWnd,TIMER_WORK,TIMER_WORK_DELAY,NULL);
   if(!g_nTimerWork) mb("Failed set timer.");
   /* Set default control. */
   SendDlgItemMessage(hWnd,IDC_CLEAR,BM_SETSTYLE,BS_DEFPUSHBUTTON,TRUE);
   SetFocus(GetDlgItem(hWnd,IDC_CLEAR));
   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   LRESULT retval=0;
   LPCREATESTRUCT lpCreateStruct;
   switch(uMsg) {
   case WM_CREATE: {
      lpCreateStruct=reinterpret_cast<LPCREATESTRUCT>(lParam);
      lpCreateStruct->hwndParent=hWnd;
   }
   return OnCreate(lpCreateStruct);

   case WM_COMMAND:
   return OnCommand(hWnd,wParam,lParam);
   case WM_WORK_MESSAGE:
   OnHandleCommandResponse(hWnd,wParam,lParam);
   break;
   case WM_WORK_DONE:
   OnWorkDone(hWnd,wParam,lParam);
   break;

   case WM_SYSCOMMAND: {
      WORD wID=LOWORD(wParam);
      switch(wID) {
         case IDM_ABOUTBOX:
         SendMessage(hWnd,WM_COMMAND,(WPARAM)IDM_ABOUT,(LPARAM)0);
         break;
         default:
         return DefWindowProc(hWnd,uMsg,wParam,lParam);
      }
   } /* End "case WM_SYSCOMMAND" */
   break;
   case WM_GETMINMAXINFO: {
   LPMINMAXINFO lpInfo=(LPMINMAXINFO)lParam;
   if(lpInfo) {
      lpInfo->ptMinTrackSize.x=MIN_WINDOW_WIDTH;
      lpInfo->ptMinTrackSize.y=MIN_WINDOW_HEIGHT;
      }
   }
   break;
   case WM_WINDOWPOSCHANGING:
   case WM_WINDOWPOSCHANGED: {
      LPWINDOWPOS lpwp=reinterpret_cast<LPWINDOWPOS>(lParam);
      if( (!(lpwp->flags & SWP_NOSIZE)) || (IsWindowVisible(hWnd)) )
      OnWindowPosChanging(lpwp);
   }
   break;
   case WM_TIMER:
   OnTimer(hWnd,wParam);
   break;
   case WM_TRAYNOTIFY:
   return OnTraynotify(hWnd,lParam);
   case WM_RBUTTONDOWN:
   PopupMenu(hWnd);
   InvalidateRect(hWnd,NULL,TRUE);
   break;
   case WM_CLOSE:
   if(IsWindowVisible(hWnd)) {
      ShowWindow(hWnd,SW_HIDE);
   }
   else
   SendMessage(hWnd,WM_DESTROY,0,0);
   break;
   case WM_DESTROY:
   if(g_nTimerWork) {
      KillTimer(hWnd,g_nTimerWork);
      g_nTimerWork=NULL;
   }
   if(GWork) {
      DWORD idThread=GWork->Resolved();
      if(idThread)
         PostThreadMessage(idThread,WM_WORK_DESTROY,0,0);
   } /* End "if(GWork)" */
   TrayMessage(hWnd,NIM_DELETE,ID_TRAY,NULL,"");
   PostQuitMessage(0);
   break;
   default:
      retval=DefWindowProc(hWnd,uMsg,wParam,lParam);
   } /* End "switch(uMsg)" */
   return retval;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
   /* Load string window name. */
   LoadString(hInstance,IDS_APPNAME,GAppname,MAX_LOADSTRING);
   /* Load string class name. */
   char svWndname[MAX_LOADSTRING];
   LoadString(hInstance,IDS_WNDNAME,svWndname,MAX_LOADSTRING);
   /* Running only instance. */
   CreateMutex(NULL,0,GAppname);
   BOOL AlreadyRunning=(ERROR_ALREADY_EXISTS==GetLastError());
   if(AlreadyRunning) return 0;
   /* OpenThread loading function. */
   OpenThread=(OPENTHREAD)GetProcAddress(LoadLibrary(TEXT("kernel32.dll")),"OpenThread");
   if(!OpenThread) mb("Failed GetProcAddress");

   WNDCLASSEX wcex;
   wcex.cbSize=sizeof(WNDCLASSEX);
   wcex.style=CS_HREDRAW | CS_VREDRAW;
   wcex.lpfnWndProc=(WNDPROC)WndProc;
   wcex.cbClsExtra=0;
   wcex.cbWndExtra=0;
   wcex.hInstance=hInstance;
   wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
   wcex.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDR_MAINFRAME));
   wcex.hIconSm=(HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,16,16,0);
   wcex.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
   wcex.lpszMenuName=NULL;
   wcex.lpszClassName=svWndname;
   ATOM Atom=RegisterClassEx(&wcex);
   if(!Atom) {
      Atom=RegisterClass((LPWNDCLASS)&wcex.style);
      if(!Atom) mb("Failed register class.");
   }

   /* Style window default. */
   DWORD dwExStyle=WS_EX_WINDOWEDGE;
   DWORD dwStyle=WS_OVERLAPPEDWINDOW;
   int nWidth=WINDOW_WIDTH;
   int nHeight=WINDOW_HEIGHT;
   HWND hWnd=CreateWindowEx(dwExStyle,MAKEINTATOM(Atom),GAppname,dwStyle,
   5,335,/* Окно - влевом углу, внизу. */
   nWidth,nHeight,HWND_DESKTOP,NULL,hInstance,NULL);
   if(!hWnd) mb("Failed create window.");
   ShowWindow(hWnd,nCmdShow);
   UpdateWindow(hWnd);
   MSG msg;
   while(GetMessage(&msg,NULL,0,0)) {
      if(!IsDialogMessage(hWnd,&msg)) {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
      }
   }
   return (int)msg.wParam;
}

void mb(char* s) {
   UINT uType=MB_OK | MB_ICONINFORMATION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL;
   int n=0;
   if(strstr(s,"Failed") || strstr(s,"Error"))
   ++n;
   if(n) {
      uType &=~MB_ICONINFORMATION;
      uType |=MB_ICONWARNING;
   } MessageBox(GetActiveWindow(),s,GAppname,uType);
   if(n)
   ExitProcess(n);
}

char* appBaseDir() {
   int i;
   static char svResult[MAX_PATH];
   if(!svResult[0]) {
      GetModuleFileName(GetModuleHandle(NULL),svResult,MAX_PATH);
      for(i=lstrlen(svResult)-1;i>0;--i) {
         if('\\'==svResult[i-1] || '/'==svResult[i-1])
         break;
      }
      svResult[i]=0;
   }
   return svResult;
}

void SetText(HWND hWnd, char* svStr) {
   HWND hwndEdit=GetDlgItem(hWnd,IDC_EDIT1);
   if(hwndEdit) {
      int n=GetWindowTextLength(hwndEdit);
      SendMessage(hwndEdit,EM_SETSEL,(WPARAM)n,(LPARAM)n);
      SendMessage(hwndEdit,EM_REPLACESEL,0,(LPARAM)svStr);
   }
}
void OnClearResponses(HWND hWnd) {
   /* Clear EditBox. */
   HWND hwndEdit=GetDlgItem(hWnd,IDC_EDIT1);
   if(hwndEdit) SetWindowText(hwndEdit,"");
}
LRESULT OnHandleCommandResponse(HWND hWnd, WPARAM, LPARAM lParam) {
   /* Set text EditBox. */
   SetText(hWnd,(char*)lParam);
   return 0;
}

LRESULT OnWorkDone(HWND hWnd, WPARAM, LPARAM) {
   if(g_nTimerWork) KillTimer(hWnd,g_nTimerWork);
   /* Set timer. */
   g_nTimerWork=SetTimer(hWnd,TIMER_WORK,TIMER_WORK_DELAY,NULL);
   if(!g_nTimerWork) mb("Failed set timer.");
   return 0;
}
Вложения
ProcWatcher.zip
(35.41 Кб) Скачиваний: 20
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 457
Зарегистрирован: 18 июл 2023, 14:12

Пред.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2