#include <ntddk.h>

// returns the current Code Segment
WORD getCS()
{
	WORD tmpCS;
	__asm
	{
		mov eax, [esp+4*4+8*4+4] //4 segments pushes, pushad, CS(+4)
		mov tmpCS, eax
	}
	return tmpCS;
}

NTSTATUS WINAPI PsLookupThreadByThreadId(DWORD tid, PETHREAD *ppKThread);

NTSTATUS WINAPI ObOpenObjectByPointer(
    IN PVOID Object,
    IN unsigned long HandleAttributes,
    IN PACCESS_STATE PassedAccessState OPTIONAL,
    IN ACCESS_MASK DesiredAccess OPTIONAL,
    IN POBJECT_TYPE ObjectType OPTIONAL,
    IN KPROCESSOR_MODE AccessMode,
    OUT PHANDLE Handle
);

extern POBJECT_TYPE *PsThreadType;

HANDLE OpenThread(IN DWORD threadID, IN ACCESS_MASK DesiredAccess)
{
	PETHREAD ethreadp;
	HANDLE tHandle;
	NTSTATUS status;

	if ((status = PsLookupThreadByThreadId(threadID, &ethreadp)) != 0)
	{
		KdPrint( ("RTInterrupt.sys: PsLookupThreadByThreadId 0x%08X\n", status) );
	}

	if ((status = ObOpenObjectByPointer(ethreadp, 0, NULL, DesiredAccess, *PsThreadType, KernelMode, &tHandle)) != 0)
	{
		KdPrint( ("RTInterrupt.sys: PsLookupThreadByThreadId 0x%08X\n", status) );
	}

	return tHandle;

}


//SetProcessAffinityMask