Kingofforest666 2023-07-10 19:14 采纳率: 100%
浏览 66
已结题

Win32程序卡死在循环里


#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <string.h>
#include <psapi.h>

WINAPI int WinMain(HINSTANCE hInstance, HINSTANCE hPreInstacne, LPSTR lpCmdLine, int nCmdShow)
{
    HANDLE pHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32 process32;
    process32.dwSize = sizeof(process32);
    BOOL bReturn = Process32First(pHandle,&process32); 
    wchar_t* dest;
    int srcSize = strlen(lpCmdLine);
    dest = (wchar_t*)malloc((srcSize+1)*2);
    memset(dest,0,(srcSize+1)*2);
    mbstowcs(dest,lpCmdLine,srcSize); 
    *(dest+srcSize) = L'\0'; //dest = L"Twinkstar.exe"
    while(bReturn)
    { 
        if(!wcscmp(dest,(wchar_t*)process32.szExeFile))
        {
            LPSTR path = (LPSTR)malloc(256);
            memset(path,0,256);
            HANDLE process = OpenProcess(PROCESS_ALL_ACCESS ,FALSE,process32.th32ProcessID);
            GetModuleFileNameExA(process,NULL,path,sizeof(path));
            printf("%s",path);
            free(path);
            path = NULL;
            break;
        }
        Process32Next(pHandle,&process32);
    }
    free(dest);
    dest = NULL;
}
    
  • 需求:编写一个程序,传入进程名字,输出进程所在路径

  • 问题:程序运行后卡死

img

  • 打开GDB调试:
  • 传入参数 Twinkstar.exe:

    img

  • 第17行下断点:

    img


    img

  • 第17行dest = L""

    img

  • 步进,第18行dest="Twinkstar.exe"
  • dest成功接收了lpCmdLine的值传递

    img

  • 继续运行,GDB直接卡死,推测问题就在循环里

    img

  • 写回答

6条回答 默认 最新

  • 急速光粒 2023-07-10 20:54
    关注

    程序问题比较多,主要是字符串转换错误,字符串比较不一致就会陷入死循环,做了修改,参考一下:
    运行参数指定为"winlogon.exe"试一下:

    int WINAPI  WinMain(HINSTANCE hInstance, HINSTANCE hPreInstacne, LPSTR lpCmdLine, int nCmdShow)
    {
        HANDLE pHandle = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
        PROCESSENTRY32 process32;
        process32.dwSize = sizeof(process32);
        BOOL bReturn = Process32First(pHandle, &process32);
        char* dest;
        int srcSize = strlen(lpCmdLine);
        dest = (char*)malloc(srcSize + 1);
        memset(dest, 0, srcSize + 1);
        strcpy(dest, lpCmdLine);
        *(dest + srcSize) = L'\0'; //dest = L"Twinkstar.exe"
        while (bReturn)
        {
            if (!strcmp(dest, process32.szExeFile))
            {
                LPSTR path = (LPSTR)malloc(256);
                memset(path, 0, 256);
                HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process32.th32ProcessID);
                int nErr = GetLastError();
                GetModuleFileNameExA(process, NULL, path, 256);
                printf("%s", path);
                free(path);
                path = NULL;
                break;
            }
            Process32Next(pHandle, &process32);
        }
        free(dest);
        dest = NULL;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月10日
  • 已采纳回答 7月10日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改
  • ¥15 Windows 系统cmd后提示“加载用户设置时遇到错误”
  • ¥50 vue router 动态路由问题
  • ¥15 关于#.net#的问题:End Function
  • ¥15 无法import pycausal
  • ¥15 VS2022创建MVC framework提示:预安装的程序包具有对缺少的注册表值的引用
  • ¥15 weditor无法连接模拟器Local server not started, start with?
  • ¥20 6-3 String类定义
  • ¥15 嵌入式--定时器使用