binge
驱动牛犊
驱动牛犊
  • 注册日期2004-12-08
  • 最后登录2005-08-28
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1348回复:5

帮忙看一下代码(监测进程)

楼主#
更多 发布于:2004-12-16 18:56
下面的代码编译能通过,但一安装就出错(在复制过程中),系统蓝屏,错误提示是:
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);
}

最新喜欢:

ljmmaryljmmar...
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-17 09:25
简单看了一下这个驱动,主要用于监控Process,thread,image三种对象的生成事件,没看出什么明显的问题。估计你的监控例程里可能有什么问题,建议你先把三个监控例程简化一下,例如可以只输出一个打印,看看有什么问题,如果没有,再逐一恢复,慢慢调试吧。
在交流中学习。。。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2004-12-17 20:00
他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-17 22:23
他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷......


DriverUnload()例程都不提供怎么动态卸载?

必须提供这个例程,在里边调用IoDeleteDevice()和IoDeleteSymbolicLink()才能动态卸载。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-12-17 23:52
[quote]他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷......


DriverUnload()例程都不提供怎么动态卸载?

必须提供这个例程,在里边调用IoDeleteDevice()和IoDeleteSymbolicLink()才能动态卸载。 [/quote]
PsSetLoadImageNotifyRoutine如何在DriverUnload()里去除挂钩???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-18 12:35
[quote][quote]他的例子我也测试过,基本没有问题,编译为AMD64的驱动,在64位WINDOWS下也没有问题的.......,就是不能动态卸载,比较郁闷......


DriverUnload()例程都不提供怎么动态卸载?

必须提供这个例程,在里边调用IoDeleteDevice()和IoDeleteSymbolicLink()才能动态卸载。 [/quote]
PsSetLoadImageNotifyRoutine如何在DriverUnload()里去除挂钩??? [/quote]

哦,不能!误导众生。:(

自打PP N次(N = 0) :P
游客

返回顶部