/* Zero-libc CUDA driver loader for Windows * PEB walk -> nvcuda.dll -> PE export table -> 25 CUDA functions * Janet kernel config uploaded to device constant memory on init */ typedef unsigned long long uint64_t; typedef unsigned int uint32_t; typedef unsigned short uint16_t; typedef unsigned char uint8_t; typedef int int32_t; typedef long long int64_t; typedef unsigned long ULONG; typedef void* PVOID; typedef PVOID HANDLE; typedef uint32_t DWORD; typedef uint64_t ULONG_PTR; typedef ULONG_PTR SIZE_T; typedef uint16_t WORD; typedef uint32_t UINT; typedef long LONG; typedef uint16_t ATOM; typedef int BOOL; typedef unsigned long long CUdeviceptr; typedef int CUdevice; typedef int CUdevice_attribute; typedef struct CUctx_st* CUcontext; typedef struct CUmod_st* CUmodule; typedef struct CUfunc_st* CUfunction; typedef struct CUstream_st* CUstream; typedef struct CUevent_st* CUevent; typedef enum { CUDA_SUCCESS = 0, CUDA_ERROR_INVALID_VALUE = 1, CUDA_ERROR_OUT_OF_MEMORY = 2, CUDA_ERROR_NOT_INITIALIZED = 3, CUDA_ERROR_NO_DEVICE = 100, } CUresult; typedef struct { struct _LIST_ENTRY* Flink; struct _LIST_ENTRY* Blink; } LIST_ENTRY, *PLIST_ENTRY; typedef struct { uint16_t Length; uint16_t MaximumLength; wchar_t* Buffer; } UNICODE_STRING; typedef struct { LIST_ENTRY InLoadOrderLinks; LIST_ENTRY InMemoryOrderLinks; LIST_ENTRY InInitializationOrderLinks; PVOID DllBase; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; typedef struct { ULONG Length; BOOL Initialized; HANDLE SsHandle; LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA; typedef struct { uint8_t Reserved1[2]; uint8_t BeingDebugged; uint8_t Reserved2[1]; PVOID Reserved3[2]; PPEB_LDR_DATA Ldr; } PEB, *PPEB; typedef struct { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cparhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; WORD e_sp; WORD e_csum; WORD e_ip; WORD e_cs; WORD e_lfarlc; WORD e_ovno; WORD e_res[4]; WORD e_oemid; WORD e_oeminfo; WORD e_res2[10]; LONG e_lfanew; } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; typedef struct { WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; } IMAGE_FILE_HEADER; typedef struct { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY; typedef struct { WORD Magic; uint8_t MajorLinkerVersion; uint8_t MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; DWORD BaseOfCode; ULONG_PTR ImageBase; DWORD SectionAlignment; DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Win32VersionValue; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; ULONG_PTR SizeOfStackReserve; ULONG_PTR SizeOfStackCommit; ULONG_PTR SizeOfHeapReserve; ULONG_PTR SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[16]; } IMAGE_OPTIONAL_HEADER64; typedef struct { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; typedef struct { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; DWORD AddressOfNames; DWORD AddressOfNameOrdinals; } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; /* CUDA function pointer typedefs */ typedef CUresult (*cuInit_t)(UINT); typedef CUresult (*cuDeviceGet_t)(CUdevice*, int); typedef CUresult (*cuDeviceGetCount_t)(int*); typedef CUresult (*cuCtxCreate_v2_t)(CUcontext*, UINT, CUdevice); typedef CUresult (*cuModuleLoadData_t)(CUmodule*, const void*); typedef CUresult (*cuModuleGetFunction_t)(CUfunction*, CUmodule, const char*); typedef CUresult (*cuLaunchKernel_t)(CUfunction, UINT,UINT,UINT, UINT,UINT,UINT, UINT, CUstream, void**, void**); typedef CUresult (*cuMemAlloc_v2_t)(CUdeviceptr*, SIZE_T); typedef CUresult (*cuMemFree_v2_t)(CUdeviceptr); typedef CUresult (*cuMemcpyHtoD_v2_t)(CUdeviceptr, const void*, SIZE_T); typedef CUresult (*cuMemcpyDtoH_v2_t)(void*, CUdeviceptr, SIZE_T); typedef CUresult (*cuStreamCreate_t)(CUstream*, UINT); typedef CUresult (*cuStreamDestroy_v2_t)(CUstream); typedef CUresult (*cuStreamSynchronize_t)(CUstream); typedef CUresult (*cuEventCreate_t)(CUevent*, UINT); typedef CUresult (*cuEventRecord_t)(CUevent, CUstream); typedef CUresult (*cuEventSynchronize_t)(CUevent); typedef CUresult (*cuEventElapsedTime_t)(float*, CUevent, CUevent); typedef CUresult (*cuEventDestroy_v2_t)(CUevent); typedef CUresult (*cuCtxSynchronize_t)(void); typedef CUresult (*cuGetErrorString_t)(CUresult, const char**); typedef CUresult (*cuDeviceGetAttribute_t)(int*, CUdevice_attribute, CUdevice); typedef CUresult (*cuCtxGetDevice_t)(CUdevice*); typedef CUresult (*cuModuleUnload_t)(CUmodule); typedef CUresult (*cuCtxDestroy_v2_t)(CUcontext); /* Globals */ static cuInit_t g_cuInit; static cuDeviceGet_t g_cuDeviceGet; static cuDeviceGetCount_t g_cuDeviceGetCount; static cuCtxCreate_v2_t g_cuCtxCreate_v2; static cuModuleLoadData_t g_cuModuleLoadData; static cuModuleGetFunction_t g_cuModuleGetFunction; static cuLaunchKernel_t g_cuLaunchKernel; static cuMemAlloc_v2_t g_cuMemAlloc_v2; static cuMemFree_v2_t g_cuMemFree_v2; static cuMemcpyHtoD_v2_t g_cuMemcpyHtoD_v2; static cuMemcpyDtoH_v2_t g_cuMemcpyDtoH_v2; static cuStreamCreate_t g_cuStreamCreate; static cuStreamDestroy_v2_t g_cuStreamDestroy_v2; static cuStreamSynchronize_t g_cuStreamSynchronize; static cuEventCreate_t g_cuEventCreate; static cuEventRecord_t g_cuEventRecord; static cuEventSynchronize_t g_cuEventSynchronize; static cuEventElapsedTime_t g_cuEventElapsedTime; static cuEventDestroy_v2_t g_cuEventDestroy_v2; static cuCtxSynchronize_t g_cuCtxSynchronize; static cuGetErrorString_t g_cuGetErrorString; static cuDeviceGetAttribute_t g_cuDeviceGetAttribute; static cuCtxGetDevice_t g_cuCtxGetDevice; static cuModuleUnload_t g_cuModuleUnload; static cuCtxDestroy_v2_t g_cuCtxDestroy_v2; static CUdeviceptr g_power_state_dev; float g_janet_kernel_config[8] = {1.0f,0.5f,0.25f,0.125f,8.0f,16.0f,32.0f,64.0f}; /* PEB walk helpers */ static PVOID peb_get(void) { PVOID peb; __asm__ volatile ("mov %%gs:0x60, %0" : "=r"(peb)); return peb; } static PVOID find_module(const wchar_t* target) { PPEB peb = (PPEB)peb_get(); if (!peb || !peb->Ldr) return 0; PLIST_ENTRY head = &peb->Ldr->InMemoryOrderModuleList; PLIST_ENTRY cur = head->Flink; while (cur != head) { PLDR_DATA_TABLE_ENTRY e = (PLDR_DATA_TABLE_ENTRY)((uint8_t*)cur - 16); if (e->BaseDllName.Buffer && e->BaseDllName.Length) { const wchar_t* n = e->BaseDllName.Buffer; int ok = 1; for (int i = 0; i < e->BaseDllName.Length/2; i++) { wchar_t a = n[i], b = target[i]; if (a>='A'&&a<='Z') a+=32; if (b>='A'&&b<='Z') b+=32; if (a != b) { ok = 0; break; } } if (ok && target[e->BaseDllName.Length/2]==0) return e->DllBase; } cur = cur->Flink; } return 0; } static PVOID get_export(PVOID base, const char* name) { if (!base) return 0; PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)base; if (dos->e_magic != 0x5A4D) return 0; PIMAGE_NT_HEADERS64 nt = (PIMAGE_NT_HEADERS64)((uint8_t*)base + dos->e_lfanew); if (nt->Signature != 0x4550) return 0; DWORD erva = nt->OptionalHeader.DataDirectory[0].VirtualAddress; if (!erva) return 0; PIMAGE_EXPORT_DIRECTORY exp = (PIMAGE_EXPORT_DIRECTORY)((uint8_t*)base + erva); DWORD* nms = (DWORD*)((uint8_t*)base + exp->AddressOfNames); DWORD* fns = (DWORD*)((uint8_t*)base + exp->AddressOfFunctions); WORD* ords = (WORD*)((uint8_t*)base + exp->AddressOfNameOrdinals); int lo=0, hi=(int)exp->NumberOfNames-1; while (lo<=hi) { int mid=(lo+hi)>>1; const char* mn = (const char*)((uint8_t*)base + nms[mid]); int cmp=0; for (int i=0;;i++) { if (!mn[i]&&!name[i]) break; if (mn[i]!=name[i]) { cmp=(mn[i]