pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1378回复:7

结束线程的问题

楼主#
更多 发布于:2004-11-27 13:17
按照walter的方法,结束线程时发送事件,
我是这么运用的,在DriverEntry中startthread,在DriverUnload中stopthread,但是问题是DriverUnload的参数是没有设备扩展的,这么操作那个事件?
walter的例子:
typedef struct _DEVICE_EXTENSION {

  KEVENT evKill;
  PKTHREAD thread;
  };

NTSTATUS StartThread(PDEVICE_EXTENSION pdx)
  {
  NTSTATUS status;
  HANDLE hthread;
  OBJECT_ATTRIBUTES oa;
  InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE,
    NULL, NULL);
  status = PsCreateSystemThread(&hthread, THREAD_ALL_ACCESS,
    &oa, NULL, NULL, (PKSTART_ROUTINE) ThreadProc, pdx);
  if (!NT_SUCCESS(status))
    return status;
  ObReferenceObjectByHandle(hthread, THREAD_ALL_ACCESS, NULL,
    KernelMode, (PVOID*) &pdx->thread, NULL);
  ZwClose(hthread);
  return STATUS_SUCCESS;
  }

VOID StopThread(PDEVICE_EXTENSION pdx)
  {
  KeSetEvent(&pdx->evKill, 0, FALSE);
  KeWaitForSingleObject(pdx->thread, Executive,
    KernelMode, FALSE, NULL);
  ObDereferenceObject(pdx->thread);
  }

VOID ThreadProc(PDEVICE_EXTENSION pdx)
  {

  KeWaitForXxx(<at least pdx->evKill>);

  PsTerminateSystemThread(STATUS_SUCCESS);
  }


我的运用

NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
    PDEVICE_OBJECT DeviceObject = NULL;
    PDEVICE_EXTENSION DeviceExtension;
 ....
    ntStatus = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION), // DeviceExtensionSize
&ntDeviceName, // DeviceName
FILE_DEVICE, // DeviceType
0, // DeviceCharacteristics
TRUE, // Exclusive
&DeviceObject // [OUT]
);
DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
.....
Startthread(DeviceExtension);
}

DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
//只有 DriverObject怎么操作那个DeviceExtension?
//是不是就是那个(DriverObject->DeviceObject)->DeviceExtension?
}




[编辑 -  11/27/04 by  pwpwpw123]

[编辑 -  11/27/04 by  pwpwpw123]

[编辑 -  11/27/04 by  pwpwpw123]
xqchen
驱动牛犊
驱动牛犊
  • 注册日期2001-09-07
  • 最后登录2004-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-01 05:51
Could you try to StartThread in AddDevice and StopThread when IRP_MN_STOP_DEVICE as ananda recommented? StartThread in DriverEntry might cause re-entry problem if there are multiple devices installed. Certainly, if you want it to be global, being used by multiple device instances, your design is the only way.
ananda
驱动牛犊
驱动牛犊
  • 注册日期2003-12-12
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-30 21:12
在这个 IRP_MN_STOP_DEVICE irp时stopthread
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-11-29 11:03
VOID
Unload(
    IN PDRIVER_OBJECT DriverObject
    )
{
StopThread(DriverObject->DeviceObject)->DeviceExtension)
IoDeleteSymbolicLink(...)
IoDeleteDevice( DriverObject->DeviceObject);
...
}
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
地下室#
发布于:2004-11-29 04:02
全局变量不能用么.....
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-27 22:18
其他地方肯定可以阿
sean198148
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2014-10-08
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望26点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-27 20:20
在unload的时候通常设备对象都已经删除了
所以(DriverObject->DeviceObject)->DeviceExtension应该不行。
为什么一定要在unload的时候停止线程呢,其它的地方不行吗
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-27 19:20
StopThread(DeviceObject->DeviceExtension)
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
游客

返回顶部