Private WS

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;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WS2812是一种全彩LED灯带控制芯片,可以通过单一的数据线来控制颜色和亮度。在安卓平台上,我们可以通过编写代码来控制WS2812,以下是一个简单的WS2812安卓代码示例: ```java import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.otaliastudios.arduino.Arduino; import com.otaliastudios.arduino.ArduinoListener; public class MainActivity extends AppCompatActivity { private Arduino arduino; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); arduino = new Arduino(this); arduino.setArduinoListener(new ArduinoListener() { @Override public void onArduinoAttached() { // 当Arduino设备连接时执行操作 } @Override public void onArduinoDetached() { // 当Arduino设备断开连接时执行操作 } @Override public void onArduinoMessage(byte[] bytes) { // 当接收到来自Arduino的消息时执行操作 } }); arduino.open(); } @Override protected void onDestroy() { super.onDestroy(); arduino.close(); } private void controlWS2812Color(int red, int green, int blue) { int color = Color.rgb(red, green, blue); // 将颜色值发送给WS2812控制器 arduino.send(new byte[] { (byte) red, (byte) green, (byte) blue }); } } ``` 在这个示例中,我们使用了一个名为"Arduino"的库来与WS2812进行通信。我们在`controlWS2812Color`方法中将颜色值转换为RGB格式并发送给WS2812控制器。当Arduino设备连接时,我们可以执行相应的操作。在应用程序销毁时,我们需要关闭与Arduino的连接以释放资源。 这只是一个简单的示例,实际开发中可能需要根据具体需求进行更详细的代码编写。希望这个示例能够帮助您在安卓平台上控制WS2812灯带。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值