Private WS

本文介绍了如何通过Windows内核API获取进程的专用工作集(PrivateWS)信息,并提供了具体的代码实现。专用工作集是任务管理器中显示的内存大小,文中详细解释了数据结构和调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Private WS

Private WS,专用工作集,即任务管理器默认显示的[内存大小][6],微软并没有给出API来获取这个值,直到我阅读了[Process Hacker][6]的源码。向作者致敬,开源如此优秀的作品。

Process Hacker链接:Process Hacker

数据类型

typedef struct _MEMORY_WORKING_SET_BLOCK
{
    ULONG_PTR Protection : 5;
    ULONG_PTR ShareCount : 3;
    ULONG_PTR Shared : 1;
    ULONG_PTR Node : 3;
#ifdef _WIN64
    ULONG_PTR VirtualPage : 52;
#else
    ULONG VirtualPage : 20;
#endif
} MEMORY_WORKING_SET_BLOCK, *PMEMORY_WORKING_SET_BLOCK;

typedef struct _MEMORY_WORKING_SET_INFORMATION
{
    ULONG_PTR NumberOfEntries;
    MEMORY_WORKING_SET_BLOCK WorkingSetInfo[1];
} MEMORY_WORKING_SET_INFORMATION, *PMEMORY_WORKING_SET_INFORMATION;

MEMORY_INFORMATION_CLASS

typedef enum _MEMORY_INFORMATION_CLASS
{
    MemoryBasicInformation, // MEMORY_BASIC_INFORMATION
    MemoryWorkingSetInformation, // MEMORY_WORKING_SET_INFORMATION
    MemoryMappedFilenameInformation, // UNICODE_STRING
    MemoryRegionInformation, // MEMORY_REGION_INFORMATION
    MemoryWorkingSetExInformation, // MEMORY_WORKING_SET_EX_INFORMATION
    MemorySharedCommitInformation, // MEMORY_SHARED_COMMIT_INFORMATION
    MemoryImageInformation // MEMORY_IMAGE_INFORMATION
} MEMORY_INFORMATION_CLASS;

实现代码

NTSTATUS GetProcessWorkingSetInformation(
    _In_ HANDLE ProcessHandle,
    _Out_ PMEMORY_WORKING_SET_INFORMATION *WorkingSetInformation
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    PVOID buffer = NULL;
    SIZE_T bufferSize = 0;

    bufferSize = 0x800;
    buffer = malloc(bufferSize);

    while ((status = NtQueryVirtualMemory(
        ProcessHandle,
        NULL,
        MemoryWorkingSetInformation,
        buffer,
        bufferSize,
        NULL
        )) == STATUS_INFO_LENGTH_MISMATCH)
    {
        free(buffer);
        bufferSize *= 2;

        // Fail if we're resizing the buffer to something very large.
        if (bufferSize > PH_LARGE_BUFFER_SIZE)
            return STATUS_INSUFFICIENT_RESOURCES;

        buffer = malloc(bufferSize);
    }

    if (!NT_SUCCESS(status))
    {
        free(buffer);
        return status;
    }

    *WorkingSetInformation = (PMEMORY_WORKING_SET_INFORMATION)buffer;

    return status;
}

NTSTATUS GetProcessWsCounters(
    _In_ HANDLE ProcessHandle,
    _Out_ PPROCESS_WS_COUNTERS WsCounters
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    PMEMORY_WORKING_SET_INFORMATION wsInfo = NULL;
    PROCESS_WS_COUNTERS wsCounters = {0};
    ULONG i = 0;

    if (!NT_SUCCESS(status = GetProcessWorkingSetInformation(
        ProcessHandle,
        &wsInfo
        )))
        return status;

    memset(&wsCounters, 0, sizeof(PROCESS_WS_COUNTERS));

    for (i = 0; i < wsInfo->NumberOfEntries; i++)
    {
        wsCounters.NumberOfPages++;

        if (wsInfo->WorkingSetInfo[i].ShareCount > 1)
            wsCounters.NumberOfSharedPages++;
        if (wsInfo->WorkingSetInfo[i].ShareCount == 0)
            wsCounters.NumberOfPrivatePages++;
        if (wsInfo->WorkingSetInfo[i].Shared)
            wsCounters.NumberOfShareablePages++;
    }

    free(wsInfo);

    *WsCounters = wsCounters;

    return status;
}

