ZwQuerySystemInformation的用法



#include <stdio.h>   
#include <windows.h>   
  
typedef LONG NTSTATUS;   
  
#define STATUS_SUCCESS                  ((NTSTATUS)0x00000000L)   
#define STATUS_UNSUCCESSFUL             ((NTSTATUS)0xC0000001L)   
#define STATUS_NOT_IMPLEMENTED          ((NTSTATUS)0xC0000002L)   
#define STATUS_INVALID_INFO_CLASS       ((NTSTATUS)0xC0000003L)   
#define STATUS_INFO_LENGTH_MISMATCH     ((NTSTATUS)0xC0000004L)   
  
typedef  enum _SYSTEM_INFORMATION_CLASS   
{   
    SystemBasicInformation,                  //   0 Y N   
    SystemProcessorInformation,              //   1 Y N   
    SystemPerformanceInformation,            //   2 Y N   
    SystemTimeOfDayInformation,              //   3 Y N   
    SystemNotImplemented1,                   //   4 Y N   
    SystemProcessesAndThreadsInformation,    //   5 Y N   
    SystemCallCounts,                        //   6 Y N   
    SystemConfigurationInformation,          //   7 Y N   
    SystemProcessorTimes,                    //   8 Y N   
    SystemGlobalFlag,                        //   9 Y Y   
    SystemNotImplemented2,                   //  10 Y N   
    SystemModuleInformation,                 //  11 Y N   
    SystemLockInformation,                   //  12 Y N   
    SystemNotImplemented3,                   //  13 Y N   
    SystemNotImplemented4,                   //  14 Y N   
    SystemNotImplemented5,                   //  15 Y N   
    SystemHandleInformation,                 //  16 Y N   
    SystemObjectInformation,                 //  17 Y N   
    SystemPagefileInformation,               //  18 Y N   
    SystemInstructionEmulationCounts,        //  19 Y N   
    SystemInvalidInfoClass1,                 //  20   
    SystemCacheInformation,                  //  21 Y Y   
    SystemPoolTagInformation,                //  22 Y N   
    SystemProcessorStatistics,               //  23 Y N   
    SystemDpcInformation,                    //  24 Y Y   
    SystemNotImplemented6,                   //  25 Y N   
    SystemLoadImage,                         //  26 N Y   
    SystemUnloadImage,                       //  27 N Y   
    SystemTimeAdjustment,                    //  28 Y Y   
    SystemNotImplemented7,                   //  29 Y N   
    SystemNotImplemented8,                   //  30 Y N   
    SystemNotImplemented9,                   //  31 Y N   
    SystemCrashDumpInformation,              //  32 Y N   
    SystemExceptionInformation,              //  33 Y N   
    SystemCrashDumpStateInformation,         //  34 Y Y/N   
    SystemKernelDebuggerInformation,         //  35 Y N   
    SystemContextSwitchInformation,          //  36 Y N   
    SystemRegistryQuotaInformation,          //  37 Y Y   
    SystemLoadAndCallImage,                  //  38 N Y   
    SystemPrioritySeparation,                //  39 N Y   
    SystemNotImplemented10,                  //  40 Y N   
    SystemNotImplemented11,                  //  41 Y N   
    SystemInvalidInfoClass2,                 //  42   
    SystemInvalidInfoClass3,                 //  43   
    SystemTimeZoneInformation,               //  44 Y N   
    SystemLookasideInformation,              //  45 Y N   
    SystemSetTimeSlipEvent,                  //  46 N Y   
    SystemCreateSession,                     //  47 N Y   
    SystemDeleteSession,                     //  48 N Y   
    SystemInvalidInfoClass4,                 //  49   
    SystemRangeStartInformation,             //  50 Y N   
    SystemVerifierInformation,               //  51 Y Y   
    SystemAddVerifier,                       //  52 N Y   
    SystemSessionProcessesInformation        //  53 Y N   
  
} SYSTEM_INFORMATION_CLASS;   
  
