zoukankan      html  css  js  c++  java
  • win32 API 笔记1

    //==================HOOK钩子=========================

    可以用来HOOK掉系统对某些函数的的调用

    //==================终止系统进程=====================

    4种终止方式:

    1、主线程的入口函数返回

    2、进程中一个线程调用ExitProcess函数,只能结束当前进程,不能用于结束其他进程。

    3、进程中的所有线程都结束了

    4、其他进程中的一个线程调用了TerminateProcess函数

    //TerminateProcess函数终止指定进程及其所有线程。

    BOOL TerminateProcess(        

    HANDLE hProcess,//进程句柄

    UINT uExitCode //进程终止码

    );

    //OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。

    HANDLE OpenProcess(

    DWORD dwDesiredAccess, //向得到的访问权限(标志),可以说PROCESS_ALL_ACCESS,PROCESS_QUERY_INFORMATION等

    BOOL bInheritHandle, // 是否继承句柄

    DWORD dwProcessId// 进程标示符

    );

    //==================获取系统进程=====================

    获取系统进程:ToolHelp函数和EnumProcess函数

    PROCESSENTRY32 pe32;

    HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);      //系统进程拍快照,返回值作为形参给Process32First和Process32Next

    BOOL bmore=::Process32First(hProcessSnap,&pe32)

             bmore =::Process32Next(hProcessSnap,&pe32)

    CloseHandle(hProcessSnap);

    ToolHelp函数并不是获取系统进程信息的唯一方法,还可以使用EnumProcess函数。

    TH32CS_SNAPHEAPLIST           //枚举th32ProcessID参数指定的进程中的堆

    TH32CS_SNAPMODULE            //枚举th32ProcessID参数指定的进程中的模块

    TH32CS_SNAPPROCESS                    //枚举系统范围内的进程,此时th32ProcessID参数被忽略

    TH32CS_SNAPTHREAD             //枚举系统范围内的线程,此时th32ProcessID参数被忽略

    HANDLE WINAPI CreateToolhelp32Snapshot(

    DWORD dwFlags,                     //用来指定"快照"中需要返回的对象,可以是TH32CS_SNAPPROCESS等

    DWORD th32ProcessID          //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0

    );

    typedef struct tagPROCESSENTRY32

    {

    DWORD dwSize;                                            //结构的长度,必须预先设置

    DWORD cntUsage;                                       //进程的引用计数

    DWORD th32ProcessID;                    //进程的ID

    ULONG_PTR th32DefaultHeapID;  //进程默认堆的ID

    DWORD th32ModuleID;                             //进程模块的ID

    DWORD cntThreads;                                   //进程创建的线程数

    DWORD th32ParentProcessID;                //进程的父线程ID

    LONG pcPriClassBase;                       //进程创建的线程的基本优先级

    DWORD dwFlags;                                         //内部使用

    TCHAR szExeFile[MAX_PATH];                  //进程对应的可执行文件名

    } PROCESSENTRY32, *PPROCESSENTRY32;

    //==================应用程序的启动过程=====================

    应用程序的启动过程,就是进程的创建过程,调用CreateProcess函数创建进程

    创建新进程时会为新进程指定一个STARTUPINFO类型的变量,这个结构包含了父进程传递给子进程的一些显示信息。

    一个进程可以调用GetStartupInfo函数来取得父进程创建自己时使用的STARTUPINFO结构。例如:

    VOID GetStartupInfo(LPSTARTUPINFO lpStarupInfo);           //取得当前进程被创建时指定的STARTUPINFO结构

    初始化STARTUPINFO结构的大小,例如:

    STARTUPINFO si = {sizeof(si)};          //将cb成员初始化为sizeof(si),其他成员初始化为0

    ::GetStartupInfo(&si);

    si.dwFlags = STARTF_USESHOWWINDOW;     //指定wShowWindow成员有效

    si.wShowWindow = TRUE;                                   //此成员设为TURE的话则显示新建进程的主窗口,FALSE为不显示

    CloseHandle(pi.hThread);                           //创建后需要关闭线程句柄

    CloseHandle(pi.hProcess);                         //创建后需要关闭进程句柄

    由于windows版本的增加又需要兼容老版本,windows需要通过该结构体的大小来确定其成员的数目

    //STARTUPINFO结构用于指定新进程的主窗口特性

    typedef struct _STARTUPINFO {

    DWORD cb;

    LPTSTR lpReserved;

    LPTSTR lpDesktop;

    LPTSTR lpTitle;

    DWORD dwX;

    DWORD dwY;

    DWORD dwXSize;

    DWORD dwYSize;

    DWORD dwXCountChars;

    DWORD dwYCountChars;

    DWORD dwFillAttribute;

    DWORD dwFlags;

    WORD wShowWindow;

    WORD cbReserved2;

    LPBYTE lpReserved2;

    HANDLE hStdInput;

    HANDLE hStdOutput;

    HANDLE hStdError;

    } STARTUPINFO, *LPSTARTUPINFO;

    BOOL CreateProcess

    (

    LPCTSTR lpApplicationName,

    LPTSTR lpCommandLine,

    LPSECURITY_ATTRIBUTES lpProcessAttributes。

    LPSECURITY_ATTRIBUTES lpThreadAttributes,

    BOOL bInheritHandles,

    DWORD dwCreationFlags,

    LPVOID lpEnvironment,

    LPCTSTR lpCurrentDirectory,

    LPSTARTUPINFO lpStartupInfo,

    LPPROCESS_INFORMATIONlpProcessInformation

    );

    //创建进程时相关的数据结构

    typedef struct _PROCESS_INFORMATION{

    HANDLE hProcess;                     //新创建进程的内核句柄

    HANDLE hThread;                               //新创建进程中主线程的内核句柄

    DWORD dwProcessId;                       //新创建进程的ID

    DWORD dwThreadId;                         //新创建进程的主线程ID

    }PROCESS_INFORMATION,*LPPROCESS_INFORMATION;

    //==========================其他===============================

    在API函数前加::符号,表示这是一个全局的函数,以与C++类的成员函数相区分

    光标移向API函数,按F1键,打开msdn文档

    //=============================代码风格=======================

    g_前缀表示全局变量

    m_前缀表示类的成员变量

    b_前缀表示bool类型

    n_前缀表示整型

    p_前缀表示指针

    lp_前缀表示长指针 long point

    //=============================创建线程=======================

    CreateThread 

    //=============================对话框=========================

    MessageBox 显示一个指定风格的对话框,通过判断返回值判断是点击确定还是取消或是其他。

    //============================================================

  • 相关阅读:
    指针
    day07
    day06
    oracle instr
    动态解析dll及使用类
    客户端调用接口
    Java中调用WebService
    Vs2015智能提示英文
    oracle中varchar(32)转nvarchar(32)
    C#创建XML节点
  • 原文地址:https://www.cnblogs.com/baiduboy/p/6683500.html
Copyright © 2011-2022 走看看