This Small Function Let You call winapi dynamically, without having to define function definition, or writing nonsense wrappers.
Code:
void* DynCall(void *ptr, ...)
{
char* function;
char* library;
va_list va;
void *p;
int i = 0;
DWORD argBuf[32];
DWORD ret;
HANDLE lib;
va_start(va, ptr);
library = ptr;
function = va_arg(va, void*);
p = va_arg(va, void *);
if(!(lib = GetModuleHandleA(library)))
lib = _LoadLibraryA(library);
if (!lib)
error("Cant load libarary %s", library);
void *funcAddress = _GetProcAddress(lib, function);
if (!funcAddress)
error("Cant Find Dynamic Address %s", function);
for (; p != 0xb33f; p = va_arg(va, void *)) {
argBuf[i++] = p;
}
for (i--; i >= 0; i--)
{
p = argBuf[i];
_asm {
push p
}
}
va_end(va);
_asm {
push lb
jmp funcAddress
lb:
mov ret, eax
}
return ret;
}
Example :
Code:
DWORD dwResult = DynCall("ntdll.dll","NtUnmapViewOfSection",
PI.hProcess,
(LPVOID)(NtHeader->OptionalHeader.ImageBase),0xb33f
);
Dont forget to add one extra paramater at end i.e
0xb33f
I think it will be useful to someone.