首页
社区
课程
招聘
[求助]初学驱动,请大家点评一个Hello World
发表于: 2009-2-23 16:06 6292

[求助]初学驱动,请大家点评一个Hello World

2009-2-23 16:06
6292
让自己闲置的时间太久了,每天除了上班就是上网看电影,
太无聊的日子。所以还是准备开始学点东西。
打算就从0开始学驱动吧。
学驱动很难,但起码能让生活不再如从前般无聊,
做点自己喜欢的事情总还是很有趣的。

对照着书本和网络,写了一个列举进程的Hello World,
请大家点评一下,我对代码的注释是否正确。谢谢!

#include "1.h"

NTSTATUS EnumProcess()
{
	int iCount = 1;    //进程计数
	NTSTATUS status;   //返回值
	PVOID pSi = NULL;  /*指向SystemInformationClass的指针,此处为SystemProcessesAndThreadsInformation,即我们所要获取的信息*/
	PSYSTEM_PROCESS_INFORMATION pSpiNext = NULL;  //同上
	ULONG uSize;       //pSi的大小,以BYTE为单位
	ULONG pNeededSize = 0;  //系统返回所需长度,因在WIN2000下不会返回,故不使用,设置为0
	BOOL bOver = FALSE;  //标识是否列举完成

	//设定pSi大小uSize初始为32K,并为pSi分配uSize的内存,根据返回值逐步累加uSize,步长为32K
	for (uSize = 0x8000; ((pSi = ExAllocatePoolWithTag(NonPagedPool, uSize, 'tag1')) != NULL); uSize += 0x8000)
	{
		//检索指定的系统信息,这里是有关进程的信息
		status = NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
										  pSi,
										  uSize,
										  &pNeededSize);
		if (STATUS_SUCCESS == status)  //NtQuerySystemInformation返回成功
		{
			DbgPrint("[Aliwy] SUCCESS uSize = 0x%.8X, pNeededSize = 0x%.8X, status = 0x%.8X\n", uSize, pNeededSize, status);
			pSpiNext = (PSYSTEM_PROCESS_INFORMATION)pSi;  /*使用pSpiNext操作,pSi要留到后面释放所分配的内存*/
			while (TRUE)
			{
				if (pSpiNext->ProcessId == 0)
				{
					DbgPrint("[Aliwy] %d - System Idle Process\n", pSpiNext->ProcessId); /*进程标识符为0的是System Idle Process,需手动标明*/
				}
				else
				{
					DbgPrint("[Aliwy] %d - %wZ\n", pSpiNext->ProcessId, &pSpiNext->ImageName); /*打印出进程标识符和进程名称*/
				}
				if (pSpiNext->NextEntryOffset == 0) //如果NextEntryOffset为0即表示进程已列举完
				{
					DbgPrint("[Aliwy] EnumProcess Over, Count is: %d\n", iCount);
					bOver = TRUE; //标识进程列举已完成
					break;  //跳出列举循环(while循环)
				}				
				pSpiNext = (PSYSTEM_PROCESS_INFORMATION)((ULONG)pSpiNext + pSpiNext->NextEntryOffset); //指向下一个进程的信息
				iCount++;   //计数累加
			}
			ExFreePool(pSi);  //释放为sPi分配的内存
			if (bOver)  //进程列举完成
			{
				break;  //跳出内存分配循环(for循环)
			}
		}
		else
		{
			DbgPrint("[Aliwy] SUCCESS uSize = %.8X, pNeededSize = %.8X, status = %.8X\n", uSize, pNeededSize, status);
		}
	}
	return STATUS_SUCCESS;
}

//----------------DriverUnload------------------------------
VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
	DbgPrint("[Aliwy] OnUnload\n");
}
//----------------------------------------------------------


//==================== DriverEntry =========================
NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
	DbgPrint("[Aliwy] DriverEntry\n");
	
	EnumProcess();
	
	theDriverObject->DriverUnload  = OnUnload; 
	
	return STATUS_SUCCESS;
}
//==========================================================


#include <ntddk.h>

#define DWORD unsigned long
#define BOOL int

//---------系统信息结构---------
typedef enum _SYSTEM_INFORMATION_CLASS {
    SystemBasicInformation,
	SystemProcessorInformation,
	SystemPerformanceInformation,
	SystemTimeOfDayInformation,
	SystemNotImplemented1,
	SystemProcessesAndThreadsInformation,
	SystemCallCounts,
	SystemConfigurationInformation,
	SystemProcessorTimes,
	SystemGlobalFlag,
	SystemNotImplemented2,
	SystemModuleInformation,
	SystemLockInformation,
	SystemNotImplemented3,
	SystemNotImplemented4,
	SystemNotImplemented5,
	SystemHandleInformation,
	SystemObjectInformation,
	SystemPagefileInformation,
	SystemInstructionEmulationCounts,
	SystemInvalidInfoClass1,
	SystemCacheInformation,
	SystemPoolTagInformation,
	SystemProcessorStatistics,
	SystemDpcInformation,
	SystemNotImplemented6,
	SystemLoadImage,
	SystemUnloadImage,
	SystemTimeAdjustment,
	SystemNotImplemented7,
	SystemNotImplemented8,
	SystemNotImplemented9,
	SystemCrashDumpInformation,
	SystemExceptionInformation,
	SystemCrashDumpStateInformation,
	SystemKernelDebuggerInformation,
	SystemContextSwitchInformation,
	SystemRegistryQuotaInformation,
	SystemLoadAndCallImage,
	SystemPrioritySeparation,
	SystemNotImplemented10,
	SystemNotImplemented11,
	SystemInvalidInfoClass2,
	SystemInvalidInfoClass3,
	SystemTimeZoneInformation,
	SystemLookasideInformation,
	SystemSetTimeSlipEvent,
	SystemCreateSession,
	SystemDeleteSession,
	SystemInvalidInfoClass4,
	SystemRangeStartInformation,
	SystemVerifierInformation,
	SystemAddVerifier,
    SystemSessionProcessesInformation
} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;
//------------------------------

