• 改变进程基址,获取进程基址
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <strsafe.h>
  4. #include <STDLIB.H>
  5. using namespace std;
  6. #pragma comment(linker, "/BASE:0x400000") // 改变进程加载机地址
  7. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  8. {
  9. WCHAR RouteBuffer[60] = { 0 };
  10. DWORD res = GetModuleFileName(NULL, RouteBuffer, sizeof(RouteBuffer)); // 获取当前程序的全路径
  11. WCHAR AfterVersion[130] = { 0 };
  12. HMODULE EBAddress = GetModuleHandle(TEXT("NpCxyFW.exe")); // 获取当前进程的句柄 / 基址
  13. StringCchPrintf(AfterVersion, sizeof(AfterVersion) / 2,
  14. TEXT("程序全路径: %s\nhInstance获取到的程序基址: %x \nGetModuleHandle获取到的程序基址: %x"),
  15. RouteBuffer, hInstance, EBAddress
  16. );
  17. INT Box_1 = MessageBox(NULL, AfterVersion, TEXT("测试"), MB_OKCANCEL);
  18. return 0;
  19. }

  • 通过 GetCommandLine() 获取命令行参数
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <strsafe.h>
  4. using namespace std;
  5. int main(int argc, char *argv[])
  6. {
  7. // 通过 GetCommandLine 获取命令行参数
  8. INT CmdCount = NULL;
  9. PWSTR *CmdLine = CommandLineToArgvW(GetCommandLine(), &CmdCount);
  10. for (size_t i = 1; i < CmdCount; i++)
  11. {
  12. WCHAR *BeforeConversion = CmdLine[i]; CHAR AfterConversion[20] = { 0 };
  13. // 将宽字节字符转换为多字节字符
  14. int res = WideCharToMultiByte(CP_UTF8, NULL, BeforeConversion, -1, AfterConversion, sizeof(AfterConversion), NULL, NULL);
  15. cout << "参数 " << i << ": "<< AfterConversion << endl;
  16. }
  17. return 0;
  18. }

  • 显示进程环境块
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <wcschr.h>
  4. #include <strsafe.h>
  5. using namespace std;
  6. int main(int argc, char *argv[])
  7. {
  8. PTSTR PEnvBlock = GetEnvironmentStrings(); // 获取进程环境块,也可以使用 int main(TCHAR *env[]) 的方式获取
  9. TCHAR SzName[MAX_PATH]; TCHAR SzValue[MAX_PATH];
  10. PTSTR PszCurrent = PEnvBlock;
  11. HRESULT hr = S_OK; PCTSTR PszPos = NULL; int current = 0;
  12. while (PszCurrent != NULL) {
  13. if (*PszCurrent != TEXT('=')) { // 若第一个字符不是 '='
  14. PszPos = _tcschr(PszCurrent, TEXT('=')); PszPos++; // 查找 '=' 在字符串中的位置
  15. size_t cbNameLength = (size_t)PszPos - (size_t)PszCurrent - sizeof(TCHAR); // 获取 Name 字段的长度
  16. hr = StringCbCopyN(SzName, MAX_PATH, PszCurrent, cbNameLength); // 将 Name 字段拷贝到 szName 中
  17. if (FAILED(hr)) break;
  18. hr = StringCchCopyN(SzValue, MAX_PATH, PszPos, _tcslen(PszPos) + 1); // 将 '=' 字符之后的内容拷贝至 szValue 中
  19. if (SUCCEEDED(hr))
  20. {
  21. _tprintf(TEXT("[%u] %s=%s\r\n"), current, SzName, SzValue); // 成功便打印出信息
  22. }
  23. else
  24. {
  25. if (hr == STRSAFE_E_INSUFFICIENT_BUFFER) // 错误处理,STRSAFE_E_INSUFFICIENT_BUFFER 缓冲区空间不足
  26. _tprintf(TEXT("[%u] %s=%s...\r\n"), current, SzName, SzValue);
  27. else
  28. _tprintf(TEXT("[%u] %s=???\r\n"), current, SzName); break;
  29. }
  30. }
  31. else {
  32. _tprintf(TEXT("[%u] %s\r\n"), current, PszCurrent); // 若一开始就为 '=' 字符,就直接打印出字符串的内容
  33. }
  34. current++; // 环境变量的个数加 1
  35. while (*PszCurrent != TEXT('\0')) PszCurrent++; // 移动到字符串的结尾
  36. PszCurrent++; // 跳过 '\0'
  37. if (*PszCurrent == TEXT('\0')) break; // 检查它是否不是最后一个字符串
  38. };
  39. FreeEnvironmentStrings(PEnvBlock); //释放空间
  40. return 0;
  41. }
  • 获得某个环境变量
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <strsafe.h>
  4. #include <stdio.h>
  5. using namespace std;
  6. int main(TCHAR *env[])
  7. {
  8. PWSTR lpBuffer = NULL;
  9. DWORD Size = GetEnvironmentVariable(TEXT("PATH"), lpBuffer, 0); // 首先判断是否存在 PATH 环境变量
  10. if (Size != 0)
  11. {
  12. DWORD BufferSize = Size * sizeof(TCHAR);
  13. lpBuffer = (PWSTR)malloc(BufferSize); // 存在即分配缓冲区空间
  14. GetEnvironmentVariable(TEXT("PATH"), lpBuffer, BufferSize);
  15. printf("%ls", lpBuffer); // 打印 PATH 环境变量的信息
  16. }
  17. return 0;
  18. }
  • 获取当前目录
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <versionhelpers.h>
  5. using namespace std;
  6. BOOL CompareOS(INT dwMajorVersion, INT dwMinorVersion);
  7. int main(TCHAR *env[])
  8. {
  9. // 获取当前目录方法 1
  10. TCHAR Buffer_1[MAX_PATH] = { 0 };
  11. DWORD DirLength = GetCurrentDirectory(MAX_PATH, Buffer_1);
  12. printf("目录: %ls\n", Buffer_1);
  13. // 获取当前目录方法 2
  14. TCHAR Buffer_2[MAX_PATH];
  15. DWORD PathLength = GetFullPathName(TEXT("C:"), MAX_PATH, Buffer_2, NULL);
  16. printf("目录: %ls\n", Buffer_2);
  17. return 0;
  18. }
  • 判断系统版本号的两种方法
  1. VOID JudgeOS() // 通过 VerifyVersionInfo 比较判断,准确度一般
  2. {
  3. if (!CompareOS(10, 0))
  4. if (!CompareOS(6, 3))
  5. if (!CompareOS(6, 2))
  6. if (!CompareOS(6, 1))
  7. if (!CompareOS(6, 0))
  8. if (!CompareOS(5, 2))
  9. if (!CompareOS(5, 1))
  10. if (!CompareOS(5, 0))
  11. cout << "未知的操作系统版本" << endl;
  12. else
  13. cout << "版本在 Window2000 以上" << endl;
  14. else
  15. cout << "版本在 Windows XP 以上" << endl;
  16. else
  17. cout << "版本在 Windows XP Professional x64 Edition 以上" << endl;
  18. else
  19. cout << "版本在 Windows Vista 或者 Windows Server 2008 以上" << endl;
  20. else
  21. cout << "版本在 Windows 7 或者 Windows Server 2008 R2 以上" << endl;
  22. else
  23. cout << "版本在 Windows 8 或者 Windows Server 2012 以上" << endl;
  24. else
  25. cout << "版本在 Windows 8.1 或者 Windows Server 2012 R2 以上" << endl;
  26. else
  27. cout << "版本在 Windows Server 2016 或者 Windows 10 以上" << endl;
  28. }
  29. BOOL CompareOS(INT MajorVersion, INT MinorVersion)
  30. {
  31. OSVERSIONINFOEX OSinfo = { 0 };
  32. OSinfo.dwOSVersionInfoSize = sizeof(OSinfo);
  33. OSinfo.dwMajorVersion = MajorVersion; OSinfo.dwMinorVersion = MinorVersion; // 设置比较操作系统版本的区间组合
  34. DWORDLONG dwlConditionMask = 0; // 设置用于比较操作系统的宏
  35. VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
  36. VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);
  37. BOOL Res = VerifyVersionInfo(&OSinfo, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask); // 第二个参数为比较位,支持 or 操作
  38. return Res; // 函数成功返回非 0 值
  39. }
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <versionhelpers.h>
  5. using namespace std;
  6. // 利用官方的便捷函数进行操作系统的判别
  7. INT JudgeOS();
  8. int main(TCHAR *env[])
  9. {
  10. JudgeOS(); // 打印操作系统版本的信息
  11. return 0;
  12. }
  13. INT JudgeOS()
  14. {
  15. if (IsWindowsServer())
  16. cout << "操作系统是服务器" << endl;
  17. else
  18. if (!IsWindows10OrGreater())
  19. if (!IsWindows8OrGreater())
  20. if (!IsWindows7SP1OrGreater())
  21. if (!IsWindows7OrGreater())
  22. if (!IsWindowsVistaSP2OrGreater())
  23. if (!IsWindowsVistaSP1OrGreater())
  24. if (!IsWindowsVistaOrGreater())
  25. if (!IsWindowsXPSP3OrGreater())
  26. if (!IsWindowsXPSP2OrGreater())
  27. if (!IsWindowsXPSP1OrGreater())
  28. if (!IsWindowsXPOrGreater())
  29. cout << "未知的操作系统版本" << endl;
  30. else
  31. cout << "当前操作系统版本是否与Windows XP版本匹配或大于Windows XP版本 " << endl;
  32. else
  33. cout << "当前操作系统版本是否与Windows XP Service Pack 1(SP1)版本匹配或大于" << endl;
  34. else
  35. cout << "当前操作系统版本是否与Windows XP Service Pack 2(SP2)版本匹配或大于" << endl;
  36. else
  37. cout << "当前操作系统版本是否与Windows XP Service Pack 3(SP3)版本匹配或大于" << endl;
  38. else
  39. cout << "当前操作系统版本是否与Windows Vista版本匹配或大于Windows Vista版本" << endl;
  40. else
  41. cout << "当前操作系统版本是否与Windows Vista Service Pack 1(SP1)版本匹配或大于" << endl;
  42. else
  43. cout << "当前操作系统版本是否与Windows Vista Service Pack 2(SP2)版本匹配或大于" << endl;
  44. else
  45. cout << "当前操作系统版本是否与Windows 7版本匹配或大于Windows 7版本" << endl;
  46. else
  47. cout << "当前操作系统版本是否与Windows 7 Service Pack 1(SP1)版本匹配或大于" << endl;
  48. else
  49. cout << "当前操作系统版本是否与Windows 8版本匹配或大于Windows 8版本" << endl;
  50. else
  51. cout << "指示当前操作系统版本是否与Windows 10版本匹配或大于Windows 10版本" << endl;
  52. return 0;
  53. }
  • 进程创建
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <versionhelpers.h>
  5. using namespace std;
  6. int main(TCHAR *env[])
  7. {
  8. DWORD ExitCode = NULL;
  9. // 创建线程和进程的安全结构体
  10. SECURITY_ATTRIBUTES ProcessSec = { 0 }; SECURITY_ATTRIBUTES ThreadSec = { 0 };
  11. ProcessSec.nLength = sizeof(ProcessSec); ThreadSec.nLength = sizeof(ThreadSec);
  12. ProcessSec.bInheritHandle = TRUE; ThreadSec.bInheritHandle = TRUE; // 指定线程和进程为可以继承
  13. STARTUPINFO StartInfo = { sizeof(STARTUPINFO) };
  14. StartInfo.cb = sizeof(StartInfo); // STARTUPINFO 结构体用于新进程窗口设置
  15. StartInfo.dwFlags = STARTF_USEPOSITION;
  16. StartInfo.dwX = 400; StartInfo.dwY = 400; // 防止窗口重叠
  17. PROCESS_INFORMATION ProcessInfo = { 0 }; // 返回进程信息的结构体
  18. // 创建进程打开 cmd.exe 执行模块
  19. TCHAR CmdLine[] = L"cmd.exe";
  20. BOOL res = CreateProcess(NULL, CmdLine, &ProcessSec, &ThreadSec, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &StartInfo, &ProcessInfo); // CREATE_NEW_CONSOLE 用于创建一个新的控制台窗口
  21. cout << "创建的新进程 ID: " << ProcessInfo.dwProcessId << endl; // ProcessInfo 结构体包含子进程和线程的 ID
  22. cout << "创建的新线程 ID: " << ProcessInfo.dwThreadId << endl;
  23. WaitForSingleObject(ProcessInfo.hThread, INFINITE); // 等待线程执行完毕
  24. CloseHandle(ProcessInfo.hThread); // ProcessInfo 结构体包含子进程和线程的句柄
  25. WaitForSingleObject(ProcessInfo.hProcess, INFINITE); // 等待进程执行完毕
  26. GetExitCodeProcess(ProcessInfo.hProcess, &ExitCode); // 获取进程退出代码
  27. cout << ExitCode << endl;
  28. CloseHandle(ProcessInfo.hProcess); // 关闭进程句柄
  29. return 0;
  30. }
  • 手动提升程序权限
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <strsafe.h>
  4. using namespace std;
  5. void ErrorExit(LPTSTR lpszFunction, DWORD LastError);
  6. int main(int argc, char *argv[], TCHAR *env[])
  7. {
  8. SHELLEXECUTEINFOW ExeInfo = { sizeof(ExeInfo) }; // 初始化结构体
  9. ExeInfo.lpVerb = TEXT("runas"); ExeInfo.lpFile = TEXT("cmd.exe"); ExeInfo.nShow = SW_SHOWNORMAL; // 设置操作的文件
  10. if (!ShellExecuteEx(&ExeInfo))
  11. {
  12. DWORD LastError = GetLastError(); // 获取权限失败,保存错误代码
  13. TCHAR ErrString[10] = L"错误代码";
  14. ErrorExit(ErrString, LastError); // 调用 ErrorExit 函数打印详细信息
  15. }
  16. else
  17. {
  18. cout << "调用成功" << endl;
  19. }
  20. return 0;
  21. }
  22. void ErrorExit(LPTSTR lpszFunction, DWORD LastError)
  23. {
  24. // 检索最后错误码的系统错误消息
  25. LPVOID lpMsgBuf;
  26. LPVOID lpDisplayBuf;
  27. DWORD dw = LastError; // 模拟错误代码定义为 123
  28. FormatMessage(
  29. FORMAT_MESSAGE_ALLOCATE_BUFFER | // 函数自动使用 LocalAlloc 函数,来为 lpBuffer 分配内存
  30. FORMAT_MESSAGE_FROM_SYSTEM | // 定义可以使用 GetLastError 的返回值赋给 dw
  31. FORMAT_MESSAGE_IGNORE_INSERTS, // 这个标志表示 Arguments 参数将被忽略
  32. NULL, // 消息所在位置,这个参数类型,根据dwFlags标志来设定
  33. dw, // 消息索引,如果 lpSource 是一个字符串,那么这个参数被忽略
  34. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 设置为本地默认语言
  35. (LPTSTR)&lpMsgBuf, // 接受消息字符串的内存块
  36. 0, // 内存大小
  37. NULL); // 消息中的参数
  38. // 显示错误消息并退出进程
  39. lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, // 将内存初始化为 0
  40. (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); // 为字符串指针区域申请足够大小的内存
  41. StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf), // 目标缓冲区和目标缓冲区的大小
  42. TEXT("%s %d 的含义是: %s"), // 格式字符串
  43. lpszFunction, // 参数1
  44. dw, // 参数2
  45. lpMsgBuf); // 参数3
  46. MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
  47. LocalFree(lpMsgBuf); // 释放空间
  48. LocalFree(lpDisplayBuf);
  49. ExitProcess(dw); // 关闭进程
  50. }
  • 查看是否为上下文管理员权限
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <shlobj.h>
  4. #include <strsafe.h>
  5. using namespace std;
  6. VOID WINAPI ErrorCodeTransformation(DWORD ErrorCode);
  7. DWORD WINAPI GetProcessElevation(TOKEN_ELEVATION_TYPE *pElevationType, BOOL* lsAdmin);
  8. int main(INT argc, CHAR *argv[], TCHAR *env[])
  9. {
  10. // pElevationType 为令牌的上下文权限类型,IsAdmin 标识是否为管理员权限
  11. TOKEN_ELEVATION_TYPE pElevationType; BOOL IsAdmin;
  12. if (GetProcessElevation(&pElevationType, &IsAdmin))
  13. {
  14. switch (pElevationType)
  15. {
  16. case TokenElevationTypeDefault:
  17. cout << "[-] 进程以默认用户运行,或者UAC被禁用" << endl; break;
  18. case TokenElevationTypeFull:
  19. cout << "[*] 进程的权限被成功提升,而且令牌没有被筛选过" << endl; break;
  20. case TokenElevationTypeLimited:
  21. cout << "[*] 进程使用和一个筛选过的令牌对应的受限的权限运行" << endl; break;
  22. }
  23. if (IsAdmin) cout << "[*] 进程为管理员权限" << endl;
  24. else cout << "[-] 进程为普通权限" << endl;
  25. }
  26. else
  27. {
  28. DWORD ErrorCode = GetProcessElevation(&pElevationType, &IsAdmin);
  29. ErrorCodeTransformation(ErrorCode);// 打印错误信息
  30. }
  31. return 0;
  32. }
  33. DWORD WINAPI GetProcessElevation(TOKEN_ELEVATION_TYPE *pElevationType, BOOL* pIsAdmin)
  34. {
  35. HANDLE hToken = NULL; DWORD dwSize; DWORD ErrorCode = NULL;
  36. // OpenProcessToken 用于打开当前进程的令牌,hToken 为令牌的句柄
  37. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
  38. {
  39. // 调用失败返回错误代码
  40. ErrorCode = GetLastError();
  41. return (ErrorCode);
  42. }
  43. BOOL bResult = FALSE;
  44. // GetTokenInformation 用于获取当前令牌是什么令牌,令牌种类储存在 pElevationType 中
  45. if (GetTokenInformation(hToken, TokenElevationType, pElevationType, sizeof(TOKEN_ELEVATION_TYPE), &dwSize))
  46. {
  47. BYTE adminSID[SECURITY_MAX_SID_SIZE];
  48. dwSize = sizeof(adminSID);
  49. // CreateWellKnownSid 定义一个描述符为 WinBuiltinAccessControlAssistanceOperatorsSid 的别名 SID
  50. // adminSID 中储存的是新的 SID
  51. CreateWellKnownSid(WinBuiltinAccessControlAssistanceOperatorsSid, NULL, &adminSID, &dwSize);
  52. // 如果当前进程的令牌被筛选过
  53. if (*pElevationType == TokenElevationTypeLimited)
  54. {
  55. HANDLE hUnfilteredToken = NULL;
  56. // 获取当前进程未筛选过令牌的句柄,句柄保存在 hUnfilteredToken
  57. GetTokenInformation(hToken, TokenLinkedToken, (VOID *)&hUnfilteredToken, sizeof(HANDLE), &dwSize);
  58. // CheckTokenMembership 用于将模拟令牌和创建的安全描述符做比较,判断令牌的上下文访问权限是否为管理员
  59. if (CheckTokenMembership(hUnfilteredToken, &adminSID, pIsAdmin)) bResult = TRUE;
  60. CloseHandle(hUnfilteredToken);
  61. }
  62. else
  63. { // IsUserAnAdmin 函数是 CheckTokenMembership 的包装函数
  64. // 建议直接调用该函数以确定管理员组状态,而不是调用 IsUserAnAdmin
  65. *pIsAdmin = IsUserAnAdmin();
  66. bResult = TRUE;
  67. }
  68. }
  69. CloseHandle(hToken);
  70. return (bResult);
  71. }
  72. // 如果返回错误,可调用此函数打印详细错误信息
  73. VOID WINAPI ErrorCodeTransformation(DWORD ErrorCode)
  74. {
  75. LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = ErrorCode;
  76. // 将错误代码转换为错误信息
  77. FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
  78. NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL
  79. );
  80. lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + 40) * sizeof(TCHAR));
  81. // 格式化打印
  82. StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf), TEXT("错误代码 %d : %s"), dw, lpMsgBuf);
  83. // 输出错误信息
  84. MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
  85. // 释放资源
  86. LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); ExitProcess(dw);
  87. }
  • 获取系统进程列表,操作进程句柄
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <shlobj.h>
  4. #include <strsafe.h>
  5. #include <stdio.h>
  6. #include <tlhelp32.h>
  7. using namespace std;
  8. VOID WINAPI ErrorCodeTransformation(DWORD ErrorCode);
  9. DWORD WINAPI ProcessInfo(VOID);
  10. DWORD WINAPI ProcessHandle(DWORD ProcessID);
  11. int main(INT argc, CHAR *argv[], TCHAR *env[])
  12. {
  13. DWORD ErrorCode = ProcessInfo();
  14. // 打印详细的错误信息
  15. ErrorCodeTransformation(ErrorCode);
  16. return 0;
  17. }
  18. DWORD WINAPI ProcessInfo(VOID)
  19. {
  20. // ErrorCode 用于统计错误信息,ProcessCount 用于统计进程数
  21. DWORD ErrorCode = NULL; INT ProcessCount = 0;
  22. // 使用 CreateToolhelp32Snapshot 获取当前所有的进程快照
  23. HANDLE ProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_INHERIT | TH32CS_SNAPALL, 0);
  24. if (ProcessSnapshot == INVALID_HANDLE_VALUE)
  25. {
  26. // 调用错误返回错误代码,以便查出详细的错误信息
  27. ErrorCode = GetLastError();
  28. return (ErrorCode);
  29. }
  30. PROCESSENTRY32W ProcessInfo; ProcessInfo.dwSize = sizeof(ProcessInfo); // 必须初始化结构体大小
  31. // Process32First 用于获取第一个进程,返回进程信息至 ProcessInfo 结构体
  32. BOOL DisResult = Process32First(ProcessSnapshot, &ProcessInfo);
  33. if (!DisResult)
  34. {
  35. // 调用错误返回错误代码,以便查出详细的错误信息
  36. ErrorCode = GetLastError();
  37. return (ErrorCode);
  38. }
  39. // 进程数量加一
  40. ProcessCount++;
  41. cout << " 显示进程 ID: " << ProcessInfo.th32ProcessID << endl;
  42. while (DisResult)
  43. {
  44. ProcessCount++;
  45. // 获取下一个进程的详细信息
  46. DisResult = Process32Next(ProcessSnapshot, &ProcessInfo);
  47. // 打印进程 ID
  48. cout << " ID: " << ProcessInfo.th32ProcessID;
  49. // 有关句柄的详细操作
  50. ProcessHandle(ProcessInfo.th32ProcessID);
  51. // 打印进程名称
  52. printf(" 进程名: %ls\n ", ProcessInfo.szExeFile);
  53. }
  54. return 0;
  55. }
  56. DWORD WINAPI ProcessHandle(DWORD ProcessID)
  57. {
  58. DWORD ErrorCode = NULL;
  59. // OpenProcess 将进程 ID 转换进程句柄,方便对进程进行操作
  60. HANDLE ProcessHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, TRUE, ProcessID);
  61. if (!ProcessHandle)
  62. {
  63. // 调用错误返回错误代码,以便查出详细的错误信息
  64. ErrorCode = GetLastError();
  65. if (ErrorCode == 5) cout << " 访问状态: 拒绝访问 ";
  66. return (ErrorCode);
  67. }
  68. else
  69. {
  70. // 操作进程句柄....
  71. }
  72. // 关闭句柄
  73. CloseHandle(ProcessHandle);
  74. return TRUE;
  75. }
  76. // 如果返回错误,可调用此函数打印详细错误信息
  77. VOID WINAPI ErrorCodeTransformation(DWORD ErrorCode)
  78. {
  79. LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = ErrorCode;
  80. // 将错误代码转换为错误信息
  81. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
  82. NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL
  83. );
  84. lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + 40) * sizeof(TCHAR));
  85. StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf), TEXT("错误代码 %d : %s"), dw, lpMsgBuf);
  86. // 弹窗显示错误信息
  87. MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
  88. LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); ExitProcess(dw);
  89. }

