Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++ QueryWorkingSet始终返回false_C++_Windows_Winapi - Fatal编程技术网

C++ QueryWorkingSet始终返回false

C++ QueryWorkingSet始终返回false,c++,windows,winapi,C++,Windows,Winapi,我试图得到一个进程的分配大小,由映像、私有和映射来描述。我使用QueryWorkingSet获取工作集信息,然后获取工作集块 当我第一次调用它时,GetLastError方法返回24,这是预期的,所以下次调用QueryWorkingSet时,我为块设置了不同的大小,但我得到的错误代码是998 我是否使用了QueryWorkingSet错误,或者我获取了具有错误访问权限的进程句柄,或者我的大小调整还不够 #include "pch.h" #include <Windows.h> #

我试图得到一个进程的分配大小,由映像、私有和映射来描述。我使用QueryWorkingSet获取工作集信息,然后获取工作集块

当我第一次调用它时,GetLastError方法返回24,这是预期的,所以下次调用QueryWorkingSet时,我为块设置了不同的大小,但我得到的错误代码是998

我是否使用了QueryWorkingSet错误,或者我获取了具有错误访问权限的进程句柄,或者我的大小调整还不够

#include "pch.h"
 #include <Windows.h>
 #include<WinDef.h>
 #include <psapi.h>
 #include <iostream>

typedef struct {
    DWORD img;
    DWORD map;
    DWORD prv;
} CommitCounters, *PCommitCounters;


BOOL  GetCommitCountersFromProcess(_In_ int pid, _Out_ PCommitCounters committedCounter ) {
    int numberOfTries = 3;
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    DWORD pageSz = si.dwPageSize;

    PSAPI_WORKING_SET_INFORMATION wsi, *pwsi;
    pwsi = &wsi;
    DWORD ws_size;
    MEMORY_BASIC_INFORMATION mbi, *pmbi;
    pmbi = &mbi;

    HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    wsi.NumberOfEntries = 0;

    QueryWorkingSet(processHandle, &wsi, sizeof(pwsi));
    BOOL res = false;
    committedCounter->img = 0;
    committedCounter->map = 0;
    committedCounter->prv = 0;

    while (numberOfTries > 0) {
    DWORD lastError = GetLastError();

        //ERROR_BAD_LENGTH
    if (lastError == 24) {
        ws_size = sizeof(wsi) + sizeof(PSAPI_WORKING_SET_INFORMATION) + sizeof(PSAPI_WORKING_SET_BLOCK) * wsi.NumberOfEntries;
        pwsi = (PSAPI_WORKING_SET_INFORMATION*) malloc(ws_size);

        pwsi->NumberOfEntries = wsi.NumberOfEntries;
        BOOL resQws = QueryWorkingSet(processHandle, &wsi, ws_size);
        DWORD teste = sizeof(wsi);
        if (resQws) {
            for (int i = 0; i < pwsi->NumberOfEntries; i++) {
                PSAPI_WORKING_SET_BLOCK ws_block = pwsi->WorkingSetInfo[1];
                //Access page information.
                SIZE_T size = VirtualQuery((LPCVOID*)ws_block.VirtualPage, &mbi, 1);
                if (size != 0 && pmbi ->State == 0x1000) {
                    switch (pmbi->Type)
                    {
                    case 0x1000000: // MEM_IMAGE
                        committedCounter->img += pageSz;
                        break;
                    case  0x40000: //MEM_MAPPED
                        committedCounter->map += pageSz;
                        break;
                    case 0x20000: //MEM_PRIVATE
                        committedCounter->prv += pageSz;
                        break;
                    }
                }
                else if (size == 0) {
                    return res;
                }
            }
            CloseHandle(processHandle);
            res = true;
            return res;
        }
        free(pwsi); 
    }
        numberOfTries--;
}

    CloseHandle(processHandle);
    return false;

}
#包括“pch.h”
#包括
#包括
#包括
#包括
类型定义结构{
德沃德·伊姆格;
德沃德地图;
德沃德prv;
}委托人*PCommitCounters;
BOOL getCommitCounters fromProcess(_In_uuuint pid,_Out_uupcommitCounters committedCounter){
int numberofthries=3;
系统信息系统;
GetSystemInfo&si;
DWORD pageSz=si.dwPageSize;
PSAPI工作集信息wsi,*pwsi;
pwsi=&wsi;
DWORD ws_尺寸;
存储器基本信息mbi,*pmbi;
pmbi=&mbi;
HANDLE processHandle=OpenProcess(进程查询信息|进程虚拟机读取,假,pid);
wsi.NumberOfEntries=0;
查询工作集(processHandle和wsi,sizeof(pwsi));
BOOL res=假;
committedCounter->img=0;
committedCounter->map=0;
committedCounter->prv=0;
while(尝试次数>0){
DWORD lastError=GetLastError();
//错误\u错误\u长度
如果(lastError==24){
ws_size=sizeof(wsi)+sizeof(PSAPI_WORKING_SET_信息)+sizeof(PSAPI_WORKING_SET_BLOCK)*wsi.NumberOfEntries;
pwsi=(PSAPI工作集信息*)malloc(ws大小);
pwsi->NumberOfEntries=wsi.NumberOfEntries;
BOOL resQws=queryworkset(processHandle,&wsi,ws_size);
DWORD teste=sizeof(wsi);
如果(resQws){
对于(int i=0;iNumberOfEntries;i++){
PSAPI_WORKING_SET_BLOCK ws_BLOCK=pwsi->WORKING SetInfo[1];
//访问页面信息。
SIZE\u T SIZE=VirtualQuery((LPCVOID*)ws\u block.VirtualPage和mbi,1);
如果(大小!=0&&pmbi->State==0x1000){
开关(pmbi->类型)
{
案例0x1000000://MEM_图像
committedCounter->img+=pageSz;
打破
案例0x40000://MEM_
committedCounter->map+=pageSz;
打破
案例0x20000://MEM_PRIVATE
committedCounter->prv+=pageSz;
打破
}
}
else if(大小==0){
返回res;
}
}
关闭手柄(processHandle);
res=真;
返回res;
}
自由(pwsi);
}
次数--;
}
关闭手柄(processHandle);
返回false;
}

您的代码中有一个输入错误。只要改变一下:

BOOL resQws = QueryWorkingSet(processHandle, &wsi, ws_size);
致:

然后调用成功


可能还有更多的错误,但我没有调查这些错误。

这里没有任何真正的错误检查。下一步如何解决这个问题呢?我不确定你的意思,但我调用GetLastError(),在那里我得到了我在问题中提到的值有多个调用api函数而没有进行错误检查。也许其中一个失败了。因为您没有检查,所以无法知道call
QueryWorkingSet
-
sizeof(pwsi)
中的.3-rd参数当然是错误的。@David然后有一行:
pwsi=(PSAPI\u WORKING\u SET\u INFORMATION*)malloc(ws\u size)
。当我发现并纠正了OP的问题时,我很惊讶你会“被抛弃”,尽管,正如我所说,可能还有其他问题。例如,
PSAPI_WORKING_SET_BLOCK ws_BLOCK=pwsi->WorkingSetInfo[1]看起来不对。嗯,好的,第二次调用QueryWorkingSet
BOOL resQws = QueryWorkingSet(processHandle, pwsi, ws_size);