//---------线程信息结构---------
typedef struct _SYSTEM_THREAD {
	LARGE_INTEGER           KernelTime;
	LARGE_INTEGER           UserTime;
	LARGE_INTEGER           CreateTime;
	ULONG                   WaitTime;
	PVOID                   StartAddress;
	CLIENT_ID               ClientId;
	KPRIORITY               Priority;
	LONG                    BasePriority;
	ULONG                   ContextSwitchCount;
	ULONG                   State;
	KWAIT_REASON            WaitReason;
} SYSTEM_THREAD, *PSYSTEM_THREAD;
//------------------------------

//---------进程信息结构---------
typedef struct _SYSTEM_PROCESS_INFORMATION {
	ULONG                   NextEntryOffset;
	ULONG                   NumberOfThreads;
	LARGE_INTEGER           Reserved[3];
	LARGE_INTEGER           CreateTime;
	LARGE_INTEGER           UserTime;
	LARGE_INTEGER           KernelTime;
	UNICODE_STRING          ImageName;
	KPRIORITY               BasePriority;
	HANDLE                  ProcessId;
	HANDLE                  InheritedFromProcessId;
	ULONG                   HandleCount;
	ULONG                   Reserved2[2];
	ULONG                   PrivatePageCount;
	VM_COUNTERS             VirtualMemoryCounters;
	IO_COUNTERS             IoCounters;
	SYSTEM_THREAD           Threads[0];
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
//------------------------------

//---------函数声明-------------
NTSYSAPI 
NTSTATUS
NTAPI
NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
						 OUT PVOID SystemInformation,
						 IN ULONG SystemInformationLength,
						 OUT PULONG ReturnLength OPTIONAL);
//------------------------------

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 256
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
兄弟,我这段时间也在看驱动编程,一直不明白驱动是怎么向应用层传递参数的,网上狂搜了几天都是应用层向驱动传参的,不知道你能不能写一个简单的例子给我看一下!
2009-2-23 16:20
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上的兄弟啊,我也刚学呢,呵呵~
2009-2-23 16:28
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
驱动层向应用层传递参数并没有什么不同啊,DeviceIoControl同时有个输入缓冲区和输出缓冲区。
你可以参考下我的代码:http://nokyo.blogbus.com/logs/34018521.html
它的功能是应用层向驱动传入10个A,驱动再向应用层传出10个B
2009-2-23 16:57
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呃,说实话,这个函数不需要在驱动里做。
2009-2-23 17:04
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呃,说的没错!
不过学习嘛,从简单学起啊,对吧,呵呵。
2009-2-23 17:12
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
嗯,简单的话,可以先试试IoCtl之类的。DDK也有一些例子。
2009-2-23 18:54
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
烦请兄弟看看我这个代码的结构和注释,是否及格?
2009-2-23 19:48
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
写的不错,学习了
2009-2-23 19:52
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
在SDK的winternl.h中,
_SYSTEM_PROCESS_INFORMATION 被如下定义:
typedef struct _SYSTEM_PROCESS_INFORMATION {
    ULONG NextEntryOffset;
    BYTE Reserved1[52];
    PVOID Reserved2[3];
    HANDLE UniqueProcessId;
    PVOID Reserved3;//父进程的标识符
   ULONG HandleCount;
    BYTE Reserved4[4];
    PVOID Reserved5[11];
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;


但我们一般使用的是这样的:
typedef struct _SYSTEM_PROCESSES {
ULONG NextEntryOffset;//NextEntryDelta;//构成结构序列的偏移量
ULONG ThreadCount;//线程数目
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;//创建时间
LARGE_INTEGER UserTime;//用户模式(Ring 3)的CPU时间
LARGE_INTEGER KernelTime;//内核模式(Ring 0)的CPU时间
UNICODE_STRING ProcessName; //进程名称
KPRIORITY BasePriority;//进程优先权
HANDLE UniqueProcessId; //ULONG ProcessId; //进程标识符
ULONG InheritedFromProcessId;//父进程的标识符
ULONG HandleCount;//句柄数目
ULONG Reserved2[2];
VM_COUNTERS VmCounters;//虚拟存储器的结构
IO_COUNTERS IoCounters;//IO计数结构,见下
SYSTEM_THREADS Threads[1];//进程相关线程的结构数组
}SYSTEM_PROCESSES,*PSYSTEM_PROCESSES;

typedef SYSTEM_PROCESSES SYSTEM_PROCESS_INFORMATION;
typedef PSYSTEM_PROCESSES PSYSTEM_PROCESS_INFORMATION;

// 以上信息在SDK被隐藏,
//_SYSTEM_PROCESS_INFORMATION = _SYSTEM_PROCESSES

这些被隐藏了的信息,是如何发现的呢?
用WinDbg的“dt _SYSTEM_PROCESS_INFORMATION”命令查不出来啊??
2009-2-23 21:18
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看兄弟的名字……

呵呵,开玩笑啦。
想听一下后面这个问题的解释。
2009-2-25 15:19
0
游客
登录 | 注册 方可回帖
返回
//