导出ZwQueryInformationProcess函数

kaks888 2012-10-28 01:05:49
ZwQueryInformationProces是系统内核函数,在NtDLL.dll中,要导出时要用到GetProcAddress和LoadLibrary函数。问题是:GetProcAddress返回的是函数的地址,也就是指针,那我首先得声明一个函数指针,可是我这样声明有错误:
typedef NTSTATUS (*ZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);

typedef <error-type>(*ZwQueryInformationProcess)(HANDLE, PROCESSINFOCLASS,LPVOID, DWORD, PDWORD);不允许使用返回函数的函数

哪位大哥知道这个应该怎么声明才正确?感激不尽!
...全文
993 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaks888 2012-10-28
  • 打赏
  • 举报
回复
我加了个<afxwin.h>就好了。但是这个<afxwin.h>里面包含了很多头文件,还得试试。
schlafenhamster 2012-10-28
  • 打赏
  • 举报
回复
要是我没猜错的话。你这样将包含:
“WINNT.H” 它有 240K 长。
kaks888 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
我不知道 去掉“#define WIN32_LEAN_AND_MEAN ” 会增加多少 头文件。
通常 缺什么,补什么。而不是 这样干的,要不 微软 也不会 搞 这个。
[/Quote]
有道理。但是到底缺哪个头文件。我先去查查msdn。
schlafenhamster 2012-10-28
  • 打赏
  • 举报
回复
我不知道 去掉“#define WIN32_LEAN_AND_MEAN ” 会增加多少 头文件。
通常 缺什么,补什么。而不是 这样干的,要不 微软 也不会 搞 这个。
kaks888 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
"找到问题了!#define WIN32_LEAN_AND_MEAN "
给你碰巧了。
要是还不行咋办 ?
[/Quote]

大早上刚起来没睡醒,刚才出现这个问题脑子里一片空白,跑到这来等答案。最后仔细分析了一下,出现这个问题无外乎就是工程设置或头文件的问题,所以如果还不行的话我就在工程设置里解决,要再不行?那我就洗洗睡了……
schlafenhamster 2012-10-28
  • 打赏
  • 举报
回复
"找到问题了!#define WIN32_LEAN_AND_MEAN "
给你碰巧了。
要是还不行咋办 ?
kaks888 2012-10-28
  • 打赏
  • 举报
回复
真怀疑楼上两位前辈是来混分的……(别扇我)俺问题都解决了。不过还是谢谢你们,我==再结帖,这样也好做一个关于这个的帖子,给后来人提供些经验。来者有分!
schlafenhamster 2012-10-28
  • 打赏
  • 举报
回复
//
#define NTAPI __stdcall
typedef long NTSTATUS;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_SUCCESS ((NTSTATUS)0L)

enum PROCESS_INFO_CLASS { ProcessDebugPort = 7 };


typedef NTSTATUS (NTAPI *ZW_QUERY_INFORMATION_PROCESS)
(IN HANDLE ProcessHandle,
IN PROCESS_INFO_CLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength);

Eleven 2012-10-28
  • 打赏
  • 举报
回复

#include "stdafx.h"

#include <Windows.h>

typedef enum _PROCESSINFOCLASS {
ProcessBasicInformation,
ProcessQuotaLimits,
ProcessIoCounters,
ProcessVmCounters,
ProcessTimes,
ProcessBasePriority,
ProcessRaisePriority,
ProcessDebugPort,
ProcessExceptionPort,
ProcessAccessToken,
ProcessLdtInformation,
ProcessLdtSize,
ProcessDefaultHardErrorMode,
ProcessIoPortHandlers,
ProcessPooledUsageAndLimits,
ProcessWorkingSetWatch,
ProcessUserModeIOPL,
ProcessEnableAlignmentFaultFixup ,
ProcessPriorityClass,
ProcessWx86Information,
ProcessHandleCount,
ProcessAffinityMask,
ProcessPriorityBoost,
ProcessDeviceMap,
ProcessSessionInformation,
ProcessForegroundInformation,
ProcessWow64Information,
ProcessImageFileName,
ProcessLUIDDeviceMapsEnabled,
ProcessBreakOnTermination,
ProcessDebugObjectHandle,
ProcessDebugFlags,
ProcessHandleTracing,
ProcessUnknown33,
ProcessUnknown34,
ProcessUnknown35,
ProcessCookie,
MaxProcessInfoClass
} PROCESSINFOCLASS;


