[ros-diffs] [fireball] 42042: - Implement set_error, get_error. - Implement add_timeout_user, remove_timeout_user (Testmode implementation! Currently leaks memory!). - Implement a ExReallocPool routine. The name is stupid, but it reallocates the given paged pool to another (smaller or bigger) size preserving the data. - Other misc routines needed for ported server code.

fireball at svn.reactos.org fireball at svn.reactos.org
Sat Jul 18 14:38:04 CEST 2009


Author: fireball
Date: Sat Jul 18 14:38:04 2009
New Revision: 42042

URL: http://svn.reactos.org/svn/reactos?rev=42042&view=rev
Log:
- Implement set_error, get_error.
- Implement add_timeout_user, remove_timeout_user (Testmode implementation! Currently leaks memory!).
- Implement a ExReallocPool routine. The name is stupid, but it reallocates the given paged pool to another (smaller or bigger) size preserving the data.
- Other misc routines needed for ported server code.

Modified:
    branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c

Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c?rev=42042&r1=42041&r2=42042&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c [iso-8859-1] Sat Jul 18 14:38:04 2009
@@ -10,23 +10,175 @@
 
 #include <win32k.h>
 
+#undef LIST_FOR_EACH
+#undef LIST_FOR_EACH_SAFE
+#include "object.h"
+
 #define NDEBUG
 #include <debug.h>
+
+timeout_t current_time = 0ULL;
+int debug_level = 0;
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
 void set_error( unsigned int err )
 {
+    SetLastNtError(err);
+}
+
+unsigned int get_error(void)
+{
+    return GetLastNtError();
 }
 
 const SID *token_get_user( void *token )
 {
+    UNIMPLEMENTED;
     return NULL;
 }
 
-struct window_class* get_window_class( user_handle_t window )
+struct timeout_user *add_timeout_user( timeout_t when, timeout_callback func, void *private )
 {
-    return NULL;
+    PKTIMER Timer;
+    PKDPC Dpc;
+    LARGE_INTEGER DueTime;
+
+    DueTime.QuadPart = (LONGLONG)when;
+
+    DPRINT1("add_timeout_user(when %I64d, func %p)\n", when, func);
+
+    Timer = ExAllocatePool(NonPagedPool, sizeof(KTIMER));
+    KeInitializeTimer(Timer);
+
+    Dpc = ExAllocatePool(NonPagedPool, sizeof(KDPC));
+    KeInitializeDpc(Dpc, func, private);
+
+    KeSetTimer(Timer, DueTime, Dpc);
+
+    return (struct timeout_user *)Timer;
+}
+
+/* remove a timeout user */
+void remove_timeout_user( struct timeout_user *user )
+{
+    PKTIMER Timer = (PKTIMER)user;
+    DPRINT1("remove_timeout_user %p\n", user);
+
+    KeCancelTimer(Timer);
+    ExFreePool(Timer);
+
+    // FIXME: Dpc memory is not freed!
+}
+
+/* default map_access() routine for objects that behave like an fd */
+unsigned int default_fd_map_access( struct object *obj, unsigned int access )
+{
+    if (access & GENERIC_READ)    access |= FILE_GENERIC_READ;
+    if (access & GENERIC_WRITE)   access |= FILE_GENERIC_WRITE;
+    if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
+    if (access & GENERIC_ALL)     access |= FILE_ALL_ACCESS;
+    return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
+}
+
+thread_id_t get_thread_id (PTHREADINFO Thread)
+{
+    return (thread_id_t)Thread->peThread->Cid.UniqueThread;
+}
+
+process_id_t get_process_id(PPROCESSINFO Process)
+{
+    return (process_id_t)Process->peProcess->UniqueProcessId;
+}
+
+void wake_up( struct object *obj, int max )
+{
+    struct list *ptr, *next;
+
+    LIST_FOR_EACH_SAFE( ptr, next, &obj->wait_queue )
+    {
+        struct wait_queue_entry *entry = LIST_ENTRY( ptr, struct wait_queue_entry, entry );
+        DPRINT1("wake_thread 0x%x / process 0x%x\n",
+            entry->thread->peThread->Tcb.Teb->ClientId.UniqueThread,
+            entry->thread->peThread->Tcb.Teb->ClientId.UniqueProcess);
+        /*if (wake_thread( entry->thread ))
+        {
+            if (max && !--max) break;
+        }*/
+    }
+}
+
+void set_fd_events( struct fd *fd, int events )
+{
+    UNIMPLEMENTED;
+}
+
+int check_fd_events( struct fd *fd, int events )
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+/* add a thread to an object wait queue; return 1 if OK, 0 on error */
+int add_queue( struct object *obj, struct wait_queue_entry *entry )
+{
+#if 0
+    grab_object( obj );
+    entry->obj = obj;
+    list_add_tail( &obj->wait_queue, &entry->entry );
+#else
+    UNIMPLEMENTED;
+#endif
+    return 1;
+}
+
+/* remove a thread from an object wait queue */
+void remove_queue( struct object *obj, struct wait_queue_entry *entry )
+{
+#if 0
+    list_remove( &entry->entry );
+    release_object( obj );
+#else
+    UNIMPLEMENTED;
+#endif
+}
+
+void set_event( struct event *event )
+{
+    UNIMPLEMENTED;
+}
+
+void reset_event( struct event *event )
+{
+    UNIMPLEMENTED;
+}
+
+/* Stupid thing to hack around missing export of memcmp from the kernel */
+int memcmp(const void *s1, const void *s2, size_t n)
+{
+    if (n != 0) {
+        const unsigned char *p1 = s1, *p2 = s2;
+        do {
+            if (*p1++ != *p2++)
+	            return (*--p1 - *--p2);
+        } while (--n != 0);
+    }
+    return 0;
+}
+
+PVOID
+NTAPI
+ExReallocPool(PVOID OldPtr, ULONG NewSize, ULONG OldSize)
+{
+    PVOID NewPtr = ExAllocatePool(PagedPool, NewSize);
+
+    if (OldPtr)
+    {
+        RtlCopyMemory(NewPtr, OldPtr, (NewSize < OldSize) ? NewSize : OldSize);
+        ExFreePool(OldPtr);
+    }
+
+    return NewPtr;
 }
 
 /* EOF */



More information about the Ros-diffs mailing list