阅读:1348回复:5
帮忙看一下代码(监测进程)
下面的代码编译能通过,但一安装就出错(在复制过程中),系统蓝屏,错误提示是:
KMODE_EXCEPTION_NOT_HANDLED。 代码看来看去,也不知道是什么原因出错的。 恳请大侠多多指点 其中inf文件里的参数如下(Win2K系统下): [YouMark_AddService] DisplayName = detect ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\detectP.sys 代码如下(网上搜索到的,未修改过): /***************************************************************** 文件名 : WssProcMon.c 描述 : 进程/线程监视器 作者 : sinister 最后修改日期 : 2002-11-02 *****************************************************************/ #include "ntddk.h" #include "string.h" #define ProcessNameOffset 0x1fc static NTSTATUS MydrvDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS * pEProcess); VOID ProcessCreateMon ( IN HANDLE hParentId, IN HANDLE PId,IN BOOLEAN bCreate); VOID ThreadCreateMon (IN HANDLE PId, IN HANDLE TId, IN BOOLEAN bCreate); VOID ImageCreateMon (IN PUNICODE_STRING FullImageName, IN HANDLE ProcessId, IN PIMAGE_INFO ImageInfo ); // 驱动入口 NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { UNICODE_STRING nameString, linkString; PDEVICE_OBJECT deviceObject; NTSTATUS status; int i; //建立设备 RtlInitUnicodeString( &nameString, L"\\Device\\WssProcMon" ); status = IoCreateDevice( DriverObject, 0, &nameString, FILE_DEVICE_UNKNOWN, 0, TRUE, &deviceObject ); if (!NT_SUCCESS( status )) return status; RtlInitUnicodeString( &linkString, L"\\DosDevices\\WssProcMon" ); status = IoCreateSymbolicLink (&linkString, &nameString); if (!NT_SUCCESS( status )) { IoDeleteDevice (DriverObject->DeviceObject); return status; } status = PsSetLoadImageNotifyRoutine(ImageCreateMon); if (!NT_SUCCESS( status )) { DbgPrint("PsSetLoadImageNotifyRoutine()\n"); return status; } status = PsSetCreateThreadNotifyRoutine(ThreadCreateMon); if (!NT_SUCCESS( status )) { DbgPrint("PsSetCreateThreadNotifyRoutine()\n"); return status; } status = PsSetCreateProcessNotifyRoutine(ProcessCreateMon, FALSE); if (!NT_SUCCESS( status )) { DbgPrint("PsSetCreateProcessNotifyRoutine()\n"); return status; } for ( i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) { DriverObject->MajorFunction = MydrvDispatch; } return STATUS_SUCCESS; } //处理设备对象操作 static NTSTATUS MydrvDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0L; IoCompleteRequest( Irp, 0 ); return Irp->IoStatus.Status; } VOID ProcessCreateMon ( IN HANDLE hParentId, IN HANDLE PId,IN BOOLEAN bCreate ) { PEPROCESS EProcess; ULONG ulCurrentProcessId; LPTSTR lpCurProc; NTSTATUS status; status = PsLookupProcessByProcessId( (ULONG)PId, &EProcess); if (!NT_SUCCESS( status )) { DbgPrint("PsLookupProcessByProcessId()\n"); return ; } if ( bCreate ) { lpCurProc = (LPTSTR)EProcess; lpCurProc = lpCurProc + ProcessNameOffset; DbgPrint( "CREATE PROCESS = PROCESS NAME: %s , PROCESS PARENTID: %d, PROCESS ID: %d, PROCESS ADDRESS %x:\n", lpCurProc, hParentId, PId, EProcess ); } else { DbgPrint( "TERMINATED == PROCESS ID: %d\n", PId); } } VOID ThreadCreateMon (IN HANDLE PId, IN HANDLE TId, IN BOOLEAN bCreate) { PEPROCESS EProcess; ULONG ulCurrentProcessId; LPTSTR lpCurProc; NTSTATUS status; status = PsLookupProcessByProcessId( (ULONG)PId, &EProcess); if (!NT_SUCCESS( status )) { DbgPrint("PsLookupProcessByProcessId()\n"); return ; } if ( bCreate ) { lpCurProc = (LPTSTR)EProcess; lpCurProc = lpCurProc + ProcessNameOffset; DbgPrint( "CREATE THREAD = PROCESS NAME: %s PROCESS ID: %d, THREAD ID: %d\n", lpCurProc, PId, TId ); } else { DbgPrint( "TERMINATED == THREAD ID: %d\n", TId); } } VOID ImageCreateMon (IN PUNICODE_STRING FullImageName, IN HANDLE ProcessId, IN PIMAGE_INFO ImageInfo ) { DbgPrint("FullImageName: %S,Process ID: %d\n",FullImageName->Buffer,ProcessId); DbgPrint("ImageBase: %x,ImageSize: %d\n",ImageInfo->ImageBase,ImageInfo->ImageSize); } |
|
最新喜欢:ljmmar... |
沙发#
发布于:2004-12-17 09:25
简单看了一下这个驱动,主要用于监控Process,thread,image三种对象的生成事件,没看出什么明显的问题。估计你的监控例程里可能有什么问题,建议你先把三个监控例程简化一下,例如可以只输出一个打印,看看有什么问题,如果没有,再逐一恢复,慢慢调试吧。
|
|
|
板凳#
发布于:2004-12-17 20:00
他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷......
|
|
|
地板#
发布于:2004-12-17 22:23
他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷...... DriverUnload()例程都不提供怎么动态卸载? 必须提供这个例程,在里边调用IoDeleteDevice()和IoDeleteSymbolicLink()才能动态卸载。 |
|
地下室#
发布于:2004-12-17 23:52
[quote]他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷...... DriverUnload()例程都不提供怎么动态卸载? 必须提供这个例程,在里边调用IoDeleteDevice()和IoDeleteSymbolicLink()才能动态卸载。 [/quote] PsSetLoadImageNotifyRoutine如何在DriverUnload()里去除挂钩??? |
|
|
5楼#
发布于:2004-12-18 12:35
[quote][quote]他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷...... DriverUnload()例程都不提供怎么动态卸载? 必须提供这个例程,在里边调用IoDeleteDevice()和IoDeleteSymbolicLink()才能动态卸载。 [/quote] PsSetLoadImageNotifyRoutine如何在DriverUnload()里去除挂钩??? [/quote] 哦,不能!误导众生。:( 自打PP N次(N = 0) :P |
|