Заметки по WinAPI

  • процессы и потоки
    • процесс
      • Def: экземпляр выполняемой программы состоящий из двух компонентов
        • объект ядра, через который система управляет процессом
        • адресное пространство, а там уже все данные, стеки потоков и прочее
      • ну и чтобы процесс что-либо делал у него должен быть как минимум один поток
      • создается при помощи функции
        • BOOL CreateProcess( PCTSTR pszApplicationName, // если NULL то считает первый элемент commandLine за то, что нужно запускать
                                            // если параметр задан и не содержит полный путь, то ищет файл ТОЛЬКО в текущем ктаалоге
                                            // не дополняет расширение файла до .exe
          
          PTSTR pszCommandLine, // указатель на командную строку. ВАЖНО! функция ее изменит но потом вернет к первозданному виду. Потому если она в read-only области то будет ошибка
                                            // и еще, тут подразумевается ПОЛНАЯ командная строка
                                            // если расширение не указано, то ищет .exe
          
          PSECURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThread, BOOL bInheritHandles, DWORD fdwCreate, // флаги создания нового процесса (новое окно, никаких окон, debug и прочее) PVOID pvEnvironment, // переменные окружения PCTSTR pszCurDir, // текущий катаог (важно, путь если дан то должен быть полным включая букву диска) PSTARTUPINFO psiStartInfo, PPROCESS_INFORMATION ppiProcInfo);
        • а вот что она делает
          • создает объект ядра Process, создает для него адресное пространство, загружает код, данные для EXE и всех других зависимостей
          • потом создается объект ядра Thread, для главного потока. Надо помнить, что объект ядра это некоторая компактная структура через которую ОСь управляет процессом/потоком. Потом исполняется стартовый код и вызывается main
        • ищет заданный в ней exe файл в папках
          • каталог содержащий exe вызвавшего
          • текущий каталог вызвавшего процесса
          • системный каталог Windows
          • основной каталог Windows
          • Каталоги из PATH
      • способы завершения
        • основной поток завершается - лучший способ, далее CRTStartup подчищает все, что наинициализировала и вызывает ExitProcess
        • ExitProcess (из себя) или TerminateProcess (из другого) - относительно аварийный выход, система все подчистит, но все равно не айс, деструкторы объектов построенных во время выполнения и CRTStartup не уничтожаются...
        • все потоки ушли (ч-з Exit/Terminate Thread) - редкий способ, в таком случае код завершения процесса это код завершения последнего потока
      • что происходит при завершении
        • останавливаются все выполняемые потоки
        • все User и GDI объекты уничтожаются, все объекты ядра закрываются
        • состояние процесса помечается как signaled (special for wait-функций)
        • счетчик объекта ядра процесс уменьшается на 1
- поток
    - сущность, выполняющая собственно код
    - имеет собственный набор регистров процессора и стек
    - максимальное кол-во ~2000 для одного процесса (на моем компе мне удалось сделать 1451 поток)
  • APC
    • возможность привести поток в wait alertable и в такие потоки можно при помощи QueueUserAPC встраивать выполнение нужной тебе процедуры.
    • DWORD QueueUserAPC( PAPCFUNC, // указатель на процедуру HANDLE, // хэндл потока ULONG_PTR // параметр процедуры )