c - Hvordan passerer parametre til ZwCreateThreadEx rutine?

Indlæg af Hanne Mølgaard Plasc

Problem



Denne kode nedenfor fungerer fint for at oprette adskilte tråde uden at overføre nogen parameter af datatyper. Nu vil jeg vide, hvordan jeg kan videresende parametre til metode, der udføres, når ZwCreateThreadEx hedder?


For eksempel, hvordan passer en HANDLE -type og en type UNICODE\_STRING ?


Min aktuelle kode:


#include "stdafx.h"
#include <conio.h>
#include <windows.h>
#include <Winternl.h>

#pragma comment(lib,"ntdll.lib")

void WINAPI ContinueExecution(LPVOID param)
{
    printf("This thread is hidden from debugger!"); 
}

NTSTATUS(NTAPI *ZwCreateThreadEx) (
    \_Out\_ PHANDLE ThreadHandle,
    \_In\_ ACCESS\_MASK DesiredAccess,
    \_In\_opt\_ POBJECT\_ATTRIBUTES ObjectAttributes,
    \_In\_ HANDLE ProcessHandle,
    \_In\_ PVOID StartRoutine,
    \_In\_opt\_ PVOID Argument,
    \_In\_ ULONG CreateFlags,
    \_In\_opt\_ ULONG\_PTR ZeroBits,
    \_In\_opt\_ SIZE\_T StackSize,
    \_In\_opt\_ SIZE\_T MaximumStackSize,
    \_In\_opt\_ PVOID AttributeList
    );

NTSTATUS(NTAPI *ZwClose)(IN HANDLE ObjectHandle);

#if (NTDDI\_VERSION >= NTDDI\_VISTA)
#define THREAD\_ALL\_ACCESS         (STANDARD\_RIGHTS\_REQUIRED | SYNCHRONIZE | 
    0xFFFF)
#else
#define THREAD\_ALL\_ACCESS         (STANDARD\_RIGHTS\_REQUIRED | SYNCHRONIZE | 
    0x3FF)
#endif

#define THREAD\_CREATE\_FLAGS\_HIDE\_FROM\_DEBUGGER      0x00000004
#define ZwCurrentProcess() ( (HANDLE)(LONG\_PTR) -1 ) 

int \_tmain(int argc, \_TCHAR* argv[])
{

    HANDLE hThread = 0;
    HMODULE hNtdll = GetModuleHandleA("ntdll");

    ZwCreateThreadEx = (NTSTATUS(NTAPI *) (PHANDLE, ACCESS\_MASK, POBJECT\_ATTRIBUTES, HANDLE, PVOID, PVOID, ULONG, ULONG\_PTR, SIZE\_T, SIZE\_T, PVOID)) GetProcAddress(hNtdll, "ZwCreateThreadEx");
    if (ZwCreateThreadEx == NULL) return FALSE;

    ZwClose = (NTSTATUS(NTAPI *)(IN HANDLE ObjectHandle)) GetProcAddress(hNtdll, "ZwClose");
    if (ZwClose == NULL) return FALSE;

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

        if (ntStat >= 0)
        {
            WaitForSingleObject(hThread, INFINITE);
        }
        else
        {
            printf("NtCreateThreadEx failed!");
        }

        ZwClose(hThread);

    }

    \_getch();

    return 0;
}

Bedste reference


Hvis du vil overføre mere end en værdi til din trådfunktion, skal du bruge en struktur til at holde disse værdier. Og afhængigt af kodeudformningen kan struktureksemplet muligvis være dynamisk allokeret (hvis det var lokalt for funktionen, der kalder ZwCreateThreadEx, kan det godt være, at det ikke længere er gyldigt, når tråden rent faktisk kører).


Og som Martin James siger, vil du så sende en peger til den strukturelle instans som Argument-parameteren.