驱动遍历进程的方法

/*#include <ntddk.h>
#define DEVICE_OBJECT_NAME  L"\\Device\\BufferedIODeviceObjectName"
#define DEVICE_LINK_NAME    L"\\DosDevices\\BufferedIODevcieLinkName"
void dirver(IN PDRIVER_OBJECT pDriveObject)
{
	KdPrint(("驱动已经卸载!\n"));
	DbgPrint("卸载成功!\\n");
}
NTSTATUS pass(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	pIrp->IoStatus.Information = 0;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;
}
NTSTATUS Read(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
	KdPrint(("程序已经开始运行!\n"));
	NTSTATUS flag = STATUS_SUCCESS;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
	ULONG u_len = stack->Parameters.Read.Length;
	pIrp->IoStatus.Status = flag;
	pIrp->IoStatus.Information = u_len;
	memset(pIrp->AssociatedIrp.SystemBuffer, 0xAA, u_len);;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	KdPrint(("程序已经结束\n"));
	return flag;

}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriveObject, IN PUNICODE_STRING RegisterPath)
{
	PDEVICE_OBJECT DeviceObject = NULL;
	UNICODE_STRING  DeviceObjectName;
	UNICODE_STRING  DeviceObjectLink;
	NTSTATUS flag = STATUS_SUCCESS;
	RtlInitUnicodeString(&DeviceObjectName, DEVICE_OBJECT_NAME);
	flag = IoCreateDevice(DriveObject, 0,
		&DeviceObjectName,
		FILE_DEVICE_UNKNOWN,
		0,
		FALSE,
		&DeviceObject);
	if (!NT_SUCCESS(flag))
	{

		return flag;
	}
	DeviceObject->Flags |= DO_DIRECT_IO;
	RtlInitUnicodeString(&DeviceObjectLink, DEVICE_LINK_NAME);
	flag = IoCreateSymbolicLink(&DeviceObjectLink, &DeviceObjectName);
	if (!NT_SUCCESS(flag))
	{
		IoDeleteDevice(DeviceObject);
	}
	for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
	{
		DriveObject->MajorFunction[i] = pass;
	}
	DriveObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Read;
	DriveObject->DriverUnload = dirver;
	return STATUS_SUCCESS;

}*/

#include <ntifs.h>
NTSTATUS ZwQuerySystemInformation(
	ULONG SystemClass,
	PVOID SystemInformation,
	ULONG SystemInformationLength,
	PULONG RetLength
	);

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;
	ULONG    ThreadState;
	KWAIT_REASON  WaitReason;
	ULONG    Reserved; //Add
}SYSTEM_THREADS, *PSYSTEM_THREADS;

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_THREADS           Threads[0];
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
CHAR*  PsGetProcessImageFileName(PEPROCESS Process);
void driveunload(PDRIVER_OBJECT pDriveObject)
{


	KdPrint(("卸载结束!\n"));

}
void EumProcessByQueyInformation()
{
	NTSTATUS status;
	ULONG Retlength;
	PVOID Buffer = NULL;
	PSYSTEM_PROCESS_INFORMATION SystemProcess = NULL;
	status = ZwQuerySystemInformation(5, NULL,0,&Retlength);
	if (status == STATUS_INFO_LENGTH_MISMATCH)
	{
		KdPrint(("开始运行!\n"));
		Buffer = ExAllocatePool(PagedPool, Retlength);
		if (Buffer)
		{
		 RtlZeroMemory(Buffer, Retlength);
         status = ZwQuerySystemInformation(5, Buffer, Retlength, &Retlength);
		 if (NT_SUCCESS(status))
		 {
			 SystemProcess = Buffer;
			 do{
				 KdPrint(("%wZ\n", SystemProcess->ImageName));
				 SystemProcess = ((ULONG64)SystemProcess) + SystemProcess->NextEntryOffset;
			 } while (SystemProcess->NextEntryOffset);
				 

		  }
		   ExFreePool(Buffer);
		}
		


	}

}   
void EumProcessByLookUpProcessId()
{
	ULONG Pid;
	NTSTATUS status;
	PEPROCESS Process;
	for (Pid = 0; Pid <= 240000; Pid += 4)
	{ 
		status = PsLookupProcessByProcessId(Pid, &Process);
		if (NT_SUCCESS(status))
		{
			KdPrint(("%s\n", PsGetProcessImageFileName(Process)));
			ObDereferenceObject(Process);
		}
	}
}
NTSTATUS  DriverEntry(PDRIVER_OBJECT DriveObject,PUNICODE_STRING RegisterPath)
{
	//EumProcessByQueyInformation();
	EumProcessByLookUpProcessId();
	DriveObject->DriverUnload = driveunload;

	 return STATUS_SUCCESS;
}

/*  // 遍历进程  挂起进程
#include <ntifs.h>
NTSTATUS ZwQuerySystemInformation(
	ULONG SystemClass,
	PVOID SystemInformation,
	ULONG SystemInformationLength,
	PULONG RetLength
	);

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;
	ULONG    ThreadState;
	KWAIT_REASON  WaitReason;
	ULONG    Reserved; //Add
}SYSTEM_THREADS, *PSYSTEM_THREADS;

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_THREADS           Threads[0];
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
CHAR*  PsGetProcessImageFileName(PEPROCESS Process);
NTSTATUS PsSuspendProcess(PEPROCESS Process);//挂起
NTSTATUS PsResumeProcess(PEPROCESS Process);//回复
void driveunload(PDRIVER_OBJECT pDriveObject)
{


	KdPrint(("卸载结束!\n"));

}
void EumProcessByQueyInformation()
{
	NTSTATUS status;
	ULONG Retlength;
	PVOID Buffer = NULL;
	PSYSTEM_PROCESS_INFORMATION SystemProcess = NULL;
	status = ZwQuerySystemInformation(5, NULL,0,&Retlength);
	if (status == STATUS_INFO_LENGTH_MISMATCH)
	{
		KdPrint(("开始运行!\n"));
		Buffer = ExAllocatePool(PagedPool, Retlength);
		if (Buffer)
		{
		 RtlZeroMemory(Buffer, Retlength);
         status = ZwQuerySystemInformation(5, Buffer, Retlength, &Retlength);
		 if (NT_SUCCESS(status))
		 {
			 SystemProcess = Buffer;
			 do{
				 KdPrint(("%wZ\n", SystemProcess->ImageName));
				 SystemProcess = ((ULONG64)SystemProcess) + SystemProcess->NextEntryOffset;
			 } while (SystemProcess->NextEntryOffset);
				 

		  }
		   ExFreePool(Buffer);
		}
		


	}

}   
void EumProcessByLookUpProcessId()
{
	ULONG Pid;
	NTSTATUS status;
	PEPROCESS Process;
	for (Pid = 0; Pid <= 240000; Pid += 4)
	{ 
		status = PsLookupProcessByProcessId(Pid, &Process);
		if (NT_SUCCESS(status))
		{
			KdPrint(("%s\n", PsGetProcessImageFileName(Process)));
			if (strstr(PsGetProcessImageFileName(Process),"notepad"))
			{
			  //	PsSuspendProcess(Process);//挂起
			  PsResumeProcess(Process);
			}
			ObDereferenceObject(Process);
		}
	}
}
NTSTATUS  DriverEntry(PDRIVER_OBJECT DriveObject,PUNICODE_STRING RegisterPath)
{
	//EumProcessByQueyInformation();
	EumProcessByLookUpProcessId();
	DriveObject->DriverUnload = driveunload;

	 return STATUS_SUCCESS;
}
*/

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值