ignore some warnings by gcc 4.4.2
[reactos.git] / rostests / apitests / w32knapi / w32knapi.c
index fa20eef..088007d 100644 (file)
@@ -10,14 +10,50 @@ MyGdiQueryTable()
 {
        PTEB pTeb = NtCurrentTeb();
        PPEB pPeb = pTeb->ProcessEnvironmentBlock;
+       printf("TEB::PEB=0x%lx PEB::GdiHT=0x%lx, Peb=%p, Teb=%p\n", FIELD_OFFSET(TEB, ProcessEnvironmentBlock), FIELD_OFFSET(PEB, GdiSharedHandleTable), pTeb, pPeb);
        return pPeb->GdiSharedHandleTable;
 }
 
-static DWORD STDCALL
+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 ret;
+       DWORD retval = 0;
 
+#ifdef _M_I386
+#ifdef __GNUC__
        asm volatile
        (
                "pushfl;"                               // Save flags
@@ -29,21 +65,38 @@ IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
                "rep movsd;"                    // Copy params to the stack
                "call *%%edx;"                  // Call function
                "popfl;"                                // Restore flags
-               : "=a" (ret)
+               : "=a" (retval)
                : "S" (pFirstParam), "c" (cParams), "d"(proc)
                : "%edi"
        );
-
-       return ret;
+#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
+#endif
+
+       return retval;
 }
 
 DWORD
 Syscall(LPWSTR pszFunction, int cParams, void* pParams)
 {
        char szFunctionName[MAX_PATH];
+       FARPROC proc;
 
        sprintf(szFunctionName, "%ls", pszFunction);
-       FARPROC proc = (FARPROC)GetProcAddress(g_hModule, szFunctionName);
+       proc = (FARPROC)GetProcAddress(g_hModule, szFunctionName);
        if (!proc)
        {
                printf("Couldn't find proc: %s\n", szFunctionName);