小编Ori*_*avi的帖子

Windows 内核驱动程序:如何确定线程是否终止?

我有一个线程用于某些操作,它需要保持活动状态,直到标志另有说明为止。

我使用PsCreateSystemThread创建线程,然后使用ObReferenceObjectByHandle获取ETHREAD对象引用,以在使用KeWaitForSingleObject卸载驱动程序之前等待线程终止。

创建线程并检索对它的引用的函数:

ntStatus = PsCreateSystemThread(
    &hThread,
    (ACCESS_MASK)0, NULL,
    (HANDLE)0, NULL,
    ThreadRoutine,
    (PVOID)pThreadData
);
if (!NT_SUCCESS(ntStatus))
{
    return ntStatus;
}

ntStatus = ObReferenceObjectByHandle(
    hThread,
    THREAD_ALL_ACCESS,
    NULL,
    KernelMode,
    (PVOID*)&ptThreadObject,
    NULL
);
if (!NT_SUCCESS(ntStatus))
{
    bStopThread = TRUE;
    ptThreadObject = NULL;
    return ntStatus;
}
Run Code Online (Sandbox Code Playgroud)

线程例程:

LARGE_INTEGER liSleepTime;
while (FALSE == bThread)
{
    liSleepTime.QuadPart = 1000 * RELATIVE_MILLISECOND;
    KeDelayExecutionThread(KernelMode, FALSE, (&liSleepTime));

    ExAcquireFastMutex(&fmMutex);
    //DO SOMTHING
    ExReleaseFastMutex(&fmMutex);
}

PsTerminateSystemThread(STATUS_SUCCESS);
Run Code Online (Sandbox Code Playgroud)

卸载驱动函数:

if (NULL != ptThreadObject)
{
    bStopThread = …
Run Code Online (Sandbox Code Playgroud)

c windows multithreading driver windows-kernel

5
推荐指数
1
解决办法
2522
查看次数

synchronized(this)是否仅锁定同步块或所有"this"代码?

public class ObjectCounter {
    private static long numOfInstances = 0;
    public ObjectCounter(){
        synchronized(this){
        numOfInstances++;
        }
    }
    **public static synchronized long getCount(){
        return numOfInstances;
    }**
//vs//
    **public static long getCount(){
        return numOfInstances;
    }**
}
Run Code Online (Sandbox Code Playgroud)

如果我运行少量线程,其中一些调用静态函数getCount(),其中一些创建新实例.我希望每次调用getCount()实际数量的实例.

  1. 代码中的两个选项有区别吗?
  2. 如果我锁定" this"不应该意味着我不能调用,getCount()直到构造函数退出synchronized块(假设我没有在getCount()上写同步).
  3. 如果我在代码中的某个地方执行同步块,它是仅锁定同步块还是所有" this"代码?
  4. 从这里开始编辑:谢谢大家,这非常有帮助,但我还有一些问题可以回答你的问题.
  5. 如果我理解正确,synchronized(this)块不会影响(或连接到)静态同步函数(以锁定术语而不是numOfInstances增量)?
  6. 是否有更好的选项来使增量和getCount()函数线程安全?(比如打开一个静态对象并执行synchronized(obj)而不是synchronized(this) - 朋友建议).
  7. 如果我在ObjectCounter类中有一个f1()方法(非静态),而一个线程在同步(this)中,其他线程可以输入f1()块(不是同步类或者里面有同步块)?
  8. 如果我在ObjectCounter中有一个f1()方法(非静态)和f2()方法(非静态),在f1()中我有同步(this)块.当一个线程在同步(this)块中时,其他线程是否可以进入f1()块(不是同步类或内部有同步块)?(假设两个线程在同一个实例上"工作")

`

java multithreading synchronized synchronized-block java-threads

4
推荐指数
1
解决办法
1996
查看次数

如何使用汇编程序(x64 OS)获取进程环境块(PEB)地址?

我正在尝试使用汇编程序获取当前进程的 PEB 地址。

cpp文件:

#include <iostream>
//#include <windows.h>

extern "C" int* __ptr64 Get_Ldr_Addr();

int main(int argc, char **argv)
{
    std::cout << "asm     " << Get_Ldr_Addr() << "\n";
    //std::cout <<"peb     "<< GetModuleHandle(0) << "\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

asm 文件:

.code

Get_Ldr_Addr proc
    push rax
    mov rax, GS:[30h]
    mov rax, [rax + 60h]
    pop rax
    ret
Get_Ldr_Addr endp

end
Run Code Online (Sandbox Code Playgroud)

但是我从 GetModuleHandle(0) 和 Get_Ldr_Addr() 得到了不同的地址!

问题是什么?不应该是一样的吗?

问:如果函数是外部函数,它会检查调用它的进程的PEB或函数的dll(假设是一个dll)?

Tnx

c++ assembly masm

2
推荐指数
1
解决办法
1万
查看次数