ZwQuerySystemInformation 简单应用

#include <ntddk.h>
#include "struct.h"

typedef struct _SYSTEM_MODULE {
   
    ULONG Reserved1;
    ULONG Reserved2;
    PVOID ImageBaseAddress;
    ULONG ImageSize;
    ULONG Flags;
    USHORT Id;
    USHORT Rank;
    USHORT w018;
    USHORT NameOffset;
    CHAR Name[MAXIMUM_FILENAME_LENGTH];
} SYSTEM_MODULE, *PSYSTEM_MODULE;


typedef struct _SYSTEM_MODULE_INFORMATION{
    ULONG nCount;
    SYSTEM_MODULE module[1];
}SYSTEM_MODULE_INFORMATION,*PSYSTEM_MODULE_INFORMATION;

 

//在ring0 声明下ZwQuerySystemInformation 就可以应用了
NTKERNELAPI
NTSTATUS ZwQuerySystemInformation(
                                  IN  ULONG SystemInformationClass,
                                  IN  OUT PVOID SystemInformation,
                                  IN  ULONG SystemInformationLength,
                                  OUT PULONG ReturnLength OPTIONAL
);

VOID DriverUnload(IN PDRIVER_OBJECT driver)
{
    KdPrint(("Driver unload /r/n"));
}

NTSTATUS QuerySystemInformation()
{
    NTSTATUS status;
    PVOID pbuf=NULL;
    ULONG retlength=0,i;
    PSYSTEM_MODULE_INFORMATION psysinfo;
    PSYSTEM_MODULE    psysmodule;
    pbuf=ExAllocatePool(NonPagedPool,sizeof(SYSTEM_MODULE));
    if(pbuf == NULL )
    {
        KdPrint(("allocate pool failed /r/n"));
        return STATUS_UNSUCCESSFUL;
    }

    status = ZwQuerySystemInformation(SystemModuleInformation,
        pbuf,
        sizeof(SYSTEM_MODULE),
        &retlength);
    if( STATUS_INFO_LENGTH_MISMATCH == status )
    {
        ExFreePool(pbuf);
        pbuf=ExAllocatePool(NonPagedPool , retlength );

        status= ZwQuerySystemInformation(SystemModuleInformation,
            pbuf,
            retlength,
            NULL
            );
        if(STATUS_INFO_LENGTH_MISMATCH == status )
            return STATUS_UNSUCCESSFUL;
       
    }
   
    psysinfo = (PSYSTEM_MODULE_INFORMATION) pbuf;
    psysmodule=psysinfo->module;
    for(i =0 ; i< psysinfo->nCount ;i++ )
    {
        //psysmodule=psysinfo->module;
        KdPrint(("module name : %s /r/n",psysmodule->Name));
        psysmodule++;
    }
   

    return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path )
{
    NTSTATUS status;
    driver->DriverUnload=DriverUnload;
    status=QuerySystemInformation();
    if(!NT_SUCCESS(status))
        return STATUS_UNSUCCESSFUL;

    return STATUS_SUCCESS;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值