关于进程线程监视的事件设置问题
我写了个驱动来监视进程和线程的创建,可是运行大概20秒就蓝屏了
我觉得大概是在我设置事件的时候出了问题
但是不知道具体是哪里有问题,现在把代码贴出来
希望大家帮忙看看,先谢谢了//
////////////////////////////////////////////////////////
RtlInitUnicodeString(&uszProcessEventString, EVENT_NAME);
pDevExt->ProcessEvent = IoCreateNotificationEvent(&uszProcessEventString, &pDevExt->hProcessHandle);
// 设置它为非受信状态
KeClearEvent(pDevExt->ProcessEvent);
status = PsSetCreateProcessNotifyRoutine(ProcessCallback, FALSE);
if (!NT_SUCCESS( status ))
{
DbgPrint("PsSetCreateProcessNotifyRoutine()\n");
return status;
}
// 线程的设置
RtlInitUnicodeString(&uszThreadEventString, EVENT_NAMETEHERD);
pDevExt->TheradEvent = IoCreateNotificationEvent(&uszThreadEventString, &pDevExt->hThreadHandle);
// 设置它为非受信状态
KeClearEvent(pDevExt->TheradEvent);
status = PsSetCreateThreadNotifyRoutine(ThreadCallback);
if (!NT_SUCCESS( status ))
{
DbgPrint("PsSetCreateThreadNotifyRoutine()\n");
return status;
}
// 加载印象的设置
RtlInitUnicodeString(&uszImageEventString, EVENT_NAMEIMAGE);
pDevExt->ImageEvent = IoCreateNotificationEvent(&uszImageEventString, &pDevExt->hImageHandle);
// 设置它为非受信状态
KeClearEvent(pDevExt->ImageEvent);
status = PsSetLoadImageNotifyRoutine(ImageCallback);
if (!NT_SUCCESS( status ))
{
DbgPrint("PsSetLoadImageNotifyRoutine()\n");
return status;
}
return status;
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
VOID ProcessCallback(IN HANDLE hParentId, IN HANDLE hProcessId, IN BOOLEAN bCreate)
{
// 得到设备扩展结构的指针
PEPROCESS EProcess;
ULONG ulCurrentProcessId;
char * lpCurProc;
NTSTATUS status;
ANSI_STRING ansiStr ;
PDEVICE_EXTENSION pDevExt;
status = PsLookupProcessByProcessId( (ULONG)hProcessId, &EProcess);
pDevExt = (PDEVICE_EXTENSION)g_pDeviceObject->DeviceExtension;
if (!NT_SUCCESS( status ))
{
DbgPrint("PsLookupProcessByProcessId()\n");
return ;
}
if ( bCreate )
{
// lpCurProc = (LPTSTR)EProcess;
lpCurProc = (char *)((ULONG)EProcess + ProcessNameOffset);
pDevExt->hPParentId = hParentId;
pDevExt->hPProcessId = hProcessId;
pDevExt->bPCreate = bCreate;
RtlInitUnicodeString(&(pDevExt->strType),L"001");
RtlInitAnsiString(&ansiStr, lpCurProc) ;
RtlAnsiStringToUnicodeString(&pDevExt->strProcessname, &ansiStr, TRUE) ;
DbgPrint( "CREATE PROCESS = PROCESS NAME: %wZ , PROCESS PARENTID: %d, PROCESS ID: %d, PROCESS ADDRESS %x:\n",
&pDevExt->strProcessname,
hParentId,
hParentId,//PId,
EProcess );
}
else
{
//DbgPrint( "TERMINATED == PROCESS ID: %d\n", PId);
pDevExt->hPProcessId = hProcessId;
pDevExt->bPCreate = bCreate;
}
// 触发这个事件,以便任何正在监听的用户程序知道有事情发生了。
// 用户模式下的应用程序不能重置KM事件,所以我们要在这里触发它
KeSetEvent(pDevExt->ProcessEvent, 0, FALSE);
KeClearEvent(pDevExt->ProcessEvent);
}
VOID ThreadCallback (IN HANDLE PId, IN HANDLE TId, IN BOOLEAN bCreate)
{
// 得到设备扩展结构的指针
PEPROCESS EProcess;
ULONG ulCurrentProcessId;
char * lpCurProc;
NTSTATUS status;
ANSI_STRING ansiStr ;
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)g_pDeviceObject->DeviceExtension;
status = PsLookupProcessByProcessId( (ULONG)PId, &EProcess);
if (!NT_SUCCESS( status ))
{
DbgPrint("PsLookupProcessByProcessId()\n");
return ;
}
if ( bCreate )
{
// lpCurProc = (LPTSTR)EProcess;
lpCurProc = (char *)((ULONG)EProcess + ProcessNameOffset);
pDevExt->hPParentId = PId;
pDevExt->hPProcessId = TId;
pDevExt->bPCreate = bCreate;
RtlInitUnicodeString(&(pDevExt->strType),L"002");
RtlInitAnsiString(&ansiStr, lpCurProc) ;
RtlAnsiStringToUnicodeString(&pDevExt->strProcessname, &ansiStr, TRUE) ;
DbgPrint( "CREATE THREAD = PROCESS NAME: %s PROCESS ID: %d, THREAD ID: %d\n", lpCurProc, PId, TId );
}
else
{
//DbgPrint( "TERMINATED == PROCESS ID: %d\n", PId);
pDevExt->hPProcessId = TId;
pDevExt->bPCreate = bCreate;
}
// 触发这个事件,以便任何正在监听的用户程序知道有事情发生了。
// 用户模式下的应用程序不能重置KM事件,所以我们要在这里触发它
KeSetEvent(pDevExt->TheradEvent, 0, FALSE);
KeClearEvent(pDevExt->TheradEvent);
}
我不知道为什么,刚开始打印的正确的
可是过一下就蓝屏了,我刚开始学驱动
希望能给点建议