#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;
}