typedef  struct _LSA_UNICODE_STRING   
{   
    USHORT Length;   
    USHORT MaximumLength;   
    PWSTR Buffer;   
       
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;   
  
typedef  struct _CLIENT_ID   
{   
    HANDLE UniqueProcess;   
    HANDLE UniqueThread;   
  
} CLIENT_ID;   
  
typedef  enum _THREAD_STATE   
{   
    StateInitialized,   
    StateReady,   
    StateRunning,   
    StateStandby,   
    StateTerminated,   
    StateWait,   
    StateTransition,   
    StateUnknown   
  
} THREAD_STATE;   
  
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   
  
} KWAIT_REASON;   
  
/* typedef struct _IO_COUNTERS   
{   
    LARGE_INTEGER ReadOperationCount;   //I/O讀操作數目   
    LARGE_INTEGER WriteOperationCount;  //I/O寫操作數目   
    LARGE_INTEGER OtherOperationCount;  //I/O其他操作數目   
    LARGE_INTEGER ReadTransferCount;    //I/O讀數據數目   
    LARGE_INTEGER WriteTransferCount;   //I/O寫數據數目   
    LARGE_INTEGER OtherTransferCount;   //I/O其他操作數據數目   
  
} IO_COUNTERS, *PIO_COUNTERS;   
  
*/
typedef  struct _VM_COUNTERS   
{   
    ULONG PeakVirtualSize;               // 虛擬存儲峰值大小   
    ULONG VirtualSize;                   // 虛擬存儲大小   
    ULONG PageFaultCount;                // 頁故障數目   
    ULONG PeakWorkingSetSize;            // 工作集峰值大小   
    ULONG WorkingSetSize;                // 工作集大小   
    ULONG QuotaPeakPagedPoolUsage;       // 分頁池使用配額峰值   
    ULONG QuotaPagedPoolUsage;           // 分頁池使用配額   
    ULONG QuotaPeakNonPagedPoolUsage;    // 非分頁池使用配額峰值   
    ULONG QuotaNonPagedPoolUsage;        // 非分頁池使用配額   
    ULONG PagefileUsage;                 // 頁文件使用情況   
    ULONG PeakPagefileUsage;             // 頁文件使用峰值   
  
} VM_COUNTERS, *PVM_COUNTERS;   
  
typedef LONG KPRIORITY;   
  
