c - Hvordan oprettes en tråd, der bruger ZwCreateThreadEx funktionen korrekt og venter på din afslutning?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg monterede denne kode nedenfor, hvor jeg forsøger at oprette en tråd ved hjælp af ZwCreateThreadEx funktionen og vil vide, hvordan gør dette korrekt og vente på din færdiggørelse?


===================



#include <ntddk.h>
#include <WinDef.h>

NTSTATUS NTAPI ZwCreateThreadEx(OUT PHANDLE ThreadHandle, IN ACCESS\_MASK DesiredAccess, IN POBJECT\_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN LPVOID lpStartAddress, IN LPVOID lpParameter, IN BOOL CreateSuspended, IN ULONG StackZeroBits, IN ULONG SizeOfStackCommit, IN ULONG SizeOfStackReserve, OUT LPVOID lpBytesBuffer);

typedef DWORD(\_\_stdcall *LPTHREAD\_START\_ROUTINE) (
    [in] LPVOID lpThreadParameter
    );

#define THREAD\_CREATE\_FLAGS\_HIDE\_FROM\_DEBUGGER 0x00000004

typedef struct ARGS {
    HANDLE h;
    UNICODE\_STRING str;
}ARGS;

void WINAPI ContinueExecution(LPVOID param)
{
    ARGS *pArgs = (ARGS*)param;

    DbgPrint("Thread: \%d | \%wZ 
", pArgs->h, &pArgs->str);

}

NTSTATUS DriverEntry(IN PDRIVER\_OBJECT DriverObject, IN PUNICODE\_STRING  RegistryPath)
{

HANDLE hThread = 0;

ARGS args;
args.h = 123;
args.str = any UNICODE\_STRING value;

NTSTATUS ntStat = ZwCreateThreadEx(&hThread, THREAD\_ALL\_ACCESS, 0, ZwCurrentProcess(), (LPTHREAD\_START\_ROUTINE)ContinueExecution, &args, THREAD\_CREATE\_FLAGS\_HIDE\_FROM\_DEBUGGER, 0, 0, 0, 0);

if (ntStat >= 0)
{
    KeWaitForSingleObject(hThread, INFINITE);
    ZwClose(hThread);
}
else
{
    DbgPrint("ZwCreateThreadEx failed!");
}

  return STATUS\_SUCCESS;
}


EDITION:


Jeg har 2 problemer i denne kode, den første er i forhold til definitionen af ​​ZwCreateThreadEx funktionen, der er uløst ekstern og den anden (KeWaitForSingleObject) synes at var løst, se nedenfor:


status = KeWaitForSingleObject(&hThread, Executive, KernelMode, FALSE, NULL);
         DbgPrint("KeWaitForSingleObject() status: \%#X", status);

Bedste reference