+++ /dev/null
-#include "w32knapi.h"
-
-HINSTANCE g_hInstance;
-HMODULE g_hModule = NULL;
-PGDI_TABLE_ENTRY GdiHandleTable;
-
-static
-PGDI_TABLE_ENTRY
-MyGdiQueryTable()
-{
- PTEB pTeb = NtCurrentTeb();
- PPEB pPeb = pTeb->ProcessEnvironmentBlock;
- return pPeb->GdiSharedHandleTable;
-}
-
-BOOL
-IsHandleValid(HGDIOBJ hobj)
-{
- USHORT Index = (ULONG_PTR)hobj;
- PGDI_TABLE_ENTRY pentry = &GdiHandleTable[Index];
-
- if (pentry->KernelData == NULL ||
- pentry->KernelData < (PVOID)0x80000000 ||
- (USHORT)pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16))
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-PVOID
-GetHandleUserData(HGDIOBJ hobj)
-{
- USHORT Index = (ULONG_PTR)hobj;
- PGDI_TABLE_ENTRY pentry = &GdiHandleTable[Index];
-
- if (pentry->KernelData == NULL ||
- pentry->KernelData < (PVOID)0x80000000 ||
- (USHORT)pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16))
- {
- return NULL;
- }
-
- return pentry->UserData;
-}
-
-
-static DWORD WINAPI
-IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
-{
- DWORD retval;
-
-#ifdef __GNUC__
- 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" (retval)
- : "S" (pFirstParam), "c" (cParams), "d"(proc)
- : "%edi"
- );
-#else
- __asm
- {
- pushf
- mov eax, cParams
- shl eax, 2
- sub esp, eax
- mov edi, esp
- cld
- rep movsd
- call proc
- mov retval, eax
- popf
- };
-#endif
-
- return retval;
-}
-
-DWORD
-Syscall(LPWSTR pszFunction, int cParams, void* pParams)
-{
- char szFunctionName[MAX_PATH];
- FARPROC proc;
-
- sprintf(szFunctionName, "%ls", pszFunction);
- 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;
-
- printf("Win32k native API test\n");
-
- /* Convert to gui thread */
- // IsGUIThread(TRUE); <- does not exists on win2k
-
- InitOsVersion();
- printf("g_OsIdx = %d\n", g_OsIdx);
-
- g_hModule = LoadLibraryW(L"w32kdll.dll");
- if (!g_hModule)
- {
- printf("w32kdll.dll not found!\n");
- return -1;
- }
-
- GdiHandleTable = MyGdiQueryTable();
- if(!GdiHandleTable)
- {
- FreeLibrary(g_hModule);
- printf("GdiHandleTable not found!\n");
- return -1;
- }
-
- printf("\n");
-
- return TestMain(L"w32knapi", L"win32k.sys Nt-Api");
-}