pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1377回复: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]
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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]
sean198148
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2014-10-08
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望26点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-27 20:20
在unload的时候通常设备对象都已经删除了
所以(DriverObject->DeviceObject)->DeviceExtension应该不行。
为什么一定要在unload的时候停止线程呢,其它的地方不行吗
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-27 22:18
其他地方肯定可以阿
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
地下室#
发布于:2004-11-29 04:02
全局变量不能用么.....
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2004-11-29 11:03
VOID
Unload(
    IN PDRIVER_OBJECT DriverObject
    )
{
StopThread(DriverObject->DeviceObject)->DeviceExtension)
IoDeleteSymbolicLink(...)
IoDeleteDevice( DriverObject->DeviceObject);
...
}
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
ananda
驱动牛犊
驱动牛犊
  • 注册日期2003-12-12
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-30 21:12
在这个 IRP_MN_STOP_DEVICE irp时stopthread
xqchen
驱动牛犊
驱动牛犊
  • 注册日期2001-09-07
  • 最后登录2004-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于: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.
游客

返回顶部