Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ thread32第一个返回的假线程id_C++_Windows_Multithreading_Winapi - Fatal编程技术网

C++ thread32第一个返回的假线程id

C++ thread32第一个返回的假线程id,c++,windows,multithreading,winapi,C++,Windows,Multithreading,Winapi,Thread32First返回true,因此我知道函数没有失败。但是,它会不断为THREADENTRY32,0的th32ThreadID数据成员返回相同的值。不管我在哪个进程上尝试它,它仍然是相同的线程id:0 这是我的密码: #include <windows.h> #include <tlhelp32.h> #include <stdio.h> BOOL EnableDebugPriv(HANDLE proc); int main() { HA

Thread32First
返回true,因此我知道函数没有失败。但是,它会不断为
THREADENTRY32
,0的
th32ThreadID
数据成员返回相同的值。不管我在哪个进程上尝试它,它仍然是相同的线程id:0

这是我的密码:

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

BOOL EnableDebugPriv(HANDLE proc);

int main()
{
    HANDLE hSnapshot;

    HANDLE hThread;

    THREADENTRY32 thread32;

    DWORD dwPid     = 15404;

    EnableDebugPriv(OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid));

    hSnapshot       = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwPid);

    if(hSnapshot == INVALID_HANDLE_VALUE)
    {
        printf("Error getting snapshot: %lu\n", GetLastError());
        return 1;
    }

    thread32.dwSize = sizeof(THREADENTRY32);

    if(!Thread32First(hSnapshot, &thread32))
    {
        printf("Error thread32first\n");
        return 1;
    }

    printf("Thread Id: %lu\n", thread32.th32ThreadID);

    hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, thread32.th32ThreadID);

    if(hThread == NULL)
    {
        printf("Error getting handle: %lu\n", GetLastError());
        return 1;
    }

    return 0;
}

BOOL EnableDebugPriv(HANDLE proc)
{
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;
        // pass our opened process handle
        OpenProcessToken(proc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue);
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = sedebugnameValue;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        if(AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
        {
        CloseHandle(hToken);
        return TRUE;
        }
        else
        {
            MessageBox(NULL,"Bro, you gotta be an admin to set privs like this", "Shit", MB_OK);
            CloseHandle(hToken);
            return FALSE;
        }


}
#包括
#包括
#包括
BOOL EnableDebugPriv(handleproc);
int main()
{
处理hSnapshot;
处理hThread;
THREADENTRY32 thread32;
DWORD dwPid=15404;
EnableDebugPriv(OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid));
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwPid);
if(hSnapshot==无效的句柄值)
{
printf(“获取快照时出错:%lu\n”,GetLastError());
返回1;
}
thread32.dwSize=sizeof(THREADENTRY32);
如果(!Thread32First(hSnapshot和thread32))
{
printf(“错误线程32first\n”);
返回1;
}
printf(“线程Id:%lu\n”,thread32.th32ThreadID);
hThread=OpenThread(THREAD\u ALL\u ACCESS,FALSE,thread32.th32ThreadID);
if(hThread==NULL)
{
printf(“获取句柄时出错:%lu\n”,GetLastError());
返回1;
}
返回0;
}
BOOL EnableDebugPriv(句柄过程)
{
拉赫托肯;
LUID sedebugnameValue;
令牌特权tkp;
//传递我们打开的进程句柄
OpenProcessToken(proc、TOKEN、ADJUST、PRIVILEGES、TOKEN、QUERY和hToken);
LookupPrivilegeValue(NULL、SE_DEBUG_NAME和sedebugnameValue);
tkp.privilegecont=1;
tkp.Privileges[0]。Luid=sedebugnameValue;
tkp.Privileges[0]。属性=SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken、FALSE和tkp、tkp的大小、NULL、NULL))
{
闭合手柄(hToken);
返回TRUE;
}
其他的
{
MessageBox(NULL,“兄弟,你必须是管理员才能像这样设置priv”,“该死”,MB_OK);
闭合手柄(hToken);
返回FALSE;
}
}

注意:我知道使用像我这样的静态进程ID可能会导致问题。但是,我要确保进程仍然使用相同的进程ID运行。这不是问题。

您为什么不阅读文档?错误时返回
无效的\u句柄\u值
。完整示例代码可在@IInspectable获得。我已多次使用
CreateToolhelp32Snapshot
,错误地记住了返回值为
NULL
。我更正了它,再次运行了我的程序,但它没有返回无效的句柄值。出于某种原因,在我使用它的所有进程中,前3个线程id都是0,然后它变为12或更高。应该是这样吗?首先,快照中包含系统中的所有线程,因此第一个条目与进程无关。其次,你的
EnableDebugPriv
完全错了,你为什么不读呢
TH32CS_SNAPTHREAD
“[i]包括快照中系统中的所有线程。[…]若要标识属于特定进程的线程,请在枚举线程时将其进程标识符与THREADENTRY32结构的th32OwnerProcessID成员进行比较。”