能力值:
( LV12,RANK:420 )
2 楼
KeWaitForSingleObject,等待线程对象
能力值:
( LV9,RANK:610 )
3 楼
Klog里面不就有例子嘛
能力值:
( LV3,RANK:20 )
4 楼
我试了啊
再卸载函数前
KeInitializeEvent(&ThreadCloseOK,SynchronizationEvent,TRUE);
Thread_RunSign =FALSE;
KeWaitForSingleObject(&ThreadCloseOK,Executive,KernelMode,0,0); 线程最后
KeSetEvent(&ThreadCloseOK,0,TRUE);
PsTerminateSystemThread(STATUS_SUCCESS);
结果还是蓝啊。。
能力值:
( LV2,RANK:10 )
5 楼
Bug Check 0xCE: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS The DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bug check has a value of 0x000000CE. This indicates that a driver failed to cancel pending operations before unloading. Parameters The following parameters are displayed on the blue screen. Parameter Description 1 Memory address referenced 2 0: Read 1: Write 3 Address that referenced memory (if known) 4 Reserved If the driver responsible for the error can be identified, its name is printed on the blue screen and stored in memory at the location (PUNICODE_STRING) KiBugCheckDriver. Cause This driver failed to cancel lookaside lists, DPCs, worker threads, or other such items before unload.
KeSetEvent(&ThreadCloseOK,0,TRUE); PsTerminateSystemThread(STATUS_SUCCESS);
KeSetEvent(&ThreadCloseOK,0,TRUE)执行后就可能导致线程重新调度
从而再次调度worker thread时 PsTerminateSystemThread(STATUS_SUCCESS);地址已经被释放了
所以应该直接在线程上等待
总结起来,有两点
1.Windows 内核是抢占式的
2.线程也是可等待对象
能力值:
( LV3,RANK:20 )
6 楼
所以应该直接在线程上等待???怎么等待啊??
能力值:
( LV3,RANK:20 )
7 楼
KEVENT ThreadCloseOK;
BOOL MyThread_RunSign = FALSE;
VOID MyThread(IN PVOID context)
{
while(MyThread_RunSign )
{
;
}
KeSetEvent(&ThreadCloseOK,(KPRIORITY)0,TRUE);
PsTerminateSystemThread(STATUS_SUCCESS);
}
VOID MyDriverUnload(IN PDRIVER_OBJECT DriverObject)
{
PDEVICE_OBJECT pdoNextDeviceObj = pdoGlobalDrvObj->DeviceObject;
//关闭 线程
KeInitializeEvent(&ThreadCloseOK,SynchronizationEvent,TRUE);
MyThread_RunSign =FALSE;
KeWaitForSingleObject(&ThreadCloseOK,Executive,KernelMode,FALSE,0);
} NTSTATUS DriverEntry(IN OUT PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
HANDLE ThreadHandle = 0;
Thread_RunSign =TRUE;
PsCreateSystemThread(&ThreadHandle,0L,NULL,NULL,NULL,MyThread,NULL);
if (ThreadHandle)
{
ZwClose(ThreadHandle);
}
DriverObject->DriverUnload =MyDriverUnload;
return STATUS_SUCCESS; 大概的代码,逻辑是这样。。请问应该再怎么做?
能力值:
( LV12,RANK:1010 )
8 楼
VOID
ThreadLogger (
IN
PVOID pContext
)
/*++
Author: WangYu [keenjoy95@GMAIL.COM]
Time : 2008/12/20 [20:12:2008 - 10:16]
Routine Description:
记录日志的线程
--*/
{
IO_STATUS_BLOCK io_status ;
NTSTATUS status = STATUS_SUCCESS ;
PLOG_DATA kData =
NULL ;
PLIST_ENTRY pListEntry =
NULL ;
PPROCESS_UNIT pTemp =
NULL ;
PDEVICE_EXTENSION pDeviceExtension = (PDEVICE_EXTENSION)pContext ;
while ( 1 )
{
// Wait for data to become available in the queue
KeWaitForSingleObject(
&pDeviceExtension->semQueue,
Executive,
KernelMode,
FALSE ,
NULL );
// 将得到的信息从队列中摘出来
pListEntry = ExInterlockedRemoveHeadList(&pDeviceExtension->QueueListHead,
&pDeviceExtension->lockQueue);
if (
TRUE == pDeviceExtension->bThreadTerminate ) {
PsTerminateSystemThread( STATUS_SUCCESS );
// 这女人..
}
kData = CONTAINING_RECORD(pListEntry,LOG_DATA,ListEntry);
// 不存在我的进程结构,继续等待
if (
NULL == g_ProcessUnit ) {
continue ; }
pTemp = g_ProcessUnit ;
// 临时指针来操作
while ( pTemp )
{
// 拥有日志句柄的进程(也就是样本进程) 产生了事件
if ( kData->PID == pTemp->UniqueProcessId && pTemp->LogFile )
{
// 日志之
status = ZwWriteFile(
pTemp->LogFile,
NULL ,
NULL ,
NULL ,
&io_status,
kData->Logs,
strlen(kData->Logs),
NULL ,
NULL );
if ( !NT_SUCCESS(status) ) {
dprintf(
"ThreadLogger() --> ZwWriteFile. Failed [0x%08lx] \n" , status) ;
}
WriteMumaFile( (
ULONG )pTemp->Flags, (
ULONG )pTemp->pEprocess, (
PVOID )pDeviceExtension ) ;
ExFreePool( kData );
// 释放内存,要不撑爆了
break ;
}
pTemp = pTemp->Next;
}
}
return ;
}
能力值:
( LV2,RANK:10 )
9 楼
use Remove Locks
能力值:
( LV3,RANK:20 )
10 楼
use Remove Locks ?能具体点吗?
上面的代码 看着有点晕。。。似乎不完整。。
能力值:
( LV12,RANK:750 )
11 楼
晕,创建系统线程前 记录系统的KThread,在Unload的时候KeWaitForXXX
能力值:
( LV3,RANK:20 )
12 楼
大哥。。代码或例子有吗?
能力值:
( LV3,RANK:20 )
13 楼
哈哈...
最好事件初始化在主函数中,不要用全局变量,用放结构体里
参考我这个看看
。http://bbs.pediy.com/showthread.php?t=88954
能力值:
( LV12,RANK:420 )
14 楼
直接wait线程对象
例如:
PVOID pThread = NULL ;
BOOL KillThread = FALSE ;
VOID SystemThread()
{
...
if (KillThread == TRUE)
PsTerminateSystemThread(0);
}
DrvUnload()
{
KillThread = TRUE ;
KeWaitForSingleObject(pThread...);
}
DriverEntry()
{
....
PsCreateSystemThread(..., &cid , SystemThread);
PsLookupThreadByThreadId(cid.tid , &pThread);
}
能力值:
( LV3,RANK:20 )
15 楼
cid 是什么结构?
能力值:
( LV3,RANK:20 )
16 楼
CLIENT_ID
成功解决啦~~哈哈哈 谢谢
PsCreateSystemThread(&ThreadHandle,0L,NULL,NULL,&cid,MyThread,NULL);
if (ThreadHandle)
{
PsLookupThreadByThreadId(cid.UniqueThread, (PETHREAD *)&pThread);
ZwClose(ThreadHandle);
}
解决啦 感谢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
能力值:
( LV2,RANK:10 )
17 楼
CLIENT_ID ThreadCID;
PETHREAD pEThread;
PsLookupThreadByThreadId ( ThreadCID.UniqueThread , &pEThread );
编译提示:error C4013: 'PsLookupThreadByThreadId' undefined; assuming extern returning int
怎么会这样啊?
能力值:
( LV2,RANK:10 )
18 楼
楼主学习办法真不行。你去探索这个函数的原型不就知道了吗?