调用

PROCESS_WS_COUNTERS wsCounters = { 0 };
SIZE_T PrivateWS = 0;
//// Try to open a process handle with PROCESS_QUERY_INFORMATION access for
// WS information.
GetProcessWsCounters(hProcess, &wsCounters);
PrivateWS  = wsCounters.NumberOfPrivatePages * PAGE_SIZE;

How to get page size

SYSTEM_INFO SysInfo = { 0 };
DWORD       dwPageSize = 0;

GetSystemInfo( &SysInfo );
dwPageSize = SysInfo.dwPageSize;
<think>好的,我需要解释用户提供的代码片段“private _ws: WebSocket = null;”在Cocos Creator中的作用。首先,用户可能对TypeScript的类成员声明不太熟悉,特别是访问修饰符和类型注解。 这段代码出现在Cocos Creator项目中,通常用于管理WebSocket连接。关键字“private”表示这个变量是类的私有成员,只能在类内部访问,外部无法直接修改,这有助于封装和数据保护。 “_ws”是变量名,前面的下划线通常表示这是一个私有变量,虽然TypeScript的private已经限制了访问,但加上下划线是常见的命名约定,提高代码可读性。 “WebSocket”是变量类型,说明这个变量用于保存WebSocket连接的实例。初始化为null表示在创建类实例时,WebSocket连接尚未建立,需要在适当的时候(比如初始化方法中)进行赋值。 用户可能想了解这个声明在项目中的具体应用场景,比如网络通信、实时数据传输等。需要提到在Cocos Creator中使用WebSocket进行游戏服务器通信的典型例子,比如多人游戏、实时排行榜等。 可能还需要说明在生命周期方法中如何正确创建和销毁WebSocket连接,避免内存泄漏。例如,在onLoad方法中初始化连接,在onDestroy方法中关闭连接。 另外,应该提到错误处理和事件监听,比如处理onopen、onmessage、onerror、onclose事件,以确保连接的健壮性。给出一个简单的代码示例,展示如何在实际中使用这个私有变量。 总结时,强调这种封装方式的好处,比如代码可维护性、防止外部不当访问,以及资源管理的注意事项。确保用户理解这个代码行在项目结构中的作用和最佳实践。</think>在 Cocos Creator(TypeScript) 项目中,`private _ws: WebSocket = null;` 这段代码的作用是: 1. **声明私有属性** - `private` 访问修饰符表示这是一个类的私有成员,只能在当前类内部访问 - 外部类/脚本无法直接访问或修改这个 WebSocket 实例 - 这是面向对象编程中常见的封装实践 2. **类型注解** - `: WebSocket` 表示该变量将存储 WebSocket 对象 - TypeScript 的类型系统会强制检查赋值类型 3. **初始化赋值** - `= null` 表示初始化时设置为空 - 通常在生命周期回调(如 onLoad)中创建实际连接: ```typescript this._ws = new WebSocket("ws://yourserver.com"); ``` 4. **命名约定** - 下划线前缀 `_ws` 是常见的私有变量命名惯例(尽管 TypeScript 的 private 修饰符已强制封装) - 提高代码可读性,提醒开发者这是内部实现 5. **典型使用场景** ```typescript export class NetworkManager { private _ws: WebSocket = null; onLoad() { this._ws = new WebSocket("wss://game-server.example"); this._ws.onmessage = (event) => { console.log("Received:", event.data); }; } sendData(data: string) { if (this._ws && this._ws.readyState === WebSocket.OPEN) { this._ws.send(data); } } onDestroy() { this._ws?.close(); // 安全销毁连接 } } ``` **注意事项**: 1. 需要在适当时机(如组件销毁时)手动关闭连接 2. 建议添加错误处理: ```typescript this._ws.onerror = (error) => { console.error("WebSocket Error:", error); }; ``` 3. WebSocket 是浏览器原生 API,在原生平台需要特殊处理 4. 使用前需检查运行环境是否支持 WebSocket 这种模式在需要网络通信的功能中很常见,例如: - 多人实时对战 - 聊天系统 - 实时排行榜同步 - 服务器指令推送等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值