gz,up , Win2K/NT下怎么能够获得 ring0 的。

解决方案 »

  1.   

    to: litth(慕容飞云)
    Driver怎么写?
      

  2.   

    可在win98下写了一个程序,我看可以访问某些特殊的绝对物理地址。各路英雄们::大家来讨论一下
      

  3.   

    转:希望对你有用发信人: huyuguang (不再困惑), 信区: SysInternals WWW-POST
    标  题: 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一个情,只好回去翻了翻,发现了一个很早
    做的一个东西,就贴上来了。
      

  4.   

    我补充一点。如果你要用到native api。最好下一个NT SDK,VC自己是没有的。声明我记得是在一个winnt.h里面。象这样动态的加载也行。但是你得找到函数的说明。MSDN里是有。但是是这样的,如NTopensection,在MSDN中的说明是zwOpenSection,为什么有两个名称,我不太清楚。估计是一个用于ring 0,一个用于ring 3的。。
      

  5.   

    to : black_fox(black_fox) 
    那里有很多“关于如何在核态下读写物理内存,到处都是sample”,可否帮小弟一把,发几个过来,或者是这方面的资料,小弟我现在可急了!!!
    [email protected]
    多谢多谢
      

  6.   

    我欲绝望的事情现在好像有了转机!!!我找到救星了!!!!致:black_fox(black_fox)   你是写驱动的吗?  native api我好像没有用过??可否指教一下!!感激!!
      by the way !NT SDK 那里有下载的!!
      

  7.   

    那我就没有了。那文章是huyuguang (不再困惑)写的啊,。我只是转一下。提供一点个人看法
      

  8.   

    致:black_fox(black_fox)   为了不让我的贴子石沉大海,分稍候加给你,好吗?多谢
      

  9.   

    致:black_fox(black_fox)   huyuguang (不再困惑)是CSDN上的兄弟吗?你有他的E_mail吗?  我真的很急呀!  
      

  10.   

    to black_fox(black_fox):
       错,不管是NT打头还是ZW打头,实际上都是可以在ring3调用的,(你可以看看NTdll.dll的导出表,两个函数都是存在的),ZW好像是从上一代NT遗留下来的,DDK里面好像对此有解释。而且winnt.h里也没有Native Api的定义,据我所知,要用Native Api必须自己定义函数和数据结构,没有现成的头文件。
      

  11.   

    大家都参与进来研究研究,讨论讨论!
    to : TeddyWing(胡涂窗口):
      关于native api 可否说详细一些,或者给我一点例子?[email protected]
    多谢多谢
      

  12.   

    我先给你一个头文件的例子,要用NAtive api的话,你还需要动态加载Ntdll.dll并取到相应函数的地址:
    /////////////////////////////////////////////////////////////////////////////////////////////////
    #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
    );
      

  13.   


    我找到了关于huyuguang (不再困惑)的信息了,多谢各位的热情参与,我还想让这个帖子继续下去
      

  14.   

    TO  TeddyWing(胡涂窗口):
         多谢指教!我是说错了。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发个贴子问一下吧。我能力有限。只能帮你这么多了。呵呵
     
      

  15.   

    to : TeddyWing(胡涂窗口): 
     
      关于native api使用可否说的再详细一些!
      最好给我一点例子程序,让我有一点认识?好吗?
     
        多谢多谢 
      

  16.   

    刚才忘了说,你如果真要用Native Api,建议你下一本《WindowsNT Native Api Reference》,只有英文的,在www.driverdevelopment.com上有下载。
    我也是刚开始学,愿意和你共勉,不过,就是敲数据结构太累了,都不知道那里有现成的头文件可以下载,反正MS是没给。
      

  17.   

    TO cqtine(河沙):不好意思。刚刚离开了一下。分就不必给我了。给TeddyWing(胡涂窗口)吧:)。建议你先下一个NT DDK试试。如果没有NT开头的定义,你可以照TeddyWing(胡涂窗口)所说的那样动态加载,这样也有好处。便于平台的一些移植.基本上zw开头的和NT开头的函数说明差不多。这样找资料可能好找一点。祝你成功!!!
    TO TeddyWing(胡涂窗口):能否做个朋友啊?
      

  18.   

    to black_fox(black_fox):
       请看清楚,是NTdll.h,不是winnt.h,而且,这是作者自己写的头文件,就跟我一样,
    请注意:#include "ntddl.h" ,很显然,不是系统带的,至少,我下的2001.9的Platform SDK 中是没有的。ps: 你这段代码是《WindowsNT Native Api Reference》里的吧。
      

  19.   

    错。不是在SDK中。是在DDK中。
      

  20.   

    这是一个例子程序,其他的Native Api你可以照此办理;
    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;
     }
    }
      

  21.   

    to black_fox(black_fox) and TeddyWing(胡涂窗口): 多谢两位大哥的帮助,分一定要加的!不知道可否拜二位为师,唉!现在好老师在csdn上才有!!?black_fox(black_fox)兄台是写驱动的吗?to TeddyWing(胡涂窗口): 你学习这方面有多久了??
     
    可否给我一个联系的E_mail?/
      

  22.   

    TO TeddyWing(胡涂窗口):希望以后共同学习.
    TO  cqtine(河沙):不是的,我没那么厉害。呵呵。大家共同学习吧。
    Email:[email protected]
      

  23.   

    很遗憾,DDK里面也没有定义,实际上Native Api 就是所谓的Undocument Api,换句话说,就是MS没有实现文档化的函数,这不一定准确,因为MS确实又在DDK中文档化了一部分。当然,是给驱动程序用的,不是给应用程序用的。
      

  24.   

    to TeddyWing(胡涂窗口):看来也是我错了。(PS:我做这方面的东西,并没有下DDK(太大了),我用的也是动态加载)呵呵,不过不管MS有没有提供,我这就有一个NTDLL.h的东西。是谁写的不重要了。关键是不要自己去敲代码了。http://www.ddj.com/ftp/1999/1999_11/ntinfo.zip/
    这能有一些资料。大家可以参考一下
      

  25.   

    你的Mail是多少啊资料比较大,我还是建议你从网上下载,一本《Nt Native Api》,一本《Undocumnet Nt》,都很好,很经典的,就在刚才我说的驱动开发网。今天就到此为止了,呵呵,肚子饿了,开饭喽!to black_fox : 能遇到你,真高兴啊。
      

  26.   

    to TeddyWing(胡涂窗口): 兄弟,开发网我去找了,没找到,你还是给我发吧!!
    多谢了!
      

  27.   

    to TeddyWing(胡涂窗口):
    我想下面3本书都要,你还是帮我找一下下载的地址吧!!
    《WindowsNT Native Api Reference》
    《Nt Native Api》
    《Undocumnet Nt》如要发的话,我的e_mail:[email protected]
      

  28.   

    to TeddyWing(胡涂窗口):
    我想下面3本书都要:
    《WindowsNT Native Api Reference》
    《Nt Native Api》
    《Undocumnet Nt》
    你给我发过来,因为我不是驱动开发网的会员,无权限下载!急急的很!!多谢!!
      

  29.   

    可否也给我一分:[email protected]
      

  30.   

    太简单那,你到http://webcrazy.yeah.net!上一看就有那!,关于nt与zw的关系在《本机api>里讲的很清楚,在说inside win2000也做那解释,想不到大家在vc版混,不懂win32汇编,不用soft-ice,不用kdbg,不用ddk,那还不如学dephi,我做好那被骂的贮备,各位老大!
      

  31.   

    to likevclinux(流浪的小狗) :
     你说的网站不能登陆,why???
    你肯定是高手
      

  32.   

    大家高兴得太早了,上面的代码是采用了native api,但这东西不是一定兼容以后的2000,xp的,
    所以最好还是采用driver的形式来做,具体做法是把物理地址转为线性地址,这部分内容可以参考
    intel的586的手册,就可以从页表中计算出对应的线性地址了,在ddk中有函数支持这部分工作的,然后你就可以进行读取了,但由于nt/2k/xp的系统保护,在应用级是无权访问内核级的数据的,所以如果转换出来的线性地址在内核段的,还是要在内核模式下进行读取,只有这样的方法,才可以比较正规地访问内存地址。
      

  33.   

    在 http://xmaster.covers.de 有下载pdf版
      

  34.   

    请问IE(IE) : intel586手册在那里可以下载?