typedef NTSTATUS (WINAPI *PFN_ZwQueryInformationProcess)(HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength);

int main()
{
HMODULE hDll = LoadLibrary(_T("Ntdll.dll"));
if(NULL != hDll)
{
PFN_ZwQueryInformationProcess pFn_ZwQueryInformationProcess = (PFN_ZwQueryInformationProcess)GetProcAddress(hDll, "ZwQueryInformationProcess");
if(NULL != pFn_ZwQueryInformationProcess)
{
printf("Found it!!!\n");
}
}

if(NULL != hDll)
{
FreeLibrary(hDll);
hDll = NULL;
}
return 0;
}
kaks888 2012-10-28
  • 打赏
  • 举报
回复
找到问题了!#define WIN32_LEAN_AND_MEAN
都是这个宏在搞鬼。盖茨兄,你牛!
kaks888 2012-10-28
  • 打赏
  • 举报
回复
难道是头文件的问题?我前面有这些声明:
#include "stdafx.h"
#include "resource.h"
#include <string>
#include <ShellAPI.h>
#include <Psapi.h>
#pragma comment(lib, "psapi.lib")

其中#include "stdafx.h"是Windows窗体程序默认的那个,没改
kaks888 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
typedef <error-type>(*ZwQueryInformationProcess)(HANDLE, PROCESSINFOCLASS,LPVOID, DWORD, PDWORD);不允许使用返回函数的函数


这是报错么?

typedef NTSTATUS (WINAPI* pZwQueryInformationProcess)(
HANDLE, PROCESSINFO……
[/Quote]
大神终于来了!救命啊!

那个不是报错,那是这样写了之后,没编译的时候直接提示的错误(下划线)
typedef NTSTATUS (* pZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);
编译时的错误是:
error C2065: “pZwQueryInformationProcess”: 未声明的标识符
error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
error C2143: 语法错误 : 缺少“;”(在“(”的前面)
error C2226: 语法错误 : 意外的“HANDLE”类型
error C2059: 语法错误:“)”

如果我这样写
typedef NTSTATUS (WINAPI* pZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);
那么错误就是:
error C2059: 语法错误:“__stdcall”

我快崩溃啦!
傻X 2012-10-28
  • 打赏
  • 举报
回复
typedef <error-type>(*ZwQueryInformationProcess)(HANDLE, PROCESSINFOCLASS,LPVOID, DWORD, PDWORD);不允许使用返回函数的函数


这是报错么?

typedef NTSTATUS (WINAPI* pZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);

这就是官方写法啊
kaks888 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
估计你是没有引入相应头文件:

typedef NTSTATUS (WINAPI* pZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);

也行

WINAPI == __stdcall
[/Quote]

这个我知道啊。我也在想是不是头文件的问题。但是我引入了<ntstatus.h>还是没用。而且不引入头文件的时候也没报错啊。
FASM_FASM 2012-10-28
  • 打赏
  • 举报
回复
估计你是没有引入相应头文件:

typedef NTSTATUS (WINAPI* pZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);

也行

WINAPI == __stdcall
kaks888 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
typedef NTSTATUS (__stdcall* pZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);
[/Quote]
还是不行啊
error C2059: 语法错误:“__stdcall”

哎!我看MSDN该函数声明是这样的啊:
NTSTATUS WINAPI ZwQueryInformationProcess(
_In_ HANDLE ProcessHandle,
_In_ PROCESSINFOCLASS ProcessInformationClass,
_Out_ PVOID ProcessInformation,
_In_ ULONG ProcessInformationLength,
_Out_opt_ PULONG ReturnLength
);
为什么不行呢?郁闷!
FASM_FASM 2012-10-28
  • 打赏
  • 举报
回复
typedef NTSTATUS (__stdcall* pZwQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS,
LPVOID, DWORD, PDWORD);

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