gz,up , Win2K/NT下怎么能够获得 ring0 的。
解决方案 »
- 在clistctrl子类中动态创建一列按钮,如何响应?
- 弱弱,winmain()参数太长,怎么得到的?
- DECLARE_DYNAMIC DECLARE_DYNCREATE 很相识
- 如何象VC编程环境一样:菜单可以浮动?
- 救命呀! 一个很急的问题! 串行化和内存增长的问题!
- 急啊,大家帮帮忙,完成端口多线程实现的问题!
- 如何对一个文件夹加密呢。
- 求一个ATL做的 NT service 源程序,结构清晰,有些关于这类型程序的注解。100分相送。
- win7下安装LSP失败,谁知道怎么解决吗?
- 在BC5.0下怎么实现工具栏平面按钮?最好请专家们列出完整的源代码。
- 请问各位,MFC函数和WIN32函数有什么区别
- 向诸位高手请教……
Driver怎么写?
标 题: nt平台下,应用层上读写物理内存1
发信站: 武汉白云黄鹤站 (Mon Aug 7 09:56:09 2000) , 站内信件一般来说,操作物理内存必须在核心态,如果要操作物理内存,必须写一个sys。
关于如何在核态下读写物理内存,到处都是sample,我就不废话了。
在这里,我们简单的回顾一下在nt的核心态下操作物理内存的方法,不管是
在核心态还是在用户态,都只能操作线性地址,要操作物理地址,首先必须
转化成线性地址,然后才能访问之。对于这个原理,请大家看看保护模式的
内存原理。之所以在应用层上难以访问物理地址,原因就在于1该物理地址没有
对应的选择子,2无法建立一个线性地址与其对应。
95下有一个mapphytoliner,linux下有vmap,这些系统调用得工作都是为这个物理
地址建立一个选择子,也即用一个线性地址与其对应。但是关键是mapphytoliner(9x),mapviewofsection(nt)什么
的都要在核心态才能调用,所以我们才必须写一个sys,vxd什么的。但是让我们欣喜的是,这几个系统服务虽然都是要在核心态才能调用,
但是用户态有这些服务相对应的函数,我们可以在用户态调用这些函数,
达到我们的目的。不要在msdn里找,这个里面是没有的,这几个函数都是native api,说起到
nt平台下的api,一般人都立即想到了win32api,但是nt号称多头蛇操作系统,
除了支持win32,还有posix,os/2。这些api在进行系统调用的时候,多半要
都要和native api打交道,这个native api就是ntdll.dll输出的函数。native api
很有用,他不依赖于任何环境子系统。ms的这些函数都是不公开的,不过在
ddk里有很多系统服务和他对应,象ntcreatefile就和zwcreatefile对应。在应用程序中如何使用ntdll.dll里输出的函数呢?现在我们用着vc6,
幸福的使用着动态连接库,很多人除了在settings->link->xx.lib之外,什么都不
会,不过这也不能怪他们,他们的时候一切都很方便了。但是我们现在找一本
讲述dll的书,一般都有动态加载得方法,我相信任何一本讲dll的书都会
讲这个方法,不过由于太不方便,我们很少去注意罢了。
为了使不知道得弟兄们不用回去再翻书,我在这简单的描述一下。
先定义一个指向函数的指针ntunmapviewofsection,然后...
if( !(NtUnmapViewOfSection = (void *) GetProcAddress( GetModuleHandle("ntdll.dll"),
"NtUnmapViewOfSection" )) ) { return FALSE;
于是乎,这个指针就真的指向了那个函数的入口,于是我们就可以调用了。要访问物理内存,必须输出这么几个函数:
RtlInitUnicodeString
NtUnmapViewOfSection
NtOpenSection
NtMapViewOfSection
RtlNtStatusToDosError
函数不多,而且在sys里访问过物理内存的弟兄们肯定会觉得眼熟,是的
这些native api和那些系统服务几乎是一样的,不同的是这些可以在用户
态调用。
下面的工作就和在核心态里访问物理内存一样了,前面我已经说过
这方面的例子到处都是,我就不多废话了。
附注:由于scz要我自暴其丑,本来我是无论如何也不答应的,
但是昨天我欠了scz一个情,只好回去翻了翻,发现了一个很早
做的一个东西,就贴上来了。
那里有很多“关于如何在核态下读写物理内存,到处都是sample”,可否帮小弟一把,发几个过来,或者是这方面的资料,小弟我现在可急了!!!
[email protected]
多谢多谢
by the way !NT SDK 那里有下载的!!
错,不管是NT打头还是ZW打头,实际上都是可以在ring3调用的,(你可以看看NTdll.dll的导出表,两个函数都是存在的),ZW好像是从上一代NT遗留下来的,DDK里面好像对此有解释。而且winnt.h里也没有Native Api的定义,据我所知,要用Native Api必须自己定义函数和数据结构,没有现成的头文件。
to : TeddyWing(胡涂窗口):
关于native api 可否说详细一些,或者给我一点例子?[email protected]
多谢多谢
/////////////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
//#include <stdio.h>
//#include <stdlib.h>
#include "Ntsecapi.h"//#ifndef NTSTATUS
// typedef unsigned long NTSTATUS;
//#endif#ifndef USHORT
typedef unsigned short USHORT;
#endif#ifndef ULONG
typedef unsigned long ULONG;
#endif#ifndef DWORD
typedef unsigned long DWORD;
#endif#ifndef LONG
typedef long LONG;
#endif#ifndef LONGLONG
typedef __int64 LONGLONG;
#endiftypedef LONG KPRIORITY;typedef enum SYSTEM_INFORMATION_CLASS{
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts,
SystemConfigurationInformation,
SystemProcessorTimes,
SystemGlobalFlag,
SystemNotImplemented2,
SystemModuleInformation,
SystemLockInformation,
SystemNotImplemented3,
SystemNotImplemented4,
SystemNotImplemented5,
SystemHandleInformation,
SystemObjectInformation,
};typedef enum _KWAIT_REASON {
Executive,
FreePage,
PageIn,
PoolAllocation,
DelayExecution,
Suspended,
UserRequest,
WrExecutive,
WrFreePage,
WrPageIn,
WrPoolAllocation,
WrDelayExecution,
WrSuspended,
WrUserRequest,
WrEventPair,
WrQueue,
WrLpcReceive,
WrLpcReply,
WrVirtualMemory,
WrPageOut,
WrRendezvous,
Spare2,
Spare3,
Spare4,
Spare5,
Spare6,
WrKernel,
MaximumWaitReason
} KWAIT_REASON;typedef enum{
StateInitialized,
StateReady,
StateRunning,
StateStandby,
StateTerminated,
StateWait,
StateTransition,
StateUnknown,
} THREAD_STATE;typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;typedef enum _POOL_TYPE {
NonPagedPool,
PagedPool,
NonPagedPoolMustSucceed,
DontUseThisType,
NonPagedPoolCacheAligned,
PagedPoolCacheAligned,
NonPagedPoolCacheAlignedMustS,
MaxPoolType // end_wdm
,
//
// Note these per session types are carefully chosen so that the appropriate
// masking still applies as well as MaxPoolType above.
// NonPagedPoolSession = 32,
PagedPoolSession = NonPagedPoolSession + 1,
NonPagedPoolMustSucceedSession = PagedPoolSession + 1,
DontUseThisTypeSession = NonPagedPoolMustSucceedSession + 1,
NonPagedPoolCacheAlignedSession = DontUseThisTypeSession + 1,
PagedPoolCacheAlignedSession = NonPagedPoolCacheAlignedSession + 1,
NonPagedPoolCacheAlignedMustSSession = PagedPoolCacheAlignedSession + 1, // begin_wdm} POOL_TYPE;
typedef CLIENT_ID *PCLIENT_ID;typedef struct _VM_COUNTERS {
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} VM_COUNTERS;
typedef VM_COUNTERS *PVM_COUNTERS;typedef struct _SYSTEM_BASIC_INFORMATION
{
ULONG Unknown;
ULONG MaximumIncrement;
ULONG PhysicalPageSize;
ULONG NumberOfPhysicalPages;
ULONG LowestPhysicalPage;
ULONG HighestPhysicalPage;
ULONG AllocationGranularity;
ULONG LowestUserAddress;
ULONG HighestUserAddress;
ULONG ActiveProcessors;
ULONG NumberProcessors;
}SYSTEM_BASIC_INFORMATION,*PSYSTEM_BASIC_INFORMATION;typedef struct _SYSTEM_PROCESSOR_INFORMATION
{
USHORT ProcessorArchitecture;
USHORT ProcessorLevel;
USHORT ProcessorRevision;
USHORT Unknown;
USHORT FeatureBits;
}SYSTEM_PROCESSOR_INFORMATION,*PSYSTEM_PROCESSOR_INFORMATION;typedef struct _SYSTEM_PERFORMANCE_INFORMATION
{
LARGE_INTEGER IdleTime;
LARGE_INTEGER ReadTransferCount;
LARGE_INTEGER WriteTransferCount;
LARGE_INTEGER OtherTransferCount;
ULONG ReadOperationCount;
ULONG WriteOperationCount;
ULONG OtherOperationCount;
ULONG AvailablePages;
ULONG TotalCommittedPages;
ULONG TotalCommitLimit;
ULONG PeakCommitment;
ULONG PageFaults;
ULONG WriteCopyFaults;
ULONG TransitionFaults;
ULONG Reserved1;
ULONG DemandZeroFaults;
ULONG PagesRead;
ULONG PageReadIos;
ULONG Reserved2[2];
ULONG PagefilePagesWritten;
ULONG PagefilePageWriteIos;
ULONG MappedFilePagesWritten;
ULONG MappedFilePageWriteIos;
ULONG PagedPoolUsage;
ULONG NonPagedPoolUsage;
ULONG PagedPoolAllocs;
ULONG PagedPoolFrees;
ULONG NonPagedPoolAllocs;
ULONG NonPagedPoolFrees;
ULONG TotalFreeSystemPtes;
ULONG SystemCodePage;
ULONG TotalSystemDriverPages;
ULONG TotalSystemCodePages;
ULONG SmallNonPagedLookasideListAllocateHits;
ULONG SmallPagedLookasideListAllocateHits;
ULONG Reserved3;
ULONG MmSystemCatchePage;
ULONG PagedPoolPage;
ULONG SystemDriverPage;
ULONG FastReadNoWait;
ULONG FastReadWait;
ULONG FastReadResourceMiss;
ULONG FastReadNotPossible;
ULONG FastMdlReadNoWait;
ULONG FastMdlReadWait;
ULONG FastMdlReadResourceMiss;
ULONG FastMdlReadNotPossible;
ULONG MapDataNoWait;
ULONG MapDataWait;
ULONG MapDataNoWaitMiss;
ULONG MapDataWaitMiss;
ULONG PinMappedDataCount;
ULONG PinReadNoWait;
ULONG PinReadWait;
ULONG PinReadNoWaitMiss;
ULONG PinReadWaitMiss;
ULONG CopyReadNoWait;
ULONG CopyReadWait;
ULONG CopyReadNoWaitMiss;
ULONG CopyReadWaitMiss;
ULONG MdlReadNoWait;
ULONG MdlReadWait;
ULONG MdlReadNoWaitMiss;
ULONG MdlReadWaitMiss;
ULONG ReadAheadIos;
ULONG LazyWriteIos;
ULONG LazyWritePages;
ULONG DataFlushes;
ULONG Datapages;
ULONG ContextSwitches;
ULONG FirstLevelTbFills;
ULONG SecondLevelTbFills;
ULONG SystemCalls;
}SYSTEM_PERFORMANCE_INFORMATION,*PSYSTEM_PERFORMANCE_INFORMATION;typedef struct ThreadSysInfo_t {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
KWAIT_REASON WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS; typedef struct _SYSTEM_LOCK_INFORMATION{
PVOID Address;
USHORT Type;
USHORT Reserved1;
ULONG ExclusiveOwnerThreadId;
ULONG ActiveCount;
ULONG ContentionCount;
ULONG Reserved2[2];
ULONG NumberOfSharedWaiters;
ULONG NumberOfExclusiveWaiters;
}SYSTEM_LOCK_INFORMATION,*PSYSTEM_LOCK_INFORMATION;typedef struct _SYSTEM_HANDLE_INFORMATION{
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags; // 0x01 = PROTECT FROM CLOSE ,0x02 = INHERIT
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
}SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;typedef struct _SYSTEM_OBJECT_TYPE_INFORMATION{
ULONG NextEntryOffset;
ULONG ObjectCount;
ULONG HandleCount;
ULONG TypeNumber;
ULONG InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ACCESS_MASK ValidAccessMask;
POOL_TYPE PoolType;
UCHAR Unknown;
UNICODE_STRING Name;
}SYSTEM_OBJECT_TYPE_INFORMATION, *PSYSTEM_OBJECT_TYPE_INFORMATION;typedef struct _SYSTEM_OBJECT_INFORMATION{
ULONG NextEntryOffset;
PVOID Object;
ULONG CreatorProcessID;
USHORT Unknown;
USHORT Flags;
ULONG PointerCount;
ULONG HandleCount;
ULONG PagedPoolUsage;
ULONG NonPagedPoolUsage;
ULONG ExclusiveProcessId;
PSECURITY_DESCRIPTOR SecurityDescriptor;
UNICODE_STRING Name;
}SYSTEM_OBJECT_INFORMATION, *PSYSTEM_OBJECT_INFORMATION;typedef struct _SYSTEM_PROCESS{
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
ULONG BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
IO_COUNTERS IoCounters; // For Windows 2000 only
SYSTEM_THREADS Threads[1];
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES; typedef NTSTATUS (__stdcall *NtQuerySystemInformation1)(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
我找到了关于huyuguang (不再困惑)的信息了,多谢各位的热情参与,我还想让这个帖子继续下去
多谢指教!我是说错了。NT开头的DDK中有没有定义我不清楚。ZW开头的在ntdll.h这个文件是有定义的。请看这一段代码:
#include "ntdll.h"
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <map>
#pragma warning(disable:4786) // identifier was truncated in the debug info
struct OBJECTS_AND_TYPES {
std::map<ULONG, NT::PSYSTEM_OBJECT_TYPE_INFORMATION, std::less<ULONG> >
types;
std::map<PVOID, NT::PSYSTEM_OBJECT_INFORMATION, std::less<PVOID> >
objects;
};
std::vector<NT::SYSTEM_HANDLE_INFORMATION> GetHandles()
{
ULONG n;
PULONG p = new ULONG[n = 0x100];
while (NT::ZwQuerySystemInformation(NT::SystemHandleInformation,
p, n * sizeof *p, 0)
== STATUS_INFO_LENGTH_MISMATCH)
delete [ ] p, p = new ULONG[n *= 2];
NT::PSYSTEM_HANDLE_INFORMATION h = NT::PSYSTEM_HANDLE_INFORMATION(p + 1);
return std::vector<NT::SYSTEM_HANDLE_INFORMATION>(h, h + *p);
}
OBJECTS_AND_TYPES GetObjectsAndTypes()
{
ULONG n;
PCHAR p = new CHAR[n = 0x1000];
while (NT::ZwQuerySystemInformation(NT::SystemObjectInformation,
p, n * sizeof *p, 0)
== STATUS_INFO_LENGTH_MISMATCH)
delete [ ] p, p = new CHAR[n *= 2];
OBJECTS_AND_TYPES oats;
for (NT::PSYSTEM_OBJECT_TYPE_INFORMATION
t = NT::PSYSTEM_OBJECT_TYPE_INFORMATION(p); ;
t = NT::PSYSTEM_OBJECT_TYPE_INFORMATION(p + t->NextEntryOffset)) {
oats.types[t->TypeNumber] = t;
for (NT::PSYSTEM_OBJECT_INFORMATION
o = NT::PSYSTEM_OBJECT_INFORMATION(PCHAR(t->Name.Buffer)
+ t->Name.MaximumLength); ;
o = NT::PSYSTEM_OBJECT_INFORMATION(p + o->NextEntryOffset)) {
oats.objects[o->Object] = o;
if (o->NextEntryOffset == 0) break;
}
if (t->NextEntryOffset == 0) break;
}
return oats;
}
int main(int argc, char *argv[ ])
{
if (argc == 1) return 0;
ULONG pid = strtoul(argv[1], 0, 0);
OBJECTS_AND_TYPES oats = GetObjectsAndTypes();
std::vector<NT::SYSTEM_HANDLE_INFORMATION> handles = GetHandles();
NT::SYSTEM_OBJECT_INFORMATION defobj = {0};
printf("Object Hnd Access Fl Atr #H #P Type Name\n");
for (std::vector<NT::SYSTEM_HANDLE_INFORMATION>::iterator
h = handles.begin(); h != handles.end(); h++) {
if (h->ProcessId == pid) {
NT::PSYSTEM_OBJECT_TYPE_INFORMATION
t = oats.types[h->ObjectTypeNumber];
NT::PSYSTEM_OBJECT_INFORMATION
o = oats.objects[h->Object];
if (o == 0) o = &defobj;
printf("%p %04hx %6lx %2x %3hx %3ld %4ld %-14.*S %.*S\n",
h->Object, h->Handle, h->GrantedAccess, int(h->Flags),
o->Flags, o->HandleCount, o->PointerCount,
t->Name.Length, t->Name.Buffer,
o->Name.Length, o->Name.Buffer);
}
}
return 0;
}
两者的定义基本上差不太多。还望TeddyWing(胡涂窗口)多多指教!
To:http://www.microsoft.com/ddk/这有DDk下。我也和他不熟。你去bbs.whnet.edu.cn发个贴子问一下吧。我能力有限。只能帮你这么多了。呵呵
关于native api使用可否说的再详细一些!
最好给我一点例子程序,让我有一点认识?好吗?
多谢多谢
我也是刚开始学,愿意和你共勉,不过,就是敲数据结构太累了,都不知道那里有现成的头文件可以下载,反正MS是没给。
TO TeddyWing(胡涂窗口):能否做个朋友啊?
请看清楚,是NTdll.h,不是winnt.h,而且,这是作者自己写的头文件,就跟我一样,
请注意:#include "ntddl.h" ,很显然,不是系统带的,至少,我下的2001.9的Platform SDK 中是没有的。ps: 你这段代码是《WindowsNT Native Api Reference》里的吧。
to black_fox(black_fox): 好啊,我的mail是:[email protected]
/////////////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "Ntsecapi.h"//#ifndef NTSTATUS
// typedef unsigned long NTSTATUS;
//#endif#ifndef USHORT
typedef unsigned short USHORT;
#endif#ifndef ULONG
typedef unsigned long ULONG;
#endif#ifndef DWORD
typedef unsigned long DWORD;
#endif#ifndef LONG
typedef long LONG;
#endif#ifndef LONGLONG
typedef __int64 LONGLONG;
#endiftypedef LONG KPRIORITY;typedef enum SYSTEM_INFORMATION_CLASS{
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts
};typedef enum _KWAIT_REASON {
Executive,
FreePage,
PageIn,
PoolAllocation,
DelayExecution,
Suspended,
UserRequest,
WrExecutive,
WrFreePage,
WrPageIn,
WrPoolAllocation,
WrDelayExecution,
WrSuspended,
WrUserRequest,
WrEventPair,
WrQueue,
WrLpcReceive,
WrLpcReply,
WrVirtualMemory,
WrPageOut,
WrRendezvous,
Spare2,
Spare3,
Spare4,
Spare5,
Spare6,
WrKernel,
MaximumWaitReason
} KWAIT_REASON;typedef enum{
StateInitialized,
StateReady,
StateRunning,
StateStandby,
StateTerminated,
StateWait,
StateTransition,
StateUnknown,
} THREAD_STATE;typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;typedef CLIENT_ID *PCLIENT_ID;typedef struct _VM_COUNTERS {
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} VM_COUNTERS;
typedef VM_COUNTERS *PVM_COUNTERS;typedef struct ThreadSysInfo_t {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
KWAIT_REASON WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS; typedef struct _SYSTEM_PROCESS{
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
ULONG BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
IO_COUNTERS IoCounters; // For Windows 2000 only
SYSTEM_THREADS Threads[1];
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES; typedef NTSTATUS (__stdcall *NtQuerySystemInformation1)(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);int main()
{
NtQuerySystemInformation1 NtQuerySystemInformation;
PSYSTEM_PROCESSES pnt;
HINSTANCE hNtDll;
NTSTATUS rc;ULONG ulNeed = 0;
ULONG MemAlloced = sizeof(SYSTEM_PROCESSES)*100; // No than 100 processes
void *ProcessBuf = NULL;int done; hNtDll = LoadLibrary ("NTDLL");
if (!hNtDll) return 0;
NtQuerySystemInformation = (NtQuerySystemInformation1)
GetProcAddress(hNtDll,"ZwQuerySystemInformation"); if (!NtQuerySystemInformation) return 0; // Function address is zero
__try {
__try{
ProcessBuf = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MemAlloced);
if (0 == ProcessBuf) __leave;
rc = NtQuerySystemInformation( (SYSTEM_INFORMATION_CLASS)5,
ProcessBuf, MemAlloced, &ulNeed);
if (ERROR_SUCCESS != rc) __leave; printf("\nProcessName ProcessID");
pnt = (PSYSTEM_PROCESSES)ProcessBuf;
done = 0; while (!done)
{
if ((pnt->ProcessName.Buffer != 0))
printf("\n%-20S%d",pnt->ProcessName.Buffer,pnt->ProcessId);
done = (pnt->NextEntryDelta == 0);
pnt = PSYSTEM_PROCESSES(((char *)pnt) + pnt->NextEntryDelta);
}
}
__except( EXCEPTION_EXECUTE_HANDLER ){
printf("\nSorry,Exception happened!\n");
}
}
__finally {
if (0 != ProcessBuf)
HeapFree( GetProcessHeap(), HEAP_NO_SERIALIZE, ProcessBuf);
FreeLibrary (hNtDll);
return 0;
}
}
可否给我一个联系的E_mail?/
TO cqtine(河沙):不是的,我没那么厉害。呵呵。大家共同学习吧。
Email:[email protected]
这能有一些资料。大家可以参考一下
多谢了!
我想下面3本书都要,你还是帮我找一下下载的地址吧!!
《WindowsNT Native Api Reference》
《Nt Native Api》
《Undocumnet Nt》如要发的话,我的e_mail:[email protected]
我想下面3本书都要:
《WindowsNT Native Api Reference》
《Nt Native Api》
《Undocumnet Nt》
你给我发过来,因为我不是驱动开发网的会员,无权限下载!急急的很!!多谢!!
你说的网站不能登陆,why???
你肯定是高手
所以最好还是采用driver的形式来做,具体做法是把物理地址转为线性地址,这部分内容可以参考
intel的586的手册,就可以从页表中计算出对应的线性地址了,在ddk中有函数支持这部分工作的,然后你就可以进行读取了,但由于nt/2k/xp的系统保护,在应用级是无权访问内核级的数据的,所以如果转换出来的线性地址在内核段的,还是要在内核模式下进行读取,只有这样的方法,才可以比较正规地访问内存地址。