-1

我正在尝试使用NtOpenProcess()我在城里找不到任何例子。

我收到一个错误,非常感谢任何帮助。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR szCmdLine, int showCmd)
{
    HANDLE handle;
    HWND myWindow =FindWindow(NULL, L"Notepad");
    PCLIENT_ID PID;
    GetWindowThreadProcessId(myWindow, (LPDWORD)&PID);
    ZwOpenProcess(&handle, PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, NULL,PID);
    return 0;
}

错误是

1>c:\users\asus\source\repos\windowsproject2\windowsproject2\windowsproject2.cpp(14): error C2065: 'PCLIENT_ID': undeclared identifier
1>c:\users\asus\source\repos\windowsproject2\windowsproject2\windowsproject2.cpp(14): error C2146: syntax error: missing ')' before identifier 'PID'
1>c:\users\asus\source\repos\windowsproject2\windowsproject2\windowsproject2.cpp(14): error C3861: 'NtOpenProcess': identifier not found
1>c:\users\asus\source\repos\windowsproject2\windowsproject2\windowsproject2.cpp(14): error C2146: syntax error: missing ';' before identifier 'PID'
1>c:\users\asus\source\repos\windowsproject2\windowsproject2\windowsproject2.cpp(14): error C2059: syntax error: ')'

这是我的包含文件。

#include <Windows.h>
#include <ntddk.h>
#include <Ntifs.h>
#include "stdafx.h"
4

1 回答 1

1

首先看代码:

FindWindow(NULL, L"Notepad");

你想要的更快

FindWindow(L"Notepad", 0);

因为 L"Notepad" 是类名(不是窗口名)和类名第一个参数。

PCLIENT_ID PID;
GetWindowThreadProcessId(myWindow, (LPDWORD)&PID);

指向内存的GetWindowThreadProcessId等待指针DWORD,它存储进程ID。但是您将未初始化的指针传递给随机内存。需要使用这个:

CLIENT_ID pid = { };
if (GetWindowThreadProcessId(myWindow, (PDWORD)&pid.UniqueProcess))

finally ObjectAttributesin callNtOpenProcess是必填参数,不能为 0。

关于未声明的标识符 - 所有这些都在其中声明ntifs.h和它的子标题(ntifs.h包括ntddk.k- 所以你不需要直接包含它)。windows.h和是冲突的问题ntifs.h- 许多常见的声明。如果您同时包含两者 - 您会遇到很多错误。但存在解决方案 - 包含ntifs.h在某些命名空间中。但即使在此之后,您也会遇到一些错误。但这也可以修复,如果深入了解错误来源。您还需要在此命名空间中包含自己的代码,以便轻松访问 ntifs 声明。最后你需要使用ntdll.libntdllp.lib(如果你使用它会与 CRT 库冲突)作为链接器输入。

因此,如果您想在自己的代码中使用本机 api,而不添加自定义标头,您可以在其中复制粘贴一些 nt 定义并在运行时不解析 api 的情况下调用它,但使用静态链接 - 这是可能的,但需要深入了解并了解您的内容正在做。例子

#define DECLSPEC_DEPRECATED_DDK

#define _XX_BEGIN   namespace XX {
#define _XX_END     }

_XX_BEGIN

struct _SECURITY_QUALITY_OF_SERVICE;
struct _CONTEXT;

_XX_END

#define _INC_MMSYSTEM  /* Prevent inclusion of mmsystem.h in windows.h */
#include <windows.h>

#pragma warning(disable : 4005)

_XX_BEGIN

#ifdef _RTL_RUN_ONCE_DEF
#undef _RTL_RUN_ONCE_DEF
#endif

#define RtlCompareMemory ::RtlCompareMemory

#include <ntifs.h>

_XX_END

#undef _INC_MMSYSTEM  /* Prevent inclusion of mmsystem.h in windows.h */
#include <MMSystem.h>

_XX_BEGIN

void demo()
{
    if (HWND myWindow = FindWindow(L"Notepad", 0))
    {
        CLIENT_ID pid = { };
        if (GetWindowThreadProcessId(myWindow, (PDWORD)&pid.UniqueProcess))
        {
            HANDLE handle;
            static OBJECT_ATTRIBUTES zoa = { sizeof(zoa) };
            if (0 <= NtOpenProcess(&handle, 
                PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 
                &zoa, &pid))
            {
                NtClose(handle);
            }
        }
    }
}
_XX_END
于 2018-02-26T11:21:59.140 回答