十七
十七
Published on 2025-07-31 / 4 Visits
0
0

windows线程相关

1. GetVersionEx

函数介绍

GetVersionEx 是一个用于获取操作系统版本信息的函数。它填充一个结构体,其中包含有关当前操作系统版本的信息。

函数原型

BOOL GetVersionEx(
  LPOSVERSIONINFO lpVersionInfo
);

参数介绍

  • lpVersionInfo

    • 类型:LPOSVERSIONINFO

    • 指向一个 OSVERSIONINFOOSVERSIONINFOEX 结构的指针,用于接收操作系统版本信息。

返回值

  • 成功:返回值为非零值。

  • 失败:返回值为零。可以通过调用 GetLastError 获取错误代码。

示例代码

#include <windows.h>
#include <stdio.h>

int main() {
    OSVERSIONINFO osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    if (GetVersionEx(&osvi)) {
        printf("Major Version: %d\n", osvi.dwMajorVersion);
        printf("Minor Version: %d\n", osvi.dwMinorVersion);
        printf("Build Number: %d\n", osvi.dwBuildNumber);
        printf("Platform ID: %d\n", osvi.dwPlatformId);
        printf("Service Pack: %s\n", osvi.szCSDVersion);
    } else {
        printf("Failed to get version information. Error: %d\n", GetLastError());
    }

    return 0;
}

2. CreateProcess

函数介绍

CreateProcess 用于创建一个新的进程及其主线程。它可以启动一个程序或命令,并指定程序的运行方式。

函数原型

BOOL CreateProcess(
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFO         lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

参数介绍

  • lpApplicationName:指向要运行的模块的名称。

  • lpCommandLine:指向命令行字符串。

  • lpProcessAttributes:指向进程安全属性。

  • lpThreadAttributes:指向线程安全属性。

  • bInheritHandles:是否继承句柄。

  • dwCreationFlags:创建标志。

  • lpEnvironment:指向新环境块。

  • lpCurrentDirectory:指向当前目录。

  • lpStartupInfo:指向启动信息。

  • lpProcessInformation:指向返回的进程和线程信息。

返回值

  • 成功:返回值为非零值。

  • 失败:返回值为零。可以通过调用 GetLastError 获取错误代码。

示例代码

#include <windows.h>
#include <stdio.h>

int main() {
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

    if (!CreateProcess(
        NULL,                   // 指向可执行文件的名称
        "notepad.exe",          // 指向命令行字符串
        NULL,                   // 指向进程安全属性
        NULL,                   // 指向线程安全属性
        FALSE,                  // 是否继承句柄
        0,                      // 创建标志
        NULL,                   // 指向新环境块
        NULL,                   // 指向当前目录
        &si,                    // 指向启动信息
        &pi                     // 指向返回的进程和线程信息
    )) {
        printf("CreateProcess failed. Error: %d\n", GetLastError());
        return 1;
    }

    WaitForSingleObject(pi.hProcess, INFINITE);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}

3. ShellExecuteEx

函数介绍

ShellExecuteEx 是一个功能强大的函数,用于执行各种与文件或文件夹相关的操作,例如启动程序、打开文件、打印文件、浏览文件夹等。

函数原型

BOOL ShellExecuteEx(
  LPSHELLEXECUTEINFO lpExecInfo
);

参数介绍

  • lpExecInfo:指向一个 SHELLEXECUTEINFO 结构的指针,包含执行操作所需的所有信息。

返回值

  • 成功:返回值为非零值。

  • 失败:返回值为零。可以通过调用 GetLastError 获取错误代码。

示例代码

#include <windows.h>
#include <shellapi.h>
#include <stdio.h>

int main() {
    SHELLEXECUTEINFO sei = {0};

    sei.cbSize = sizeof(SHELLEXECUTEINFO);
    sei.fMask = SEE_MASK_NOCLOSEPROCESS;
    sei.lpVerb = "open";
    sei.lpFile = "notepad.exe";
    sei.lpParameters = NULL;
    sei.lpDirectory = NULL;
    sei.nShow = SW_SHOWNORMAL;

    if (!ShellExecuteEx(&sei)) {
        printf("ShellExecuteEx failed. Error: %d\n", GetLastError());
        return 1;
    }

    WaitForSingleObject(sei.hProcess, INFINITE);

    CloseHandle(sei.hProcess);

    return 0;
}

4. GetProcessElevation

函数介绍

GetProcessElevation 用于检测当前进程的权限提升状态,判断进程是否以管理员权限运行以及其令牌的提升类型。

函数原型

BOOL GetProcessElevation(TOKEN_ELEVATION_TYPE* pElevationType, BOOL* pIsAdmin);

参数介绍

  • pElevationType:指向 TOKEN_ELEVATION_TYPE 枚举类型的指针,用于接收当前进程的令牌提升类型。

  • pIsAdmin:指向布尔值的指针,用于接收当前进程是否以管理员身份运行。

返回值

  • 成功:返回值为非零值。

  • 失败:返回值为零。

示例代码

#include <windows.h>
#include <stdio.h>

BOOL GetProcessElevation(TOKEN_ELEVATION_TYPE* pElevationType, BOOL* pIsAdmin) {
    HANDLE hToken = NULL;
    DWORD dwSize;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
        return FALSE;
    }

    BOOL bResult = FALSE;

    if (GetTokenInformation(hToken, TokenElevationType, pElevationType, sizeof(TOKEN_ELEVATION_TYPE), &dwSize)) {
        *pIsAdmin = IsUserAnAdmin();
        bResult = TRUE;
    }

    CloseHandle(hToken);
    return bResult;
}

int main() {
    TOKEN_ELEVATION_TYPE Type;
    BOOL IsAdmin;
    if (GetProcessElevation(&Type, &IsAdmin)) {
        printf("Elevation Type: %d\n", Type);
        if (IsAdmin) {
            printf("Running as Admin\n");
        } else {
            printf("Running as Normal User\n");
        }
    } else {
        printf("Failed to get elevation information\n");
    }
    return 0;
}

5. CreateThread

函数介绍

CreateThread 用于创建一个新线程。它可以启动一个线程来执行指定的函数,通常用于多线程编程。

函数原型

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  LPVOID                  lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

参数介绍

  • lpThreadAttributes:指向线程安全属性。

  • dwStackSize:初始堆栈大小。

  • lpStartAddress:指向线程函数的指针。

  • lpParameter:传递给线程函数的参数。

  • dwCreationFlags:创建标志。

  • lpThreadId:指向线程标识符的指针。

返回值

  • 成功:返回新线程的句柄。

  • 失败:返回 NULL。可以通过调用 GetLastError 获取错误代码。

示例代码

#include <windows.h>
#include <stdio.h>

DWORD WINAPI ThreadFunc(LPVOID lpParam) {
    int count = (int)lpParam;
    for (int i = 0; i < count; i++) {
        printf("Thread: %d\n", i);
    }
    return 0;
}

int main() {
    HANDLE hThread;
    DWORD dwThreadId;
    int threadCount = 5;

    hThread = CreateThread(
        NULL,                   // 安全属性
        0,                      // 堆栈大小
        ThreadFunc,             // 线程函数
        (LPVOID)threadCount,    // 传递给线程函数的参数
        0,                      // 创建标志
        &dwThreadId             // 线程标识符
    );

    if (hThread == NULL) {
        printf("CreateThread failed. Error: %d\n", GetLastError());
        return 1;
    }

    printf("Thread created with ID: %d\n", dwThreadId);

    WaitForSingleObject(hThread, INFINITE);

    CloseHandle(hThread);

    return 0;
}


Comment