Windows核心编程笔记之进程的更多相关文章

  1. C++windows内核编程笔记day13 进程、线程与信号量

    Windows进程 进程是一个容器,包括程序运行须要的代码.数据.资源等信息, windows进程的特点: 每一个进程都有自己的ID号 每一个进程都有自己的地址空间.进程之间无法訪问对方的地址空间. ...

  2. Windows核心编程笔记之作业

    创建作业,并加以限制 HANDLE WINAPI CreateJob() { BOOL IsInJob = FALSE; DWORD ErrorCode = NULL; // 不能将已经在作业中的进程 ...

  3. Windows核心编程笔记之内核对象

    0x01 子进程继承父进程内核对象句柄 父进程 #include <Windows.h> #include <iostream> #include <strsafe.h& ...

  4. Windows核心编程笔记之错误处理

    0x01 GetLastError() 函数用于获取上一个操作的错误代码 #include <Windows.h> #include <iostream> using name ...

  5. Windows核心编程笔记之处理字符串

    0x01 ANSI 和宽字符定义 // ANSI 字符定义 CHAR varChar_1 = 'a'; // #typedef char CHAR CHAR varChar_2[] = "A ...

  6. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  7. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  8. 【转】《windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  9. Windows核心编程:第4章 进程

    Github https://github.com/gongluck/Windows-Core-Program.git //第4章 进程.cpp: 定义应用程序的入口点. // #include &q ...

随机推荐

  1. Spring Security 整合 微信小程序登录的思路探讨

    1. 前言 原本打算把Spring Security中OAuth 2.0的机制讲完后,用小程序登录来实战一下,发现小程序登录流程和Spring Security中OAuth 2.0登录的流程有点不一样 ...

  2. Apache配置 4.访问日志

    (1)介绍 访问日志作用很大,不仅可以记录网站的访问情况,还可以在网站有异常发生时帮助我们定位问题. (2)配置 # vi /usr/local/apache2.4/conf/extra/httpd- ...

  3. 基于sinc的音频重采样(一):原理

    我在前面的文章<音频开源代码中重采样算法的评估与选择>中说过sinc方法是较好的音频重采样方法,缺点是运算量大.https://ccrma.stanford.edu/~jos/resamp ...

  4. Dart简明教程

    [前言]Dart语言是使用flutter框架开发时候必备的语言,flutter是一个跨平台的框架,一套代码就可以完美实现安卓和ios两个平台,适配也很不错,Dart语言很友好,和java很类似,学习成 ...

  5. CobaltStrike 和 Metasploit 联动

    出品|MS08067实验室(www.ms08067.com) 本文作者:掉到鱼缸里的猫(Ms08067内网安全小组成员) 个人觉得CobaltStrike图形化的界面和丰富的功能,是一个超强的后渗透框 ...

  6. 9、MyBatis教程之多对一处理

    10.多对一处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 1.创建数据库 CREATE TABLE `teacher` ( `id` ...

  7. AggregateReport V2.2.0

    1. 说明 AggregateReport V2.2.0终于跟大家见面了!从V1.0.0到V2.2.0 宝路听取了很多同学的建议!感谢大家一路的信任与支持! 2. 文章导读 如果不了解此工具的同学,建 ...

  8. 【python小示例】简易彩票中奖模拟

    咱自己写个彩票程序,成功亏掉3个亿 今天突发奇想,自己设计一个小程序,模拟彩票中奖,看看如果自己有个彩票公司,能挣钱吗?代码如下: # -*- utf-8 -*- """ ...

  9. 文件连接--ln

    ln -n file1 file2  将文件2设置为文件1的软连接:file1和file2 任何一个改动都会反馈到另一方,删除源文件, 软连接文件不可用 ln -s file1 file2  将文件2 ...

  10. JS复制文本到粘贴板,前端H5移动端点击按钮复制文本

    <span id="codeNum">FTYHDSDW</span> <span class=" code-btn" id=&qu ...