typedef  struct _SYSTEM_THREADS   
{   
    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_PROCESSES   
{   
    ULONG NextEntryDelta;   
    ULONG ThreadCount;   
    ULONG Reserved1[ 6];   
    LARGE_INTEGER CreateTime;   
    LARGE_INTEGER UserTime;   
    LARGE_INTEGER KernelTime;   
    UNICODE_STRING ProcessName;   
    KPRIORITY BasePriority;   
    ULONG ProcessId;   
    ULONG InheritedFromProcessId;   
    ULONG HandleCount;   
    ULONG Reserved2[ 2];   
    VM_COUNTERS  VmCounters;   
    IO_COUNTERS IoCounters;   
    SYSTEM_THREADS Threads[ 1];   
  
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;   
  
typedef  struct _SYSTEM_BASIC_INFORMATION   
{   
    BYTE Reserved1[ 24];   
    PVOID Reserved2[ 4];   
    CCHAR NumberOfProcessors;   
  
} SYSTEM_BASIC_INFORMATION;   

typedef  struct tagSYSTEM_MODULE_INFORMATION {
    ULONG Reserved[ 2];
    PVOID Base;
    ULONG Size;
    ULONG Flags;
    USHORT Index;
    USHORT Unknown;
    USHORT LoadCount;
    USHORT ModuleNameOffset;
    CHAR ImageName[ 256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
  
typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(IN SYSTEM_INFORMATION_CLASS, IN OUT PVOID, IN ULONG, OUT PULONG OPTIONAL);   
  
int main( void)   
{   

    HINSTANCE ntdll_dll = GetModuleHandle( " ntdll.dll ");

     if (ntdll_dll == NULL) {
        printf( " load ntdll.dll failed.\n ");
         return - 1;
    }  

    NTQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
    
    ZwQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(ntdll_dll,  " ZwQuerySystemInformation ");   
     if ( ZwQuerySystemInformation!=NULL )   
    {   
        SYSTEM_BASIC_INFORMATION sbi = { 0};   
        NTSTATUS status = ZwQuerySystemInformation(SystemBasicInformation, (PVOID)&sbi,  sizeof(sbi), NULL);   
         if ( status == STATUS_SUCCESS ) {   
            printf( " 處理器個數:%d\r\n ", sbi.NumberOfProcessors);   
        }  else {   
            printf( " \r\n SystemBasicInformation error ");   
        }   
        
        DWORD dwNeedSize =  0;
        BYTE *pBuffer = NULL;

        printf( " ---------------------所有進程信息----------------------------------------\n ");   
        PSYSTEM_PROCESSES psp=NULL;
        status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, NULL,  0, &dwNeedSize);   
         if ( status == STATUS_INFO_LENGTH_MISMATCH ) {   
            pBuffer =  new BYTE[dwNeedSize];   
            status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, (PVOID)pBuffer, dwNeedSize, NULL);   
             if ( status == STATUS_SUCCESS )   
            {   
                psp = (PSYSTEM_PROCESSES)pBuffer;
                printf( " PID  線程數 工作集大小 進程名\n ");
                 do {   
                    printf( " %-4d ", psp->ProcessId);
                    printf( "  %3d ", psp->ThreadCount);   
                    printf( "  %8dKB ", psp->VmCounters.WorkingSetSize/ 1024);
                    wprintf(L "  %s\n ", psp->ProcessName.Buffer);
                    psp = (PSYSTEM_PROCESSES)((ULONG)psp + psp->NextEntryDelta );   
                }  while ( psp->NextEntryDelta !=  0 ); 
                
                delete []pBuffer;   
                pBuffer = NULL;   
            } else  if ( status == STATUS_UNSUCCESSFUL ) {   
                printf( " \n STATUS_UNSUCCESSFUL ");   
            }  else  if ( status == STATUS_NOT_IMPLEMENTED ) {
                printf( " \n STATUS_NOT_IMPLEMENTED ");
            }  else  if ( status == STATUS_INVALID_INFO_CLASS ) {   
                printf( " \n STATUS_INVALID_INFO_CLASS ");
            }  else  if ( status == STATUS_INFO_LENGTH_MISMATCH ) {   
                printf( " \n STATUS_INFO_LENGTH_MISMATCH ");
            }    
        }   

        printf( " ---------------------系統模塊信息----------------------------------------\n ");   
        status = ZwQuerySystemInformation(SystemModuleInformation, NULL,  0, &dwNeedSize);
         if (status == STATUS_INFO_LENGTH_MISMATCH) {        
            pBuffer =  new BYTE[dwNeedSize];
            status = ZwQuerySystemInformation(SystemModuleInformation, pBuffer, dwNeedSize, &dwNeedSize);
             if (status == STATUS_SUCCESS) {
                UINT count = *((UINT*)pBuffer);
                printf( " 模塊數:%d\n ", count);
                printf( " 基地址 模塊大小 引用計數 模塊路徑\n ");
                PSYSTEM_MODULE_INFORMATION pmi = (PSYSTEM_MODULE_INFORMATION)(pBuffer +  sizeof(ULONG));
                 for (UINT i =  0; i < count; i++) {
                    printf( " 0x%08X  ", pmi->Base);
                    printf( " %8dKB  ", pmi->Size /  1024);
                    printf( " %2d  ", pmi->LoadCount);
                    printf( " %s\n ", pmi->ImageName);
                    pmi++;
                }
            }
            delete []pBuffer;
        }


    }  else {   
        printf( " Get ZwQuerySystemInformation address error! ");
    }   
           
    FreeLibrary(ntdll_dll);   
       
     return  0;   

}  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM