mirror of
https://github.com/reactos/reactos.git
synced 2024-11-20 06:15:26 +00:00
7248541e08
svn path=/trunk/; revision=30317
90 lines
1.9 KiB
C
90 lines
1.9 KiB
C
#include "w32knapi.h"
|
|
|
|
HINSTANCE g_hInstance;
|
|
HMODULE g_hModule = NULL;
|
|
PGDI_TABLE_ENTRY GdiHandleTable;
|
|
|
|
static DWORD STDCALL
|
|
IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
|
|
{
|
|
DWORD ret;
|
|
|
|
asm volatile
|
|
(
|
|
"pushfl;" // Save flags
|
|
"movl %%ecx, %%eax;"
|
|
"shl $2, %%eax;" // Calculate param size
|
|
"subl %%eax, %%esp;" // Calculate new stack pos
|
|
"movl %%esp, %%edi;" // Destination is stackpointer
|
|
"cld;" // Clear direction flag
|
|
"rep movsd;" // Copy params to the stack
|
|
"call *%%edx;" // Call function
|
|
"popfl;" // Restore flags
|
|
: "=a" (ret)
|
|
: "S" (pFirstParam), "c" (cParams), "d"(proc)
|
|
: "%edi"
|
|
);
|
|
|
|
return ret;
|
|
}
|
|
|
|
DWORD
|
|
Syscall(LPWSTR pszFunction, int cParams, void* pParams)
|
|
{
|
|
char szFunctionName[MAX_PATH];
|
|
|
|
sprintf(szFunctionName, "%ls", pszFunction);
|
|
FARPROC proc = (FARPROC)GetProcAddress(g_hModule, szFunctionName);
|
|
if (!proc)
|
|
{
|
|
printf("Couldn't find proc: %s\n", szFunctionName);
|
|
return FALSE;
|
|
}
|
|
|
|
return IntSyscall(proc, cParams, pParams);
|
|
}
|
|
|
|
BOOL
|
|
IsFunctionPresent(LPWSTR lpszFunction)
|
|
{
|
|
char szFunctionName[MAX_PATH];
|
|
sprintf(szFunctionName, "%ls", lpszFunction);
|
|
return (GetProcAddress(g_hModule, szFunctionName) != NULL);
|
|
}
|
|
|
|
int APIENTRY
|
|
WinMain(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
g_hInstance = hInstance;
|
|
GDIQUERYPROC GdiQueryTable;
|
|
|
|
printf("Win32k native API test\n");
|
|
|
|
/* Convert to gui thread */
|
|
// IsGUIThread(TRUE); <- does not exists on win2k
|
|
|
|
g_hModule = LoadLibraryW(L"w32kdll.dll");
|
|
if (!g_hModule)
|
|
{
|
|
printf("w32kdll.dll not found!\n");
|
|
return -1;
|
|
}
|
|
|
|
GdiQueryTable = (GDIQUERYPROC)GetProcAddress(GetModuleHandleW(L"GDI32.DLL"), "GdiQueryTable");
|
|
if(!GdiQueryTable)
|
|
{
|
|
return -1;
|
|
}
|
|
GdiHandleTable = GdiQueryTable();
|
|
if(!GdiHandleTable)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
return TestMain(L"w32knapi", L"win32k.sys Nt-Api");
|
|
}
|